@mastra/playground-ui 68.0.0-alpha.3 → 68.0.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 (163) hide show
  1. package/dist/{FilterBar-CQl04O6t.cjs → FilterBar-BSP2UTjc.cjs} +2 -2
  2. package/dist/{FilterBar-CQl04O6t.cjs.map → FilterBar-BSP2UTjc.cjs.map} +1 -1
  3. package/dist/{FilterBar-BgW2dqRQ.js → FilterBar-PSQ1OwqH.js} +2 -2
  4. package/dist/{FilterBar-BgW2dqRQ.js.map → FilterBar-PSQ1OwqH.js.map} +1 -1
  5. package/dist/{MetricsCard-CEB-f2sv.cjs → MetricsCard-BEwiS7Pe.cjs} +8 -8
  6. package/dist/MetricsCard-BEwiS7Pe.cjs.map +1 -0
  7. package/dist/{MetricsCard-M8awJ2B_.js → MetricsCard-ua6C6b8a.js} +10 -10
  8. package/dist/MetricsCard-ua6C6b8a.js.map +1 -0
  9. package/dist/{MetricsLineChart-BhHoduO0.js → MetricsLineChart-4SwxBbQx.js} +14 -3
  10. package/dist/MetricsLineChart-4SwxBbQx.js.map +1 -0
  11. package/dist/{MetricsLineChart-CjBm4IXu.cjs → MetricsLineChart-tZxsauau.cjs} +13 -2
  12. package/dist/MetricsLineChart-tZxsauau.cjs.map +1 -0
  13. package/dist/{MetricsStackedBarChart-BdMlKv6G.cjs → MetricsStackedBarChart-CDLE76IB.cjs} +2 -2
  14. package/dist/{MetricsStackedBarChart-BdMlKv6G.cjs.map → MetricsStackedBarChart-CDLE76IB.cjs.map} +1 -1
  15. package/dist/{MetricsStackedBarChart-BRuA6MTE.js → MetricsStackedBarChart-D2QyS4-z.js} +2 -2
  16. package/dist/{MetricsStackedBarChart-BRuA6MTE.js.map → MetricsStackedBarChart-D2QyS4-z.js.map} +1 -1
  17. package/dist/components/DateTimeRangePicker.cjs.js +1 -1
  18. package/dist/components/DateTimeRangePicker.es.js +1 -1
  19. package/dist/components/FilterBar.cjs.js +2 -2
  20. package/dist/components/FilterBar.es.js +2 -2
  21. package/dist/components/MetricsCard.cjs.js +1 -1
  22. package/dist/components/MetricsCard.es.js +1 -1
  23. package/dist/components/MetricsLineChart.cjs.js +1 -1
  24. package/dist/components/MetricsLineChart.es.js +1 -1
  25. package/dist/components/MetricsStackedBarChart.cjs.js +1 -1
  26. package/dist/components/MetricsStackedBarChart.es.js +1 -1
  27. package/dist/{date-time-range-picker-CTt7Od0P.cjs → date-time-range-picker-CWGjoR3j.cjs} +40 -13
  28. package/dist/date-time-range-picker-CWGjoR3j.cjs.map +1 -0
  29. package/dist/{date-time-range-picker-DKh1K9Iy.js → date-time-range-picker-CdSiXwB4.js} +40 -13
  30. package/dist/date-time-range-picker-CdSiXwB4.js.map +1 -0
  31. package/dist/domains/chat/messages/message-row.cjs.js +1 -1
  32. package/dist/domains/chat/messages/message-row.es.js +1 -1
  33. package/dist/domains/chat/tools/badges/agent-badge-wrapper.cjs.js +1 -1
  34. package/dist/domains/chat/tools/badges/agent-badge-wrapper.es.js +1 -1
  35. package/dist/domains/chat/tools/badges/agent-badge.cjs.js +1 -1
  36. package/dist/domains/chat/tools/badges/agent-badge.es.js +1 -1
  37. package/dist/domains/chat/tools/connect-prompt-tool.cjs.js +79 -4
  38. package/dist/domains/chat/tools/connect-prompt-tool.cjs.js.map +1 -1
  39. package/dist/domains/chat/tools/connect-prompt-tool.es.js +79 -4
  40. package/dist/domains/chat/tools/connect-prompt-tool.es.js.map +1 -1
  41. package/dist/domains/chat/tools/mcp-input-request-tool.cjs.js +10 -12
  42. package/dist/domains/chat/tools/mcp-input-request-tool.cjs.js.map +1 -1
  43. package/dist/domains/chat/tools/mcp-input-request-tool.es.js +10 -12
  44. package/dist/domains/chat/tools/mcp-input-request-tool.es.js.map +1 -1
  45. package/dist/domains/chat/tools/tool-card-kind.cjs.js +1 -1
  46. package/dist/domains/chat/tools/tool-card-kind.cjs.js.map +1 -1
  47. package/dist/domains/chat/tools/tool-card-kind.es.js +1 -1
  48. package/dist/domains/chat/tools/tool-card-kind.es.js.map +1 -1
  49. package/dist/domains/chat/tools/tool-card.cjs.js +1 -1
  50. package/dist/domains/chat/tools/tool-card.es.js +1 -1
  51. package/dist/domains/connect/types.cjs.js.map +1 -1
  52. package/dist/domains/connect/types.es.js.map +1 -1
  53. package/dist/domains/connect/use-user-connect.cjs.js +19 -2
  54. package/dist/domains/connect/use-user-connect.cjs.js.map +1 -1
  55. package/dist/domains/connect/use-user-connect.es.js +19 -2
  56. package/dist/domains/connect/use-user-connect.es.js.map +1 -1
  57. package/dist/domains/dashboards/components/dashboard-renderer.cjs.js +4 -3
  58. package/dist/domains/dashboards/components/dashboard-renderer.cjs.js.map +1 -1
  59. package/dist/domains/dashboards/components/dashboard-renderer.es.js +4 -3
  60. package/dist/domains/dashboards/components/dashboard-renderer.es.js.map +1 -1
  61. package/dist/domains/dashboards/components/widget-chrome.cjs.js +1 -1
  62. package/dist/domains/dashboards/components/widget-chrome.es.js +1 -1
  63. package/dist/domains/dashboards/components/widget-error.cjs.js +1 -1
  64. package/dist/domains/dashboards/components/widget-error.es.js +1 -1
  65. package/dist/domains/dashboards/hooks/use-widget-views.cjs.js +4 -3
  66. package/dist/domains/dashboards/hooks/use-widget-views.cjs.js.map +1 -1
  67. package/dist/domains/dashboards/hooks/use-widget-views.es.js +4 -3
  68. package/dist/domains/dashboards/hooks/use-widget-views.es.js.map +1 -1
  69. package/dist/domains/dashboards/kinds/scores/scores-widget.cjs.js +9 -6
  70. package/dist/domains/dashboards/kinds/scores/scores-widget.cjs.js.map +1 -1
  71. package/dist/domains/dashboards/kinds/scores/scores-widget.es.js +9 -6
  72. package/dist/domains/dashboards/kinds/scores/scores-widget.es.js.map +1 -1
  73. package/dist/domains/dashboards/kinds/table/table-tabs.cjs.js +2 -2
  74. package/dist/domains/dashboards/kinds/table/table-tabs.es.js +2 -2
  75. package/dist/domains/dashboards/kinds/table/table-widget.cjs.js +1 -1
  76. package/dist/domains/dashboards/kinds/table/table-widget.es.js +1 -1
  77. package/dist/domains/dashboards/kinds/timeseries/timeseries-widget.cjs.js +6 -5
  78. package/dist/domains/dashboards/kinds/timeseries/timeseries-widget.cjs.js.map +1 -1
  79. package/dist/domains/dashboards/kinds/timeseries/timeseries-widget.es.js +6 -5
  80. package/dist/domains/dashboards/kinds/timeseries/timeseries-widget.es.js.map +1 -1
  81. package/dist/domains/dashboards/lib/chrome.cjs.js +9 -2
  82. package/dist/domains/dashboards/lib/chrome.cjs.js.map +1 -1
  83. package/dist/domains/dashboards/lib/chrome.es.js +9 -2
  84. package/dist/domains/dashboards/lib/chrome.es.js.map +1 -1
  85. package/dist/domains/dashboards/widget-kind.cjs.js.map +1 -1
  86. package/dist/domains/dashboards/widget-kind.es.js.map +1 -1
  87. package/dist/domains/metrics/components/agent-runs-card.cjs.js +3 -3
  88. package/dist/domains/metrics/components/agent-runs-card.es.js +3 -3
  89. package/dist/domains/metrics/components/breakdown/breakdown-tab-body.cjs.js +1 -1
  90. package/dist/domains/metrics/components/breakdown/breakdown-tab-body.es.js +1 -1
  91. package/dist/domains/metrics/components/breakdown-card.cjs.js +1 -1
  92. package/dist/domains/metrics/components/breakdown-card.es.js +1 -1
  93. package/dist/domains/metrics/components/chart-area.cjs.js +1 -1
  94. package/dist/domains/metrics/components/chart-area.es.js +1 -1
  95. package/dist/domains/metrics/components/chart-card-error.cjs.js +1 -1
  96. package/dist/domains/metrics/components/chart-card-error.es.js +1 -1
  97. package/dist/domains/metrics/components/chart-card.cjs.js +1 -1
  98. package/dist/domains/metrics/components/chart-card.es.js +1 -1
  99. package/dist/domains/metrics/components/date-range-selector.cjs.js +1 -1
  100. package/dist/domains/metrics/components/date-range-selector.es.js +1 -1
  101. package/dist/domains/metrics/components/distinct-ids/distinct-ids-chart.cjs.js +3 -2
  102. package/dist/domains/metrics/components/distinct-ids/distinct-ids-chart.cjs.js.map +1 -1
  103. package/dist/domains/metrics/components/distinct-ids/distinct-ids-chart.es.js +3 -2
  104. package/dist/domains/metrics/components/distinct-ids/distinct-ids-chart.es.js.map +1 -1
  105. package/dist/domains/metrics/components/failure-rate-card.cjs.js +3 -2
  106. package/dist/domains/metrics/components/failure-rate-card.cjs.js.map +1 -1
  107. package/dist/domains/metrics/components/failure-rate-card.es.js +3 -2
  108. package/dist/domains/metrics/components/failure-rate-card.es.js.map +1 -1
  109. package/dist/domains/metrics/components/latency-card.cjs.js +3 -2
  110. package/dist/domains/metrics/components/latency-card.cjs.js.map +1 -1
  111. package/dist/domains/metrics/components/latency-card.es.js +3 -2
  112. package/dist/domains/metrics/components/latency-card.es.js.map +1 -1
  113. package/dist/domains/metrics/components/metrics-time-range-chip.cjs.js +1 -1
  114. package/dist/domains/metrics/components/metrics-time-range-chip.es.js +1 -1
  115. package/dist/domains/metrics/components/scores-card.cjs.js +2 -1
  116. package/dist/domains/metrics/components/scores-card.cjs.js.map +1 -1
  117. package/dist/domains/metrics/components/scores-card.es.js +2 -1
  118. package/dist/domains/metrics/components/scores-card.es.js.map +1 -1
  119. package/dist/domains/metrics/components/token-usage-card.cjs.js +3 -3
  120. package/dist/domains/metrics/components/token-usage-card.es.js +3 -3
  121. package/dist/domains/metrics/components/trace-aggregate-card.cjs.js +1 -1
  122. package/dist/domains/metrics/components/trace-aggregate-card.es.js +1 -1
  123. package/dist/domains/observability/components/observability-histogram.cjs.js +1 -1
  124. package/dist/domains/observability/components/observability-histogram.es.js +1 -1
  125. package/dist/domains/spans/components/spans-filter-bar.cjs.js +2 -2
  126. package/dist/domains/spans/components/spans-filter-bar.es.js +2 -2
  127. package/dist/domains/spans/hooks/use-spans-filter-bar.cjs.js +1 -1
  128. package/dist/domains/spans/hooks/use-spans-filter-bar.es.js +1 -1
  129. package/dist/domains/threads/components/threads-filter-bar.cjs.js +2 -2
  130. package/dist/domains/threads/components/threads-filter-bar.es.js +2 -2
  131. package/dist/domains/threads/hooks/use-threads-filter-bar.cjs.js +1 -1
  132. package/dist/domains/threads/hooks/use-threads-filter-bar.es.js +1 -1
  133. package/dist/domains/traces/components/traces-explorer/traces-explorer-filter-bar.cjs.js +2 -2
  134. package/dist/domains/traces/components/traces-explorer/traces-explorer-filter-bar.es.js +2 -2
  135. package/dist/domains/traces/components/traces-explorer/use-traces-filter-bar.cjs.js +1 -1
  136. package/dist/domains/traces/components/traces-explorer/use-traces-filter-bar.es.js +1 -1
  137. package/dist/{filter-bar-time-range-mg9JeYue.js → filter-bar-time-range-qlV8p7hp.js} +2 -2
  138. package/dist/{filter-bar-time-range-mg9JeYue.js.map → filter-bar-time-range-qlV8p7hp.js.map} +1 -1
  139. package/dist/{filter-bar-time-range-BA-pXMlo.cjs → filter-bar-time-range-zdM024JD.cjs} +2 -2
  140. package/dist/{filter-bar-time-range-BA-pXMlo.cjs.map → filter-bar-time-range-zdM024JD.cjs.map} +1 -1
  141. package/dist/src/domains/chat/tools/connect-prompt-tool.d.ts +10 -1
  142. package/dist/src/domains/connect/types.d.ts +16 -0
  143. package/dist/src/domains/dashboards/components/dashboard-renderer.d.ts +4 -2
  144. package/dist/src/domains/dashboards/hooks/use-widget-views.d.ts +4 -3
  145. package/dist/src/domains/dashboards/index.d.ts +1 -1
  146. package/dist/src/domains/dashboards/kinds/scores/scores-widget.d.ts +1 -1
  147. package/dist/src/domains/dashboards/lib/chrome.d.ts +6 -4
  148. package/dist/src/domains/dashboards/widget-kind.d.ts +12 -0
  149. package/dist/src/ds/components/DateTimeRangePicker/date-time-range-picker.d.ts +12 -1
  150. package/dist/src/ds/components/MetricsCard/metrics-card-headline.d.ts +1 -1
  151. package/dist/src/ds/components/MetricsLineChart/metrics-line-chart.d.ts +8 -0
  152. package/dist/style.css +4 -0
  153. package/dist/{tool-card-rxhTDpk_.cjs → tool-card-BOLXeKIp.cjs} +4 -1
  154. package/dist/{tool-card-rxhTDpk_.cjs.map → tool-card-BOLXeKIp.cjs.map} +1 -1
  155. package/dist/{tool-card-toDgoZzJ.js → tool-card-HZ5bm7ue.js} +4 -1
  156. package/dist/{tool-card-toDgoZzJ.js.map → tool-card-HZ5bm7ue.js.map} +1 -1
  157. package/package.json +9 -9
  158. package/dist/MetricsCard-CEB-f2sv.cjs.map +0 -1
  159. package/dist/MetricsCard-M8awJ2B_.js.map +0 -1
  160. package/dist/MetricsLineChart-BhHoduO0.js.map +0 -1
  161. package/dist/MetricsLineChart-CjBm4IXu.cjs.map +0 -1
  162. package/dist/date-time-range-picker-CTt7Od0P.cjs.map +0 -1
  163. package/dist/date-time-range-picker-DKh1K9Iy.js.map +0 -1
@@ -2,13 +2,13 @@ import { formatAxisCount, formatCount } from "../../lib/chart-format.es.js";
2
2
  import { bucketWindow, intervalHours } from "../../lib/metrics-buckets.es.js";
3
3
  import { bucketTraceAggregateRows } from "../../lib/trace-aggregate.es.js";
4
4
  import { useMetricsTraceAggregate } from "../../hooks/use-metrics-trace-aggregate.es.js";
5
- import { t as MetricsCard } from "../../../../MetricsCard-M8awJ2B_.js";
5
+ import { t as MetricsCard } from "../../../../MetricsCard-ua6C6b8a.js";
6
6
  import { ChartArea } from "../chart-area.es.js";
7
7
  import { ChartCard } from "../chart-card.es.js";
8
8
  import { ChartCardError } from "../chart-card-error.es.js";
9
9
  import { EDGE_BUCKET_AXIS } from "../../lib/chart-axis.es.js";
10
10
  import { CHART_COLORS } from "../../lib/chart-colors.es.js";
11
- import { r as MetricsLineChartLegend, t as MetricsLineChart } from "../../../../MetricsLineChart-BhHoduO0.js";
11
+ import { r as MetricsLineChartLegend, t as MetricsLineChart } from "../../../../MetricsLineChart-4SwxBbQx.js";
12
12
  import { jsx } from "react/jsx-runtime";
13
13
  // src/domains/metrics/components/distinct-ids/distinct-ids-chart.tsx
14
14
  /** Most apps set resource and thread ids (through memory); few set user and session ids. */
