@mastra/playground-ui 58.1.0-alpha.0 → 59.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.
- package/README.md +62 -0
- package/dist/{Header-BVnFQlzE.js → Header-hTHhO02b.js} +2 -2
- package/dist/{Header-BVnFQlzE.js.map → Header-hTHhO02b.js.map} +1 -1
- package/dist/{Header-CGjhJ0nQ.cjs → Header-y51Sfo3G.cjs} +2 -2
- package/dist/{Header-CGjhJ0nQ.cjs.map → Header-y51Sfo3G.cjs.map} +1 -1
- package/dist/{Txt-DTh3Pa_a.js → Txt-BP1SRHmL.js} +4 -10
- package/dist/Txt-BP1SRHmL.js.map +1 -0
- package/dist/{Txt-B4-2nLaI.cjs → Txt-DPmEpNbp.cjs} +4 -10
- package/dist/Txt-DPmEpNbp.cjs.map +1 -0
- package/dist/{ask-user-pPTuoPKI.cjs → ask-user-4pnmHbuC.cjs} +2 -2
- package/dist/{ask-user-pPTuoPKI.cjs.map → ask-user-4pnmHbuC.cjs.map} +1 -1
- package/dist/{ask-user-DtF4a9Vr.js → ask-user-CFcQN_7m.js} +2 -2
- package/dist/{ask-user-DtF4a9Vr.js.map → ask-user-CFcQN_7m.js.map} +1 -1
- package/dist/{chat-notification-C4P2InUX.js → chat-notification-BI_WRUvG.js} +2 -2
- package/dist/{chat-notification-C4P2InUX.js.map → chat-notification-BI_WRUvG.js.map} +1 -1
- package/dist/{chat-notification-HP18KxlS.cjs → chat-notification-Dc7jwULm.cjs} +2 -2
- package/dist/{chat-notification-HP18KxlS.cjs.map → chat-notification-Dc7jwULm.cjs.map} +1 -1
- package/dist/{chat-signal-BP9RN6Rh.cjs → chat-signal-BodewV33.cjs} +3 -3
- package/dist/{chat-signal-BP9RN6Rh.cjs.map → chat-signal-BodewV33.cjs.map} +1 -1
- package/dist/{chat-signal-CQnmFp3V.js → chat-signal-D0zw80bU.js} +3 -3
- package/dist/{chat-signal-CQnmFp3V.js.map → chat-signal-D0zw80bU.js.map} +1 -1
- package/dist/{combobox-BoSB-muq.cjs → combobox-B19HJqE-.cjs} +2 -2
- package/dist/{combobox-BoSB-muq.cjs.map → combobox-B19HJqE-.cjs.map} +1 -1
- package/dist/{combobox-Cd0JPUQW.js → combobox-D_kmwSKS.js} +2 -2
- package/dist/{combobox-Cd0JPUQW.js.map → combobox-D_kmwSKS.js.map} +1 -1
- package/dist/components/Avatar.cjs.js +1 -1
- package/dist/components/Avatar.es.js +1 -1
- package/dist/components/ClampedText.cjs.js +1 -1
- package/dist/components/ClampedText.es.js +1 -1
- package/dist/components/Combobox.cjs.js +1 -1
- package/dist/components/Combobox.es.js +1 -1
- package/dist/components/Comment.cjs.js +2 -2
- package/dist/components/Comment.es.js +2 -2
- package/dist/components/CompactNumber.cjs.js +24 -0
- package/dist/components/CompactNumber.cjs.js.map +1 -0
- package/dist/components/CompactNumber.d.ts +2 -0
- package/dist/components/CompactNumber.es.js +20 -0
- package/dist/components/CompactNumber.es.js.map +1 -0
- package/dist/components/DataCodeSection.cjs.js +1 -1
- package/dist/components/DataCodeSection.es.js +1 -1
- package/dist/components/DataList.cjs.js +8 -14
- package/dist/components/DataList.cjs.js.map +1 -1
- package/dist/components/DataList.es.js +8 -14
- package/dist/components/DataList.es.js.map +1 -1
- package/dist/components/DataPanel.cjs.js +1 -1
- package/dist/components/DataPanel.es.js +1 -1
- package/dist/components/DateRangeTimeline.cjs.js +1 -1
- package/dist/components/DateRangeTimeline.es.js +1 -1
- package/dist/components/DateTimePicker.cjs.js +1 -1
- package/dist/components/DateTimePicker.es.js +1 -1
- package/dist/components/DateTimeRangePicker.cjs.js +1 -1
- package/dist/components/DateTimeRangePicker.es.js +1 -1
- package/dist/components/Entity.cjs.js +1 -1
- package/dist/components/Entity.es.js +1 -1
- package/dist/components/EntityHeader.cjs.js +1 -1
- package/dist/components/EntityHeader.es.js +1 -1
- package/dist/components/Entry.cjs.js +1 -1
- package/dist/components/Entry.es.js +1 -1
- package/dist/components/EnvironmentVariablesEditor.cjs.js +3 -3
- package/dist/components/EnvironmentVariablesEditor.es.js +3 -3
- package/dist/components/FilterBar.cjs.js +1 -1
- package/dist/components/FilterBar.es.js +1 -1
- package/dist/components/FormFieldBlocks.cjs.js +4 -4
- package/dist/components/FormFieldBlocks.es.js +4 -4
- package/dist/components/Header.cjs.js +1 -1
- package/dist/components/Header.es.js +1 -1
- package/dist/components/InlineCode.cjs.js +10 -0
- package/dist/components/InlineCode.cjs.js.map +1 -0
- package/dist/components/InlineCode.d.ts +2 -0
- package/dist/components/InlineCode.es.js +2 -0
- package/dist/components/InlineCode.es.js.map +1 -0
- package/dist/components/ItemList.cjs.js +4 -16
- package/dist/components/ItemList.cjs.js.map +1 -1
- package/dist/components/ItemList.es.js +4 -16
- package/dist/components/ItemList.es.js.map +1 -1
- package/dist/components/JSONSchemaForm.cjs.js +2 -2
- package/dist/components/JSONSchemaForm.es.js +2 -2
- package/dist/components/ListSearch.cjs.js +1 -1
- package/dist/components/ListSearch.es.js +1 -1
- package/dist/components/LogsDataList.cjs.js +2 -2
- package/dist/components/LogsDataList.es.js +2 -2
- package/dist/components/Message.cjs.js +4 -5
- package/dist/components/Message.cjs.js.map +1 -1
- package/dist/components/Message.es.js +4 -5
- package/dist/components/Message.es.js.map +1 -1
- package/dist/components/PageLayout.cjs.js +1 -1
- package/dist/components/PageLayout.es.js +1 -1
- package/dist/components/PropertyFilter.cjs.js +1 -1
- package/dist/components/PropertyFilter.es.js +1 -1
- package/dist/components/RelativeTimestamp.cjs.js +119 -0
- package/dist/components/RelativeTimestamp.cjs.js.map +1 -0
- package/dist/components/RelativeTimestamp.d.ts +2 -0
- package/dist/components/RelativeTimestamp.es.js +115 -0
- package/dist/components/RelativeTimestamp.es.js.map +1 -0
- package/dist/components/Section.cjs.js +1 -1
- package/dist/components/Section.es.js +1 -1
- package/dist/components/SettingsRow.cjs.js +1 -1
- package/dist/components/SettingsRow.es.js +1 -1
- package/dist/components/SideDialog.cjs.js +1 -1
- package/dist/components/SideDialog.es.js +1 -1
- package/dist/components/StatusIndicators.cjs.js +21 -14
- package/dist/components/StatusIndicators.cjs.js.map +1 -1
- package/dist/components/StatusIndicators.es.js +21 -15
- package/dist/components/StatusIndicators.es.js.map +1 -1
- package/dist/components/Table.cjs.js +3 -21
- package/dist/components/Table.cjs.js.map +1 -1
- package/dist/components/Table.es.js +3 -21
- package/dist/components/Table.es.js.map +1 -1
- package/dist/components/ThreadList.cjs.js +1 -1
- package/dist/components/ThreadList.es.js +1 -1
- package/dist/components/Truncate.cjs.js +1 -1
- package/dist/components/Truncate.es.js +1 -1
- package/dist/components/Txt.cjs.js +1 -1
- package/dist/components/Txt.es.js +1 -1
- package/dist/components/Workflow.cjs.js +8 -12
- package/dist/components/Workflow.cjs.js.map +1 -1
- package/dist/components/Workflow.es.js +8 -12
- package/dist/components/Workflow.es.js.map +1 -1
- package/dist/components/ai/ask-user.cjs.js +1 -1
- package/dist/components/ai/ask-user.es.js +1 -1
- package/dist/components/ai/chat-event.cjs.js +3 -3
- package/dist/components/ai/chat-event.es.js +4 -4
- package/dist/components/ai/plan.cjs.js +2 -2
- package/dist/components/ai/plan.cjs.js.map +1 -1
- package/dist/components/ai/plan.es.js +2 -2
- package/dist/components/ai/plan.es.js.map +1 -1
- package/dist/components/ai/tool-call.cjs.js +7 -9
- package/dist/components/ai/tool-call.cjs.js.map +1 -1
- package/dist/components/ai/tool-call.es.js +8 -10
- package/dist/components/ai/tool-call.es.js.map +1 -1
- package/dist/{data-code-section-Cth9zVkj.js → data-code-section-BKrCkj90.js} +2 -2
- package/dist/{data-code-section-Cth9zVkj.js.map → data-code-section-BKrCkj90.js.map} +1 -1
- package/dist/{data-code-section-DE4AgaTU.cjs → data-code-section-C9z94ytx.cjs} +2 -2
- package/dist/{data-code-section-DE4AgaTU.cjs.map → data-code-section-C9z94ytx.cjs.map} +1 -1
- package/dist/{data-list-DisTjDHP.js → data-list-5-nRJbEO.js} +3 -3
- package/dist/{data-list-DisTjDHP.js.map → data-list-5-nRJbEO.js.map} +1 -1
- package/dist/{data-list-PwFpP_mo.cjs → data-list-RI8c32dk.cjs} +3 -3
- package/dist/{data-list-PwFpP_mo.cjs.map → data-list-RI8c32dk.cjs.map} +1 -1
- package/dist/{data-list-skeleton-DAfM8AjW.js → data-list-skeleton-BrSh9Y_3.js} +2 -2
- package/dist/{data-list-skeleton-DAfM8AjW.js.map → data-list-skeleton-BrSh9Y_3.js.map} +1 -1
- package/dist/{data-list-skeleton-CjwR0o3w.cjs → data-list-skeleton-CgbWqYky.cjs} +2 -2
- package/dist/{data-list-skeleton-CjwR0o3w.cjs.map → data-list-skeleton-CgbWqYky.cjs.map} +1 -1
- package/dist/{data-list-spacer-DEcgVGFM.cjs → data-list-spacer-1OqlC7WX.cjs} +2 -2
- package/dist/{data-list-spacer-DEcgVGFM.cjs.map → data-list-spacer-1OqlC7WX.cjs.map} +1 -1
- package/dist/{data-list-spacer-BmorAN0V.js → data-list-spacer-D3Rn1evn.js} +2 -2
- package/dist/{data-list-spacer-BmorAN0V.js.map → data-list-spacer-D3Rn1evn.js.map} +1 -1
- package/dist/{data-list-top-DpbOA3uw.js → data-list-top-B-AopfvE.js} +13 -21
- package/dist/data-list-top-B-AopfvE.js.map +1 -0
- package/dist/{data-list-top-WGUY167p.cjs → data-list-top-DFnudSA_.cjs} +13 -21
- package/dist/data-list-top-DFnudSA_.cjs.map +1 -0
- package/dist/{data-panel-BQVTKo86.js → data-panel-BWgExbHs.js} +2 -2
- package/dist/{data-panel-BQVTKo86.js.map → data-panel-BWgExbHs.js.map} +1 -1
- package/dist/{data-panel-XPXrhYJI.cjs → data-panel-C_BqhzeL.cjs} +2 -2
- package/dist/{data-panel-XPXrhYJI.cjs.map → data-panel-C_BqhzeL.cjs.map} +1 -1
- package/dist/{date-time-range-picker-C-t3Kdpk.js → date-time-range-picker-Bnviv7s-.js} +2 -2
- package/dist/{date-time-range-picker-C-t3Kdpk.js.map → date-time-range-picker-Bnviv7s-.js.map} +1 -1
- package/dist/{date-time-range-picker-BCzvSYx3.cjs → date-time-range-picker-sT5qAW-_.cjs} +2 -2
- package/dist/{date-time-range-picker-BCzvSYx3.cjs.map → date-time-range-picker-sT5qAW-_.cjs.map} +1 -1
- package/dist/domains/capabilities/hooks/use-feedback-available.cjs.js +16 -0
- package/dist/domains/capabilities/hooks/use-feedback-available.cjs.js.map +1 -0
- package/dist/domains/capabilities/hooks/use-feedback-available.d.ts +2 -0
- package/dist/domains/capabilities/hooks/use-feedback-available.es.js +12 -0
- package/dist/domains/capabilities/hooks/use-feedback-available.es.js.map +1 -0
- package/dist/domains/capabilities/hooks/use-observability-capabilities.cjs.js +20 -0
- package/dist/domains/capabilities/hooks/use-observability-capabilities.cjs.js.map +1 -0
- package/dist/domains/capabilities/hooks/use-observability-capabilities.d.ts +2 -0
- package/dist/domains/capabilities/hooks/use-observability-capabilities.es.js +16 -0
- package/dist/domains/capabilities/hooks/use-observability-capabilities.es.js.map +1 -0
- package/dist/domains/capabilities/hooks/use-trace-query-available.cjs.js +16 -0
- package/dist/domains/capabilities/hooks/use-trace-query-available.cjs.js.map +1 -0
- package/dist/domains/capabilities/hooks/use-trace-query-available.d.ts +2 -0
- package/dist/domains/capabilities/hooks/use-trace-query-available.es.js +12 -0
- package/dist/domains/capabilities/hooks/use-trace-query-available.es.js.map +1 -0
- package/dist/domains/capabilities/hooks.cjs.js +14 -0
- package/dist/domains/capabilities/hooks.cjs.js.map +1 -0
- package/dist/domains/capabilities/hooks.d.ts +2 -0
- package/dist/domains/capabilities/hooks.es.js +4 -0
- package/dist/domains/capabilities/hooks.es.js.map +1 -0
- package/dist/domains/capabilities.cjs.js +14 -0
- package/dist/domains/capabilities.cjs.js.map +1 -0
- package/dist/domains/capabilities.d.ts +2 -0
- package/dist/domains/capabilities.es.js +4 -0
- package/dist/domains/capabilities.es.js.map +1 -0
- package/dist/domains/chat/attachments/attachment-kind.es.js +1 -1
- package/dist/domains/chat/components/badge-wrapper.cjs.js +1 -1
- package/dist/domains/chat/components/badge-wrapper.es.js +1 -1
- package/dist/domains/chat/components/network-choice-metadata-dialog.cjs.js +1 -1
- package/dist/domains/chat/components/network-choice-metadata-dialog.es.js +1 -1
- package/dist/domains/chat/components/section-label.cjs.js +1 -1
- package/dist/domains/chat/components/section-label.es.js +1 -1
- package/dist/domains/chat/messages/notification-signal-notice.cjs.js +1 -1
- package/dist/domains/chat/messages/notification-signal-notice.es.js +1 -1
- package/dist/domains/chat/messages/reasoning-streaming-line.cjs.js +1 -1
- package/dist/domains/chat/messages/reasoning-streaming-line.es.js +1 -1
- package/dist/domains/chat/messages/reasoning.cjs.js +4 -3
- package/dist/domains/chat/messages/reasoning.cjs.js.map +1 -1
- package/dist/domains/chat/messages/reasoning.es.js +4 -3
- package/dist/domains/chat/messages/reasoning.es.js.map +1 -1
- package/dist/domains/chat/messages/renderers/reasoning-part-renderer.cjs.js +2 -2
- package/dist/domains/chat/messages/renderers/reasoning-part-renderer.cjs.js.map +1 -1
- package/dist/domains/chat/messages/renderers/reasoning-part-renderer.es.js +2 -2
- package/dist/domains/chat/messages/renderers/reasoning-part-renderer.es.js.map +1 -1
- package/dist/domains/chat/messages/renderers/user-file-part-renderer.es.js +1 -1
- package/dist/domains/chat/messages/signal-badge.cjs.js +1 -1
- package/dist/domains/chat/messages/signal-badge.es.js +1 -1
- package/dist/domains/chat/messages/system-reminder-badge.cjs.js +1 -1
- package/dist/domains/chat/messages/system-reminder-badge.cjs.js.map +1 -1
- package/dist/domains/chat/messages/system-reminder-badge.es.js +1 -1
- package/dist/domains/chat/messages/system-reminder-badge.es.js.map +1 -1
- package/dist/domains/chat/messages/tripwire-notice.cjs.js +1 -1
- package/dist/domains/chat/messages/tripwire-notice.cjs.js.map +1 -1
- package/dist/domains/chat/messages/tripwire-notice.es.js +1 -1
- package/dist/domains/chat/messages/tripwire-notice.es.js.map +1 -1
- package/dist/domains/chat/tools/badges/ask-user-badge.cjs.js +1 -1
- package/dist/domains/chat/tools/badges/ask-user-badge.es.js +1 -1
- package/dist/domains/chat/tools/badges/code-mode-badge.cjs.js +3 -3
- package/dist/domains/chat/tools/badges/code-mode-badge.cjs.js.map +1 -1
- package/dist/domains/chat/tools/badges/code-mode-badge.es.js +3 -3
- package/dist/domains/chat/tools/badges/code-mode-badge.es.js.map +1 -1
- package/dist/domains/chat/tools/badges/observation-marker-badge.cjs.js +5 -3
- package/dist/domains/chat/tools/badges/observation-marker-badge.cjs.js.map +1 -1
- package/dist/domains/chat/tools/badges/observation-marker-badge.es.js +5 -3
- package/dist/domains/chat/tools/badges/observation-marker-badge.es.js.map +1 -1
- package/dist/domains/chat/tools/badges/observation-renderer.cjs.js +11 -8
- package/dist/domains/chat/tools/badges/observation-renderer.cjs.js.map +1 -1
- package/dist/domains/chat/tools/badges/observation-renderer.es.js +11 -8
- package/dist/domains/chat/tools/badges/observation-renderer.es.js.map +1 -1
- package/dist/domains/logs/components/log-data-panel.cjs.js +3 -6
- package/dist/domains/logs/components/log-data-panel.cjs.js.map +1 -1
- package/dist/domains/logs/components/log-data-panel.es.js +3 -6
- package/dist/domains/logs/components/log-data-panel.es.js.map +1 -1
- package/dist/domains/logs/components/logs-list-view.cjs.js +2 -2
- package/dist/domains/logs/components/logs-list-view.es.js +2 -2
- package/dist/domains/logs/components/no-logs-info.cjs.js +3 -4
- package/dist/domains/logs/components/no-logs-info.cjs.js.map +1 -1
- package/dist/domains/logs/components/no-logs-info.es.js +3 -4
- package/dist/domains/logs/components/no-logs-info.es.js.map +1 -1
- package/dist/domains/memory/components/flame-graph.cjs.js +7 -5
- package/dist/domains/memory/components/flame-graph.cjs.js.map +1 -1
- package/dist/domains/memory/components/flame-graph.es.js +8 -6
- package/dist/domains/memory/components/flame-graph.es.js.map +1 -1
- package/dist/domains/memory/components/memory-studio-panel.cjs.js +1 -1
- package/dist/domains/memory/components/memory-studio-panel.es.js +1 -1
- package/dist/domains/memory/components/observation-detail-view.cjs.js +4 -5
- package/dist/domains/memory/components/observation-detail-view.cjs.js.map +1 -1
- package/dist/domains/memory/components/observation-detail-view.es.js +4 -5
- package/dist/domains/memory/components/observation-detail-view.es.js.map +1 -1
- package/dist/domains/memory/components/thread-context-progress.cjs.js +1 -1
- package/dist/domains/memory/components/thread-context-progress.cjs.js.map +1 -1
- package/dist/domains/memory/components/thread-context-progress.es.js +1 -1
- package/dist/domains/memory/components/thread-context-progress.es.js.map +1 -1
- package/dist/domains/memory/lib/timeline.cjs.js +0 -9
- package/dist/domains/memory/lib/timeline.cjs.js.map +1 -1
- package/dist/domains/memory/lib/timeline.es.js +1 -9
- package/dist/domains/memory/lib/timeline.es.js.map +1 -1
- package/dist/domains/metrics/components/bar-list.cjs.js +4 -4
- package/dist/domains/metrics/components/bar-list.cjs.js.map +1 -1
- package/dist/domains/metrics/components/bar-list.es.js +4 -4
- package/dist/domains/metrics/components/bar-list.es.js.map +1 -1
- package/dist/domains/metrics/components/date-range-selector.cjs.js +1 -1
- package/dist/domains/metrics/components/date-range-selector.es.js +1 -1
- package/dist/domains/metrics/components/kpi-card-view.cjs.js.map +1 -1
- package/dist/domains/metrics/components/kpi-card-view.es.js.map +1 -1
- package/dist/domains/metrics/components/memory-card-view.cjs.js +6 -5
- package/dist/domains/metrics/components/memory-card-view.cjs.js.map +1 -1
- package/dist/domains/metrics/components/memory-card-view.es.js +5 -4
- package/dist/domains/metrics/components/memory-card-view.es.js.map +1 -1
- package/dist/domains/metrics/components/metrics-utils.cjs.js +0 -15
- package/dist/domains/metrics/components/metrics-utils.cjs.js.map +1 -1
- package/dist/domains/metrics/components/metrics-utils.es.js +1 -14
- package/dist/domains/metrics/components/metrics-utils.es.js.map +1 -1
- package/dist/domains/metrics/components/model-usage-cost-card-view.cjs.js +5 -4
- package/dist/domains/metrics/components/model-usage-cost-card-view.cjs.js.map +1 -1
- package/dist/domains/metrics/components/model-usage-cost-card-view.es.js +3 -2
- package/dist/domains/metrics/components/model-usage-cost-card-view.es.js.map +1 -1
- package/dist/domains/metrics/components/scores-card-view.cjs.js +1 -1
- package/dist/domains/metrics/components/scores-card-view.es.js +1 -1
- package/dist/domains/metrics/components/token-usage-by-agent-card-view.cjs.js +4 -3
- package/dist/domains/metrics/components/token-usage-by-agent-card-view.cjs.js.map +1 -1
- package/dist/domains/metrics/components/token-usage-by-agent-card-view.es.js +4 -3
- package/dist/domains/metrics/components/token-usage-by-agent-card-view.es.js.map +1 -1
- package/dist/domains/metrics/components/token-usage-timeline-card-view.cjs.js +3 -2
- package/dist/domains/metrics/components/token-usage-timeline-card-view.cjs.js.map +1 -1
- package/dist/domains/metrics/components/token-usage-timeline-card-view.es.js +3 -2
- package/dist/domains/metrics/components/token-usage-timeline-card-view.es.js.map +1 -1
- package/dist/domains/metrics/components/traces-volume-card-view.cjs.js +3 -2
- package/dist/domains/metrics/components/traces-volume-card-view.cjs.js.map +1 -1
- package/dist/domains/metrics/components/traces-volume-card-view.es.js +4 -3
- package/dist/domains/metrics/components/traces-volume-card-view.es.js.map +1 -1
- package/dist/domains/metrics/components.cjs.js +0 -2
- package/dist/domains/metrics/components.cjs.js.map +1 -1
- package/dist/domains/metrics/components.es.js +1 -1
- package/dist/domains/metrics/hooks/use-metrics.cjs.js +3 -3
- package/dist/domains/metrics/hooks/use-metrics.cjs.js.map +1 -1
- package/dist/domains/metrics/hooks/use-metrics.es.js +3 -3
- package/dist/domains/metrics/hooks/use-metrics.es.js.map +1 -1
- package/dist/domains/metrics/hooks/use-model-usage-cost-metrics.cjs.js +5 -5
- package/dist/domains/metrics/hooks/use-model-usage-cost-metrics.cjs.js.map +1 -1
- package/dist/domains/metrics/hooks/use-model-usage-cost-metrics.es.js +5 -5
- package/dist/domains/metrics/hooks/use-model-usage-cost-metrics.es.js.map +1 -1
- package/dist/domains/metrics/hooks/use-scores-metrics.cjs.js +6 -7
- package/dist/domains/metrics/hooks/use-scores-metrics.cjs.js.map +1 -1
- package/dist/domains/metrics/hooks/use-scores-metrics.es.js +6 -7
- package/dist/domains/metrics/hooks/use-scores-metrics.es.js.map +1 -1
- package/dist/domains/metrics/metrics-interval.cjs.js +4 -2
- package/dist/domains/metrics/metrics-interval.cjs.js.map +1 -1
- package/dist/domains/metrics/metrics-interval.es.js +4 -2
- package/dist/domains/metrics/metrics-interval.es.js.map +1 -1
- package/dist/domains/metrics.cjs.js +0 -2
- package/dist/domains/metrics.cjs.js.map +1 -1
- package/dist/domains/metrics.es.js +1 -1
- package/dist/domains/traces/components/no-traces-info.cjs.js +3 -4
- package/dist/domains/traces/components/no-traces-info.cjs.js.map +1 -1
- package/dist/domains/traces/components/no-traces-info.es.js +3 -4
- package/dist/domains/traces/components/no-traces-info.es.js.map +1 -1
- package/dist/domains/traces/components/span-data-panel-view.cjs.js +1 -1
- package/dist/domains/traces/components/span-data-panel-view.es.js +1 -1
- package/dist/domains/traces/components/span-payload/span-error-renderer.cjs.js +1 -1
- package/dist/domains/traces/components/span-payload/span-error-renderer.es.js +1 -1
- package/dist/domains/traces/components/span-payload/span-input-renderers.cjs.js +1 -1
- package/dist/domains/traces/components/span-payload/span-input-renderers.es.js +1 -1
- package/dist/domains/traces/components/span-payload/span-output-renderers.cjs.js +3 -2
- package/dist/domains/traces/components/span-payload/span-output-renderers.cjs.js.map +1 -1
- package/dist/domains/traces/components/span-payload/span-output-renderers.es.js +3 -2
- package/dist/domains/traces/components/span-payload/span-output-renderers.es.js.map +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-json.cjs.js +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-json.cjs.js.map +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-json.es.js +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-json.es.js.map +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-messages.cjs.js +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-messages.es.js +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-primitives.cjs.js +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-primitives.es.js +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-processor.cjs.js +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-processor.es.js +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-tool.cjs.js +2 -2
- package/dist/domains/traces/components/span-payload/span-payload-tool.es.js +2 -2
- package/dist/domains/traces/components/span-payload/span-processor-attributes.cjs.js +3 -2
- package/dist/domains/traces/components/span-payload/span-processor-attributes.cjs.js.map +1 -1
- package/dist/domains/traces/components/span-payload/span-processor-attributes.es.js +3 -2
- package/dist/domains/traces/components/span-payload/span-processor-attributes.es.js.map +1 -1
- package/dist/domains/traces/components/span-summary-description.cjs.js +6 -4
- package/dist/domains/traces/components/span-summary-description.cjs.js.map +1 -1
- package/dist/domains/traces/components/span-summary-description.es.js +7 -5
- package/dist/domains/traces/components/span-summary-description.es.js.map +1 -1
- package/dist/domains/traces/components/span-timeline-row.cjs.js +3 -4
- package/dist/domains/traces/components/span-timeline-row.cjs.js.map +1 -1
- package/dist/domains/traces/components/span-timeline-row.es.js +3 -4
- package/dist/domains/traces/components/span-timeline-row.es.js.map +1 -1
- package/dist/domains/traces/components/span-timing-hover-card.cjs.js +6 -11
- package/dist/domains/traces/components/span-timing-hover-card.cjs.js.map +1 -1
- package/dist/domains/traces/components/span-timing-hover-card.es.js +6 -11
- package/dist/domains/traces/components/span-timing-hover-card.es.js.map +1 -1
- package/dist/domains/traces/components/thread-trace/thread-trace-details.cjs.js +1 -1
- package/dist/domains/traces/components/thread-trace/thread-trace-details.es.js +1 -1
- package/dist/domains/traces/components/thread-trace/thread-trace-messages.cjs.js +1 -1
- package/dist/domains/traces/components/thread-trace/thread-trace-messages.es.js +1 -1
- package/dist/domains/traces/components/timeline-timing-col.cjs.js +3 -4
- package/dist/domains/traces/components/timeline-timing-col.cjs.js.map +1 -1
- package/dist/domains/traces/components/timeline-timing-col.es.js +3 -4
- package/dist/domains/traces/components/timeline-timing-col.es.js.map +1 -1
- package/dist/domains/traces/components/trace-columns-menu.cjs.js +21 -18
- package/dist/domains/traces/components/trace-columns-menu.cjs.js.map +1 -1
- package/dist/domains/traces/components/trace-columns-menu.es.js +21 -18
- package/dist/domains/traces/components/trace-columns-menu.es.js.map +1 -1
- package/dist/domains/traces/components/trace-data-panel-view.cjs.js +2 -2
- package/dist/domains/traces/components/trace-data-panel-view.es.js +2 -2
- package/dist/domains/traces/components/trace-id-button.cjs.js +1 -1
- package/dist/domains/traces/components/trace-id-button.es.js +1 -1
- package/dist/domains/traces/components/trace-span-timeline.cjs.js +10 -4
- package/dist/domains/traces/components/trace-span-timeline.cjs.js.map +1 -1
- package/dist/domains/traces/components/trace-span-timeline.es.js +10 -4
- package/dist/domains/traces/components/trace-span-timeline.es.js.map +1 -1
- package/dist/domains/traces/components/trace-span-tree.cjs.js +3 -4
- package/dist/domains/traces/components/trace-span-tree.cjs.js.map +1 -1
- package/dist/domains/traces/components/trace-span-tree.es.js +3 -4
- package/dist/domains/traces/components/trace-span-tree.es.js.map +1 -1
- package/dist/domains/traces/components/trace-summary-description.cjs.js +13 -10
- package/dist/domains/traces/components/trace-summary-description.cjs.js.map +1 -1
- package/dist/domains/traces/components/trace-summary-description.es.js +13 -10
- package/dist/domains/traces/components/trace-summary-description.es.js.map +1 -1
- package/dist/domains/traces/components/trace-time-range-chip.cjs.js +1 -1
- package/dist/domains/traces/components/trace-time-range-chip.es.js +1 -1
- package/dist/domains/traces/components/traces-list-view.cjs.js +12 -10
- package/dist/domains/traces/components/traces-list-view.cjs.js.map +1 -1
- package/dist/domains/traces/components/traces-list-view.es.js +12 -10
- package/dist/domains/traces/components/traces-list-view.es.js.map +1 -1
- package/dist/domains/traces/components/traces-page-skeleton.cjs.js +1 -1
- package/dist/domains/traces/components/traces-page-skeleton.es.js +1 -1
- package/dist/domains/traces/hooks/use-branch.cjs.js +0 -1
- package/dist/domains/traces/hooks/use-branch.cjs.js.map +1 -1
- package/dist/domains/traces/hooks/use-branch.es.js +0 -1
- package/dist/domains/traces/hooks/use-branch.es.js.map +1 -1
- package/dist/domains/traces/hooks/use-trace-light-spans.cjs.js +0 -1
- package/dist/domains/traces/hooks/use-trace-light-spans.cjs.js.map +1 -1
- package/dist/domains/traces/hooks/use-trace-light-spans.es.js +0 -1
- package/dist/domains/traces/hooks/use-trace-light-spans.es.js.map +1 -1
- package/dist/domains/traces/hooks/use-trace-query.cjs.js +63 -3
- package/dist/domains/traces/hooks/use-trace-query.cjs.js.map +1 -1
- package/dist/domains/traces/hooks/use-trace-query.es.js +61 -4
- package/dist/domains/traces/hooks/use-trace-query.es.js.map +1 -1
- package/dist/domains/traces/hooks/use-trace-search.cjs.js +0 -1
- package/dist/domains/traces/hooks/use-trace-search.cjs.js.map +1 -1
- package/dist/domains/traces/hooks/use-trace-search.es.js +0 -1
- package/dist/domains/traces/hooks/use-trace-search.es.js.map +1 -1
- package/dist/domains/traces/hooks/use-trace-spans.cjs.js +0 -1
- package/dist/domains/traces/hooks/use-trace-spans.cjs.js.map +1 -1
- package/dist/domains/traces/hooks/use-trace-spans.es.js +0 -1
- package/dist/domains/traces/hooks/use-trace-spans.es.js.map +1 -1
- package/dist/domains/traces/hooks/use-traces-list-source.cjs.js +42 -0
- package/dist/domains/traces/hooks/use-traces-list-source.cjs.js.map +1 -0
- package/dist/domains/traces/hooks/use-traces-list-source.d.ts +2 -0
- package/dist/domains/traces/hooks/use-traces-list-source.es.js +38 -0
- package/dist/domains/traces/hooks/use-traces-list-source.es.js.map +1 -0
- package/dist/domains/traces/hooks.cjs.js +2 -0
- package/dist/domains/traces/hooks.cjs.js.map +1 -1
- package/dist/domains/traces/hooks.es.js +1 -0
- package/dist/domains/traces/hooks.es.js.map +1 -1
- package/dist/domains/traces/trace-filters.cjs.js +10 -1
- package/dist/domains/traces/trace-filters.cjs.js.map +1 -1
- package/dist/domains/traces/trace-filters.es.js +10 -1
- package/dist/domains/traces/trace-filters.es.js.map +1 -1
- package/dist/domains/traces/utils/span-utils.cjs.js +4 -36
- package/dist/domains/traces/utils/span-utils.cjs.js.map +1 -1
- package/dist/domains/traces/utils/span-utils.es.js +4 -32
- package/dist/domains/traces/utils/span-utils.es.js.map +1 -1
- package/dist/domains/traces/utils.cjs.js +1 -1
- package/dist/domains/traces/utils.es.js +1 -1
- package/dist/domains/traces.cjs.js +3 -1
- package/dist/domains/traces.cjs.js.map +1 -1
- package/dist/domains/traces.es.js +2 -1
- package/dist/domains/traces.es.js.map +1 -1
- package/dist/ee/signals/components/entity-index-list.cjs.js +1 -1
- package/dist/ee/signals/components/entity-index-list.es.js +1 -1
- package/dist/ee/signals/components/entity-index-model.cjs.js +3 -2
- package/dist/ee/signals/components/entity-index-model.cjs.js.map +1 -1
- package/dist/ee/signals/components/entity-index-model.es.js +3 -2
- package/dist/ee/signals/components/entity-index-model.es.js.map +1 -1
- package/dist/ee/signals/components/trace-intelligence-entity-index.cjs.js +2 -2
- package/dist/ee/signals/components/trace-intelligence-entity-index.es.js +2 -2
- package/dist/ee/signals/settings/signal-definition-form-dialog.cjs.js +2 -2
- package/dist/ee/signals/settings/signal-definition-form-dialog.es.js +2 -2
- package/dist/ee/signals/signal-formatting.cjs.js +6 -34
- package/dist/ee/signals/signal-formatting.cjs.js.map +1 -1
- package/dist/ee/signals/signal-formatting.es.js +6 -34
- package/dist/ee/signals/signal-formatting.es.js.map +1 -1
- package/dist/ee/signals/snapshot-timeline-data.cjs.js +1 -1
- package/dist/ee/signals/snapshot-timeline-data.cjs.js.map +1 -1
- package/dist/ee/signals/snapshot-timeline-data.es.js +1 -1
- package/dist/ee/signals/snapshot-timeline-data.es.js.map +1 -1
- package/dist/ee/signals/view-mode-tab.cjs.js +1 -1
- package/dist/ee/signals/view-mode-tab.es.js +1 -1
- package/dist/ee/topics/components/topic-trace-summary-list.cjs.js +1 -1
- package/dist/ee/topics/components/topic-trace-summary-list.es.js +1 -1
- package/dist/field-block-error-msg-Y0fi0HUC.js +22 -0
- package/dist/field-block-error-msg-Y0fi0HUC.js.map +1 -0
- package/dist/field-block-error-msg-oudJz2Hx.cjs +24 -0
- package/dist/field-block-error-msg-oudJz2Hx.cjs.map +1 -0
- package/dist/{field-error-id-DyWx33Fu.js → field-error-id-DD7OARLU.js} +2 -13
- package/dist/field-error-id-DD7OARLU.js.map +1 -0
- package/dist/{field-error-id-6EfqmQ4C.cjs → field-error-id-V_WejsRL.cjs} +4 -15
- package/dist/field-error-id-V_WejsRL.cjs.map +1 -0
- package/dist/hooks/use-elapsed-time.cjs.js +25 -0
- package/dist/hooks/use-elapsed-time.cjs.js.map +1 -0
- package/dist/hooks/use-elapsed-time.d.ts +2 -0
- package/dist/hooks/use-elapsed-time.es.js +21 -0
- package/dist/hooks/use-elapsed-time.es.js.map +1 -0
- package/dist/inline-code-BW6W121s.js +13 -0
- package/dist/inline-code-BW6W121s.js.map +1 -0
- package/dist/inline-code-CSwG-x8D.cjs +15 -0
- package/dist/inline-code-CSwG-x8D.cjs.map +1 -0
- package/dist/layout/tabbed-container.cjs.js +3 -3
- package/dist/layout/tabbed-container.es.js +3 -3
- package/dist/{list-search-S1mco9Bl.cjs → list-search-CsYQX8qR.cjs} +2 -2
- package/dist/{list-search-S1mco9Bl.cjs.map → list-search-CsYQX8qR.cjs.map} +1 -1
- package/dist/{list-search-FJ1O5F3S.js → list-search-D1FD8FCL.js} +2 -2
- package/dist/{list-search-FJ1O5F3S.js.map → list-search-D1FD8FCL.js.map} +1 -1
- package/dist/{logs-data-list-CgDcNIvS.js → logs-data-list-BKE5vYZR.js} +3 -3
- package/dist/{logs-data-list-CgDcNIvS.js.map → logs-data-list-BKE5vYZR.js.map} +1 -1
- package/dist/{logs-data-list-BHvJOeec.cjs → logs-data-list-lJK0yGYj.cjs} +3 -3
- package/dist/{logs-data-list-BHvJOeec.cjs.map → logs-data-list-lJK0yGYj.cjs.map} +1 -1
- package/dist/new/settings.cjs.js +2 -2
- package/dist/new/settings.es.js +2 -2
- package/dist/{schemes-C9EhSOkB.js → schemes-CGK3gQJ6.js} +2 -2
- package/dist/{schemes-C9EhSOkB.js.map → schemes-CGK3gQJ6.js.map} +1 -1
- package/dist/{search-field-block-fU3tStmB.js → search-field-block-Dj2KJyjQ.js} +2 -2
- package/dist/{search-field-block-fU3tStmB.js.map → search-field-block-Dj2KJyjQ.js.map} +1 -1
- package/dist/{search-field-block-7-ufp4uG.cjs → search-field-block-K_e_S9WY.cjs} +2 -2
- package/dist/{search-field-block-7-ufp4uG.cjs.map → search-field-block-K_e_S9WY.cjs.map} +1 -1
- package/dist/{section-B9OLuEq3.js → section-Bi0g7cn6.js} +2 -2
- package/dist/{section-B9OLuEq3.js.map → section-Bi0g7cn6.js.map} +1 -1
- package/dist/{section-CTihfzmc.cjs → section-p9vCSmPq.cjs} +2 -2
- package/dist/{section-CTihfzmc.cjs.map → section-p9vCSmPq.cjs.map} +1 -1
- package/dist/{select-field-block-BfiHq9t6.js → select-field-block-BF8v698d.js} +2 -2
- package/dist/{select-field-block-BfiHq9t6.js.map → select-field-block-BF8v698d.js.map} +1 -1
- package/dist/{select-field-block-DJo2cX9Y.cjs → select-field-block-CaGjpIKM.cjs} +2 -2
- package/dist/{select-field-block-DJo2cX9Y.cjs.map → select-field-block-CaGjpIKM.cjs.map} +1 -1
- package/dist/{settings-row-BoAuUUuH.cjs → settings-row-Cr8gaO5a.cjs} +14 -4
- package/dist/settings-row-Cr8gaO5a.cjs.map +1 -0
- package/dist/{settings-row-B2IekRyH.js → settings-row-Cr9DsBSX.js} +14 -4
- package/dist/settings-row-Cr9DsBSX.js.map +1 -0
- package/dist/{span-payload-primitives-Buq9V8nK.js → span-payload-primitives-Dmzm3mb2.js} +2 -2
- package/dist/{span-payload-primitives-Buq9V8nK.js.map → span-payload-primitives-Dmzm3mb2.js.map} +1 -1
- package/dist/{span-payload-primitives-CjlNH9C-.cjs → span-payload-primitives-Dq8WqqNm.cjs} +2 -2
- package/dist/{span-payload-primitives-CjlNH9C-.cjs.map → span-payload-primitives-Dq8WqqNm.cjs.map} +1 -1
- package/dist/src/domains/capabilities/hooks/index.d.ts +3 -0
- package/dist/src/domains/capabilities/hooks/use-feedback-available.d.ts +8 -0
- package/dist/src/domains/capabilities/hooks/use-observability-capabilities.d.ts +22 -0
- package/dist/src/domains/capabilities/hooks/use-trace-query-available.d.ts +8 -0
- package/dist/src/domains/capabilities/index.d.ts +1 -0
- package/dist/src/domains/chat/messages/reasoning.d.ts +3 -1
- package/dist/src/domains/chat/messages/renderers/reasoning-part-renderer.d.ts +3 -1
- package/dist/src/domains/chat/stories/reasoning.stories.d.ts +1 -1
- package/dist/src/domains/memory/lib/timeline.d.ts +0 -1
- package/dist/src/domains/metrics/components/index.d.ts +1 -1
- package/dist/src/domains/metrics/components/kpi-card-view.d.ts +2 -1
- package/dist/src/domains/metrics/components/metrics-utils.d.ts +0 -2
- package/dist/src/domains/traces/components/trace-columns-menu.d.ts +3 -1
- package/dist/src/domains/traces/components/trace-data-panel-view.stories.d.ts +1 -1
- package/dist/src/domains/traces/hooks/index.d.ts +1 -0
- package/dist/src/domains/traces/hooks/use-trace-query.d.ts +19 -2
- package/dist/src/domains/traces/hooks/use-traces-list-source.d.ts +46 -0
- package/dist/src/domains/traces/trace-filters.d.ts +6 -1
- package/dist/src/domains/traces/utils/index.d.ts +1 -1
- package/dist/src/domains/traces/utils/span-utils.d.ts +1 -6
- package/dist/src/ds/components/Card/Card.d.ts +2 -2
- package/dist/src/ds/components/CompactNumber/compact-number.d.ts +6 -0
- package/dist/src/ds/components/CompactNumber/compact-number.stories.d.ts +7 -0
- package/dist/src/ds/components/CompactNumber/index.d.ts +1 -0
- package/dist/src/ds/components/DataList/data-list-cells.d.ts +4 -3
- package/dist/src/ds/components/InlineCode/index.d.ts +1 -0
- package/dist/src/ds/components/InlineCode/inline-code.d.ts +3 -0
- package/dist/src/ds/components/InlineCode/inline-code.stories.d.ts +13 -0
- package/dist/src/ds/components/ItemList/item-list-date-cell.d.ts +3 -2
- package/dist/src/ds/components/RelativeTimestamp/index.d.ts +1 -0
- package/dist/src/ds/components/RelativeTimestamp/relative-timestamp.d.ts +6 -0
- package/dist/src/ds/components/RelativeTimestamp/relative-timestamp.stories.d.ts +7 -0
- package/dist/src/ds/components/StatusIndicators/status-dot-styles.d.ts +31 -2
- package/dist/src/ds/components/StatusIndicators/status-dot.stories.d.ts +3 -4
- package/dist/src/ds/components/StatusIndicators/status.d.ts +2 -3
- package/dist/src/ds/components/StatusIndicators/status.stories.d.ts +2 -1
- package/dist/src/ds/components/Txt/Txt.d.ts +5 -1
- package/dist/src/ds/new/settings/settings-row.d.ts +3 -1
- package/dist/src/ds/new/settings/settings.stories.d.ts +1 -0
- package/dist/src/hooks/stories/state/use-elapsed-time.stories.d.ts +17 -0
- package/dist/src/hooks/use-elapsed-time.d.ts +2 -0
- package/dist/src/lib/cost.d.ts +6 -0
- package/dist/src/utils/cost.d.ts +1 -0
- package/dist/src/utils/date-format.d.ts +28 -0
- package/dist/src/utils/duration.d.ts +7 -1
- package/dist/src/utils/relative-time.d.ts +7 -0
- package/dist/style.css +25 -4
- package/dist/{text-field-block-DGIM1i3Z.js → text-field-block-BYPiO9h4.js} +2 -2
- package/dist/{text-field-block-DGIM1i3Z.js.map → text-field-block-BYPiO9h4.js.map} +1 -1
- package/dist/{text-field-block-DePCgDOh.cjs → text-field-block-CRh8sRXP.cjs} +2 -2
- package/dist/{text-field-block-DePCgDOh.cjs.map → text-field-block-CRh8sRXP.cjs.map} +1 -1
- package/dist/{tool-call-Bs-9Cah5.js → tool-call-CIeNEYpK.js} +2 -2
- package/dist/{tool-call-Bs-9Cah5.js.map → tool-call-CIeNEYpK.js.map} +1 -1
- package/dist/{tool-call-C0JeHe8Z.cjs → tool-call-CnEm3eE0.cjs} +2 -2
- package/dist/{tool-call-C0JeHe8Z.cjs.map → tool-call-CnEm3eE0.cjs.map} +1 -1
- package/dist/{traces-data-list-D3k50j4n.cjs → traces-data-list-C5KZesk6.cjs} +4 -4
- package/dist/{traces-data-list-D3k50j4n.cjs.map → traces-data-list-C5KZesk6.cjs.map} +1 -1
- package/dist/{traces-data-list-B5MkMMBi.js → traces-data-list-CdWW9J6z.js} +4 -4
- package/dist/{traces-data-list-B5MkMMBi.js.map → traces-data-list-CdWW9J6z.js.map} +1 -1
- package/dist/utils/cost.cjs.js +40 -0
- package/dist/utils/cost.cjs.js.map +1 -0
- package/dist/utils/cost.d.ts +2 -0
- package/dist/utils/cost.es.js +34 -0
- package/dist/utils/cost.es.js.map +1 -0
- package/dist/utils/date-format.cjs.js +99 -0
- package/dist/utils/date-format.cjs.js.map +1 -0
- package/dist/utils/date-format.d.ts +2 -0
- package/dist/utils/date-format.es.js +91 -0
- package/dist/utils/date-format.es.js.map +1 -0
- package/dist/utils/duration.cjs.js +19 -2
- package/dist/utils/duration.cjs.js.map +1 -1
- package/dist/utils/duration.es.js +18 -3
- package/dist/utils/duration.es.js.map +1 -1
- package/dist/utils/file.es.js +2 -2
- package/dist/utils/relative-time.cjs.js +12 -0
- package/dist/utils/relative-time.cjs.js.map +1 -0
- package/dist/utils/relative-time.d.ts +2 -0
- package/dist/utils/relative-time.es.js +8 -0
- package/dist/utils/relative-time.es.js.map +1 -0
- package/package.json +8 -8
- package/dist/Txt-B4-2nLaI.cjs.map +0 -1
- package/dist/Txt-DTh3Pa_a.js.map +0 -1
- package/dist/data-list-top-DpbOA3uw.js.map +0 -1
- package/dist/data-list-top-WGUY167p.cjs.map +0 -1
- package/dist/field-error-id-6EfqmQ4C.cjs.map +0 -1
- package/dist/field-error-id-DyWx33Fu.js.map +0 -1
- package/dist/settings-row-B2IekRyH.js.map +0 -1
- package/dist/settings-row-BoAuUUuH.cjs.map +0 -1
- package/dist/src/ds/components/Table/utils.d.ts +0 -4
|
@@ -10,6 +10,7 @@ const tabsContent = require('../../../tabs-content-DlCJoQUW.cjs');
|
|
|
10
10
|
const tabsRoot = require('../../../tabs-root-COCL6jcx.cjs');
|
|
11
11
|
const tabsTab = require('../../../tabs-tab-DFmRMdi3.cjs');
|
|
12
12
|
const domains_metrics_components_metricsUtils = require('./metrics-utils.cjs.js');
|
|
13
|
+
const utils_cost = require('../../../utils/cost.cjs.js');
|
|
13
14
|
|
|
14
15
|
function isTokenUsageTab(value) {
|
|
15
16
|
return value === "tokens" || value === "cost";
|
|
@@ -41,7 +42,7 @@ function TokenUsageByAgentCardView({
|
|
|
41
42
|
description: "Token consumption grouped by agent."
|
|
42
43
|
}
|
|
43
44
|
),
|
|
44
|
-
hasData && (activeTab === "cost" && hasCostData ? /* @__PURE__ */ jsxRuntime.jsx(metricsCard.MetricsCard.Summary, { value:
|
|
45
|
+
hasData && (activeTab === "cost" && hasCostData ? /* @__PURE__ */ jsxRuntime.jsx(metricsCard.MetricsCard.Summary, { value: utils_cost.formatCost(totalCost, costUnit), label: "Total cost" }) : /* @__PURE__ */ jsxRuntime.jsx(metricsCard.MetricsCard.Summary, { value: utils_cost.formatCompactNumber(totalTokens), label: "Total tokens" })),
|
|
45
46
|
hasData && actions ? /* @__PURE__ */ jsxRuntime.jsx(metricsCard.MetricsCard.Actions, { children: actions }) : null
|
|
46
47
|
] }),
|
|
47
48
|
isLoading ? /* @__PURE__ */ jsxRuntime.jsx(metricsCard.MetricsCard.Loading, {}) : isError ? /* @__PURE__ */ jsxRuntime.jsx(metricsCard.MetricsCard.Error, { message: "Failed to load token usage data" }) : /* @__PURE__ */ jsxRuntime.jsx(metricsCard.MetricsCard.Content, { children: !hasData ? /* @__PURE__ */ jsxRuntime.jsx(metricsCard.MetricsCard.NoData, { message: "No token usage data yet" }) : /* @__PURE__ */ jsxRuntime.jsxs(
|
|
@@ -72,7 +73,7 @@ function TokenUsageByAgentCardView({
|
|
|
72
73
|
{ label: "Output", color: domains_metrics_components_metricsUtils.CHART_COLORS.blue }
|
|
73
74
|
],
|
|
74
75
|
maxVal: Math.max(...rows.map((d) => d.input + d.output)),
|
|
75
|
-
fmt:
|
|
76
|
+
fmt: utils_cost.formatCompactNumber
|
|
76
77
|
}
|
|
77
78
|
) }),
|
|
78
79
|
/* @__PURE__ */ jsxRuntime.jsx(tabsContent.TabContent, { value: "cost", className: "pt-3", children: hasCostData ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -82,7 +83,7 @@ function TokenUsageByAgentCardView({
|
|
|
82
83
|
data: costRows.slice().sort((a, b) => (b.cost ?? 0) - (a.cost ?? 0)).map((d) => ({ name: d.name, values: [d.cost], href: getRowHref?.(d) })),
|
|
83
84
|
segments: [{ label: "Cost", color: domains_metrics_components_metricsUtils.CHART_COLORS.purple }],
|
|
84
85
|
maxVal: Math.max(...costRows.map((d) => d.cost ?? 0)),
|
|
85
|
-
fmt: (v) =>
|
|
86
|
+
fmt: (v) => utils_cost.formatCost(v, costUnit)
|
|
86
87
|
}
|
|
87
88
|
) : /* @__PURE__ */ jsxRuntime.jsx(metricsCard.MetricsCard.NoData, { message: "No cost data yet" }) })
|
|
88
89
|
]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-usage-by-agent-card-view.cjs.js","sources":["../../../../src/domains/metrics/components/token-usage-by-agent-card-view.tsx"],"sourcesContent":["import { useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { HorizontalBars } from '../../../ds/components/HorizontalBars/horizontal-bars';\nimport { MetricsCard } from '../../../ds/components/MetricsCard/metrics-card';\nimport { TabContent } from '../../../ds/components/Tabs/tabs-content';\nimport { TabList } from '../../../ds/components/Tabs/tabs-list';\nimport { Tabs } from '../../../ds/components/Tabs/tabs-root';\nimport { Tab } from '../../../ds/components/Tabs/tabs-tab';\nimport type { LinkComponent } from '../../../ds/types/link-component';\nimport type { TokenUsageByAgentRow } from '../hooks/use-token-usage-by-agent-metrics';\nimport { CHART_COLORS
|
|
1
|
+
{"version":3,"file":"token-usage-by-agent-card-view.cjs.js","sources":["../../../../src/domains/metrics/components/token-usage-by-agent-card-view.tsx"],"sourcesContent":["import { useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { HorizontalBars } from '../../../ds/components/HorizontalBars/horizontal-bars';\nimport { MetricsCard } from '../../../ds/components/MetricsCard/metrics-card';\nimport { TabContent } from '../../../ds/components/Tabs/tabs-content';\nimport { TabList } from '../../../ds/components/Tabs/tabs-list';\nimport { Tabs } from '../../../ds/components/Tabs/tabs-root';\nimport { Tab } from '../../../ds/components/Tabs/tabs-tab';\nimport type { LinkComponent } from '../../../ds/types/link-component';\nimport type { TokenUsageByAgentRow } from '../hooks/use-token-usage-by-agent-metrics';\nimport { CHART_COLORS } from './metrics-utils';\nimport { formatCompactNumber, formatCost } from '@/lib/cost';\n\nexport interface TokenUsageByAgentCardViewProps {\n data: TokenUsageByAgentRow[] | undefined;\n isLoading: boolean;\n isError: boolean;\n /** Optional drilldown: returns an href for a single row in either tab. */\n getRowHref?: (row: TokenUsageByAgentRow) => string | undefined;\n /** Optional slot for top-bar action buttons. */\n actions?: ReactNode;\n /** Override how drilldown links are rendered. Defaults to `<a>`. */\n LinkComponent?: LinkComponent;\n}\n\ntype TokenUsageTab = 'tokens' | 'cost';\n\nfunction isTokenUsageTab(value: string): value is TokenUsageTab {\n return value === 'tokens' || value === 'cost';\n}\n\nexport function TokenUsageByAgentCardView({\n data,\n isLoading,\n isError,\n getRowHref,\n actions,\n LinkComponent,\n}: TokenUsageByAgentCardViewProps) {\n const [activeTab, setActiveTab] = useState<TokenUsageTab>('tokens');\n\n const rows = data ?? [];\n const hasData = rows.length > 0;\n const totalTokens = rows.reduce((s, d) => s + d.total, 0);\n const costRows = rows.filter((d): d is TokenUsageByAgentRow & { cost: number } => d.cost != null && d.cost > 0);\n const uniqueCostUnits = new Set(costRows.map(d => d.costUnit ?? 'usd'));\n const hasSingleCostUnit = uniqueCostUnits.size <= 1;\n const costUnit = hasSingleCostUnit ? ([...uniqueCostUnits][0] ?? 'usd') : null;\n const totalCost = hasSingleCostUnit ? costRows.reduce((s, d) => s + (d.cost ?? 0), 0) : 0;\n const hasCostData = hasSingleCostUnit && totalCost > 0;\n\n return (\n <MetricsCard>\n <MetricsCard.TopBar>\n <MetricsCard.TitleAndDescription\n title=\"Token Usage by Agent\"\n description=\"Token consumption grouped by agent.\"\n />\n {hasData &&\n (activeTab === 'cost' && hasCostData ? (\n <MetricsCard.Summary value={formatCost(totalCost, costUnit)} label=\"Total cost\" />\n ) : (\n <MetricsCard.Summary value={formatCompactNumber(totalTokens)} label=\"Total tokens\" />\n ))}\n {hasData && actions ? <MetricsCard.Actions>{actions}</MetricsCard.Actions> : null}\n </MetricsCard.TopBar>\n {isLoading ? (\n <MetricsCard.Loading />\n ) : isError ? (\n <MetricsCard.Error message=\"Failed to load token usage data\" />\n ) : (\n <MetricsCard.Content>\n {!hasData ? (\n <MetricsCard.NoData message=\"No token usage data yet\" />\n ) : (\n <Tabs\n defaultTab=\"tokens\"\n value={activeTab}\n onValueChange={v => {\n if (isTokenUsageTab(v)) setActiveTab(v);\n }}\n className=\"grid h-full grid-rows-[auto_1fr] overflow-y-auto\"\n >\n <TabList>\n <Tab value=\"tokens\">Tokens</Tab>\n <Tab value=\"cost\">Cost</Tab>\n </TabList>\n <TabContent value=\"tokens\" className=\"pt-3\">\n <HorizontalBars\n LinkComponent={LinkComponent}\n data={rows.map(d => ({\n name: d.name,\n values: [d.input, d.output],\n href: getRowHref?.(d),\n }))}\n segments={[\n { label: 'Input', color: CHART_COLORS.blueDark },\n { label: 'Output', color: CHART_COLORS.blue },\n ]}\n maxVal={Math.max(...rows.map(d => d.input + d.output))}\n fmt={formatCompactNumber}\n />\n </TabContent>\n <TabContent value=\"cost\" className=\"pt-3\">\n {hasCostData ? (\n <HorizontalBars\n LinkComponent={LinkComponent}\n data={costRows\n .slice()\n .sort((a, b) => (b.cost ?? 0) - (a.cost ?? 0))\n .map(d => ({ name: d.name, values: [d.cost], href: getRowHref?.(d) }))}\n segments={[{ label: 'Cost', color: CHART_COLORS.purple }]}\n maxVal={Math.max(...costRows.map(d => d.cost ?? 0))}\n fmt={v => formatCost(v, costUnit)}\n />\n ) : (\n <MetricsCard.NoData message=\"No cost data yet\" />\n )}\n </TabContent>\n </Tabs>\n )}\n </MetricsCard.Content>\n )}\n </MetricsCard>\n );\n}\n"],"names":["useState","MetricsCard","jsxs","jsx","formatCost","formatCompactNumber","Tabs","TabList","Tab","TabContent","HorizontalBars","CHART_COLORS"],"mappings":"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"}
|
|
@@ -5,7 +5,8 @@ import { M as MetricsCard } from '../../../metrics-card-C2RTi5Ew.js';
|
|
|
5
5
|
import { T as TabContent } from '../../../tabs-content-7ODUUdQ0.js';
|
|
6
6
|
import { a as Tabs, T as TabList } from '../../../tabs-root-UNPxoGhW.js';
|
|
7
7
|
import { T as Tab } from '../../../tabs-tab-DluwCnDF.js';
|
|
8
|
-
import {
|
|
8
|
+
import { CHART_COLORS } from './metrics-utils.es.js';
|
|
9
|
+
import { formatCost, formatCompactNumber } from '../../../utils/cost.es.js';
|
|
9
10
|
|
|
10
11
|
function isTokenUsageTab(value) {
|
|
11
12
|
return value === "tokens" || value === "cost";
|
|
@@ -37,7 +38,7 @@ function TokenUsageByAgentCardView({
|
|
|
37
38
|
description: "Token consumption grouped by agent."
|
|
38
39
|
}
|
|
39
40
|
),
|
|
40
|
-
hasData && (activeTab === "cost" && hasCostData ? /* @__PURE__ */ jsx(MetricsCard.Summary, { value: formatCost(totalCost, costUnit), label: "Total cost" }) : /* @__PURE__ */ jsx(MetricsCard.Summary, { value:
|
|
41
|
+
hasData && (activeTab === "cost" && hasCostData ? /* @__PURE__ */ jsx(MetricsCard.Summary, { value: formatCost(totalCost, costUnit), label: "Total cost" }) : /* @__PURE__ */ jsx(MetricsCard.Summary, { value: formatCompactNumber(totalTokens), label: "Total tokens" })),
|
|
41
42
|
hasData && actions ? /* @__PURE__ */ jsx(MetricsCard.Actions, { children: actions }) : null
|
|
42
43
|
] }),
|
|
43
44
|
isLoading ? /* @__PURE__ */ jsx(MetricsCard.Loading, {}) : isError ? /* @__PURE__ */ jsx(MetricsCard.Error, { message: "Failed to load token usage data" }) : /* @__PURE__ */ jsx(MetricsCard.Content, { children: !hasData ? /* @__PURE__ */ jsx(MetricsCard.NoData, { message: "No token usage data yet" }) : /* @__PURE__ */ jsxs(
|
|
@@ -68,7 +69,7 @@ function TokenUsageByAgentCardView({
|
|
|
68
69
|
{ label: "Output", color: CHART_COLORS.blue }
|
|
69
70
|
],
|
|
70
71
|
maxVal: Math.max(...rows.map((d) => d.input + d.output)),
|
|
71
|
-
fmt:
|
|
72
|
+
fmt: formatCompactNumber
|
|
72
73
|
}
|
|
73
74
|
) }),
|
|
74
75
|
/* @__PURE__ */ jsx(TabContent, { value: "cost", className: "pt-3", children: hasCostData ? /* @__PURE__ */ jsx(
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-usage-by-agent-card-view.es.js","sources":["../../../../src/domains/metrics/components/token-usage-by-agent-card-view.tsx"],"sourcesContent":["import { useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { HorizontalBars } from '../../../ds/components/HorizontalBars/horizontal-bars';\nimport { MetricsCard } from '../../../ds/components/MetricsCard/metrics-card';\nimport { TabContent } from '../../../ds/components/Tabs/tabs-content';\nimport { TabList } from '../../../ds/components/Tabs/tabs-list';\nimport { Tabs } from '../../../ds/components/Tabs/tabs-root';\nimport { Tab } from '../../../ds/components/Tabs/tabs-tab';\nimport type { LinkComponent } from '../../../ds/types/link-component';\nimport type { TokenUsageByAgentRow } from '../hooks/use-token-usage-by-agent-metrics';\nimport { CHART_COLORS
|
|
1
|
+
{"version":3,"file":"token-usage-by-agent-card-view.es.js","sources":["../../../../src/domains/metrics/components/token-usage-by-agent-card-view.tsx"],"sourcesContent":["import { useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { HorizontalBars } from '../../../ds/components/HorizontalBars/horizontal-bars';\nimport { MetricsCard } from '../../../ds/components/MetricsCard/metrics-card';\nimport { TabContent } from '../../../ds/components/Tabs/tabs-content';\nimport { TabList } from '../../../ds/components/Tabs/tabs-list';\nimport { Tabs } from '../../../ds/components/Tabs/tabs-root';\nimport { Tab } from '../../../ds/components/Tabs/tabs-tab';\nimport type { LinkComponent } from '../../../ds/types/link-component';\nimport type { TokenUsageByAgentRow } from '../hooks/use-token-usage-by-agent-metrics';\nimport { CHART_COLORS } from './metrics-utils';\nimport { formatCompactNumber, formatCost } from '@/lib/cost';\n\nexport interface TokenUsageByAgentCardViewProps {\n data: TokenUsageByAgentRow[] | undefined;\n isLoading: boolean;\n isError: boolean;\n /** Optional drilldown: returns an href for a single row in either tab. */\n getRowHref?: (row: TokenUsageByAgentRow) => string | undefined;\n /** Optional slot for top-bar action buttons. */\n actions?: ReactNode;\n /** Override how drilldown links are rendered. Defaults to `<a>`. */\n LinkComponent?: LinkComponent;\n}\n\ntype TokenUsageTab = 'tokens' | 'cost';\n\nfunction isTokenUsageTab(value: string): value is TokenUsageTab {\n return value === 'tokens' || value === 'cost';\n}\n\nexport function TokenUsageByAgentCardView({\n data,\n isLoading,\n isError,\n getRowHref,\n actions,\n LinkComponent,\n}: TokenUsageByAgentCardViewProps) {\n const [activeTab, setActiveTab] = useState<TokenUsageTab>('tokens');\n\n const rows = data ?? [];\n const hasData = rows.length > 0;\n const totalTokens = rows.reduce((s, d) => s + d.total, 0);\n const costRows = rows.filter((d): d is TokenUsageByAgentRow & { cost: number } => d.cost != null && d.cost > 0);\n const uniqueCostUnits = new Set(costRows.map(d => d.costUnit ?? 'usd'));\n const hasSingleCostUnit = uniqueCostUnits.size <= 1;\n const costUnit = hasSingleCostUnit ? ([...uniqueCostUnits][0] ?? 'usd') : null;\n const totalCost = hasSingleCostUnit ? costRows.reduce((s, d) => s + (d.cost ?? 0), 0) : 0;\n const hasCostData = hasSingleCostUnit && totalCost > 0;\n\n return (\n <MetricsCard>\n <MetricsCard.TopBar>\n <MetricsCard.TitleAndDescription\n title=\"Token Usage by Agent\"\n description=\"Token consumption grouped by agent.\"\n />\n {hasData &&\n (activeTab === 'cost' && hasCostData ? (\n <MetricsCard.Summary value={formatCost(totalCost, costUnit)} label=\"Total cost\" />\n ) : (\n <MetricsCard.Summary value={formatCompactNumber(totalTokens)} label=\"Total tokens\" />\n ))}\n {hasData && actions ? <MetricsCard.Actions>{actions}</MetricsCard.Actions> : null}\n </MetricsCard.TopBar>\n {isLoading ? (\n <MetricsCard.Loading />\n ) : isError ? (\n <MetricsCard.Error message=\"Failed to load token usage data\" />\n ) : (\n <MetricsCard.Content>\n {!hasData ? (\n <MetricsCard.NoData message=\"No token usage data yet\" />\n ) : (\n <Tabs\n defaultTab=\"tokens\"\n value={activeTab}\n onValueChange={v => {\n if (isTokenUsageTab(v)) setActiveTab(v);\n }}\n className=\"grid h-full grid-rows-[auto_1fr] overflow-y-auto\"\n >\n <TabList>\n <Tab value=\"tokens\">Tokens</Tab>\n <Tab value=\"cost\">Cost</Tab>\n </TabList>\n <TabContent value=\"tokens\" className=\"pt-3\">\n <HorizontalBars\n LinkComponent={LinkComponent}\n data={rows.map(d => ({\n name: d.name,\n values: [d.input, d.output],\n href: getRowHref?.(d),\n }))}\n segments={[\n { label: 'Input', color: CHART_COLORS.blueDark },\n { label: 'Output', color: CHART_COLORS.blue },\n ]}\n maxVal={Math.max(...rows.map(d => d.input + d.output))}\n fmt={formatCompactNumber}\n />\n </TabContent>\n <TabContent value=\"cost\" className=\"pt-3\">\n {hasCostData ? (\n <HorizontalBars\n LinkComponent={LinkComponent}\n data={costRows\n .slice()\n .sort((a, b) => (b.cost ?? 0) - (a.cost ?? 0))\n .map(d => ({ name: d.name, values: [d.cost], href: getRowHref?.(d) }))}\n segments={[{ label: 'Cost', color: CHART_COLORS.purple }]}\n maxVal={Math.max(...costRows.map(d => d.cost ?? 0))}\n fmt={v => formatCost(v, costUnit)}\n />\n ) : (\n <MetricsCard.NoData message=\"No cost data yet\" />\n )}\n </TabContent>\n </Tabs>\n )}\n </MetricsCard.Content>\n )}\n </MetricsCard>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -10,8 +10,9 @@ const tabsRoot = require('../../../tabs-root-COCL6jcx.cjs');
|
|
|
10
10
|
const tabsTab = require('../../../tabs-tab-DFmRMdi3.cjs');
|
|
11
11
|
const tabsContent = require('../../../tabs-content-DlCJoQUW.cjs');
|
|
12
12
|
const domains_metrics_components_metricsUtils = require('./metrics-utils.cjs.js');
|
|
13
|
+
const utils_cost = require('../../../utils/cost.cjs.js');
|
|
13
14
|
|
|
14
|
-
function sumMetric(dataKey, formatter =
|
|
15
|
+
function sumMetric(dataKey, formatter = utils_cost.formatCompactNumber) {
|
|
15
16
|
return (data) => ({
|
|
16
17
|
value: formatter(data.reduce((sum, point) => sum + (typeof point[dataKey] === "number" ? point[dataKey] : 0), 0))
|
|
17
18
|
});
|
|
@@ -57,7 +58,7 @@ function TokenUsageTimelineCardView({
|
|
|
57
58
|
dataKey: "cost",
|
|
58
59
|
label: "Cost",
|
|
59
60
|
color: domains_metrics_components_metricsUtils.CHART_COLORS.purple,
|
|
60
|
-
aggregate: sumMetric("cost", (value) =>
|
|
61
|
+
aggregate: sumMetric("cost", (value) => utils_cost.formatCost(value, costUnit))
|
|
61
62
|
}
|
|
62
63
|
];
|
|
63
64
|
return /* @__PURE__ */ jsxRuntime.jsxs(metricsCard.MetricsCard, { children: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-usage-timeline-card-view.cjs.js","sources":["../../../../src/domains/metrics/components/token-usage-timeline-card-view.tsx"],"sourcesContent":["import { useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { MetricsCard } from '../../../ds/components/MetricsCard';\nimport { MetricsLineChart, MetricsLineChartLegend } from '../../../ds/components/MetricsLineChart';\nimport { Tab, TabContent, TabList, Tabs } from '../../../ds/components/Tabs';\nimport type { TokenTimelinePoint, TokenUsageTimeSeriesInterval } from '../hooks/use-token-usage-timeseries';\nimport { CHART_COLORS
|
|
1
|
+
{"version":3,"file":"token-usage-timeline-card-view.cjs.js","sources":["../../../../src/domains/metrics/components/token-usage-timeline-card-view.tsx"],"sourcesContent":["import { useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { MetricsCard } from '../../../ds/components/MetricsCard';\nimport { MetricsLineChart, MetricsLineChartLegend } from '../../../ds/components/MetricsLineChart';\nimport { Tab, TabContent, TabList, Tabs } from '../../../ds/components/Tabs';\nimport type { TokenTimelinePoint, TokenUsageTimeSeriesInterval } from '../hooks/use-token-usage-timeseries';\nimport { CHART_COLORS } from './metrics-utils';\nimport { formatCompactNumber, formatCost } from '@/lib/cost';\n\ntype TokenUsageTimelineTab = 'tokens' | 'cost';\n\nfunction sumMetric(dataKey: 'input' | 'output' | 'cost', formatter: (value: number) => string = formatCompactNumber) {\n return (data: Record<string, unknown>[]) => ({\n value: formatter(data.reduce((sum, point) => sum + (typeof point[dataKey] === 'number' ? point[dataKey] : 0), 0)),\n });\n}\n\nconst tokenSeries = [\n {\n dataKey: 'input',\n label: 'Input tokens',\n color: CHART_COLORS.blue,\n aggregate: sumMetric('input'),\n },\n {\n dataKey: 'output',\n label: 'Output tokens',\n color: CHART_COLORS.yellow,\n aggregate: sumMetric('output'),\n },\n];\n\nfunction isTokenUsageTimelineTab(value: string): value is TokenUsageTimelineTab {\n return value === 'tokens' || value === 'cost';\n}\n\nexport interface TokenUsageTimelineCardViewProps {\n data: TokenTimelinePoint[] | undefined;\n interval: TokenUsageTimeSeriesInterval | undefined;\n isLoading: boolean;\n isError: boolean;\n actions?: ReactNode;\n}\n\nexport function TokenUsageTimelineCardView({\n data,\n interval = '1d',\n isLoading,\n isError,\n actions,\n}: TokenUsageTimelineCardViewProps) {\n const [activeTab, setActiveTab] = useState<TokenUsageTimelineTab>('tokens');\n\n const points = data ?? [];\n const chartPoints = points.map(point => ({ ...point }));\n const hasData = points.length > 0;\n const costPoints = points.filter(point => point.cost != null && point.cost > 0);\n const costChartPoints = costPoints.map(point => ({ ...point }));\n const uniqueCostUnits = new Set(costPoints.map(point => point.costUnit).filter((unit): unit is string => !!unit));\n const hasSingleCostUnit = uniqueCostUnits.size === 1 && costPoints.every(point => point.costUnit != null);\n const costUnit = hasSingleCostUnit ? ([...uniqueCostUnits][0] ?? null) : null;\n const totalCost = hasSingleCostUnit ? costPoints.reduce((sum, point) => sum + (point.cost ?? 0), 0) : 0;\n const hasCostData = hasSingleCostUnit && totalCost > 0;\n const description = interval === '1h' ? 'Input and output tokens per hour.' : 'Input and output tokens per day.';\n\n const costSeries = [\n {\n dataKey: 'cost',\n label: 'Cost',\n color: CHART_COLORS.purple,\n aggregate: sumMetric('cost', value => formatCost(value, costUnit)),\n },\n ];\n\n return (\n <MetricsCard>\n <MetricsCard.TopBar>\n <MetricsCard.TitleAndDescription title=\"Token usage over time\" description={description} />\n {hasData && actions ? <MetricsCard.Actions>{actions}</MetricsCard.Actions> : null}\n </MetricsCard.TopBar>\n {isLoading ? (\n <MetricsCard.Loading />\n ) : isError ? (\n <MetricsCard.Error message=\"Failed to load token usage timeline\" />\n ) : (\n <MetricsCard.Content>\n {!hasData ? (\n <MetricsCard.NoData message=\"No token usage data yet\" />\n ) : (\n <Tabs\n defaultTab=\"tokens\"\n value={activeTab}\n onValueChange={value => {\n if (isTokenUsageTimelineTab(value)) setActiveTab(value);\n }}\n className=\"overflow-visible\"\n >\n <div className=\"flex flex-wrap items-center justify-between gap-2 [&>:first-child]:w-auto\">\n <TabList>\n <Tab value=\"tokens\">Tokens</Tab>\n <Tab value=\"cost\">Cost</Tab>\n </TabList>\n {activeTab === 'tokens' ? (\n <MetricsLineChartLegend data={chartPoints} series={tokenSeries} />\n ) : hasCostData ? (\n <MetricsLineChartLegend data={costChartPoints} series={costSeries} />\n ) : null}\n </div>\n <TabContent value=\"tokens\" className=\"pt-3\">\n <MetricsLineChart data={chartPoints} series={tokenSeries} showLegend={false} />\n </TabContent>\n <TabContent value=\"cost\" className=\"pt-3\">\n {hasCostData ? (\n <MetricsLineChart data={costChartPoints} series={costSeries} showLegend={false} />\n ) : (\n <MetricsCard.NoData message=\"No cost data yet\" />\n )}\n </TabContent>\n </Tabs>\n )}\n </MetricsCard.Content>\n )}\n </MetricsCard>\n );\n}\n"],"names":["formatCompactNumber","CHART_COLORS","useState","formatCost","MetricsCard","jsxs","jsx","Tabs","TabList","Tab","MetricsLineChartLegend","TabContent","MetricsLineChart"],"mappings":"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"}
|
|
@@ -5,9 +5,10 @@ import { a as MetricsLineChartLegend, M as MetricsLineChart } from '../../../met
|
|
|
5
5
|
import { a as Tabs, T as TabList } from '../../../tabs-root-UNPxoGhW.js';
|
|
6
6
|
import { T as Tab } from '../../../tabs-tab-DluwCnDF.js';
|
|
7
7
|
import { T as TabContent } from '../../../tabs-content-7ODUUdQ0.js';
|
|
8
|
-
import { CHART_COLORS
|
|
8
|
+
import { CHART_COLORS } from './metrics-utils.es.js';
|
|
9
|
+
import { formatCompactNumber, formatCost } from '../../../utils/cost.es.js';
|
|
9
10
|
|
|
10
|
-
function sumMetric(dataKey, formatter =
|
|
11
|
+
function sumMetric(dataKey, formatter = formatCompactNumber) {
|
|
11
12
|
return (data) => ({
|
|
12
13
|
value: formatter(data.reduce((sum, point) => sum + (typeof point[dataKey] === "number" ? point[dataKey] : 0), 0))
|
|
13
14
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-usage-timeline-card-view.es.js","sources":["../../../../src/domains/metrics/components/token-usage-timeline-card-view.tsx"],"sourcesContent":["import { useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { MetricsCard } from '../../../ds/components/MetricsCard';\nimport { MetricsLineChart, MetricsLineChartLegend } from '../../../ds/components/MetricsLineChart';\nimport { Tab, TabContent, TabList, Tabs } from '../../../ds/components/Tabs';\nimport type { TokenTimelinePoint, TokenUsageTimeSeriesInterval } from '../hooks/use-token-usage-timeseries';\nimport { CHART_COLORS
|
|
1
|
+
{"version":3,"file":"token-usage-timeline-card-view.es.js","sources":["../../../../src/domains/metrics/components/token-usage-timeline-card-view.tsx"],"sourcesContent":["import { useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { MetricsCard } from '../../../ds/components/MetricsCard';\nimport { MetricsLineChart, MetricsLineChartLegend } from '../../../ds/components/MetricsLineChart';\nimport { Tab, TabContent, TabList, Tabs } from '../../../ds/components/Tabs';\nimport type { TokenTimelinePoint, TokenUsageTimeSeriesInterval } from '../hooks/use-token-usage-timeseries';\nimport { CHART_COLORS } from './metrics-utils';\nimport { formatCompactNumber, formatCost } from '@/lib/cost';\n\ntype TokenUsageTimelineTab = 'tokens' | 'cost';\n\nfunction sumMetric(dataKey: 'input' | 'output' | 'cost', formatter: (value: number) => string = formatCompactNumber) {\n return (data: Record<string, unknown>[]) => ({\n value: formatter(data.reduce((sum, point) => sum + (typeof point[dataKey] === 'number' ? point[dataKey] : 0), 0)),\n });\n}\n\nconst tokenSeries = [\n {\n dataKey: 'input',\n label: 'Input tokens',\n color: CHART_COLORS.blue,\n aggregate: sumMetric('input'),\n },\n {\n dataKey: 'output',\n label: 'Output tokens',\n color: CHART_COLORS.yellow,\n aggregate: sumMetric('output'),\n },\n];\n\nfunction isTokenUsageTimelineTab(value: string): value is TokenUsageTimelineTab {\n return value === 'tokens' || value === 'cost';\n}\n\nexport interface TokenUsageTimelineCardViewProps {\n data: TokenTimelinePoint[] | undefined;\n interval: TokenUsageTimeSeriesInterval | undefined;\n isLoading: boolean;\n isError: boolean;\n actions?: ReactNode;\n}\n\nexport function TokenUsageTimelineCardView({\n data,\n interval = '1d',\n isLoading,\n isError,\n actions,\n}: TokenUsageTimelineCardViewProps) {\n const [activeTab, setActiveTab] = useState<TokenUsageTimelineTab>('tokens');\n\n const points = data ?? [];\n const chartPoints = points.map(point => ({ ...point }));\n const hasData = points.length > 0;\n const costPoints = points.filter(point => point.cost != null && point.cost > 0);\n const costChartPoints = costPoints.map(point => ({ ...point }));\n const uniqueCostUnits = new Set(costPoints.map(point => point.costUnit).filter((unit): unit is string => !!unit));\n const hasSingleCostUnit = uniqueCostUnits.size === 1 && costPoints.every(point => point.costUnit != null);\n const costUnit = hasSingleCostUnit ? ([...uniqueCostUnits][0] ?? null) : null;\n const totalCost = hasSingleCostUnit ? costPoints.reduce((sum, point) => sum + (point.cost ?? 0), 0) : 0;\n const hasCostData = hasSingleCostUnit && totalCost > 0;\n const description = interval === '1h' ? 'Input and output tokens per hour.' : 'Input and output tokens per day.';\n\n const costSeries = [\n {\n dataKey: 'cost',\n label: 'Cost',\n color: CHART_COLORS.purple,\n aggregate: sumMetric('cost', value => formatCost(value, costUnit)),\n },\n ];\n\n return (\n <MetricsCard>\n <MetricsCard.TopBar>\n <MetricsCard.TitleAndDescription title=\"Token usage over time\" description={description} />\n {hasData && actions ? <MetricsCard.Actions>{actions}</MetricsCard.Actions> : null}\n </MetricsCard.TopBar>\n {isLoading ? (\n <MetricsCard.Loading />\n ) : isError ? (\n <MetricsCard.Error message=\"Failed to load token usage timeline\" />\n ) : (\n <MetricsCard.Content>\n {!hasData ? (\n <MetricsCard.NoData message=\"No token usage data yet\" />\n ) : (\n <Tabs\n defaultTab=\"tokens\"\n value={activeTab}\n onValueChange={value => {\n if (isTokenUsageTimelineTab(value)) setActiveTab(value);\n }}\n className=\"overflow-visible\"\n >\n <div className=\"flex flex-wrap items-center justify-between gap-2 [&>:first-child]:w-auto\">\n <TabList>\n <Tab value=\"tokens\">Tokens</Tab>\n <Tab value=\"cost\">Cost</Tab>\n </TabList>\n {activeTab === 'tokens' ? (\n <MetricsLineChartLegend data={chartPoints} series={tokenSeries} />\n ) : hasCostData ? (\n <MetricsLineChartLegend data={costChartPoints} series={costSeries} />\n ) : null}\n </div>\n <TabContent value=\"tokens\" className=\"pt-3\">\n <MetricsLineChart data={chartPoints} series={tokenSeries} showLegend={false} />\n </TabContent>\n <TabContent value=\"cost\" className=\"pt-3\">\n {hasCostData ? (\n <MetricsLineChart data={costChartPoints} series={costSeries} showLegend={false} />\n ) : (\n <MetricsCard.NoData message=\"No cost data yet\" />\n )}\n </TabContent>\n </Tabs>\n )}\n </MetricsCard.Content>\n )}\n </MetricsCard>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -10,6 +10,7 @@ const tabsContent = require('../../../tabs-content-DlCJoQUW.cjs');
|
|
|
10
10
|
const tabsRoot = require('../../../tabs-root-COCL6jcx.cjs');
|
|
11
11
|
const tabsTab = require('../../../tabs-tab-DFmRMdi3.cjs');
|
|
12
12
|
const domains_metrics_components_metricsUtils = require('./metrics-utils.cjs.js');
|
|
13
|
+
const utils_cost = require('../../../utils/cost.cjs.js');
|
|
13
14
|
|
|
14
15
|
function VolumeBars({
|
|
15
16
|
data,
|
|
@@ -42,7 +43,7 @@ function VolumeBars({
|
|
|
42
43
|
{ label: "Errors", color: domains_metrics_components_metricsUtils.CHART_COLORS.pink }
|
|
43
44
|
],
|
|
44
45
|
maxVal: Math.max(...data.map((d) => d.completed + d.errors)),
|
|
45
|
-
fmt:
|
|
46
|
+
fmt: utils_cost.formatCompactNumber
|
|
46
47
|
}
|
|
47
48
|
);
|
|
48
49
|
}
|
|
@@ -64,7 +65,7 @@ function TracesVolumeCardView({
|
|
|
64
65
|
return /* @__PURE__ */ jsxRuntime.jsxs(metricsCard.MetricsCard, { children: [
|
|
65
66
|
/* @__PURE__ */ jsxRuntime.jsxs(metricsCard.MetricsCard.TopBar, { children: [
|
|
66
67
|
/* @__PURE__ */ jsxRuntime.jsx(metricsCard.MetricsCard.TitleAndDescription, { title: "Trace Volume", description: "Runs and call counts." }),
|
|
67
|
-
hasData && /* @__PURE__ */ jsxRuntime.jsx(metricsCard.MetricsCard.Summary, { value:
|
|
68
|
+
hasData && /* @__PURE__ */ jsxRuntime.jsx(metricsCard.MetricsCard.Summary, { value: utils_cost.formatCompactNumber(total), label: "Total runs" }),
|
|
68
69
|
renderedActions ? /* @__PURE__ */ jsxRuntime.jsx(metricsCard.MetricsCard.Actions, { children: renderedActions }) : null
|
|
69
70
|
] }),
|
|
70
71
|
isLoading ? /* @__PURE__ */ jsxRuntime.jsx(metricsCard.MetricsCard.Loading, {}) : isError ? /* @__PURE__ */ jsxRuntime.jsx(metricsCard.MetricsCard.Error, { message: "Failed to load trace volume data" }) : /* @__PURE__ */ jsxRuntime.jsx(metricsCard.MetricsCard.Content, { children: !hasData ? /* @__PURE__ */ jsxRuntime.jsx(metricsCard.MetricsCard.NoData, { message: "No trace volume data yet" }) : /* @__PURE__ */ jsxRuntime.jsxs(
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"traces-volume-card-view.cjs.js","sources":["../../../../src/domains/metrics/components/traces-volume-card-view.tsx"],"sourcesContent":["import { useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { HorizontalBars } from '../../../ds/components/HorizontalBars/horizontal-bars';\nimport { MetricsCard } from '../../../ds/components/MetricsCard/metrics-card';\nimport { TabContent } from '../../../ds/components/Tabs/tabs-content';\nimport { TabList } from '../../../ds/components/Tabs/tabs-list';\nimport { Tabs } from '../../../ds/components/Tabs/tabs-root';\nimport { Tab } from '../../../ds/components/Tabs/tabs-tab';\nimport type { LinkComponent } from '../../../ds/types/link-component';\nimport type { VolumeRow } from '../hooks/use-trace-volume-metrics';\nimport { CHART_COLORS, formatCompact } from './metrics-utils';\n\nexport type VolumeTab = 'agents' | 'workflows' | 'tools';\n\nfunction VolumeBars({\n data,\n rowHrefs,\n errorHrefs,\n LinkComponent,\n}: {\n data: VolumeRow[];\n rowHrefs?: (row: VolumeRow) => string | undefined;\n errorHrefs?: (row: VolumeRow) => string | undefined;\n LinkComponent?: LinkComponent;\n}) {\n return (\n <HorizontalBars\n LinkComponent={LinkComponent}\n data={data.map(d => {\n const errorHref = errorHrefs?.(d);\n const rowHref = rowHrefs?.(d);\n // HorizontalBars ignores per-segment `hrefs` whenever a row-level\n // `href` is set (to avoid nested anchors). When we want the Errors\n // segment to drill somewhere different from the rest of the row,\n // drop the row-level link and split navigation across segments\n // instead so each target is reachable.\n if (errorHref) {\n return {\n name: d.name,\n values: [d.completed, d.errors],\n hrefs: [rowHref, errorHref],\n };\n }\n return {\n name: d.name,\n values: [d.completed, d.errors],\n href: rowHref,\n };\n })}\n segments={[\n { label: 'Completed', color: CHART_COLORS.blueDark },\n { label: 'Errors', color: CHART_COLORS.pink },\n ]}\n maxVal={Math.max(...data.map(d => d.completed + d.errors))}\n fmt={formatCompact}\n />\n );\n}\n\nexport interface TracesVolumeCardViewProps {\n data: { agentData: VolumeRow[]; workflowData: VolumeRow[]; toolData: VolumeRow[] } | undefined;\n isLoading: boolean;\n isError: boolean;\n /** Optional drilldown: returns href for clicking a whole bar row. */\n getRowHref?: (tab: VolumeTab, row: VolumeRow) => string | undefined;\n /** Optional drilldown: returns href for clicking the \"Errors\" segment of a bar. */\n getErrorSegmentHref?: (tab: VolumeTab, row: VolumeRow) => string | undefined;\n /**\n * Optional slot for top-bar action buttons.\n * Pass a function to receive the active tab so actions can scope themselves to the current entity type.\n */\n actions?: ReactNode | ((tab: VolumeTab) => ReactNode);\n /** Override how drilldown links are rendered (e.g. router-aware adapter). Defaults to `<a>`. */\n LinkComponent?: LinkComponent;\n}\n\nexport function TracesVolumeCardView({\n data,\n isLoading,\n isError,\n getRowHref,\n getErrorSegmentHref,\n actions,\n LinkComponent,\n}: TracesVolumeCardViewProps) {\n const [activeTab, setActiveTab] = useState<VolumeTab>('agents');\n const renderedActions = typeof actions === 'function' ? actions(activeTab) : actions;\n const hasData = !!data && (data.agentData.length > 0 || data.workflowData.length > 0 || data.toolData.length > 0);\n const total = data\n ? [...data.agentData, ...data.workflowData, ...data.toolData].reduce((s, d) => s + d.completed + d.errors, 0)\n : 0;\n\n const tabRowHrefs = (tab: VolumeTab) => (getRowHref ? (row: VolumeRow) => getRowHref(tab, row) : undefined);\n const tabErrorHrefs = (tab: VolumeTab) =>\n getErrorSegmentHref ? (row: VolumeRow) => getErrorSegmentHref(tab, row) : undefined;\n\n return (\n <MetricsCard>\n <MetricsCard.TopBar>\n <MetricsCard.TitleAndDescription title=\"Trace Volume\" description=\"Runs and call counts.\" />\n {hasData && <MetricsCard.Summary value={formatCompact(total)} label=\"Total runs\" />}\n {renderedActions ? <MetricsCard.Actions>{renderedActions}</MetricsCard.Actions> : null}\n </MetricsCard.TopBar>\n {isLoading ? (\n <MetricsCard.Loading />\n ) : isError ? (\n <MetricsCard.Error message=\"Failed to load trace volume data\" />\n ) : (\n <MetricsCard.Content>\n {!hasData ? (\n <MetricsCard.NoData message=\"No trace volume data yet\" />\n ) : (\n <Tabs\n value={activeTab}\n onValueChange={setActiveTab}\n defaultTab=\"agents\"\n className=\"grid h-full grid-rows-[auto_1fr] overflow-y-auto\"\n >\n <TabList>\n <Tab value=\"agents\">Agents</Tab>\n <Tab value=\"workflows\">Workflows</Tab>\n <Tab value=\"tools\">Tools</Tab>\n </TabList>\n <TabContent value=\"agents\" className=\"pt-3\">\n {data.agentData.length > 0 ? (\n <VolumeBars\n data={data.agentData}\n rowHrefs={tabRowHrefs('agents')}\n errorHrefs={tabErrorHrefs('agents')}\n LinkComponent={LinkComponent}\n />\n ) : (\n <MetricsCard.NoData message=\"No agent data yet\" />\n )}\n </TabContent>\n <TabContent value=\"workflows\" className=\"pt-3\">\n {data.workflowData.length > 0 ? (\n <VolumeBars\n data={data.workflowData}\n rowHrefs={tabRowHrefs('workflows')}\n errorHrefs={tabErrorHrefs('workflows')}\n LinkComponent={LinkComponent}\n />\n ) : (\n <MetricsCard.NoData message=\"No workflow data yet\" />\n )}\n </TabContent>\n <TabContent value=\"tools\" className=\"pt-3\">\n {data.toolData.length > 0 ? (\n <VolumeBars\n data={data.toolData}\n rowHrefs={tabRowHrefs('tools')}\n errorHrefs={tabErrorHrefs('tools')}\n LinkComponent={LinkComponent}\n />\n ) : (\n <MetricsCard.NoData message=\"No tool data yet\" />\n )}\n </TabContent>\n </Tabs>\n )}\n </MetricsCard.Content>\n )}\n </MetricsCard>\n );\n}\n"],"names":["jsx","HorizontalBars","CHART_COLORS","formatCompact","useState","MetricsCard","jsxs","Tabs","TabList","Tab","TabContent"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"traces-volume-card-view.cjs.js","sources":["../../../../src/domains/metrics/components/traces-volume-card-view.tsx"],"sourcesContent":["import { useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { HorizontalBars } from '../../../ds/components/HorizontalBars/horizontal-bars';\nimport { MetricsCard } from '../../../ds/components/MetricsCard/metrics-card';\nimport { TabContent } from '../../../ds/components/Tabs/tabs-content';\nimport { TabList } from '../../../ds/components/Tabs/tabs-list';\nimport { Tabs } from '../../../ds/components/Tabs/tabs-root';\nimport { Tab } from '../../../ds/components/Tabs/tabs-tab';\nimport type { LinkComponent } from '../../../ds/types/link-component';\nimport type { VolumeRow } from '../hooks/use-trace-volume-metrics';\nimport { CHART_COLORS } from './metrics-utils';\nimport { formatCompactNumber } from '@/lib/cost';\n\nexport type VolumeTab = 'agents' | 'workflows' | 'tools';\n\nfunction VolumeBars({\n data,\n rowHrefs,\n errorHrefs,\n LinkComponent,\n}: {\n data: VolumeRow[];\n rowHrefs?: (row: VolumeRow) => string | undefined;\n errorHrefs?: (row: VolumeRow) => string | undefined;\n LinkComponent?: LinkComponent;\n}) {\n return (\n <HorizontalBars\n LinkComponent={LinkComponent}\n data={data.map(d => {\n const errorHref = errorHrefs?.(d);\n const rowHref = rowHrefs?.(d);\n // HorizontalBars ignores per-segment `hrefs` whenever a row-level\n // `href` is set (to avoid nested anchors). When we want the Errors\n // segment to drill somewhere different from the rest of the row,\n // drop the row-level link and split navigation across segments\n // instead so each target is reachable.\n if (errorHref) {\n return {\n name: d.name,\n values: [d.completed, d.errors],\n hrefs: [rowHref, errorHref],\n };\n }\n return {\n name: d.name,\n values: [d.completed, d.errors],\n href: rowHref,\n };\n })}\n segments={[\n { label: 'Completed', color: CHART_COLORS.blueDark },\n { label: 'Errors', color: CHART_COLORS.pink },\n ]}\n maxVal={Math.max(...data.map(d => d.completed + d.errors))}\n fmt={formatCompactNumber}\n />\n );\n}\n\nexport interface TracesVolumeCardViewProps {\n data: { agentData: VolumeRow[]; workflowData: VolumeRow[]; toolData: VolumeRow[] } | undefined;\n isLoading: boolean;\n isError: boolean;\n /** Optional drilldown: returns href for clicking a whole bar row. */\n getRowHref?: (tab: VolumeTab, row: VolumeRow) => string | undefined;\n /** Optional drilldown: returns href for clicking the \"Errors\" segment of a bar. */\n getErrorSegmentHref?: (tab: VolumeTab, row: VolumeRow) => string | undefined;\n /**\n * Optional slot for top-bar action buttons.\n * Pass a function to receive the active tab so actions can scope themselves to the current entity type.\n */\n actions?: ReactNode | ((tab: VolumeTab) => ReactNode);\n /** Override how drilldown links are rendered (e.g. router-aware adapter). Defaults to `<a>`. */\n LinkComponent?: LinkComponent;\n}\n\nexport function TracesVolumeCardView({\n data,\n isLoading,\n isError,\n getRowHref,\n getErrorSegmentHref,\n actions,\n LinkComponent,\n}: TracesVolumeCardViewProps) {\n const [activeTab, setActiveTab] = useState<VolumeTab>('agents');\n const renderedActions = typeof actions === 'function' ? actions(activeTab) : actions;\n const hasData = !!data && (data.agentData.length > 0 || data.workflowData.length > 0 || data.toolData.length > 0);\n const total = data\n ? [...data.agentData, ...data.workflowData, ...data.toolData].reduce((s, d) => s + d.completed + d.errors, 0)\n : 0;\n\n const tabRowHrefs = (tab: VolumeTab) => (getRowHref ? (row: VolumeRow) => getRowHref(tab, row) : undefined);\n const tabErrorHrefs = (tab: VolumeTab) =>\n getErrorSegmentHref ? (row: VolumeRow) => getErrorSegmentHref(tab, row) : undefined;\n\n return (\n <MetricsCard>\n <MetricsCard.TopBar>\n <MetricsCard.TitleAndDescription title=\"Trace Volume\" description=\"Runs and call counts.\" />\n {hasData && <MetricsCard.Summary value={formatCompactNumber(total)} label=\"Total runs\" />}\n {renderedActions ? <MetricsCard.Actions>{renderedActions}</MetricsCard.Actions> : null}\n </MetricsCard.TopBar>\n {isLoading ? (\n <MetricsCard.Loading />\n ) : isError ? (\n <MetricsCard.Error message=\"Failed to load trace volume data\" />\n ) : (\n <MetricsCard.Content>\n {!hasData ? (\n <MetricsCard.NoData message=\"No trace volume data yet\" />\n ) : (\n <Tabs\n value={activeTab}\n onValueChange={setActiveTab}\n defaultTab=\"agents\"\n className=\"grid h-full grid-rows-[auto_1fr] overflow-y-auto\"\n >\n <TabList>\n <Tab value=\"agents\">Agents</Tab>\n <Tab value=\"workflows\">Workflows</Tab>\n <Tab value=\"tools\">Tools</Tab>\n </TabList>\n <TabContent value=\"agents\" className=\"pt-3\">\n {data.agentData.length > 0 ? (\n <VolumeBars\n data={data.agentData}\n rowHrefs={tabRowHrefs('agents')}\n errorHrefs={tabErrorHrefs('agents')}\n LinkComponent={LinkComponent}\n />\n ) : (\n <MetricsCard.NoData message=\"No agent data yet\" />\n )}\n </TabContent>\n <TabContent value=\"workflows\" className=\"pt-3\">\n {data.workflowData.length > 0 ? (\n <VolumeBars\n data={data.workflowData}\n rowHrefs={tabRowHrefs('workflows')}\n errorHrefs={tabErrorHrefs('workflows')}\n LinkComponent={LinkComponent}\n />\n ) : (\n <MetricsCard.NoData message=\"No workflow data yet\" />\n )}\n </TabContent>\n <TabContent value=\"tools\" className=\"pt-3\">\n {data.toolData.length > 0 ? (\n <VolumeBars\n data={data.toolData}\n rowHrefs={tabRowHrefs('tools')}\n errorHrefs={tabErrorHrefs('tools')}\n LinkComponent={LinkComponent}\n />\n ) : (\n <MetricsCard.NoData message=\"No tool data yet\" />\n )}\n </TabContent>\n </Tabs>\n )}\n </MetricsCard.Content>\n )}\n </MetricsCard>\n );\n}\n"],"names":["jsx","HorizontalBars","CHART_COLORS","formatCompactNumber","useState","MetricsCard","jsxs","Tabs","TabList","Tab","TabContent"],"mappings":"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"}
|
|
@@ -5,7 +5,8 @@ import { M as MetricsCard } from '../../../metrics-card-C2RTi5Ew.js';
|
|
|
5
5
|
import { T as TabContent } from '../../../tabs-content-7ODUUdQ0.js';
|
|
6
6
|
import { a as Tabs, T as TabList } from '../../../tabs-root-UNPxoGhW.js';
|
|
7
7
|
import { T as Tab } from '../../../tabs-tab-DluwCnDF.js';
|
|
8
|
-
import {
|
|
8
|
+
import { CHART_COLORS } from './metrics-utils.es.js';
|
|
9
|
+
import { formatCompactNumber } from '../../../utils/cost.es.js';
|
|
9
10
|
|
|
10
11
|
function VolumeBars({
|
|
11
12
|
data,
|
|
@@ -38,7 +39,7 @@ function VolumeBars({
|
|
|
38
39
|
{ label: "Errors", color: CHART_COLORS.pink }
|
|
39
40
|
],
|
|
40
41
|
maxVal: Math.max(...data.map((d) => d.completed + d.errors)),
|
|
41
|
-
fmt:
|
|
42
|
+
fmt: formatCompactNumber
|
|
42
43
|
}
|
|
43
44
|
);
|
|
44
45
|
}
|
|
@@ -60,7 +61,7 @@ function TracesVolumeCardView({
|
|
|
60
61
|
return /* @__PURE__ */ jsxs(MetricsCard, { children: [
|
|
61
62
|
/* @__PURE__ */ jsxs(MetricsCard.TopBar, { children: [
|
|
62
63
|
/* @__PURE__ */ jsx(MetricsCard.TitleAndDescription, { title: "Trace Volume", description: "Runs and call counts." }),
|
|
63
|
-
hasData && /* @__PURE__ */ jsx(MetricsCard.Summary, { value:
|
|
64
|
+
hasData && /* @__PURE__ */ jsx(MetricsCard.Summary, { value: formatCompactNumber(total), label: "Total runs" }),
|
|
64
65
|
renderedActions ? /* @__PURE__ */ jsx(MetricsCard.Actions, { children: renderedActions }) : null
|
|
65
66
|
] }),
|
|
66
67
|
isLoading ? /* @__PURE__ */ jsx(MetricsCard.Loading, {}) : isError ? /* @__PURE__ */ jsx(MetricsCard.Error, { message: "Failed to load trace volume data" }) : /* @__PURE__ */ jsx(MetricsCard.Content, { children: !hasData ? /* @__PURE__ */ jsx(MetricsCard.NoData, { message: "No trace volume data yet" }) : /* @__PURE__ */ jsxs(
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"traces-volume-card-view.es.js","sources":["../../../../src/domains/metrics/components/traces-volume-card-view.tsx"],"sourcesContent":["import { useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { HorizontalBars } from '../../../ds/components/HorizontalBars/horizontal-bars';\nimport { MetricsCard } from '../../../ds/components/MetricsCard/metrics-card';\nimport { TabContent } from '../../../ds/components/Tabs/tabs-content';\nimport { TabList } from '../../../ds/components/Tabs/tabs-list';\nimport { Tabs } from '../../../ds/components/Tabs/tabs-root';\nimport { Tab } from '../../../ds/components/Tabs/tabs-tab';\nimport type { LinkComponent } from '../../../ds/types/link-component';\nimport type { VolumeRow } from '../hooks/use-trace-volume-metrics';\nimport { CHART_COLORS, formatCompact } from './metrics-utils';\n\nexport type VolumeTab = 'agents' | 'workflows' | 'tools';\n\nfunction VolumeBars({\n data,\n rowHrefs,\n errorHrefs,\n LinkComponent,\n}: {\n data: VolumeRow[];\n rowHrefs?: (row: VolumeRow) => string | undefined;\n errorHrefs?: (row: VolumeRow) => string | undefined;\n LinkComponent?: LinkComponent;\n}) {\n return (\n <HorizontalBars\n LinkComponent={LinkComponent}\n data={data.map(d => {\n const errorHref = errorHrefs?.(d);\n const rowHref = rowHrefs?.(d);\n // HorizontalBars ignores per-segment `hrefs` whenever a row-level\n // `href` is set (to avoid nested anchors). When we want the Errors\n // segment to drill somewhere different from the rest of the row,\n // drop the row-level link and split navigation across segments\n // instead so each target is reachable.\n if (errorHref) {\n return {\n name: d.name,\n values: [d.completed, d.errors],\n hrefs: [rowHref, errorHref],\n };\n }\n return {\n name: d.name,\n values: [d.completed, d.errors],\n href: rowHref,\n };\n })}\n segments={[\n { label: 'Completed', color: CHART_COLORS.blueDark },\n { label: 'Errors', color: CHART_COLORS.pink },\n ]}\n maxVal={Math.max(...data.map(d => d.completed + d.errors))}\n fmt={formatCompact}\n />\n );\n}\n\nexport interface TracesVolumeCardViewProps {\n data: { agentData: VolumeRow[]; workflowData: VolumeRow[]; toolData: VolumeRow[] } | undefined;\n isLoading: boolean;\n isError: boolean;\n /** Optional drilldown: returns href for clicking a whole bar row. */\n getRowHref?: (tab: VolumeTab, row: VolumeRow) => string | undefined;\n /** Optional drilldown: returns href for clicking the \"Errors\" segment of a bar. */\n getErrorSegmentHref?: (tab: VolumeTab, row: VolumeRow) => string | undefined;\n /**\n * Optional slot for top-bar action buttons.\n * Pass a function to receive the active tab so actions can scope themselves to the current entity type.\n */\n actions?: ReactNode | ((tab: VolumeTab) => ReactNode);\n /** Override how drilldown links are rendered (e.g. router-aware adapter). Defaults to `<a>`. */\n LinkComponent?: LinkComponent;\n}\n\nexport function TracesVolumeCardView({\n data,\n isLoading,\n isError,\n getRowHref,\n getErrorSegmentHref,\n actions,\n LinkComponent,\n}: TracesVolumeCardViewProps) {\n const [activeTab, setActiveTab] = useState<VolumeTab>('agents');\n const renderedActions = typeof actions === 'function' ? actions(activeTab) : actions;\n const hasData = !!data && (data.agentData.length > 0 || data.workflowData.length > 0 || data.toolData.length > 0);\n const total = data\n ? [...data.agentData, ...data.workflowData, ...data.toolData].reduce((s, d) => s + d.completed + d.errors, 0)\n : 0;\n\n const tabRowHrefs = (tab: VolumeTab) => (getRowHref ? (row: VolumeRow) => getRowHref(tab, row) : undefined);\n const tabErrorHrefs = (tab: VolumeTab) =>\n getErrorSegmentHref ? (row: VolumeRow) => getErrorSegmentHref(tab, row) : undefined;\n\n return (\n <MetricsCard>\n <MetricsCard.TopBar>\n <MetricsCard.TitleAndDescription title=\"Trace Volume\" description=\"Runs and call counts.\" />\n {hasData && <MetricsCard.Summary value={formatCompact(total)} label=\"Total runs\" />}\n {renderedActions ? <MetricsCard.Actions>{renderedActions}</MetricsCard.Actions> : null}\n </MetricsCard.TopBar>\n {isLoading ? (\n <MetricsCard.Loading />\n ) : isError ? (\n <MetricsCard.Error message=\"Failed to load trace volume data\" />\n ) : (\n <MetricsCard.Content>\n {!hasData ? (\n <MetricsCard.NoData message=\"No trace volume data yet\" />\n ) : (\n <Tabs\n value={activeTab}\n onValueChange={setActiveTab}\n defaultTab=\"agents\"\n className=\"grid h-full grid-rows-[auto_1fr] overflow-y-auto\"\n >\n <TabList>\n <Tab value=\"agents\">Agents</Tab>\n <Tab value=\"workflows\">Workflows</Tab>\n <Tab value=\"tools\">Tools</Tab>\n </TabList>\n <TabContent value=\"agents\" className=\"pt-3\">\n {data.agentData.length > 0 ? (\n <VolumeBars\n data={data.agentData}\n rowHrefs={tabRowHrefs('agents')}\n errorHrefs={tabErrorHrefs('agents')}\n LinkComponent={LinkComponent}\n />\n ) : (\n <MetricsCard.NoData message=\"No agent data yet\" />\n )}\n </TabContent>\n <TabContent value=\"workflows\" className=\"pt-3\">\n {data.workflowData.length > 0 ? (\n <VolumeBars\n data={data.workflowData}\n rowHrefs={tabRowHrefs('workflows')}\n errorHrefs={tabErrorHrefs('workflows')}\n LinkComponent={LinkComponent}\n />\n ) : (\n <MetricsCard.NoData message=\"No workflow data yet\" />\n )}\n </TabContent>\n <TabContent value=\"tools\" className=\"pt-3\">\n {data.toolData.length > 0 ? (\n <VolumeBars\n data={data.toolData}\n rowHrefs={tabRowHrefs('tools')}\n errorHrefs={tabErrorHrefs('tools')}\n LinkComponent={LinkComponent}\n />\n ) : (\n <MetricsCard.NoData message=\"No tool data yet\" />\n )}\n </TabContent>\n </Tabs>\n )}\n </MetricsCard.Content>\n )}\n </MetricsCard>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"traces-volume-card-view.es.js","sources":["../../../../src/domains/metrics/components/traces-volume-card-view.tsx"],"sourcesContent":["import { useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { HorizontalBars } from '../../../ds/components/HorizontalBars/horizontal-bars';\nimport { MetricsCard } from '../../../ds/components/MetricsCard/metrics-card';\nimport { TabContent } from '../../../ds/components/Tabs/tabs-content';\nimport { TabList } from '../../../ds/components/Tabs/tabs-list';\nimport { Tabs } from '../../../ds/components/Tabs/tabs-root';\nimport { Tab } from '../../../ds/components/Tabs/tabs-tab';\nimport type { LinkComponent } from '../../../ds/types/link-component';\nimport type { VolumeRow } from '../hooks/use-trace-volume-metrics';\nimport { CHART_COLORS } from './metrics-utils';\nimport { formatCompactNumber } from '@/lib/cost';\n\nexport type VolumeTab = 'agents' | 'workflows' | 'tools';\n\nfunction VolumeBars({\n data,\n rowHrefs,\n errorHrefs,\n LinkComponent,\n}: {\n data: VolumeRow[];\n rowHrefs?: (row: VolumeRow) => string | undefined;\n errorHrefs?: (row: VolumeRow) => string | undefined;\n LinkComponent?: LinkComponent;\n}) {\n return (\n <HorizontalBars\n LinkComponent={LinkComponent}\n data={data.map(d => {\n const errorHref = errorHrefs?.(d);\n const rowHref = rowHrefs?.(d);\n // HorizontalBars ignores per-segment `hrefs` whenever a row-level\n // `href` is set (to avoid nested anchors). When we want the Errors\n // segment to drill somewhere different from the rest of the row,\n // drop the row-level link and split navigation across segments\n // instead so each target is reachable.\n if (errorHref) {\n return {\n name: d.name,\n values: [d.completed, d.errors],\n hrefs: [rowHref, errorHref],\n };\n }\n return {\n name: d.name,\n values: [d.completed, d.errors],\n href: rowHref,\n };\n })}\n segments={[\n { label: 'Completed', color: CHART_COLORS.blueDark },\n { label: 'Errors', color: CHART_COLORS.pink },\n ]}\n maxVal={Math.max(...data.map(d => d.completed + d.errors))}\n fmt={formatCompactNumber}\n />\n );\n}\n\nexport interface TracesVolumeCardViewProps {\n data: { agentData: VolumeRow[]; workflowData: VolumeRow[]; toolData: VolumeRow[] } | undefined;\n isLoading: boolean;\n isError: boolean;\n /** Optional drilldown: returns href for clicking a whole bar row. */\n getRowHref?: (tab: VolumeTab, row: VolumeRow) => string | undefined;\n /** Optional drilldown: returns href for clicking the \"Errors\" segment of a bar. */\n getErrorSegmentHref?: (tab: VolumeTab, row: VolumeRow) => string | undefined;\n /**\n * Optional slot for top-bar action buttons.\n * Pass a function to receive the active tab so actions can scope themselves to the current entity type.\n */\n actions?: ReactNode | ((tab: VolumeTab) => ReactNode);\n /** Override how drilldown links are rendered (e.g. router-aware adapter). Defaults to `<a>`. */\n LinkComponent?: LinkComponent;\n}\n\nexport function TracesVolumeCardView({\n data,\n isLoading,\n isError,\n getRowHref,\n getErrorSegmentHref,\n actions,\n LinkComponent,\n}: TracesVolumeCardViewProps) {\n const [activeTab, setActiveTab] = useState<VolumeTab>('agents');\n const renderedActions = typeof actions === 'function' ? actions(activeTab) : actions;\n const hasData = !!data && (data.agentData.length > 0 || data.workflowData.length > 0 || data.toolData.length > 0);\n const total = data\n ? [...data.agentData, ...data.workflowData, ...data.toolData].reduce((s, d) => s + d.completed + d.errors, 0)\n : 0;\n\n const tabRowHrefs = (tab: VolumeTab) => (getRowHref ? (row: VolumeRow) => getRowHref(tab, row) : undefined);\n const tabErrorHrefs = (tab: VolumeTab) =>\n getErrorSegmentHref ? (row: VolumeRow) => getErrorSegmentHref(tab, row) : undefined;\n\n return (\n <MetricsCard>\n <MetricsCard.TopBar>\n <MetricsCard.TitleAndDescription title=\"Trace Volume\" description=\"Runs and call counts.\" />\n {hasData && <MetricsCard.Summary value={formatCompactNumber(total)} label=\"Total runs\" />}\n {renderedActions ? <MetricsCard.Actions>{renderedActions}</MetricsCard.Actions> : null}\n </MetricsCard.TopBar>\n {isLoading ? (\n <MetricsCard.Loading />\n ) : isError ? (\n <MetricsCard.Error message=\"Failed to load trace volume data\" />\n ) : (\n <MetricsCard.Content>\n {!hasData ? (\n <MetricsCard.NoData message=\"No trace volume data yet\" />\n ) : (\n <Tabs\n value={activeTab}\n onValueChange={setActiveTab}\n defaultTab=\"agents\"\n className=\"grid h-full grid-rows-[auto_1fr] overflow-y-auto\"\n >\n <TabList>\n <Tab value=\"agents\">Agents</Tab>\n <Tab value=\"workflows\">Workflows</Tab>\n <Tab value=\"tools\">Tools</Tab>\n </TabList>\n <TabContent value=\"agents\" className=\"pt-3\">\n {data.agentData.length > 0 ? (\n <VolumeBars\n data={data.agentData}\n rowHrefs={tabRowHrefs('agents')}\n errorHrefs={tabErrorHrefs('agents')}\n LinkComponent={LinkComponent}\n />\n ) : (\n <MetricsCard.NoData message=\"No agent data yet\" />\n )}\n </TabContent>\n <TabContent value=\"workflows\" className=\"pt-3\">\n {data.workflowData.length > 0 ? (\n <VolumeBars\n data={data.workflowData}\n rowHrefs={tabRowHrefs('workflows')}\n errorHrefs={tabErrorHrefs('workflows')}\n LinkComponent={LinkComponent}\n />\n ) : (\n <MetricsCard.NoData message=\"No workflow data yet\" />\n )}\n </TabContent>\n <TabContent value=\"tools\" className=\"pt-3\">\n {data.toolData.length > 0 ? (\n <VolumeBars\n data={data.toolData}\n rowHrefs={tabRowHrefs('tools')}\n errorHrefs={tabErrorHrefs('tools')}\n LinkComponent={LinkComponent}\n />\n ) : (\n <MetricsCard.NoData message=\"No tool data yet\" />\n )}\n </TabContent>\n </Tabs>\n )}\n </MetricsCard.Content>\n )}\n </MetricsCard>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -19,8 +19,6 @@ const domains_metrics_components_tracesVolumeCardView = require('./components/tr
|
|
|
19
19
|
|
|
20
20
|
exports.DateRangeSelector = domains_metrics_components_dateRangeSelector.DateRangeSelector;
|
|
21
21
|
exports.CHART_COLORS = domains_metrics_components_metricsUtils.CHART_COLORS;
|
|
22
|
-
exports.formatCompact = domains_metrics_components_metricsUtils.formatCompact;
|
|
23
|
-
exports.formatCost = domains_metrics_components_metricsUtils.formatCost;
|
|
24
22
|
exports.BarListContent = domains_metrics_components_barList.BarListContent;
|
|
25
23
|
exports.StackedRunsBars = domains_metrics_components_barList.StackedRunsBars;
|
|
26
24
|
exports.OpenErrorsInLogsButton = domains_metrics_components_cardActionButtons.OpenErrorsInLogsButton;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"components.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"components.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { DateRangeSelector } from './components/date-range-selector.es.js';
|
|
2
|
-
export { CHART_COLORS
|
|
2
|
+
export { CHART_COLORS } from './components/metrics-utils.es.js';
|
|
3
3
|
export { BarListContent, StackedRunsBars } from './components/bar-list.es.js';
|
|
4
4
|
export { OpenErrorsInLogsButton, OpenInTracesButton } from './components/card-action-buttons.es.js';
|
|
5
5
|
export { KpiCardView } from './components/kpi-card-view.es.js';
|
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
4
4
|
|
|
5
5
|
const jsxRuntime = require('react/jsx-runtime');
|
|
6
|
-
const dateFns = require('date-fns');
|
|
7
6
|
const React = require('react');
|
|
8
7
|
const domains_metrics_metricsFilters = require('../metrics-filters.cjs.js');
|
|
8
|
+
const utils_dateFormat = require('../../../utils/date-format.cjs.js');
|
|
9
9
|
|
|
10
10
|
const DATE_PRESETS = [
|
|
11
11
|
{ label: "Last 24 hours", value: "24h" },
|
|
@@ -43,9 +43,9 @@ function getDateRangeLabel(preset, customRange) {
|
|
|
43
43
|
}
|
|
44
44
|
if (customRange?.from) {
|
|
45
45
|
if (customRange.to) {
|
|
46
|
-
return `${
|
|
46
|
+
return `${utils_dateFormat.formatShortDate(customRange.from)} – ${utils_dateFormat.formatShortDate(customRange.to)}`;
|
|
47
47
|
}
|
|
48
|
-
return
|
|
48
|
+
return utils_dateFormat.formatShortDate(customRange.from) ?? "";
|
|
49
49
|
}
|
|
50
50
|
return "Custom range";
|
|
51
51
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-metrics.cjs.js","sources":["../../../../src/domains/metrics/hooks/use-metrics.tsx"],"sourcesContent":["/* eslint-disable react-refresh/only-export-components */\nimport {
|
|
1
|
+
{"version":3,"file":"use-metrics.cjs.js","sources":["../../../../src/domains/metrics/hooks/use-metrics.tsx"],"sourcesContent":["/* eslint-disable react-refresh/only-export-components */\nimport { createContext, useContext, useMemo } from 'react';\nimport type { ReactNode } from 'react';\n\nimport { buildMetricsDimensionalFilter } from '../metrics-filters';\nimport type { MetricsDimensionalFilter } from '../metrics-filters';\nimport type { PropertyFilterToken } from '@/ds/components/PropertyFilter/types';\nimport { formatShortDate } from '@/utils/date-format';\n\nconst DATE_PRESETS = [\n { label: 'Last 24 hours', value: '24h' },\n { label: 'Last 3 days', value: '3d' },\n { label: 'Last 7 days', value: '7d' },\n { label: 'Last 14 days', value: '14d' },\n { label: 'Last 30 days', value: '30d' },\n] as const;\n\nexport type DatePreset = (typeof DATE_PRESETS)[number]['value'] | 'custom';\n\nexport { DATE_PRESETS };\n\nconst VALID_PRESETS = new Set<string>(DATE_PRESETS.map(p => p.value));\n\nexport function isValidPreset(value: string | null | undefined): value is DatePreset {\n return typeof value === 'string' && (VALID_PRESETS.has(value) || value === 'custom');\n}\n\nexport type DateRange = { from?: Date; to?: Date };\n\n/** Internal — all state is derived from the URL-backed props the owner passes.\n * There is intentionally no local mirror; keeping a mirror caused URL ↔ state\n * feedback loops that re-rendered the entire metrics tree on every keystroke.\n */\ntype MetricsContextValue = {\n datePreset: DatePreset;\n setDatePreset: (v: DatePreset) => void;\n customRange: DateRange | undefined;\n setCustomRange: (v: DateRange | undefined) => void;\n dateRangeLabel: string;\n filterTokens: PropertyFilterToken[];\n setFilterTokens: (tokens: PropertyFilterToken[]) => void;\n dimensionalFilter: MetricsDimensionalFilter;\n /** Stable JSON representation of `dimensionalFilter`, safe for query keys. */\n dimensionalFilterKey: string;\n /** Base path drilldown links should target for the Traces page. */\n tracesBasePath: string | undefined;\n /** Base path drilldown links should target for the Logs page. */\n logsBasePath: string | undefined;\n};\n\nexport const MetricsContext = createContext<MetricsContextValue>({\n datePreset: '24h',\n setDatePreset: () => {},\n customRange: undefined,\n setCustomRange: () => {},\n dateRangeLabel: 'Last 24 hours',\n filterTokens: [],\n setFilterTokens: () => {},\n dimensionalFilter: {},\n dimensionalFilterKey: '{}',\n tracesBasePath: undefined,\n logsBasePath: undefined,\n});\n\nexport function useMetrics() {\n return useContext(MetricsContext);\n}\n\nfunction getDateRangeLabel(preset: DatePreset, customRange: DateRange | undefined) {\n if (preset !== 'custom') {\n return DATE_PRESETS.find(p => p.value === preset)?.label ?? preset;\n }\n if (customRange?.from) {\n if (customRange.to) {\n return `${formatShortDate(customRange.from)} – ${formatShortDate(customRange.to)}`;\n }\n return formatShortDate(customRange.from) ?? '';\n }\n return 'Custom range';\n}\n\n/**\n * URL-driven metrics provider.\n *\n * The owner (page) is expected to:\n * - pass the current `preset` / `filterTokens` derived from `useSearchParams`\n * - pass `onPresetChange` / `onFilterTokensChange` that update the URL\n *\n * The provider never stores its own copies — changes round-trip through the URL\n * exactly once, which keeps re-renders bounded no matter how much data is on\n * screen.\n */\nexport function MetricsProvider({\n children,\n preset,\n filterTokens,\n onPresetChange,\n onFilterTokensChange,\n customRange,\n onCustomRangeChange,\n tracesBasePath,\n logsBasePath,\n}: {\n children: ReactNode;\n preset: DatePreset;\n filterTokens: PropertyFilterToken[];\n onPresetChange: (preset: DatePreset) => void;\n onFilterTokensChange: (tokens: PropertyFilterToken[]) => void;\n customRange?: DateRange;\n onCustomRangeChange?: (range: DateRange | undefined) => void;\n /** Base path for drilldown links to the Traces page. Defaults to `/traces` when omitted. */\n tracesBasePath?: string;\n /** Base path for drilldown links to the Logs page. Defaults to `/logs` when omitted. */\n logsBasePath?: string;\n}) {\n // Stable key for memo dependencies — the parent may re-create the tokens\n // array on every render (e.g. from `useMemo(... , [searchParams])`), but the\n // *content* usually doesn't change.\n const filterTokensKey = useMemo(() => JSON.stringify(filterTokens), [filterTokens]);\n\n // Intentional: re-pin only when the serialized content changes, not on every\n // parent render that allocates a new array.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const stableFilterTokens = useMemo(() => filterTokens, [filterTokensKey]);\n\n const dimensionalFilter = useMemo(() => buildMetricsDimensionalFilter(stableFilterTokens), [stableFilterTokens]);\n\n const dimensionalFilterKey = useMemo(() => JSON.stringify(dimensionalFilter), [dimensionalFilter]);\n\n const dateRangeLabel = getDateRangeLabel(preset, customRange);\n\n const value = useMemo<MetricsContextValue>(\n () => ({\n datePreset: preset,\n setDatePreset: onPresetChange,\n customRange,\n setCustomRange: onCustomRangeChange ?? (() => {}),\n dateRangeLabel,\n filterTokens: stableFilterTokens,\n setFilterTokens: onFilterTokensChange,\n dimensionalFilter,\n dimensionalFilterKey,\n tracesBasePath,\n logsBasePath,\n }),\n [\n preset,\n onPresetChange,\n customRange,\n onCustomRangeChange,\n dateRangeLabel,\n stableFilterTokens,\n onFilterTokensChange,\n dimensionalFilter,\n dimensionalFilterKey,\n tracesBasePath,\n logsBasePath,\n ],\n );\n\n return <MetricsContext.Provider value={value}>{children}</MetricsContext.Provider>;\n}\n"],"names":["createContext","useContext","formatShortDate","useMemo","buildMetricsDimensionalFilter","jsx"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsx } from 'react/jsx-runtime';
|
|
2
|
-
import { format } from 'date-fns';
|
|
3
2
|
import { createContext, useMemo, useContext } from 'react';
|
|
4
3
|
import { buildMetricsDimensionalFilter } from '../metrics-filters.es.js';
|
|
4
|
+
import { formatShortDate } from '../../../utils/date-format.es.js';
|
|
5
5
|
|
|
6
6
|
const DATE_PRESETS = [
|
|
7
7
|
{ label: "Last 24 hours", value: "24h" },
|
|
@@ -39,9 +39,9 @@ function getDateRangeLabel(preset, customRange) {
|
|
|
39
39
|
}
|
|
40
40
|
if (customRange?.from) {
|
|
41
41
|
if (customRange.to) {
|
|
42
|
-
return `${
|
|
42
|
+
return `${formatShortDate(customRange.from)} – ${formatShortDate(customRange.to)}`;
|
|
43
43
|
}
|
|
44
|
-
return
|
|
44
|
+
return formatShortDate(customRange.from) ?? "";
|
|
45
45
|
}
|
|
46
46
|
return "Custom range";
|
|
47
47
|
}
|