@localstack/appinspector-ui 1.0.18 → 1.0.20

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.
package/dist/index.cjs CHANGED
@@ -2535,11 +2535,9 @@ var AwsServiceIcon = ({ hideTooltip, service, size = "medium", title }) => {
2535
2535
  // src/components/cells/pill-cell.tsx
2536
2536
  var import_material3 = require("@mui/material");
2537
2537
  var import_jsx_runtime123 = require("react/jsx-runtime");
2538
- var defaultBackgroundColor = "background.paper";
2539
- var defaultBorderColor = "palette.divider";
2540
2538
  var PillCell = ({
2541
- backgroundColor = defaultBackgroundColor,
2542
- borderColor = defaultBorderColor,
2539
+ backgroundColor,
2540
+ borderColor,
2543
2541
  borderWidth = "1px",
2544
2542
  children,
2545
2543
  height = "24px",
@@ -2551,8 +2549,8 @@ var PillCell = ({
2551
2549
  {
2552
2550
  sx: {
2553
2551
  alignItems: "center",
2554
- backgroundColor,
2555
- borderColor,
2552
+ backgroundColor: backgroundColor ?? ((theme) => theme.palette.background.paper),
2553
+ borderColor: borderColor ?? ((theme) => theme.palette.divider),
2556
2554
  borderRadius: "16px",
2557
2555
  borderStyle: "solid",
2558
2556
  borderWidth,
@@ -2572,7 +2570,7 @@ var PillCell = ({
2572
2570
  var import_jsx_runtime124 = require("react/jsx-runtime");
2573
2571
  var truncateName = (inputString, truncateLength = 15) => inputString.length > truncateLength ? `${inputString.slice(0, truncateLength - 3)}...` : inputString;
2574
2572
  var ServiceCell = ({
2575
- borderColor = defaultBorderColor,
2573
+ borderColor,
2576
2574
  borderWidth,
2577
2575
  height = "24px",
2578
2576
  resource,
@@ -2582,31 +2580,28 @@ var ServiceCell = ({
2582
2580
  width = "32px"
2583
2581
  }) => {
2584
2582
  return /* @__PURE__ */ (0, import_jsx_runtime124.jsx)(import_material4.Box, { sx: { width: "100%" }, children: /* @__PURE__ */ (0, import_jsx_runtime124.jsxs)(PillCell, { borderColor, borderWidth, height, children: [
2585
- showIcon ? /* @__PURE__ */ (0, import_jsx_runtime124.jsx)(
2586
- import_material4.Box,
2587
- {
2588
- sx: {
2589
- alignItems: "center",
2590
- borderRightColor: borderColor,
2591
- borderRightStyle: "solid",
2592
- borderRightWidth: `1px`,
2593
- display: "flex",
2594
- height,
2595
- justifyContent: "center",
2596
- overflow: "hidden",
2597
- padding: 0,
2598
- width
2599
- },
2600
- children: /* @__PURE__ */ (0, import_jsx_runtime124.jsx)(AwsServiceIcon, { hideTooltip: true, service, size: "large" })
2601
- }
2602
- ) : void 0,
2583
+ showIcon ? /* @__PURE__ */ (0, import_jsx_runtime124.jsxs)(import_jsx_runtime124.Fragment, { children: [
2584
+ /* @__PURE__ */ (0, import_jsx_runtime124.jsx)(
2585
+ import_material4.Box,
2586
+ {
2587
+ sx: {
2588
+ alignItems: "center",
2589
+ display: "flex",
2590
+ height,
2591
+ justifyContent: "center",
2592
+ overflow: "hidden",
2593
+ padding: 0,
2594
+ width
2595
+ },
2596
+ children: /* @__PURE__ */ (0, import_jsx_runtime124.jsx)(AwsServiceIcon, { hideTooltip: true, service, size: "large" })
2597
+ }
2598
+ ),
2599
+ /* @__PURE__ */ (0, import_jsx_runtime124.jsx)(import_material4.Divider, { orientation: "vertical" })
2600
+ ] }) : void 0,
2603
2601
  /* @__PURE__ */ (0, import_jsx_runtime124.jsx)(
2604
2602
  import_material4.Typography,
2605
2603
  {
2606
2604
  sx: {
2607
- borderRightColor: resource ? borderColor : "none",
2608
- borderRightStyle: resource ? "solid" : "none",
2609
- borderRightWidth: resource ? "1px" : "none",
2610
2605
  fontWeight: "bold",
2611
2606
  overflow: "hidden",
2612
2607
  padding: "1px 8px",
@@ -2625,21 +2620,24 @@ var ServiceCell = ({
2625
2620
  children: service
2626
2621
  }
2627
2622
  ),
2628
- resource ? /* @__PURE__ */ (0, import_jsx_runtime124.jsx)(
2629
- import_material4.Typography,
2630
- {
2631
- sx: {
2632
- borderBottomRightRadius: "15px",
2633
- borderTopRightRadius: "15px",
2634
- overflow: "hidden",
2635
- padding: "1px 8px",
2636
- textOverflow: "ellipsis",
2637
- whiteSpace: "nowrap"
2638
- },
2639
- variant: "body2",
2640
- children: truncateName(resource, truncateLength)
2641
- }
2642
- ) : void 0
2623
+ resource ? /* @__PURE__ */ (0, import_jsx_runtime124.jsxs)(import_jsx_runtime124.Fragment, { children: [
2624
+ /* @__PURE__ */ (0, import_jsx_runtime124.jsx)(import_material4.Box, { sx: { height: "100%", paddingY: 0.5 }, children: /* @__PURE__ */ (0, import_jsx_runtime124.jsx)(import_material4.Divider, { orientation: "vertical" }) }),
2625
+ /* @__PURE__ */ (0, import_jsx_runtime124.jsx)(
2626
+ import_material4.Typography,
2627
+ {
2628
+ sx: {
2629
+ borderBottomRightRadius: "15px",
2630
+ borderTopRightRadius: "15px",
2631
+ overflow: "hidden",
2632
+ padding: "1px 8px",
2633
+ textOverflow: "ellipsis",
2634
+ whiteSpace: "nowrap"
2635
+ },
2636
+ variant: "body2",
2637
+ children: truncateName(resource, truncateLength)
2638
+ }
2639
+ )
2640
+ ] }) : void 0
2643
2641
  ] }) });
2644
2642
  };
2645
2643
  ServiceCell.displayName = "ServiceCell";
@@ -3628,12 +3626,13 @@ var SpansListPage = () => {
3628
3626
  var import_icons_material11 = require("@mui/icons-material");
3629
3627
  var import_material21 = require("@mui/material");
3630
3628
  var import_styles = require("@mui/material/styles");
3631
- var import_react20 = require("@xyflow/react");
3632
- var import_react21 = require("react");
3629
+ var import_react21 = require("@xyflow/react");
3630
+ var import_react22 = require("react");
3633
3631
  var import_react_router_dom2 = require("react-router-dom");
3634
3632
 
3635
3633
  // src/components/event-details/event-details.tsx
3636
3634
  var import_material16 = require("@mui/material");
3635
+ var import_react12 = require("react");
3637
3636
 
3638
3637
  // src/utils/iam-utils.ts
3639
3638
  function determinePermissionStatus(payload) {
@@ -3903,7 +3902,7 @@ var DetailRow = ({ content, label }) => /* @__PURE__ */ (0, import_jsx_runtime13
3903
3902
  {
3904
3903
  sx: {
3905
3904
  color: "text.secondary",
3906
- fontWeight: 500
3905
+ fontWeight: 600
3907
3906
  },
3908
3907
  variant: "body2",
3909
3908
  children: label
@@ -3938,11 +3937,11 @@ var PermissionIcon = ({ status }) => {
3938
3937
  var IAMEventDetail = ({ event }) => {
3939
3938
  const payloadString = event.attributes?.payload;
3940
3939
  if (!payloadString) {
3941
- return /* @__PURE__ */ (0, import_jsx_runtime132.jsx)(import_material11.Box, { sx: { p: 2 }, children: /* @__PURE__ */ (0, import_jsx_runtime132.jsx)(import_material11.Typography, { color: "text.secondary", variant: "body2", children: "No IAM policy evaluation data available" }) });
3940
+ return /* @__PURE__ */ (0, import_jsx_runtime132.jsx)(import_material11.Box, { sx: { p: 2 }, children: /* @__PURE__ */ (0, import_jsx_runtime132.jsx)(import_material11.Typography, { sx: { fontWeight: 600 }, variant: "body2", children: "No IAM policy evaluation data available" }) });
3942
3941
  }
3943
3942
  const parsedIAM = parseIAMEvent(payloadString);
3944
3943
  if (!parsedIAM) {
3945
- return /* @__PURE__ */ (0, import_jsx_runtime132.jsx)(import_material11.Box, { sx: { p: 2 }, children: /* @__PURE__ */ (0, import_jsx_runtime132.jsx)(import_material11.Typography, { color: "text.secondary", variant: "body2", children: "Failed to parse IAM event data" }) });
3944
+ return /* @__PURE__ */ (0, import_jsx_runtime132.jsx)(import_material11.Box, { sx: { p: 2 }, children: /* @__PURE__ */ (0, import_jsx_runtime132.jsx)(import_material11.Typography, { sx: { fontWeight: 600 }, variant: "body2", children: "Failed to parse IAM event data" }) });
3946
3945
  }
3947
3946
  return /* @__PURE__ */ (0, import_jsx_runtime132.jsxs)(import_material11.Box, { sx: { p: 2 }, children: [
3948
3947
  /* @__PURE__ */ (0, import_jsx_runtime132.jsx)(import_material11.Box, { sx: { mb: 2 }, children: /* @__PURE__ */ (0, import_jsx_runtime132.jsx)(
@@ -3967,9 +3966,7 @@ var IAMEventDetail = ({ event }) => {
3967
3966
  import_material11.Typography,
3968
3967
  {
3969
3968
  sx: {
3970
- color: "text.primary",
3971
- fontFamily: "monospace",
3972
- fontSize: "0.85rem"
3969
+ color: "text.primary"
3973
3970
  },
3974
3971
  variant: "body2",
3975
3972
  children: action
@@ -3987,8 +3984,6 @@ var IAMEventDetail = ({ event }) => {
3987
3984
  {
3988
3985
  sx: {
3989
3986
  color: "text.primary",
3990
- fontFamily: "monospace",
3991
- fontSize: "0.85rem",
3992
3987
  wordBreak: "break-all"
3993
3988
  },
3994
3989
  variant: "body2",
@@ -4000,19 +3995,19 @@ var IAMEventDetail = ({ event }) => {
4000
3995
  }
4001
3996
  ),
4002
3997
  /* @__PURE__ */ (0, import_jsx_runtime132.jsxs)(import_material11.Box, { sx: { mt: 2 }, children: [
4003
- /* @__PURE__ */ (0, import_jsx_runtime132.jsx)(import_material11.Typography, { color: "text.secondary", sx: { mb: 1 }, variant: "caption", children: "Policy Evaluation" }),
3998
+ /* @__PURE__ */ (0, import_jsx_runtime132.jsx)(import_material11.Typography, { sx: { fontWeight: 600, mb: 1 }, variant: "caption", children: "Policy Evaluation" }),
4004
3999
  /* @__PURE__ */ (0, import_jsx_runtime132.jsxs)(import_material11.Grid, { container: true, spacing: 2, children: [
4005
4000
  parsedIAM.details.explicitAllows !== void 0 && /* @__PURE__ */ (0, import_jsx_runtime132.jsx)(import_material11.Grid, { item: true, xs: 4, children: /* @__PURE__ */ (0, import_jsx_runtime132.jsxs)(import_material11.Box, { sx: { textAlign: "center" }, children: [
4006
4001
  /* @__PURE__ */ (0, import_jsx_runtime132.jsx)(import_material11.Typography, { color: "success.main", sx: { fontWeight: "bold" }, variant: "h6", children: parsedIAM.details.explicitAllows }),
4007
- /* @__PURE__ */ (0, import_jsx_runtime132.jsx)(import_material11.Typography, { color: "text.secondary", variant: "caption", children: "Explicit Allows" })
4002
+ /* @__PURE__ */ (0, import_jsx_runtime132.jsx)(import_material11.Typography, { sx: { fontWeight: 600 }, variant: "caption", children: "Explicit Allows" })
4008
4003
  ] }) }),
4009
4004
  parsedIAM.details.explicitDenies !== void 0 && /* @__PURE__ */ (0, import_jsx_runtime132.jsx)(import_material11.Grid, { item: true, xs: 4, children: /* @__PURE__ */ (0, import_jsx_runtime132.jsxs)(import_material11.Box, { sx: { textAlign: "center" }, children: [
4010
4005
  /* @__PURE__ */ (0, import_jsx_runtime132.jsx)(import_material11.Typography, { color: "error.main", sx: { fontWeight: "bold" }, variant: "h6", children: parsedIAM.details.explicitDenies }),
4011
- /* @__PURE__ */ (0, import_jsx_runtime132.jsx)(import_material11.Typography, { color: "text.secondary", variant: "caption", children: "Explicit Denies" })
4006
+ /* @__PURE__ */ (0, import_jsx_runtime132.jsx)(import_material11.Typography, { sx: { fontWeight: 600 }, variant: "caption", children: "Explicit Denies" })
4012
4007
  ] }) }),
4013
4008
  parsedIAM.details.implicitDenies !== void 0 && /* @__PURE__ */ (0, import_jsx_runtime132.jsx)(import_material11.Grid, { item: true, xs: 4, children: /* @__PURE__ */ (0, import_jsx_runtime132.jsxs)(import_material11.Box, { sx: { textAlign: "center" }, children: [
4014
4009
  /* @__PURE__ */ (0, import_jsx_runtime132.jsx)(import_material11.Typography, { color: "warning.main", sx: { fontWeight: "bold" }, variant: "h6", children: parsedIAM.details.implicitDenies }),
4015
- /* @__PURE__ */ (0, import_jsx_runtime132.jsx)(import_material11.Typography, { color: "text.secondary", variant: "caption", children: "Implicit Denies" })
4010
+ /* @__PURE__ */ (0, import_jsx_runtime132.jsx)(import_material11.Typography, { sx: { fontWeight: 600 }, variant: "caption", children: "Implicit Denies" })
4016
4011
  ] }) })
4017
4012
  ] })
4018
4013
  ] })
@@ -4069,8 +4064,8 @@ var IAMPermissionItem = ({ event }) => {
4069
4064
  )
4070
4065
  ] }),
4071
4066
  isOpen && /* @__PURE__ */ (0, import_jsx_runtime133.jsx)(import_material12.Box, { sx: { ml: 4, mt: 1 }, children: /* @__PURE__ */ (0, import_jsx_runtime133.jsxs)(import_material12.Box, { children: [
4072
- /* @__PURE__ */ (0, import_jsx_runtime133.jsx)(import_material12.Typography, { color: "text.secondary", variant: "caption", children: "Principal" }),
4073
- /* @__PURE__ */ (0, import_jsx_runtime133.jsx)(import_material12.Typography, { sx: { fontFamily: "monospace", fontSize: "0.85rem" }, variant: "body2", children: parsedIAM.principal })
4067
+ /* @__PURE__ */ (0, import_jsx_runtime133.jsx)(import_material12.Typography, { sx: { fontWeight: 600 }, variant: "caption", children: "Principal" }),
4068
+ /* @__PURE__ */ (0, import_jsx_runtime133.jsx)(import_material12.Typography, { variant: "body2", children: parsedIAM.principal })
4074
4069
  ] }) })
4075
4070
  ] });
4076
4071
  };
@@ -4084,7 +4079,7 @@ var DetailRow2 = ({ content, label }) => /* @__PURE__ */ (0, import_jsx_runtime1
4084
4079
  {
4085
4080
  sx: {
4086
4081
  color: "text.primary",
4087
- fontWeight: 500
4082
+ fontWeight: 600
4088
4083
  },
4089
4084
  variant: "body1",
4090
4085
  children: label
@@ -4151,7 +4146,7 @@ var EventMessage = ({ event }) => {
4151
4146
  ref: textReference,
4152
4147
  sx: {
4153
4148
  color: "text.primary",
4154
- fontWeight: 500,
4149
+ fontWeight: 600,
4155
4150
  maxWidth: "100%",
4156
4151
  ml: shouldShowToggle ? 0 : 4,
4157
4152
  overflow: "hidden",
@@ -4208,10 +4203,9 @@ var EventDetail = ({
4208
4203
  {
4209
4204
  sx: {
4210
4205
  alignItems: "left",
4211
- color: "text.secondary",
4212
4206
  display: "flex",
4213
4207
  flexGrow: 1,
4214
- fontWeight: 500
4208
+ fontWeight: 600
4215
4209
  },
4216
4210
  variant: "subtitle1",
4217
4211
  children: displayText
@@ -4243,7 +4237,7 @@ var EventDetail = ({
4243
4237
  color: "text.secondary",
4244
4238
  display: "flex",
4245
4239
  flexGrow: 1,
4246
- fontWeight: 500,
4240
+ fontWeight: 600,
4247
4241
  ml: 1,
4248
4242
  mr: 2
4249
4243
  },
@@ -4350,6 +4344,10 @@ var EventSection = ({
4350
4344
  // src/components/event-details/event-details.tsx
4351
4345
  var import_jsx_runtime137 = require("react/jsx-runtime");
4352
4346
  var EventDetails = ({ onClose, selectedEvent }) => {
4347
+ const attributes = (0, import_react12.useMemo)(() => {
4348
+ const attributes2 = Object.entries(selectedEvent?.attributes ?? {});
4349
+ return attributes2.filter(([key]) => key !== "localstack.aws.account_id" && key !== "localstack.aws.service");
4350
+ }, [selectedEvent?.attributes]);
4353
4351
  if (!selectedEvent) {
4354
4352
  return /* @__PURE__ */ (0, import_jsx_runtime137.jsx)(import_material16.Box, { sx: { p: 3, textAlign: "center" }, children: /* @__PURE__ */ (0, import_jsx_runtime137.jsx)(import_material16.Typography, { color: "text.secondary", variant: "body2", children: "Select an event to view details" }) });
4355
4353
  }
@@ -4358,41 +4356,41 @@ var EventDetails = ({ onClose, selectedEvent }) => {
4358
4356
  /* @__PURE__ */ (0, import_jsx_runtime137.jsx)(import_material16.Box, { sx: { flexGrow: 1, overflow: "auto", p: 2 }, children: /* @__PURE__ */ (0, import_jsx_runtime137.jsxs)(import_material16.Stack, { spacing: 2, children: [
4359
4357
  /* @__PURE__ */ (0, import_jsx_runtime137.jsx)(ToggleSection, { headline: "Basic Information", children: /* @__PURE__ */ (0, import_jsx_runtime137.jsxs)(import_material16.Stack, { spacing: 1, children: [
4360
4358
  /* @__PURE__ */ (0, import_jsx_runtime137.jsxs)(import_material16.Box, { children: [
4361
- /* @__PURE__ */ (0, import_jsx_runtime137.jsx)(import_material16.Typography, { color: "text.secondary", variant: "caption", children: "Span ID" }),
4359
+ /* @__PURE__ */ (0, import_jsx_runtime137.jsx)(import_material16.Typography, { sx: { fontWeight: 600 }, variant: "caption", children: "Span ID" }),
4362
4360
  /* @__PURE__ */ (0, import_jsx_runtime137.jsx)(import_material16.Typography, { variant: "body2", children: selectedEvent.span_id })
4363
4361
  ] }),
4364
4362
  /* @__PURE__ */ (0, import_jsx_runtime137.jsxs)(import_material16.Box, { children: [
4365
- /* @__PURE__ */ (0, import_jsx_runtime137.jsx)(import_material16.Typography, { color: "text.secondary", variant: "caption", children: "Trace ID" }),
4366
- /* @__PURE__ */ (0, import_jsx_runtime137.jsx)(import_material16.Typography, { sx: { fontFamily: "monospace", fontSize: "0.85rem" }, variant: "body2", children: selectedEvent.trace_id })
4363
+ /* @__PURE__ */ (0, import_jsx_runtime137.jsx)(import_material16.Typography, { sx: { fontWeight: 600 }, variant: "caption", children: "Trace ID" }),
4364
+ /* @__PURE__ */ (0, import_jsx_runtime137.jsx)(import_material16.Typography, { variant: "body2", children: selectedEvent.trace_id })
4367
4365
  ] }),
4368
4366
  /* @__PURE__ */ (0, import_jsx_runtime137.jsxs)(import_material16.Box, { children: [
4369
- /* @__PURE__ */ (0, import_jsx_runtime137.jsx)(import_material16.Typography, { color: "text.secondary", variant: "caption", children: "Operation" }),
4367
+ /* @__PURE__ */ (0, import_jsx_runtime137.jsx)(import_material16.Typography, { sx: { fontWeight: 600 }, variant: "caption", children: "Operation" }),
4370
4368
  /* @__PURE__ */ (0, import_jsx_runtime137.jsx)(import_material16.Typography, { variant: "body2", children: selectedEvent.operation_name })
4371
4369
  ] })
4372
4370
  ] }) }),
4373
4371
  /* @__PURE__ */ (0, import_jsx_runtime137.jsx)(import_material16.Divider, {}),
4374
4372
  /* @__PURE__ */ (0, import_jsx_runtime137.jsx)(ToggleSection, { headline: "Service Information", children: /* @__PURE__ */ (0, import_jsx_runtime137.jsxs)(import_material16.Stack, { spacing: 1, children: [
4375
4373
  /* @__PURE__ */ (0, import_jsx_runtime137.jsxs)(import_material16.Box, { children: [
4376
- /* @__PURE__ */ (0, import_jsx_runtime137.jsx)(import_material16.Typography, { color: "text.secondary", variant: "caption", children: "Service" }),
4374
+ /* @__PURE__ */ (0, import_jsx_runtime137.jsx)(import_material16.Typography, { sx: { fontWeight: 600 }, variant: "caption", children: "Service" }),
4377
4375
  /* @__PURE__ */ (0, import_jsx_runtime137.jsx)(import_material16.Typography, { variant: "body2", children: selectedEvent.service_name })
4378
4376
  ] }),
4379
4377
  /* @__PURE__ */ (0, import_jsx_runtime137.jsxs)(import_material16.Box, { children: [
4380
- /* @__PURE__ */ (0, import_jsx_runtime137.jsx)(import_material16.Typography, { color: "text.secondary", variant: "caption", children: "Resource" }),
4378
+ /* @__PURE__ */ (0, import_jsx_runtime137.jsx)(import_material16.Typography, { sx: { fontWeight: 600 }, variant: "caption", children: "Resource" }),
4381
4379
  /* @__PURE__ */ (0, import_jsx_runtime137.jsx)(import_material16.Typography, { variant: "body2", children: selectedEvent.resource_name })
4382
4380
  ] }),
4383
4381
  Boolean(selectedEvent.region) && /* @__PURE__ */ (0, import_jsx_runtime137.jsxs)(import_material16.Box, { children: [
4384
- /* @__PURE__ */ (0, import_jsx_runtime137.jsx)(import_material16.Typography, { color: "text.secondary", variant: "caption", children: "Region" }),
4382
+ /* @__PURE__ */ (0, import_jsx_runtime137.jsx)(import_material16.Typography, { sx: { fontWeight: 600 }, variant: "caption", children: "Region" }),
4385
4383
  /* @__PURE__ */ (0, import_jsx_runtime137.jsx)(import_material16.Typography, { variant: "body2", children: selectedEvent.region })
4386
4384
  ] })
4387
4385
  ] }) }),
4388
4386
  /* @__PURE__ */ (0, import_jsx_runtime137.jsx)(import_material16.Divider, {}),
4389
4387
  /* @__PURE__ */ (0, import_jsx_runtime137.jsx)(ToggleSection, { headline: "Timing", children: /* @__PURE__ */ (0, import_jsx_runtime137.jsxs)(import_material16.Stack, { spacing: 1, children: [
4390
4388
  /* @__PURE__ */ (0, import_jsx_runtime137.jsxs)(import_material16.Box, { children: [
4391
- /* @__PURE__ */ (0, import_jsx_runtime137.jsx)(import_material16.Typography, { color: "text.secondary", variant: "caption", children: "Start Time" }),
4389
+ /* @__PURE__ */ (0, import_jsx_runtime137.jsx)(import_material16.Typography, { sx: { fontWeight: 600 }, variant: "caption", children: "Start Time" }),
4392
4390
  /* @__PURE__ */ (0, import_jsx_runtime137.jsx)(import_material16.Typography, { variant: "body2", children: unixNanoToDate(selectedEvent.start_time_unix_nano)?.toISOString() })
4393
4391
  ] }),
4394
4392
  Boolean(selectedEvent.end_time_unix_nano) && /* @__PURE__ */ (0, import_jsx_runtime137.jsxs)(import_material16.Box, { children: [
4395
- /* @__PURE__ */ (0, import_jsx_runtime137.jsx)(import_material16.Typography, { color: "text.secondary", variant: "caption", children: "Duration" }),
4393
+ /* @__PURE__ */ (0, import_jsx_runtime137.jsx)(import_material16.Typography, { sx: { fontWeight: 600 }, variant: "caption", children: "Duration" }),
4396
4394
  /* @__PURE__ */ (0, import_jsx_runtime137.jsxs)(import_material16.Typography, { variant: "body2", children: [
4397
4395
  ((BigInt(selectedEvent.end_time_unix_nano) - BigInt(selectedEvent.start_time_unix_nano)) / BigInt("1000000")).toString(),
4398
4396
  " ",
@@ -4422,33 +4420,45 @@ var EventDetails = ({ onClose, selectedEvent }) => {
4422
4420
  }
4423
4421
  )
4424
4422
  ] }),
4425
- selectedEvent.attributes && Object.keys(selectedEvent.attributes).length > 0 && /* @__PURE__ */ (0, import_jsx_runtime137.jsxs)(import_jsx_runtime137.Fragment, { children: [
4423
+ attributes.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime137.jsxs)(import_jsx_runtime137.Fragment, { children: [
4426
4424
  /* @__PURE__ */ (0, import_jsx_runtime137.jsx)(import_material16.Divider, {}),
4427
- /* @__PURE__ */ (0, import_jsx_runtime137.jsx)(ToggleSection, { headline: "Attributes", children: /* @__PURE__ */ (0, import_jsx_runtime137.jsx)(import_material16.Box, { sx: { backgroundColor: "#f5f5f5", borderRadius: 1, p: 1 }, children: /* @__PURE__ */ (0, import_jsx_runtime137.jsx)("pre", { style: { fontSize: "0.85rem", margin: 0, overflow: "auto" }, children: JSON.stringify(selectedEvent.attributes, void 0, 2) }) }) })
4425
+ /* @__PURE__ */ (0, import_jsx_runtime137.jsx)(ToggleSection, { headline: "Attributes", children: /* @__PURE__ */ (0, import_jsx_runtime137.jsx)(import_material16.Stack, { spacing: 1, children: attributes.map(([key, value]) => /* @__PURE__ */ (0, import_jsx_runtime137.jsxs)(import_material16.Box, { children: [
4426
+ /* @__PURE__ */ (0, import_jsx_runtime137.jsx)(import_material16.Typography, { sx: { fontWeight: 600 }, variant: "caption", children: key }),
4427
+ /* @__PURE__ */ (0, import_jsx_runtime137.jsx)(import_material16.Typography, { variant: "body2", children: renderKeyValue(key, value) })
4428
+ ] }, key)) }) })
4428
4429
  ] })
4429
4430
  ] }) })
4430
4431
  ] });
4431
4432
  };
4433
+ function renderKeyValue(key, value) {
4434
+ if (typeof value === "string" && (key === "localstack.aws.service.request" || key === "localstack.aws.service.response" || key === "localstack.aws.service.exception")) {
4435
+ return /* @__PURE__ */ (0, import_jsx_runtime137.jsx)(import_material16.Box, { sx: { backgroundColor: (theme) => theme.palette.background.default, borderRadius: 1, p: 1 }, children: /* @__PURE__ */ (0, import_jsx_runtime137.jsx)("pre", { style: { margin: 0, overflow: "auto" }, children: /* @__PURE__ */ (0, import_jsx_runtime137.jsx)(import_material16.Typography, { variant: "body2", children: JSON.stringify(JSON.parse(value), void 0, 2) }) }) });
4436
+ }
4437
+ if (typeof value === "boolean") {
4438
+ return /* @__PURE__ */ (0, import_jsx_runtime137.jsx)(import_material16.Typography, { variant: "body2", children: value ? "yes" : "no" });
4439
+ }
4440
+ return /* @__PURE__ */ (0, import_jsx_runtime137.jsx)(import_material16.Typography, { variant: "body2", children: value });
4441
+ }
4432
4442
 
4433
4443
  // src/components/trace-graph/trace-graph.tsx
4434
4444
  var import_base = require("@xyflow/react/dist/base.css");
4435
4445
  var import_material20 = require("@mui/material");
4436
- var import_react18 = require("@xyflow/react");
4437
- var import_react19 = require("react");
4446
+ var import_react19 = require("@xyflow/react");
4447
+ var import_react20 = require("react");
4438
4448
 
4439
4449
  // src/components/trace-graph/service-node.tsx
4440
4450
  var import_material18 = require("@mui/material");
4441
4451
  var import_style = require("@xyflow/react/dist/style.css");
4442
- var import_react13 = require("@xyflow/react");
4443
- var import_react14 = require("react");
4452
+ var import_react14 = require("@xyflow/react");
4453
+ var import_react15 = require("react");
4444
4454
 
4445
4455
  // src/components/trace-graph/problem-indicator.tsx
4446
4456
  var import_icons_material9 = require("@mui/icons-material");
4447
4457
  var import_material17 = require("@mui/material");
4448
- var import_react12 = require("react");
4458
+ var import_react13 = require("react");
4449
4459
  var import_jsx_runtime138 = require("react/jsx-runtime");
4450
4460
  var ProblemIndicator = ({ error }) => {
4451
- const icon = (0, import_react12.useMemo)(() => {
4461
+ const icon = (0, import_react13.useMemo)(() => {
4452
4462
  switch (error.level) {
4453
4463
  case "error": {
4454
4464
  return /* @__PURE__ */ (0, import_jsx_runtime138.jsx)(import_icons_material9.Error, { sx: { color: "#d32f2f", fontSize: "14px" } });
@@ -4461,7 +4471,7 @@ var ProblemIndicator = ({ error }) => {
4461
4471
  }
4462
4472
  }
4463
4473
  }, [error.level]);
4464
- const color = (0, import_react12.useMemo)(() => {
4474
+ const color = (0, import_react13.useMemo)(() => {
4465
4475
  switch (error.level) {
4466
4476
  case "error": {
4467
4477
  return "#d32f2f";
@@ -4500,11 +4510,11 @@ var handleStyle = {
4500
4510
  borderColor: "lightgray",
4501
4511
  opacity: 0
4502
4512
  };
4503
- var ServiceNode = (0, import_react14.memo)(function ServiceNode2({ data, selected }) {
4504
- const handleClick = (0, import_react14.useCallback)(() => {
4513
+ var ServiceNode = (0, import_react15.memo)(function ServiceNode2({ data, selected }) {
4514
+ const handleClick = (0, import_react15.useCallback)(() => {
4505
4515
  data.onEventSelect(data.event);
4506
4516
  }, [data]);
4507
- const handleKeyPress = (0, import_react14.useCallback)(
4517
+ const handleKeyPress = (0, import_react15.useCallback)(
4508
4518
  (event) => {
4509
4519
  if (event.key === "Enter" || event.key === " ") {
4510
4520
  handleClick();
@@ -4537,8 +4547,8 @@ var ServiceNode = (0, import_react14.memo)(function ServiceNode2({ data, selecte
4537
4547
  },
4538
4548
  tabIndex: 0,
4539
4549
  children: [
4540
- /* @__PURE__ */ (0, import_jsx_runtime139.jsx)(import_react13.Handle, { position: import_react13.Position.Left, style: handleStyle, type: "target" }),
4541
- /* @__PURE__ */ (0, import_jsx_runtime139.jsx)(import_react13.Handle, { position: import_react13.Position.Right, style: handleStyle, type: "source" }),
4550
+ /* @__PURE__ */ (0, import_jsx_runtime139.jsx)(import_react14.Handle, { position: import_react14.Position.Left, style: handleStyle, type: "target" }),
4551
+ /* @__PURE__ */ (0, import_jsx_runtime139.jsx)(import_react14.Handle, { position: import_react14.Position.Right, style: handleStyle, type: "source" }),
4542
4552
  /* @__PURE__ */ (0, import_jsx_runtime139.jsx)(
4543
4553
  ServiceCell,
4544
4554
  {
@@ -4599,7 +4609,7 @@ var ServiceNode = (0, import_react14.memo)(function ServiceNode2({ data, selecte
4599
4609
 
4600
4610
  // src/components/trace-graph/utils.ts
4601
4611
  var import_dagre = __toESM(require("@dagrejs/dagre"), 1);
4602
- var import_react15 = require("@xyflow/react");
4612
+ var import_react16 = require("@xyflow/react");
4603
4613
  var generateNodesAndEdges = (event, onEventSelect, parentId) => {
4604
4614
  const nodes = [];
4605
4615
  const edges = [];
@@ -4616,8 +4626,8 @@ var generateNodesAndEdges = (event, onEventSelect, parentId) => {
4616
4626
  id: event.span_id,
4617
4627
  position: { x: 0, y: 0 },
4618
4628
  // Will be set by layout
4619
- sourcePosition: import_react15.Position.Right,
4620
- targetPosition: import_react15.Position.Left,
4629
+ sourcePosition: import_react16.Position.Right,
4630
+ targetPosition: import_react16.Position.Left,
4621
4631
  type: "service"
4622
4632
  });
4623
4633
  if (parentId) {
@@ -4627,7 +4637,7 @@ var generateNodesAndEdges = (event, onEventSelect, parentId) => {
4627
4637
  markerEnd: {
4628
4638
  color: "lightgray",
4629
4639
  height: 16,
4630
- type: import_react15.MarkerType.Arrow,
4640
+ type: import_react16.MarkerType.Arrow,
4631
4641
  width: 16
4632
4642
  },
4633
4643
  source: parentId,
@@ -4692,8 +4702,8 @@ var calculateCenterX = (focusNodeX, viewPortPixelWidth, minX, maxX) => {
4692
4702
  // src/components/trace-graph/xyflow/controls.tsx
4693
4703
  var import_icons_material10 = require("@mui/icons-material");
4694
4704
  var import_material19 = require("@mui/material");
4695
- var import_react16 = require("@xyflow/react");
4696
- var import_react17 = require("react");
4705
+ var import_react17 = require("@xyflow/react");
4706
+ var import_react18 = require("react");
4697
4707
 
4698
4708
  // node_modules/zustand/esm/shallow.mjs
4699
4709
  function shallow$1(objA, objB) {
@@ -4740,9 +4750,9 @@ var selector = (s) => ({
4740
4750
  maxZoomReached: s.transform[2] >= s.maxZoom,
4741
4751
  minZoomReached: s.transform[2] <= s.minZoom
4742
4752
  });
4743
- var Controls = (0, import_react17.memo)(() => {
4744
- const { maxZoomReached, minZoomReached } = (0, import_react16.useStore)(selector, shallow$1);
4745
- const { fitView, zoomIn, zoomOut } = (0, import_react16.useReactFlow)();
4753
+ var Controls = (0, import_react18.memo)(() => {
4754
+ const { maxZoomReached, minZoomReached } = (0, import_react17.useStore)(selector, shallow$1);
4755
+ const { fitView, zoomIn, zoomOut } = (0, import_react17.useReactFlow)();
4746
4756
  const onZoomInHandler = () => {
4747
4757
  void zoomIn();
4748
4758
  };
@@ -4812,12 +4822,12 @@ var TraceGraph = ({
4812
4822
  spans,
4813
4823
  viewPortPixelWidth
4814
4824
  }) => {
4815
- const [nodes, setNodes] = (0, import_react19.useState)([]);
4816
- const [edges, setEdges] = (0, import_react19.useState)([]);
4817
- const [initialViewSet, setInitialViewSet] = (0, import_react19.useState)(false);
4818
- const { fitView, setCenter } = (0, import_react18.useReactFlow)();
4819
- const store = (0, import_react18.useStoreApi)();
4820
- const updateSelectedNode = (0, import_react19.useCallback)(
4825
+ const [nodes, setNodes] = (0, import_react20.useState)([]);
4826
+ const [edges, setEdges] = (0, import_react20.useState)([]);
4827
+ const [initialViewSet, setInitialViewSet] = (0, import_react20.useState)(false);
4828
+ const { fitView, setCenter } = (0, import_react19.useReactFlow)();
4829
+ const store = (0, import_react19.useStoreApi)();
4830
+ const updateSelectedNode = (0, import_react20.useCallback)(
4821
4831
  (nodeId) => {
4822
4832
  const { addSelectedNodes } = store.getState();
4823
4833
  if (nodeId) {
@@ -4829,7 +4839,7 @@ var TraceGraph = ({
4829
4839
  },
4830
4840
  [nodes, store]
4831
4841
  );
4832
- (0, import_react19.useEffect)(() => {
4842
+ (0, import_react20.useEffect)(() => {
4833
4843
  const spansMap = /* @__PURE__ */ new Map();
4834
4844
  const rootSpans = [];
4835
4845
  for (const span of spans.data ?? []) {
@@ -4861,7 +4871,7 @@ var TraceGraph = ({
4861
4871
  setNodes(layoutedNodes);
4862
4872
  setEdges(layoutedEdges);
4863
4873
  }, [onEventSelect, spans.data]);
4864
- (0, import_react19.useEffect)(() => {
4874
+ (0, import_react20.useEffect)(() => {
4865
4875
  const shouldSetInitialView = !spans.loading && nodes.length > 0 && !initialViewSet;
4866
4876
  if (shouldSetInitialView) {
4867
4877
  if (initialFocusEventId) {
@@ -4881,12 +4891,12 @@ var TraceGraph = ({
4881
4891
  setInitialViewSet(true);
4882
4892
  }
4883
4893
  }, [spans.loading, nodes, initialFocusEventId, viewPortPixelWidth, setCenter, fitView, onEventSelect, initialViewSet]);
4884
- (0, import_react19.useEffect)(() => {
4894
+ (0, import_react20.useEffect)(() => {
4885
4895
  if (initialFocusEventId) {
4886
4896
  updateSelectedNode(initialFocusEventId);
4887
4897
  }
4888
4898
  }, [initialFocusEventId, updateSelectedNode]);
4889
- const onNodeClick = (0, import_react19.useCallback)((_event, node) => {
4899
+ const onNodeClick = (0, import_react20.useCallback)((_event, node) => {
4890
4900
  onEventSelect(node.data.event);
4891
4901
  updateSelectedNode(node.id);
4892
4902
  }, [onEventSelect, updateSelectedNode]);
@@ -4906,7 +4916,7 @@ var TraceGraph = ({
4906
4916
  }
4907
4917
  ),
4908
4918
  /* @__PURE__ */ (0, import_jsx_runtime141.jsxs)(
4909
- import_react18.ReactFlow,
4919
+ import_react19.ReactFlow,
4910
4920
  {
4911
4921
  "data-testid": "trace-graph",
4912
4922
  defaultViewport: { x: 0, y: 0, zoom: 1 },
@@ -4920,7 +4930,7 @@ var TraceGraph = ({
4920
4930
  selectNodesOnDrag: false,
4921
4931
  children: [
4922
4932
  /* @__PURE__ */ (0, import_jsx_runtime141.jsx)(Controls, {}),
4923
- /* @__PURE__ */ (0, import_jsx_runtime141.jsx)(import_react18.Background, {})
4933
+ /* @__PURE__ */ (0, import_jsx_runtime141.jsx)(import_react19.Background, {})
4924
4934
  ]
4925
4935
  }
4926
4936
  )
@@ -4962,6 +4972,7 @@ var StyledDrawer = (0, import_styles.styled)(import_material21.Drawer)(() => ({
4962
4972
  var TraceGraphView = ({
4963
4973
  fetchError,
4964
4974
  fetchSpans,
4975
+ handleClose,
4965
4976
  handleEventSelect,
4966
4977
  handleRetry,
4967
4978
  loading,
@@ -5020,7 +5031,7 @@ var TraceGraphView = ({
5020
5031
  height: "100%",
5021
5032
  overflow: "auto"
5022
5033
  },
5023
- children: traceId !== void 0 && /* @__PURE__ */ (0, import_jsx_runtime142.jsx)(import_react20.ReactFlowProvider, { children: /* @__PURE__ */ (0, import_jsx_runtime142.jsx)(
5034
+ children: traceId !== void 0 && /* @__PURE__ */ (0, import_jsx_runtime142.jsx)(import_react21.ReactFlowProvider, { children: /* @__PURE__ */ (0, import_jsx_runtime142.jsx)(
5024
5035
  TraceGraph,
5025
5036
  {
5026
5037
  initialFocusEventId: spanId,
@@ -5038,7 +5049,7 @@ var TraceGraphView = ({
5038
5049
  ) })
5039
5050
  }
5040
5051
  ) }),
5041
- /* @__PURE__ */ (0, import_jsx_runtime142.jsx)(StyledDrawer, { anchor: "right", open, variant: "persistent", children: /* @__PURE__ */ (0, import_jsx_runtime142.jsx)(EventDetails, { selectedEvent }) })
5052
+ /* @__PURE__ */ (0, import_jsx_runtime142.jsx)(StyledDrawer, { anchor: "right", open, variant: "persistent", children: /* @__PURE__ */ (0, import_jsx_runtime142.jsx)(EventDetails, { onClose: handleClose, selectedEvent }) })
5042
5053
  ] })
5043
5054
  }
5044
5055
  )
@@ -5051,10 +5062,10 @@ var TraceGraphPage = () => {
5051
5062
  const [searchParameters] = (0, import_react_router_dom2.useSearchParams)();
5052
5063
  const spanId = searchParameters.get("spanId");
5053
5064
  const api = useAppInspectorApi();
5054
- const [spans, setSpans] = (0, import_react21.useState)();
5055
- const [loading, setLoading] = (0, import_react21.useState)(false);
5056
- const [fetchError, setFetchError] = (0, import_react21.useState)();
5057
- const fetchSpans = (0, import_react21.useCallback)(async () => {
5065
+ const [spans, setSpans] = (0, import_react22.useState)();
5066
+ const [loading, setLoading] = (0, import_react22.useState)(false);
5067
+ const [fetchError, setFetchError] = (0, import_react22.useState)();
5068
+ const fetchSpans = (0, import_react22.useCallback)(async () => {
5058
5069
  setLoading(true);
5059
5070
  try {
5060
5071
  const response = await api.getSpans({
@@ -5069,14 +5080,14 @@ var TraceGraphPage = () => {
5069
5080
  setLoading(false);
5070
5081
  }
5071
5082
  }, [api, traceId]);
5072
- (0, import_react21.useEffect)(() => {
5083
+ (0, import_react22.useEffect)(() => {
5073
5084
  void fetchSpans();
5074
5085
  }, [fetchSpans]);
5075
- const [open, setOpen] = (0, import_react21.useState)(true);
5076
- const [selectedEvent, setSelectedEvent] = (0, import_react21.useState)();
5077
- const [viewPortPixelWidth, setViewPortPixelWidth] = (0, import_react21.useState)(0);
5086
+ const [open, setOpen] = (0, import_react22.useState)(true);
5087
+ const [selectedEvent, setSelectedEvent] = (0, import_react22.useState)();
5088
+ const [viewPortPixelWidth, setViewPortPixelWidth] = (0, import_react22.useState)(0);
5078
5089
  const { checkStatus, error: statusError, status } = useStatus();
5079
- const calculateDrawerWidth = (0, import_react21.useCallback)(() => {
5090
+ const calculateDrawerWidth = (0, import_react22.useCallback)(() => {
5080
5091
  const percentageMatch = /(\d+)%/.exec(DRAWER_WIDTH);
5081
5092
  if (percentageMatch && open) {
5082
5093
  const percentage = Number.parseInt(percentageMatch[1], 10);
@@ -5084,7 +5095,7 @@ var TraceGraphPage = () => {
5084
5095
  }
5085
5096
  return 0;
5086
5097
  }, [open]);
5087
- (0, import_react21.useEffect)(() => {
5098
+ (0, import_react22.useEffect)(() => {
5088
5099
  const updateViewportWidth = () => {
5089
5100
  const totalWidth = window.innerWidth;
5090
5101
  const drawerPixelWidth = open ? calculateDrawerWidth() : 0;
@@ -5098,16 +5109,16 @@ var TraceGraphPage = () => {
5098
5109
  clearTimeout(timeoutId);
5099
5110
  };
5100
5111
  }, [open, calculateDrawerWidth]);
5101
- const handleEventSelect = (0, import_react21.useCallback)((event) => {
5112
+ const handleEventSelect = (0, import_react22.useCallback)((event) => {
5102
5113
  setSelectedEvent(event);
5103
5114
  setOpen(true);
5104
5115
  }, []);
5105
- const handleRetry = (0, import_react21.useCallback)(() => {
5116
+ const handleRetry = (0, import_react22.useCallback)(() => {
5106
5117
  void checkStatus();
5107
5118
  }, [checkStatus]);
5108
5119
  const navigate = (0, import_react_router_dom2.useNavigate)();
5109
5120
  const { resolveLink } = useAppInspector();
5110
- const navigateToSpansList = (0, import_react21.useCallback)(() => {
5121
+ const navigateToSpansList = (0, import_react22.useCallback)(() => {
5111
5122
  const url = resolveLink({ to: "spans-list" });
5112
5123
  navigate(url);
5113
5124
  }, [navigate, resolveLink]);
@@ -5116,6 +5127,9 @@ var TraceGraphPage = () => {
5116
5127
  {
5117
5128
  fetchError,
5118
5129
  fetchSpans: () => void fetchSpans(),
5130
+ handleClose: () => {
5131
+ setOpen(false);
5132
+ },
5119
5133
  handleEventSelect,
5120
5134
  handleRetry,
5121
5135
  loading,