@mastra/playground-ui 65.0.0-alpha.9 → 65.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/dist/{ask-user-card-DnvW7jXS.js → ask-user-card-B9q_GFTt.js} +2 -2
- package/dist/{ask-user-card-DnvW7jXS.js.map → ask-user-card-B9q_GFTt.js.map} +1 -1
- package/dist/{ask-user-card-DiFQcUzM.cjs → ask-user-card-C-N5rpYG.cjs} +2 -2
- package/dist/{ask-user-card-DiFQcUzM.cjs.map → ask-user-card-C-N5rpYG.cjs.map} +1 -1
- package/dist/components/Button.cjs.js +1 -1
- package/dist/components/Button.es.js +1 -1
- package/dist/components/CommandPalette.cjs.js +1 -1
- package/dist/components/CommandPalette.es.js +1 -1
- package/dist/components/Comment.cjs.js +1 -1
- package/dist/components/Comment.es.js +1 -1
- package/dist/components/DataCodeSection.cjs.js +1 -1
- package/dist/components/DataCodeSection.es.js +1 -1
- package/dist/components/DataList.cjs.js +15 -17
- package/dist/components/DataList.cjs.js.map +1 -1
- package/dist/components/DataList.es.js +4 -5
- 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/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/EnvironmentVariablesEditor.cjs.js +2 -2
- package/dist/components/EnvironmentVariablesEditor.es.js +2 -2
- package/dist/components/Field.cjs.js +1 -1
- package/dist/components/Field.es.js +1 -1
- package/dist/components/FilterBar.cjs.js +2 -2
- package/dist/components/FilterBar.es.js +2 -2
- package/dist/components/JSONSchemaForm.cjs.js +1 -1
- package/dist/components/JSONSchemaForm.es.js +1 -1
- package/dist/components/Kbd.cjs.js +1 -1
- package/dist/components/Kbd.es.js +1 -1
- package/dist/components/ListSearch.cjs.js +1 -1
- package/dist/components/ListSearch.es.js +1 -1
- package/dist/components/LogsDataList.cjs.js +5 -2
- package/dist/components/LogsDataList.cjs.js.map +1 -1
- package/dist/components/LogsDataList.es.js +5 -2
- package/dist/components/LogsDataList.es.js.map +1 -1
- package/dist/components/PropertyFilter.cjs.js +1 -1
- package/dist/components/PropertyFilter.es.js +1 -1
- package/dist/components/SavedViews.cjs.js +1 -1
- package/dist/components/SavedViews.es.js +1 -1
- package/dist/components/SearchInput.cjs.js +1 -1
- package/dist/components/SearchInput.es.js +1 -1
- package/dist/components/Section.cjs.js +1 -1
- package/dist/components/Section.es.js +1 -1
- package/dist/components/SideDialog.cjs.js +225 -2
- package/dist/components/SideDialog.cjs.js.map +1 -1
- package/dist/components/SideDialog.es.js +210 -1
- package/dist/components/SideDialog.es.js.map +1 -1
- package/dist/components/Sidebar.cjs.js +63 -59
- package/dist/components/Sidebar.cjs.js.map +1 -1
- package/dist/components/Sidebar.es.js +64 -61
- package/dist/components/Sidebar.es.js.map +1 -1
- package/dist/components/ai/activity.cjs.js +1 -1
- package/dist/components/ai/activity.es.js +1 -1
- package/dist/components/ai/ask-user.cjs.js +1 -1
- package/dist/components/ai/ask-user.es.js +1 -1
- package/dist/{data-code-section-BjyHoHEB.cjs → data-code-section-BsvdKW08.cjs} +2 -2
- package/dist/{data-code-section-BjyHoHEB.cjs.map → data-code-section-BsvdKW08.cjs.map} +1 -1
- package/dist/{data-code-section-BWzfg-1n.js → data-code-section-y1BMLr3c.js} +2 -2
- package/dist/{data-code-section-BWzfg-1n.js.map → data-code-section-y1BMLr3c.js.map} +1 -1
- package/dist/{data-list-top-DJh08vFA.cjs → data-list-4t6Ueon8.cjs} +365 -16
- package/dist/data-list-4t6Ueon8.cjs.map +1 -0
- package/dist/{data-list-top-Cu4C2Z07.js → data-list-BQMBFAyK.js} +357 -7
- package/dist/data-list-BQMBFAyK.js.map +1 -0
- package/dist/{data-list-skeleton-sdcaabdX.cjs → data-list-skeleton-CVXZYY0k.cjs} +6 -6
- package/dist/{data-list-skeleton-sdcaabdX.cjs.map → data-list-skeleton-CVXZYY0k.cjs.map} +1 -1
- package/dist/{data-list-skeleton-CiilOVAl.js → data-list-skeleton-D54r1ycU.js} +2 -2
- package/dist/{data-list-skeleton-CiilOVAl.js.map → data-list-skeleton-D54r1ycU.js.map} +1 -1
- package/dist/{data-panel-CUqcB4Vn.js → data-panel-DSgidnnv.js} +2 -2
- package/dist/{data-panel-CUqcB4Vn.js.map → data-panel-DSgidnnv.js.map} +1 -1
- package/dist/{data-panel-CGRPVnEe.cjs → data-panel-xqrai98b.cjs} +2 -2
- package/dist/{data-panel-CGRPVnEe.cjs.map → data-panel-xqrai98b.cjs.map} +1 -1
- package/dist/{date-time-range-picker-BB6ivHR-.js → date-time-range-picker-BnYWCqei.js} +2 -2
- package/dist/{date-time-range-picker-BB6ivHR-.js.map → date-time-range-picker-BnYWCqei.js.map} +1 -1
- package/dist/{date-time-range-picker-ExPgeHV_.cjs → date-time-range-picker-_2RJBOUn.cjs} +2 -2
- package/dist/{date-time-range-picker-ExPgeHV_.cjs.map → date-time-range-picker-_2RJBOUn.cjs.map} +1 -1
- package/dist/domains/capabilities.cjs.js +4 -0
- package/dist/domains/capabilities.cjs.js.map +1 -1
- package/dist/domains/capabilities.es.js +1 -1
- package/dist/domains/chat/messages/dataset-save-action.cjs.js +1 -1
- package/dist/domains/chat/messages/dataset-save-action.es.js +1 -1
- package/dist/domains/chat/messages/notification-signal-notice.cjs.js +23 -3
- package/dist/domains/chat/messages/notification-signal-notice.cjs.js.map +1 -1
- package/dist/domains/chat/messages/notification-signal-notice.es.js +24 -6
- package/dist/domains/chat/messages/notification-signal-notice.es.js.map +1 -1
- package/dist/domains/chat/messages/signal-data.cjs.js +12 -0
- package/dist/domains/chat/messages/signal-data.cjs.js.map +1 -1
- package/dist/domains/chat/messages/signal-data.es.js +12 -1
- package/dist/domains/chat/messages/signal-data.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/workflow-badge.cjs.js +3 -0
- package/dist/domains/chat/tools/badges/workflow-badge.cjs.js.map +1 -1
- package/dist/domains/chat/tools/badges/workflow-badge.es.js +3 -0
- package/dist/domains/chat/tools/badges/workflow-badge.es.js.map +1 -1
- package/dist/domains/chat.cjs.js +1 -0
- package/dist/domains/chat.cjs.js.map +1 -1
- package/dist/domains/chat.es.js +1 -1
- package/dist/domains/datasets/components/add-dataset-item-dialog/add-dataset-item-dialog.cjs.js +24 -16
- package/dist/domains/datasets/components/add-dataset-item-dialog/add-dataset-item-dialog.cjs.js.map +1 -1
- package/dist/domains/datasets/components/add-dataset-item-dialog/add-dataset-item-dialog.es.js +24 -16
- package/dist/domains/datasets/components/add-dataset-item-dialog/add-dataset-item-dialog.es.js.map +1 -1
- package/dist/domains/datasets/components/add-dataset-item-dialog/build-add-item-payload.cjs.js +7 -8
- package/dist/domains/datasets/components/add-dataset-item-dialog/build-add-item-payload.cjs.js.map +1 -1
- package/dist/domains/datasets/components/add-dataset-item-dialog/build-add-item-payload.es.js +7 -8
- package/dist/domains/datasets/components/add-dataset-item-dialog/build-add-item-payload.es.js.map +1 -1
- package/dist/domains/datasets/components/add-dataset-item-dialog/collapsible-settings-row.cjs.js +1 -1
- package/dist/domains/datasets/components/add-dataset-item-dialog/collapsible-settings-row.es.js +1 -1
- package/dist/domains/datasets/components/add-dataset-item-dialog/dataset-field-errors.cjs.js +1 -1
- package/dist/domains/datasets/components/add-dataset-item-dialog/dataset-field-errors.es.js +1 -1
- package/dist/domains/datasets/components/add-dataset-item-dialog/dataset-picker.cjs.js +1 -1
- package/dist/domains/datasets/components/add-dataset-item-dialog/dataset-picker.es.js +1 -1
- package/dist/domains/datasets/components/save-as-dataset-item-dialog.cjs.js +2 -2
- package/dist/domains/datasets/components/save-as-dataset-item-dialog.es.js +2 -2
- package/dist/domains/logs/components/log-data-panel.cjs.js +1 -1
- package/dist/domains/logs/components/log-data-panel.es.js +1 -1
- package/dist/domains/logs/components/logs-list-view.cjs.js +3 -2
- package/dist/domains/logs/components/logs-list-view.cjs.js.map +1 -1
- package/dist/domains/logs/components/logs-list-view.es.js +3 -2
- package/dist/domains/logs/components/logs-list-view.es.js.map +1 -1
- package/dist/domains/memory/components/observation-detail-view.cjs.js +1 -1
- package/dist/domains/memory/components/observation-detail-view.es.js +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/observability/components/trace-as-item-dialog.cjs.js +14 -2
- package/dist/domains/observability/components/trace-as-item-dialog.cjs.js.map +1 -1
- package/dist/domains/observability/components/trace-as-item-dialog.es.js +14 -2
- package/dist/domains/observability/components/trace-as-item-dialog.es.js.map +1 -1
- package/dist/domains/scores/components/score-data-panel.cjs.js +1 -1
- package/dist/domains/scores/components/score-data-panel.es.js +1 -1
- package/dist/domains/scores/components/trace-scores-tab.cjs.js +2 -1
- package/dist/domains/scores/components/trace-scores-tab.cjs.js.map +1 -1
- package/dist/domains/scores/components/trace-scores-tab.es.js +2 -1
- package/dist/domains/scores/components/trace-scores-tab.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-summary-description.cjs.js +1 -1
- package/dist/domains/traces/components/span-summary-description.es.js +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/trace-columns-menu.cjs.js +1 -1
- package/dist/domains/traces/components/trace-columns-menu.es.js +1 -1
- package/dist/domains/traces/components/trace-data-panel-view.cjs.js +3 -8
- package/dist/domains/traces/components/trace-data-panel-view.cjs.js.map +1 -1
- package/dist/domains/traces/components/trace-data-panel-view.es.js +4 -9
- package/dist/domains/traces/components/trace-data-panel-view.es.js.map +1 -1
- package/dist/domains/traces/components/trace-data-panel.cjs.js +2 -0
- package/dist/domains/traces/components/trace-data-panel.cjs.js.map +1 -1
- package/dist/domains/traces/components/trace-data-panel.es.js +2 -0
- package/dist/domains/traces/components/trace-data-panel.es.js.map +1 -1
- package/dist/domains/traces/components/trace-error-cell.cjs.js +3 -1
- package/dist/domains/traces/components/trace-error-cell.cjs.js.map +1 -1
- package/dist/domains/traces/components/trace-error-cell.es.js +3 -1
- package/dist/domains/traces/components/trace-error-cell.es.js.map +1 -1
- 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-panel.cjs.js +0 -2
- package/dist/domains/traces/components/trace-span-panel.cjs.js.map +1 -1
- package/dist/domains/traces/components/trace-span-panel.es.js +0 -2
- package/dist/domains/traces/components/trace-span-panel.es.js.map +1 -1
- package/dist/domains/traces/components/trace-summary-description.cjs.js +1 -1
- package/dist/domains/traces/components/trace-summary-description.es.js +1 -1
- package/dist/domains/traces/components/trace-thread-panel.cjs.js +1 -1
- package/dist/domains/traces/components/trace-thread-panel.es.js +1 -1
- package/dist/domains/traces/components/trace-time-range-chip.cjs.js +2 -2
- package/dist/domains/traces/components/trace-time-range-chip.es.js +2 -2
- package/dist/domains/traces/components/traces-explorer/traces-explorer-auto-refresh.cjs.js +1 -1
- package/dist/domains/traces/components/traces-explorer/traces-explorer-auto-refresh.es.js +1 -1
- package/dist/domains/traces/components/traces-explorer/traces-explorer-context.cjs.js.map +1 -1
- package/dist/domains/traces/components/traces-explorer/traces-explorer-context.es.js.map +1 -1
- package/dist/domains/traces/components/traces-explorer/traces-explorer-filter-bar.cjs.js +2 -2
- package/dist/domains/traces/components/traces-explorer/traces-explorer-filter-bar.es.js +2 -2
- package/dist/domains/traces/components/traces-explorer/traces-explorer-list-provider.cjs.js +2 -1
- package/dist/domains/traces/components/traces-explorer/traces-explorer-list-provider.cjs.js.map +1 -1
- package/dist/domains/traces/components/traces-explorer/traces-explorer-list-provider.es.js +2 -1
- package/dist/domains/traces/components/traces-explorer/traces-explorer-list-provider.es.js.map +1 -1
- package/dist/domains/traces/components/traces-explorer/traces-explorer-panel.cjs.js +4 -15
- package/dist/domains/traces/components/traces-explorer/traces-explorer-panel.cjs.js.map +1 -1
- package/dist/domains/traces/components/traces-explorer/traces-explorer-panel.es.js +4 -15
- package/dist/domains/traces/components/traces-explorer/traces-explorer-panel.es.js.map +1 -1
- package/dist/domains/traces/components/traces-explorer/traces-explorer-root.cjs.js +3 -0
- package/dist/domains/traces/components/traces-explorer/traces-explorer-root.cjs.js.map +1 -1
- package/dist/domains/traces/components/traces-explorer/traces-explorer-root.es.js +4 -1
- package/dist/domains/traces/components/traces-explorer/traces-explorer-root.es.js.map +1 -1
- package/dist/domains/traces/components/traces-explorer/use-traces-filter-bar.cjs.js +1 -1
- package/dist/domains/traces/components/traces-explorer/use-traces-filter-bar.es.js +1 -1
- package/dist/domains/traces/components/traces-list-view.cjs.js +4 -5
- package/dist/domains/traces/components/traces-list-view.cjs.js.map +1 -1
- package/dist/domains/traces/components/traces-list-view.es.js +3 -4
- package/dist/domains/traces/components/traces-list-view.es.js.map +1 -1
- package/dist/domains/traces/components/traces-page-skeleton.cjs.js +4 -1
- package/dist/domains/traces/components/traces-page-skeleton.cjs.js.map +1 -1
- package/dist/domains/traces/components/traces-page-skeleton.es.js +4 -1
- package/dist/domains/traces/components/traces-page-skeleton.es.js.map +1 -1
- package/dist/domains/traces/hooks/use-traces-list-source.cjs.js +36 -9
- package/dist/domains/traces/hooks/use-traces-list-source.cjs.js.map +1 -1
- package/dist/domains/traces/hooks/use-traces-list-source.es.js +37 -12
- package/dist/domains/traces/hooks/use-traces-list-source.es.js.map +1 -1
- package/dist/domains/workflows/components/workflows-list/workflows-list.cjs.js +2 -2
- package/dist/domains/workflows/components/workflows-list/workflows-list.es.js +2 -2
- package/dist/domains/workflows/workflow/input/workflow-json-input.cjs.js +1 -1
- package/dist/domains/workflows/workflow/input/workflow-json-input.es.js +1 -1
- package/dist/domains/workflows/workflow/input/workflow-processor-input.cjs.js +1 -1
- package/dist/domains/workflows/workflow/input/workflow-processor-input.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-debug-mode-switch.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-debug-mode-switch.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-time-travel-form.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-time-travel-form.es.js +1 -1
- package/dist/domains/workspace/components/workspace-add-skill-dialog.cjs.js +2 -2
- package/dist/domains/workspace/components/workspace-add-skill-dialog.es.js +2 -2
- package/dist/ee/signals/components/entity-index-list.cjs.js +3 -1
- package/dist/ee/signals/components/entity-index-list.cjs.js.map +1 -1
- package/dist/ee/signals/components/entity-index-list.es.js +3 -1
- package/dist/ee/signals/components/entity-index-list.es.js.map +1 -1
- package/dist/ee/signals/components/trace-intelligence-entity-index.cjs.js +4 -2
- package/dist/ee/signals/components/trace-intelligence-entity-index.cjs.js.map +1 -1
- package/dist/ee/signals/components/trace-intelligence-entity-index.es.js +4 -2
- package/dist/ee/signals/components/trace-intelligence-entity-index.es.js.map +1 -1
- package/dist/ee/signals/settings/signal-definition-form-dialog.cjs.js +1 -1
- package/dist/ee/signals/settings/signal-definition-form-dialog.es.js +1 -1
- package/dist/ee/signals/trace-intelligence-explainer.cjs.js +1 -0
- package/dist/ee/signals/trace-intelligence-explainer.cjs.js.map +1 -1
- package/dist/ee/signals/trace-intelligence-explainer.es.js +1 -0
- package/dist/ee/signals/trace-intelligence-explainer.es.js.map +1 -1
- package/dist/ee/topics/components/topic-trace-summary-list.cjs.js +2 -2
- package/dist/ee/topics/components/topic-trace-summary-list.es.js +2 -2
- package/dist/{field-BCU5ZtWV.cjs → field-CZ5fldpM.cjs} +2 -1
- package/dist/{field-BCU5ZtWV.cjs.map → field-CZ5fldpM.cjs.map} +1 -1
- package/dist/{field-Dl1zeXTv.js → field-CfA5-ixH.js} +2 -1
- package/dist/{field-Dl1zeXTv.js.map → field-CfA5-ixH.js.map} +1 -1
- package/dist/{filter-bar-C6NdZctn.cjs → filter-bar-CjBb01b6.cjs} +3 -3
- package/dist/{filter-bar-C6NdZctn.cjs.map → filter-bar-CjBb01b6.cjs.map} +1 -1
- package/dist/{filter-bar-chip-DgvuQv6c.cjs → filter-bar-chip-C_64m7nX.cjs} +2 -2
- package/dist/{filter-bar-chip-DgvuQv6c.cjs.map → filter-bar-chip-C_64m7nX.cjs.map} +1 -1
- package/dist/{filter-bar-chip-DM73lTpx.js → filter-bar-chip-D2kKMSRA.js} +2 -2
- package/dist/{filter-bar-chip-DM73lTpx.js.map → filter-bar-chip-D2kKMSRA.js.map} +1 -1
- package/dist/{filter-bar-DW0fD4bu.js → filter-bar-pXSJt2ye.js} +3 -3
- package/dist/{filter-bar-DW0fD4bu.js.map → filter-bar-pXSJt2ye.js.map} +1 -1
- package/dist/{kbd-Xgv5HKEi.cjs → kbd-B2zbS_A6.cjs} +2 -2
- package/dist/{kbd-Xgv5HKEi.cjs.map → kbd-B2zbS_A6.cjs.map} +1 -1
- package/dist/{kbd-7Xx2pm9f.js → kbd-CYtMrOov.js} +2 -2
- package/dist/{kbd-7Xx2pm9f.js.map → kbd-CYtMrOov.js.map} +1 -1
- package/dist/layout/tabbed-container.cjs.js +2 -2
- package/dist/layout/tabbed-container.es.js +2 -2
- package/dist/lib/form/components/boolean-field.cjs.js +1 -1
- package/dist/lib/form/components/boolean-field.es.js +1 -1
- package/dist/lib/form/components/field-wrapper.cjs.js +1 -1
- package/dist/lib/form/components/field-wrapper.es.js +1 -1
- package/dist/{list-search-ByJdIxIh.js → list-search-8jVOq9LK.js} +2 -2
- package/dist/{list-search-ByJdIxIh.js.map → list-search-8jVOq9LK.js.map} +1 -1
- package/dist/{list-search-DNJVeHmK.cjs → list-search-C7ckmZHa.cjs} +2 -2
- package/dist/{list-search-DNJVeHmK.cjs.map → list-search-C7ckmZHa.cjs.map} +1 -1
- package/dist/{logs-data-list-DCj8Pj77.cjs → logs-data-list-C4Z4rw62.cjs} +21 -22
- package/dist/{logs-data-list-DCj8Pj77.cjs.map → logs-data-list-C4Z4rw62.cjs.map} +1 -1
- package/dist/{logs-data-list-VEEruqHO.js → logs-data-list-CL3iq_6r.js} +2 -3
- package/dist/{logs-data-list-VEEruqHO.js.map → logs-data-list-CL3iq_6r.js.map} +1 -1
- package/dist/new/settings.cjs.js +1 -1
- package/dist/new/settings.es.js +1 -1
- package/dist/{notification-activity-BWXHmlTn.js → notification-activity-BRW1Xlj1.js} +9 -5
- package/dist/notification-activity-BRW1Xlj1.js.map +1 -0
- package/dist/{notification-activity-BSNuqJDd.cjs → notification-activity-DAZOALWI.cjs} +9 -5
- package/dist/notification-activity-DAZOALWI.cjs.map +1 -0
- package/dist/resize/collapsible-panel.cjs.js +1 -1
- package/dist/resize/collapsible-panel.es.js +1 -1
- package/dist/{search-input-CMNy0JWd.cjs → search-input-CGNENJDh.cjs} +2 -2
- package/dist/{search-input-CMNy0JWd.cjs.map → search-input-CGNENJDh.cjs.map} +1 -1
- package/dist/{search-input-C9qFBzn6.js → search-input-cIYk0pl3.js} +2 -2
- package/dist/{search-input-C9qFBzn6.js.map → search-input-cIYk0pl3.js.map} +1 -1
- package/dist/{section-skBYREaR.cjs → section-BikCyHdf.cjs} +2 -2
- package/dist/{section-skBYREaR.cjs.map → section-BikCyHdf.cjs.map} +1 -1
- package/dist/{section-eRs4NnCC.js → section-C71zDLKM.js} +2 -2
- package/dist/{section-eRs4NnCC.js.map → section-C71zDLKM.js.map} +1 -1
- package/dist/{settings-row-Ds-PVocx.cjs → settings-row-C9lT2BJS.cjs} +2 -2
- package/dist/{settings-row-Ds-PVocx.cjs.map → settings-row-C9lT2BJS.cjs.map} +1 -1
- package/dist/{settings-row-BHtjEfPr.js → settings-row-CRpU1an-.js} +2 -2
- package/dist/{settings-row-BHtjEfPr.js.map → settings-row-CRpU1an-.js.map} +1 -1
- package/dist/src/domains/capabilities/index.d.ts +1 -1
- package/dist/src/domains/chat/messages/notification-signal-notice.d.ts +2 -0
- package/dist/src/domains/chat/messages/signal-data.d.ts +9 -0
- package/dist/src/domains/datasets/components/add-dataset-item-dialog/add-dataset-item-dialog.d.ts +2 -2
- package/dist/src/domains/datasets/components/add-dataset-item-dialog/build-add-item-payload.d.ts +2 -0
- package/dist/src/domains/traces/components/trace-data-panel-view.d.ts +1 -5
- package/dist/src/domains/traces/components/trace-span-panel.d.ts +1 -2
- package/dist/src/domains/traces/components/traces-explorer/traces-explorer-context.d.ts +2 -0
- package/dist/src/domains/traces/components/traces-explorer/traces-explorer-panel.d.ts +3 -1
- package/dist/src/domains/traces/hooks/use-traces-list-source.d.ts +7 -1
- package/dist/src/ds/components/DataList/data-list-root.d.ts +2 -0
- package/dist/src/ds/components/Sidebar/header/sidebar-badge.d.ts +7 -0
- package/dist/src/ds/components/Sidebar/header/sidebar-button-hint.d.ts +7 -0
- package/dist/src/ds/components/Sidebar/header/sidebar-search-trigger.d.ts +14 -3
- package/dist/src/ds/components/Sidebar/index.d.ts +1 -0
- package/dist/src/ds/components/Sidebar/root/sidebar-trigger.d.ts +2 -2
- package/dist/src/ds/components/Sidebar/sidebar.d.ts +5 -1
- package/dist/src/ds/components/ai/activity/presets/notification-activity.d.ts +5 -1
- package/dist/style.css +29 -13
- package/dist/{traces-data-list-CF_LFvnf.cjs → traces-data-list-BOHhsgDI.cjs} +18 -20
- package/dist/{traces-data-list-CF_LFvnf.cjs.map → traces-data-list-BOHhsgDI.cjs.map} +1 -1
- package/dist/{traces-data-list-DgmSuEKb.js → traces-data-list-CP6knkOn.js} +2 -4
- package/dist/{traces-data-list-DgmSuEKb.js.map → traces-data-list-CP6knkOn.js.map} +1 -1
- package/package.json +11 -11
- package/dist/data-list-CD_lls8O.js +0 -138
- package/dist/data-list-CD_lls8O.js.map +0 -1
- package/dist/data-list-CGD9hzcp.cjs +0 -142
- package/dist/data-list-CGD9hzcp.cjs.map +0 -1
- package/dist/data-list-spacer-DpXJrZe1.js +0 -209
- package/dist/data-list-spacer-DpXJrZe1.js.map +0 -1
- package/dist/data-list-spacer-Dpoj55mv.cjs +0 -218
- package/dist/data-list-spacer-Dpoj55mv.cjs.map +0 -1
- package/dist/data-list-top-Cu4C2Z07.js.map +0 -1
- package/dist/data-list-top-DJh08vFA.cjs.map +0 -1
- package/dist/domains/observability/components/add-trace-mocks-to-item-dialog.cjs.js +0 -205
- package/dist/domains/observability/components/add-trace-mocks-to-item-dialog.cjs.js.map +0 -1
- package/dist/domains/observability/components/add-trace-mocks-to-item-dialog.d.ts +0 -2
- package/dist/domains/observability/components/add-trace-mocks-to-item-dialog.es.js +0 -201
- package/dist/domains/observability/components/add-trace-mocks-to-item-dialog.es.js.map +0 -1
- package/dist/notification-activity-BSNuqJDd.cjs.map +0 -1
- package/dist/notification-activity-BWXHmlTn.js.map +0 -1
- package/dist/side-dialog-B7a4dasE.cjs +0 -231
- package/dist/side-dialog-B7a4dasE.cjs.map +0 -1
- package/dist/side-dialog-DVea8YTO.js +0 -211
- package/dist/side-dialog-DVea8YTO.js.map +0 -1
- package/dist/src/domains/observability/components/add-trace-mocks-to-item-dialog.d.ts +0 -9
|
@@ -11,7 +11,6 @@ const domains_traces_components_spanFeedbackTab = require('../span-feedback-tab.
|
|
|
11
11
|
const domains_traces_components_traceFeedbackTab = require('../trace-feedback-tab.cjs.js');
|
|
12
12
|
const domains_traces_components_traceSpanPanel = require('../trace-span-panel.cjs.js');
|
|
13
13
|
const domains_traces_components_tracesExplorer_tracesExplorerContext = require('./traces-explorer-context.cjs.js');
|
|
14
|
-
const domains_observability_components_addTraceMocksToItemDialog = require('../../../observability/components/add-trace-mocks-to-item-dialog.cjs.js');
|
|
15
14
|
const domains_observability_components_traceAsItemDialog = require('../../../observability/components/trace-as-item-dialog.cjs.js');
|
|
16
15
|
require('lucide-react');
|
|
17
16
|
require('@base-ui/react/combobox');
|
|
@@ -31,7 +30,8 @@ function TracesExplorerPanel({
|
|
|
31
30
|
onOpenScore,
|
|
32
31
|
renderCreateDatasetDialog,
|
|
33
32
|
headerActionsSlot,
|
|
34
|
-
traceHref
|
|
33
|
+
traceHref,
|
|
34
|
+
withAddTraceToDataset = true
|
|
35
35
|
}) {
|
|
36
36
|
const { withQueryTrace, withFeedback } = domains_traces_components_tracesExplorer_tracesExplorerContext.useTracesConfig();
|
|
37
37
|
const { rows, autoRefetch, isLoading: isListLoading } = domains_traces_components_tracesExplorer_tracesExplorerContext.useTracesList();
|
|
@@ -40,7 +40,6 @@ function TracesExplorerPanel({
|
|
|
40
40
|
const traceId = selection.traceId;
|
|
41
41
|
const spanId = selection.spanId;
|
|
42
42
|
const [datasetDialogTarget, setDatasetDialogTarget] = React.useState(null);
|
|
43
|
-
const [addMocksTarget, setAddMocksTarget] = React.useState(null);
|
|
44
43
|
const [fullThreadTraceId, setFullThreadTraceId] = React.useState(null);
|
|
45
44
|
const { data: traceFeedbackData } = traces.useTraceFeedback({
|
|
46
45
|
traceId,
|
|
@@ -72,7 +71,6 @@ function TracesExplorerPanel({
|
|
|
72
71
|
});
|
|
73
72
|
const usage = traceId ? usageByTraceId?.get(traceId) : void 0;
|
|
74
73
|
const { handlePreviousTrace, handleNextTrace } = domains_traces_hooks_useTraceListNavigation.useTraceListNavigation(rows, traceId, null, selectTrace);
|
|
75
|
-
const isAgentTrace = anchorSpan?.entityType === "agent";
|
|
76
74
|
const isFullThreadOpen = !!traceId && fullThreadTraceId === traceId;
|
|
77
75
|
const depth = isFullThreadOpen ? 3 : 2;
|
|
78
76
|
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
@@ -97,8 +95,7 @@ function TracesExplorerPanel({
|
|
|
97
95
|
onOpenScore,
|
|
98
96
|
onFullThreadOpenChange: (open) => setFullThreadTraceId(open ? traceId ?? null : null),
|
|
99
97
|
onSpanSelect: (id) => selectSpan(id ?? null),
|
|
100
|
-
onSaveAsDatasetItem: setDatasetDialogTarget,
|
|
101
|
-
onAddTraceMocksToItem: isAgentTrace ? setAddMocksTarget : void 0,
|
|
98
|
+
onSaveAsDatasetItem: withAddTraceToDataset ? setDatasetDialogTarget : void 0,
|
|
102
99
|
initialSpanId: spanId,
|
|
103
100
|
onPrevious: handlePreviousTrace,
|
|
104
101
|
onNext: handleNextTrace,
|
|
@@ -120,7 +117,7 @@ function TracesExplorerPanel({
|
|
|
120
117
|
}
|
|
121
118
|
),
|
|
122
119
|
/* @__PURE__ */ jsxRuntime.jsx(domains_scores_components_scoreDataPanel.ScoreDataPanel, { depth, score: featuredScore, onClose: () => selectScore(null) }),
|
|
123
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
120
|
+
withAddTraceToDataset && /* @__PURE__ */ jsxRuntime.jsx(
|
|
124
121
|
domains_observability_components_traceAsItemDialog.TraceAsItemDialog,
|
|
125
122
|
{
|
|
126
123
|
rootSpanId: datasetDialogTarget?.rootSpanId,
|
|
@@ -129,14 +126,6 @@ function TracesExplorerPanel({
|
|
|
129
126
|
onClose: () => setDatasetDialogTarget(null),
|
|
130
127
|
renderCreateDatasetDialog
|
|
131
128
|
}
|
|
132
|
-
),
|
|
133
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
134
|
-
domains_observability_components_addTraceMocksToItemDialog.AddTraceMocksToItemDialog,
|
|
135
|
-
{
|
|
136
|
-
traceId: addMocksTarget?.traceId,
|
|
137
|
-
isOpen: !!addMocksTarget,
|
|
138
|
-
onClose: () => setAddMocksTarget(null)
|
|
139
|
-
}
|
|
140
129
|
)
|
|
141
130
|
] });
|
|
142
131
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"traces-explorer-panel.cjs.js","sources":["../../../../../src/domains/traces/components/traces-explorer/traces-explorer-panel.tsx"],"sourcesContent":["import { useTraceSpanScores } from '@mastra/react/hooks/scores';\nimport { useSpanFeedback, useTraceFeedback, useTraceOrBranchSpans, useTraceUsage } from '@mastra/react/hooks/traces';\nimport { useState } from 'react';\nimport type { ComponentProps, ReactNode } from 'react';\nimport { useTraceListNavigation } from '../../hooks/use-trace-list-navigation';\nimport type { SpanTab } from '../../types';\nimport { SpanFeedbackTab } from '../span-feedback-tab';\nimport { TraceFeedbackTab } from '../trace-feedback-tab';\nimport { TraceSpanPanel } from '../trace-span-panel';\nimport type { TraceSpanPanelProps } from '../trace-span-panel';\nimport { useTraceUsageColumns, useTracesConfig, useTracesList, useTracesSelection } from './traces-explorer-context';\nimport { AddTraceMocksToItemDialog } from '@/domains/observability/components/add-trace-mocks-to-item-dialog';\nimport { TraceAsItemDialog } from '@/domains/observability/components/trace-as-item-dialog';\nimport { ScoreDataPanel, TraceScoresTab } from '@/domains/scores';\n\nexport type TracesExplorerPanelProps = {\n /** Opens a score of one of the full thread's traces (the host owns routing). */\n onOpenScore: (traceId: string, scoreId: string) => void;\n renderCreateDatasetDialog?: ComponentProps<typeof TraceAsItemDialog>['renderCreateDatasetDialog'];\n /** Host integration actions rendered alongside the trace controls. */\n headerActionsSlot?: (args: { traceId: string; spans: TraceSpanPanelProps['spans'] }) => ReactNode;\n /** Builds the href of the dedicated trace page; without it the drawer offers no \"Open trace page\" link. */\n traceHref?: (traceId: string) => string;\n};\n\ntype DatasetDialogTarget = { traceId: string; rootSpanId: string | undefined };\n\nexport function TracesExplorerPanel({\n onOpenScore,\n renderCreateDatasetDialog,\n headerActionsSlot,\n traceHref,\n}: TracesExplorerPanelProps) {\n const { withQueryTrace, withFeedback } = useTracesConfig();\n const { rows, autoRefetch, isLoading: isListLoading } = useTracesList();\n const { selection, selectTrace, closeTrace, selectSpan, setSpanTab, setSpanView, selectScore, highlightSpans } =\n useTracesSelection();\n const { usageEnabled } = useTraceUsageColumns();\n const traceId = selection.traceId;\n const spanId = selection.spanId;\n\n const [datasetDialogTarget, setDatasetDialogTarget] = useState<DatasetDialogTarget | null>(null);\n const [addMocksTarget, setAddMocksTarget] = useState<{ traceId: string } | null>(null);\n // Keyed by trace id so selecting another trace (row click, prev/next) falls back to the trace panel.\n const [fullThreadTraceId, setFullThreadTraceId] = useState<string | null>(null);\n\n // Tab badge counts; the tab bodies re-use these first-page queries through React Query's cache.\n const { data: traceFeedbackData } = useTraceFeedback({\n traceId,\n queryOptions: { enabled: withFeedback && !!traceId },\n });\n const { data: spanFeedbackData } = useSpanFeedback({\n traceId,\n spanId,\n queryOptions: { enabled: withFeedback && !!traceId && !!spanId },\n });\n\n const {\n spans,\n anchorSpanId,\n isLoading: isLoadingSpans,\n } = useTraceOrBranchSpans({ traceId: traceId ?? null, listMode: 'traces', anchorSpanId: null });\n const anchorSpan = anchorSpanId\n ? spans?.find(s => s.spanId === anchorSpanId)\n : spans?.find(s => s.parentSpanId == null);\n\n const { data: spanScoresData } = useTraceSpanScores({\n traceId,\n spanId: anchorSpan?.spanId,\n queryOptions: { enabled: !!traceId && !!anchorSpan?.spanId },\n });\n const featuredScore = selection.scoreId\n ? spanScoresData?.scores?.find(score => score.id === selection.scoreId)\n : undefined;\n\n // Same key as the list's usage query when the trace is listed, so React Query serves it from cache.\n // Waits for the list so a deep-linked trace doesn't fetch its own usage before the rows arrive.\n const rowIds = rows.map(row => row.traceId);\n const isListed = !!traceId && rowIds.includes(traceId);\n const { data: usageByTraceId } = useTraceUsage({\n traceIds: isListed ? rowIds : traceId ? [traceId] : [],\n enabled: usageEnabled && !isListLoading,\n autoRefetch,\n });\n const usage = traceId ? usageByTraceId?.get(traceId) : undefined;\n\n const { handlePreviousTrace, handleNextTrace } = useTraceListNavigation(rows, traceId, null, selectTrace);\n\n // Tool mocks only make sense for agent runs.\n const isAgentTrace = anchorSpan?.entityType === 'agent';\n const isFullThreadOpen = !!traceId && fullThreadTraceId === traceId;\n const depth = isFullThreadOpen ? 3 : 2;\n\n return (\n <>\n <TraceSpanPanel\n title=\"Trace details\"\n size={spanId ? 'full' : 'wide'}\n traceId={traceId}\n spans={spans}\n anchorSpanId={anchorSpanId}\n usage={usage}\n isLoadingSpans={isLoadingSpans}\n selectedSpanId={spanId ?? null}\n onClose={() => {\n setFullThreadTraceId(null);\n closeTrace();\n }}\n isFullThreadOpen={isFullThreadOpen}\n withQueryTrace={withQueryTrace}\n withFeedback={withFeedback}\n onOpenScore={onOpenScore}\n onFullThreadOpenChange={open => setFullThreadTraceId(open ? (traceId ?? null) : null)}\n onSpanSelect={id => selectSpan(id ?? null)}\n onSaveAsDatasetItem={setDatasetDialogTarget}\n onAddTraceMocksToItem={isAgentTrace ? setAddMocksTarget : undefined}\n initialSpanId={spanId}\n onPrevious={handlePreviousTrace}\n onNext={handleNextTrace}\n showPartialThread\n featuredSpanIds={selection.highlightSpanIds}\n onHighlightSpans={highlightSpans}\n feedbackTabBadge={withFeedback ? (traceFeedbackData?.pagination?.total ?? undefined) : undefined}\n feedbackTabSlot={withFeedback ? ({ traceId: tid }) => <TraceFeedbackTab traceId={tid} /> : undefined}\n scoresTabBadge={spanScoresData?.pagination?.total ?? undefined}\n scoresTabSlot={({ traceId: tid, rootSpanId }) =>\n rootSpanId ? <TraceScoresTab traceId={tid} spanId={rootSpanId} onScoreSelect={selectScore} /> : null\n }\n spanView={selection.spanView}\n onSpanViewChange={setSpanView}\n spanActiveTab={selection.spanTab ?? 'details'}\n onSpanTabChange={tab => setSpanTab(tab as SpanTab)}\n spanFeedbackTabBadge={withFeedback ? (spanFeedbackData?.pagination?.total ?? undefined) : undefined}\n spanFeedbackTabSlot={\n withFeedback\n ? ({ traceId: tid, spanId: sid }) =>\n tid && sid ? <SpanFeedbackTab key={`${tid}:${sid}`} traceId={tid} spanId={sid} /> : null\n : undefined\n }\n headerActionsSlot={traceId && headerActionsSlot ? headerActionsSlot({ traceId, spans }) : undefined}\n traceHref={traceId && traceHref ? traceHref(traceId) : undefined}\n />\n <ScoreDataPanel depth={depth} score={featuredScore} onClose={() => selectScore(null)} />\n <TraceAsItemDialog\n rootSpanId={datasetDialogTarget?.rootSpanId}\n traceId={datasetDialogTarget?.traceId}\n isOpen={!!datasetDialogTarget}\n onClose={() => setDatasetDialogTarget(null)}\n renderCreateDatasetDialog={renderCreateDatasetDialog}\n />\n <AddTraceMocksToItemDialog\n traceId={addMocksTarget?.traceId}\n isOpen={!!addMocksTarget}\n onClose={() => setAddMocksTarget(null)}\n />\n </>\n );\n}\n"],"names":["useTracesConfig","useTracesList","useTracesSelection","useTraceUsageColumns","useState","useTraceFeedback","useSpanFeedback","useTraceOrBranchSpans","useTraceSpanScores","useTraceUsage","useTraceListNavigation","jsxs","Fragment","jsx","TraceSpanPanel","TraceFeedbackTab","TraceScoresTab","SpanFeedbackTab","ScoreDataPanel","TraceAsItemDialog","AddTraceMocksToItemDialog"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"traces-explorer-panel.cjs.js","sources":["../../../../../src/domains/traces/components/traces-explorer/traces-explorer-panel.tsx"],"sourcesContent":["import { useTraceSpanScores } from '@mastra/react/hooks/scores';\nimport { useSpanFeedback, useTraceFeedback, useTraceOrBranchSpans, useTraceUsage } from '@mastra/react/hooks/traces';\nimport { useState } from 'react';\nimport type { ComponentProps, ReactNode } from 'react';\nimport { useTraceListNavigation } from '../../hooks/use-trace-list-navigation';\nimport type { SpanTab } from '../../types';\nimport { SpanFeedbackTab } from '../span-feedback-tab';\nimport { TraceFeedbackTab } from '../trace-feedback-tab';\nimport { TraceSpanPanel } from '../trace-span-panel';\nimport type { TraceSpanPanelProps } from '../trace-span-panel';\nimport { useTraceUsageColumns, useTracesConfig, useTracesList, useTracesSelection } from './traces-explorer-context';\nimport { TraceAsItemDialog } from '@/domains/observability/components/trace-as-item-dialog';\nimport { ScoreDataPanel, TraceScoresTab } from '@/domains/scores';\n\nexport type TracesExplorerPanelProps = {\n /** Opens a score of one of the full thread's traces (the host owns routing). */\n onOpenScore: (traceId: string, scoreId: string) => void;\n renderCreateDatasetDialog?: ComponentProps<typeof TraceAsItemDialog>['renderCreateDatasetDialog'];\n /** Host integration actions rendered alongside the trace controls. */\n headerActionsSlot?: (args: { traceId: string; spans: TraceSpanPanelProps['spans'] }) => ReactNode;\n /** Builds the href of the dedicated trace page; without it the drawer offers no \"Open trace page\" link. */\n traceHref?: (traceId: string) => string;\n /** Shows \"Add full trace to dataset\" in the trace actions menu. Defaults to `true`. */\n withAddTraceToDataset?: boolean;\n};\n\ntype DatasetDialogTarget = { traceId: string; rootSpanId: string | undefined };\n\nexport function TracesExplorerPanel({\n onOpenScore,\n renderCreateDatasetDialog,\n headerActionsSlot,\n traceHref,\n withAddTraceToDataset = true,\n}: TracesExplorerPanelProps) {\n const { withQueryTrace, withFeedback } = useTracesConfig();\n const { rows, autoRefetch, isLoading: isListLoading } = useTracesList();\n const { selection, selectTrace, closeTrace, selectSpan, setSpanTab, setSpanView, selectScore, highlightSpans } =\n useTracesSelection();\n const { usageEnabled } = useTraceUsageColumns();\n const traceId = selection.traceId;\n const spanId = selection.spanId;\n\n const [datasetDialogTarget, setDatasetDialogTarget] = useState<DatasetDialogTarget | null>(null);\n // Keyed by trace id so selecting another trace (row click, prev/next) falls back to the trace panel.\n const [fullThreadTraceId, setFullThreadTraceId] = useState<string | null>(null);\n\n // Tab badge counts; the tab bodies re-use these first-page queries through React Query's cache.\n const { data: traceFeedbackData } = useTraceFeedback({\n traceId,\n queryOptions: { enabled: withFeedback && !!traceId },\n });\n const { data: spanFeedbackData } = useSpanFeedback({\n traceId,\n spanId,\n queryOptions: { enabled: withFeedback && !!traceId && !!spanId },\n });\n\n const {\n spans,\n anchorSpanId,\n isLoading: isLoadingSpans,\n } = useTraceOrBranchSpans({ traceId: traceId ?? null, listMode: 'traces', anchorSpanId: null });\n const anchorSpan = anchorSpanId\n ? spans?.find(s => s.spanId === anchorSpanId)\n : spans?.find(s => s.parentSpanId == null);\n\n const { data: spanScoresData } = useTraceSpanScores({\n traceId,\n spanId: anchorSpan?.spanId,\n queryOptions: { enabled: !!traceId && !!anchorSpan?.spanId },\n });\n const featuredScore = selection.scoreId\n ? spanScoresData?.scores?.find(score => score.id === selection.scoreId)\n : undefined;\n\n // Same key as the list's usage query when the trace is listed, so React Query serves it from cache.\n // Waits for the list so a deep-linked trace doesn't fetch its own usage before the rows arrive.\n const rowIds = rows.map(row => row.traceId);\n const isListed = !!traceId && rowIds.includes(traceId);\n const { data: usageByTraceId } = useTraceUsage({\n traceIds: isListed ? rowIds : traceId ? [traceId] : [],\n enabled: usageEnabled && !isListLoading,\n autoRefetch,\n });\n const usage = traceId ? usageByTraceId?.get(traceId) : undefined;\n\n const { handlePreviousTrace, handleNextTrace } = useTraceListNavigation(rows, traceId, null, selectTrace);\n\n const isFullThreadOpen = !!traceId && fullThreadTraceId === traceId;\n const depth = isFullThreadOpen ? 3 : 2;\n\n return (\n <>\n <TraceSpanPanel\n title=\"Trace details\"\n size={spanId ? 'full' : 'wide'}\n traceId={traceId}\n spans={spans}\n anchorSpanId={anchorSpanId}\n usage={usage}\n isLoadingSpans={isLoadingSpans}\n selectedSpanId={spanId ?? null}\n onClose={() => {\n setFullThreadTraceId(null);\n closeTrace();\n }}\n isFullThreadOpen={isFullThreadOpen}\n withQueryTrace={withQueryTrace}\n withFeedback={withFeedback}\n onOpenScore={onOpenScore}\n onFullThreadOpenChange={open => setFullThreadTraceId(open ? (traceId ?? null) : null)}\n onSpanSelect={id => selectSpan(id ?? null)}\n onSaveAsDatasetItem={withAddTraceToDataset ? setDatasetDialogTarget : undefined}\n initialSpanId={spanId}\n onPrevious={handlePreviousTrace}\n onNext={handleNextTrace}\n showPartialThread\n featuredSpanIds={selection.highlightSpanIds}\n onHighlightSpans={highlightSpans}\n feedbackTabBadge={withFeedback ? (traceFeedbackData?.pagination?.total ?? undefined) : undefined}\n feedbackTabSlot={withFeedback ? ({ traceId: tid }) => <TraceFeedbackTab traceId={tid} /> : undefined}\n scoresTabBadge={spanScoresData?.pagination?.total ?? undefined}\n scoresTabSlot={({ traceId: tid, rootSpanId }) =>\n rootSpanId ? <TraceScoresTab traceId={tid} spanId={rootSpanId} onScoreSelect={selectScore} /> : null\n }\n spanView={selection.spanView}\n onSpanViewChange={setSpanView}\n spanActiveTab={selection.spanTab ?? 'details'}\n onSpanTabChange={tab => setSpanTab(tab as SpanTab)}\n spanFeedbackTabBadge={withFeedback ? (spanFeedbackData?.pagination?.total ?? undefined) : undefined}\n spanFeedbackTabSlot={\n withFeedback\n ? ({ traceId: tid, spanId: sid }) =>\n tid && sid ? <SpanFeedbackTab key={`${tid}:${sid}`} traceId={tid} spanId={sid} /> : null\n : undefined\n }\n headerActionsSlot={traceId && headerActionsSlot ? headerActionsSlot({ traceId, spans }) : undefined}\n traceHref={traceId && traceHref ? traceHref(traceId) : undefined}\n />\n <ScoreDataPanel depth={depth} score={featuredScore} onClose={() => selectScore(null)} />\n {withAddTraceToDataset && (\n <TraceAsItemDialog\n rootSpanId={datasetDialogTarget?.rootSpanId}\n traceId={datasetDialogTarget?.traceId}\n isOpen={!!datasetDialogTarget}\n onClose={() => setDatasetDialogTarget(null)}\n renderCreateDatasetDialog={renderCreateDatasetDialog}\n />\n )}\n </>\n );\n}\n"],"names":["useTracesConfig","useTracesList","useTracesSelection","useTraceUsageColumns","useState","useTraceFeedback","useSpanFeedback","useTraceOrBranchSpans","useTraceSpanScores","useTraceUsage","useTraceListNavigation","jsxs","Fragment","jsx","TraceSpanPanel","TraceFeedbackTab","TraceScoresTab","SpanFeedbackTab","ScoreDataPanel","TraceAsItemDialog"],"mappings":"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"}
|
|
@@ -7,7 +7,6 @@ import { SpanFeedbackTab } from '../span-feedback-tab.es.js';
|
|
|
7
7
|
import { TraceFeedbackTab } from '../trace-feedback-tab.es.js';
|
|
8
8
|
import { TraceSpanPanel } from '../trace-span-panel.es.js';
|
|
9
9
|
import { useTracesConfig, useTracesList, useTracesSelection, useTraceUsageColumns } from './traces-explorer-context.es.js';
|
|
10
|
-
import { AddTraceMocksToItemDialog } from '../../../observability/components/add-trace-mocks-to-item-dialog.es.js';
|
|
11
10
|
import { TraceAsItemDialog } from '../../../observability/components/trace-as-item-dialog.es.js';
|
|
12
11
|
import 'lucide-react';
|
|
13
12
|
import '@base-ui/react/combobox';
|
|
@@ -27,7 +26,8 @@ function TracesExplorerPanel({
|
|
|
27
26
|
onOpenScore,
|
|
28
27
|
renderCreateDatasetDialog,
|
|
29
28
|
headerActionsSlot,
|
|
30
|
-
traceHref
|
|
29
|
+
traceHref,
|
|
30
|
+
withAddTraceToDataset = true
|
|
31
31
|
}) {
|
|
32
32
|
const { withQueryTrace, withFeedback } = useTracesConfig();
|
|
33
33
|
const { rows, autoRefetch, isLoading: isListLoading } = useTracesList();
|
|
@@ -36,7 +36,6 @@ function TracesExplorerPanel({
|
|
|
36
36
|
const traceId = selection.traceId;
|
|
37
37
|
const spanId = selection.spanId;
|
|
38
38
|
const [datasetDialogTarget, setDatasetDialogTarget] = useState(null);
|
|
39
|
-
const [addMocksTarget, setAddMocksTarget] = useState(null);
|
|
40
39
|
const [fullThreadTraceId, setFullThreadTraceId] = useState(null);
|
|
41
40
|
const { data: traceFeedbackData } = useTraceFeedback({
|
|
42
41
|
traceId,
|
|
@@ -68,7 +67,6 @@ function TracesExplorerPanel({
|
|
|
68
67
|
});
|
|
69
68
|
const usage = traceId ? usageByTraceId?.get(traceId) : void 0;
|
|
70
69
|
const { handlePreviousTrace, handleNextTrace } = useTraceListNavigation(rows, traceId, null, selectTrace);
|
|
71
|
-
const isAgentTrace = anchorSpan?.entityType === "agent";
|
|
72
70
|
const isFullThreadOpen = !!traceId && fullThreadTraceId === traceId;
|
|
73
71
|
const depth = isFullThreadOpen ? 3 : 2;
|
|
74
72
|
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
@@ -93,8 +91,7 @@ function TracesExplorerPanel({
|
|
|
93
91
|
onOpenScore,
|
|
94
92
|
onFullThreadOpenChange: (open) => setFullThreadTraceId(open ? traceId ?? null : null),
|
|
95
93
|
onSpanSelect: (id) => selectSpan(id ?? null),
|
|
96
|
-
onSaveAsDatasetItem: setDatasetDialogTarget,
|
|
97
|
-
onAddTraceMocksToItem: isAgentTrace ? setAddMocksTarget : void 0,
|
|
94
|
+
onSaveAsDatasetItem: withAddTraceToDataset ? setDatasetDialogTarget : void 0,
|
|
98
95
|
initialSpanId: spanId,
|
|
99
96
|
onPrevious: handlePreviousTrace,
|
|
100
97
|
onNext: handleNextTrace,
|
|
@@ -116,7 +113,7 @@ function TracesExplorerPanel({
|
|
|
116
113
|
}
|
|
117
114
|
),
|
|
118
115
|
/* @__PURE__ */ jsx(ScoreDataPanel, { depth, score: featuredScore, onClose: () => selectScore(null) }),
|
|
119
|
-
/* @__PURE__ */ jsx(
|
|
116
|
+
withAddTraceToDataset && /* @__PURE__ */ jsx(
|
|
120
117
|
TraceAsItemDialog,
|
|
121
118
|
{
|
|
122
119
|
rootSpanId: datasetDialogTarget?.rootSpanId,
|
|
@@ -125,14 +122,6 @@ function TracesExplorerPanel({
|
|
|
125
122
|
onClose: () => setDatasetDialogTarget(null),
|
|
126
123
|
renderCreateDatasetDialog
|
|
127
124
|
}
|
|
128
|
-
),
|
|
129
|
-
/* @__PURE__ */ jsx(
|
|
130
|
-
AddTraceMocksToItemDialog,
|
|
131
|
-
{
|
|
132
|
-
traceId: addMocksTarget?.traceId,
|
|
133
|
-
isOpen: !!addMocksTarget,
|
|
134
|
-
onClose: () => setAddMocksTarget(null)
|
|
135
|
-
}
|
|
136
125
|
)
|
|
137
126
|
] });
|
|
138
127
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"traces-explorer-panel.es.js","sources":["../../../../../src/domains/traces/components/traces-explorer/traces-explorer-panel.tsx"],"sourcesContent":["import { useTraceSpanScores } from '@mastra/react/hooks/scores';\nimport { useSpanFeedback, useTraceFeedback, useTraceOrBranchSpans, useTraceUsage } from '@mastra/react/hooks/traces';\nimport { useState } from 'react';\nimport type { ComponentProps, ReactNode } from 'react';\nimport { useTraceListNavigation } from '../../hooks/use-trace-list-navigation';\nimport type { SpanTab } from '../../types';\nimport { SpanFeedbackTab } from '../span-feedback-tab';\nimport { TraceFeedbackTab } from '../trace-feedback-tab';\nimport { TraceSpanPanel } from '../trace-span-panel';\nimport type { TraceSpanPanelProps } from '../trace-span-panel';\nimport { useTraceUsageColumns, useTracesConfig, useTracesList, useTracesSelection } from './traces-explorer-context';\nimport { AddTraceMocksToItemDialog } from '@/domains/observability/components/add-trace-mocks-to-item-dialog';\nimport { TraceAsItemDialog } from '@/domains/observability/components/trace-as-item-dialog';\nimport { ScoreDataPanel, TraceScoresTab } from '@/domains/scores';\n\nexport type TracesExplorerPanelProps = {\n /** Opens a score of one of the full thread's traces (the host owns routing). */\n onOpenScore: (traceId: string, scoreId: string) => void;\n renderCreateDatasetDialog?: ComponentProps<typeof TraceAsItemDialog>['renderCreateDatasetDialog'];\n /** Host integration actions rendered alongside the trace controls. */\n headerActionsSlot?: (args: { traceId: string; spans: TraceSpanPanelProps['spans'] }) => ReactNode;\n /** Builds the href of the dedicated trace page; without it the drawer offers no \"Open trace page\" link. */\n traceHref?: (traceId: string) => string;\n};\n\ntype DatasetDialogTarget = { traceId: string; rootSpanId: string | undefined };\n\nexport function TracesExplorerPanel({\n onOpenScore,\n renderCreateDatasetDialog,\n headerActionsSlot,\n traceHref,\n}: TracesExplorerPanelProps) {\n const { withQueryTrace, withFeedback } = useTracesConfig();\n const { rows, autoRefetch, isLoading: isListLoading } = useTracesList();\n const { selection, selectTrace, closeTrace, selectSpan, setSpanTab, setSpanView, selectScore, highlightSpans } =\n useTracesSelection();\n const { usageEnabled } = useTraceUsageColumns();\n const traceId = selection.traceId;\n const spanId = selection.spanId;\n\n const [datasetDialogTarget, setDatasetDialogTarget] = useState<DatasetDialogTarget | null>(null);\n const [addMocksTarget, setAddMocksTarget] = useState<{ traceId: string } | null>(null);\n // Keyed by trace id so selecting another trace (row click, prev/next) falls back to the trace panel.\n const [fullThreadTraceId, setFullThreadTraceId] = useState<string | null>(null);\n\n // Tab badge counts; the tab bodies re-use these first-page queries through React Query's cache.\n const { data: traceFeedbackData } = useTraceFeedback({\n traceId,\n queryOptions: { enabled: withFeedback && !!traceId },\n });\n const { data: spanFeedbackData } = useSpanFeedback({\n traceId,\n spanId,\n queryOptions: { enabled: withFeedback && !!traceId && !!spanId },\n });\n\n const {\n spans,\n anchorSpanId,\n isLoading: isLoadingSpans,\n } = useTraceOrBranchSpans({ traceId: traceId ?? null, listMode: 'traces', anchorSpanId: null });\n const anchorSpan = anchorSpanId\n ? spans?.find(s => s.spanId === anchorSpanId)\n : spans?.find(s => s.parentSpanId == null);\n\n const { data: spanScoresData } = useTraceSpanScores({\n traceId,\n spanId: anchorSpan?.spanId,\n queryOptions: { enabled: !!traceId && !!anchorSpan?.spanId },\n });\n const featuredScore = selection.scoreId\n ? spanScoresData?.scores?.find(score => score.id === selection.scoreId)\n : undefined;\n\n // Same key as the list's usage query when the trace is listed, so React Query serves it from cache.\n // Waits for the list so a deep-linked trace doesn't fetch its own usage before the rows arrive.\n const rowIds = rows.map(row => row.traceId);\n const isListed = !!traceId && rowIds.includes(traceId);\n const { data: usageByTraceId } = useTraceUsage({\n traceIds: isListed ? rowIds : traceId ? [traceId] : [],\n enabled: usageEnabled && !isListLoading,\n autoRefetch,\n });\n const usage = traceId ? usageByTraceId?.get(traceId) : undefined;\n\n const { handlePreviousTrace, handleNextTrace } = useTraceListNavigation(rows, traceId, null, selectTrace);\n\n // Tool mocks only make sense for agent runs.\n const isAgentTrace = anchorSpan?.entityType === 'agent';\n const isFullThreadOpen = !!traceId && fullThreadTraceId === traceId;\n const depth = isFullThreadOpen ? 3 : 2;\n\n return (\n <>\n <TraceSpanPanel\n title=\"Trace details\"\n size={spanId ? 'full' : 'wide'}\n traceId={traceId}\n spans={spans}\n anchorSpanId={anchorSpanId}\n usage={usage}\n isLoadingSpans={isLoadingSpans}\n selectedSpanId={spanId ?? null}\n onClose={() => {\n setFullThreadTraceId(null);\n closeTrace();\n }}\n isFullThreadOpen={isFullThreadOpen}\n withQueryTrace={withQueryTrace}\n withFeedback={withFeedback}\n onOpenScore={onOpenScore}\n onFullThreadOpenChange={open => setFullThreadTraceId(open ? (traceId ?? null) : null)}\n onSpanSelect={id => selectSpan(id ?? null)}\n onSaveAsDatasetItem={setDatasetDialogTarget}\n onAddTraceMocksToItem={isAgentTrace ? setAddMocksTarget : undefined}\n initialSpanId={spanId}\n onPrevious={handlePreviousTrace}\n onNext={handleNextTrace}\n showPartialThread\n featuredSpanIds={selection.highlightSpanIds}\n onHighlightSpans={highlightSpans}\n feedbackTabBadge={withFeedback ? (traceFeedbackData?.pagination?.total ?? undefined) : undefined}\n feedbackTabSlot={withFeedback ? ({ traceId: tid }) => <TraceFeedbackTab traceId={tid} /> : undefined}\n scoresTabBadge={spanScoresData?.pagination?.total ?? undefined}\n scoresTabSlot={({ traceId: tid, rootSpanId }) =>\n rootSpanId ? <TraceScoresTab traceId={tid} spanId={rootSpanId} onScoreSelect={selectScore} /> : null\n }\n spanView={selection.spanView}\n onSpanViewChange={setSpanView}\n spanActiveTab={selection.spanTab ?? 'details'}\n onSpanTabChange={tab => setSpanTab(tab as SpanTab)}\n spanFeedbackTabBadge={withFeedback ? (spanFeedbackData?.pagination?.total ?? undefined) : undefined}\n spanFeedbackTabSlot={\n withFeedback\n ? ({ traceId: tid, spanId: sid }) =>\n tid && sid ? <SpanFeedbackTab key={`${tid}:${sid}`} traceId={tid} spanId={sid} /> : null\n : undefined\n }\n headerActionsSlot={traceId && headerActionsSlot ? headerActionsSlot({ traceId, spans }) : undefined}\n traceHref={traceId && traceHref ? traceHref(traceId) : undefined}\n />\n <ScoreDataPanel depth={depth} score={featuredScore} onClose={() => selectScore(null)} />\n <TraceAsItemDialog\n rootSpanId={datasetDialogTarget?.rootSpanId}\n traceId={datasetDialogTarget?.traceId}\n isOpen={!!datasetDialogTarget}\n onClose={() => setDatasetDialogTarget(null)}\n renderCreateDatasetDialog={renderCreateDatasetDialog}\n />\n <AddTraceMocksToItemDialog\n traceId={addMocksTarget?.traceId}\n isOpen={!!addMocksTarget}\n onClose={() => setAddMocksTarget(null)}\n />\n </>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"traces-explorer-panel.es.js","sources":["../../../../../src/domains/traces/components/traces-explorer/traces-explorer-panel.tsx"],"sourcesContent":["import { useTraceSpanScores } from '@mastra/react/hooks/scores';\nimport { useSpanFeedback, useTraceFeedback, useTraceOrBranchSpans, useTraceUsage } from '@mastra/react/hooks/traces';\nimport { useState } from 'react';\nimport type { ComponentProps, ReactNode } from 'react';\nimport { useTraceListNavigation } from '../../hooks/use-trace-list-navigation';\nimport type { SpanTab } from '../../types';\nimport { SpanFeedbackTab } from '../span-feedback-tab';\nimport { TraceFeedbackTab } from '../trace-feedback-tab';\nimport { TraceSpanPanel } from '../trace-span-panel';\nimport type { TraceSpanPanelProps } from '../trace-span-panel';\nimport { useTraceUsageColumns, useTracesConfig, useTracesList, useTracesSelection } from './traces-explorer-context';\nimport { TraceAsItemDialog } from '@/domains/observability/components/trace-as-item-dialog';\nimport { ScoreDataPanel, TraceScoresTab } from '@/domains/scores';\n\nexport type TracesExplorerPanelProps = {\n /** Opens a score of one of the full thread's traces (the host owns routing). */\n onOpenScore: (traceId: string, scoreId: string) => void;\n renderCreateDatasetDialog?: ComponentProps<typeof TraceAsItemDialog>['renderCreateDatasetDialog'];\n /** Host integration actions rendered alongside the trace controls. */\n headerActionsSlot?: (args: { traceId: string; spans: TraceSpanPanelProps['spans'] }) => ReactNode;\n /** Builds the href of the dedicated trace page; without it the drawer offers no \"Open trace page\" link. */\n traceHref?: (traceId: string) => string;\n /** Shows \"Add full trace to dataset\" in the trace actions menu. Defaults to `true`. */\n withAddTraceToDataset?: boolean;\n};\n\ntype DatasetDialogTarget = { traceId: string; rootSpanId: string | undefined };\n\nexport function TracesExplorerPanel({\n onOpenScore,\n renderCreateDatasetDialog,\n headerActionsSlot,\n traceHref,\n withAddTraceToDataset = true,\n}: TracesExplorerPanelProps) {\n const { withQueryTrace, withFeedback } = useTracesConfig();\n const { rows, autoRefetch, isLoading: isListLoading } = useTracesList();\n const { selection, selectTrace, closeTrace, selectSpan, setSpanTab, setSpanView, selectScore, highlightSpans } =\n useTracesSelection();\n const { usageEnabled } = useTraceUsageColumns();\n const traceId = selection.traceId;\n const spanId = selection.spanId;\n\n const [datasetDialogTarget, setDatasetDialogTarget] = useState<DatasetDialogTarget | null>(null);\n // Keyed by trace id so selecting another trace (row click, prev/next) falls back to the trace panel.\n const [fullThreadTraceId, setFullThreadTraceId] = useState<string | null>(null);\n\n // Tab badge counts; the tab bodies re-use these first-page queries through React Query's cache.\n const { data: traceFeedbackData } = useTraceFeedback({\n traceId,\n queryOptions: { enabled: withFeedback && !!traceId },\n });\n const { data: spanFeedbackData } = useSpanFeedback({\n traceId,\n spanId,\n queryOptions: { enabled: withFeedback && !!traceId && !!spanId },\n });\n\n const {\n spans,\n anchorSpanId,\n isLoading: isLoadingSpans,\n } = useTraceOrBranchSpans({ traceId: traceId ?? null, listMode: 'traces', anchorSpanId: null });\n const anchorSpan = anchorSpanId\n ? spans?.find(s => s.spanId === anchorSpanId)\n : spans?.find(s => s.parentSpanId == null);\n\n const { data: spanScoresData } = useTraceSpanScores({\n traceId,\n spanId: anchorSpan?.spanId,\n queryOptions: { enabled: !!traceId && !!anchorSpan?.spanId },\n });\n const featuredScore = selection.scoreId\n ? spanScoresData?.scores?.find(score => score.id === selection.scoreId)\n : undefined;\n\n // Same key as the list's usage query when the trace is listed, so React Query serves it from cache.\n // Waits for the list so a deep-linked trace doesn't fetch its own usage before the rows arrive.\n const rowIds = rows.map(row => row.traceId);\n const isListed = !!traceId && rowIds.includes(traceId);\n const { data: usageByTraceId } = useTraceUsage({\n traceIds: isListed ? rowIds : traceId ? [traceId] : [],\n enabled: usageEnabled && !isListLoading,\n autoRefetch,\n });\n const usage = traceId ? usageByTraceId?.get(traceId) : undefined;\n\n const { handlePreviousTrace, handleNextTrace } = useTraceListNavigation(rows, traceId, null, selectTrace);\n\n const isFullThreadOpen = !!traceId && fullThreadTraceId === traceId;\n const depth = isFullThreadOpen ? 3 : 2;\n\n return (\n <>\n <TraceSpanPanel\n title=\"Trace details\"\n size={spanId ? 'full' : 'wide'}\n traceId={traceId}\n spans={spans}\n anchorSpanId={anchorSpanId}\n usage={usage}\n isLoadingSpans={isLoadingSpans}\n selectedSpanId={spanId ?? null}\n onClose={() => {\n setFullThreadTraceId(null);\n closeTrace();\n }}\n isFullThreadOpen={isFullThreadOpen}\n withQueryTrace={withQueryTrace}\n withFeedback={withFeedback}\n onOpenScore={onOpenScore}\n onFullThreadOpenChange={open => setFullThreadTraceId(open ? (traceId ?? null) : null)}\n onSpanSelect={id => selectSpan(id ?? null)}\n onSaveAsDatasetItem={withAddTraceToDataset ? setDatasetDialogTarget : undefined}\n initialSpanId={spanId}\n onPrevious={handlePreviousTrace}\n onNext={handleNextTrace}\n showPartialThread\n featuredSpanIds={selection.highlightSpanIds}\n onHighlightSpans={highlightSpans}\n feedbackTabBadge={withFeedback ? (traceFeedbackData?.pagination?.total ?? undefined) : undefined}\n feedbackTabSlot={withFeedback ? ({ traceId: tid }) => <TraceFeedbackTab traceId={tid} /> : undefined}\n scoresTabBadge={spanScoresData?.pagination?.total ?? undefined}\n scoresTabSlot={({ traceId: tid, rootSpanId }) =>\n rootSpanId ? <TraceScoresTab traceId={tid} spanId={rootSpanId} onScoreSelect={selectScore} /> : null\n }\n spanView={selection.spanView}\n onSpanViewChange={setSpanView}\n spanActiveTab={selection.spanTab ?? 'details'}\n onSpanTabChange={tab => setSpanTab(tab as SpanTab)}\n spanFeedbackTabBadge={withFeedback ? (spanFeedbackData?.pagination?.total ?? undefined) : undefined}\n spanFeedbackTabSlot={\n withFeedback\n ? ({ traceId: tid, spanId: sid }) =>\n tid && sid ? <SpanFeedbackTab key={`${tid}:${sid}`} traceId={tid} spanId={sid} /> : null\n : undefined\n }\n headerActionsSlot={traceId && headerActionsSlot ? headerActionsSlot({ traceId, spans }) : undefined}\n traceHref={traceId && traceHref ? traceHref(traceId) : undefined}\n />\n <ScoreDataPanel depth={depth} score={featuredScore} onClose={() => selectScore(null)} />\n {withAddTraceToDataset && (\n <TraceAsItemDialog\n rootSpanId={datasetDialogTarget?.rootSpanId}\n traceId={datasetDialogTarget?.traceId}\n isOpen={!!datasetDialogTarget}\n onClose={() => setDatasetDialogTarget(null)}\n renderCreateDatasetDialog={renderCreateDatasetDialog}\n />\n )}\n </>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -33,6 +33,7 @@ function TracesExplorerRoot({
|
|
|
33
33
|
const withQueryTrace = traceQuery.enabled && features?.traceQuery !== false;
|
|
34
34
|
const withFeedback = capabilities.useFeedbackAvailable().enabled && features?.feedback !== false;
|
|
35
35
|
const { enabled: withRootDuration } = capabilities.useTraceQueryRootDurationAvailable();
|
|
36
|
+
const { enabled: withDeltaPolling } = capabilities.useTraceQueryDeltaPollingAvailable();
|
|
36
37
|
const withDiscovery = capabilities.useTraceQueryDiscoveryAvailable().enabled && withQueryTrace;
|
|
37
38
|
const filters = React.useMemo(() => domains_traces_components_tracesExplorer_tracesExplorerActions.sanitizeTracesFilters(rawFilters, withRootDuration), [rawFilters, withRootDuration]);
|
|
38
39
|
const isScoped = !!scope;
|
|
@@ -108,6 +109,7 @@ function TracesExplorerRoot({
|
|
|
108
109
|
withQueryTrace,
|
|
109
110
|
withFeedback,
|
|
110
111
|
withRootDuration,
|
|
112
|
+
withDeltaPolling,
|
|
111
113
|
withDiscovery,
|
|
112
114
|
isCapabilitiesLoading: traceQuery.isLoading,
|
|
113
115
|
metricsSupport,
|
|
@@ -120,6 +122,7 @@ function TracesExplorerRoot({
|
|
|
120
122
|
withQueryTrace,
|
|
121
123
|
withFeedback,
|
|
122
124
|
withRootDuration,
|
|
125
|
+
withDeltaPolling,
|
|
123
126
|
withDiscovery,
|
|
124
127
|
traceQuery.isLoading,
|
|
125
128
|
metricsSupport,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"traces-explorer-root.cjs.js","sources":["../../../../../src/domains/traces/components/traces-explorer/traces-explorer-root.tsx"],"sourcesContent":["import { EntityType } from '@mastra/core/observability';\nimport { useMemo, useRef, useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { resolveTraceQueryTimeRange } from '../../trace-query-filters';\nimport {\n applyDate,\n applyDatePreset,\n applyDateRange,\n applyFilterTokens,\n clearSelection,\n DEFAULT_TRACES_FILTERS,\n highlightSpans,\n isSelectionEmpty,\n resolveTracesDateWindow,\n sanitizeTracesFilters,\n selectScore,\n selectSpan,\n selectTrace,\n setSpanTab,\n setSpanView,\n} from './traces-explorer-actions';\nimport type {\n TracesExplorerState,\n TracesFilters,\n TracesSelection,\n TracesSortDirection,\n} from './traces-explorer-actions';\nimport { TracesColumnsProvider } from './traces-explorer-columns-provider';\nimport { TracesConfigContext, TracesFiltersContext, TracesSelectionContext } from './traces-explorer-context';\nimport type {\n TracesConfigContextValue,\n TracesExplorerFeatures,\n TracesExplorerScope,\n TracesFiltersActions,\n TracesFiltersContextValue,\n TracesMetricsSupport,\n TracesSelectionActions,\n TracesSelectionContextValue,\n} from './traces-explorer-context';\nimport { TracesListProvider } from './traces-explorer-list-provider';\nimport {\n useFeedbackAvailable,\n useTraceQueryAvailable,\n useTraceQueryDiscoveryAvailable,\n useTraceQueryRootDurationAvailable,\n} from '@/domains/capabilities';\n\nexport type TracesExplorerRootProps = {\n selection: TracesSelection;\n filters: TracesFilters;\n /** Receives the full next state once per user action, so a filter edit and the selection it clears land together. */\n onChange: (next: TracesExplorerState) => void;\n sortDirection: TracesSortDirection;\n onSortDirectionChange: (next: TracesSortDirection) => void;\n /** Pins the explorer to one entity: its fields stay in the filters but never surface as chips. */\n scope?: TracesExplorerScope;\n /** Resolved by the host, which may know better than the storage capabilities (e.g. hosted deployments). */\n metricsSupport: TracesMetricsSupport;\n /** Host switches combined with the server capabilities; a feature runs only when both allow it. */\n features?: TracesExplorerFeatures;\n /** The host's default filters. Filters matching them don't count as applied (e.g. in empty states). */\n initialFilters?: TracesFilters;\n children: ReactNode;\n};\n\nconst SCOPED_FIELD_IDS: ReadonlySet<string> = new Set(['rootEntityType', 'entityId']);\nconst HIDDEN_SCOPED_FIELD_IDS: readonly string[] = ['rootEntityType', 'entityId', 'entityName'];\nconst NO_FIELD_IDS: ReadonlySet<string> = new Set();\nconst NO_HIDDEN_FIELD_IDS: readonly string[] = [];\n\nconst listIdForScope = (scope?: TracesExplorerScope) =>\n scope?.entityType === EntityType.AGENT\n ? 'agent-traces'\n : scope?.entityType === EntityType.WORKFLOW_RUN\n ? 'workflows-traces'\n : 'all-traces';\n\ntype Latest = Pick<TracesExplorerRootProps, 'selection' | 'filters' | 'onChange' | 'onSortDirectionChange'> & {\n scopedFieldIds: ReadonlySet<string>;\n};\n\nexport function TracesExplorerRoot({\n selection,\n filters: rawFilters,\n onChange,\n sortDirection,\n onSortDirectionChange,\n scope,\n metricsSupport,\n features,\n initialFilters = DEFAULT_TRACES_FILTERS,\n children,\n}: TracesExplorerRootProps) {\n // Servers without the trace-query API list through `listTracesLight` and don't expose feedback.\n const traceQuery = useTraceQueryAvailable();\n const withQueryTrace = traceQuery.enabled && features?.traceQuery !== false;\n const withFeedback = useFeedbackAvailable().enabled && features?.feedback !== false;\n const { enabled: withRootDuration } = useTraceQueryRootDurationAvailable();\n const withDiscovery = useTraceQueryDiscoveryAvailable().enabled && withQueryTrace;\n\n // Entries the server can't query are ignored, never written back: the host keeps its raw value.\n const filters = useMemo(() => sanitizeTracesFilters(rawFilters, withRootDuration), [rawFilters, withRootDuration]);\n\n const isScoped = !!scope;\n const scopedFieldIds = isScoped ? SCOPED_FIELD_IDS : NO_FIELD_IDS;\n const hiddenFieldIds = isScoped ? HIDDEN_SCOPED_FIELD_IDS : NO_HIDDEN_FIELD_IDS;\n\n // Rolling presets pin their start when the preset (or custom bound) changes, not on every render.\n const fromMs = rawFilters.dateFrom?.getTime();\n const toMs = rawFilters.dateTo?.getTime();\n const { dateFrom, dateTo } = useMemo(\n () =>\n resolveTracesDateWindow(\n rawFilters.datePreset,\n fromMs === undefined ? undefined : new Date(fromMs),\n toMs === undefined ? undefined : new Date(toMs),\n ),\n [rawFilters.datePreset, fromMs, toMs],\n );\n\n // Actions read the latest props when they run, so the host doesn't need stable callbacks.\n // `latest` is written as soon as a change is emitted, so a second action in the same tick\n // (the date picker fires a preset then its dates) builds on the first instead of the stale props.\n const current: Latest = { selection, filters: rawFilters, onChange, onSortDirectionChange, scopedFieldIds };\n const latest = useRef(current);\n latest.current = current;\n\n const actions = useMemo(() => {\n const emit = (next: TracesExplorerState) => {\n latest.current.selection = next.selection;\n latest.current.filters = next.filters;\n latest.current.onChange(next);\n };\n const updateSelection = (next: TracesSelection) => {\n if (next === latest.current.selection) return;\n emit({ selection: next, filters: latest.current.filters });\n };\n // A filter change invalidates whatever is selected: the selected row may no longer be listed.\n const updateFilters = (next: TracesFilters) => {\n const { selection: currentSelection, filters: currentFilters } = latest.current;\n if (next === currentFilters) return;\n emit({\n filters: next,\n selection: isSelectionEmpty(currentSelection) ? currentSelection : clearSelection(currentSelection),\n });\n };\n\n const selectionActions: TracesSelectionActions = {\n selectTrace: traceId => updateSelection(selectTrace(latest.current.selection, traceId)),\n closeTrace: () => updateSelection(selectTrace(latest.current.selection, null)),\n selectSpan: spanId => updateSelection(selectSpan(latest.current.selection, spanId)),\n setSpanTab: tab => updateSelection(setSpanTab(latest.current.selection, tab)),\n setSpanView: view => updateSelection(setSpanView(latest.current.selection, view)),\n selectScore: scoreId => updateSelection(selectScore(latest.current.selection, scoreId)),\n highlightSpans: spanIds => updateSelection(highlightSpans(latest.current.selection, spanIds)),\n };\n const filtersActions: TracesFiltersActions = {\n // Re-inject the scope tokens so \"Clear filters\" (which drops every removable item) and any\n // other edit can never drop the scope.\n setFilterTokens: (tokens, groups) => {\n const { filters: base, scopedFieldIds: scoped } = latest.current;\n const scopeTokens = base.tokens.filter(token => scoped.has(token.fieldId));\n updateFilters(applyFilterTokens(base, [...scopeTokens, ...tokens], groups));\n },\n setDatePreset: preset => updateFilters(applyDatePreset(latest.current.filters, preset)),\n setDate: (value, end) => updateFilters(applyDate(latest.current.filters, value, end)),\n setDateRange: (from, to) => updateFilters(applyDateRange(latest.current.filters, from, to)),\n };\n const onSortChange = (direction: TracesSortDirection) => latest.current.onSortDirectionChange(direction);\n return { selectionActions, filtersActions, onSortChange };\n }, []);\n const { selectionActions, filtersActions, onSortChange } = actions;\n\n // Discovery is keyed off the date window with a mount-time `now`, not the list's rolling one,\n // so its query key (and the skeleton) doesn't churn on every auto-refresh tick.\n const [discoveryNow] = useState(() => new Date());\n const discoveryTimeRange = useMemo(\n () => resolveTraceQueryTimeRange(dateFrom, dateTo, discoveryNow),\n [dateFrom, dateTo, discoveryNow],\n );\n\n const listId = listIdForScope(scope);\n const configValue = useMemo<TracesConfigContextValue>(\n () => ({\n listId,\n scopedFieldIds,\n hiddenFieldIds,\n withQueryTrace,\n withFeedback,\n withRootDuration,\n withDiscovery,\n isCapabilitiesLoading: traceQuery.isLoading,\n metricsSupport,\n discoveryTimeRange,\n }),\n [\n listId,\n scopedFieldIds,\n hiddenFieldIds,\n withQueryTrace,\n withFeedback,\n withRootDuration,\n withDiscovery,\n traceQuery.isLoading,\n metricsSupport,\n discoveryTimeRange,\n ],\n );\n\n const contentFiltersApplied = filters.tokens.length > 0 || filters.groups.length > 0;\n const filtersApplied = contentFiltersApplied || filters.datePreset !== initialFilters.datePreset || !!dateTo;\n const filtersValue = useMemo<TracesFiltersContextValue>(\n () => ({\n ...filtersActions,\n filters,\n dateFrom,\n dateTo,\n filtersApplied,\n contentFiltersApplied,\n }),\n [filtersActions, filters, dateFrom, dateTo, filtersApplied, contentFiltersApplied],\n );\n\n // Not memoized: the selection consumers (Layout, List, Panel) also re-render on filter and list\n // changes, which are what re-render Root while the selection stays the same.\n const selectionValue: TracesSelectionContextValue = {\n ...selectionActions,\n selection,\n selectedTraceId: selection.traceId,\n };\n\n return (\n <TracesConfigContext.Provider value={configValue}>\n <TracesFiltersContext.Provider value={filtersValue}>\n <TracesSelectionContext.Provider value={selectionValue}>\n <TracesListProvider sortDirection={sortDirection} onSortChange={onSortChange}>\n <TracesColumnsProvider>{children}</TracesColumnsProvider>\n </TracesListProvider>\n </TracesSelectionContext.Provider>\n </TracesFiltersContext.Provider>\n </TracesConfigContext.Provider>\n );\n}\n"],"names":["EntityType","DEFAULT_TRACES_FILTERS","useTraceQueryAvailable","useFeedbackAvailable","useTraceQueryRootDurationAvailable","useTraceQueryDiscoveryAvailable","useMemo","sanitizeTracesFilters","resolveTracesDateWindow","useRef","isSelectionEmpty","clearSelection","selectionActions","selectTrace","selectSpan","setSpanTab","setSpanView","selectScore","highlightSpans","filtersActions","applyFilterTokens","applyDatePreset","applyDate","applyDateRange","onSortChange","useState","resolveTraceQueryTimeRange","jsx","TracesConfigContext","TracesFiltersContext","TracesSelectionContext","TracesListProvider","TracesColumnsProvider"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"traces-explorer-root.cjs.js","sources":["../../../../../src/domains/traces/components/traces-explorer/traces-explorer-root.tsx"],"sourcesContent":["import { EntityType } from '@mastra/core/observability';\nimport { useMemo, useRef, useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { resolveTraceQueryTimeRange } from '../../trace-query-filters';\nimport {\n applyDate,\n applyDatePreset,\n applyDateRange,\n applyFilterTokens,\n clearSelection,\n DEFAULT_TRACES_FILTERS,\n highlightSpans,\n isSelectionEmpty,\n resolveTracesDateWindow,\n sanitizeTracesFilters,\n selectScore,\n selectSpan,\n selectTrace,\n setSpanTab,\n setSpanView,\n} from './traces-explorer-actions';\nimport type {\n TracesExplorerState,\n TracesFilters,\n TracesSelection,\n TracesSortDirection,\n} from './traces-explorer-actions';\nimport { TracesColumnsProvider } from './traces-explorer-columns-provider';\nimport { TracesConfigContext, TracesFiltersContext, TracesSelectionContext } from './traces-explorer-context';\nimport type {\n TracesConfigContextValue,\n TracesExplorerFeatures,\n TracesExplorerScope,\n TracesFiltersActions,\n TracesFiltersContextValue,\n TracesMetricsSupport,\n TracesSelectionActions,\n TracesSelectionContextValue,\n} from './traces-explorer-context';\nimport { TracesListProvider } from './traces-explorer-list-provider';\nimport {\n useFeedbackAvailable,\n useTraceQueryAvailable,\n useTraceQueryDeltaPollingAvailable,\n useTraceQueryDiscoveryAvailable,\n useTraceQueryRootDurationAvailable,\n} from '@/domains/capabilities';\n\nexport type TracesExplorerRootProps = {\n selection: TracesSelection;\n filters: TracesFilters;\n /** Receives the full next state once per user action, so a filter edit and the selection it clears land together. */\n onChange: (next: TracesExplorerState) => void;\n sortDirection: TracesSortDirection;\n onSortDirectionChange: (next: TracesSortDirection) => void;\n /** Pins the explorer to one entity: its fields stay in the filters but never surface as chips. */\n scope?: TracesExplorerScope;\n /** Resolved by the host, which may know better than the storage capabilities (e.g. hosted deployments). */\n metricsSupport: TracesMetricsSupport;\n /** Host switches combined with the server capabilities; a feature runs only when both allow it. */\n features?: TracesExplorerFeatures;\n /** The host's default filters. Filters matching them don't count as applied (e.g. in empty states). */\n initialFilters?: TracesFilters;\n children: ReactNode;\n};\n\nconst SCOPED_FIELD_IDS: ReadonlySet<string> = new Set(['rootEntityType', 'entityId']);\nconst HIDDEN_SCOPED_FIELD_IDS: readonly string[] = ['rootEntityType', 'entityId', 'entityName'];\nconst NO_FIELD_IDS: ReadonlySet<string> = new Set();\nconst NO_HIDDEN_FIELD_IDS: readonly string[] = [];\n\nconst listIdForScope = (scope?: TracesExplorerScope) =>\n scope?.entityType === EntityType.AGENT\n ? 'agent-traces'\n : scope?.entityType === EntityType.WORKFLOW_RUN\n ? 'workflows-traces'\n : 'all-traces';\n\ntype Latest = Pick<TracesExplorerRootProps, 'selection' | 'filters' | 'onChange' | 'onSortDirectionChange'> & {\n scopedFieldIds: ReadonlySet<string>;\n};\n\nexport function TracesExplorerRoot({\n selection,\n filters: rawFilters,\n onChange,\n sortDirection,\n onSortDirectionChange,\n scope,\n metricsSupport,\n features,\n initialFilters = DEFAULT_TRACES_FILTERS,\n children,\n}: TracesExplorerRootProps) {\n // Servers without the trace-query API list through `listTracesLight` and don't expose feedback.\n const traceQuery = useTraceQueryAvailable();\n const withQueryTrace = traceQuery.enabled && features?.traceQuery !== false;\n const withFeedback = useFeedbackAvailable().enabled && features?.feedback !== false;\n const { enabled: withRootDuration } = useTraceQueryRootDurationAvailable();\n const { enabled: withDeltaPolling } = useTraceQueryDeltaPollingAvailable();\n const withDiscovery = useTraceQueryDiscoveryAvailable().enabled && withQueryTrace;\n\n // Entries the server can't query are ignored, never written back: the host keeps its raw value.\n const filters = useMemo(() => sanitizeTracesFilters(rawFilters, withRootDuration), [rawFilters, withRootDuration]);\n\n const isScoped = !!scope;\n const scopedFieldIds = isScoped ? SCOPED_FIELD_IDS : NO_FIELD_IDS;\n const hiddenFieldIds = isScoped ? HIDDEN_SCOPED_FIELD_IDS : NO_HIDDEN_FIELD_IDS;\n\n // Rolling presets pin their start when the preset (or custom bound) changes, not on every render.\n const fromMs = rawFilters.dateFrom?.getTime();\n const toMs = rawFilters.dateTo?.getTime();\n const { dateFrom, dateTo } = useMemo(\n () =>\n resolveTracesDateWindow(\n rawFilters.datePreset,\n fromMs === undefined ? undefined : new Date(fromMs),\n toMs === undefined ? undefined : new Date(toMs),\n ),\n [rawFilters.datePreset, fromMs, toMs],\n );\n\n // Actions read the latest props when they run, so the host doesn't need stable callbacks.\n // `latest` is written as soon as a change is emitted, so a second action in the same tick\n // (the date picker fires a preset then its dates) builds on the first instead of the stale props.\n const current: Latest = { selection, filters: rawFilters, onChange, onSortDirectionChange, scopedFieldIds };\n const latest = useRef(current);\n latest.current = current;\n\n const actions = useMemo(() => {\n const emit = (next: TracesExplorerState) => {\n latest.current.selection = next.selection;\n latest.current.filters = next.filters;\n latest.current.onChange(next);\n };\n const updateSelection = (next: TracesSelection) => {\n if (next === latest.current.selection) return;\n emit({ selection: next, filters: latest.current.filters });\n };\n // A filter change invalidates whatever is selected: the selected row may no longer be listed.\n const updateFilters = (next: TracesFilters) => {\n const { selection: currentSelection, filters: currentFilters } = latest.current;\n if (next === currentFilters) return;\n emit({\n filters: next,\n selection: isSelectionEmpty(currentSelection) ? currentSelection : clearSelection(currentSelection),\n });\n };\n\n const selectionActions: TracesSelectionActions = {\n selectTrace: traceId => updateSelection(selectTrace(latest.current.selection, traceId)),\n closeTrace: () => updateSelection(selectTrace(latest.current.selection, null)),\n selectSpan: spanId => updateSelection(selectSpan(latest.current.selection, spanId)),\n setSpanTab: tab => updateSelection(setSpanTab(latest.current.selection, tab)),\n setSpanView: view => updateSelection(setSpanView(latest.current.selection, view)),\n selectScore: scoreId => updateSelection(selectScore(latest.current.selection, scoreId)),\n highlightSpans: spanIds => updateSelection(highlightSpans(latest.current.selection, spanIds)),\n };\n const filtersActions: TracesFiltersActions = {\n // Re-inject the scope tokens so \"Clear filters\" (which drops every removable item) and any\n // other edit can never drop the scope.\n setFilterTokens: (tokens, groups) => {\n const { filters: base, scopedFieldIds: scoped } = latest.current;\n const scopeTokens = base.tokens.filter(token => scoped.has(token.fieldId));\n updateFilters(applyFilterTokens(base, [...scopeTokens, ...tokens], groups));\n },\n setDatePreset: preset => updateFilters(applyDatePreset(latest.current.filters, preset)),\n setDate: (value, end) => updateFilters(applyDate(latest.current.filters, value, end)),\n setDateRange: (from, to) => updateFilters(applyDateRange(latest.current.filters, from, to)),\n };\n const onSortChange = (direction: TracesSortDirection) => latest.current.onSortDirectionChange(direction);\n return { selectionActions, filtersActions, onSortChange };\n }, []);\n const { selectionActions, filtersActions, onSortChange } = actions;\n\n // Discovery is keyed off the date window with a mount-time `now`, not the list's rolling one,\n // so its query key (and the skeleton) doesn't churn on every auto-refresh tick.\n const [discoveryNow] = useState(() => new Date());\n const discoveryTimeRange = useMemo(\n () => resolveTraceQueryTimeRange(dateFrom, dateTo, discoveryNow),\n [dateFrom, dateTo, discoveryNow],\n );\n\n const listId = listIdForScope(scope);\n const configValue = useMemo<TracesConfigContextValue>(\n () => ({\n listId,\n scopedFieldIds,\n hiddenFieldIds,\n withQueryTrace,\n withFeedback,\n withRootDuration,\n withDeltaPolling,\n withDiscovery,\n isCapabilitiesLoading: traceQuery.isLoading,\n metricsSupport,\n discoveryTimeRange,\n }),\n [\n listId,\n scopedFieldIds,\n hiddenFieldIds,\n withQueryTrace,\n withFeedback,\n withRootDuration,\n withDeltaPolling,\n withDiscovery,\n traceQuery.isLoading,\n metricsSupport,\n discoveryTimeRange,\n ],\n );\n\n const contentFiltersApplied = filters.tokens.length > 0 || filters.groups.length > 0;\n const filtersApplied = contentFiltersApplied || filters.datePreset !== initialFilters.datePreset || !!dateTo;\n const filtersValue = useMemo<TracesFiltersContextValue>(\n () => ({\n ...filtersActions,\n filters,\n dateFrom,\n dateTo,\n filtersApplied,\n contentFiltersApplied,\n }),\n [filtersActions, filters, dateFrom, dateTo, filtersApplied, contentFiltersApplied],\n );\n\n // Not memoized: the selection consumers (Layout, List, Panel) also re-render on filter and list\n // changes, which are what re-render Root while the selection stays the same.\n const selectionValue: TracesSelectionContextValue = {\n ...selectionActions,\n selection,\n selectedTraceId: selection.traceId,\n };\n\n return (\n <TracesConfigContext.Provider value={configValue}>\n <TracesFiltersContext.Provider value={filtersValue}>\n <TracesSelectionContext.Provider value={selectionValue}>\n <TracesListProvider sortDirection={sortDirection} onSortChange={onSortChange}>\n <TracesColumnsProvider>{children}</TracesColumnsProvider>\n </TracesListProvider>\n </TracesSelectionContext.Provider>\n </TracesFiltersContext.Provider>\n </TracesConfigContext.Provider>\n );\n}\n"],"names":["EntityType","DEFAULT_TRACES_FILTERS","useTraceQueryAvailable","useFeedbackAvailable","useTraceQueryRootDurationAvailable","useTraceQueryDeltaPollingAvailable","useTraceQueryDiscoveryAvailable","useMemo","sanitizeTracesFilters","resolveTracesDateWindow","useRef","isSelectionEmpty","clearSelection","selectionActions","selectTrace","selectSpan","setSpanTab","setSpanView","selectScore","highlightSpans","filtersActions","applyFilterTokens","applyDatePreset","applyDate","applyDateRange","onSortChange","useState","resolveTraceQueryTimeRange","jsx","TracesConfigContext","TracesFiltersContext","TracesSelectionContext","TracesListProvider","TracesColumnsProvider"],"mappings":"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"}
|
|
@@ -6,7 +6,7 @@ import { sanitizeTracesFilters, resolveTracesDateWindow, DEFAULT_TRACES_FILTERS,
|
|
|
6
6
|
import { TracesColumnsProvider } from './traces-explorer-columns-provider.es.js';
|
|
7
7
|
import { TracesConfigContext, TracesFiltersContext, TracesSelectionContext } from './traces-explorer-context.es.js';
|
|
8
8
|
import { TracesListProvider } from './traces-explorer-list-provider.es.js';
|
|
9
|
-
import { useTraceQueryAvailable, useFeedbackAvailable, useTraceQueryRootDurationAvailable, useTraceQueryDiscoveryAvailable } from '@mastra/react/hooks/capabilities';
|
|
9
|
+
import { useTraceQueryAvailable, useFeedbackAvailable, useTraceQueryRootDurationAvailable, useTraceQueryDeltaPollingAvailable, useTraceQueryDiscoveryAvailable } from '@mastra/react/hooks/capabilities';
|
|
10
10
|
|
|
11
11
|
const SCOPED_FIELD_IDS = /* @__PURE__ */ new Set(["rootEntityType", "entityId"]);
|
|
12
12
|
const HIDDEN_SCOPED_FIELD_IDS = ["rootEntityType", "entityId", "entityName"];
|
|
@@ -29,6 +29,7 @@ function TracesExplorerRoot({
|
|
|
29
29
|
const withQueryTrace = traceQuery.enabled && features?.traceQuery !== false;
|
|
30
30
|
const withFeedback = useFeedbackAvailable().enabled && features?.feedback !== false;
|
|
31
31
|
const { enabled: withRootDuration } = useTraceQueryRootDurationAvailable();
|
|
32
|
+
const { enabled: withDeltaPolling } = useTraceQueryDeltaPollingAvailable();
|
|
32
33
|
const withDiscovery = useTraceQueryDiscoveryAvailable().enabled && withQueryTrace;
|
|
33
34
|
const filters = useMemo(() => sanitizeTracesFilters(rawFilters, withRootDuration), [rawFilters, withRootDuration]);
|
|
34
35
|
const isScoped = !!scope;
|
|
@@ -104,6 +105,7 @@ function TracesExplorerRoot({
|
|
|
104
105
|
withQueryTrace,
|
|
105
106
|
withFeedback,
|
|
106
107
|
withRootDuration,
|
|
108
|
+
withDeltaPolling,
|
|
107
109
|
withDiscovery,
|
|
108
110
|
isCapabilitiesLoading: traceQuery.isLoading,
|
|
109
111
|
metricsSupport,
|
|
@@ -116,6 +118,7 @@ function TracesExplorerRoot({
|
|
|
116
118
|
withQueryTrace,
|
|
117
119
|
withFeedback,
|
|
118
120
|
withRootDuration,
|
|
121
|
+
withDeltaPolling,
|
|
119
122
|
withDiscovery,
|
|
120
123
|
traceQuery.isLoading,
|
|
121
124
|
metricsSupport,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"traces-explorer-root.es.js","sources":["../../../../../src/domains/traces/components/traces-explorer/traces-explorer-root.tsx"],"sourcesContent":["import { EntityType } from '@mastra/core/observability';\nimport { useMemo, useRef, useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { resolveTraceQueryTimeRange } from '../../trace-query-filters';\nimport {\n applyDate,\n applyDatePreset,\n applyDateRange,\n applyFilterTokens,\n clearSelection,\n DEFAULT_TRACES_FILTERS,\n highlightSpans,\n isSelectionEmpty,\n resolveTracesDateWindow,\n sanitizeTracesFilters,\n selectScore,\n selectSpan,\n selectTrace,\n setSpanTab,\n setSpanView,\n} from './traces-explorer-actions';\nimport type {\n TracesExplorerState,\n TracesFilters,\n TracesSelection,\n TracesSortDirection,\n} from './traces-explorer-actions';\nimport { TracesColumnsProvider } from './traces-explorer-columns-provider';\nimport { TracesConfigContext, TracesFiltersContext, TracesSelectionContext } from './traces-explorer-context';\nimport type {\n TracesConfigContextValue,\n TracesExplorerFeatures,\n TracesExplorerScope,\n TracesFiltersActions,\n TracesFiltersContextValue,\n TracesMetricsSupport,\n TracesSelectionActions,\n TracesSelectionContextValue,\n} from './traces-explorer-context';\nimport { TracesListProvider } from './traces-explorer-list-provider';\nimport {\n useFeedbackAvailable,\n useTraceQueryAvailable,\n useTraceQueryDiscoveryAvailable,\n useTraceQueryRootDurationAvailable,\n} from '@/domains/capabilities';\n\nexport type TracesExplorerRootProps = {\n selection: TracesSelection;\n filters: TracesFilters;\n /** Receives the full next state once per user action, so a filter edit and the selection it clears land together. */\n onChange: (next: TracesExplorerState) => void;\n sortDirection: TracesSortDirection;\n onSortDirectionChange: (next: TracesSortDirection) => void;\n /** Pins the explorer to one entity: its fields stay in the filters but never surface as chips. */\n scope?: TracesExplorerScope;\n /** Resolved by the host, which may know better than the storage capabilities (e.g. hosted deployments). */\n metricsSupport: TracesMetricsSupport;\n /** Host switches combined with the server capabilities; a feature runs only when both allow it. */\n features?: TracesExplorerFeatures;\n /** The host's default filters. Filters matching them don't count as applied (e.g. in empty states). */\n initialFilters?: TracesFilters;\n children: ReactNode;\n};\n\nconst SCOPED_FIELD_IDS: ReadonlySet<string> = new Set(['rootEntityType', 'entityId']);\nconst HIDDEN_SCOPED_FIELD_IDS: readonly string[] = ['rootEntityType', 'entityId', 'entityName'];\nconst NO_FIELD_IDS: ReadonlySet<string> = new Set();\nconst NO_HIDDEN_FIELD_IDS: readonly string[] = [];\n\nconst listIdForScope = (scope?: TracesExplorerScope) =>\n scope?.entityType === EntityType.AGENT\n ? 'agent-traces'\n : scope?.entityType === EntityType.WORKFLOW_RUN\n ? 'workflows-traces'\n : 'all-traces';\n\ntype Latest = Pick<TracesExplorerRootProps, 'selection' | 'filters' | 'onChange' | 'onSortDirectionChange'> & {\n scopedFieldIds: ReadonlySet<string>;\n};\n\nexport function TracesExplorerRoot({\n selection,\n filters: rawFilters,\n onChange,\n sortDirection,\n onSortDirectionChange,\n scope,\n metricsSupport,\n features,\n initialFilters = DEFAULT_TRACES_FILTERS,\n children,\n}: TracesExplorerRootProps) {\n // Servers without the trace-query API list through `listTracesLight` and don't expose feedback.\n const traceQuery = useTraceQueryAvailable();\n const withQueryTrace = traceQuery.enabled && features?.traceQuery !== false;\n const withFeedback = useFeedbackAvailable().enabled && features?.feedback !== false;\n const { enabled: withRootDuration } = useTraceQueryRootDurationAvailable();\n const withDiscovery = useTraceQueryDiscoveryAvailable().enabled && withQueryTrace;\n\n // Entries the server can't query are ignored, never written back: the host keeps its raw value.\n const filters = useMemo(() => sanitizeTracesFilters(rawFilters, withRootDuration), [rawFilters, withRootDuration]);\n\n const isScoped = !!scope;\n const scopedFieldIds = isScoped ? SCOPED_FIELD_IDS : NO_FIELD_IDS;\n const hiddenFieldIds = isScoped ? HIDDEN_SCOPED_FIELD_IDS : NO_HIDDEN_FIELD_IDS;\n\n // Rolling presets pin their start when the preset (or custom bound) changes, not on every render.\n const fromMs = rawFilters.dateFrom?.getTime();\n const toMs = rawFilters.dateTo?.getTime();\n const { dateFrom, dateTo } = useMemo(\n () =>\n resolveTracesDateWindow(\n rawFilters.datePreset,\n fromMs === undefined ? undefined : new Date(fromMs),\n toMs === undefined ? undefined : new Date(toMs),\n ),\n [rawFilters.datePreset, fromMs, toMs],\n );\n\n // Actions read the latest props when they run, so the host doesn't need stable callbacks.\n // `latest` is written as soon as a change is emitted, so a second action in the same tick\n // (the date picker fires a preset then its dates) builds on the first instead of the stale props.\n const current: Latest = { selection, filters: rawFilters, onChange, onSortDirectionChange, scopedFieldIds };\n const latest = useRef(current);\n latest.current = current;\n\n const actions = useMemo(() => {\n const emit = (next: TracesExplorerState) => {\n latest.current.selection = next.selection;\n latest.current.filters = next.filters;\n latest.current.onChange(next);\n };\n const updateSelection = (next: TracesSelection) => {\n if (next === latest.current.selection) return;\n emit({ selection: next, filters: latest.current.filters });\n };\n // A filter change invalidates whatever is selected: the selected row may no longer be listed.\n const updateFilters = (next: TracesFilters) => {\n const { selection: currentSelection, filters: currentFilters } = latest.current;\n if (next === currentFilters) return;\n emit({\n filters: next,\n selection: isSelectionEmpty(currentSelection) ? currentSelection : clearSelection(currentSelection),\n });\n };\n\n const selectionActions: TracesSelectionActions = {\n selectTrace: traceId => updateSelection(selectTrace(latest.current.selection, traceId)),\n closeTrace: () => updateSelection(selectTrace(latest.current.selection, null)),\n selectSpan: spanId => updateSelection(selectSpan(latest.current.selection, spanId)),\n setSpanTab: tab => updateSelection(setSpanTab(latest.current.selection, tab)),\n setSpanView: view => updateSelection(setSpanView(latest.current.selection, view)),\n selectScore: scoreId => updateSelection(selectScore(latest.current.selection, scoreId)),\n highlightSpans: spanIds => updateSelection(highlightSpans(latest.current.selection, spanIds)),\n };\n const filtersActions: TracesFiltersActions = {\n // Re-inject the scope tokens so \"Clear filters\" (which drops every removable item) and any\n // other edit can never drop the scope.\n setFilterTokens: (tokens, groups) => {\n const { filters: base, scopedFieldIds: scoped } = latest.current;\n const scopeTokens = base.tokens.filter(token => scoped.has(token.fieldId));\n updateFilters(applyFilterTokens(base, [...scopeTokens, ...tokens], groups));\n },\n setDatePreset: preset => updateFilters(applyDatePreset(latest.current.filters, preset)),\n setDate: (value, end) => updateFilters(applyDate(latest.current.filters, value, end)),\n setDateRange: (from, to) => updateFilters(applyDateRange(latest.current.filters, from, to)),\n };\n const onSortChange = (direction: TracesSortDirection) => latest.current.onSortDirectionChange(direction);\n return { selectionActions, filtersActions, onSortChange };\n }, []);\n const { selectionActions, filtersActions, onSortChange } = actions;\n\n // Discovery is keyed off the date window with a mount-time `now`, not the list's rolling one,\n // so its query key (and the skeleton) doesn't churn on every auto-refresh tick.\n const [discoveryNow] = useState(() => new Date());\n const discoveryTimeRange = useMemo(\n () => resolveTraceQueryTimeRange(dateFrom, dateTo, discoveryNow),\n [dateFrom, dateTo, discoveryNow],\n );\n\n const listId = listIdForScope(scope);\n const configValue = useMemo<TracesConfigContextValue>(\n () => ({\n listId,\n scopedFieldIds,\n hiddenFieldIds,\n withQueryTrace,\n withFeedback,\n withRootDuration,\n withDiscovery,\n isCapabilitiesLoading: traceQuery.isLoading,\n metricsSupport,\n discoveryTimeRange,\n }),\n [\n listId,\n scopedFieldIds,\n hiddenFieldIds,\n withQueryTrace,\n withFeedback,\n withRootDuration,\n withDiscovery,\n traceQuery.isLoading,\n metricsSupport,\n discoveryTimeRange,\n ],\n );\n\n const contentFiltersApplied = filters.tokens.length > 0 || filters.groups.length > 0;\n const filtersApplied = contentFiltersApplied || filters.datePreset !== initialFilters.datePreset || !!dateTo;\n const filtersValue = useMemo<TracesFiltersContextValue>(\n () => ({\n ...filtersActions,\n filters,\n dateFrom,\n dateTo,\n filtersApplied,\n contentFiltersApplied,\n }),\n [filtersActions, filters, dateFrom, dateTo, filtersApplied, contentFiltersApplied],\n );\n\n // Not memoized: the selection consumers (Layout, List, Panel) also re-render on filter and list\n // changes, which are what re-render Root while the selection stays the same.\n const selectionValue: TracesSelectionContextValue = {\n ...selectionActions,\n selection,\n selectedTraceId: selection.traceId,\n };\n\n return (\n <TracesConfigContext.Provider value={configValue}>\n <TracesFiltersContext.Provider value={filtersValue}>\n <TracesSelectionContext.Provider value={selectionValue}>\n <TracesListProvider sortDirection={sortDirection} onSortChange={onSortChange}>\n <TracesColumnsProvider>{children}</TracesColumnsProvider>\n </TracesListProvider>\n </TracesSelectionContext.Provider>\n </TracesFiltersContext.Provider>\n </TracesConfigContext.Provider>\n );\n}\n"],"names":["selectionActions","filtersActions","onSortChange"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"traces-explorer-root.es.js","sources":["../../../../../src/domains/traces/components/traces-explorer/traces-explorer-root.tsx"],"sourcesContent":["import { EntityType } from '@mastra/core/observability';\nimport { useMemo, useRef, useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { resolveTraceQueryTimeRange } from '../../trace-query-filters';\nimport {\n applyDate,\n applyDatePreset,\n applyDateRange,\n applyFilterTokens,\n clearSelection,\n DEFAULT_TRACES_FILTERS,\n highlightSpans,\n isSelectionEmpty,\n resolveTracesDateWindow,\n sanitizeTracesFilters,\n selectScore,\n selectSpan,\n selectTrace,\n setSpanTab,\n setSpanView,\n} from './traces-explorer-actions';\nimport type {\n TracesExplorerState,\n TracesFilters,\n TracesSelection,\n TracesSortDirection,\n} from './traces-explorer-actions';\nimport { TracesColumnsProvider } from './traces-explorer-columns-provider';\nimport { TracesConfigContext, TracesFiltersContext, TracesSelectionContext } from './traces-explorer-context';\nimport type {\n TracesConfigContextValue,\n TracesExplorerFeatures,\n TracesExplorerScope,\n TracesFiltersActions,\n TracesFiltersContextValue,\n TracesMetricsSupport,\n TracesSelectionActions,\n TracesSelectionContextValue,\n} from './traces-explorer-context';\nimport { TracesListProvider } from './traces-explorer-list-provider';\nimport {\n useFeedbackAvailable,\n useTraceQueryAvailable,\n useTraceQueryDeltaPollingAvailable,\n useTraceQueryDiscoveryAvailable,\n useTraceQueryRootDurationAvailable,\n} from '@/domains/capabilities';\n\nexport type TracesExplorerRootProps = {\n selection: TracesSelection;\n filters: TracesFilters;\n /** Receives the full next state once per user action, so a filter edit and the selection it clears land together. */\n onChange: (next: TracesExplorerState) => void;\n sortDirection: TracesSortDirection;\n onSortDirectionChange: (next: TracesSortDirection) => void;\n /** Pins the explorer to one entity: its fields stay in the filters but never surface as chips. */\n scope?: TracesExplorerScope;\n /** Resolved by the host, which may know better than the storage capabilities (e.g. hosted deployments). */\n metricsSupport: TracesMetricsSupport;\n /** Host switches combined with the server capabilities; a feature runs only when both allow it. */\n features?: TracesExplorerFeatures;\n /** The host's default filters. Filters matching them don't count as applied (e.g. in empty states). */\n initialFilters?: TracesFilters;\n children: ReactNode;\n};\n\nconst SCOPED_FIELD_IDS: ReadonlySet<string> = new Set(['rootEntityType', 'entityId']);\nconst HIDDEN_SCOPED_FIELD_IDS: readonly string[] = ['rootEntityType', 'entityId', 'entityName'];\nconst NO_FIELD_IDS: ReadonlySet<string> = new Set();\nconst NO_HIDDEN_FIELD_IDS: readonly string[] = [];\n\nconst listIdForScope = (scope?: TracesExplorerScope) =>\n scope?.entityType === EntityType.AGENT\n ? 'agent-traces'\n : scope?.entityType === EntityType.WORKFLOW_RUN\n ? 'workflows-traces'\n : 'all-traces';\n\ntype Latest = Pick<TracesExplorerRootProps, 'selection' | 'filters' | 'onChange' | 'onSortDirectionChange'> & {\n scopedFieldIds: ReadonlySet<string>;\n};\n\nexport function TracesExplorerRoot({\n selection,\n filters: rawFilters,\n onChange,\n sortDirection,\n onSortDirectionChange,\n scope,\n metricsSupport,\n features,\n initialFilters = DEFAULT_TRACES_FILTERS,\n children,\n}: TracesExplorerRootProps) {\n // Servers without the trace-query API list through `listTracesLight` and don't expose feedback.\n const traceQuery = useTraceQueryAvailable();\n const withQueryTrace = traceQuery.enabled && features?.traceQuery !== false;\n const withFeedback = useFeedbackAvailable().enabled && features?.feedback !== false;\n const { enabled: withRootDuration } = useTraceQueryRootDurationAvailable();\n const { enabled: withDeltaPolling } = useTraceQueryDeltaPollingAvailable();\n const withDiscovery = useTraceQueryDiscoveryAvailable().enabled && withQueryTrace;\n\n // Entries the server can't query are ignored, never written back: the host keeps its raw value.\n const filters = useMemo(() => sanitizeTracesFilters(rawFilters, withRootDuration), [rawFilters, withRootDuration]);\n\n const isScoped = !!scope;\n const scopedFieldIds = isScoped ? SCOPED_FIELD_IDS : NO_FIELD_IDS;\n const hiddenFieldIds = isScoped ? HIDDEN_SCOPED_FIELD_IDS : NO_HIDDEN_FIELD_IDS;\n\n // Rolling presets pin their start when the preset (or custom bound) changes, not on every render.\n const fromMs = rawFilters.dateFrom?.getTime();\n const toMs = rawFilters.dateTo?.getTime();\n const { dateFrom, dateTo } = useMemo(\n () =>\n resolveTracesDateWindow(\n rawFilters.datePreset,\n fromMs === undefined ? undefined : new Date(fromMs),\n toMs === undefined ? undefined : new Date(toMs),\n ),\n [rawFilters.datePreset, fromMs, toMs],\n );\n\n // Actions read the latest props when they run, so the host doesn't need stable callbacks.\n // `latest` is written as soon as a change is emitted, so a second action in the same tick\n // (the date picker fires a preset then its dates) builds on the first instead of the stale props.\n const current: Latest = { selection, filters: rawFilters, onChange, onSortDirectionChange, scopedFieldIds };\n const latest = useRef(current);\n latest.current = current;\n\n const actions = useMemo(() => {\n const emit = (next: TracesExplorerState) => {\n latest.current.selection = next.selection;\n latest.current.filters = next.filters;\n latest.current.onChange(next);\n };\n const updateSelection = (next: TracesSelection) => {\n if (next === latest.current.selection) return;\n emit({ selection: next, filters: latest.current.filters });\n };\n // A filter change invalidates whatever is selected: the selected row may no longer be listed.\n const updateFilters = (next: TracesFilters) => {\n const { selection: currentSelection, filters: currentFilters } = latest.current;\n if (next === currentFilters) return;\n emit({\n filters: next,\n selection: isSelectionEmpty(currentSelection) ? currentSelection : clearSelection(currentSelection),\n });\n };\n\n const selectionActions: TracesSelectionActions = {\n selectTrace: traceId => updateSelection(selectTrace(latest.current.selection, traceId)),\n closeTrace: () => updateSelection(selectTrace(latest.current.selection, null)),\n selectSpan: spanId => updateSelection(selectSpan(latest.current.selection, spanId)),\n setSpanTab: tab => updateSelection(setSpanTab(latest.current.selection, tab)),\n setSpanView: view => updateSelection(setSpanView(latest.current.selection, view)),\n selectScore: scoreId => updateSelection(selectScore(latest.current.selection, scoreId)),\n highlightSpans: spanIds => updateSelection(highlightSpans(latest.current.selection, spanIds)),\n };\n const filtersActions: TracesFiltersActions = {\n // Re-inject the scope tokens so \"Clear filters\" (which drops every removable item) and any\n // other edit can never drop the scope.\n setFilterTokens: (tokens, groups) => {\n const { filters: base, scopedFieldIds: scoped } = latest.current;\n const scopeTokens = base.tokens.filter(token => scoped.has(token.fieldId));\n updateFilters(applyFilterTokens(base, [...scopeTokens, ...tokens], groups));\n },\n setDatePreset: preset => updateFilters(applyDatePreset(latest.current.filters, preset)),\n setDate: (value, end) => updateFilters(applyDate(latest.current.filters, value, end)),\n setDateRange: (from, to) => updateFilters(applyDateRange(latest.current.filters, from, to)),\n };\n const onSortChange = (direction: TracesSortDirection) => latest.current.onSortDirectionChange(direction);\n return { selectionActions, filtersActions, onSortChange };\n }, []);\n const { selectionActions, filtersActions, onSortChange } = actions;\n\n // Discovery is keyed off the date window with a mount-time `now`, not the list's rolling one,\n // so its query key (and the skeleton) doesn't churn on every auto-refresh tick.\n const [discoveryNow] = useState(() => new Date());\n const discoveryTimeRange = useMemo(\n () => resolveTraceQueryTimeRange(dateFrom, dateTo, discoveryNow),\n [dateFrom, dateTo, discoveryNow],\n );\n\n const listId = listIdForScope(scope);\n const configValue = useMemo<TracesConfigContextValue>(\n () => ({\n listId,\n scopedFieldIds,\n hiddenFieldIds,\n withQueryTrace,\n withFeedback,\n withRootDuration,\n withDeltaPolling,\n withDiscovery,\n isCapabilitiesLoading: traceQuery.isLoading,\n metricsSupport,\n discoveryTimeRange,\n }),\n [\n listId,\n scopedFieldIds,\n hiddenFieldIds,\n withQueryTrace,\n withFeedback,\n withRootDuration,\n withDeltaPolling,\n withDiscovery,\n traceQuery.isLoading,\n metricsSupport,\n discoveryTimeRange,\n ],\n );\n\n const contentFiltersApplied = filters.tokens.length > 0 || filters.groups.length > 0;\n const filtersApplied = contentFiltersApplied || filters.datePreset !== initialFilters.datePreset || !!dateTo;\n const filtersValue = useMemo<TracesFiltersContextValue>(\n () => ({\n ...filtersActions,\n filters,\n dateFrom,\n dateTo,\n filtersApplied,\n contentFiltersApplied,\n }),\n [filtersActions, filters, dateFrom, dateTo, filtersApplied, contentFiltersApplied],\n );\n\n // Not memoized: the selection consumers (Layout, List, Panel) also re-render on filter and list\n // changes, which are what re-render Root while the selection stays the same.\n const selectionValue: TracesSelectionContextValue = {\n ...selectionActions,\n selection,\n selectedTraceId: selection.traceId,\n };\n\n return (\n <TracesConfigContext.Provider value={configValue}>\n <TracesFiltersContext.Provider value={filtersValue}>\n <TracesSelectionContext.Provider value={selectionValue}>\n <TracesListProvider sortDirection={sortDirection} onSortChange={onSortChange}>\n <TracesColumnsProvider>{children}</TracesColumnsProvider>\n </TracesListProvider>\n </TracesSelectionContext.Provider>\n </TracesFiltersContext.Provider>\n </TracesConfigContext.Provider>\n );\n}\n"],"names":["selectionActions","filtersActions","onSortChange"],"mappings":"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"}
|
|
@@ -10,7 +10,7 @@ const domains_traces_components_traceTimeRangeChip = require('../trace-time-rang
|
|
|
10
10
|
const domains_traces_components_tracesExplorer_tracesExplorerActions = require('./traces-explorer-actions.cjs.js');
|
|
11
11
|
const domains_traces_components_tracesExplorer_tracesExplorerContext = require('./traces-explorer-context.cjs.js');
|
|
12
12
|
const domains_traces_components_tracesExplorer_useTracesDiscovery = require('./use-traces-discovery.cjs.js');
|
|
13
|
-
require('../../../../filter-bar-chip-
|
|
13
|
+
require('../../../../filter-bar-chip-C_64m7nX.cjs');
|
|
14
14
|
const types = require('../../../../types-Ns4ZNp-g.cjs');
|
|
15
15
|
|
|
16
16
|
const NO_SUGGESTIONS = [];
|
|
@@ -6,7 +6,7 @@ import { TRACE_TIME_RANGE_ITEM, TRACE_TIME_RANGE_FIELD, TRACE_TIME_RANGE_FIELD_I
|
|
|
6
6
|
import { getSelectedEntityOption } from './traces-explorer-actions.es.js';
|
|
7
7
|
import { useTracesConfig, useTracesFilters } from './traces-explorer-context.es.js';
|
|
8
8
|
import { useTracesDiscovery } from './use-traces-discovery.es.js';
|
|
9
|
-
import '../../../../filter-bar-chip-
|
|
9
|
+
import '../../../../filter-bar-chip-D2kKMSRA.js';
|
|
10
10
|
import { i as isFilterBarGroup } from '../../../../types-CIPrYAzY.js';
|
|
11
11
|
|
|
12
12
|
const NO_SUGGESTIONS = [];
|
|
@@ -9,11 +9,10 @@ const React = require('react');
|
|
|
9
9
|
const domains_traces_traceListColumns = require('../trace-list-columns.cjs.js');
|
|
10
10
|
const domains_traces_utils_spanUtils = require('../utils/span-utils.cjs.js');
|
|
11
11
|
const domains_traces_components_traceErrorCell = require('./trace-error-cell.cjs.js');
|
|
12
|
-
const dataList = require('../../../data-list-
|
|
13
|
-
const dataListSkeleton = require('../../../data-list-skeleton-
|
|
14
|
-
const tracesDataList = require('../../../traces-data-list-
|
|
12
|
+
const dataList = require('../../../data-list-4t6Ueon8.cjs');
|
|
13
|
+
const dataListSkeleton = require('../../../data-list-skeleton-CVXZYY0k.cjs');
|
|
14
|
+
const tracesDataList = require('../../../traces-data-list-BOHhsgDI.cjs');
|
|
15
15
|
const useDataListKeyboard = require('../../../use-data-list-keyboard-DF3tLe10.cjs');
|
|
16
|
-
const dataListTop = require('../../../data-list-top-DJh08vFA.cjs');
|
|
17
16
|
const dropdownMenu = require('../../../dropdown-menu-CsynT1aD.cjs');
|
|
18
17
|
const Txt = require('../../../Txt-CIS2G5Jx.cjs');
|
|
19
18
|
const primitives_transitions = require('../../../primitives/transitions.cjs.js');
|
|
@@ -137,7 +136,7 @@ function TracesListView({
|
|
|
137
136
|
}),
|
|
138
137
|
columnPreferences.metadataKeys.map((key) => /* @__PURE__ */ jsxRuntime.jsx(tracesDataList.TracesDataList.TopCellWithTooltip, { tooltip: key, children: key }, key))
|
|
139
138
|
] }),
|
|
140
|
-
isLoading ? /* @__PURE__ */ jsxRuntime.jsx(dataListSkeleton.DataListSkeletonRows, { columnCount:
|
|
139
|
+
isLoading ? /* @__PURE__ */ jsxRuntime.jsx(dataListSkeleton.DataListSkeletonRows, { columnCount: dataList.splitColumns(columns).length }) : traces.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
141
140
|
tracesDataList.TracesDataList.NoMatch,
|
|
142
141
|
{
|
|
143
142
|
message: filtersApplied ? "No traces found for applied filters" : "No traces found yet"
|