@@ -99,6 +99,7 @@ function DistinctIdsChart({ scope, onTimeRangeClick }) {
99
99
  isEmpty: !isLoading && shown.length === 0,
100
100
  emptyMessage: "No traces in this range set a resource, thread, user or session id.",
101
101
  children: /* @__PURE__ */ jsx(MetricsLineChart, {
102
+ lineStyle: "thin",
102
103
  data: chart,
103
104
  series: lines,
104
105
  height: "fill",
@@ -1 +1 @@
1
- {"version":3,"file":"distinct-ids-chart.es.js","names":[],"sources":["../../../../../src/domains/metrics/components/distinct-ids/distinct-ids-chart.tsx"],"sourcesContent":["import type { AggregateTracesArgs } from '@mastra/client-js';\nimport type { DrilldownScope } from '../../drilldown';\nimport { useMetricsTraceAggregate } from '../../hooks/use-metrics-trace-aggregate';\nimport type { TraceAggregateScope } from '../../hooks/use-metrics-trace-aggregate';\nimport { EDGE_BUCKET_AXIS } from '../../lib/chart-axis';\nimport { CHART_COLORS } from '../../lib/chart-colors';\nimport { formatAxisCount, formatCount } from '../../lib/chart-format';\nimport { bucketWindow, intervalHours } from '../../lib/metrics-buckets';\nimport { bucketTraceAggregateRows, TRACE_AGGREGATE_SERIES_LIMIT } from '../../lib/trace-aggregate';\nimport type { TraceAggregateRow } from '../../lib/trace-aggregate';\nimport { ChartArea } from '../chart-area';\nimport { ChartCard } from '../chart-card';\nimport { ChartCardError } from '../chart-card-error';\nimport { MetricsCard } from '@/ds/components/MetricsCard';\nimport { MetricsLineChart, MetricsLineChartLegend } from '@/ds/components/MetricsLineChart';\nimport type { MetricsLineChartSeries } from '@/ds/components/MetricsLineChart';\n\n/** Most apps set resource and thread ids (through memory); few set user and session ids. */\nconst IDS = [\n { measure: 'countDistinct.resourceId', dataKey: 'resources', label: 'Resources', color: CHART_COLORS.sky },\n { measure: 'countDistinct.threadId', dataKey: 'threads', label: 'Threads', color: CHART_COLORS.green },\n { measure: 'countDistinct.userId', dataKey: 'users', label: 'Users', color: CHART_COLORS.violet },\n { measure: 'countDistinct.sessionId', dataKey: 'sessions', label: 'Sessions', color: CHART_COLORS.teal },\n] as const;\n\ntype Id = (typeof IDS)[number];\n\nconst MEASURES: AggregateTracesArgs['measures'] = IDS.map(id => id.measure);\n\nexport const DISTINCT_IDS_TITLE = 'Resources and threads';\n\nexport type DistinctIdsChartProps = {\n scope: TraceAggregateScope;\n /** Called with the time range of the clicked bucket. */\n onTimeRangeClick?: (scope: DrilldownScope) => void;\n};\n\nfunction count(row: TraceAggregateRow | undefined, id: Id) {\n return row?.measures[id.measure] ?? 0;\n}\n\n/** Distinct ids per bucket, with range totals from a second request. */\nexport function DistinctIdsChart({ scope, onTimeRangeClick }: DistinctIdsChartProps) {\n const series = useMetricsTraceAggregate({\n timeRange: scope.timeRange,\n where: scope.where,\n interval: scope.interval,\n measures: MEASURES,\n limit: TRACE_AGGREGATE_SERIES_LIMIT,\n });\n // Bucket counts can't be added up: an id active in two buckets would count twice.\n const totals = useMetricsTraceAggregate({ timeRange: scope.timeRange, where: scope.where, measures: MEASURES });\n\n const total = totals.data?.rows[0];\n // Only the ids this project sets get a line; the rest would sit flat at zero.\n const shown = IDS.filter(id => count(total, id) > 0);\n const lines: MetricsLineChartSeries[] = shown.map((id, i) => ({\n dataKey: id.dataKey,\n label: id.label,\n color: id.color,\n emphasis: i === 0,\n }));\n const chart = bucketTraceAggregateRows(series.data?.rows ?? [], scope.window).map(({ rows, ...labels }) => ({\n ...labels,\n ...Object.fromEntries(shown.map(id => [id.dataKey, count(rows[0], id)])),\n }));\n const step = intervalHours(scope.interval === '1d' ? '1d' : '1h');\n const error = series.error ?? totals.error;\n const isLoading = series.isLoading || totals.isLoading;\n\n const layout = {\n title: DISTINCT_IDS_TITLE,\n // Each id's range total, marked like its line: they count different things, so no one sum.\n total: shown.map(id => ({ label: id.label, value: formatCount(count(total, id)), color: id.color })),\n isLoading: totals.isLoading,\n toolbar: lines.length > 0 && (\n <MetricsCard.Toolbar>\n <MetricsLineChartLegend series={lines} />\n </MetricsCard.Toolbar>\n ),\n };\n\n if (error) {\n return (\n <ChartCard {...layout}>\n <ChartCardError\n error={error}\n onRetry={() => {\n if (series.error) void series.refetch();\n if (totals.error) void totals.refetch();\n }}\n />\n </ChartCard>\n );\n }\n\n return (\n <ChartCard {...layout} isUpdating={series.isPlaceholderData || totals.isPlaceholderData}>\n <ChartArea\n isEmpty={!isLoading && shown.length === 0}\n emptyMessage=\"No traces in this range set a resource, thread, user or session id.\"\n >\n <MetricsLineChart\n data={chart}\n series={lines}\n height=\"fill\"\n xLabels=\"edges\"\n showLegend={false}\n valueFormatter={formatCount}\n axisFormatter={formatAxisCount}\n onBucketClick={onTimeRangeClick && (row => onTimeRangeClick({ window: bucketWindow(Number(row.ts), step) }))}\n isLoading={isLoading}\n {...EDGE_BUCKET_AXIS}\n />\n </ChartArea>\n </ChartCard>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;AAkBA,IAAM,MAAM;CACV;EAAE,SAAS;EAA4B,SAAS;EAAa,OAAO;EAAa,OAAO,aAAa;CAAI;CACzG;EAAE,SAAS;EAA0B,SAAS;EAAW,OAAO;EAAW,OAAO,aAAa;CAAM;CACrG;EAAE,SAAS;EAAwB,SAAS;EAAS,OAAO;EAAS,OAAO,aAAa;CAAO;CAChG;EAAE,SAAS;EAA2B,SAAS;EAAY,OAAO;EAAY,OAAO,aAAa;CAAK;AACzG;AAIA,IAAM,WAA4C,IAAI,KAAI,OAAM,GAAG,OAAO;AAE1E,IAAa,qBAAqB;AAQlC,SAAS,MAAM,KAAoC,IAAQ;CACzD,OAAO,KAAK,SAAS,GAAG,YAAY;AACtC;;AAGA,SAAgB,iBAAiB,EAAE,OAAO,oBAA2C;CACnF,MAAM,SAAS,yBAAyB;EACtC,WAAW,MAAM;EACjB,OAAO,MAAM;EACb,UAAU,MAAM;EAChB,UAAU;EACV,OAAA;CACF,CAAC;CAED,MAAM,SAAS,yBAAyB;EAAE,WAAW,MAAM;EAAW,OAAO,MAAM;EAAO,UAAU;CAAS,CAAC;CAE9G,MAAM,QAAQ,OAAO,MAAM,KAAK;CAEhC,MAAM,QAAQ,IAAI,QAAO,OAAM,MAAM,OAAO,EAAE,IAAI,CAAC;CACnD,MAAM,QAAkC,MAAM,KAAK,IAAI,OAAO;EAC5D,SAAS,GAAG;EACZ,OAAO,GAAG;EACV,OAAO,GAAG;EACV,UAAU,MAAM;CAClB,EAAE;CACF,MAAM,QAAQ,yBAAyB,OAAO,MAAM,QAAQ,CAAC,GAAG,MAAM,MAAM,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc;EAC1G,GAAG;EACH,GAAG,OAAO,YAAY,MAAM,KAAI,OAAM,CAAC,GAAG,SAAS,MAAM,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;CACzE,EAAE;CACF,MAAM,OAAO,cAAc,MAAM,aAAa,OAAO,OAAO,IAAI;CAChE,MAAM,QAAQ,OAAO,SAAS,OAAO;CACrC,MAAM,YAAY,OAAO,aAAa,OAAO;CAE7C,MAAM,SAAS;EACb,OAAO;EAEP,OAAO,MAAM,KAAI,QAAO;GAAE,OAAO,GAAG;GAAO,OAAO,YAAY,MAAM,OAAO,EAAE,CAAC;GAAG,OAAO,GAAG;EAAM,EAAE;EACnG,WAAW,OAAO;EAClB,SAAS,MAAM,SAAS,KACtB,oBAAC,YAAY,SAAb,EAAA,UACE,oBAAC,wBAAD,EAAwB,QAAQ,MAAQ,CAAA,EACrB,CAAA;CAEzB;CAEA,IAAI,OACF,OACE,oBAAC,WAAD;EAAW,GAAI;EACb,UAAA,oBAAC,gBAAD;GACS;GACP,eAAe;IACb,IAAI,OAAO,OAAO,OAAY,QAAQ;IACtC,IAAI,OAAO,OAAO,OAAY,QAAQ;GACxC;EACD,CAAA;CACQ,CAAA;CAIf,OACE,oBAAC,WAAD;EAAW,GAAI;EAAQ,YAAY,OAAO,qBAAqB,OAAO;EACpE,UAAA,oBAAC,WAAD;GACE,SAAS,CAAC,aAAa,MAAM,WAAW;GACxC,cAAa;GAEb,UAAA,oBAAC,kBAAD;IACE,MAAM;IACN,QAAQ;IACR,QAAO;IACP,SAAQ;IACR,YAAY;IACZ,gBAAgB;IAChB,eAAe;IACf,eAAe,sBAAqB,QAAO,iBAAiB,EAAE,QAAQ,aAAa,OAAO,IAAI,EAAE,GAAG,IAAI,EAAE,CAAC;IAC/F;IACX,GAAI;GACL,CAAA;EACQ,CAAA;CACF,CAAA;AAEf"}
1
+ {"version":3,"file":"distinct-ids-chart.es.js","names":[],"sources":["../../../../../src/domains/metrics/components/distinct-ids/distinct-ids-chart.tsx"],"sourcesContent":["import type { AggregateTracesArgs } from '@mastra/client-js';\nimport type { DrilldownScope } from '../../drilldown';\nimport { useMetricsTraceAggregate } from '../../hooks/use-metrics-trace-aggregate';\nimport type { TraceAggregateScope } from '../../hooks/use-metrics-trace-aggregate';\nimport { EDGE_BUCKET_AXIS } from '../../lib/chart-axis';\nimport { CHART_COLORS } from '../../lib/chart-colors';\nimport { formatAxisCount, formatCount } from '../../lib/chart-format';\nimport { bucketWindow, intervalHours } from '../../lib/metrics-buckets';\nimport { bucketTraceAggregateRows, TRACE_AGGREGATE_SERIES_LIMIT } from '../../lib/trace-aggregate';\nimport type { TraceAggregateRow } from '../../lib/trace-aggregate';\nimport { ChartArea } from '../chart-area';\nimport { ChartCard } from '../chart-card';\nimport { ChartCardError } from '../chart-card-error';\nimport { MetricsCard } from '@/ds/components/MetricsCard';\nimport { MetricsLineChart, MetricsLineChartLegend } from '@/ds/components/MetricsLineChart';\nimport type { MetricsLineChartSeries } from '@/ds/components/MetricsLineChart';\n\n/** Most apps set resource and thread ids (through memory); few set user and session ids. */\nconst IDS = [\n { measure: 'countDistinct.resourceId', dataKey: 'resources', label: 'Resources', color: CHART_COLORS.sky },\n { measure: 'countDistinct.threadId', dataKey: 'threads', label: 'Threads', color: CHART_COLORS.green },\n { measure: 'countDistinct.userId', dataKey: 'users', label: 'Users', color: CHART_COLORS.violet },\n { measure: 'countDistinct.sessionId', dataKey: 'sessions', label: 'Sessions', color: CHART_COLORS.teal },\n] as const;\n\ntype Id = (typeof IDS)[number];\n\nconst MEASURES: AggregateTracesArgs['measures'] = IDS.map(id => id.measure);\n\nexport const DISTINCT_IDS_TITLE = 'Resources and threads';\n\nexport type DistinctIdsChartProps = {\n scope: TraceAggregateScope;\n /** Called with the time range of the clicked bucket. */\n onTimeRangeClick?: (scope: DrilldownScope) => void;\n};\n\nfunction count(row: TraceAggregateRow | undefined, id: Id) {\n return row?.measures[id.measure] ?? 0;\n}\n\n/** Distinct ids per bucket, with range totals from a second request. */\nexport function DistinctIdsChart({ scope, onTimeRangeClick }: DistinctIdsChartProps) {\n const series = useMetricsTraceAggregate({\n timeRange: scope.timeRange,\n where: scope.where,\n interval: scope.interval,\n measures: MEASURES,\n limit: TRACE_AGGREGATE_SERIES_LIMIT,\n });\n // Bucket counts can't be added up: an id active in two buckets would count twice.\n const totals = useMetricsTraceAggregate({ timeRange: scope.timeRange, where: scope.where, measures: MEASURES });\n\n const total = totals.data?.rows[0];\n // Only the ids this project sets get a line; the rest would sit flat at zero.\n const shown = IDS.filter(id => count(total, id) > 0);\n const lines: MetricsLineChartSeries[] = shown.map((id, i) => ({\n dataKey: id.dataKey,\n label: id.label,\n color: id.color,\n emphasis: i === 0,\n }));\n const chart = bucketTraceAggregateRows(series.data?.rows ?? [], scope.window).map(({ rows, ...labels }) => ({\n ...labels,\n ...Object.fromEntries(shown.map(id => [id.dataKey, count(rows[0], id)])),\n }));\n const step = intervalHours(scope.interval === '1d' ? '1d' : '1h');\n const error = series.error ?? totals.error;\n const isLoading = series.isLoading || totals.isLoading;\n\n const layout = {\n title: DISTINCT_IDS_TITLE,\n // Each id's range total, marked like its line: they count different things, so no one sum.\n total: shown.map(id => ({ label: id.label, value: formatCount(count(total, id)), color: id.color })),\n isLoading: totals.isLoading,\n toolbar: lines.length > 0 && (\n <MetricsCard.Toolbar>\n <MetricsLineChartLegend series={lines} />\n </MetricsCard.Toolbar>\n ),\n };\n\n if (error) {\n return (\n <ChartCard {...layout}>\n <ChartCardError\n error={error}\n onRetry={() => {\n if (series.error) void series.refetch();\n if (totals.error) void totals.refetch();\n }}\n />\n </ChartCard>\n );\n }\n\n return (\n <ChartCard {...layout} isUpdating={series.isPlaceholderData || totals.isPlaceholderData}>\n <ChartArea\n isEmpty={!isLoading && shown.length === 0}\n emptyMessage=\"No traces in this range set a resource, thread, user or session id.\"\n >\n <MetricsLineChart\n lineStyle=\"thin\"\n data={chart}\n series={lines}\n height=\"fill\"\n xLabels=\"edges\"\n showLegend={false}\n valueFormatter={formatCount}\n axisFormatter={formatAxisCount}\n onBucketClick={onTimeRangeClick && (row => onTimeRangeClick({ window: bucketWindow(Number(row.ts), step) }))}\n isLoading={isLoading}\n {...EDGE_BUCKET_AXIS}\n />\n </ChartArea>\n </ChartCard>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;AAkBA,IAAM,MAAM;CACV;EAAE,SAAS;EAA4B,SAAS;EAAa,OAAO;EAAa,OAAO,aAAa;CAAI;CACzG;EAAE,SAAS;EAA0B,SAAS;EAAW,OAAO;EAAW,OAAO,aAAa;CAAM;CACrG;EAAE,SAAS;EAAwB,SAAS;EAAS,OAAO;EAAS,OAAO,aAAa;CAAO;CAChG;EAAE,SAAS;EAA2B,SAAS;EAAY,OAAO;EAAY,OAAO,aAAa;CAAK;AACzG;AAIA,IAAM,WAA4C,IAAI,KAAI,OAAM,GAAG,OAAO;AAE1E,IAAa,qBAAqB;AAQlC,SAAS,MAAM,KAAoC,IAAQ;CACzD,OAAO,KAAK,SAAS,GAAG,YAAY;AACtC;;AAGA,SAAgB,iBAAiB,EAAE,OAAO,oBAA2C;CACnF,MAAM,SAAS,yBAAyB;EACtC,WAAW,MAAM;EACjB,OAAO,MAAM;EACb,UAAU,MAAM;EAChB,UAAU;EACV,OAAA;CACF,CAAC;CAED,MAAM,SAAS,yBAAyB;EAAE,WAAW,MAAM;EAAW,OAAO,MAAM;EAAO,UAAU;CAAS,CAAC;CAE9G,MAAM,QAAQ,OAAO,MAAM,KAAK;CAEhC,MAAM,QAAQ,IAAI,QAAO,OAAM,MAAM,OAAO,EAAE,IAAI,CAAC;CACnD,MAAM,QAAkC,MAAM,KAAK,IAAI,OAAO;EAC5D,SAAS,GAAG;EACZ,OAAO,GAAG;EACV,OAAO,GAAG;EACV,UAAU,MAAM;CAClB,EAAE;CACF,MAAM,QAAQ,yBAAyB,OAAO,MAAM,QAAQ,CAAC,GAAG,MAAM,MAAM,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc;EAC1G,GAAG;EACH,GAAG,OAAO,YAAY,MAAM,KAAI,OAAM,CAAC,GAAG,SAAS,MAAM,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;CACzE,EAAE;CACF,MAAM,OAAO,cAAc,MAAM,aAAa,OAAO,OAAO,IAAI;CAChE,MAAM,QAAQ,OAAO,SAAS,OAAO;CACrC,MAAM,YAAY,OAAO,aAAa,OAAO;CAE7C,MAAM,SAAS;EACb,OAAO;EAEP,OAAO,MAAM,KAAI,QAAO;GAAE,OAAO,GAAG;GAAO,OAAO,YAAY,MAAM,OAAO,EAAE,CAAC;GAAG,OAAO,GAAG;EAAM,EAAE;EACnG,WAAW,OAAO;EAClB,SAAS,MAAM,SAAS,KACtB,oBAAC,YAAY,SAAb,EAAA,UACE,oBAAC,wBAAD,EAAwB,QAAQ,MAAQ,CAAA,EACrB,CAAA;CAEzB;CAEA,IAAI,OACF,OACE,oBAAC,WAAD;EAAW,GAAI;EACb,UAAA,oBAAC,gBAAD;GACS;GACP,eAAe;IACb,IAAI,OAAO,OAAO,OAAY,QAAQ;IACtC,IAAI,OAAO,OAAO,OAAY,QAAQ;GACxC;EACD,CAAA;CACQ,CAAA;CAIf,OACE,oBAAC,WAAD;EAAW,GAAI;EAAQ,YAAY,OAAO,qBAAqB,OAAO;EACpE,UAAA,oBAAC,WAAD;GACE,SAAS,CAAC,aAAa,MAAM,WAAW;GACxC,cAAa;GAEb,UAAA,oBAAC,kBAAD;IACE,WAAU;IACV,MAAM;IACN,QAAQ;IACR,QAAO;IACP,SAAQ;IACR,YAAY;IACZ,gBAAgB;IAChB,eAAe;IACf,eAAe,sBAAqB,QAAO,iBAAiB,EAAE,QAAQ,aAAa,OAAO,IAAI,EAAE,GAAG,IAAI,EAAE,CAAC;IAC/F;IACX,GAAI;GACL,CAAA;EACQ,CAAA;CACF,CAAA;AAEf"}
@@ -2,13 +2,13 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_domains_metrics_lib_chart_format = require("../lib/chart-format.cjs.js");
3
3
  const require_domains_metrics_hooks_use_metrics_filters = require("../hooks/use-metrics-filters.cjs.js");
4
4
  const require_domains_metrics_lib_metrics_buckets = require("../lib/metrics-buckets.cjs.js");
5
- const require_MetricsCard = require("../../../MetricsCard-CEB-f2sv.cjs");
5
+ const require_MetricsCard = require("../../../MetricsCard-BEwiS7Pe.cjs");
6
6
  const require_domains_metrics_components_chart_area = require("./chart-area.cjs.js");
7
7
  const require_domains_metrics_components_chart_card = require("./chart-card.cjs.js");
8
8
  const require_domains_metrics_components_chart_card_error = require("./chart-card-error.cjs.js");
9
9
  const require_domains_metrics_lib_chart_axis = require("../lib/chart-axis.cjs.js");
10
10
  const require_domains_metrics_lib_chart_colors = require("../lib/chart-colors.cjs.js");
11
- const require_MetricsLineChart = require("../../../MetricsLineChart-CjBm4IXu.cjs");
11
+ const require_MetricsLineChart = require("../../../MetricsLineChart-tZxsauau.cjs");
12
12
  const require_domains_metrics_components_card_action_buttons = require("./card-action-buttons.cjs.js");
13
13
  const require_domains_metrics_hooks_use_metrics_activity = require("../hooks/use-metrics-activity.cjs.js");
14
14
  let react_jsx_runtime = require("react/jsx-runtime");
@@ -45,6 +45,7 @@ function FailureRateCard({ onViewErrors, onTimeRangeClick, titleMenu }) {
45
45
  isEmpty: !isLoading && runs === 0,
46
46
  emptyMessage: "No agent runs in this range.",
47
47
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_MetricsLineChart.MetricsLineChart, {
48
+ lineStyle: "thin",
48
49
  data,
49
50
  series: SERIES,
50
51
  height: "fill",
@@ -1 +1 @@
1
- {"version":3,"file":"failure-rate-card.cjs.js","names":["CHART_COLORS","useMetricsActivity","useMetricsFilters","bucketPlan","OpenErrorsInLogsButton","MetricsCard","MetricsLineChartLegend","ChartCard","ChartCardError","formatPercent","ChartArea","MetricsLineChart","bucketWindow","EDGE_BUCKET_AXIS"],"sources":["../../../../src/domains/metrics/components/failure-rate-card.tsx"],"sourcesContent":["import { EntityType } from '@mastra/core/observability';\nimport type { TimeRange } from '../drilldown';\nimport { useMetricsActivity } from '../hooks/use-metrics-activity';\nimport { useMetricsFilters } from '../hooks/use-metrics-filters';\nimport { EDGE_BUCKET_AXIS } from '../lib/chart-axis';\nimport { CHART_COLORS } from '../lib/chart-colors';\nimport { formatPercent } from '../lib/chart-format';\nimport { bucketPlan, bucketWindow } from '../lib/metrics-buckets';\nimport { OpenErrorsInLogsButton } from './card-action-buttons';\nimport { ChartArea } from './chart-area';\nimport { ChartCard } from './chart-card';\nimport type { ChartCardProps } from './chart-card';\nimport { ChartCardError } from './chart-card-error';\nimport { MetricsCard } from '@/ds/components/MetricsCard';\nimport { MetricsLineChart, MetricsLineChartLegend } from '@/ds/components/MetricsLineChart';\n\nconst SERIES = [{ dataKey: 'failureRate', label: 'Failed runs', color: CHART_COLORS.error }];\n\nconst axisPercent = (ratio: number) => `${Math.round(ratio * 100)}%`;\n\n/** Share of agent runs that failed, per bucket; a point opens the failed runs' traces. */\nexport type FailureRateCardProps<V extends string = string> = {\n /** Called from the \"View errors in Logs\" button. */\n onViewErrors?: () => void;\n /** Called with the time range of the clicked bar or point. */\n onTimeRangeClick?: (range: TimeRange) => void;\n /** Switches to a sibling view from the title (Agent runs uses it). */\n titleMenu?: ChartCardProps<V>['titleMenu'];\n};\n\nexport function FailureRateCard<V extends string = string>({\n onViewErrors,\n onTimeRangeClick,\n titleMenu,\n}: FailureRateCardProps<V>) {\n const { data = [], isLoading, isError, isPlaceholderData } = useMetricsActivity();\n const { timestamp } = useMetricsFilters();\n const { stepHours } = bucketPlan(timestamp.start, timestamp.end);\n const runs = data.reduce((sum, b) => sum + b.completed + b.failed, 0);\n const failed = data.reduce((sum, b) => sum + b.failed, 0);\n // With nothing failed, the axis would fall back to 0-4 (400%); a share tops out at 100%.\n const yDomain: [number, number] | undefined = failed === 0 ? [0, 1] : undefined;\n\n const layout = {\n title: 'Failure rate',\n titleMenu,\n actions: onViewErrors && <OpenErrorsInLogsButton onClick={onViewErrors} />,\n toolbar: (\n <MetricsCard.Toolbar>\n <MetricsLineChartLegend series={SERIES} />\n </MetricsCard.Toolbar>\n ),\n };\n\n if (isError) {\n return (\n <ChartCard {...layout}>\n <ChartCardError />\n </ChartCard>\n );\n }\n\n return (\n <ChartCard\n {...layout}\n total={formatPercent(runs > 0 ? failed / runs : 0)}\n isLoading={isLoading}\n isUpdating={isPlaceholderData}\n >\n <ChartArea isEmpty={!isLoading && runs === 0} emptyMessage=\"No agent runs in this range.\">\n <MetricsLineChart\n data={data}\n series={SERIES}\n height=\"fill\"\n xLabels=\"edges\"\n showLegend={false}\n valueFormatter={formatPercent}\n axisFormatter={axisPercent}\n yDomain={yDomain}\n onBucketClick={onTimeRangeClick && (row => onTimeRangeClick(bucketWindow(Number(row.ts), stepHours)))}\n isLoading={isLoading}\n {...EDGE_BUCKET_AXIS}\n />\n </ChartArea>\n </ChartCard>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;AAgBA,IAAM,SAAS,CAAC;CAAE,SAAS;CAAe,OAAO;CAAe,OAAOA,yCAAAA,aAAa;AAAM,CAAC;AAE3F,IAAM,eAAe,UAAkB,GAAG,KAAK,MAAM,QAAQ,GAAG,EAAE;AAYlE,SAAgB,gBAA2C,EACzD,cACA,kBACA,aAC0B;CAC1B,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW,SAAS,sBAAsBC,mDAAAA,mBAAmB;CAChF,MAAM,EAAE,cAAcC,kDAAAA,kBAAkB;CACxC,MAAM,EAAE,cAAcC,4CAAAA,WAAW,UAAU,OAAO,UAAU,GAAG;CAC/D,MAAM,OAAO,KAAK,QAAQ,KAAK,MAAM,MAAM,EAAE,YAAY,EAAE,QAAQ,CAAC;CACpE,MAAM,SAAS,KAAK,QAAQ,KAAK,MAAM,MAAM,EAAE,QAAQ,CAAC;CAExD,MAAM,UAAwC,WAAW,IAAI,CAAC,GAAG,CAAC,IAAI,KAAA;CAEtE,MAAM,SAAS;EACb,OAAO;EACP;EACA,SAAS,gBAAgB,iBAAA,GAAA,kBAAA,IAAA,CAACC,uDAAAA,wBAAD,EAAwB,SAAS,aAAe,CAAA;EACzE,SACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,oBAAAA,YAAY,SAAb,EAAA,UACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,yBAAAA,wBAAD,EAAwB,QAAQ,OAAS,CAAA,EACtB,CAAA;CAEzB;CAEA,IAAI,SACF,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,8CAAAA,WAAD;EAAW,GAAI;EACb,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACC,oDAAAA,gBAAD,CAAiB,CAAA;CACR,CAAA;CAIf,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACD,8CAAAA,WAAD;EACE,GAAI;EACJ,OAAOE,yCAAAA,cAAc,OAAO,IAAI,SAAS,OAAO,CAAC;EACtC;EACX,YAAY;EAEZ,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACC,8CAAAA,WAAD;GAAW,SAAS,CAAC,aAAa,SAAS;GAAG,cAAa;GACzD,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACC,yBAAAA,kBAAD;IACQ;IACN,QAAQ;IACR,QAAO;IACP,SAAQ;IACR,YAAY;IACZ,gBAAgBF,yCAAAA;IAChB,eAAe;IACN;IACT,eAAe,sBAAqB,QAAO,iBAAiBG,4CAAAA,aAAa,OAAO,IAAI,EAAE,GAAG,SAAS,CAAC;IACxF;IACX,GAAIC,uCAAAA;GACL,CAAA;EACQ,CAAA;CACF,CAAA;AAEf"}
1
+ {"version":3,"file":"failure-rate-card.cjs.js","names":["CHART_COLORS","useMetricsActivity","useMetricsFilters","bucketPlan","OpenErrorsInLogsButton","MetricsCard","MetricsLineChartLegend","ChartCard","ChartCardError","formatPercent","ChartArea","MetricsLineChart","bucketWindow","EDGE_BUCKET_AXIS"],"sources":["../../../../src/domains/metrics/components/failure-rate-card.tsx"],"sourcesContent":["import { EntityType } from '@mastra/core/observability';\nimport type { TimeRange } from '../drilldown';\nimport { useMetricsActivity } from '../hooks/use-metrics-activity';\nimport { useMetricsFilters } from '../hooks/use-metrics-filters';\nimport { EDGE_BUCKET_AXIS } from '../lib/chart-axis';\nimport { CHART_COLORS } from '../lib/chart-colors';\nimport { formatPercent } from '../lib/chart-format';\nimport { bucketPlan, bucketWindow } from '../lib/metrics-buckets';\nimport { OpenErrorsInLogsButton } from './card-action-buttons';\nimport { ChartArea } from './chart-area';\nimport { ChartCard } from './chart-card';\nimport type { ChartCardProps } from './chart-card';\nimport { ChartCardError } from './chart-card-error';\nimport { MetricsCard } from '@/ds/components/MetricsCard';\nimport { MetricsLineChart, MetricsLineChartLegend } from '@/ds/components/MetricsLineChart';\n\nconst SERIES = [{ dataKey: 'failureRate', label: 'Failed runs', color: CHART_COLORS.error }];\n\nconst axisPercent = (ratio: number) => `${Math.round(ratio * 100)}%`;\n\n/** Share of agent runs that failed, per bucket; a point opens the failed runs' traces. */\nexport type FailureRateCardProps<V extends string = string> = {\n /** Called from the \"View errors in Logs\" button. */\n onViewErrors?: () => void;\n /** Called with the time range of the clicked bar or point. */\n onTimeRangeClick?: (range: TimeRange) => void;\n /** Switches to a sibling view from the title (Agent runs uses it). */\n titleMenu?: ChartCardProps<V>['titleMenu'];\n};\n\nexport function FailureRateCard<V extends string = string>({\n onViewErrors,\n onTimeRangeClick,\n titleMenu,\n}: FailureRateCardProps<V>) {\n const { data = [], isLoading, isError, isPlaceholderData } = useMetricsActivity();\n const { timestamp } = useMetricsFilters();\n const { stepHours } = bucketPlan(timestamp.start, timestamp.end);\n const runs = data.reduce((sum, b) => sum + b.completed + b.failed, 0);\n const failed = data.reduce((sum, b) => sum + b.failed, 0);\n // With nothing failed, the axis would fall back to 0-4 (400%); a share tops out at 100%.\n const yDomain: [number, number] | undefined = failed === 0 ? [0, 1] : undefined;\n\n const layout = {\n title: 'Failure rate',\n titleMenu,\n actions: onViewErrors && <OpenErrorsInLogsButton onClick={onViewErrors} />,\n toolbar: (\n <MetricsCard.Toolbar>\n <MetricsLineChartLegend series={SERIES} />\n </MetricsCard.Toolbar>\n ),\n };\n\n if (isError) {\n return (\n <ChartCard {...layout}>\n <ChartCardError />\n </ChartCard>\n );\n }\n\n return (\n <ChartCard\n {...layout}\n total={formatPercent(runs > 0 ? failed / runs : 0)}\n isLoading={isLoading}\n isUpdating={isPlaceholderData}\n >\n <ChartArea isEmpty={!isLoading && runs === 0} emptyMessage=\"No agent runs in this range.\">\n <MetricsLineChart\n lineStyle=\"thin\"\n data={data}\n series={SERIES}\n height=\"fill\"\n xLabels=\"edges\"\n showLegend={false}\n valueFormatter={formatPercent}\n axisFormatter={axisPercent}\n yDomain={yDomain}\n onBucketClick={onTimeRangeClick && (row => onTimeRangeClick(bucketWindow(Number(row.ts), stepHours)))}\n isLoading={isLoading}\n {...EDGE_BUCKET_AXIS}\n />\n </ChartArea>\n </ChartCard>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;AAgBA,IAAM,SAAS,CAAC;CAAE,SAAS;CAAe,OAAO;CAAe,OAAOA,yCAAAA,aAAa;AAAM,CAAC;AAE3F,IAAM,eAAe,UAAkB,GAAG,KAAK,MAAM,QAAQ,GAAG,EAAE;AAYlE,SAAgB,gBAA2C,EACzD,cACA,kBACA,aAC0B;CAC1B,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW,SAAS,sBAAsBC,mDAAAA,mBAAmB;CAChF,MAAM,EAAE,cAAcC,kDAAAA,kBAAkB;CACxC,MAAM,EAAE,cAAcC,4CAAAA,WAAW,UAAU,OAAO,UAAU,GAAG;CAC/D,MAAM,OAAO,KAAK,QAAQ,KAAK,MAAM,MAAM,EAAE,YAAY,EAAE,QAAQ,CAAC;CACpE,MAAM,SAAS,KAAK,QAAQ,KAAK,MAAM,MAAM,EAAE,QAAQ,CAAC;CAExD,MAAM,UAAwC,WAAW,IAAI,CAAC,GAAG,CAAC,IAAI,KAAA;CAEtE,MAAM,SAAS;EACb,OAAO;EACP;EACA,SAAS,gBAAgB,iBAAA,GAAA,kBAAA,IAAA,CAACC,uDAAAA,wBAAD,EAAwB,SAAS,aAAe,CAAA;EACzE,SACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,oBAAAA,YAAY,SAAb,EAAA,UACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,yBAAAA,wBAAD,EAAwB,QAAQ,OAAS,CAAA,EACtB,CAAA;CAEzB;CAEA,IAAI,SACF,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,8CAAAA,WAAD;EAAW,GAAI;EACb,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACC,oDAAAA,gBAAD,CAAiB,CAAA;CACR,CAAA;CAIf,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACD,8CAAAA,WAAD;EACE,GAAI;EACJ,OAAOE,yCAAAA,cAAc,OAAO,IAAI,SAAS,OAAO,CAAC;EACtC;EACX,YAAY;EAEZ,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACC,8CAAAA,WAAD;GAAW,SAAS,CAAC,aAAa,SAAS;GAAG,cAAa;GACzD,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACC,yBAAAA,kBAAD;IACE,WAAU;IACJ;IACN,QAAQ;IACR,QAAO;IACP,SAAQ;IACR,YAAY;IACZ,gBAAgBF,yCAAAA;IAChB,eAAe;IACN;IACT,eAAe,sBAAqB,QAAO,iBAAiBG,4CAAAA,aAAa,OAAO,IAAI,EAAE,GAAG,SAAS,CAAC;IACxF;IACX,GAAIC,uCAAAA;GACL,CAAA;EACQ,CAAA;CACF,CAAA;AAEf"}
@@ -1,13 +1,13 @@
1
1
  import { formatPercent } from "../lib/chart-format.es.js";
2
2
  import { useMetricsFilters } from "../hooks/use-metrics-filters.es.js";
3
3
  import { bucketPlan, bucketWindow } from "../lib/metrics-buckets.es.js";
4
- import { t as MetricsCard } from "../../../MetricsCard-M8awJ2B_.js";
4
+ import { t as MetricsCard } from "../../../MetricsCard-ua6C6b8a.js";
5
5
  import { ChartArea } from "./chart-area.es.js";
6
6
  import { ChartCard } from "./chart-card.es.js";
7
7
  import { ChartCardError } from "./chart-card-error.es.js";
8
8
  import { EDGE_BUCKET_AXIS } from "../lib/chart-axis.es.js";
9
9
  import { CHART_COLORS } from "../lib/chart-colors.es.js";
10
- import { r as MetricsLineChartLegend, t as MetricsLineChart } from "../../../MetricsLineChart-BhHoduO0.js";
10
+ import { r as MetricsLineChartLegend, t as MetricsLineChart } from "../../../MetricsLineChart-4SwxBbQx.js";
11
11
  import { OpenErrorsInLogsButton } from "./card-action-buttons.es.js";
12
12
  import { useMetricsActivity } from "../hooks/use-metrics-activity.es.js";
13
13
  import { jsx } from "react/jsx-runtime";
@@ -44,6 +44,7 @@ function FailureRateCard({ onViewErrors, onTimeRangeClick, titleMenu }) {
44
44
  isEmpty: !isLoading && runs === 0,
45
45
  emptyMessage: "No agent runs in this range.",
46
46
  children: /* @__PURE__ */ jsx(MetricsLineChart, {
47
+ lineStyle: "thin",
47
48
  data,
48
49
  series: SERIES,
49
50
  height: "fill",
@@ -1 +1 @@
1
- {"version":3,"file":"failure-rate-card.es.js","names":[],"sources":["../../../../src/domains/metrics/components/failure-rate-card.tsx"],"sourcesContent":["import { EntityType } from '@mastra/core/observability';\nimport type { TimeRange } from '../drilldown';\nimport { useMetricsActivity } from '../hooks/use-metrics-activity';\nimport { useMetricsFilters } from '../hooks/use-metrics-filters';\nimport { EDGE_BUCKET_AXIS } from '../lib/chart-axis';\nimport { CHART_COLORS } from '../lib/chart-colors';\nimport { formatPercent } from '../lib/chart-format';\nimport { bucketPlan, bucketWindow } from '../lib/metrics-buckets';\nimport { OpenErrorsInLogsButton } from './card-action-buttons';\nimport { ChartArea } from './chart-area';\nimport { ChartCard } from './chart-card';\nimport type { ChartCardProps } from './chart-card';\nimport { ChartCardError } from './chart-card-error';\nimport { MetricsCard } from '@/ds/components/MetricsCard';\nimport { MetricsLineChart, MetricsLineChartLegend } from '@/ds/components/MetricsLineChart';\n\nconst SERIES = [{ dataKey: 'failureRate', label: 'Failed runs', color: CHART_COLORS.error }];\n\nconst axisPercent = (ratio: number) => `${Math.round(ratio * 100)}%`;\n\n/** Share of agent runs that failed, per bucket; a point opens the failed runs' traces. */\nexport type FailureRateCardProps<V extends string = string> = {\n /** Called from the \"View errors in Logs\" button. */\n onViewErrors?: () => void;\n /** Called with the time range of the clicked bar or point. */\n onTimeRangeClick?: (range: TimeRange) => void;\n /** Switches to a sibling view from the title (Agent runs uses it). */\n titleMenu?: ChartCardProps<V>['titleMenu'];\n};\n\nexport function FailureRateCard<V extends string = string>({\n onViewErrors,\n onTimeRangeClick,\n titleMenu,\n}: FailureRateCardProps<V>) {\n const { data = [], isLoading, isError, isPlaceholderData } = useMetricsActivity();\n const { timestamp } = useMetricsFilters();\n const { stepHours } = bucketPlan(timestamp.start, timestamp.end);\n const runs = data.reduce((sum, b) => sum + b.completed + b.failed, 0);\n const failed = data.reduce((sum, b) => sum + b.failed, 0);\n // With nothing failed, the axis would fall back to 0-4 (400%); a share tops out at 100%.\n const yDomain: [number, number] | undefined = failed === 0 ? [0, 1] : undefined;\n\n const layout = {\n title: 'Failure rate',\n titleMenu,\n actions: onViewErrors && <OpenErrorsInLogsButton onClick={onViewErrors} />,\n toolbar: (\n <MetricsCard.Toolbar>\n <MetricsLineChartLegend series={SERIES} />\n </MetricsCard.Toolbar>\n ),\n };\n\n if (isError) {\n return (\n <ChartCard {...layout}>\n <ChartCardError />\n </ChartCard>\n );\n }\n\n return (\n <ChartCard\n {...layout}\n total={formatPercent(runs > 0 ? failed / runs : 0)}\n isLoading={isLoading}\n isUpdating={isPlaceholderData}\n >\n <ChartArea isEmpty={!isLoading && runs === 0} emptyMessage=\"No agent runs in this range.\">\n <MetricsLineChart\n data={data}\n series={SERIES}\n height=\"fill\"\n xLabels=\"edges\"\n showLegend={false}\n valueFormatter={formatPercent}\n axisFormatter={axisPercent}\n yDomain={yDomain}\n onBucketClick={onTimeRangeClick && (row => onTimeRangeClick(bucketWindow(Number(row.ts), stepHours)))}\n isLoading={isLoading}\n {...EDGE_BUCKET_AXIS}\n />\n </ChartArea>\n </ChartCard>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;AAgBA,IAAM,SAAS,CAAC;CAAE,SAAS;CAAe,OAAO;CAAe,OAAO,aAAa;AAAM,CAAC;AAE3F,IAAM,eAAe,UAAkB,GAAG,KAAK,MAAM,QAAQ,GAAG,EAAE;AAYlE,SAAgB,gBAA2C,EACzD,cACA,kBACA,aAC0B;CAC1B,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW,SAAS,sBAAsB,mBAAmB;CAChF,MAAM,EAAE,cAAc,kBAAkB;CACxC,MAAM,EAAE,cAAc,WAAW,UAAU,OAAO,UAAU,GAAG;CAC/D,MAAM,OAAO,KAAK,QAAQ,KAAK,MAAM,MAAM,EAAE,YAAY,EAAE,QAAQ,CAAC;CACpE,MAAM,SAAS,KAAK,QAAQ,KAAK,MAAM,MAAM,EAAE,QAAQ,CAAC;CAExD,MAAM,UAAwC,WAAW,IAAI,CAAC,GAAG,CAAC,IAAI,KAAA;CAEtE,MAAM,SAAS;EACb,OAAO;EACP;EACA,SAAS,gBAAgB,oBAAC,wBAAD,EAAwB,SAAS,aAAe,CAAA;EACzE,SACE,oBAAC,YAAY,SAAb,EAAA,UACE,oBAAC,wBAAD,EAAwB,QAAQ,OAAS,CAAA,EACtB,CAAA;CAEzB;CAEA,IAAI,SACF,OACE,oBAAC,WAAD;EAAW,GAAI;EACb,UAAA,oBAAC,gBAAD,CAAiB,CAAA;CACR,CAAA;CAIf,OACE,oBAAC,WAAD;EACE,GAAI;EACJ,OAAO,cAAc,OAAO,IAAI,SAAS,OAAO,CAAC;EACtC;EACX,YAAY;EAEZ,UAAA,oBAAC,WAAD;GAAW,SAAS,CAAC,aAAa,SAAS;GAAG,cAAa;GACzD,UAAA,oBAAC,kBAAD;IACQ;IACN,QAAQ;IACR,QAAO;IACP,SAAQ;IACR,YAAY;IACZ,gBAAgB;IAChB,eAAe;IACN;IACT,eAAe,sBAAqB,QAAO,iBAAiB,aAAa,OAAO,IAAI,EAAE,GAAG,SAAS,CAAC;IACxF;IACX,GAAI;GACL,CAAA;EACQ,CAAA;CACF,CAAA;AAEf"}
1
+ {"version":3,"file":"failure-rate-card.es.js","names":[],"sources":["../../../../src/domains/metrics/components/failure-rate-card.tsx"],"sourcesContent":["import { EntityType } from '@mastra/core/observability';\nimport type { TimeRange } from '../drilldown';\nimport { useMetricsActivity } from '../hooks/use-metrics-activity';\nimport { useMetricsFilters } from '../hooks/use-metrics-filters';\nimport { EDGE_BUCKET_AXIS } from '../lib/chart-axis';\nimport { CHART_COLORS } from '../lib/chart-colors';\nimport { formatPercent } from '../lib/chart-format';\nimport { bucketPlan, bucketWindow } from '../lib/metrics-buckets';\nimport { OpenErrorsInLogsButton } from './card-action-buttons';\nimport { ChartArea } from './chart-area';\nimport { ChartCard } from './chart-card';\nimport type { ChartCardProps } from './chart-card';\nimport { ChartCardError } from './chart-card-error';\nimport { MetricsCard } from '@/ds/components/MetricsCard';\nimport { MetricsLineChart, MetricsLineChartLegend } from '@/ds/components/MetricsLineChart';\n\nconst SERIES = [{ dataKey: 'failureRate', label: 'Failed runs', color: CHART_COLORS.error }];\n\nconst axisPercent = (ratio: number) => `${Math.round(ratio * 100)}%`;\n\n/** Share of agent runs that failed, per bucket; a point opens the failed runs' traces. */\nexport type FailureRateCardProps<V extends string = string> = {\n /** Called from the \"View errors in Logs\" button. */\n onViewErrors?: () => void;\n /** Called with the time range of the clicked bar or point. */\n onTimeRangeClick?: (range: TimeRange) => void;\n /** Switches to a sibling view from the title (Agent runs uses it). */\n titleMenu?: ChartCardProps<V>['titleMenu'];\n};\n\nexport function FailureRateCard<V extends string = string>({\n onViewErrors,\n onTimeRangeClick,\n titleMenu,\n}: FailureRateCardProps<V>) {\n const { data = [], isLoading, isError, isPlaceholderData } = useMetricsActivity();\n const { timestamp } = useMetricsFilters();\n const { stepHours } = bucketPlan(timestamp.start, timestamp.end);\n const runs = data.reduce((sum, b) => sum + b.completed + b.failed, 0);\n const failed = data.reduce((sum, b) => sum + b.failed, 0);\n // With nothing failed, the axis would fall back to 0-4 (400%); a share tops out at 100%.\n const yDomain: [number, number] | undefined = failed === 0 ? [0, 1] : undefined;\n\n const layout = {\n title: 'Failure rate',\n titleMenu,\n actions: onViewErrors && <OpenErrorsInLogsButton onClick={onViewErrors} />,\n toolbar: (\n <MetricsCard.Toolbar>\n <MetricsLineChartLegend series={SERIES} />\n </MetricsCard.Toolbar>\n ),\n };\n\n if (isError) {\n return (\n <ChartCard {...layout}>\n <ChartCardError />\n </ChartCard>\n );\n }\n\n return (\n <ChartCard\n {...layout}\n total={formatPercent(runs > 0 ? failed / runs : 0)}\n isLoading={isLoading}\n isUpdating={isPlaceholderData}\n >\n <ChartArea isEmpty={!isLoading && runs === 0} emptyMessage=\"No agent runs in this range.\">\n <MetricsLineChart\n lineStyle=\"thin\"\n data={data}\n series={SERIES}\n height=\"fill\"\n xLabels=\"edges\"\n showLegend={false}\n valueFormatter={formatPercent}\n axisFormatter={axisPercent}\n yDomain={yDomain}\n onBucketClick={onTimeRangeClick && (row => onTimeRangeClick(bucketWindow(Number(row.ts), stepHours)))}\n isLoading={isLoading}\n {...EDGE_BUCKET_AXIS}\n />\n </ChartArea>\n </ChartCard>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;AAgBA,IAAM,SAAS,CAAC;CAAE,SAAS;CAAe,OAAO;CAAe,OAAO,aAAa;AAAM,CAAC;AAE3F,IAAM,eAAe,UAAkB,GAAG,KAAK,MAAM,QAAQ,GAAG,EAAE;AAYlE,SAAgB,gBAA2C,EACzD,cACA,kBACA,aAC0B;CAC1B,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW,SAAS,sBAAsB,mBAAmB;CAChF,MAAM,EAAE,cAAc,kBAAkB;CACxC,MAAM,EAAE,cAAc,WAAW,UAAU,OAAO,UAAU,GAAG;CAC/D,MAAM,OAAO,KAAK,QAAQ,KAAK,MAAM,MAAM,EAAE,YAAY,EAAE,QAAQ,CAAC;CACpE,MAAM,SAAS,KAAK,QAAQ,KAAK,MAAM,MAAM,EAAE,QAAQ,CAAC;CAExD,MAAM,UAAwC,WAAW,IAAI,CAAC,GAAG,CAAC,IAAI,KAAA;CAEtE,MAAM,SAAS;EACb,OAAO;EACP;EACA,SAAS,gBAAgB,oBAAC,wBAAD,EAAwB,SAAS,aAAe,CAAA;EACzE,SACE,oBAAC,YAAY,SAAb,EAAA,UACE,oBAAC,wBAAD,EAAwB,QAAQ,OAAS,CAAA,EACtB,CAAA;CAEzB;CAEA,IAAI,SACF,OACE,oBAAC,WAAD;EAAW,GAAI;EACb,UAAA,oBAAC,gBAAD,CAAiB,CAAA;CACR,CAAA;CAIf,OACE,oBAAC,WAAD;EACE,GAAI;EACJ,OAAO,cAAc,OAAO,IAAI,SAAS,OAAO,CAAC;EACtC;EACX,YAAY;EAEZ,UAAA,oBAAC,WAAD;GAAW,SAAS,CAAC,aAAa,SAAS;GAAG,cAAa;GACzD,UAAA,oBAAC,kBAAD;IACE,WAAU;IACJ;IACN,QAAQ;IACR,QAAO;IACP,SAAQ;IACR,YAAY;IACZ,gBAAgB;IAChB,eAAe;IACN;IACT,eAAe,sBAAqB,QAAO,iBAAiB,aAAa,OAAO,IAAI,EAAE,GAAG,SAAS,CAAC;IACxF;IACX,GAAI;GACL,CAAA;EACQ,CAAA;CACF,CAAA;AAEf"}
@@ -2,13 +2,13 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_domains_metrics_lib_chart_format = require("../lib/chart-format.cjs.js");
3
3
  const require_domains_metrics_hooks_use_metrics_filters = require("../hooks/use-metrics-filters.cjs.js");
4
4
  const require_domains_metrics_lib_metrics_buckets = require("../lib/metrics-buckets.cjs.js");
5
- const require_MetricsCard = require("../../../MetricsCard-CEB-f2sv.cjs");
5
+ const require_MetricsCard = require("../../../MetricsCard-BEwiS7Pe.cjs");
6
6
  const require_domains_metrics_components_chart_area = require("./chart-area.cjs.js");
7
7
  const require_domains_metrics_components_chart_card = require("./chart-card.cjs.js");
8
8
  const require_domains_metrics_components_chart_card_error = require("./chart-card-error.cjs.js");
9
9
  const require_domains_metrics_lib_chart_axis = require("../lib/chart-axis.cjs.js");
10
10
  const require_domains_metrics_lib_chart_colors = require("../lib/chart-colors.cjs.js");
11
- const require_MetricsLineChart = require("../../../MetricsLineChart-CjBm4IXu.cjs");
11
+ const require_MetricsLineChart = require("../../../MetricsLineChart-tZxsauau.cjs");
12
12
  const require_domains_metrics_components_card_action_buttons = require("./card-action-buttons.cjs.js");
13
13
  const require_domains_metrics_hooks_use_metrics_latency = require("../hooks/use-metrics-latency.cjs.js");
14
14
  let react = require("react");
@@ -91,6 +91,7 @@ function LatencyCard({ onViewTraces, onTimeRangeClick }) {
91
91
  isEmpty: !isLoading && peak === 0,
92
92
  emptyMessage: `No ${EMPTY_NOUN[entity]} in this range.`,
93
93
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_MetricsLineChart.MetricsLineChart, {
94
+ lineStyle: "thin",
94
95
  data,
95
96
  series: SERIES,
96
97
  height: "fill",
@@ -1 +1 @@
1
- {"version":3,"file":"latency-card.cjs.js","names":["EntityType","CHART_COLORS","useState","useMetricsLatency","useMetricsFilters","intervalHours","bucketPlan","OpenInTracesButton","MetricsCard","MetricsLineChartLegend","ChartCard","ChartCardError","formatDuration","ChartArea","MetricsLineChart","formatAxisDuration","bucketWindow","EDGE_BUCKET_AXIS"],"sources":["../../../../src/domains/metrics/components/latency-card.tsx"],"sourcesContent":["import { EntityType } from '@mastra/core/observability';\nimport { useState } from 'react';\nimport type { TimeRange } from '../drilldown';\nimport { useMetricsFilters } from '../hooks/use-metrics-filters';\nimport type { LatencyEntity } from '../hooks/use-metrics-latency';\nimport { useMetricsLatency } from '../hooks/use-metrics-latency';\nimport { EDGE_BUCKET_AXIS } from '../lib/chart-axis';\nimport { CHART_COLORS } from '../lib/chart-colors';\nimport { formatAxisDuration, formatDuration } from '../lib/chart-format';\nimport { bucketPlan, bucketWindow, intervalHours } from '../lib/metrics-buckets';\nimport { OpenInTracesButton } from './card-action-buttons';\nimport { ChartArea } from './chart-area';\nimport { ChartCard } from './chart-card';\nimport { ChartCardError } from './chart-card-error';\nimport { MetricsCard } from '@/ds/components/MetricsCard';\nimport type { MetricsLineChartSeries } from '@/ds/components/MetricsLineChart';\nimport { MetricsLineChart, MetricsLineChartLegend } from '@/ds/components/MetricsLineChart';\n\nconst ROOT_ENTITY: Record<LatencyEntity, EntityType> = {\n agents: EntityType.AGENT,\n workflows: EntityType.WORKFLOW_RUN,\n tools: EntityType.TOOL,\n};\n\nconst SERIES: MetricsLineChartSeries[] = [\n { dataKey: 'p50', label: 'P50', color: CHART_COLORS.sky },\n { dataKey: 'p95', label: 'P95', color: CHART_COLORS.green, emphasis: true },\n { dataKey: 'p99', label: 'P99', color: CHART_COLORS.violet },\n];\n\nconst TITLE: Record<LatencyEntity, string> = {\n agents: 'Agent latency',\n workflows: 'Workflow latency',\n tools: 'Tool latency',\n};\n\nconst VIEWS = [\n { value: 'agents', label: TITLE.agents },\n { value: 'workflows', label: TITLE.workflows },\n { value: 'tools', label: TITLE.tools },\n] as const;\n\nconst EMPTY_NOUN: Record<LatencyEntity, string> = {\n agents: 'agent runs',\n workflows: 'workflow runs',\n tools: 'tool calls',\n};\n\n/** P50, P95 and P99 durations of agent runs, workflow runs or tool calls; a point opens its traces. */\nexport type LatencyCardProps = {\n /** Called from the \"View in Traces\" button with the entity type of the open tab. */\n onViewTraces?: (entityType: EntityType) => void;\n /** Called with the time range of the clicked bar or point. */\n onTimeRangeClick?: (range: TimeRange) => void;\n};\n\nexport function LatencyCard({ onViewTraces, onTimeRangeClick }: LatencyCardProps) {\n const [entity, setEntity] = useState<LatencyEntity>('agents');\n const { data = [], isLoading, isError, isPlaceholderData } = useMetricsLatency(entity);\n const { timestamp } = useMetricsFilters();\n // The latency chart keeps the API's 1h or 1d buckets, so a point opens that window.\n const step = intervalHours(bucketPlan(timestamp.start, timestamp.end).interval);\n const peak = Math.max(0, ...data.map(b => b.p95 ?? 0));\n\n const layout = {\n title: TITLE[entity],\n titleMenu: { value: entity, onValueChange: setEntity, options: VIEWS },\n actions: onViewTraces && <OpenInTracesButton onClick={() => onViewTraces(ROOT_ENTITY[entity])} />,\n toolbar: (\n <MetricsCard.Toolbar>\n <MetricsLineChartLegend series={SERIES} />\n </MetricsCard.Toolbar>\n ),\n };\n\n if (isError) {\n return (\n <ChartCard {...layout}>\n <ChartCardError />\n </ChartCard>\n );\n }\n\n return (\n <ChartCard\n {...layout}\n total={peak > 0 ? formatDuration(peak) : '—'}\n isLoading={isLoading}\n isUpdating={isPlaceholderData}\n >\n <ChartArea isEmpty={!isLoading && peak === 0} emptyMessage={`No ${EMPTY_NOUN[entity]} in this range.`}>\n <MetricsLineChart\n data={data}\n series={SERIES}\n height=\"fill\"\n xLabels=\"edges\"\n showLegend={false}\n valueFormatter={formatDuration}\n axisFormatter={formatAxisDuration}\n onBucketClick={onTimeRangeClick && (row => onTimeRangeClick(bucketWindow(Number(row.ts), step)))}\n isLoading={isLoading}\n {...EDGE_BUCKET_AXIS}\n />\n </ChartArea>\n </ChartCard>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAkBA,IAAM,cAAiD;CACrD,QAAQA,2BAAAA,WAAW;CACnB,WAAWA,2BAAAA,WAAW;CACtB,OAAOA,2BAAAA,WAAW;AACpB;AAEA,IAAM,SAAmC;CACvC;EAAE,SAAS;EAAO,OAAO;EAAO,OAAOC,yCAAAA,aAAa;CAAI;CACxD;EAAE,SAAS;EAAO,OAAO;EAAO,OAAOA,yCAAAA,aAAa;EAAO,UAAU;CAAK;CAC1E;EAAE,SAAS;EAAO,OAAO;EAAO,OAAOA,yCAAAA,aAAa;CAAO;AAC7D;AAEA,IAAM,QAAuC;CAC3C,QAAQ;CACR,WAAW;CACX,OAAO;AACT;AAEA,IAAM,QAAQ;CACZ;EAAE,OAAO;EAAU,OAAO,MAAM;CAAO;CACvC;EAAE,OAAO;EAAa,OAAO,MAAM;CAAU;CAC7C;EAAE,OAAO;EAAS,OAAO,MAAM;CAAM;AACvC;AAEA,IAAM,aAA4C;CAChD,QAAQ;CACR,WAAW;CACX,OAAO;AACT;AAUA,SAAgB,YAAY,EAAE,cAAc,oBAAsC;CAChF,MAAM,CAAC,QAAQ,cAAA,GAAaC,MAAAA,SAAAA,CAAwB,QAAQ;CAC5D,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW,SAAS,sBAAsBC,kDAAAA,kBAAkB,MAAM;CACrF,MAAM,EAAE,cAAcC,kDAAAA,kBAAkB;CAExC,MAAM,OAAOC,4CAAAA,cAAcC,4CAAAA,WAAW,UAAU,OAAO,UAAU,GAAG,CAAC,CAAC,QAAQ;CAC9E,MAAM,OAAO,KAAK,IAAI,GAAG,GAAG,KAAK,KAAI,MAAK,EAAE,OAAO,CAAC,CAAC;CAErD,MAAM,SAAS;EACb,OAAO,MAAM;EACb,WAAW;GAAE,OAAO;GAAQ,eAAe;GAAW,SAAS;EAAM;EACrE,SAAS,gBAAgB,iBAAA,GAAA,kBAAA,IAAA,CAACC,uDAAAA,oBAAD,EAAoB,eAAe,aAAa,YAAY,OAAO,EAAI,CAAA;EAChG,SACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,oBAAAA,YAAY,SAAb,EAAA,UACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,yBAAAA,wBAAD,EAAwB,QAAQ,OAAS,CAAA,EACtB,CAAA;CAEzB;CAEA,IAAI,SACF,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,8CAAAA,WAAD;EAAW,GAAI;EACb,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACC,oDAAAA,gBAAD,CAAiB,CAAA;CACR,CAAA;CAIf,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACD,8CAAAA,WAAD;EACE,GAAI;EACJ,OAAO,OAAO,IAAIE,yCAAAA,eAAe,IAAI,IAAI;EAC9B;EACX,YAAY;EAEZ,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACC,8CAAAA,WAAD;GAAW,SAAS,CAAC,aAAa,SAAS;GAAG,cAAc,MAAM,WAAW,QAAQ;GACnF,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACC,yBAAAA,kBAAD;IACQ;IACN,QAAQ;IACR,QAAO;IACP,SAAQ;IACR,YAAY;IACZ,gBAAgBF,yCAAAA;IAChB,eAAeG,yCAAAA;IACf,eAAe,sBAAqB,QAAO,iBAAiBC,4CAAAA,aAAa,OAAO,IAAI,EAAE,GAAG,IAAI,CAAC;IACnF;IACX,GAAIC,uCAAAA;GACL,CAAA;EACQ,CAAA;CACF,CAAA;AAEf"}
1
+ {"version":3,"file":"latency-card.cjs.js","names":["EntityType","CHART_COLORS","useState","useMetricsLatency","useMetricsFilters","intervalHours","bucketPlan","OpenInTracesButton","MetricsCard","MetricsLineChartLegend","ChartCard","ChartCardError","formatDuration","ChartArea","MetricsLineChart","formatAxisDuration","bucketWindow","EDGE_BUCKET_AXIS"],"sources":["../../../../src/domains/metrics/components/latency-card.tsx"],"sourcesContent":["import { EntityType } from '@mastra/core/observability';\nimport { useState } from 'react';\nimport type { TimeRange } from '../drilldown';\nimport { useMetricsFilters } from '../hooks/use-metrics-filters';\nimport type { LatencyEntity } from '../hooks/use-metrics-latency';\nimport { useMetricsLatency } from '../hooks/use-metrics-latency';\nimport { EDGE_BUCKET_AXIS } from '../lib/chart-axis';\nimport { CHART_COLORS } from '../lib/chart-colors';\nimport { formatAxisDuration, formatDuration } from '../lib/chart-format';\nimport { bucketPlan, bucketWindow, intervalHours } from '../lib/metrics-buckets';\nimport { OpenInTracesButton } from './card-action-buttons';\nimport { ChartArea } from './chart-area';\nimport { ChartCard } from './chart-card';\nimport { ChartCardError } from './chart-card-error';\nimport { MetricsCard } from '@/ds/components/MetricsCard';\nimport type { MetricsLineChartSeries } from '@/ds/components/MetricsLineChart';\nimport { MetricsLineChart, MetricsLineChartLegend } from '@/ds/components/MetricsLineChart';\n\nconst ROOT_ENTITY: Record<LatencyEntity, EntityType> = {\n agents: EntityType.AGENT,\n workflows: EntityType.WORKFLOW_RUN,\n tools: EntityType.TOOL,\n};\n\nconst SERIES: MetricsLineChartSeries[] = [\n { dataKey: 'p50', label: 'P50', color: CHART_COLORS.sky },\n { dataKey: 'p95', label: 'P95', color: CHART_COLORS.green, emphasis: true },\n { dataKey: 'p99', label: 'P99', color: CHART_COLORS.violet },\n];\n\nconst TITLE: Record<LatencyEntity, string> = {\n agents: 'Agent latency',\n workflows: 'Workflow latency',\n tools: 'Tool latency',\n};\n\nconst VIEWS = [\n { value: 'agents', label: TITLE.agents },\n { value: 'workflows', label: TITLE.workflows },\n { value: 'tools', label: TITLE.tools },\n] as const;\n\nconst EMPTY_NOUN: Record<LatencyEntity, string> = {\n agents: 'agent runs',\n workflows: 'workflow runs',\n tools: 'tool calls',\n};\n\n/** P50, P95 and P99 durations of agent runs, workflow runs or tool calls; a point opens its traces. */\nexport type LatencyCardProps = {\n /** Called from the \"View in Traces\" button with the entity type of the open tab. */\n onViewTraces?: (entityType: EntityType) => void;\n /** Called with the time range of the clicked bar or point. */\n onTimeRangeClick?: (range: TimeRange) => void;\n};\n\nexport function LatencyCard({ onViewTraces, onTimeRangeClick }: LatencyCardProps) {\n const [entity, setEntity] = useState<LatencyEntity>('agents');\n const { data = [], isLoading, isError, isPlaceholderData } = useMetricsLatency(entity);\n const { timestamp } = useMetricsFilters();\n // The latency chart keeps the API's 1h or 1d buckets, so a point opens that window.\n const step = intervalHours(bucketPlan(timestamp.start, timestamp.end).interval);\n const peak = Math.max(0, ...data.map(b => b.p95 ?? 0));\n\n const layout = {\n title: TITLE[entity],\n titleMenu: { value: entity, onValueChange: setEntity, options: VIEWS },\n actions: onViewTraces && <OpenInTracesButton onClick={() => onViewTraces(ROOT_ENTITY[entity])} />,\n toolbar: (\n <MetricsCard.Toolbar>\n <MetricsLineChartLegend series={SERIES} />\n </MetricsCard.Toolbar>\n ),\n };\n\n if (isError) {\n return (\n <ChartCard {...layout}>\n <ChartCardError />\n </ChartCard>\n );\n }\n\n return (\n <ChartCard\n {...layout}\n total={peak > 0 ? formatDuration(peak) : '—'}\n isLoading={isLoading}\n isUpdating={isPlaceholderData}\n >\n <ChartArea isEmpty={!isLoading && peak === 0} emptyMessage={`No ${EMPTY_NOUN[entity]} in this range.`}>\n <MetricsLineChart\n lineStyle=\"thin\"\n data={data}\n series={SERIES}\n height=\"fill\"\n xLabels=\"edges\"\n showLegend={false}\n valueFormatter={formatDuration}\n axisFormatter={formatAxisDuration}\n onBucketClick={onTimeRangeClick && (row => onTimeRangeClick(bucketWindow(Number(row.ts), step)))}\n isLoading={isLoading}\n {...EDGE_BUCKET_AXIS}\n />\n </ChartArea>\n </ChartCard>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAkBA,IAAM,cAAiD;CACrD,QAAQA,2BAAAA,WAAW;CACnB,WAAWA,2BAAAA,WAAW;CACtB,OAAOA,2BAAAA,WAAW;AACpB;AAEA,IAAM,SAAmC;CACvC;EAAE,SAAS;EAAO,OAAO;EAAO,OAAOC,yCAAAA,aAAa;CAAI;CACxD;EAAE,SAAS;EAAO,OAAO;EAAO,OAAOA,yCAAAA,aAAa;EAAO,UAAU;CAAK;CAC1E;EAAE,SAAS;EAAO,OAAO;EAAO,OAAOA,yCAAAA,aAAa;CAAO;AAC7D;AAEA,IAAM,QAAuC;CAC3C,QAAQ;CACR,WAAW;CACX,OAAO;AACT;AAEA,IAAM,QAAQ;CACZ;EAAE,OAAO;EAAU,OAAO,MAAM;CAAO;CACvC;EAAE,OAAO;EAAa,OAAO,MAAM;CAAU;CAC7C;EAAE,OAAO;EAAS,OAAO,MAAM;CAAM;AACvC;AAEA,IAAM,aAA4C;CAChD,QAAQ;CACR,WAAW;CACX,OAAO;AACT;AAUA,SAAgB,YAAY,EAAE,cAAc,oBAAsC;CAChF,MAAM,CAAC,QAAQ,cAAA,GAAaC,MAAAA,SAAAA,CAAwB,QAAQ;CAC5D,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW,SAAS,sBAAsBC,kDAAAA,kBAAkB,MAAM;CACrF,MAAM,EAAE,cAAcC,kDAAAA,kBAAkB;CAExC,MAAM,OAAOC,4CAAAA,cAAcC,4CAAAA,WAAW,UAAU,OAAO,UAAU,GAAG,CAAC,CAAC,QAAQ;CAC9E,MAAM,OAAO,KAAK,IAAI,GAAG,GAAG,KAAK,KAAI,MAAK,EAAE,OAAO,CAAC,CAAC;CAErD,MAAM,SAAS;EACb,OAAO,MAAM;EACb,WAAW;GAAE,OAAO;GAAQ,eAAe;GAAW,SAAS;EAAM;EACrE,SAAS,gBAAgB,iBAAA,GAAA,kBAAA,IAAA,CAACC,uDAAAA,oBAAD,EAAoB,eAAe,aAAa,YAAY,OAAO,EAAI,CAAA;EAChG,SACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,oBAAAA,YAAY,SAAb,EAAA,UACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,yBAAAA,wBAAD,EAAwB,QAAQ,OAAS,CAAA,EACtB,CAAA;CAEzB;CAEA,IAAI,SACF,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,8CAAAA,WAAD;EAAW,GAAI;EACb,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACC,oDAAAA,gBAAD,CAAiB,CAAA;CACR,CAAA;CAIf,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACD,8CAAAA,WAAD;EACE,GAAI;EACJ,OAAO,OAAO,IAAIE,yCAAAA,eAAe,IAAI,IAAI;EAC9B;EACX,YAAY;EAEZ,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACC,8CAAAA,WAAD;GAAW,SAAS,CAAC,aAAa,SAAS;GAAG,cAAc,MAAM,WAAW,QAAQ;GACnF,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACC,yBAAAA,kBAAD;IACE,WAAU;IACJ;IACN,QAAQ;IACR,QAAO;IACP,SAAQ;IACR,YAAY;IACZ,gBAAgBF,yCAAAA;IAChB,eAAeG,yCAAAA;IACf,eAAe,sBAAqB,QAAO,iBAAiBC,4CAAAA,aAAa,OAAO,IAAI,EAAE,GAAG,IAAI,CAAC;IACnF;IACX,GAAIC,uCAAAA;GACL,CAAA;EACQ,CAAA;CACF,CAAA;AAEf"}
@@ -1,13 +1,13 @@
1
1
  import { formatAxisDuration, formatDuration } from "../lib/chart-format.es.js";
2
2
  import { useMetricsFilters } from "../hooks/use-metrics-filters.es.js";
3
3
  import { bucketPlan, bucketWindow, intervalHours } from "../lib/metrics-buckets.es.js";
4
- import { t as MetricsCard } from "../../../MetricsCard-M8awJ2B_.js";
4
+ import { t as MetricsCard } from "../../../MetricsCard-ua6C6b8a.js";
5
5
  import { ChartArea } from "./chart-area.es.js";
6
6
  import { ChartCard } from "./chart-card.es.js";
7
7
  import { ChartCardError } from "./chart-card-error.es.js";
8
8
  import { EDGE_BUCKET_AXIS } from "../lib/chart-axis.es.js";
9
9
  import { CHART_COLORS } from "../lib/chart-colors.es.js";
10
- import { r as MetricsLineChartLegend, t as MetricsLineChart } from "../../../MetricsLineChart-BhHoduO0.js";
10
+ import { r as MetricsLineChartLegend, t as MetricsLineChart } from "../../../MetricsLineChart-4SwxBbQx.js";
11
11
  import { OpenInTracesButton } from "./card-action-buttons.es.js";
12
12
  import { useMetricsLatency } from "../hooks/use-metrics-latency.es.js";
13
13
  import { useState } from "react";
@@ -90,6 +90,7 @@ function LatencyCard({ onViewTraces, onTimeRangeClick }) {
90
90
  isEmpty: !isLoading && peak === 0,
91
91
  emptyMessage: `No ${EMPTY_NOUN[entity]} in this range.`,
92
92
  children: /* @__PURE__ */ jsx(MetricsLineChart, {
93
+ lineStyle: "thin",
93
94
  data,
94
95
  series: SERIES,
95
96
  height: "fill",
@@ -1 +1 @@
1
- {"version":3,"file":"latency-card.es.js","names":[],"sources":["../../../../src/domains/metrics/components/latency-card.tsx"],"sourcesContent":["import { EntityType } from '@mastra/core/observability';\nimport { useState } from 'react';\nimport type { TimeRange } from '../drilldown';\nimport { useMetricsFilters } from '../hooks/use-metrics-filters';\nimport type { LatencyEntity } from '../hooks/use-metrics-latency';\nimport { useMetricsLatency } from '../hooks/use-metrics-latency';\nimport { EDGE_BUCKET_AXIS } from '../lib/chart-axis';\nimport { CHART_COLORS } from '../lib/chart-colors';\nimport { formatAxisDuration, formatDuration } from '../lib/chart-format';\nimport { bucketPlan, bucketWindow, intervalHours } from '../lib/metrics-buckets';\nimport { OpenInTracesButton } from './card-action-buttons';\nimport { ChartArea } from './chart-area';\nimport { ChartCard } from './chart-card';\nimport { ChartCardError } from './chart-card-error';\nimport { MetricsCard } from '@/ds/components/MetricsCard';\nimport type { MetricsLineChartSeries } from '@/ds/components/MetricsLineChart';\nimport { MetricsLineChart, MetricsLineChartLegend } from '@/ds/components/MetricsLineChart';\n\nconst ROOT_ENTITY: Record<LatencyEntity, EntityType> = {\n agents: EntityType.AGENT,\n workflows: EntityType.WORKFLOW_RUN,\n tools: EntityType.TOOL,\n};\n\nconst SERIES: MetricsLineChartSeries[] = [\n { dataKey: 'p50', label: 'P50', color: CHART_COLORS.sky },\n { dataKey: 'p95', label: 'P95', color: CHART_COLORS.green, emphasis: true },\n { dataKey: 'p99', label: 'P99', color: CHART_COLORS.violet },\n];\n\nconst TITLE: Record<LatencyEntity, string> = {\n agents: 'Agent latency',\n workflows: 'Workflow latency',\n tools: 'Tool latency',\n};\n\nconst VIEWS = [\n { value: 'agents', label: TITLE.agents },\n { value: 'workflows', label: TITLE.workflows },\n { value: 'tools', label: TITLE.tools },\n] as const;\n\nconst EMPTY_NOUN: Record<LatencyEntity, string> = {\n agents: 'agent runs',\n workflows: 'workflow runs',\n tools: 'tool calls',\n};\n\n/** P50, P95 and P99 durations of agent runs, workflow runs or tool calls; a point opens its traces. */\nexport type LatencyCardProps = {\n /** Called from the \"View in Traces\" button with the entity type of the open tab. */\n onViewTraces?: (entityType: EntityType) => void;\n /** Called with the time range of the clicked bar or point. */\n onTimeRangeClick?: (range: TimeRange) => void;\n};\n\nexport function LatencyCard({ onViewTraces, onTimeRangeClick }: LatencyCardProps) {\n const [entity, setEntity] = useState<LatencyEntity>('agents');\n const { data = [], isLoading, isError, isPlaceholderData } = useMetricsLatency(entity);\n const { timestamp } = useMetricsFilters();\n // The latency chart keeps the API's 1h or 1d buckets, so a point opens that window.\n const step = intervalHours(bucketPlan(timestamp.start, timestamp.end).interval);\n const peak = Math.max(0, ...data.map(b => b.p95 ?? 0));\n\n const layout = {\n title: TITLE[entity],\n titleMenu: { value: entity, onValueChange: setEntity, options: VIEWS },\n actions: onViewTraces && <OpenInTracesButton onClick={() => onViewTraces(ROOT_ENTITY[entity])} />,\n toolbar: (\n <MetricsCard.Toolbar>\n <MetricsLineChartLegend series={SERIES} />\n </MetricsCard.Toolbar>\n ),\n };\n\n if (isError) {\n return (\n <ChartCard {...layout}>\n <ChartCardError />\n </ChartCard>\n );\n }\n\n return (\n <ChartCard\n {...layout}\n total={peak > 0 ? formatDuration(peak) : '—'}\n isLoading={isLoading}\n isUpdating={isPlaceholderData}\n >\n <ChartArea isEmpty={!isLoading && peak === 0} emptyMessage={`No ${EMPTY_NOUN[entity]} in this range.`}>\n <MetricsLineChart\n data={data}\n series={SERIES}\n height=\"fill\"\n xLabels=\"edges\"\n showLegend={false}\n valueFormatter={formatDuration}\n axisFormatter={formatAxisDuration}\n onBucketClick={onTimeRangeClick && (row => onTimeRangeClick(bucketWindow(Number(row.ts), step)))}\n isLoading={isLoading}\n {...EDGE_BUCKET_AXIS}\n />\n </ChartArea>\n </ChartCard>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAkBA,IAAM,cAAiD;CACrD,QAAQ,WAAW;CACnB,WAAW,WAAW;CACtB,OAAO,WAAW;AACpB;AAEA,IAAM,SAAmC;CACvC;EAAE,SAAS;EAAO,OAAO;EAAO,OAAO,aAAa;CAAI;CACxD;EAAE,SAAS;EAAO,OAAO;EAAO,OAAO,aAAa;EAAO,UAAU;CAAK;CAC1E;EAAE,SAAS;EAAO,OAAO;EAAO,OAAO,aAAa;CAAO;AAC7D;AAEA,IAAM,QAAuC;CAC3C,QAAQ;CACR,WAAW;CACX,OAAO;AACT;AAEA,IAAM,QAAQ;CACZ;EAAE,OAAO;EAAU,OAAO,MAAM;CAAO;CACvC;EAAE,OAAO;EAAa,OAAO,MAAM;CAAU;CAC7C;EAAE,OAAO;EAAS,OAAO,MAAM;CAAM;AACvC;AAEA,IAAM,aAA4C;CAChD,QAAQ;CACR,WAAW;CACX,OAAO;AACT;AAUA,SAAgB,YAAY,EAAE,cAAc,oBAAsC;CAChF,MAAM,CAAC,QAAQ,aAAa,SAAwB,QAAQ;CAC5D,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW,SAAS,sBAAsB,kBAAkB,MAAM;CACrF,MAAM,EAAE,cAAc,kBAAkB;CAExC,MAAM,OAAO,cAAc,WAAW,UAAU,OAAO,UAAU,GAAG,CAAC,CAAC,QAAQ;CAC9E,MAAM,OAAO,KAAK,IAAI,GAAG,GAAG,KAAK,KAAI,MAAK,EAAE,OAAO,CAAC,CAAC;CAErD,MAAM,SAAS;EACb,OAAO,MAAM;EACb,WAAW;GAAE,OAAO;GAAQ,eAAe;GAAW,SAAS;EAAM;EACrE,SAAS,gBAAgB,oBAAC,oBAAD,EAAoB,eAAe,aAAa,YAAY,OAAO,EAAI,CAAA;EAChG,SACE,oBAAC,YAAY,SAAb,EAAA,UACE,oBAAC,wBAAD,EAAwB,QAAQ,OAAS,CAAA,EACtB,CAAA;CAEzB;CAEA,IAAI,SACF,OACE,oBAAC,WAAD;EAAW,GAAI;EACb,UAAA,oBAAC,gBAAD,CAAiB,CAAA;CACR,CAAA;CAIf,OACE,oBAAC,WAAD;EACE,GAAI;EACJ,OAAO,OAAO,IAAI,eAAe,IAAI,IAAI;EAC9B;EACX,YAAY;EAEZ,UAAA,oBAAC,WAAD;GAAW,SAAS,CAAC,aAAa,SAAS;GAAG,cAAc,MAAM,WAAW,QAAQ;GACnF,UAAA,oBAAC,kBAAD;IACQ;IACN,QAAQ;IACR,QAAO;IACP,SAAQ;IACR,YAAY;IACZ,gBAAgB;IAChB,eAAe;IACf,eAAe,sBAAqB,QAAO,iBAAiB,aAAa,OAAO,IAAI,EAAE,GAAG,IAAI,CAAC;IACnF;IACX,GAAI;GACL,CAAA;EACQ,CAAA;CACF,CAAA;AAEf"}
1
+ {"version":3,"file":"latency-card.es.js","names":[],"sources":["../../../../src/domains/metrics/components/latency-card.tsx"],"sourcesContent":["import { EntityType } from '@mastra/core/observability';\nimport { useState } from 'react';\nimport type { TimeRange } from '../drilldown';\nimport { useMetricsFilters } from '../hooks/use-metrics-filters';\nimport type { LatencyEntity } from '../hooks/use-metrics-latency';\nimport { useMetricsLatency } from '../hooks/use-metrics-latency';\nimport { EDGE_BUCKET_AXIS } from '../lib/chart-axis';\nimport { CHART_COLORS } from '../lib/chart-colors';\nimport { formatAxisDuration, formatDuration } from '../lib/chart-format';\nimport { bucketPlan, bucketWindow, intervalHours } from '../lib/metrics-buckets';\nimport { OpenInTracesButton } from './card-action-buttons';\nimport { ChartArea } from './chart-area';\nimport { ChartCard } from './chart-card';\nimport { ChartCardError } from './chart-card-error';\nimport { MetricsCard } from '@/ds/components/MetricsCard';\nimport type { MetricsLineChartSeries } from '@/ds/components/MetricsLineChart';\nimport { MetricsLineChart, MetricsLineChartLegend } from '@/ds/components/MetricsLineChart';\n\nconst ROOT_ENTITY: Record<LatencyEntity, EntityType> = {\n agents: EntityType.AGENT,\n workflows: EntityType.WORKFLOW_RUN,\n tools: EntityType.TOOL,\n};\n\nconst SERIES: MetricsLineChartSeries[] = [\n { dataKey: 'p50', label: 'P50', color: CHART_COLORS.sky },\n { dataKey: 'p95', label: 'P95', color: CHART_COLORS.green, emphasis: true },\n { dataKey: 'p99', label: 'P99', color: CHART_COLORS.violet },\n];\n\nconst TITLE: Record<LatencyEntity, string> = {\n agents: 'Agent latency',\n workflows: 'Workflow latency',\n tools: 'Tool latency',\n};\n\nconst VIEWS = [\n { value: 'agents', label: TITLE.agents },\n { value: 'workflows', label: TITLE.workflows },\n { value: 'tools', label: TITLE.tools },\n] as const;\n\nconst EMPTY_NOUN: Record<LatencyEntity, string> = {\n agents: 'agent runs',\n workflows: 'workflow runs',\n tools: 'tool calls',\n};\n\n/** P50, P95 and P99 durations of agent runs, workflow runs or tool calls; a point opens its traces. */\nexport type LatencyCardProps = {\n /** Called from the \"View in Traces\" button with the entity type of the open tab. */\n onViewTraces?: (entityType: EntityType) => void;\n /** Called with the time range of the clicked bar or point. */\n onTimeRangeClick?: (range: TimeRange) => void;\n};\n\nexport function LatencyCard({ onViewTraces, onTimeRangeClick }: LatencyCardProps) {\n const [entity, setEntity] = useState<LatencyEntity>('agents');\n const { data = [], isLoading, isError, isPlaceholderData } = useMetricsLatency(entity);\n const { timestamp } = useMetricsFilters();\n // The latency chart keeps the API's 1h or 1d buckets, so a point opens that window.\n const step = intervalHours(bucketPlan(timestamp.start, timestamp.end).interval);\n const peak = Math.max(0, ...data.map(b => b.p95 ?? 0));\n\n const layout = {\n title: TITLE[entity],\n titleMenu: { value: entity, onValueChange: setEntity, options: VIEWS },\n actions: onViewTraces && <OpenInTracesButton onClick={() => onViewTraces(ROOT_ENTITY[entity])} />,\n toolbar: (\n <MetricsCard.Toolbar>\n <MetricsLineChartLegend series={SERIES} />\n </MetricsCard.Toolbar>\n ),\n };\n\n if (isError) {\n return (\n <ChartCard {...layout}>\n <ChartCardError />\n </ChartCard>\n );\n }\n\n return (\n <ChartCard\n {...layout}\n total={peak > 0 ? formatDuration(peak) : '—'}\n isLoading={isLoading}\n isUpdating={isPlaceholderData}\n >\n <ChartArea isEmpty={!isLoading && peak === 0} emptyMessage={`No ${EMPTY_NOUN[entity]} in this range.`}>\n <MetricsLineChart\n lineStyle=\"thin\"\n data={data}\n series={SERIES}\n height=\"fill\"\n xLabels=\"edges\"\n showLegend={false}\n valueFormatter={formatDuration}\n axisFormatter={formatAxisDuration}\n onBucketClick={onTimeRangeClick && (row => onTimeRangeClick(bucketWindow(Number(row.ts), step)))}\n isLoading={isLoading}\n {...EDGE_BUCKET_AXIS}\n />\n </ChartArea>\n </ChartCard>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAkBA,IAAM,cAAiD;CACrD,QAAQ,WAAW;CACnB,WAAW,WAAW;CACtB,OAAO,WAAW;AACpB;AAEA,IAAM,SAAmC;CACvC;EAAE,SAAS;EAAO,OAAO;EAAO,OAAO,aAAa;CAAI;CACxD;EAAE,SAAS;EAAO,OAAO;EAAO,OAAO,aAAa;EAAO,UAAU;CAAK;CAC1E;EAAE,SAAS;EAAO,OAAO;EAAO,OAAO,aAAa;CAAO;AAC7D;AAEA,IAAM,QAAuC;CAC3C,QAAQ;CACR,WAAW;CACX,OAAO;AACT;AAEA,IAAM,QAAQ;CACZ;EAAE,OAAO;EAAU,OAAO,MAAM;CAAO;CACvC;EAAE,OAAO;EAAa,OAAO,MAAM;CAAU;CAC7C;EAAE,OAAO;EAAS,OAAO,MAAM;CAAM;AACvC;AAEA,IAAM,aAA4C;CAChD,QAAQ;CACR,WAAW;CACX,OAAO;AACT;AAUA,SAAgB,YAAY,EAAE,cAAc,oBAAsC;CAChF,MAAM,CAAC,QAAQ,aAAa,SAAwB,QAAQ;CAC5D,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW,SAAS,sBAAsB,kBAAkB,MAAM;CACrF,MAAM,EAAE,cAAc,kBAAkB;CAExC,MAAM,OAAO,cAAc,WAAW,UAAU,OAAO,UAAU,GAAG,CAAC,CAAC,QAAQ;CAC9E,MAAM,OAAO,KAAK,IAAI,GAAG,GAAG,KAAK,KAAI,MAAK,EAAE,OAAO,CAAC,CAAC;CAErD,MAAM,SAAS;EACb,OAAO,MAAM;EACb,WAAW;GAAE,OAAO;GAAQ,eAAe;GAAW,SAAS;EAAM;EACrE,SAAS,gBAAgB,oBAAC,oBAAD,EAAoB,eAAe,aAAa,YAAY,OAAO,EAAI,CAAA;EAChG,SACE,oBAAC,YAAY,SAAb,EAAA,UACE,oBAAC,wBAAD,EAAwB,QAAQ,OAAS,CAAA,EACtB,CAAA;CAEzB;CAEA,IAAI,SACF,OACE,oBAAC,WAAD;EAAW,GAAI;EACb,UAAA,oBAAC,gBAAD,CAAiB,CAAA;CACR,CAAA;CAIf,OACE,oBAAC,WAAD;EACE,GAAI;EACJ,OAAO,OAAO,IAAI,eAAe,IAAI,IAAI;EAC9B;EACX,YAAY;EAEZ,UAAA,oBAAC,WAAD;GAAW,SAAS,CAAC,aAAa,SAAS;GAAG,cAAc,MAAM,WAAW,QAAQ;GACnF,UAAA,oBAAC,kBAAD;IACE,WAAU;IACJ;IACN,QAAQ;IACR,QAAO;IACP,SAAQ;IACR,YAAY;IACZ,gBAAgB;IAChB,eAAe;IACf,eAAe,sBAAqB,QAAO,iBAAiB,aAAa,OAAO,IAAI,EAAE,GAAG,IAAI,CAAC;IACnF;IACX,GAAI;GACL,CAAA;EACQ,CAAA;CACF,CAAA;AAEf"}
@@ -2,7 +2,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_domains_metrics_hooks_use_metrics = require("../hooks/use-metrics.cjs.js");
3
3
  const require_domains_metrics_metrics_date_presets = require("../metrics-date-presets.cjs.js");
4
4
  const require_domains_metrics_hooks_use_trace_retention_min_date = require("../hooks/use-trace-retention-min-date.cjs.js");
5
- const require_filter_bar_time_range = require("../../../filter-bar-time-range-BA-pXMlo.cjs");
5
+ const require_filter_bar_time_range = require("../../../filter-bar-time-range-zdM024JD.cjs");
6
6
  let react_jsx_runtime = require("react/jsx-runtime");
7
7
  // src/domains/metrics/components/metrics-time-range-chip.tsx
8
8
  /**
@@ -1,7 +1,7 @@
1
1
  import { useMetrics } from "../hooks/use-metrics.es.js";
2
2
  import { METRICS_PICKER_PRESETS, fromPickerPreset, toPickerPreset } from "../metrics-date-presets.es.js";
3
3
  import { useTraceRetentionMinDate } from "../hooks/use-trace-retention-min-date.es.js";
4
- import { i as FilterBarTimeRange } from "../../../filter-bar-time-range-mg9JeYue.js";
4
+ import { i as FilterBarTimeRange } from "../../../filter-bar-time-range-qlV8p7hp.js";
5
5
  import { jsx } from "react/jsx-runtime";
6
6
  // src/domains/metrics/components/metrics-time-range-chip.tsx
7
7
  /**
@@ -4,7 +4,7 @@ const require_domains_metrics_components_chart_card = require("./chart-card.cjs.
4
4
  const require_domains_metrics_components_chart_card_error = require("./chart-card-error.cjs.js");
5
5
  const require_domains_metrics_lib_chart_axis = require("../lib/chart-axis.cjs.js");
6
6
  const require_domains_metrics_lib_chart_colors = require("../lib/chart-colors.cjs.js");
7
- const require_MetricsLineChart = require("../../../MetricsLineChart-CjBm4IXu.cjs");
7
+ const require_MetricsLineChart = require("../../../MetricsLineChart-tZxsauau.cjs");
8
8
  const require_domains_metrics_hooks_use_metrics_scores = require("../hooks/use-metrics-scores.cjs.js");
9
9
  let react_jsx_runtime = require("react/jsx-runtime");
10
10
  // src/domains/metrics/components/scores-card.tsx
@@ -42,6 +42,7 @@ function ScoresCard() {
42
42
  isEmpty: !isLoading && scorers.length === 0,
43
43
  emptyMessage: "No scores in this range.",
44
44
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_MetricsLineChart.MetricsLineChart, {
45
+ lineStyle: "thin",
45
46
  data: data?.buckets ?? [],
46
47
  series: scorerSeries(scorers),
47
48
  height: "fill",
@@ -1 +1 @@
1
- {"version":3,"file":"scores-card.cjs.js","names":["CHART_COLORS","useMetricsScores","ChartCard","ChartCardError","ChartArea","MetricsLineChart","BUCKET_AXIS"],"sources":["../../../../src/domains/metrics/components/scores-card.tsx"],"sourcesContent":["import { useMetricsScores } from '../hooks/use-metrics-scores';\nimport type { ScorerAverage } from '../hooks/use-metrics-scores';\nimport { BUCKET_AXIS } from '../lib/chart-axis';\nimport { CHART_COLORS } from '../lib/chart-colors';\nimport { ChartArea } from './chart-area';\nimport { ChartCard } from './chart-card';\nimport { ChartCardError } from './chart-card-error';\nimport type { MetricsLineChartSeries } from '@/ds/components/MetricsLineChart';\nimport { MetricsLineChart } from '@/ds/components/MetricsLineChart';\n\n/** Scores aren't problems, so no warm hues; past five scorers the colors repeat. */\nconst SCORER_COLORS = [\n CHART_COLORS.green,\n CHART_COLORS.sky,\n CHART_COLORS.violet,\n CHART_COLORS.teal,\n CHART_COLORS.indigo,\n];\n\nconst formatScore = (score: number) => score.toFixed(2);\nconst axisScore = (score: number) => String(+score.toFixed(2));\n\n/** One line per scorer. */\nfunction scorerSeries(scorers: ScorerAverage[]): MetricsLineChartSeries[] {\n return scorers.map(({ scorerId, name }, i) => ({\n dataKey: scorerId,\n label: name,\n color: SCORER_COLORS[i % SCORER_COLORS.length] ?? CHART_COLORS.neutral,\n }));\n}\n\n/** Average result of each scorer over time, 0 to 1. */\nexport function ScoresCard() {\n const { data, isLoading, isError, isPlaceholderData } = useMetricsScores();\n const scorers = data?.scorers ?? [];\n\n const layout = { title: 'Scores' };\n\n if (isError) {\n return (\n <ChartCard {...layout}>\n <ChartCardError />\n </ChartCard>\n );\n }\n\n return (\n <ChartCard {...layout} isUpdating={isPlaceholderData}>\n <ChartArea isEmpty={!isLoading && scorers.length === 0} emptyMessage=\"No scores in this range.\">\n <MetricsLineChart\n data={data?.buckets ?? []}\n series={scorerSeries(scorers)}\n height=\"fill\"\n yDomain={[0, 1]}\n valueFormatter={formatScore}\n axisFormatter={axisScore}\n isLoading={isLoading}\n {...BUCKET_AXIS}\n />\n </ChartArea>\n </ChartCard>\n );\n}\n"],"mappings":";;;;;;;;;;;AAWA,IAAM,gBAAgB;CACpBA,yCAAAA,aAAa;CACbA,yCAAAA,aAAa;CACbA,yCAAAA,aAAa;CACbA,yCAAAA,aAAa;CACbA,yCAAAA,aAAa;AACf;AAEA,IAAM,eAAe,UAAkB,MAAM,QAAQ,CAAC;AACtD,IAAM,aAAa,UAAkB,OAAO,CAAC,MAAM,QAAQ,CAAC,CAAC;;AAG7D,SAAS,aAAa,SAAoD;CACxE,OAAO,QAAQ,KAAK,EAAE,UAAU,QAAQ,OAAO;EAC7C,SAAS;EACT,OAAO;EACP,OAAO,cAAc,IAAI,cAAc,WAAWA,yCAAAA,aAAa;CACjE,EAAE;AACJ;;AAGA,SAAgB,aAAa;CAC3B,MAAM,EAAE,MAAM,WAAW,SAAS,sBAAsBC,iDAAAA,iBAAiB;CACzE,MAAM,UAAU,MAAM,WAAW,CAAC;CAElC,MAAM,SAAS,EAAE,OAAO,SAAS;CAEjC,IAAI,SACF,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,8CAAAA,WAAD;EAAW,GAAI;EACb,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACC,oDAAAA,gBAAD,CAAiB,CAAA;CACR,CAAA;CAIf,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACD,8CAAAA,WAAD;EAAW,GAAI;EAAQ,YAAY;EACjC,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACE,8CAAAA,WAAD;GAAW,SAAS,CAAC,aAAa,QAAQ,WAAW;GAAG,cAAa;GACnE,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACC,yBAAAA,kBAAD;IACE,MAAM,MAAM,WAAW,CAAC;IACxB,QAAQ,aAAa,OAAO;IAC5B,QAAO;IACP,SAAS,CAAC,GAAG,CAAC;IACd,gBAAgB;IAChB,eAAe;IACJ;IACX,GAAIC,uCAAAA;GACL,CAAA;EACQ,CAAA;CACF,CAAA;AAEf"}
1
+ {"version":3,"file":"scores-card.cjs.js","names":["CHART_COLORS","useMetricsScores","ChartCard","ChartCardError","ChartArea","MetricsLineChart","BUCKET_AXIS"],"sources":["../../../../src/domains/metrics/components/scores-card.tsx"],"sourcesContent":["import { useMetricsScores } from '../hooks/use-metrics-scores';\nimport type { ScorerAverage } from '../hooks/use-metrics-scores';\nimport { BUCKET_AXIS } from '../lib/chart-axis';\nimport { CHART_COLORS } from '../lib/chart-colors';\nimport { ChartArea } from './chart-area';\nimport { ChartCard } from './chart-card';\nimport { ChartCardError } from './chart-card-error';\nimport type { MetricsLineChartSeries } from '@/ds/components/MetricsLineChart';\nimport { MetricsLineChart } from '@/ds/components/MetricsLineChart';\n\n/** Scores aren't problems, so no warm hues; past five scorers the colors repeat. */\nconst SCORER_COLORS = [\n CHART_COLORS.green,\n CHART_COLORS.sky,\n CHART_COLORS.violet,\n CHART_COLORS.teal,\n CHART_COLORS.indigo,\n];\n\nconst formatScore = (score: number) => score.toFixed(2);\nconst axisScore = (score: number) => String(+score.toFixed(2));\n\n/** One line per scorer. */\nfunction scorerSeries(scorers: ScorerAverage[]): MetricsLineChartSeries[] {\n return scorers.map(({ scorerId, name }, i) => ({\n dataKey: scorerId,\n label: name,\n color: SCORER_COLORS[i % SCORER_COLORS.length] ?? CHART_COLORS.neutral,\n }));\n}\n\n/** Average result of each scorer over time, 0 to 1. */\nexport function ScoresCard() {\n const { data, isLoading, isError, isPlaceholderData } = useMetricsScores();\n const scorers = data?.scorers ?? [];\n\n const layout = { title: 'Scores' };\n\n if (isError) {\n return (\n <ChartCard {...layout}>\n <ChartCardError />\n </ChartCard>\n );\n }\n\n return (\n <ChartCard {...layout} isUpdating={isPlaceholderData}>\n <ChartArea isEmpty={!isLoading && scorers.length === 0} emptyMessage=\"No scores in this range.\">\n <MetricsLineChart\n lineStyle=\"thin\"\n data={data?.buckets ?? []}\n series={scorerSeries(scorers)}\n height=\"fill\"\n yDomain={[0, 1]}\n valueFormatter={formatScore}\n axisFormatter={axisScore}\n isLoading={isLoading}\n {...BUCKET_AXIS}\n />\n </ChartArea>\n </ChartCard>\n );\n}\n"],"mappings":";;;;;;;;;;;AAWA,IAAM,gBAAgB;CACpBA,yCAAAA,aAAa;CACbA,yCAAAA,aAAa;CACbA,yCAAAA,aAAa;CACbA,yCAAAA,aAAa;CACbA,yCAAAA,aAAa;AACf;AAEA,IAAM,eAAe,UAAkB,MAAM,QAAQ,CAAC;AACtD,IAAM,aAAa,UAAkB,OAAO,CAAC,MAAM,QAAQ,CAAC,CAAC;;AAG7D,SAAS,aAAa,SAAoD;CACxE,OAAO,QAAQ,KAAK,EAAE,UAAU,QAAQ,OAAO;EAC7C,SAAS;EACT,OAAO;EACP,OAAO,cAAc,IAAI,cAAc,WAAWA,yCAAAA,aAAa;CACjE,EAAE;AACJ;;AAGA,SAAgB,aAAa;CAC3B,MAAM,EAAE,MAAM,WAAW,SAAS,sBAAsBC,iDAAAA,iBAAiB;CACzE,MAAM,UAAU,MAAM,WAAW,CAAC;CAElC,MAAM,SAAS,EAAE,OAAO,SAAS;CAEjC,IAAI,SACF,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,8CAAAA,WAAD;EAAW,GAAI;EACb,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACC,oDAAAA,gBAAD,CAAiB,CAAA;CACR,CAAA;CAIf,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACD,8CAAAA,WAAD;EAAW,GAAI;EAAQ,YAAY;EACjC,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACE,8CAAAA,WAAD;GAAW,SAAS,CAAC,aAAa,QAAQ,WAAW;GAAG,cAAa;GACnE,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACC,yBAAAA,kBAAD;IACE,WAAU;IACV,MAAM,MAAM,WAAW,CAAC;IACxB,QAAQ,aAAa,OAAO;IAC5B,QAAO;IACP,SAAS,CAAC,GAAG,CAAC;IACd,gBAAgB;IAChB,eAAe;IACJ;IACX,GAAIC,uCAAAA;GACL,CAAA;EACQ,CAAA;CACF,CAAA;AAEf"}
@@ -3,7 +3,7 @@ import { ChartCard } from "./chart-card.es.js";
3
3
  import { ChartCardError } from "./chart-card-error.es.js";
4
4
  import { BUCKET_AXIS } from "../lib/chart-axis.es.js";
5
5
  import { CHART_COLORS } from "../lib/chart-colors.es.js";
6
- import { t as MetricsLineChart } from "../../../MetricsLineChart-BhHoduO0.js";
6
+ import { t as MetricsLineChart } from "../../../MetricsLineChart-4SwxBbQx.js";
7
7
  import { useMetricsScores } from "../hooks/use-metrics-scores.es.js";
8
8
  import { jsx } from "react/jsx-runtime";
9
9
  // src/domains/metrics/components/scores-card.tsx
@@ -41,6 +41,7 @@ function ScoresCard() {
41
41
  isEmpty: !isLoading && scorers.length === 0,
42
42
  emptyMessage: "No scores in this range.",
43
43
  children: /* @__PURE__ */ jsx(MetricsLineChart, {
44
+ lineStyle: "thin",
44
45
  data: data?.buckets ?? [],
45
46
  series: scorerSeries(scorers),
46
47
  height: "fill",
@@ -1 +1 @@
1
- {"version":3,"file":"scores-card.es.js","names":[],"sources":["../../../../src/domains/metrics/components/scores-card.tsx"],"sourcesContent":["import { useMetricsScores } from '../hooks/use-metrics-scores';\nimport type { ScorerAverage } from '../hooks/use-metrics-scores';\nimport { BUCKET_AXIS } from '../lib/chart-axis';\nimport { CHART_COLORS } from '../lib/chart-colors';\nimport { ChartArea } from './chart-area';\nimport { ChartCard } from './chart-card';\nimport { ChartCardError } from './chart-card-error';\nimport type { MetricsLineChartSeries } from '@/ds/components/MetricsLineChart';\nimport { MetricsLineChart } from '@/ds/components/MetricsLineChart';\n\n/** Scores aren't problems, so no warm hues; past five scorers the colors repeat. */\nconst SCORER_COLORS = [\n CHART_COLORS.green,\n CHART_COLORS.sky,\n CHART_COLORS.violet,\n CHART_COLORS.teal,\n CHART_COLORS.indigo,\n];\n\nconst formatScore = (score: number) => score.toFixed(2);\nconst axisScore = (score: number) => String(+score.toFixed(2));\n\n/** One line per scorer. */\nfunction scorerSeries(scorers: ScorerAverage[]): MetricsLineChartSeries[] {\n return scorers.map(({ scorerId, name }, i) => ({\n dataKey: scorerId,\n label: name,\n color: SCORER_COLORS[i % SCORER_COLORS.length] ?? CHART_COLORS.neutral,\n }));\n}\n\n/** Average result of each scorer over time, 0 to 1. */\nexport function ScoresCard() {\n const { data, isLoading, isError, isPlaceholderData } = useMetricsScores();\n const scorers = data?.scorers ?? [];\n\n const layout = { title: 'Scores' };\n\n if (isError) {\n return (\n <ChartCard {...layout}>\n <ChartCardError />\n </ChartCard>\n );\n }\n\n return (\n <ChartCard {...layout} isUpdating={isPlaceholderData}>\n <ChartArea isEmpty={!isLoading && scorers.length === 0} emptyMessage=\"No scores in this range.\">\n <MetricsLineChart\n data={data?.buckets ?? []}\n series={scorerSeries(scorers)}\n height=\"fill\"\n yDomain={[0, 1]}\n valueFormatter={formatScore}\n axisFormatter={axisScore}\n isLoading={isLoading}\n {...BUCKET_AXIS}\n />\n </ChartArea>\n </ChartCard>\n );\n}\n"],"mappings":";;;;;;;;;;AAWA,IAAM,gBAAgB;CACpB,aAAa;CACb,aAAa;CACb,aAAa;CACb,aAAa;CACb,aAAa;AACf;AAEA,IAAM,eAAe,UAAkB,MAAM,QAAQ,CAAC;AACtD,IAAM,aAAa,UAAkB,OAAO,CAAC,MAAM,QAAQ,CAAC,CAAC;;AAG7D,SAAS,aAAa,SAAoD;CACxE,OAAO,QAAQ,KAAK,EAAE,UAAU,QAAQ,OAAO;EAC7C,SAAS;EACT,OAAO;EACP,OAAO,cAAc,IAAI,cAAc,WAAW,aAAa;CACjE,EAAE;AACJ;;AAGA,SAAgB,aAAa;CAC3B,MAAM,EAAE,MAAM,WAAW,SAAS,sBAAsB,iBAAiB;CACzE,MAAM,UAAU,MAAM,WAAW,CAAC;CAElC,MAAM,SAAS,EAAE,OAAO,SAAS;CAEjC,IAAI,SACF,OACE,oBAAC,WAAD;EAAW,GAAI;EACb,UAAA,oBAAC,gBAAD,CAAiB,CAAA;CACR,CAAA;CAIf,OACE,oBAAC,WAAD;EAAW,GAAI;EAAQ,YAAY;EACjC,UAAA,oBAAC,WAAD;GAAW,SAAS,CAAC,aAAa,QAAQ,WAAW;GAAG,cAAa;GACnE,UAAA,oBAAC,kBAAD;IACE,MAAM,MAAM,WAAW,CAAC;IACxB,QAAQ,aAAa,OAAO;IAC5B,QAAO;IACP,SAAS,CAAC,GAAG,CAAC;IACd,gBAAgB;IAChB,eAAe;IACJ;IACX,GAAI;GACL,CAAA;EACQ,CAAA;CACF,CAAA;AAEf"}
1
+ {"version":3,"file":"scores-card.es.js","names":[],"sources":["../../../../src/domains/metrics/components/scores-card.tsx"],"sourcesContent":["import { useMetricsScores } from '../hooks/use-metrics-scores';\nimport type { ScorerAverage } from '../hooks/use-metrics-scores';\nimport { BUCKET_AXIS } from '../lib/chart-axis';\nimport { CHART_COLORS } from '../lib/chart-colors';\nimport { ChartArea } from './chart-area';\nimport { ChartCard } from './chart-card';\nimport { ChartCardError } from './chart-card-error';\nimport type { MetricsLineChartSeries } from '@/ds/components/MetricsLineChart';\nimport { MetricsLineChart } from '@/ds/components/MetricsLineChart';\n\n/** Scores aren't problems, so no warm hues; past five scorers the colors repeat. */\nconst SCORER_COLORS = [\n CHART_COLORS.green,\n CHART_COLORS.sky,\n CHART_COLORS.violet,\n CHART_COLORS.teal,\n CHART_COLORS.indigo,\n];\n\nconst formatScore = (score: number) => score.toFixed(2);\nconst axisScore = (score: number) => String(+score.toFixed(2));\n\n/** One line per scorer. */\nfunction scorerSeries(scorers: ScorerAverage[]): MetricsLineChartSeries[] {\n return scorers.map(({ scorerId, name }, i) => ({\n dataKey: scorerId,\n label: name,\n color: SCORER_COLORS[i % SCORER_COLORS.length] ?? CHART_COLORS.neutral,\n }));\n}\n\n/** Average result of each scorer over time, 0 to 1. */\nexport function ScoresCard() {\n const { data, isLoading, isError, isPlaceholderData } = useMetricsScores();\n const scorers = data?.scorers ?? [];\n\n const layout = { title: 'Scores' };\n\n if (isError) {\n return (\n <ChartCard {...layout}>\n <ChartCardError />\n </ChartCard>\n );\n }\n\n return (\n <ChartCard {...layout} isUpdating={isPlaceholderData}>\n <ChartArea isEmpty={!isLoading && scorers.length === 0} emptyMessage=\"No scores in this range.\">\n <MetricsLineChart\n lineStyle=\"thin\"\n data={data?.buckets ?? []}\n series={scorerSeries(scorers)}\n height=\"fill\"\n yDomain={[0, 1]}\n valueFormatter={formatScore}\n axisFormatter={axisScore}\n isLoading={isLoading}\n {...BUCKET_AXIS}\n />\n </ChartArea>\n </ChartCard>\n );\n}\n"],"mappings":";;;;;;;;;;AAWA,IAAM,gBAAgB;CACpB,aAAa;CACb,aAAa;CACb,aAAa;CACb,aAAa;CACb,aAAa;AACf;AAEA,IAAM,eAAe,UAAkB,MAAM,QAAQ,CAAC;AACtD,IAAM,aAAa,UAAkB,OAAO,CAAC,MAAM,QAAQ,CAAC,CAAC;;AAG7D,SAAS,aAAa,SAAoD;CACxE,OAAO,QAAQ,KAAK,EAAE,UAAU,QAAQ,OAAO;EAC7C,SAAS;EACT,OAAO;EACP,OAAO,cAAc,IAAI,cAAc,WAAW,aAAa;CACjE,EAAE;AACJ;;AAGA,SAAgB,aAAa;CAC3B,MAAM,EAAE,MAAM,WAAW,SAAS,sBAAsB,iBAAiB;CACzE,MAAM,UAAU,MAAM,WAAW,CAAC;CAElC,MAAM,SAAS,EAAE,OAAO,SAAS;CAEjC,IAAI,SACF,OACE,oBAAC,WAAD;EAAW,GAAI;EACb,UAAA,oBAAC,gBAAD,CAAiB,CAAA;CACR,CAAA;CAIf,OACE,oBAAC,WAAD;EAAW,GAAI;EAAQ,YAAY;EACjC,UAAA,oBAAC,WAAD;GAAW,SAAS,CAAC,aAAa,QAAQ,WAAW;GAAG,cAAa;GACnE,UAAA,oBAAC,kBAAD;IACE,WAAU;IACV,MAAM,MAAM,WAAW,CAAC;IACxB,QAAQ,aAAa,OAAO;IAC5B,QAAO;IACP,SAAS,CAAC,GAAG,CAAC;IACd,gBAAgB;IAChB,eAAe;IACJ;IACX,GAAI;GACL,CAAA;EACQ,CAAA;CACF,CAAA;AAEf"}
@@ -2,15 +2,15 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_domains_metrics_lib_chart_format = require("../lib/chart-format.cjs.js");
3
3
  const require_domains_metrics_hooks_use_metrics_filters = require("../hooks/use-metrics-filters.cjs.js");
4
4
  const require_domains_metrics_lib_metrics_buckets = require("../lib/metrics-buckets.cjs.js");
5
- const require_MetricsCard = require("../../../MetricsCard-CEB-f2sv.cjs");
5
+ const require_MetricsCard = require("../../../MetricsCard-BEwiS7Pe.cjs");
6
6
  const require_domains_metrics_components_chart_area = require("./chart-area.cjs.js");
7
7
  const require_domains_metrics_components_chart_card = require("./chart-card.cjs.js");
8
8
  const require_domains_metrics_components_chart_card_error = require("./chart-card-error.cjs.js");
9
9
  const require_domains_metrics_lib_chart_axis = require("../lib/chart-axis.cjs.js");
10
10
  const require_domains_metrics_lib_chart_colors = require("../lib/chart-colors.cjs.js");
11
- const require_MetricsLineChart = require("../../../MetricsLineChart-CjBm4IXu.cjs");
11
+ const require_MetricsLineChart = require("../../../MetricsLineChart-tZxsauau.cjs");
12
12
  const require_domains_metrics_components_card_action_buttons = require("./card-action-buttons.cjs.js");
13
- const require_MetricsStackedBarChart = require("../../../MetricsStackedBarChart-BdMlKv6G.cjs");
13
+ const require_MetricsStackedBarChart = require("../../../MetricsStackedBarChart-CDLE76IB.cjs");
14
14
  const require_domains_metrics_hooks_use_metrics_activity = require("../hooks/use-metrics-activity.cjs.js");
15
15
  let react = require("react");
16
16
  let react_jsx_runtime = require("react/jsx-runtime");
@@ -1,15 +1,15 @@
1
1
  import { formatAxisCount, formatAxisUsd, formatCount, formatUsd } from "../lib/chart-format.es.js";
2
2
  import { useMetricsFilters } from "../hooks/use-metrics-filters.es.js";
3
3
  import { bucketPlan, bucketWindow } from "../lib/metrics-buckets.es.js";
4
- import { t as MetricsCard } from "../../../MetricsCard-M8awJ2B_.js";
4
+ import { t as MetricsCard } from "../../../MetricsCard-ua6C6b8a.js";
5
5
  import { ChartArea } from "./chart-area.es.js";
6
6
  import { ChartCard } from "./chart-card.es.js";
7
7
  import { ChartCardError } from "./chart-card-error.es.js";
8
8
  import { EDGE_BUCKET_AXIS } from "../lib/chart-axis.es.js";
9
9
  import { CHART_COLORS } from "../lib/chart-colors.es.js";
10
- import { r as MetricsLineChartLegend } from "../../../MetricsLineChart-BhHoduO0.js";
10
+ import { r as MetricsLineChartLegend } from "../../../MetricsLineChart-4SwxBbQx.js";
11
11
  import { OpenInTracesButton } from "./card-action-buttons.es.js";
12
- import { t as MetricsStackedBarChart } from "../../../MetricsStackedBarChart-BRuA6MTE.js";
12
+ import { t as MetricsStackedBarChart } from "../../../MetricsStackedBarChart-D2QyS4-z.js";
13
13
  import { useMetricsActivity } from "../hooks/use-metrics-activity.es.js";
14
14
  import { useState } from "react";
15
15
  import { jsx } from "react/jsx-runtime";
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_domains_metrics_hooks_use_metrics_trace_aggregate = require("../hooks/use-metrics-trace-aggregate.cjs.js");
3
- const require_MetricsCard = require("../../../MetricsCard-CEB-f2sv.cjs");
3
+ const require_MetricsCard = require("../../../MetricsCard-BEwiS7Pe.cjs");
4
4
  const require_domains_metrics_components_chart_card = require("./chart-card.cjs.js");
5
5
  let react_jsx_runtime = require("react/jsx-runtime");
6
6
  // src/domains/metrics/components/trace-aggregate-card.tsx
@@ -1,5 +1,5 @@
1
1
  import { useTraceAggregateGate } from "../hooks/use-metrics-trace-aggregate.es.js";
2
- import { t as MetricsCard } from "../../../MetricsCard-M8awJ2B_.js";
2
+ import { t as MetricsCard } from "../../../MetricsCard-ua6C6b8a.js";
3
3
  import { ChartCard } from "./chart-card.es.js";
4
4
  import { jsx } from "react/jsx-runtime";
5
5
  // src/domains/metrics/components/trace-aggregate-card.tsx
@@ -4,7 +4,7 @@ const require_Txt = require("../../../Txt-BnoSqxKE.cjs");
4
4
  const require_domains_metrics_lib_chart_format = require("../../metrics/lib/chart-format.cjs.js");
5
5
  const require_domains_metrics_lib_chart_axis = require("../../metrics/lib/chart-axis.cjs.js");
6
6
  const require_domains_metrics_lib_chart_colors = require("../../metrics/lib/chart-colors.cjs.js");
7
- const require_MetricsStackedBarChart = require("../../../MetricsStackedBarChart-BdMlKv6G.cjs");
7
+ const require_MetricsStackedBarChart = require("../../../MetricsStackedBarChart-CDLE76IB.cjs");
8
8
  let react = require("react");
9
9
  let react_jsx_runtime = require("react/jsx-runtime");
10
10
  // src/domains/observability/components/observability-histogram.tsx
@@ -3,7 +3,7 @@ import { t as Txt } from "../../../Txt-BM6TVV_c.js";
3
3
  import { formatCount } from "../../metrics/lib/chart-format.es.js";
4
4
  import { BUCKET_AXIS } from "../../metrics/lib/chart-axis.es.js";
5
5
  import { CHART_COLORS } from "../../metrics/lib/chart-colors.es.js";
6
- import { t as MetricsStackedBarChart } from "../../../MetricsStackedBarChart-BRuA6MTE.js";
6
+ import { t as MetricsStackedBarChart } from "../../../MetricsStackedBarChart-D2QyS4-z.js";
7
7
  import { useMemo } from "react";
8
8
  import { jsx, jsxs } from "react/jsx-runtime";
9
9
  // src/domains/observability/components/observability-histogram.tsx
@@ -1,8 +1,8 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_trace_filters = require("../../../trace-filters-a0N9bf52.cjs");
3
3
  const require_domains_traces_components_traces_explorer_traces_explorer_actions = require("../../traces/components/traces-explorer/traces-explorer-actions.cjs.js");
4
- require("../../../filter-bar-time-range-BA-pXMlo.cjs");
5
- const require_FilterBar = require("../../../FilterBar-CQl04O6t.cjs");
4
+ require("../../../filter-bar-time-range-zdM024JD.cjs");
5
+ const require_FilterBar = require("../../../FilterBar-BSP2UTjc.cjs");
6
6
  const require_domains_spans_hooks_use_spans_filter_bar = require("../hooks/use-spans-filter-bar.cjs.js");
7
7
  let react_jsx_runtime = require("react/jsx-runtime");
8
8
  // src/domains/spans/components/spans-filter-bar.tsx
@@ -1,7 +1,7 @@
1
1
  import { u as TRACE_FILTER_BAR_OPERATORS } from "../../../trace-filters-CaWkw779.js";
2
2
  import { DEFAULT_TRACES_FILTERS } from "../../traces/components/traces-explorer/traces-explorer-actions.es.js";
3
- import "../../../filter-bar-time-range-mg9JeYue.js";
4
- import { n as FilterBar } from "../../../FilterBar-BgW2dqRQ.js";
3
+ import "../../../filter-bar-time-range-qlV8p7hp.js";
4
+ import { n as FilterBar } from "../../../FilterBar-PSQ1OwqH.js";
5
5
  import { SPAN_TIME_RANGE_PRESETS, useSpansFilterBar, useSpansFilterBarFields } from "../hooks/use-spans-filter-bar.es.js";
6
6
  import { jsx, jsxs } from "react/jsx-runtime";
7
7
  // src/domains/spans/components/spans-filter-bar.tsx
@@ -2,7 +2,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_trace_filters = require("../../../trace-filters-a0N9bf52.cjs");
3
3
  const require_types = require("../../../types-CP7wbYua.cjs");
4
4
  const require_domains_spans_span_filters = require("../span-filters.cjs.js");
5
- const require_filter_bar_time_range = require("../../../filter-bar-time-range-BA-pXMlo.cjs");
5
+ const require_filter_bar_time_range = require("../../../filter-bar-time-range-zdM024JD.cjs");
6
6
  let react = require("react");
7
7
  let _mastra_react = require("@mastra/react");
8
8
  let _mastra_react_hooks_capabilities = require("@mastra/react/hooks/capabilities");
@@ -1,7 +1,7 @@
1
1
  import { L as filterBarExpressionToTraceFilters, rt as traceTokensToFilterBarItems, tt as traceFiltersToFilterBarExpression } from "../../../trace-filters-CaWkw779.js";
2
2
  import { t as isFilterBarGroup } from "../../../types-DiiL5mTO.js";
3
3
  import { createSpanFilterBarFields } from "../span-filters.es.js";
4
- import { r as FILTER_BAR_TIME_RANGE_ITEM, t as FILTER_BAR_TIME_RANGE_FIELD } from "../../../filter-bar-time-range-mg9JeYue.js";
4
+ import { r as FILTER_BAR_TIME_RANGE_ITEM, t as FILTER_BAR_TIME_RANGE_FIELD } from "../../../filter-bar-time-range-qlV8p7hp.js";
5
5
  import { useCallback, useMemo } from "react";
6
6
  import { useMastraClient } from "@mastra/react";
7
7
  import { useObservabilityCapabilities } from "@mastra/react/hooks/capabilities";
@@ -1,8 +1,8 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_trace_filters = require("../../../trace-filters-a0N9bf52.cjs");
3
3
  const require_domains_traces_components_traces_explorer_traces_explorer_actions = require("../../traces/components/traces-explorer/traces-explorer-actions.cjs.js");
4
- require("../../../filter-bar-time-range-BA-pXMlo.cjs");
5
- const require_FilterBar = require("../../../FilterBar-CQl04O6t.cjs");
4
+ require("../../../filter-bar-time-range-zdM024JD.cjs");
5
+ const require_FilterBar = require("../../../FilterBar-BSP2UTjc.cjs");
6
6
  const require_domains_threads_hooks_use_threads_filter_bar = require("../hooks/use-threads-filter-bar.cjs.js");
7
7
  let react_jsx_runtime = require("react/jsx-runtime");
8
8
  // src/domains/threads/components/threads-filter-bar.tsx
@@ -1,7 +1,7 @@
1
1
  import { u as TRACE_FILTER_BAR_OPERATORS } from "../../../trace-filters-CaWkw779.js";
2
2
  import { DEFAULT_TRACES_FILTERS } from "../../traces/components/traces-explorer/traces-explorer-actions.es.js";
3
- import "../../../filter-bar-time-range-mg9JeYue.js";
4
- import { n as FilterBar } from "../../../FilterBar-BgW2dqRQ.js";
3
+ import "../../../filter-bar-time-range-qlV8p7hp.js";
4
+ import { n as FilterBar } from "../../../FilterBar-PSQ1OwqH.js";
5
5
  import { THREAD_TIME_RANGE_PRESETS, useThreadsFilterBar, useThreadsFilterBarFields } from "../hooks/use-threads-filter-bar.es.js";
6
6
  import { jsx, jsxs } from "react/jsx-runtime";
7
7
  // src/domains/threads/components/threads-filter-bar.tsx
@@ -2,7 +2,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_trace_filters = require("../../../trace-filters-a0N9bf52.cjs");
3
3
  const require_types = require("../../../types-CP7wbYua.cjs");
4
4
  const require_domains_threads_thread_filters = require("../thread-filters.cjs.js");
5
- const require_filter_bar_time_range = require("../../../filter-bar-time-range-BA-pXMlo.cjs");
5
+ const require_filter_bar_time_range = require("../../../filter-bar-time-range-zdM024JD.cjs");
6
6
  let react = require("react");
7
7
  let _mastra_react_hooks_capabilities = require("@mastra/react/hooks/capabilities");
8
8
  let _mastra_react_hooks_traces = require("@mastra/react/hooks/traces");
@@ -1,7 +1,7 @@
1
1
  import { L as filterBarExpressionToTraceFilters, rt as traceTokensToFilterBarItems, tt as traceFiltersToFilterBarExpression } from "../../../trace-filters-CaWkw779.js";
2
2
  import { t as isFilterBarGroup } from "../../../types-DiiL5mTO.js";
3
3
  import { createThreadFilterBarFields } from "../thread-filters.es.js";
4
- import { r as FILTER_BAR_TIME_RANGE_ITEM, t as FILTER_BAR_TIME_RANGE_FIELD } from "../../../filter-bar-time-range-mg9JeYue.js";
4
+ import { r as FILTER_BAR_TIME_RANGE_ITEM, t as FILTER_BAR_TIME_RANGE_FIELD } from "../../../filter-bar-time-range-qlV8p7hp.js";
5
5
  import { useCallback, useMemo } from "react";
6
6
  import { useObservabilityCapabilities } from "@mastra/react/hooks/capabilities";
7
7
  import { useEntityNames, useEnvironments } from "@mastra/react/hooks/traces";
@@ -1,8 +1,8 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_trace_filters = require("../../../../trace-filters-a0N9bf52.cjs");
3
3
  const require_domains_traces_components_traces_explorer_traces_explorer_actions = require("./traces-explorer-actions.cjs.js");
4
- require("../../../../filter-bar-time-range-BA-pXMlo.cjs");
5
- const require_FilterBar = require("../../../../FilterBar-CQl04O6t.cjs");
4
+ require("../../../../filter-bar-time-range-zdM024JD.cjs");
5
+ const require_FilterBar = require("../../../../FilterBar-BSP2UTjc.cjs");
6
6
  const require_domains_traces_components_traces_explorer_traces_explorer_context = require("./traces-explorer-context.cjs.js");
7
7
  const require_domains_traces_components_traces_explorer_use_traces_filter_bar = require("./use-traces-filter-bar.cjs.js");
8
8
  let react_jsx_runtime = require("react/jsx-runtime");
@@ -1,7 +1,7 @@
1
1
  import { u as TRACE_FILTER_BAR_OPERATORS } from "../../../../trace-filters-CaWkw779.js";
2
2
  import { DEFAULT_TRACES_FILTERS } from "./traces-explorer-actions.es.js";
3
- import "../../../../filter-bar-time-range-mg9JeYue.js";
4
- import { n as FilterBar } from "../../../../FilterBar-BgW2dqRQ.js";
3
+ import "../../../../filter-bar-time-range-qlV8p7hp.js";
4
+ import { n as FilterBar } from "../../../../FilterBar-PSQ1OwqH.js";
5
5
  import { useTracesConfig, useTracesFilters, useTracesList } from "./traces-explorer-context.es.js";
6
6
  import { useTracesFilterBar, useTracesFilterBarFields } from "./use-traces-filter-bar.es.js";
7
7
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";