@mastra/playground-ui 68.0.0-alpha.0 → 68.0.0-alpha.2
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/{ActionRow-BfK77pCT.cjs → ActionRow-BlC9GAef.cjs} +4 -4
- package/dist/ActionRow-BlC9GAef.cjs.map +1 -0
- package/dist/{ActionRow-Cd6tOC2K.js → ActionRow-DCrRCvBq.js} +4 -4
- package/dist/ActionRow-DCrRCvBq.js.map +1 -0
- package/dist/{Button-Bw1e3ONi.js → Button-CLXTbAY8.js} +42 -13
- package/dist/Button-CLXTbAY8.js.map +1 -0
- package/dist/{Button-YQRflC47.cjs → Button-DLcMcuUL.cjs} +58 -11
- package/dist/Button-DLcMcuUL.cjs.map +1 -0
- package/dist/{CodeEditor-CJ9jC9lu.cjs → CodeEditor-CLzs0yVc.cjs} +4 -4
- package/dist/{CodeEditor-CJ9jC9lu.cjs.map → CodeEditor-CLzs0yVc.cjs.map} +1 -1
- package/dist/{CodeEditor-CPVxj7WS.js → CodeEditor-COnz9c6B.js} +4 -4
- package/dist/{CodeEditor-CPVxj7WS.js.map → CodeEditor-COnz9c6B.js.map} +1 -1
- package/dist/{Comment-VFJq2wRp.js → Comment-0n98b_f_.js} +3 -3
- package/dist/{Comment-VFJq2wRp.js.map → Comment-0n98b_f_.js.map} +1 -1
- package/dist/{Comment-KYUQzeSu.cjs → Comment-Cg0f7eLa.cjs} +3 -3
- package/dist/{Comment-KYUQzeSu.cjs.map → Comment-Cg0f7eLa.cjs.map} +1 -1
- package/dist/{DataCodeSection-CZRPsStI.cjs → DataCodeSection-CFxXsQWH.cjs} +10 -10
- package/dist/DataCodeSection-CFxXsQWH.cjs.map +1 -0
- package/dist/{DataCodeSection-Ckd47p_S.js → DataCodeSection-PY9XEg2C.js} +8 -8
- package/dist/DataCodeSection-PY9XEg2C.js.map +1 -0
- package/dist/{DataDetailsPanel-_CK0Huk6.js → DataDetailsPanel-CohEKPm4.js} +5 -5
- package/dist/{DataDetailsPanel-_CK0Huk6.js.map → DataDetailsPanel-CohEKPm4.js.map} +1 -1
- package/dist/{DataDetailsPanel-DFhM9H5D.cjs → DataDetailsPanel-DiyjEXqK.cjs} +6 -6
- package/dist/{DataDetailsPanel-DFhM9H5D.cjs.map → DataDetailsPanel-DiyjEXqK.cjs.map} +1 -1
- package/dist/{DataList-2tIlQsLc.js → DataList-CUhRQAv6.js} +2 -2
- package/dist/{DataList-2tIlQsLc.js.map → DataList-CUhRQAv6.js.map} +1 -1
- package/dist/{DataList-Czwmwyvp.cjs → DataList-Cj0mfk19.cjs} +2 -2
- package/dist/{DataList-Czwmwyvp.cjs.map → DataList-Cj0mfk19.cjs.map} +1 -1
- package/dist/{DataPanel-C0Ll76Ne.cjs → DataPanel-Coc9h35I.cjs} +3 -3
- package/dist/{DataPanel-C0Ll76Ne.cjs.map → DataPanel-Coc9h35I.cjs.map} +1 -1
- package/dist/{DataPanel-CY1W5LHJ.js → DataPanel-IgB9D5PO.js} +3 -3
- package/dist/{DataPanel-CY1W5LHJ.js.map → DataPanel-IgB9D5PO.js.map} +1 -1
- package/dist/{Dialog-CjaiCrkv.cjs → Dialog-BvWF9HE-.cjs} +2 -2
- package/dist/{Dialog-CjaiCrkv.cjs.map → Dialog-BvWF9HE-.cjs.map} +1 -1
- package/dist/{Dialog-CKtTR8h3.js → Dialog-DaWtxwd9.js} +2 -2
- package/dist/{Dialog-CKtTR8h3.js.map → Dialog-DaWtxwd9.js.map} +1 -1
- package/dist/{ErrorBoundary-Bm0LL_b7.cjs → ErrorBoundary-B5GjmA6V.cjs} +2 -2
- package/dist/{ErrorBoundary-Bm0LL_b7.cjs.map → ErrorBoundary-B5GjmA6V.cjs.map} +1 -1
- package/dist/{ErrorBoundary-95_6A77S.js → ErrorBoundary-Cat3KU86.js} +2 -2
- package/dist/{ErrorBoundary-95_6A77S.js.map → ErrorBoundary-Cat3KU86.js.map} +1 -1
- package/dist/{FilterBar--4oguuVe.js → FilterBar-BgW2dqRQ.js} +21 -25
- package/dist/FilterBar-BgW2dqRQ.js.map +1 -0
- package/dist/{FilterBar-BUd4f7oi.cjs → FilterBar-CQl04O6t.cjs} +21 -25
- package/dist/FilterBar-CQl04O6t.cjs.map +1 -0
- package/dist/{LogsDataList-Cslabh8K.js → LogsDataList-BI2C5OJz.js} +2 -2
- package/dist/{LogsDataList-Cslabh8K.js.map → LogsDataList-BI2C5OJz.js.map} +1 -1
- package/dist/{LogsDataList-DMmxAt_t.cjs → LogsDataList-CCIfUPGo.cjs} +2 -2
- package/dist/{LogsDataList-DMmxAt_t.cjs.map → LogsDataList-CCIfUPGo.cjs.map} +1 -1
- package/dist/{MarkdownRenderer-DME2xKTk.js → MarkdownRenderer-2GOXQJEv.js} +3 -3
- package/dist/{MarkdownRenderer-DME2xKTk.js.map → MarkdownRenderer-2GOXQJEv.js.map} +1 -1
- package/dist/{MarkdownRenderer-CS6u5drO.cjs → MarkdownRenderer-CB8Z_CHc.cjs} +4 -4
- package/dist/{MarkdownRenderer-CS6u5drO.cjs.map → MarkdownRenderer-CB8Z_CHc.cjs.map} +1 -1
- package/dist/{Message-nVI6tMS3.js → Message-CWzi5F_Q.js} +2 -2
- package/dist/{Message-nVI6tMS3.js.map → Message-CWzi5F_Q.js.map} +1 -1
- package/dist/{Message-DsCNQpou.cjs → Message-jj56lxNL.cjs} +2 -2
- package/dist/{Message-DsCNQpou.cjs.map → Message-jj56lxNL.cjs.map} +1 -1
- package/dist/{MetricsTable-D-aZf3dk.cjs → MetricsTable-BSl81oNe.cjs} +44 -9
- package/dist/MetricsTable-BSl81oNe.cjs.map +1 -0
- package/dist/{MetricsTable-CRPeLHe1.js → MetricsTable-DID6LRoP.js} +44 -9
- package/dist/MetricsTable-DID6LRoP.js.map +1 -0
- package/dist/{Notice-CyKngbbv.js → Notice-C-8oOZZF.js} +2 -2
- package/dist/{Notice-CyKngbbv.js.map → Notice-C-8oOZZF.js.map} +1 -1
- package/dist/{Notice-DWNeCe-t.cjs → Notice-JZ7SW7q6.cjs} +2 -2
- package/dist/{Notice-DWNeCe-t.cjs.map → Notice-JZ7SW7q6.cjs.map} +1 -1
- package/dist/{Workflow-BVWvgDmI.js → Workflow-C3SlEdP-.js} +5 -5
- package/dist/{Workflow-BVWvgDmI.js.map → Workflow-C3SlEdP-.js.map} +1 -1
- package/dist/{Workflow-BeF6pIO9.cjs → Workflow-DSWQ-ROz.cjs} +5 -5
- package/dist/{Workflow-BeF6pIO9.cjs.map → Workflow-DSWQ-ROz.cjs.map} +1 -1
- package/dist/{activity-DAK8tj7r.cjs → activity-DyB5H3gF.cjs} +2 -2
- package/dist/{activity-DAK8tj7r.cjs.map → activity-DyB5H3gF.cjs.map} +1 -1
- package/dist/{activity-CM34JyW-.js → activity-rJ1NQl_2.js} +2 -2
- package/dist/{activity-CM34JyW-.js.map → activity-rJ1NQl_2.js.map} +1 -1
- package/dist/{ask-user-C82m_G9W.cjs → ask-user-C1p2PEYe.cjs} +3 -3
- package/dist/ask-user-C1p2PEYe.cjs.map +1 -0
- package/dist/{ask-user-BdjH9F7G.js → ask-user-DPznrqGO.js} +3 -3
- package/dist/ask-user-DPznrqGO.js.map +1 -0
- package/dist/buttons-group-Dc6R7YSs.cjs +48 -0
- package/dist/buttons-group-Dc6R7YSs.cjs.map +1 -0
- package/dist/buttons-group-DkFlnMiL.js +35 -0
- package/dist/buttons-group-DkFlnMiL.js.map +1 -0
- package/dist/{ButtonsGroup.css → buttons-group.css} +2 -0
- package/dist/chart-plot.css +5 -4
- package/dist/clear-filters-button-Buc973vw.cjs +27 -0
- package/dist/clear-filters-button-Buc973vw.cjs.map +1 -0
- package/dist/clear-filters-button-CNrRuHOY.js +22 -0
- package/dist/clear-filters-button-CNrRuHOY.js.map +1 -0
- package/dist/{combobox-wFudhN8F.js → combobox-D21no8t5.js} +5 -5
- package/dist/{combobox-wFudhN8F.js.map → combobox-D21no8t5.js.map} +1 -1
- package/dist/{combobox-8kNAJFlj.cjs → combobox-DIT_6xiG.cjs} +5 -5
- package/dist/combobox-DIT_6xiG.cjs.map +1 -0
- package/dist/{combobox-parts-BZVXwbG7.cjs → combobox-parts-C4phOq4t.cjs} +10 -18
- package/dist/combobox-parts-C4phOq4t.cjs.map +1 -0
- package/dist/{combobox-parts-W7KRQUsV.js → combobox-parts-D90ir0Py.js} +11 -19
- package/dist/combobox-parts-D90ir0Py.js.map +1 -0
- package/dist/components/ActionRow.cjs.js +1 -1
- package/dist/components/ActionRow.es.js +1 -1
- package/dist/components/AlertDialog.cjs.js +2 -2
- package/dist/components/AlertDialog.es.js +2 -2
- package/dist/components/Button.cjs.js +4 -1
- package/dist/components/Button.es.js +2 -2
- package/dist/components/ButtonsGroup.cjs.js +3 -38
- package/dist/components/ButtonsGroup.es.js +1 -35
- package/dist/components/ClampedText.cjs.js +1 -1
- package/dist/components/ClampedText.es.js +1 -1
- package/dist/components/ClearFiltersButton.cjs.js +3 -0
- package/dist/components/ClearFiltersButton.d.ts +1 -0
- package/dist/components/ClearFiltersButton.es.js +1 -0
- package/dist/components/CodeBlock.cjs.js +3 -3
- package/dist/components/CodeBlock.es.js +3 -3
- package/dist/components/CodeEditor.cjs.js +1 -1
- package/dist/components/CodeEditor.es.js +1 -1
- package/dist/components/CollapsibleBox.cjs.js +1 -1
- package/dist/components/CollapsibleBox.es.js +1 -1
- package/dist/components/Combobox.cjs.js +2 -2
- package/dist/components/Combobox.es.js +2 -2
- package/dist/components/Command.cjs.js +3 -2
- package/dist/components/Command.cjs.js.map +1 -1
- package/dist/components/Command.es.js +3 -2
- package/dist/components/Command.es.js.map +1 -1
- package/dist/components/Comment.cjs.js +1 -1
- package/dist/components/Comment.es.js +1 -1
- package/dist/components/CopyButton.cjs.js +1 -1
- package/dist/components/CopyButton.es.js +1 -1
- package/dist/components/DataCodeSection.cjs.js +1 -1
- package/dist/components/DataCodeSection.es.js +1 -1
- package/dist/components/DataDetailsPanel.cjs.js +1 -1
- package/dist/components/DataDetailsPanel.es.js +1 -1
- package/dist/components/DataList.cjs.js +3 -3
- package/dist/components/DataList.es.js +3 -3
- package/dist/components/DataPanel.cjs.js +1 -1
- package/dist/components/DataPanel.es.js +1 -1
- package/dist/components/DateRangeTimeline.cjs.js +1 -1
- package/dist/components/DateRangeTimeline.es.js +1 -1
- package/dist/components/DateTimePicker.cjs.js +3 -3
- package/dist/components/DateTimePicker.cjs.js.map +1 -1
- package/dist/components/DateTimePicker.es.js +3 -3
- package/dist/components/DateTimePicker.es.js.map +1 -1
- package/dist/components/DateTimeRangePicker.cjs.js +2 -2
- package/dist/components/DateTimeRangePicker.es.js +1 -1
- package/dist/components/Dialog.cjs.js +1 -1
- package/dist/components/Dialog.es.js +1 -1
- package/dist/components/DisabledFeatureButton.cjs.js +1 -1
- package/dist/components/DisabledFeatureButton.es.js +1 -1
- package/dist/components/Drawer.cjs.js +1 -1
- package/dist/components/Drawer.es.js +1 -1
- package/dist/components/EnvironmentVariablesEditor.cjs.js +4 -4
- package/dist/components/EnvironmentVariablesEditor.es.js +4 -4
- package/dist/components/ErrorBoundary.cjs.js +1 -1
- package/dist/components/ErrorBoundary.es.js +1 -1
- package/dist/components/FilterBar.cjs.js +7 -2
- package/dist/components/FilterBar.es.js +4 -3
- package/dist/components/FormFieldBlocks.cjs.js +3 -3
- package/dist/components/FormFieldBlocks.cjs.js.map +1 -1
- package/dist/components/FormFieldBlocks.es.js +3 -3
- package/dist/components/FormFieldBlocks.es.js.map +1 -1
- package/dist/components/InputGroup.cjs.js +1 -1
- package/dist/components/InputGroup.es.js +1 -1
- package/dist/components/InputNumber.cjs.js +2 -2
- package/dist/components/InputNumber.es.js +2 -2
- package/dist/components/JSONSchemaForm.cjs.js +2 -2
- package/dist/components/JSONSchemaForm.es.js +2 -2
- package/dist/components/ListSearch.cjs.js +1 -1
- package/dist/components/ListSearch.es.js +1 -1
- package/dist/components/LogsDataList.cjs.js +2 -2
- package/dist/components/LogsDataList.es.js +2 -2
- package/dist/components/MarkdownRenderer.cjs.js +1 -1
- package/dist/components/MarkdownRenderer.es.js +1 -1
- package/dist/components/Message.cjs.js +1 -1
- package/dist/components/Message.es.js +1 -1
- package/dist/components/MetricsTable.cjs.js +1 -1
- package/dist/components/MetricsTable.es.js +1 -1
- package/dist/components/Notice.cjs.js +1 -1
- package/dist/components/Notice.es.js +1 -1
- package/dist/components/PrevNextNav.cjs.js +1 -1
- package/dist/components/PrevNextNav.es.js +1 -1
- package/dist/components/PropertyFilter.cjs.js +4 -4
- package/dist/components/PropertyFilter.cjs.js.map +1 -1
- package/dist/components/PropertyFilter.es.js +4 -4
- package/dist/components/PropertyFilter.es.js.map +1 -1
- package/dist/components/RuleBuilder.cjs.js +2 -2
- package/dist/components/RuleBuilder.es.js +2 -2
- package/dist/components/SavedViews.cjs.js +4 -3
- package/dist/components/SavedViews.cjs.js.map +1 -1
- package/dist/components/SavedViews.es.js +4 -3
- package/dist/components/SavedViews.es.js.map +1 -1
- package/dist/components/SearchInput.cjs.js +5 -2
- package/dist/components/SearchInput.cjs.js.map +1 -1
- package/dist/components/SearchInput.es.js +5 -2
- package/dist/components/SearchInput.es.js.map +1 -1
- package/dist/components/Select.cjs.js +1 -1
- package/dist/components/Select.es.js +1 -1
- package/dist/components/SideDialog.cjs.js +5 -5
- package/dist/components/SideDialog.cjs.js.map +1 -1
- package/dist/components/SideDialog.es.js +4 -4
- package/dist/components/Sidebar.cjs.js +11 -11
- package/dist/components/Sidebar.cjs.js.map +1 -1
- package/dist/components/Sidebar.es.js +12 -12
- package/dist/components/Sidebar.es.js.map +1 -1
- package/dist/components/Tabs.cjs.js +2 -2
- package/dist/components/Tabs.es.js +2 -2
- package/dist/components/ThreadList.cjs.js +1 -1
- package/dist/components/ThreadList.es.js +1 -1
- package/dist/components/Toaster.cjs.js +2 -2
- package/dist/components/Toaster.es.js +2 -2
- package/dist/components/Truncate.cjs.js +1 -1
- package/dist/components/Truncate.es.js +1 -1
- package/dist/components/Workflow.cjs.js +1 -1
- package/dist/components/Workflow.es.js +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/components/ai/plan.cjs.js +2 -2
- package/dist/components/ai/plan.es.js +2 -2
- package/dist/components/ai/tool-approval.cjs.js +1 -1
- package/dist/components/ai/tool-approval.es.js +1 -1
- package/dist/components/ai/tool-call.cjs.js +1 -1
- package/dist/components/ai/tool-call.es.js +1 -1
- package/dist/{copy-button-CF-X4iDj.js → copy-button-BXrbevLn.js} +2 -2
- package/dist/{copy-button-CF-X4iDj.js.map → copy-button-BXrbevLn.js.map} +1 -1
- package/dist/{copy-button-BYEFKNpo.cjs → copy-button-DJAQ6_3o.cjs} +2 -2
- package/dist/{copy-button-BYEFKNpo.cjs.map → copy-button-DJAQ6_3o.cjs.map} +1 -1
- package/dist/{data-list-BkimqE_P.cjs → data-list-C4Vmq5HA.cjs} +2 -2
- package/dist/{data-list-BkimqE_P.cjs.map → data-list-C4Vmq5HA.cjs.map} +1 -1
- package/dist/{data-list-evmf5xWI.js → data-list-DHCOoLmj.js} +2 -2
- package/dist/{data-list-evmf5xWI.js.map → data-list-DHCOoLmj.js.map} +1 -1
- package/dist/{DateTimeRangePicker-HmPOHwAQ.cjs → date-time-range-picker-CTt7Od0P.cjs} +71 -57
- package/dist/date-time-range-picker-CTt7Od0P.cjs.map +1 -0
- package/dist/{DateTimeRangePicker-C_Lie_2P.js → date-time-range-picker-DKh1K9Iy.js} +72 -58
- package/dist/date-time-range-picker-DKh1K9Iy.js.map +1 -0
- package/dist/domains/auth/components/session-expired.cjs.js +2 -2
- package/dist/domains/auth/components/session-expired.es.js +2 -2
- package/dist/domains/chat/activity/activity-stretch-line.cjs.js +1 -1
- package/dist/domains/chat/activity/activity-stretch-line.es.js +1 -1
- package/dist/domains/chat/activity/components/activity-fold.cjs.js +1 -1
- package/dist/domains/chat/activity/components/activity-fold.es.js +1 -1
- package/dist/domains/chat/activity/components/activity-timed-trigger.cjs.js +1 -1
- package/dist/domains/chat/activity/components/activity-timed-trigger.es.js +1 -1
- package/dist/domains/chat/activity/components/calls-panel.cjs.js +1 -1
- package/dist/domains/chat/activity/components/calls-panel.es.js +1 -1
- package/dist/domains/chat/activity/components/stretch-content.cjs.js +1 -1
- package/dist/domains/chat/activity/components/stretch-content.es.js +1 -1
- package/dist/domains/chat/activity/components/stretch-thought.cjs.js +1 -1
- package/dist/domains/chat/activity/components/stretch-thought.es.js +1 -1
- package/dist/domains/chat/activity/model/activity-segments.cjs.js +1 -1
- package/dist/domains/chat/activity/model/activity-segments.es.js +1 -1
- package/dist/domains/chat/activity/model/activity-words.cjs.js +1 -1
- package/dist/domains/chat/activity/model/activity-words.es.js +1 -1
- package/dist/domains/chat/attachments/attachment-preview-dialog.cjs.js +2 -2
- package/dist/domains/chat/attachments/attachment-preview-dialog.es.js +2 -2
- package/dist/domains/chat/attachments/composer-attachment.cjs.js +1 -1
- package/dist/domains/chat/attachments/composer-attachment.es.js +1 -1
- package/dist/domains/chat/components/badge-wrapper.cjs.js +1 -1
- package/dist/domains/chat/components/badge-wrapper.es.js +1 -1
- package/dist/domains/chat/components/network-choice-metadata-dialog.cjs.js +3 -3
- package/dist/domains/chat/components/network-choice-metadata-dialog.es.js +3 -3
- package/dist/domains/chat/knowledge/pinned-knowledge.cjs.js +1 -1
- package/dist/domains/chat/knowledge/pinned-knowledge.es.js +1 -1
- package/dist/domains/chat/messages/assistant-message-actions.cjs.js +2 -2
- package/dist/domains/chat/messages/assistant-message-actions.es.js +2 -2
- package/dist/domains/chat/messages/dataset-save-action.cjs.js +5 -5
- package/dist/domains/chat/messages/dataset-save-action.es.js +5 -5
- package/dist/domains/chat/messages/message-row.cjs.js +4 -4
- package/dist/domains/chat/messages/message-row.es.js +4 -4
- package/dist/domains/chat/messages/notification-signal-notice.cjs.js +1 -1
- package/dist/domains/chat/messages/notification-signal-notice.es.js +1 -1
- package/dist/domains/chat/messages/reasoning-content.cjs.js +1 -1
- package/dist/domains/chat/messages/reasoning-content.es.js +1 -1
- package/dist/domains/chat/messages/renderers/message-text.cjs.js +2 -2
- package/dist/domains/chat/messages/renderers/message-text.es.js +2 -2
- package/dist/domains/chat/messages/renderers/reasoning-part-renderer.cjs.js +1 -1
- package/dist/domains/chat/messages/renderers/reasoning-part-renderer.es.js +1 -1
- package/dist/domains/chat/messages/renderers/status-renderers.cjs.js +1 -1
- package/dist/domains/chat/messages/renderers/status-renderers.es.js +1 -1
- package/dist/domains/chat/messages/signal-badge.cjs.js +1 -1
- package/dist/domains/chat/messages/signal-badge.es.js +1 -1
- package/dist/domains/chat/messages/skill-message.cjs.js +2 -2
- package/dist/domains/chat/messages/skill-message.es.js +2 -2
- package/dist/domains/chat/messages/system-reminder-badge.cjs.js +1 -1
- package/dist/domains/chat/messages/system-reminder-badge.es.js +1 -1
- package/dist/domains/chat/messages/tripwire-notice.cjs.js +2 -2
- package/dist/domains/chat/messages/tripwire-notice.es.js +2 -2
- package/dist/domains/chat/tools/badges/agent-badge-wrapper.cjs.js +1 -1
- package/dist/domains/chat/tools/badges/agent-badge-wrapper.es.js +1 -1
- package/dist/domains/chat/tools/badges/agent-badge.cjs.js +1 -1
- package/dist/domains/chat/tools/badges/agent-badge.es.js +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/background-task-metadata-dialog.cjs.js +3 -3
- package/dist/domains/chat/tools/badges/background-task-metadata-dialog.es.js +3 -3
- package/dist/domains/chat/tools/badges/code-mode-badge.cjs.js +1 -1
- package/dist/domains/chat/tools/badges/code-mode-badge.es.js +1 -1
- package/dist/domains/chat/tools/badges/file-tree-badge.cjs.js +1 -1
- package/dist/domains/chat/tools/badges/file-tree-badge.es.js +1 -1
- package/dist/domains/chat/tools/badges/knowledge-tool-badge.cjs.js +1 -1
- package/dist/domains/chat/tools/badges/knowledge-tool-badge.es.js +1 -1
- package/dist/domains/chat/tools/badges/mcp-task-chip.cjs.js +1 -1
- package/dist/domains/chat/tools/badges/mcp-task-chip.es.js +1 -1
- package/dist/domains/chat/tools/badges/observation-marker-badge.cjs.js +2 -2
- package/dist/domains/chat/tools/badges/observation-marker-badge.es.js +2 -2
- package/dist/domains/chat/tools/badges/observation-marker-details.cjs.js +2 -2
- package/dist/domains/chat/tools/badges/observation-marker-details.es.js +2 -2
- package/dist/domains/chat/tools/badges/observation-renderer.cjs.js +1 -1
- package/dist/domains/chat/tools/badges/observation-renderer.es.js +1 -1
- package/dist/domains/chat/tools/badges/sandbox-execution-badge.cjs.js +1 -1
- package/dist/domains/chat/tools/badges/sandbox-execution-badge.es.js +1 -1
- package/dist/domains/chat/tools/badges/tool-approval-badge.cjs.js +1 -1
- package/dist/domains/chat/tools/badges/tool-approval-badge.es.js +1 -1
- package/dist/domains/chat/tools/badges/tool-badge.cjs.js +2 -2
- package/dist/domains/chat/tools/badges/tool-badge.es.js +2 -2
- package/dist/domains/chat/tools/badges/workflow-badge.cjs.js +3 -3
- package/dist/domains/chat/tools/badges/workflow-badge.es.js +3 -3
- package/dist/domains/chat/tools/connect-prompt-tool.cjs.js +3 -3
- package/dist/domains/chat/tools/connect-prompt-tool.es.js +3 -3
- package/dist/domains/chat/tools/submit-plan-tool.cjs.js +1 -1
- package/dist/domains/chat/tools/submit-plan-tool.es.js +1 -1
- package/dist/domains/chat/tools/tool-card.cjs.js +1 -1
- package/dist/domains/chat/tools/tool-card.es.js +1 -1
- package/dist/domains/chat/tools/tool-groups.cjs.js +1 -1
- package/dist/domains/chat/tools/tool-groups.es.js +1 -1
- package/dist/domains/dashboards/components/dashboard-renderer.cjs.js +1 -1
- package/dist/domains/dashboards/components/dashboard-renderer.es.js +1 -1
- package/dist/domains/dashboards/kinds/table/table-view.cjs.js +1 -1
- package/dist/domains/dashboards/kinds/table/table-view.es.js +1 -1
- package/dist/domains/dashboards/metrics-dashboard.cjs.js +1 -1
- package/dist/domains/dashboards/metrics-dashboard.cjs.js.map +1 -1
- package/dist/domains/dashboards/metrics-dashboard.es.js +1 -1
- package/dist/domains/dashboards/metrics-dashboard.es.js.map +1 -1
- package/dist/domains/datasets/components/add-dataset-item-dialog/add-dataset-item-dialog.cjs.js +4 -4
- package/dist/domains/datasets/components/add-dataset-item-dialog/add-dataset-item-dialog.es.js +4 -4
- 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/add-dataset-item-dialog/trajectory-editor.cjs.js +3 -3
- package/dist/domains/datasets/components/add-dataset-item-dialog/trajectory-editor.es.js +3 -3
- package/dist/domains/datasets/components/save-as-dataset-item-dialog.cjs.js +5 -5
- package/dist/domains/datasets/components/save-as-dataset-item-dialog.es.js +5 -5
- package/dist/domains/knowledge/components/KnowledgePageDetail.cjs.js +1 -1
- package/dist/domains/knowledge/components/KnowledgePageDetail.es.js +1 -1
- package/dist/domains/logs/components/log-data-panel.cjs.js +6 -6
- package/dist/domains/logs/components/log-data-panel.cjs.js.map +1 -1
- package/dist/domains/logs/components/log-data-panel.es.js +4 -4
- package/dist/domains/logs/components/logs-list-view.cjs.js +2 -2
- package/dist/domains/logs/components/logs-list-view.es.js +2 -2
- package/dist/domains/logs/components/logs-saved-views.cjs.js +1 -1
- package/dist/domains/logs/components/logs-saved-views.es.js +1 -1
- package/dist/domains/logs/components/logs-toolbar.cjs.js +1 -1
- package/dist/domains/logs/components/logs-toolbar.es.js +1 -1
- package/dist/domains/logs/components/no-logs-info.cjs.js +1 -1
- package/dist/domains/logs/components/no-logs-info.es.js +1 -1
- package/dist/domains/logs/hooks/use-logs-filter-persistence.cjs.js +1 -1
- package/dist/domains/logs/hooks/use-logs-filter-persistence.es.js +1 -1
- package/dist/domains/memory/components/flame-graph.cjs.js +1 -1
- package/dist/domains/memory/components/flame-graph.es.js +1 -1
- package/dist/domains/memory/components/memory-studio-panel.cjs.js +1 -1
- package/dist/domains/memory/components/memory-studio-panel.es.js +1 -1
- package/dist/domains/metrics/components/breakdown/breakdown-table.cjs.js +2 -2
- package/dist/domains/metrics/components/breakdown/breakdown-table.cjs.js.map +1 -1
- package/dist/domains/metrics/components/breakdown/breakdown-table.es.js +2 -2
- package/dist/domains/metrics/components/breakdown/breakdown-table.es.js.map +1 -1
- package/dist/domains/metrics/components/card-action-buttons.cjs.js +1 -1
- package/dist/domains/metrics/components/card-action-buttons.es.js +1 -1
- package/dist/domains/metrics/components/chart-card-error.cjs.js +1 -1
- package/dist/domains/metrics/components/chart-card-error.es.js +1 -1
- package/dist/domains/metrics/components/date-range-selector.cjs.js +2 -2
- package/dist/domains/metrics/components/date-range-selector.cjs.js.map +1 -1
- package/dist/domains/metrics/components/date-range-selector.es.js +1 -1
- package/dist/domains/metrics/components/metrics-time-range-chip.cjs.js +4 -4
- package/dist/domains/metrics/components/metrics-time-range-chip.cjs.js.map +1 -1
- package/dist/domains/metrics/components/metrics-time-range-chip.es.js +4 -4
- package/dist/domains/metrics/components/metrics-time-range-chip.es.js.map +1 -1
- package/dist/domains/metrics/drilldown.cjs.js +1 -1
- package/dist/domains/metrics/drilldown.es.js +1 -1
- package/dist/domains/metrics/metrics-filters.cjs.js +1 -1
- package/dist/domains/metrics/metrics-filters.es.js +1 -1
- package/dist/domains/observability/hooks/use-observability-list-filters.cjs.js +1 -1
- package/dist/domains/observability/hooks/use-observability-list-filters.es.js +1 -1
- package/dist/domains/observability/observability-list-url-state.cjs.js +1 -1
- package/dist/domains/observability/observability-list-url-state.es.js +1 -1
- package/dist/domains/observability/saved-view-state.cjs.js +1 -1
- package/dist/domains/observability/saved-view-state.es.js +1 -1
- package/dist/domains/observability/saved-views/observability-saved-views.cjs.js +1 -1
- package/dist/domains/observability/saved-views/observability-saved-views.es.js +1 -1
- package/dist/domains/observability/saved-views.cjs.js +1 -1
- package/dist/domains/observability/saved-views.es.js +1 -1
- package/dist/domains/observability.cjs.js +1 -1
- package/dist/domains/observability.es.js +1 -1
- package/dist/domains/scores/components/score-data-panel.cjs.js +2 -2
- package/dist/domains/scores/components/score-data-panel.es.js +2 -2
- package/dist/domains/scores/components/span-scoring.cjs.js +6 -6
- package/dist/domains/scores/components/span-scoring.cjs.js.map +1 -1
- package/dist/domains/scores/components/span-scoring.es.js +6 -6
- package/dist/domains/scores/components/span-scoring.es.js.map +1 -1
- package/dist/domains/scores/components/trace-scores-list.cjs.js +2 -2
- package/dist/domains/scores/components/trace-scores-list.es.js +2 -2
- package/dist/domains/scores/components/trace-scores-tab.cjs.js +1 -1
- package/dist/domains/scores/components/trace-scores-tab.es.js +1 -1
- package/dist/domains/skills/skill-simple-form.cjs.js +3 -3
- package/dist/domains/skills/skill-simple-form.cjs.js.map +1 -1
- package/dist/domains/skills/skill-simple-form.es.js +3 -3
- package/dist/domains/skills/skill-simple-form.es.js.map +1 -1
- package/dist/domains/spans/components/spans-explorer-body.cjs.js +8 -8
- package/dist/domains/spans/components/spans-explorer-body.cjs.js.map +1 -1
- package/dist/domains/spans/components/spans-explorer-body.es.js +8 -8
- package/dist/domains/spans/components/spans-explorer-body.es.js.map +1 -1
- package/dist/domains/spans/components/spans-filter-bar.cjs.js +6 -6
- package/dist/domains/spans/components/spans-filter-bar.cjs.js.map +1 -1
- package/dist/domains/spans/components/spans-filter-bar.es.js +6 -6
- package/dist/domains/spans/components/spans-filter-bar.es.js.map +1 -1
- package/dist/domains/spans/hooks/use-spans-filter-bar.cjs.js +5 -5
- package/dist/domains/spans/hooks/use-spans-filter-bar.cjs.js.map +1 -1
- package/dist/domains/spans/hooks/use-spans-filter-bar.es.js +5 -5
- package/dist/domains/spans/hooks/use-spans-filter-bar.es.js.map +1 -1
- package/dist/domains/spans/span-filters.cjs.js +2 -2
- package/dist/domains/spans/span-filters.cjs.js.map +1 -1
- package/dist/domains/spans/span-filters.es.js +2 -2
- package/dist/domains/spans/span-filters.es.js.map +1 -1
- package/dist/domains/threads/components/threads-explorer-body.cjs.js +8 -8
- package/dist/domains/threads/components/threads-explorer-body.cjs.js.map +1 -1
- package/dist/domains/threads/components/threads-explorer-body.es.js +8 -8
- package/dist/domains/threads/components/threads-explorer-body.es.js.map +1 -1
- package/dist/domains/threads/components/threads-filter-bar.cjs.js +6 -6
- package/dist/domains/threads/components/threads-filter-bar.cjs.js.map +1 -1
- package/dist/domains/threads/components/threads-filter-bar.es.js +6 -6
- package/dist/domains/threads/components/threads-filter-bar.es.js.map +1 -1
- package/dist/domains/threads/hooks/use-threads-filter-bar.cjs.js +5 -5
- package/dist/domains/threads/hooks/use-threads-filter-bar.cjs.js.map +1 -1
- package/dist/domains/threads/hooks/use-threads-filter-bar.es.js +5 -5
- package/dist/domains/threads/hooks/use-threads-filter-bar.es.js.map +1 -1
- package/dist/domains/threads/thread-filters.cjs.js +2 -2
- package/dist/domains/threads/thread-filters.cjs.js.map +1 -1
- package/dist/domains/threads/thread-filters.es.js +2 -2
- package/dist/domains/threads/thread-filters.es.js.map +1 -1
- package/dist/domains/traces/components/columns-menu/columns-menu.cjs.js +1 -1
- package/dist/domains/traces/components/columns-menu/columns-menu.es.js +1 -1
- package/dist/domains/traces/components/feedback-thread.cjs.js +4 -4
- package/dist/domains/traces/components/feedback-thread.cjs.js.map +1 -1
- package/dist/domains/traces/components/feedback-thread.es.js +4 -4
- package/dist/domains/traces/components/feedback-thread.es.js.map +1 -1
- package/dist/domains/traces/components/span-data-panel-view.cjs.js +5 -5
- package/dist/domains/traces/components/span-data-panel-view.es.js +5 -5
- package/dist/domains/traces/components/span-details-view.cjs.js +1 -1
- package/dist/domains/traces/components/span-details-view.es.js +1 -1
- package/dist/domains/traces/components/span-outcome.cjs.js +1 -1
- package/dist/domains/traces/components/span-outcome.es.js +1 -1
- package/dist/domains/traces/components/span-payload/span-error-renderer.cjs.js +2 -2
- package/dist/domains/traces/components/span-payload/span-error-renderer.es.js +2 -2
- package/dist/domains/traces/components/span-payload/span-input-renderers.cjs.js +1 -1
- package/dist/domains/traces/components/span-payload/span-input-renderers.es.js +1 -1
- package/dist/domains/traces/components/span-payload/span-output-renderers.cjs.js +3 -3
- package/dist/domains/traces/components/span-payload/span-output-renderers.es.js +3 -3
- package/dist/domains/traces/components/span-payload/span-payload-json.cjs.js +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-json.es.js +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-messages.cjs.js +3 -3
- package/dist/domains/traces/components/span-payload/span-payload-messages.es.js +3 -3
- package/dist/domains/traces/components/span-payload/span-payload-primitives.cjs.js +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-primitives.es.js +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-processor.cjs.js +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-processor.es.js +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-section.cjs.js +2 -2
- package/dist/domains/traces/components/span-payload/span-payload-section.es.js +2 -2
- package/dist/domains/traces/components/span-payload/span-payload-tool.cjs.js +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-tool.es.js +1 -1
- package/dist/domains/traces/components/span-payload/span-processor-mutations.cjs.js +1 -1
- package/dist/domains/traces/components/span-payload/span-processor-mutations.es.js +1 -1
- package/dist/domains/traces/components/span-payload/span-tools-section.cjs.js +1 -1
- package/dist/domains/traces/components/span-payload/span-tools-section.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/thread-trace/thread-trace-messages.cjs.js +2 -2
- package/dist/domains/traces/components/thread-trace/thread-trace-messages.es.js +2 -2
- package/dist/domains/traces/components/thread-trace/thread-trace-row.cjs.js +1 -1
- package/dist/domains/traces/components/thread-trace/thread-trace-row.es.js +1 -1
- package/dist/domains/traces/components/thread-trace/thread-trace-spans.cjs.js +1 -1
- package/dist/domains/traces/components/thread-trace/thread-trace-spans.es.js +1 -1
- package/dist/domains/traces/components/thread-view-by-trace.cjs.js +1 -1
- package/dist/domains/traces/components/thread-view-by-trace.es.js +1 -1
- package/dist/domains/traces/components/trace-columns-menu.cjs.js +5 -6
- package/dist/domains/traces/components/trace-columns-menu.cjs.js.map +1 -1
- package/dist/domains/traces/components/trace-columns-menu.es.js +5 -6
- package/dist/domains/traces/components/trace-columns-menu.es.js.map +1 -1
- package/dist/domains/traces/components/trace-data-panel-view.cjs.js +5 -5
- 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 +5 -5
- package/dist/domains/traces/components/trace-data-panel-view.es.js.map +1 -1
- package/dist/domains/traces/components/trace-data-panel.cjs.js +1 -1
- package/dist/domains/traces/components/trace-data-panel.es.js +1 -1
- package/dist/domains/traces/components/trace-details-view.cjs.js +1 -1
- package/dist/domains/traces/components/trace-details-view.es.js +1 -1
- package/dist/domains/traces/components/trace-error-cell.cjs.js +1 -1
- package/dist/domains/traces/components/trace-error-cell.es.js +1 -1
- package/dist/domains/traces/components/trace-error-summary.cjs.js +1 -1
- package/dist/domains/traces/components/trace-error-summary.es.js +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 +1 -1
- package/dist/domains/traces/components/trace-span-panel.es.js +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-item-view.cjs.js +1 -1
- package/dist/domains/traces/components/trace-thread-item-view.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/traces-explorer/traces-explorer-actions.cjs.js +1 -1
- package/dist/domains/traces/components/traces-explorer/traces-explorer-actions.es.js +1 -1
- package/dist/domains/traces/components/traces-explorer/traces-explorer-filter-bar.cjs.js +6 -6
- package/dist/domains/traces/components/traces-explorer/traces-explorer-filter-bar.cjs.js.map +1 -1
- package/dist/domains/traces/components/traces-explorer/traces-explorer-filter-bar.es.js +6 -6
- package/dist/domains/traces/components/traces-explorer/traces-explorer-filter-bar.es.js.map +1 -1
- package/dist/domains/traces/components/traces-explorer/traces-explorer-root.cjs.js +1 -1
- package/dist/domains/traces/components/traces-explorer/traces-explorer-root.es.js +1 -1
- package/dist/domains/traces/components/traces-explorer/traces-explorer-saved-views.cjs.js +1 -1
- package/dist/domains/traces/components/traces-explorer/traces-explorer-saved-views.es.js +1 -1
- package/dist/domains/traces/components/traces-explorer/use-traces-filter-bar.cjs.js +5 -5
- package/dist/domains/traces/components/traces-explorer/use-traces-filter-bar.cjs.js.map +1 -1
- package/dist/domains/traces/components/traces-explorer/use-traces-filter-bar.es.js +5 -5
- package/dist/domains/traces/components/traces-explorer/use-traces-filter-bar.es.js.map +1 -1
- package/dist/domains/traces/components/traces-list-mode-toggle.cjs.js +1 -1
- package/dist/domains/traces/components/traces-list-mode-toggle.es.js +1 -1
- package/dist/domains/traces/components/traces-list-view.cjs.js +2 -2
- package/dist/domains/traces/components/traces-list-view.es.js +2 -2
- package/dist/domains/traces/components/traces-page-skeleton.cjs.js +2 -2
- package/dist/domains/traces/components/traces-page-skeleton.cjs.js.map +1 -1
- package/dist/domains/traces/components/traces-page-skeleton.es.js +2 -2
- package/dist/domains/traces/components/traces-page-skeleton.es.js.map +1 -1
- package/dist/domains/traces/components/traces-spans-switch.cjs.js +1 -1
- package/dist/domains/traces/components/traces-spans-switch.es.js +1 -1
- package/dist/domains/traces/hooks/use-download-trace-json.cjs.js +1 -1
- package/dist/domains/traces/hooks/use-download-trace-json.es.js +1 -1
- package/dist/domains/traces/trace-filters.cjs.js +1 -1
- package/dist/domains/traces/trace-filters.es.js +1 -1
- package/dist/domains/traces/trace-query-filters.cjs.js +1 -1
- package/dist/domains/traces/trace-query-filters.es.js +1 -1
- package/dist/domains/traces.cjs.js +1 -1
- package/dist/domains/traces.es.js +1 -1
- package/dist/domains/workflows/components/workflow-combobox.cjs.js +3 -3
- package/dist/domains/workflows/components/workflow-combobox.cjs.js.map +1 -1
- package/dist/domains/workflows/components/workflow-combobox.es.js +3 -3
- package/dist/domains/workflows/components/workflow-combobox.es.js.map +1 -1
- package/dist/domains/workflows/components/workflow-information.cjs.js +2 -2
- package/dist/domains/workflows/components/workflow-information.es.js +2 -2
- package/dist/domains/workflows/components/workflow-layout.cjs.js +1 -1
- package/dist/domains/workflows/components/workflow-layout.es.js +1 -1
- package/dist/domains/workflows/components/workflow-step-detail.cjs.js +2 -2
- package/dist/domains/workflows/components/workflow-step-detail.es.js +2 -2
- package/dist/domains/workflows/components/workflows-list/no-workflows-info.cjs.js +1 -1
- package/dist/domains/workflows/components/workflows-list/no-workflows-info.es.js +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/context/use-stream-for-run.cjs.js +1 -1
- package/dist/domains/workflows/context/use-stream-for-run.es.js +1 -1
- package/dist/domains/workflows/runs/workflow-run-list.cjs.js +1 -1
- package/dist/domains/workflows/runs/workflow-run-list.es.js +1 -1
- package/dist/domains/workflows/workflow/data/workflow-data-button.cjs.js +1 -1
- package/dist/domains/workflows/workflow/data/workflow-data-button.es.js +1 -1
- package/dist/domains/workflows/workflow/data/workflow-data-inspector.cjs.js +2 -2
- package/dist/domains/workflows/workflow/data/workflow-data-inspector.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 +2 -2
- package/dist/domains/workflows/workflow/input/workflow-processor-input.cjs.js.map +1 -1
- package/dist/domains/workflows/workflow/input/workflow-processor-input.es.js +2 -2
- package/dist/domains/workflows/workflow/input/workflow-processor-input.es.js.map +1 -1
- package/dist/domains/workflows/workflow/use-workflow-graph-runtime.cjs.js +1 -1
- package/dist/domains/workflows/workflow/use-workflow-graph-runtime.es.js +1 -1
- package/dist/domains/workflows/workflow/utils.cjs.js +1 -1
- package/dist/domains/workflows/workflow/utils.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-body-graph.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-body-graph.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-cancel-button.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-cancel-button.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-data-edge.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-data-edge.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-debug-step-controls.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-debug-step-controls.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-graph-boundary.cjs.js +3 -3
- package/dist/domains/workflows/workflow/workflow-graph-boundary.es.js +3 -3
- package/dist/domains/workflows/workflow/workflow-graph-inner.cjs.js +2 -2
- package/dist/domains/workflows/workflow/workflow-graph-inner.es.js +2 -2
- package/dist/domains/workflows/workflow/workflow-graph-layout.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-graph-layout.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-graph-node.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-graph-node.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-graph.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-graph.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-map-config-dialog.cjs.js +3 -3
- package/dist/domains/workflows/workflow/workflow-map-config-dialog.es.js +3 -3
- package/dist/domains/workflows/workflow/workflow-nested-graph.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-nested-graph.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-run-data.cjs.js +3 -3
- package/dist/domains/workflows/workflow/workflow-run-data.es.js +3 -3
- package/dist/domains/workflows/workflow/workflow-run-error.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-run-error.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-run-header.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-run-header.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-status.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-status.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-step-action-bar.cjs.js +2 -2
- package/dist/domains/workflows/workflow/workflow-step-action-bar.es.js +2 -2
- package/dist/domains/workflows/workflow/workflow-step-node-utils.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-step-node-utils.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-suspended-steps.cjs.js +2 -2
- package/dist/domains/workflows/workflow/workflow-suspended-steps.es.js +2 -2
- package/dist/domains/workflows/workflow/workflow-time-travel-form.cjs.js +2 -2
- package/dist/domains/workflows/workflow/workflow-time-travel-form.es.js +2 -2
- package/dist/domains/workflows/workflow/workflow-timeline-row.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-timeline-row.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-timeline.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-timeline.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-trigger-form.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-trigger-form.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-trigger-header.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-trigger-header.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-trigger.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-trigger.es.js +1 -1
- package/dist/domains/workspace/components/workspace-add-skill-dialog.cjs.js +4 -4
- package/dist/domains/workspace/components/workspace-add-skill-dialog.cjs.js.map +1 -1
- package/dist/domains/workspace/components/workspace-add-skill-dialog.es.js +4 -4
- package/dist/domains/workspace/components/workspace-add-skill-dialog.es.js.map +1 -1
- package/dist/domains/workspace/components/workspace-add-skill.cjs.js +1 -1
- package/dist/domains/workspace/components/workspace-add-skill.es.js +1 -1
- package/dist/domains/workspace/components/workspace-create-directory.cjs.js +2 -2
- package/dist/domains/workspace/components/workspace-create-directory.es.js +2 -2
- package/dist/domains/workspace/components/workspace-error.cjs.js +1 -1
- package/dist/domains/workspace/components/workspace-error.es.js +1 -1
- package/dist/domains/workspace/components/workspace-markdown-preview.cjs.js +1 -1
- package/dist/domains/workspace/components/workspace-markdown-preview.es.js +1 -1
- package/dist/domains/workspace/components/workspace-search.cjs.js +1 -1
- package/dist/domains/workspace/components/workspace-search.es.js +1 -1
- package/dist/domains/workspace/components/workspace-tree.cjs.js +1 -1
- package/dist/domains/workspace/components/workspace-tree.es.js +1 -1
- package/dist/ee/signals/components/entity-index-list.cjs.js +1 -1
- package/dist/ee/signals/components/entity-index-list.es.js +1 -1
- package/dist/ee/signals/components/signals-empty-state.cjs.js +1 -1
- package/dist/ee/signals/components/signals-empty-state.es.js +1 -1
- package/dist/ee/signals/components/trace-intelligence-entity-index.cjs.js +6 -6
- 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 +5 -5
- package/dist/ee/signals/examples-pager.cjs.js +1 -1
- package/dist/ee/signals/examples-pager.es.js +1 -1
- package/dist/ee/signals/sankey-signals.cjs.js +1 -1
- package/dist/ee/signals/sankey-signals.es.js +1 -1
- package/dist/ee/signals/settings/signal-definition-form-dialog.cjs.js +2 -2
- package/dist/ee/signals/settings/signal-definition-form-dialog.es.js +2 -2
- package/dist/ee/signals/settings/trace-signal-settings.cjs.js +3 -3
- package/dist/ee/signals/settings/trace-signal-settings.es.js +3 -3
- package/dist/ee/signals/signals-error-state.cjs.js +1 -1
- package/dist/ee/signals/signals-error-state.es.js +1 -1
- package/dist/ee/signals/snapshot-timeline.cjs.js +1 -1
- package/dist/ee/signals/snapshot-timeline.es.js +1 -1
- package/dist/ee/signals/theme-filter-banner.cjs.js +1 -1
- package/dist/ee/signals/theme-filter-banner.es.js +1 -1
- package/dist/ee/signals/trace-insight-view.cjs.js +1 -1
- package/dist/ee/signals/trace-insight-view.es.js +1 -1
- package/dist/ee/signals/view-mode-tab.cjs.js +1 -1
- package/dist/ee/signals/view-mode-tab.es.js +1 -1
- package/dist/ee/topics/components/topic-trace-summary-list.cjs.js +2 -2
- package/dist/ee/topics/components/topic-trace-summary-list.es.js +2 -2
- package/dist/{filter-bar-chip-7O02P9Vk.js → filter-bar-chip-CABeKrtf.js} +88 -73
- package/dist/filter-bar-chip-CABeKrtf.js.map +1 -0
- package/dist/{filter-bar-chip-BUyMf8XQ.cjs → filter-bar-chip-Cg-UbIwP.cjs} +90 -81
- package/dist/filter-bar-chip-Cg-UbIwP.cjs.map +1 -0
- package/dist/filter-bar-chip.css +22 -0
- package/dist/filter-bar-time-range-BA-pXMlo.cjs +83 -0
- package/dist/filter-bar-time-range-BA-pXMlo.cjs.map +1 -0
- package/dist/filter-bar-time-range-mg9JeYue.js +60 -0
- package/dist/filter-bar-time-range-mg9JeYue.js.map +1 -0
- package/dist/hooks/use-copy-to-clipboard.cjs.js +1 -1
- package/dist/hooks/use-copy-to-clipboard.es.js +1 -1
- package/dist/{input-group-uDpFNnSW.cjs → input-group-DVJLZDBL.cjs} +6 -4
- package/dist/input-group-DVJLZDBL.cjs.map +1 -0
- package/dist/{input-group-g85FYfze.js → input-group-QKKV_ouF.js} +7 -5
- package/dist/input-group-QKKV_ouF.js.map +1 -0
- package/dist/layout/tabbed-container.cjs.js +1 -1
- package/dist/layout/tabbed-container.es.js +1 -1
- package/dist/lib/form/components/array-element-wrapper.cjs.js +1 -1
- package/dist/lib/form/components/array-element-wrapper.es.js +1 -1
- package/dist/lib/form/components/array-wrapper.cjs.js +1 -1
- package/dist/lib/form/components/array-wrapper.es.js +1 -1
- package/dist/lib/form/components/date-field.cjs.js +1 -1
- package/dist/lib/form/components/date-field.es.js +1 -1
- package/dist/lib/form/components/error-message.cjs.js +1 -1
- package/dist/lib/form/components/error-message.es.js +1 -1
- package/dist/lib/form/components/form-submit-row.cjs.js +1 -1
- package/dist/lib/form/components/form-submit-row.es.js +1 -1
- package/dist/lib/form/components/record-field.cjs.js +1 -1
- package/dist/lib/form/components/record-field.es.js +1 -1
- package/dist/lib/form/components/select-field.cjs.js +1 -1
- package/dist/lib/form/components/select-field.es.js +1 -1
- package/dist/lib/form/components/submit-button.cjs.js +1 -1
- package/dist/lib/form/components/submit-button.es.js +1 -1
- package/dist/{list-search-BEJmYa9a.cjs → list-search-BtRno5As.cjs} +2 -2
- package/dist/list-search-BtRno5As.cjs.map +1 -0
- package/dist/{list-search-bg7WzULj.js → list-search-CkhsTFdG.js} +2 -2
- package/dist/list-search-CkhsTFdG.js.map +1 -0
- package/dist/{observability-saved-views-Zlz74syw.js → observability-saved-views-CjKTEp1V.js} +4 -4
- package/dist/observability-saved-views-CjKTEp1V.js.map +1 -0
- package/dist/{observability-saved-views-BNU3GkK6.cjs → observability-saved-views-Daizz4tU.cjs} +4 -4
- package/dist/observability-saved-views-Daizz4tU.cjs.map +1 -0
- package/dist/primitives/chart-plot.cjs.js +8 -6
- package/dist/primitives/chart-plot.cjs.js.map +1 -1
- package/dist/primitives/chart-plot.es.js +8 -6
- package/dist/primitives/chart-plot.es.js.map +1 -1
- package/dist/primitives/control-icon.cjs.js +9 -0
- package/dist/primitives/control-icon.cjs.js.map +1 -0
- package/dist/primitives/control-icon.d.ts +1 -0
- package/dist/primitives/control-icon.es.js +8 -0
- package/dist/primitives/control-icon.es.js.map +1 -0
- package/dist/primitives/control-size.cjs.js +6 -0
- package/dist/primitives/control-size.cjs.js.map +1 -1
- package/dist/primitives/control-size.es.js +6 -1
- package/dist/primitives/control-size.es.js.map +1 -1
- package/dist/primitives/menu-item.cjs.js +3 -3
- package/dist/primitives/menu-item.cjs.js.map +1 -1
- package/dist/primitives/menu-item.es.js +3 -3
- package/dist/primitives/menu-item.es.js.map +1 -1
- package/dist/primitives/trigger-button.cjs.js +1 -1
- package/dist/primitives/trigger-button.es.js +1 -1
- package/dist/{property-filter-applied-DRglaEj-.js → property-filter-applied--U5EZdaA.js} +4 -4
- package/dist/property-filter-applied--U5EZdaA.js.map +1 -0
- package/dist/{property-filter-applied-DqsPFbYM.cjs → property-filter-applied-BkkIObRq.cjs} +19 -19
- package/dist/property-filter-applied-BkkIObRq.cjs.map +1 -0
- package/dist/{select-BbFpEBAY.js → select-BdIZEdcy.js} +4 -8
- package/dist/select-BdIZEdcy.js.map +1 -0
- package/dist/{select-NySY9Men.cjs → select-Dg8L5ROX.cjs} +3 -7
- package/dist/select-Dg8L5ROX.cjs.map +1 -0
- package/dist/{span-payload-primitives-ChvD2RrN.js → span-payload-primitives-B3RdahsC.js} +3 -3
- package/dist/{span-payload-primitives-ChvD2RrN.js.map → span-payload-primitives-B3RdahsC.js.map} +1 -1
- package/dist/{span-payload-primitives-w1vtAXAw.cjs → span-payload-primitives-_2d-pAOD.cjs} +3 -3
- package/dist/{span-payload-primitives-w1vtAXAw.cjs.map → span-payload-primitives-_2d-pAOD.cjs.map} +1 -1
- package/dist/src/domains/metrics/components/metrics-time-range-chip.d.ts +2 -2
- package/dist/src/domains/spans/components/spans-filter-bar.d.ts +1 -1
- package/dist/src/domains/spans/hooks/use-spans-filter-bar.d.ts +1 -1
- package/dist/src/domains/spans/span-filters.d.ts +1 -1
- package/dist/src/domains/threads/components/threads-filter-bar.d.ts +1 -1
- package/dist/src/domains/threads/hooks/use-threads-filter-bar.d.ts +1 -1
- package/dist/src/domains/threads/thread-filters.d.ts +1 -1
- package/dist/src/domains/traces/components/traces-explorer/traces-explorer-filter-bar.d.ts +3 -3
- package/dist/src/domains/traces/components/traces-page-skeleton.d.ts +1 -1
- package/dist/src/ds/components/Button/Button.d.ts +15 -0
- package/dist/src/ds/components/ClearFiltersButton/clear-filters-button.d.ts +12 -0
- package/dist/src/ds/components/ClearFiltersButton/index.d.ts +1 -0
- package/dist/src/ds/components/Combobox/combobox-styles.d.ts +0 -1
- package/dist/src/ds/components/DateTimeRangePicker/date-time-range-picker.d.ts +12 -11
- package/dist/src/ds/components/FilterBar/filter-bar-chip.d.ts +10 -7
- package/dist/src/ds/components/FilterBar/filter-bar-time-range.d.ts +19 -0
- package/dist/src/ds/components/FilterBar/filter-bar.d.ts +2 -0
- package/dist/src/ds/components/FilterBar/index.d.ts +2 -0
- package/dist/src/ds/components/FilterBar/use-filter-bar-item-keys.d.ts +23 -0
- package/dist/src/ds/components/ListSearch/list-search.d.ts +1 -0
- package/dist/src/ds/components/MetricsTable/metrics-table-rows.d.ts +10 -3
- package/dist/src/ds/components/MetricsTable/metrics-table.d.ts +1 -1
- package/dist/src/ds/primitives/control-icon.d.ts +3 -0
- package/dist/src/ds/primitives/control-size.d.ts +1 -0
- package/dist/style.css +131 -65
- package/dist/{tabbed-container-CFEImJOK.cjs → tabbed-container-B4lCBgRP.cjs} +6 -6
- package/dist/{tabbed-container-CFEImJOK.cjs.map → tabbed-container-B4lCBgRP.cjs.map} +1 -1
- package/dist/{tabbed-container-BKUqfEKy.js → tabbed-container-DI1GI1Qv.js} +6 -6
- package/dist/{tabbed-container-BKUqfEKy.js.map → tabbed-container-DI1GI1Qv.js.map} +1 -1
- package/dist/{tabs-content-DgR3Hik1.cjs → tabs-content-CmXe5ML0.cjs} +2 -2
- package/dist/{tabs-content-DgR3Hik1.cjs.map → tabs-content-CmXe5ML0.cjs.map} +1 -1
- package/dist/{tabs-content-cpV6A9c3.js → tabs-content-D__B9hd-.js} +2 -2
- package/dist/{tabs-content-cpV6A9c3.js.map → tabs-content-D__B9hd-.js.map} +1 -1
- package/dist/{tabs-tab-UT1JliwK.js → tabs-tab-CYTZevdV.js} +2 -2
- package/dist/{tabs-tab-UT1JliwK.js.map → tabs-tab-CYTZevdV.js.map} +1 -1
- package/dist/{tabs-tab-Qp3RJ17z.cjs → tabs-tab-DGwfHVDr.cjs} +2 -2
- package/dist/{tabs-tab-Qp3RJ17z.cjs.map → tabs-tab-DGwfHVDr.cjs.map} +1 -1
- package/dist/{toast-api-WhxnAT9F.js → toast-api-D_rrRhNG.js} +2 -2
- package/dist/{toast-api-WhxnAT9F.js.map → toast-api-D_rrRhNG.js.map} +1 -1
- package/dist/{toast-api-Bv87KHu_.cjs → toast-api-qtkOucy2.cjs} +2 -2
- package/dist/{toast-api-Bv87KHu_.cjs.map → toast-api-qtkOucy2.cjs.map} +1 -1
- package/dist/{tool-approval-Dfi0uAKU.cjs → tool-approval-1qiB4hhG.cjs} +4 -4
- package/dist/{tool-approval-Dfi0uAKU.cjs.map → tool-approval-1qiB4hhG.cjs.map} +1 -1
- package/dist/{tool-approval-DHeCkWHT.js → tool-approval-B6MFcaKV.js} +4 -4
- package/dist/{tool-approval-DHeCkWHT.js.map → tool-approval-B6MFcaKV.js.map} +1 -1
- package/dist/{tool-call-BCsDhIhs.cjs → tool-call-Bu66PkD-.cjs} +3 -3
- package/dist/{tool-call-BCsDhIhs.cjs.map → tool-call-Bu66PkD-.cjs.map} +1 -1
- package/dist/{tool-call-CILZa3tn.js → tool-call-Ch9-jjXU.js} +3 -3
- package/dist/{tool-call-CILZa3tn.js.map → tool-call-Ch9-jjXU.js.map} +1 -1
- package/dist/{tool-card-CJ7Kxi-U.cjs → tool-card-DrqPZfPQ.cjs} +4 -4
- package/dist/{tool-card-CJ7Kxi-U.cjs.map → tool-card-DrqPZfPQ.cjs.map} +1 -1
- package/dist/{tool-card-C3sDFUWc.js → tool-card-sO6P2Qj4.js} +4 -4
- package/dist/{tool-card-C3sDFUWc.js.map → tool-card-sO6P2Qj4.js.map} +1 -1
- package/dist/{trace-filters-BJaebsxJ.js → trace-filters-CaWkw779.js} +2 -3
- package/dist/trace-filters-CaWkw779.js.map +1 -0
- package/dist/{trace-filters-BNEZ31HX.cjs → trace-filters-a0N9bf52.cjs} +1 -2
- package/dist/trace-filters-a0N9bf52.cjs.map +1 -0
- package/dist/{use-workflow-graph-runtime-deTN_q_G.js → use-workflow-graph-runtime-BKNhOKsH.js} +3 -3
- package/dist/{use-workflow-graph-runtime-deTN_q_G.js.map → use-workflow-graph-runtime-BKNhOKsH.js.map} +1 -1
- package/dist/{use-workflow-graph-runtime-DkwQjMEV.cjs → use-workflow-graph-runtime-DYao-08R.cjs} +3 -3
- package/dist/{use-workflow-graph-runtime-DkwQjMEV.cjs.map → use-workflow-graph-runtime-DYao-08R.cjs.map} +1 -1
- package/dist/utils/toast.cjs.js +1 -1
- package/dist/utils/toast.es.js +1 -1
- package/oxlint/index.js +90 -0
- package/package.json +9 -9
- package/theme.css +5 -0
- package/dist/ActionRow-BfK77pCT.cjs.map +0 -1
- package/dist/ActionRow-Cd6tOC2K.js.map +0 -1
- package/dist/Button-Bw1e3ONi.js.map +0 -1
- package/dist/Button-YQRflC47.cjs.map +0 -1
- package/dist/DataCodeSection-CZRPsStI.cjs.map +0 -1
- package/dist/DataCodeSection-Ckd47p_S.js.map +0 -1
- package/dist/DateTimeRangePicker-C_Lie_2P.js.map +0 -1
- package/dist/DateTimeRangePicker-HmPOHwAQ.cjs.map +0 -1
- package/dist/FilterBar--4oguuVe.js.map +0 -1
- package/dist/FilterBar-BUd4f7oi.cjs.map +0 -1
- package/dist/MetricsTable-CRPeLHe1.js.map +0 -1
- package/dist/MetricsTable-D-aZf3dk.cjs.map +0 -1
- package/dist/ask-user-BdjH9F7G.js.map +0 -1
- package/dist/ask-user-C82m_G9W.cjs.map +0 -1
- package/dist/combobox-8kNAJFlj.cjs.map +0 -1
- package/dist/combobox-parts-BZVXwbG7.cjs.map +0 -1
- package/dist/combobox-parts-W7KRQUsV.js.map +0 -1
- package/dist/components/ButtonsGroup.cjs.js.map +0 -1
- package/dist/components/ButtonsGroup.es.js.map +0 -1
- package/dist/domains/traces/components/trace-time-range-chip.cjs.js +0 -90
- package/dist/domains/traces/components/trace-time-range-chip.cjs.js.map +0 -1
- package/dist/domains/traces/components/trace-time-range-chip.d.ts +0 -1
- package/dist/domains/traces/components/trace-time-range-chip.es.js +0 -86
- package/dist/domains/traces/components/trace-time-range-chip.es.js.map +0 -1
- package/dist/filter-bar-chip-7O02P9Vk.js.map +0 -1
- package/dist/filter-bar-chip-BUyMf8XQ.cjs.map +0 -1
- package/dist/input-group-g85FYfze.js.map +0 -1
- package/dist/input-group-uDpFNnSW.cjs.map +0 -1
- package/dist/list-search-BEJmYa9a.cjs.map +0 -1
- package/dist/list-search-bg7WzULj.js.map +0 -1
- package/dist/observability-saved-views-BNU3GkK6.cjs.map +0 -1
- package/dist/observability-saved-views-Zlz74syw.js.map +0 -1
- package/dist/property-filter-applied-DRglaEj-.js.map +0 -1
- package/dist/property-filter-applied-DqsPFbYM.cjs.map +0 -1
- package/dist/select-BbFpEBAY.js.map +0 -1
- package/dist/select-NySY9Men.cjs.map +0 -1
- package/dist/src/domains/traces/components/trace-time-range-chip.d.ts +0 -22
- package/dist/trace-filters-BJaebsxJ.js.map +0 -1
- package/dist/trace-filters-BNEZ31HX.cjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"property-filter-applied-DqsPFbYM.cjs","names":["Button","XIcon","DropdownMenu","EllipsisVerticalIcon","SaveIcon","Trash2Icon","cn","menuItemButtonClass","menuItemCheckClass","CheckIcon","useState","useMemo","_Fragment","menuSearchClasses","SearchIcon","passwordManagerOptOutProps","menuEmptyClass","Spinner","TooltipProvider","Tooltip","TooltipTrigger","ButtonsGroup","ButtonsGroupText","LockIcon","TooltipContent","useState","useRef","Input","Button","XIcon","Popover","PopoverTrigger","PopoverContent"],"sources":["../src/ds/components/PropertyFilter/property-filter-actions.tsx","../src/ds/components/PropertyFilter/pick-multi-panel.tsx","../src/ds/components/PropertyFilter/property-filter-applied.tsx"],"sourcesContent":["import { EllipsisVerticalIcon, SaveIcon, Trash2Icon, XIcon } from 'lucide-react';\nimport { Button } from '@/ds/components/Button/Button';\nimport { DropdownMenu } from '@/ds/components/DropdownMenu/dropdown-menu';\n\nexport type PropertyFilterActionsProps = {\n disabled?: boolean;\n /** Neutralize each pill's value (keep pills, clear values). Shown as a button, not a menu item. */\n onClear?: () => void;\n /** Fully remove all active filters. Rendered as \"Remove all filters\" inside the overflow menu. */\n onRemoveAll?: () => void;\n /** Persist the current filter set (typically to localStorage) for later restoration. */\n onSave?: () => void;\n /** Drop a previously-saved filter set. Wire only when a saved set actually exists. */\n onRemoveSaved?: () => void;\n};\n\n/**\n * Shared action bar for filter-driven pages (traces, logs, …). Renders a\n * Clear button and an overflow menu with Remove all / Save / Remove saved actions.\n */\nexport function PropertyFilterActions({\n disabled,\n onClear,\n onRemoveAll,\n onSave,\n onRemoveSaved,\n}: PropertyFilterActionsProps) {\n const hasMenuItems = !!(onRemoveAll || onSave || onRemoveSaved);\n if (!onClear && !hasMenuItems) return null;\n\n return (\n <div className=\"flex items-center gap-2\">\n {onClear && (\n <Button disabled={disabled} size=\"md\" onClick={onClear} icon={<XIcon />}>\n Clear\n </Button>\n )}\n\n {hasMenuItems && (\n <DropdownMenu>\n <DropdownMenu.Trigger asChild>\n <Button disabled={disabled} size=\"icon-md\" aria-label=\"More filter actions\">\n <EllipsisVerticalIcon />\n </Button>\n </DropdownMenu.Trigger>\n <DropdownMenu.Content align=\"end\">\n {onRemoveAll && (\n <DropdownMenu.Item onSelect={() => onRemoveAll()}>\n <XIcon />\n Remove all filters\n </DropdownMenu.Item>\n )}\n {onRemoveAll && (onSave || onRemoveSaved) && <DropdownMenu.Separator />}\n {onSave && (\n <DropdownMenu.Item onSelect={() => onSave()}>\n <SaveIcon />\n Save filters for next time\n </DropdownMenu.Item>\n )}\n {onRemoveSaved && (\n <DropdownMenu.Item onSelect={() => onRemoveSaved()}>\n <Trash2Icon />\n Remove saved filters\n </DropdownMenu.Item>\n )}\n </DropdownMenu.Content>\n </DropdownMenu>\n )}\n </div>\n );\n}\n","import { CheckIcon, SearchIcon } from 'lucide-react';\nimport { useMemo, useState } from 'react';\nimport type { PropertyFilterField, PropertyFilterToken } from './types';\nimport { Spinner } from '@/ds/components/Spinner/spinner';\nimport { menuEmptyClass, menuItemButtonClass, menuItemCheckClass, menuSearchClasses } from '@/ds/primitives/menu-item';\nimport { passwordManagerOptOutProps } from '@/ds/primitives/password-manager-autofill';\nimport { cn } from '@/lib/utils';\n\n// Same rendering as Combobox items: no visible control, a trailing check when selected.\n// Focus is on the item itself (roving via [data-pick-multi-item]).\nconst pickMultiItemClass = cn(menuItemButtonClass, 'min-w-0');\n\nfunction PickMultiItem({\n role,\n checked,\n label,\n onClick,\n}: {\n role: 'checkbox' | 'radio';\n checked: boolean;\n label: string;\n onClick: () => void;\n}) {\n return (\n <button\n type=\"button\"\n role={role}\n aria-checked={checked}\n data-selected={checked || undefined}\n data-pick-multi-item=\"\"\n title={label}\n className={pickMultiItemClass}\n onClick={onClick}\n >\n <span className=\"min-w-0 flex-1 truncate\">{label}</span>\n {checked && (\n <span className={menuItemCheckClass}>\n <CheckIcon />\n </span>\n )}\n </button>\n );\n}\n\ntype PickMultiField = Extract<PropertyFilterField, { kind: 'pick-multi' }>;\n\nexport type PickMultiPanelProps = {\n field: PickMultiField;\n tokens: PropertyFilterToken[];\n /** Always carries a value: an empty list is how the panel says \"nothing selected\". */\n onChange: (fieldId: string, value: string | string[]) => void;\n};\n\n/**\n * Reusable body for a pick-multi side popover: optional search input plus a\n * radio group (single-select) or checkbox list (when `field.multi` is true).\n * Shared between the Filter Creator's property-picker side popover and the\n * PropertyFilterApplied pill's inline editor so both surfaces use the exact same UI.\n */\nexport function PickMultiPanel({ field, tokens, onChange }: PickMultiPanelProps) {\n const [query, setQuery] = useState('');\n const listClassName = 'max-h-[80dvh] overflow-auto p-1';\n\n const filteredOptions = useMemo(() => {\n const q = query.trim().toLowerCase();\n if (!q) return field.options;\n return field.options.filter(o => o.label.toLowerCase().includes(q));\n }, [field.options, query]);\n\n const token = useMemo(() => tokens.find(t => t.fieldId === field.id), [tokens, field.id]);\n // Fall back to `defaultValue` when no token exists — lets view-toggle fields (e.g. List mode)\n // show their default option pre-selected before the user explicitly picks one.\n const selectedValue = typeof token?.value === 'string' ? token.value : !field.multi ? field.defaultValue : undefined;\n const selectedValues = useMemo<string[]>(() => {\n const value = token?.value;\n if (Array.isArray(value)) return value;\n if (typeof value === 'string') return [value];\n return [];\n }, [token]);\n\n return (\n <>\n {field.searchable !== false && (\n <div className={menuSearchClasses.container}>\n <SearchIcon className={menuSearchClasses.icon} />\n <input\n type=\"text\"\n value={query}\n onChange={e => setQuery(e.target.value)}\n placeholder={`Search ${field.label.toLowerCase()}...`}\n className={menuSearchClasses.input}\n {...passwordManagerOptOutProps}\n onKeyDown={e => {\n if (e.key !== 'ArrowDown') return;\n const panel = e.currentTarget.closest<HTMLElement>('[data-pick-multi-panel]');\n const first = panel?.querySelector<HTMLElement>('[data-pick-multi-item]:not([disabled])');\n if (!first) return;\n e.preventDefault();\n e.stopPropagation();\n first.focus();\n }}\n />\n </div>\n )}\n\n {field.isLoading ? (\n <div className={cn(menuEmptyClass, 'm-1')}>\n <Spinner size=\"sm\" className=\"size-3 text-muted-foreground\" />\n Loading options…\n </div>\n ) : filteredOptions.length === 0 ? (\n <div className={cn(menuEmptyClass, 'm-1')}>{field.emptyText ?? 'No option found.'}</div>\n ) : field.multi ? (\n <div className={listClassName}>\n <>\n {filteredOptions.map(option => {\n const checked = selectedValues.includes(option.value);\n return (\n <PickMultiItem\n key={option.value}\n role=\"checkbox\"\n checked={checked}\n label={option.label}\n onClick={() =>\n onChange(\n field.id,\n checked ? selectedValues.filter(v => v !== option.value) : [...selectedValues, option.value],\n )\n }\n />\n );\n })}\n </>\n </div>\n ) : (\n <div role=\"radiogroup\" className={listClassName}>\n <>\n {filteredOptions.map(option => (\n <PickMultiItem\n key={option.value}\n role=\"radio\"\n checked={selectedValue === option.value}\n label={option.label}\n onClick={() => onChange(field.id, option.value)}\n />\n ))}\n {!field.omitAnyOption && (\n <PickMultiItem\n role=\"radio\"\n checked={selectedValue === 'Any'}\n label=\"Any\"\n onClick={() => onChange(field.id, 'Any')}\n />\n )}\n </>\n </div>\n )}\n </>\n );\n}\n","import { LockIcon, XIcon } from 'lucide-react';\nimport type { ReactNode } from 'react';\nimport { useEffect, useRef, useState } from 'react';\nimport { Button } from '../Button';\nimport { ButtonsGroup, ButtonsGroupText } from '../ButtonsGroup';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../Tooltip';\nimport { PickMultiPanel } from './pick-multi-panel';\nimport type { PropertyFilterField, PropertyFilterToken } from './types';\nimport { Input } from '@/ds/components/Input';\nimport { Popover, PopoverContent, PopoverTrigger } from '@/ds/components/Popover/popover';\nimport { MENU_SIDE_OFFSET } from '@/ds/primitives/menu-item';\n\nexport type PropertyFilterAppliedProps = {\n fields: PropertyFilterField[];\n tokens: PropertyFilterToken[];\n onTokensChange: (tokens: PropertyFilterToken[]) => void;\n disabled?: boolean;\n /**\n * Field id that was just added via the Creator — rendered pill auto-focuses\n * its input so the user can start typing immediately.\n */\n autoFocusFieldId?: string;\n /**\n * Field ids whose pills must remain visible and read-only — value stays\n * displayed but cannot be edited or removed. Use when an upstream context\n * (e.g. agent-scoped traces tab) pre-applies a filter that the user must\n * not be able to clear.\n */\n lockedFieldIds?: readonly string[];\n /** Tooltip content shown on hover/focus of any locked pill. */\n lockedTooltipContent?: ReactNode;\n};\n\nfunction stringifyTokenValue(value: string | string[]) {\n if (Array.isArray(value)) return value.length === 0 ? 'Any' : value.join(', ');\n return value;\n}\n\nconst DEFAULT_LOCKED_TOOLTIP = 'This filter is set by the current context and cannot be removed here.';\n\nfunction lookupOptionLabel(field: PropertyFilterField, value: string | string[]): string {\n if (field.kind === 'pick-multi' && field.options) {\n if (Array.isArray(value)) {\n if (value.length === 0) return 'Any';\n return value.map(v => field.options.find(o => o.value === v)?.label ?? v).join(', ');\n }\n return field.options.find(o => o.value === value)?.label ?? value;\n }\n return stringifyTokenValue(value);\n}\n\ntype LockedTokenPillProps = {\n field: PropertyFilterField;\n value: string | string[];\n tooltipContent: ReactNode;\n};\n\nfunction LockedTokenPill({ field, value, tooltipContent }: LockedTokenPillProps) {\n const display = lookupOptionLabel(field, value);\n const lockA11yLabel = `${field.label} filter is locked by context`;\n\n return (\n <TooltipProvider delayDuration={150}>\n <Tooltip>\n <TooltipTrigger asChild>\n <ButtonsGroup\n data-locked-field-id={field.id}\n data-property-filter-pill=\"locked\"\n tabIndex={0}\n aria-label={lockA11yLabel}\n >\n <ButtonsGroupText>{field.label}</ButtonsGroupText>\n <ButtonsGroupText>is</ButtonsGroupText>\n <ButtonsGroupText>{display}</ButtonsGroupText>\n <ButtonsGroupText>\n <LockIcon />\n </ButtonsGroupText>\n </ButtonsGroup>\n </TooltipTrigger>\n <TooltipContent>{tooltipContent}</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n}\n\ntype TextTokenPillProps = {\n field: Extract<PropertyFilterField, { kind: 'text' }>;\n value: string;\n onChange: (value: string) => void;\n onRemove: () => void;\n disabled?: boolean;\n autoFocus?: boolean;\n};\n\nfunction TextTokenPill({ field, value, onChange, onRemove, disabled, autoFocus }: TextTokenPillProps) {\n // Local draft keeps the caret stable when the URL round-trip trims the\n // stored value (e.g. trailing spaces). We only re-sync from the prop when\n // the external value is genuinely different from our current (trimmed) draft.\n const [draft, setDraft] = useState(value);\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (draft.trim() !== value) setDraft(value);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [value]);\n\n useEffect(() => {\n if (autoFocus) inputRef.current?.focus();\n }, [autoFocus]);\n\n return (\n <ButtonsGroup>\n <ButtonsGroupText>{field.label}</ButtonsGroupText>\n <ButtonsGroupText>is</ButtonsGroupText>\n <Input\n ref={inputRef}\n disabled={disabled}\n value={draft}\n placeholder={field.placeholder ?? `Enter ${field.label}`}\n onChange={e => {\n const next = e.target.value;\n setDraft(next);\n // Apply live — URL and traces query update on every keystroke.\n // Empty values persist as empty-value tokens so the pill stays visible.\n if (next.trim() !== value) onChange(next);\n }}\n onKeyDown={e => {\n if (e.key === 'Enter') {\n e.preventDefault();\n const trimmed = draft.trim();\n if (trimmed !== value) onChange(trimmed);\n } else if (e.key === 'Escape') {\n e.preventDefault();\n setDraft(value);\n e.currentTarget.blur();\n }\n }}\n />\n <Button\n size=\"icon-md\"\n type=\"button\"\n disabled={disabled}\n aria-label={`Remove ${field.label} filter`}\n onMouseDown={e => e.preventDefault()}\n onClick={onRemove}\n >\n <XIcon />\n </Button>\n </ButtonsGroup>\n );\n}\n\ntype PickMultiTokenPillProps = {\n field: Extract<PropertyFilterField, { kind: 'pick-multi' }>;\n token: PropertyFilterToken;\n tokens: PropertyFilterToken[];\n onChange: (fieldId: string, value: string | string[]) => void;\n onRemove: () => void;\n disabled?: boolean;\n};\n\nfunction PickMultiTokenPill({ field, token, tokens, onChange, onRemove, disabled }: PickMultiTokenPillProps) {\n const [open, setOpen] = useState(false);\n\n return (\n <ButtonsGroup>\n <ButtonsGroupText>{field.label}</ButtonsGroupText>\n <ButtonsGroupText>is</ButtonsGroupText>\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <Button type=\"button\" disabled={disabled}>\n {stringifyTokenValue(token.value)}\n </Button>\n </PopoverTrigger>\n <PopoverContent align=\"start\" sideOffset={MENU_SIDE_OFFSET} className=\"w-64 p-0\" data-pick-multi-panel>\n <PickMultiPanel field={field} tokens={tokens} onChange={onChange} />\n </PopoverContent>\n </Popover>\n <Button\n size=\"icon-md\"\n type=\"button\"\n disabled={disabled}\n aria-label={`Remove ${field.label} filter`}\n onClick={onRemove}\n >\n <XIcon />\n </Button>\n </ButtonsGroup>\n );\n}\n\n/**\n * Applied filter pills. Text/id-style tokens render with an always-active\n * input so the user can edit the value inline (and an empty token is valid —\n * it persists in the URL until the user explicitly removes it via ×).\n * Pick-multi tokens render with a clickable value that opens the same side\n * popover as the Filter Creator so the user can update selections in place.\n * Creation lives in a separate component (PropertyFilterCreator).\n */\nexport function PropertyFilterApplied({\n fields,\n tokens,\n onTokensChange,\n disabled,\n autoFocusFieldId,\n lockedFieldIds,\n lockedTooltipContent = DEFAULT_LOCKED_TOOLTIP,\n}: PropertyFilterAppliedProps) {\n if (tokens.length === 0) return null;\n\n const lockedSet = new Set(lockedFieldIds ?? []);\n\n const replaceTokenAt = (index: number, next: PropertyFilterToken) => {\n const copy = [...tokens];\n copy[index] = next;\n onTokensChange(copy);\n };\n\n const removeTokenAt = (index: number) => {\n onTokensChange(tokens.filter((_, i) => i !== index));\n };\n\n return (\n <div className=\"flex flex-wrap items-center gap-2\">\n {tokens.map((token, index) => {\n const field = fields.find(f => f.id === token.fieldId);\n if (!field) return null;\n\n if (lockedSet.has(token.fieldId)) {\n return (\n <LockedTokenPill\n key={`${token.fieldId}-${index}`}\n field={field}\n value={token.value}\n tooltipContent={lockedTooltipContent}\n />\n );\n }\n\n if (field.kind === 'text' && !Array.isArray(token.value)) {\n return (\n <TextTokenPill\n key={`${token.fieldId}-${index}`}\n field={field}\n value={token.value}\n disabled={disabled}\n autoFocus={autoFocusFieldId === token.fieldId}\n onChange={nextValue => replaceTokenAt(index, { fieldId: token.fieldId, value: nextValue })}\n onRemove={() => removeTokenAt(index)}\n />\n );\n }\n\n if (field.kind === 'pick-multi') {\n return (\n <PickMultiTokenPill\n key={`${token.fieldId}-${index}`}\n field={field}\n token={token}\n tokens={tokens}\n disabled={disabled}\n // Unselecting everything (empty array) keeps the pill alive in a\n // neutral state — the user explicitly removes it via ×. This lets\n // the page-level Reset neutralize values without dropping the pill.\n onChange={(fieldId, value) => replaceTokenAt(index, { fieldId, value })}\n onRemove={() => removeTokenAt(index)}\n />\n );\n }\n\n return (\n <ButtonsGroup key={`${token.fieldId}-${index}`}>\n <ButtonsGroupText>{field.label}</ButtonsGroupText>\n <ButtonsGroupText>is</ButtonsGroupText>\n <ButtonsGroupText>{stringifyTokenValue(token.value)}</ButtonsGroupText>\n <Button\n size=\"icon-md\"\n type=\"button\"\n disabled={disabled}\n aria-label={`Remove ${field.label} filter`}\n onClick={() => removeTokenAt(index)}\n >\n <XIcon />\n </Button>\n </ButtonsGroup>\n );\n })}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"select-BbFpEBAY.js","names":["React","Select","SelectPrimitive"],"sources":["../src/ds/components/Select/select.tsx"],"sourcesContent":["import { Select as SelectPrimitive } from '@base-ui/react/select';\nimport type { SelectPopupProps, SelectPositionerProps } from '@base-ui/react/select';\nimport { Check, ChevronDown } from 'lucide-react';\nimport * as React from 'react';\n\nimport { buttonVariants } from '../Button/Button';\nimport type { TextButtonSize } from '../Button/Button';\nimport { keepOwnAccessibleName } from '@/ds/components/Field/field-control-aria';\nimport { controlTriggerOpenState } from '@/ds/primitives/control-size';\nimport { FLOATING_POSITION_METHOD } from '@/ds/primitives/floating';\nimport { fieldTriggerErrorBorder, fieldTriggerStyle, fieldTriggerWidthStyle } from '@/ds/primitives/form-element';\nimport {\n menuItemCheckClass,\n menuItemClass,\n menuPopupClass,\n menuPositionerClass,\n menuSeparatorClass,\n} from '@/ds/primitives/menu-item';\nimport { menuScrollPopupClass, MenuScrollArea } from '@/ds/primitives/menu-scroll-area';\nimport { usePortalContainer } from '@/ds/primitives/portal-container';\nimport { transitions } from '@/ds/primitives/transitions';\nimport { cn } from '@/lib/utils';\n\n/**\n * Select migrated from `@radix-ui/react-select` to Base UI (`@base-ui/react/select`).\n *\n * The public API (`Select`, `SelectGroup`, `SelectValue`, `SelectTrigger`,\n * `SelectContent`, `SelectItem`) is intentionally kept stable so existing\n * consumers do not need changes.\n *\n * Notable behavioral differences vs. Radix that consumers should be aware of:\n * - `onValueChange` now receives a second `eventDetails` argument. Existing\n * handlers typed as `(value: string) => void` keep working (extra arg ignored).\n * - The dropdown no longer overlaps the trigger by default\n * (`alignItemWithTrigger={false}`), matching the previous Radix `popper`\n * positioning behavior.\n *\n * Implementation note: unlike Radix, Base UI's `Select.Value` can only resolve\n * a selected value to its label once the popup has mounted (it reads labels\n * from rendered items). To preserve the Radix behavior where the trigger shows\n * the selected label even while closed, `Select` auto-derives an `items` map\n * from the `SelectItem`s declared inside `SelectContent` and passes it to\n * `Select.Root`. Consumers can still pass an explicit `items` prop to override.\n */\ntype SelectItemNode = React.ReactElement<{ value: unknown; children?: React.ReactNode }>;\n\nfunction isSelectItem(node: React.ReactNode): node is SelectItemNode {\n return React.isValidElement(node) && (node.type as { displayName?: string })?.displayName === 'SelectItem';\n}\n\n/** Recursively collect `{ value, label }` pairs from declared `SelectItem`s. */\nfunction collectItems(children: React.ReactNode, acc: Array<{ value: unknown; label: React.ReactNode }>): void {\n React.Children.forEach(children, child => {\n if (!React.isValidElement(child)) return;\n if (isSelectItem(child)) {\n acc.push({ value: child.props.value, label: child.props.children });\n return;\n }\n const nested = (child.props as { children?: React.ReactNode })?.children;\n if (nested != null) collectItems(nested, acc);\n });\n}\n\ntype SelectRootProps<Value> = SelectPrimitive.Root.Props<Value>;\ntype SelectChangeDetails = Parameters<NonNullable<SelectRootProps<unknown>['onValueChange']>>[1];\n\n/**\n * `onValueChange` is intentionally narrowed to a non-null value: these selects\n * always hold a value once changed, which keeps existing `(value) => void`\n * consumer handlers valid (Base UI's own callback type is `Value | null`).\n */\ntype SelectProps<Value = string> = Omit<SelectRootProps<Value>, 'onValueChange'> & {\n onValueChange?: (value: Value, eventDetails: SelectChangeDetails) => void;\n};\n\nfunction Select<Value = string>({ children, items, onValueChange, ...props }: SelectProps<Value>) {\n const derivedItems = React.useMemo(() => {\n if (items != null) return items;\n const acc: Array<{ value: unknown; label: React.ReactNode }> = [];\n collectItems(children, acc);\n return acc.length > 0 ? acc : undefined;\n }, [items, children]);\n\n return (\n <SelectPrimitive.Root\n items={derivedItems}\n onValueChange={onValueChange ? (value, eventDetails) => onValueChange(value as Value, eventDetails) : undefined}\n {...props}\n >\n {children}\n </SelectPrimitive.Root>\n );\n}\nSelect.displayName = 'Select';\n\nconst SelectGroup = SelectPrimitive.Group;\n\nexport type SelectValueProps = Omit<SelectPrimitive.Value.Props, 'className'> & {\n className?: string;\n};\n\n/**\n * Displays the selected value. Radix's `Select.Value` took a `placeholder`\n * prop and rendered the selected item's text automatically; Base UI's\n * `Select.Value` behaves the same way (renders the value, falls back to\n * `placeholder` when nothing is selected), so this is a thin passthrough.\n */\nconst SelectValue = React.forwardRef<HTMLSpanElement, SelectValueProps>(({ className, ...props }, ref) => (\n <SelectPrimitive.Value ref={ref} className={cn('truncate', className)} {...props} />\n));\nSelectValue.displayName = 'SelectValue';\n\n/**\n * A select is a form field, so it reuses the Button's size/shape recipe with\n * these looks: `default` (the Input's overlay surface — the default here too,\n * so a select sits next to an Input as the same kind of thing) and `ghost`\n * (borderless, for dense toolbars/inline pickers). The high-emphasis `primary` look is the only one intentionally NOT\n * offered (a field is not a call-to-action).\n */\nexport type SelectTriggerVariant = 'default' | 'ghost';\ntype SelectTriggerLegacyVariant = 'primary';\n\nexport type SelectTriggerProps = Omit<SelectPrimitive.Trigger.Props, 'className'> & {\n className?: string;\n size?: TextButtonSize;\n variant?: SelectTriggerVariant | SelectTriggerLegacyVariant;\n};\n\nfunction normalizeSelectTriggerVariant(\n variant: SelectTriggerVariant | SelectTriggerLegacyVariant,\n): SelectTriggerVariant {\n return variant === 'primary' ? 'default' : variant;\n}\n\nconst SelectTrigger = React.forwardRef<HTMLButtonElement, SelectTriggerProps>(\n ({ className, children, size = 'md', variant = 'default', ...props }, ref) => {\n const visualVariant = normalizeSelectTriggerVariant(variant);\n\n return (\n <SelectPrimitive.Trigger\n ref={ref}\n data-slot=\"select-trigger\"\n // A select = a button + a trailing chevron: reuse the Button recipe\n // (variant colors, size = height/text/padding/radius, unified border\n // focus, disabled) and layer only the select-specific extras.\n className={cn(\n buttonVariants({ variant: visualVariant, size }),\n visualVariant === 'default' && fieldTriggerStyle,\n // Fill the field and push the value left / chevron right (Button's\n // base centers its content with `justify-center`).\n fieldTriggerWidthStyle,\n 'justify-between',\n // Read as \"active\" while the menu is open, per variant (see map above).\n controlTriggerOpenState[visualVariant],\n 'data-[placeholder]:text-muted-foreground',\n fieldTriggerErrorBorder,\n '[&>span]:truncate',\n className,\n )}\n {...props}\n {...keepOwnAccessibleName(props)}\n >\n {children}\n {/* `SelectPrimitive.Icon` renders the provided element in place of its\n default `<span>`, so the chevron would land as a *direct* `<svg>`\n child of the trigger — where Button's `TEXT_MODE_ADORNMENTS`\n `[&>svg]` rules (negative `mx`, forced 50% opacity, 1.1em sizing)\n would distort and mis-position it. Wrapping it in a `<span>` keeps\n the svg one level deep so those rules can't reach it, leaving the\n chevron pinned at the right edge at its intended size and color. */}\n <SelectPrimitive.Icon\n render={\n <span className=\"flex shrink-0 items-center\">\n <ChevronDown className={cn('size-4 text-muted-foreground', transitions.colors)} />\n </span>\n }\n />\n </SelectPrimitive.Trigger>\n );\n },\n);\nSelectTrigger.displayName = 'SelectTrigger';\n\ntype SelectContentPositionerProps = Omit<SelectPositionerProps, keyof SelectPopupProps>;\n\nexport type SelectContentProps = Omit<SelectPopupProps, 'className'> &\n SelectContentPositionerProps & {\n className?: string;\n /**\n * Kept for API compatibility with the previous Radix API. Radix supported\n * `position=\"popper\" | \"item-aligned\"`; Base UI always uses popper-style\n * positioning so this prop is accepted but has no effect.\n */\n position?: 'popper' | 'item-aligned';\n /** Optional portal container, forwarded to `Select.Portal`. */\n container?: HTMLElement | null;\n };\n\nconst SelectContent = React.forwardRef<HTMLDivElement, SelectContentProps>(\n (\n {\n className,\n children,\n position: _position,\n container,\n side = 'bottom',\n align = 'start',\n sideOffset = 4,\n alignItemWithTrigger = false,\n anchor,\n positionMethod = FLOATING_POSITION_METHOD,\n alignOffset,\n collisionBoundary,\n collisionPadding,\n sticky,\n arrowPadding,\n disableAnchorTracking,\n collisionAvoidance,\n ...props\n },\n ref,\n ) => {\n // Default to the nearest SideDialog/Drawer popup so the dropdown stays\n // interactive inside a modal drawer; an explicit `container` still wins.\n const resolvedContainer = usePortalContainer(container);\n const positionerProps: SelectContentPositionerProps = {\n side,\n align,\n sideOffset,\n alignItemWithTrigger,\n anchor,\n positionMethod,\n alignOffset,\n collisionBoundary,\n collisionPadding,\n sticky,\n arrowPadding,\n disableAnchorTracking,\n collisionAvoidance,\n };\n\n return (\n <SelectPrimitive.Portal container={resolvedContainer}>\n <SelectPrimitive.Positioner className={menuPositionerClass} {...positionerProps}>\n <SelectPrimitive.Popup ref={ref} className={cn(menuPopupClass, menuScrollPopupClass, className)} {...props}>\n {/* The viewport is Select's list, so Select scrolls it to line the selected item up with the\n trigger. `role` is restated because the viewport's own `presentation` role would win. */}\n <MenuScrollArea viewportRender={<SelectPrimitive.List role=\"listbox\" />}>{children}</MenuScrollArea>\n </SelectPrimitive.Popup>\n </SelectPrimitive.Positioner>\n </SelectPrimitive.Portal>\n );\n },\n);\nSelectContent.displayName = 'SelectContent';\n\nexport type SelectItemProps = Omit<SelectPrimitive.Item.Props, 'className'> & {\n className?: string;\n};\n\nconst SelectItem = React.forwardRef<HTMLDivElement, SelectItemProps>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Item ref={ref} className={cn(menuItemClass, className)} {...props}>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n <SelectPrimitive.ItemIndicator className={menuItemCheckClass}>\n <Check />\n </SelectPrimitive.ItemIndicator>\n </SelectPrimitive.Item>\n));\nSelectItem.displayName = 'SelectItem';\n\nexport type SelectSeparatorProps = Omit<SelectPrimitive.Separator.Props, 'className'> & {\n className?: string;\n};\n\nconst SelectSeparator = React.forwardRef<HTMLDivElement, SelectSeparatorProps>(({ className, ...props }, ref) => (\n <SelectPrimitive.Separator\n ref={ref}\n data-slot=\"select-separator\"\n className={cn(menuSeparatorClass, className)}\n {...props}\n />\n));\nSelectSeparator.displayName = 'SelectSeparator';\n\nexport { Select, SelectGroup, SelectValue, SelectTrigger, SelectContent, SelectItem, SelectSeparator };\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"select-NySY9Men.cjs","names":["React","SelectPrimitive","cn","buttonVariants","fieldTriggerWidthStyle","controlTriggerOpenState","fieldTriggerErrorBorder","keepOwnAccessibleName","ChevronDown","transitions","FLOATING_POSITION_METHOD","usePortalContainer","menuPositionerClass","menuPopupClass","menuScrollPopupClass","MenuScrollArea","menuItemClass","menuItemCheckClass","Check","menuSeparatorClass"],"sources":["../src/ds/components/Select/select.tsx"],"sourcesContent":["import { Select as SelectPrimitive } from '@base-ui/react/select';\nimport type { SelectPopupProps, SelectPositionerProps } from '@base-ui/react/select';\nimport { Check, ChevronDown } from 'lucide-react';\nimport * as React from 'react';\n\nimport { buttonVariants } from '../Button/Button';\nimport type { TextButtonSize } from '../Button/Button';\nimport { keepOwnAccessibleName } from '@/ds/components/Field/field-control-aria';\nimport { controlTriggerOpenState } from '@/ds/primitives/control-size';\nimport { FLOATING_POSITION_METHOD } from '@/ds/primitives/floating';\nimport { fieldTriggerErrorBorder, fieldTriggerStyle, fieldTriggerWidthStyle } from '@/ds/primitives/form-element';\nimport {\n menuItemCheckClass,\n menuItemClass,\n menuPopupClass,\n menuPositionerClass,\n menuSeparatorClass,\n} from '@/ds/primitives/menu-item';\nimport { menuScrollPopupClass, MenuScrollArea } from '@/ds/primitives/menu-scroll-area';\nimport { usePortalContainer } from '@/ds/primitives/portal-container';\nimport { transitions } from '@/ds/primitives/transitions';\nimport { cn } from '@/lib/utils';\n\n/**\n * Select migrated from `@radix-ui/react-select` to Base UI (`@base-ui/react/select`).\n *\n * The public API (`Select`, `SelectGroup`, `SelectValue`, `SelectTrigger`,\n * `SelectContent`, `SelectItem`) is intentionally kept stable so existing\n * consumers do not need changes.\n *\n * Notable behavioral differences vs. Radix that consumers should be aware of:\n * - `onValueChange` now receives a second `eventDetails` argument. Existing\n * handlers typed as `(value: string) => void` keep working (extra arg ignored).\n * - The dropdown no longer overlaps the trigger by default\n * (`alignItemWithTrigger={false}`), matching the previous Radix `popper`\n * positioning behavior.\n *\n * Implementation note: unlike Radix, Base UI's `Select.Value` can only resolve\n * a selected value to its label once the popup has mounted (it reads labels\n * from rendered items). To preserve the Radix behavior where the trigger shows\n * the selected label even while closed, `Select` auto-derives an `items` map\n * from the `SelectItem`s declared inside `SelectContent` and passes it to\n * `Select.Root`. Consumers can still pass an explicit `items` prop to override.\n */\ntype SelectItemNode = React.ReactElement<{ value: unknown; children?: React.ReactNode }>;\n\nfunction isSelectItem(node: React.ReactNode): node is SelectItemNode {\n return React.isValidElement(node) && (node.type as { displayName?: string })?.displayName === 'SelectItem';\n}\n\n/** Recursively collect `{ value, label }` pairs from declared `SelectItem`s. */\nfunction collectItems(children: React.ReactNode, acc: Array<{ value: unknown; label: React.ReactNode }>): void {\n React.Children.forEach(children, child => {\n if (!React.isValidElement(child)) return;\n if (isSelectItem(child)) {\n acc.push({ value: child.props.value, label: child.props.children });\n return;\n }\n const nested = (child.props as { children?: React.ReactNode })?.children;\n if (nested != null) collectItems(nested, acc);\n });\n}\n\ntype SelectRootProps<Value> = SelectPrimitive.Root.Props<Value>;\ntype SelectChangeDetails = Parameters<NonNullable<SelectRootProps<unknown>['onValueChange']>>[1];\n\n/**\n * `onValueChange` is intentionally narrowed to a non-null value: these selects\n * always hold a value once changed, which keeps existing `(value) => void`\n * consumer handlers valid (Base UI's own callback type is `Value | null`).\n */\ntype SelectProps<Value = string> = Omit<SelectRootProps<Value>, 'onValueChange'> & {\n onValueChange?: (value: Value, eventDetails: SelectChangeDetails) => void;\n};\n\nfunction Select<Value = string>({ children, items, onValueChange, ...props }: SelectProps<Value>) {\n const derivedItems = React.useMemo(() => {\n if (items != null) return items;\n const acc: Array<{ value: unknown; label: React.ReactNode }> = [];\n collectItems(children, acc);\n return acc.length > 0 ? acc : undefined;\n }, [items, children]);\n\n return (\n <SelectPrimitive.Root\n items={derivedItems}\n onValueChange={onValueChange ? (value, eventDetails) => onValueChange(value as Value, eventDetails) : undefined}\n {...props}\n >\n {children}\n </SelectPrimitive.Root>\n );\n}\nSelect.displayName = 'Select';\n\nconst SelectGroup = SelectPrimitive.Group;\n\nexport type SelectValueProps = Omit<SelectPrimitive.Value.Props, 'className'> & {\n className?: string;\n};\n\n/**\n * Displays the selected value. Radix's `Select.Value` took a `placeholder`\n * prop and rendered the selected item's text automatically; Base UI's\n * `Select.Value` behaves the same way (renders the value, falls back to\n * `placeholder` when nothing is selected), so this is a thin passthrough.\n */\nconst SelectValue = React.forwardRef<HTMLSpanElement, SelectValueProps>(({ className, ...props }, ref) => (\n <SelectPrimitive.Value ref={ref} className={cn('truncate', className)} {...props} />\n));\nSelectValue.displayName = 'SelectValue';\n\n/**\n * A select is a form field, so it reuses the Button's size/shape recipe with\n * these looks: `default` (the Input's overlay surface — the default here too,\n * so a select sits next to an Input as the same kind of thing) and `ghost`\n * (borderless, for dense toolbars/inline pickers). The high-emphasis `primary` look is the only one intentionally NOT\n * offered (a field is not a call-to-action).\n */\nexport type SelectTriggerVariant = 'default' | 'ghost';\ntype SelectTriggerLegacyVariant = 'primary';\n\nexport type SelectTriggerProps = Omit<SelectPrimitive.Trigger.Props, 'className'> & {\n className?: string;\n size?: TextButtonSize;\n variant?: SelectTriggerVariant | SelectTriggerLegacyVariant;\n};\n\nfunction normalizeSelectTriggerVariant(\n variant: SelectTriggerVariant | SelectTriggerLegacyVariant,\n): SelectTriggerVariant {\n return variant === 'primary' ? 'default' : variant;\n}\n\nconst SelectTrigger = React.forwardRef<HTMLButtonElement, SelectTriggerProps>(\n ({ className, children, size = 'md', variant = 'default', ...props }, ref) => {\n const visualVariant = normalizeSelectTriggerVariant(variant);\n\n return (\n <SelectPrimitive.Trigger\n ref={ref}\n data-slot=\"select-trigger\"\n // A select = a button + a trailing chevron: reuse the Button recipe\n // (variant colors, size = height/text/padding/radius, unified border\n // focus, disabled) and layer only the select-specific extras.\n className={cn(\n buttonVariants({ variant: visualVariant, size }),\n visualVariant === 'default' && fieldTriggerStyle,\n // Fill the field and push the value left / chevron right (Button's\n // base centers its content with `justify-center`).\n fieldTriggerWidthStyle,\n 'justify-between',\n // Read as \"active\" while the menu is open, per variant (see map above).\n controlTriggerOpenState[visualVariant],\n 'data-[placeholder]:text-muted-foreground',\n fieldTriggerErrorBorder,\n '[&>span]:truncate',\n className,\n )}\n {...props}\n {...keepOwnAccessibleName(props)}\n >\n {children}\n {/* `SelectPrimitive.Icon` renders the provided element in place of its\n default `<span>`, so the chevron would land as a *direct* `<svg>`\n child of the trigger — where Button's `TEXT_MODE_ADORNMENTS`\n `[&>svg]` rules (negative `mx`, forced 50% opacity, 1.1em sizing)\n would distort and mis-position it. Wrapping it in a `<span>` keeps\n the svg one level deep so those rules can't reach it, leaving the\n chevron pinned at the right edge at its intended size and color. */}\n <SelectPrimitive.Icon\n render={\n <span className=\"flex shrink-0 items-center\">\n <ChevronDown className={cn('size-4 text-muted-foreground', transitions.colors)} />\n </span>\n }\n />\n </SelectPrimitive.Trigger>\n );\n },\n);\nSelectTrigger.displayName = 'SelectTrigger';\n\ntype SelectContentPositionerProps = Omit<SelectPositionerProps, keyof SelectPopupProps>;\n\nexport type SelectContentProps = Omit<SelectPopupProps, 'className'> &\n SelectContentPositionerProps & {\n className?: string;\n /**\n * Kept for API compatibility with the previous Radix API. Radix supported\n * `position=\"popper\" | \"item-aligned\"`; Base UI always uses popper-style\n * positioning so this prop is accepted but has no effect.\n */\n position?: 'popper' | 'item-aligned';\n /** Optional portal container, forwarded to `Select.Portal`. */\n container?: HTMLElement | null;\n };\n\nconst SelectContent = React.forwardRef<HTMLDivElement, SelectContentProps>(\n (\n {\n className,\n children,\n position: _position,\n container,\n side = 'bottom',\n align = 'start',\n sideOffset = 4,\n alignItemWithTrigger = false,\n anchor,\n positionMethod = FLOATING_POSITION_METHOD,\n alignOffset,\n collisionBoundary,\n collisionPadding,\n sticky,\n arrowPadding,\n disableAnchorTracking,\n collisionAvoidance,\n ...props\n },\n ref,\n ) => {\n // Default to the nearest SideDialog/Drawer popup so the dropdown stays\n // interactive inside a modal drawer; an explicit `container` still wins.\n const resolvedContainer = usePortalContainer(container);\n const positionerProps: SelectContentPositionerProps = {\n side,\n align,\n sideOffset,\n alignItemWithTrigger,\n anchor,\n positionMethod,\n alignOffset,\n collisionBoundary,\n collisionPadding,\n sticky,\n arrowPadding,\n disableAnchorTracking,\n collisionAvoidance,\n };\n\n return (\n <SelectPrimitive.Portal container={resolvedContainer}>\n <SelectPrimitive.Positioner className={menuPositionerClass} {...positionerProps}>\n <SelectPrimitive.Popup ref={ref} className={cn(menuPopupClass, menuScrollPopupClass, className)} {...props}>\n {/* The viewport is Select's list, so Select scrolls it to line the selected item up with the\n trigger. `role` is restated because the viewport's own `presentation` role would win. */}\n <MenuScrollArea viewportRender={<SelectPrimitive.List role=\"listbox\" />}>{children}</MenuScrollArea>\n </SelectPrimitive.Popup>\n </SelectPrimitive.Positioner>\n </SelectPrimitive.Portal>\n );\n },\n);\nSelectContent.displayName = 'SelectContent';\n\nexport type SelectItemProps = Omit<SelectPrimitive.Item.Props, 'className'> & {\n className?: string;\n};\n\nconst SelectItem = React.forwardRef<HTMLDivElement, SelectItemProps>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Item ref={ref} className={cn(menuItemClass, className)} {...props}>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n <SelectPrimitive.ItemIndicator className={menuItemCheckClass}>\n <Check />\n </SelectPrimitive.ItemIndicator>\n </SelectPrimitive.Item>\n));\nSelectItem.displayName = 'SelectItem';\n\nexport type SelectSeparatorProps = Omit<SelectPrimitive.Separator.Props, 'className'> & {\n className?: string;\n};\n\nconst SelectSeparator = React.forwardRef<HTMLDivElement, SelectSeparatorProps>(({ className, ...props }, ref) => (\n <SelectPrimitive.Separator\n ref={ref}\n data-slot=\"select-separator\"\n className={cn(menuSeparatorClass, className)}\n {...props}\n />\n));\nSelectSeparator.displayName = 'SelectSeparator';\n\nexport { Select, SelectGroup, SelectValue, SelectTrigger, SelectContent, SelectItem, SelectSeparator };\n"],"mappings":";;;;;;;;;;;;;;;;;AA8CA,SAAS,aAAa,MAA+C;CACnE,OAAOA,MAAM,eAAe,IAAI,KAAM,KAAK,MAAmC,gBAAgB;AAChG;;AAGA,SAAS,aAAa,UAA2B,KAA8D;CAC7G,MAAM,SAAS,QAAQ,WAAU,UAAS;EACxC,IAAI,CAACA,MAAM,eAAe,KAAK,GAAG;EAClC,IAAI,aAAa,KAAK,GAAG;GACvB,IAAI,KAAK;IAAE,OAAO,MAAM,MAAM;IAAO,OAAO,MAAM,MAAM;GAAS,CAAC;GAClE;EACF;EACA,MAAM,SAAU,MAAM,OAA0C;EAChE,IAAI,UAAU,MAAM,aAAa,QAAQ,GAAG;CAC9C,CAAC;AACH;AAcA,SAAS,OAAuB,EAAE,UAAU,OAAO,eAAe,GAAG,SAA6B;CAChG,MAAM,eAAeA,MAAM,cAAc;EACvC,IAAI,SAAS,MAAM,OAAO;EAC1B,MAAM,MAAyD,CAAC;EAChE,aAAa,UAAU,GAAG;EAC1B,OAAO,IAAI,SAAS,IAAI,MAAM,KAAA;CAChC,GAAG,CAAC,OAAO,QAAQ,CAAC;CAEpB,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,sBAAAA,OAAgB,MAAjB;EACE,OAAO;EACP,eAAe,iBAAiB,OAAO,iBAAiB,cAAc,OAAgB,YAAY,IAAI,KAAA;EACtG,GAAI;EAEH;CACmB,CAAA;AAE1B;AACA,OAAO,cAAc;AAErB,IAAM,cAAcA,sBAAAA,OAAgB;;;;;;;AAYpC,IAAM,cAAcD,MAAM,YAA+C,EAAE,WAAW,GAAG,SAAS,QAChG,iBAAA,GAAA,kBAAA,IAAA,CAACC,sBAAAA,OAAgB,OAAjB;CAA4B;CAAK,WAAWC,cAAAA,GAAG,YAAY,SAAS;CAAG,GAAI;AAAQ,CAAA,CACpF;AACD,YAAY,cAAc;AAkB1B,SAAS,8BACP,SACsB;CACtB,OAAO,YAAY,YAAY,YAAY;AAC7C;AAEA,IAAM,gBAAgBF,MAAM,YACzB,EAAE,WAAW,UAAU,OAAO,MAAM,UAAU,WAAW,GAAG,SAAS,QAAQ;CAC5E,MAAM,gBAAgB,8BAA8B,OAAO;CAE3D,OACE,iBAAA,GAAA,kBAAA,KAAA,CAACC,sBAAAA,OAAgB,SAAjB;EACO;EACL,aAAU;EAIV,WAAWC,cAAAA,GACTC,eAAAA,eAAe;GAAE,SAAS;GAAe;EAAK,CAAC,GAC/C,kBAAkB,aAAA,8TAGlBC,gCAAAA,wBACA,mBAEAC,gCAAAA,wBAAwB,gBACxB,4CACAC,gCAAAA,yBACA,qBACA,SACF;EACA,GAAI;EACJ,GAAIC,2BAAAA,sBAAsB,KAAK;EArBjC,UAAA,CAuBG,UAQD,iBAAA,GAAA,kBAAA,IAAA,CAACN,sBAAAA,OAAgB,MAAjB,EACE,QACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;GAAM,WAAU;GACd,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACO,aAAAA,aAAD,EAAa,WAAWN,cAAAA,GAAG,gCAAgCO,+BAAAA,YAAY,MAAM,EAAI,CAAA;EAC7E,CAAA,EAET,CAAA,CACsB;;AAE7B,CACF;AACA,cAAc,cAAc;AAiB5B,IAAM,gBAAgBT,MAAM,YAExB,EACE,WACA,UACA,UAAU,WACV,WACA,OAAO,UACP,QAAQ,SACR,aAAa,GACb,uBAAuB,OACvB,QACA,iBAAiBU,4BAAAA,0BACjB,aACA,mBACA,kBACA,QACA,cACA,uBACA,oBACA,GAAG,SAEL,QACG;CAGH,MAAM,oBAAoBC,oCAAAA,mBAAmB,SAAS;CACtD,MAAM,kBAAgD;EACpD;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CAEA,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACV,sBAAAA,OAAgB,QAAjB;EAAwB,WAAW;EACjC,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACA,sBAAAA,OAAgB,YAAjB;GAA4B,WAAWW,6BAAAA;GAAqB,GAAI;GAC9D,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACX,sBAAAA,OAAgB,OAAjB;IAA4B;IAAK,WAAWC,cAAAA,GAAGW,6BAAAA,gBAAgBC,oCAAAA,sBAAsB,SAAS;IAAG,GAAI;IAGnG,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACC,oCAAAA,gBAAD;KAAgB,gBAAgB,iBAAA,GAAA,kBAAA,IAAA,CAACd,sBAAAA,OAAgB,MAAjB,EAAsB,MAAK,UAAW,CAAA;KAAI;IAAyB,CAAA;GAC9E,CAAA;EACG,CAAA;CACN,CAAA;AAE5B,CACF;AACA,cAAc,cAAc;AAM5B,IAAM,aAAaD,MAAM,YAA6C,EAAE,WAAW,UAAU,GAAG,SAAS,QACvG,iBAAA,GAAA,kBAAA,KAAA,CAACC,sBAAAA,OAAgB,MAAjB;CAA2B;CAAK,WAAWC,cAAAA,GAAGc,6BAAAA,eAAe,SAAS;CAAG,GAAI;CAA7E,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAACf,sBAAAA,OAAgB,UAAjB,EAA2B,SAAmC,CAAA,GAC9D,iBAAA,GAAA,kBAAA,IAAA,CAACA,sBAAAA,OAAgB,eAAjB;EAA+B,WAAWgB,6BAAAA;EACxC,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACC,aAAAA,OAAD,CAAQ,CAAA;CACqB,CAAA,CACX;AACvB,CAAA,CAAA;AACD,WAAW,cAAc;AAMzB,IAAM,kBAAkBlB,MAAM,YAAkD,EAAE,WAAW,GAAG,SAAS,QACvG,iBAAA,GAAA,kBAAA,IAAA,CAACC,sBAAAA,OAAgB,WAAjB;CACO;CACL,aAAU;CACV,WAAWC,cAAAA,GAAGiB,6BAAAA,oBAAoB,SAAS;CAC3C,GAAI;AACL,CAAA,CACF;AACD,gBAAgB,cAAc"}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import type { DateRangePreset, DateTimeRangePickerProps } from '../../../ds/components/DateTimeRangePicker';
|
|
2
|
-
import type { FilterBarField, FilterBarItem } from '../../../ds/components/FilterBar/types';
|
|
3
|
-
export declare const TRACE_TIME_RANGE_FIELD_ID = "timeRange";
|
|
4
|
-
/**
|
|
5
|
-
* Synthetic FilterBar field backing the always-present time-range chip. Hidden from the
|
|
6
|
-
* input's field step (the chip cannot be added twice) but registered so the chip resolves
|
|
7
|
-
* its label and takes part in keyboard navigation.
|
|
8
|
-
*/
|
|
9
|
-
export declare const TRACE_TIME_RANGE_FIELD: FilterBarField;
|
|
10
|
-
export declare const TRACE_TIME_RANGE_ITEM: FilterBarItem;
|
|
11
|
-
export type TraceTimeRangeChipProps = Pick<DateTimeRangePickerProps, 'preset' | 'onPresetChange' | 'dateFrom' | 'dateTo' | 'onDateChange' | 'onDateRangeChange' | 'disabled' | 'maxRangeMs' | 'minDate' | 'presets'> & {
|
|
12
|
-
/** Shows a × that switches back to this preset whenever another range is selected. */
|
|
13
|
-
defaultPreset?: DateRangePreset;
|
|
14
|
-
/** Replaces what the × does, e.g. to undo a histogram zoom before falling back to `defaultPreset`. */
|
|
15
|
-
onReset?: () => void;
|
|
16
|
-
};
|
|
17
|
-
/**
|
|
18
|
-
* The trace list's date range rendered as a FilterBar chip: `Time <preset>`. Always
|
|
19
|
-
* present and non-removable; the value segment opens the regular DateTimeRangePicker
|
|
20
|
-
* menu/popover. With `defaultPreset`, a trailing × resets the range to it.
|
|
21
|
-
*/
|
|
22
|
-
export declare function TraceTimeRangeChip({ defaultPreset, onReset, ...props }: TraceTimeRangeChipProps): import("react").JSX.Element;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"trace-filters-BJaebsxJ.js","names":[],"sources":["../src/domains/traces/trace-query-filters.ts","../src/domains/traces/trace-filters.ts"],"sourcesContent":["import type { QueryTracesInput } from '@mastra/client-js';\nimport type { TraceQueryPredicate, TraceQueryScalarPredicate } from '@mastra/core/storage';\nimport { isLegacyAnyValue } from './trace-filters';\nimport type { buildTraceListFilters, TraceStatusFilter } from './trace-filters';\nimport type { PropertyFilterToken } from '@/ds/components/PropertyFilter/types';\n\nexport const TRACE_QUERY_UNSUPPORTED_FILTER_FIELDS = new Set([\n 'runId',\n 'sessionId',\n 'requestId',\n 'userId',\n 'organizationId',\n 'serviceName',\n 'experimentId',\n]);\n\nexport const TRACE_FILTER_OPERATOR_IDS = [\n 'is',\n 'isNot',\n 'in',\n 'notIn',\n 'exists',\n 'notExists',\n 'gt',\n 'gte',\n 'lt',\n 'lte',\n 'matches',\n 'notMatches',\n] as const;\nexport type TraceFilterOperatorId = (typeof TRACE_FILTER_OPERATOR_IDS)[number];\n\nexport const isTraceFilterOperatorId = (value: string): value is TraceFilterOperatorId =>\n (TRACE_FILTER_OPERATOR_IDS as readonly string[]).includes(value);\n\n/** A trace filter chip: `operatorId` defaults to `is` (equality / set membership). */\nexport type TraceFilterToken = PropertyFilterToken & {\n operatorId?: TraceFilterOperatorId;\n /** Only set for tokens inside a group: a group may hold several tokens on the same field. */\n id?: string;\n};\n\nexport type TraceFilterLogic = 'and' | 'or';\n\n/** An advanced filter: a nested boolean combination of tokens. */\nexport type TraceFilterGroup = { id: string; logic: TraceFilterLogic; nodes: TraceFilterNode[] };\nexport type TraceFilterNode = TraceFilterToken | TraceFilterGroup;\n\nexport const isTraceFilterGroup = (node: TraceFilterNode): node is TraceFilterGroup => 'nodes' in node;\n\nconst TRACE_FILTER_OPERATOR_TO_QUERY_OP = {\n is: 'eq',\n isNot: 'ne',\n in: 'in',\n notIn: 'notIn',\n exists: 'exists',\n notExists: 'notExists',\n gt: 'gt',\n gte: 'gte',\n lt: 'lt',\n lte: 'lte',\n matches: 'matches',\n notMatches: 'notMatches',\n} as const satisfies Record<TraceFilterOperatorId, TraceQueryScalarPredicate['op']>;\n\n/** Fields whose values must be sent as numbers. Non-numeric input is dropped. */\nexport const TRACE_QUERY_NUMERIC_FIELD_IDS = new Set([\n 'durationMs',\n 'timeToFirstChunkMs',\n 'timeToFirstTokenMs',\n 'spans.durationMs',\n 'spans.timeToFirstChunkMs',\n 'spans.timeToFirstTokenMs',\n 'scores.score',\n 'feedback.value',\n]);\n\nconst TRACE_QUERY_TRACE_FIELD_IDS = new Set([\n 'entityType',\n 'status',\n 'entityName',\n 'environment',\n 'traceId',\n 'threadId',\n 'resourceId',\n 'durationMs',\n 'timeToFirstChunkMs',\n 'timeToFirstTokenMs',\n 'outcome',\n 'stopReason',\n]);\n\n/** Trace-level fields that may be unset. \"is not X\" on these must also keep traces\n * where the field is missing, so the predicate is `or[ne, notExists]`. */\nexport const TRACE_QUERY_OPTIONAL_TRACE_FIELD_IDS = new Set([\n 'threadId',\n 'resourceId',\n 'environment',\n 'durationMs',\n 'timeToFirstChunkMs',\n 'timeToFirstTokenMs',\n 'outcome',\n 'stopReason',\n]);\n\n/** Negative operators are expressed as `none(<positive>)` on related collections. */\nconst NEGATIVE_TO_POSITIVE = {\n isNot: 'is',\n notIn: 'in',\n notExists: 'exists',\n notMatches: 'matches',\n} as const satisfies Partial<Record<TraceFilterOperatorId, TraceFilterOperatorId>>;\ntype NegativeOperatorId = keyof typeof NEGATIVE_TO_POSITIVE;\nconst isNegativeOperator = (op: TraceFilterOperatorId): op is NegativeOperatorId => op in NEGATIVE_TO_POSITIVE;\n\nconst TRACE_QUERY_RELATED_SCOPES = ['spans', 'scores', 'feedback'] as const;\nexport type TraceQueryRelatedScope = (typeof TRACE_QUERY_RELATED_SCOPES)[number];\n\n/** Split a field id into its related scope (`spans.` / `scores.` / `feedback.`) and\n * the path inside that scope. Trace-level fields have no scope. `entityId` is the\n * legacy id for `spans.entityId`. */\nfunction resolveTraceQueryPath(fieldId: string): { scope?: TraceQueryRelatedScope; path: string } {\n if (fieldId === 'entityId') return { scope: 'spans', path: 'entityId' };\n for (const scope of TRACE_QUERY_RELATED_SCOPES) {\n if (fieldId.startsWith(`${scope}.`) && fieldId.length > scope.length + 1) {\n return { scope, path: fieldId.slice(scope.length + 1) };\n }\n }\n return { path: fieldId };\n}\n\nexport function scalarPredicate(\n op: TraceFilterOperatorId,\n path: string,\n values: (string | number)[],\n): TraceQueryScalarPredicate | undefined {\n const queryOp = TRACE_FILTER_OPERATOR_TO_QUERY_OP[op];\n switch (queryOp) {\n case 'exists':\n case 'notExists':\n return { op: queryOp, path };\n case 'in':\n case 'notIn':\n return values.length ? { op: queryOp, value: { path }, set: values } : undefined;\n case 'matches':\n case 'notMatches': {\n const [literal] = values;\n return typeof literal === 'string' ? { op: queryOp, left: { path }, right: { literal } } : undefined;\n }\n default: {\n if (!values.length) return undefined;\n // `is` with several values is set membership; `isNot` with several is exclusion.\n if (values.length > 1) {\n if (queryOp === 'eq') return { op: 'in', value: { path }, set: values };\n if (queryOp === 'ne') return { op: 'notIn', value: { path }, set: values };\n }\n const [literal] = values;\n return literal === undefined ? undefined : { op: queryOp, left: { path }, right: { literal } };\n }\n }\n}\n\ntype TokenPredicate =\n | { predicate: TraceQueryPredicate }\n /** A positive predicate on a related row; the caller decides how to wrap it in `some`. */\n | { scope: TraceQueryRelatedScope; predicate: TraceQueryScalarPredicate };\n\n/** `tags` is a string array: membership is `includes` per tag; \"in\" any of\n * several tags is an `or`, \"not in\" all of them is an `and`. `notIncludes`\n * does not match traces without tags, so exclusion also keeps untagged traces. */\nfunction tagsPredicate(operatorId: TraceFilterOperatorId, tags: string[]): TraceQueryPredicate | undefined {\n if (operatorId === 'exists' || operatorId === 'notExists') return { op: operatorId, path: 'tags' };\n const negative = operatorId === 'notIn' || operatorId === 'isNot';\n const args: TraceQueryPredicate[] = tags.map(value => ({\n op: negative ? 'notIncludes' : 'includes',\n path: 'tags',\n value,\n }));\n const combined = args.length <= 1 ? args[0] : { op: negative ? ('and' as const) : ('or' as const), args };\n if (!combined || !negative) return combined;\n return { op: 'or', args: [combined, { op: 'notExists', path: 'tags' }] };\n}\n\n/** Fields the query API can only test for presence; any other operator is rejected with a 422. */\nconst TRACE_QUERY_PRESENCE_ONLY_FIELD_IDS = new Set<string>(['spans.error']);\n\nfunction tokenToTraceQueryPredicate(\n token: TraceFilterToken,\n excludedFieldIds: ReadonlySet<string>,\n): TokenPredicate | undefined {\n if (TRACE_QUERY_UNSUPPORTED_FILTER_FIELDS.has(token.fieldId) || excludedFieldIds.has(token.fieldId)) return undefined;\n const operatorId = token.operatorId ?? (token.fieldId === 'tags' ? 'in' : 'is');\n const isPresence = operatorId === 'exists' || operatorId === 'notExists';\n // Hand-edited URLs can pair these fields with value operators; drop them rather than fail the page.\n if (TRACE_QUERY_PRESENCE_ONLY_FIELD_IDS.has(token.fieldId) && !isPresence) return undefined;\n\n const rawValues = (Array.isArray(token.value) ? token.value : [token.value]).filter(\n (value): value is string =>\n typeof value === 'string' && Boolean(value.trim()) && !isLegacyAnyValue(value, operatorId),\n );\n if (!rawValues.length && !isPresence) return undefined;\n\n if (token.fieldId === 'tags') {\n const predicate = tagsPredicate(operatorId, rawValues);\n return predicate ? { predicate } : undefined;\n }\n\n let fieldId = token.fieldId;\n let values: (string | number)[] = rawValues;\n // Discovered metadata fields: the field id is already the predicate path (`metadata.<key>`).\n if (fieldId.startsWith('metadata.')) {\n if (fieldId.length === 'metadata.'.length) return undefined;\n } else if (fieldId === 'rootEntityType' || fieldId === 'entityType') {\n fieldId = 'entityType';\n } else if (fieldId === 'status') {\n values = rawValues.filter(value => value !== 'running');\n if (!values.length && !isPresence) return undefined;\n } else if (TRACE_QUERY_NUMERIC_FIELD_IDS.has(fieldId)) {\n values = rawValues.map(Number).filter(value => !Number.isNaN(value));\n if (!values.length && !isPresence) return undefined;\n }\n if (operatorId === 'matches' || operatorId === 'notMatches') {\n // The query rejects a text literal with no letters or digits; drop it like non-numeric input.\n values = values.filter(value => /[\\p{L}\\p{M}\\p{N}]/u.test(String(value)));\n if (!values.length) return undefined;\n }\n\n const { scope, path } = resolveTraceQueryPath(fieldId);\n const isMetadata = fieldId.startsWith('metadata.');\n if (!scope && !isMetadata && !TRACE_QUERY_TRACE_FIELD_IDS.has(fieldId)) return undefined;\n\n if (scope && isNegativeOperator(operatorId)) {\n // `some(model ne X)` matches any trace with one span that differs; the user\n // means \"no span with model X\", which is `none(model eq X)`.\n const positive = scalarPredicate(NEGATIVE_TO_POSITIVE[operatorId], path, values);\n return positive ? { predicate: { [scope]: { none: positive } } as TraceQueryPredicate } : undefined;\n }\n\n const predicate = scalarPredicate(operatorId, path, values);\n if (!predicate) return undefined;\n if (scope) return { scope, predicate };\n if (\n (operatorId === 'isNot' || operatorId === 'notIn') &&\n (isMetadata || TRACE_QUERY_OPTIONAL_TRACE_FIELD_IDS.has(fieldId))\n ) {\n return { predicate: { op: 'or', args: [predicate, { op: 'notExists', path }] } };\n }\n return { predicate };\n}\n\n/** Convert tokens to predicates. With `mergeRelated`, tokens on the same related\n * collection must match the same row (e.g. scorer X AND score < 0.6), so they are\n * merged into a single `some`. Inside an `or` group each token stands alone. */\nfunction predicatesForTokens(\n tokens: TraceFilterToken[],\n { mergeRelated, excludedFieldIds }: { mergeRelated: boolean; excludedFieldIds: ReadonlySet<string> },\n) {\n const args: TraceQueryPredicate[] = [];\n const related: Record<TraceQueryRelatedScope, TraceQueryScalarPredicate[]> = { spans: [], scores: [], feedback: [] };\n\n for (const token of tokens) {\n const result = tokenToTraceQueryPredicate(token, excludedFieldIds);\n if (!result) continue;\n if (!('scope' in result)) {\n args.push(result.predicate);\n } else if (mergeRelated) {\n related[result.scope].push(result.predicate);\n } else {\n args.push({ [result.scope]: { some: result.predicate } } as TraceQueryPredicate);\n }\n }\n\n for (const scope of TRACE_QUERY_RELATED_SCOPES) {\n const [first, ...rest] = related[scope];\n if (!first) continue;\n const some = rest.length ? { op: 'and' as const, args: [first, ...rest] } : first;\n args.push({ [scope]: { some } } as TraceQueryPredicate);\n }\n\n return args;\n}\n\nfunction groupToTraceQueryPredicate(\n group: TraceFilterGroup,\n excludedFieldIds: ReadonlySet<string>,\n): TraceQueryPredicate | undefined {\n const tokens = group.nodes.filter((node): node is TraceFilterToken => !isTraceFilterGroup(node));\n const args = predicatesForTokens(tokens, { mergeRelated: group.logic === 'and', excludedFieldIds });\n for (const node of group.nodes) {\n if (!isTraceFilterGroup(node)) continue;\n const predicate = groupToTraceQueryPredicate(node, excludedFieldIds);\n if (predicate) args.push(predicate);\n }\n if (args.length === 0) return undefined;\n return args.length === 1 ? args[0] : { op: group.logic, args };\n}\n\nexport function buildTraceQueryRequest({\n rootEntityType,\n status,\n dateFrom,\n dateTo,\n tokens,\n groups = [],\n excludedFieldIds = new Set(),\n now,\n}: Omit<Parameters<typeof buildTraceListFilters>[0], 'tokens' | 'status'> & {\n status?: TraceStatusFilter;\n tokens: TraceFilterToken[];\n groups?: TraceFilterGroup[];\n /** Fields the server cannot query (e.g. `durationMs` without `traceQueryRootDuration`); dropped from tokens and groups. */\n excludedFieldIds?: ReadonlySet<string>;\n now: Date;\n}): Pick<QueryTracesInput, 'timeRange' | 'where'> {\n const args: TraceQueryPredicate[] = [];\n\n if (rootEntityType) args.push({ op: 'eq', left: { path: 'entityType' }, right: { literal: rootEntityType } });\n if (status && status !== 'running') args.push({ op: 'eq', left: { path: 'status' }, right: { literal: status } });\n\n args.push(...predicatesForTokens(tokens, { mergeRelated: true, excludedFieldIds }));\n\n for (const group of groups) {\n const predicate = groupToTraceQueryPredicate(group, excludedFieldIds);\n if (predicate) args.push(predicate);\n }\n\n return {\n timeRange: resolveTraceQueryTimeRange(dateFrom, dateTo, now),\n ...(args.length ? { where: { op: 'and' as const, args } } : {}),\n };\n}\n\n/** The query window for a date range: open ends fall back to the last seven days up to `now`. */\nexport function resolveTraceQueryTimeRange(\n dateFrom: Date | undefined,\n dateTo: Date | undefined,\n now: Date,\n): QueryTracesInput['timeRange'] {\n return {\n from: (dateFrom ?? new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000)).toISOString(),\n to: (dateTo ?? now).toISOString(),\n };\n}\n","import type { EntityType } from '@mastra/core/observability';\nimport type { ListTracesArgs } from '@mastra/core/storage';\nimport { ROOT_ENTITY_TYPES } from '@mastra/react/hooks/traces';\nimport type { TraceListMode, TraceMetadataFilterField } from '@mastra/react/hooks/traces';\nimport {\n ActivityIcon,\n BoxIcon,\n BracesIcon,\n BuildingIcon,\n ClockIcon,\n CloudIcon,\n CpuIcon,\n FingerprintIcon,\n FlagIcon,\n FlaskConicalIcon,\n GaugeIcon,\n GitBranchIcon,\n GlobeIcon,\n HashIcon,\n LayersIcon,\n MessageCircleIcon,\n MessageSquareIcon,\n OctagonIcon,\n PercentIcon,\n PlayIcon,\n RadioIcon,\n ServerIcon,\n ShapesIcon,\n StarIcon,\n TagIcon,\n TagsIcon,\n ThumbsUpIcon,\n TimerIcon,\n TriangleAlertIcon,\n UserIcon,\n WaypointsIcon,\n} from 'lucide-react';\nimport type { LucideIcon } from 'lucide-react';\nimport {\n isTraceFilterGroup,\n isTraceFilterOperatorId,\n TRACE_QUERY_NUMERIC_FIELD_IDS,\n TRACE_QUERY_UNSUPPORTED_FILTER_FIELDS,\n} from './trace-query-filters';\nimport type {\n TraceFilterGroup,\n TraceFilterNode,\n TraceFilterOperatorId,\n TraceFilterToken,\n TraceQueryRelatedScope,\n} from './trace-query-filters';\nimport type { TraceDatePreset } from './types';\nimport { isFilterBarGroup } from '@/ds/components/FilterBar/types';\nimport type {\n FilterBarExpression,\n FilterBarField,\n FilterBarGroup,\n FilterBarItem,\n FilterBarOperator,\n FilterBarSuggestionsResolver,\n} from '@/ds/components/FilterBar/types';\nimport type { PropertyFilterToken } from '@/ds/components/PropertyFilter/types';\n\nexport type {\n TraceFilterGroup,\n TraceFilterLogic,\n TraceFilterNode,\n TraceFilterOperatorId,\n TraceFilterToken,\n TraceQueryRelatedScope,\n} from './trace-query-filters';\nexport { isTraceFilterGroup } from './trace-query-filters';\n\ntype EntityTypeValue = `${EntityType}`;\n\nexport type EntityOptions = { label: string; entityType: EntityTypeValue };\n\nexport { ROOT_ENTITY_TYPES };\n\nexport const ROOT_ENTITY_TYPE_OPTIONS = [\n { label: 'Agent', entityType: ROOT_ENTITY_TYPES.AGENT },\n { label: 'Workflow', entityType: ROOT_ENTITY_TYPES.WORKFLOW },\n { label: 'Scorer', entityType: ROOT_ENTITY_TYPES.SCORER },\n { label: 'Ingest', entityType: ROOT_ENTITY_TYPES.INGEST },\n { label: 'Classifier', entityType: ROOT_ENTITY_TYPES.CLASSIFIER },\n] as const satisfies readonly EntityOptions[];\n\nexport type TraceStatusFilter = 'running' | 'success' | 'error';\n\nexport const TRACE_STATUS_OPTIONS = [\n { label: 'Running', value: 'running' },\n { label: 'Success', value: 'success' },\n { label: 'Error', value: 'error' },\n] as const satisfies readonly { label: string; value: TraceStatusFilter }[];\n\n/** Field ids for \"synthetic\" filter entries — they live in dedicated URL params\n * rather than the generic `filter*` set, but appear as rows in the Filter\n * popover so users can manage all filters from one place. */\nexport const TRACE_SYNTHETIC_FILTER_FIELD_IDS = ['rootEntityType', 'status'] as const;\n\n/** Discovered `metadata.<key>` fields are dynamic, so they use a prefix-based URL\n * scheme (`filterMetadata.<key>`) instead of the fixed `filter*` param map. */\nexport const TRACE_METADATA_FILTER_FIELD_PREFIX = 'metadata.';\nexport const TRACE_METADATA_FILTER_PARAM_PREFIX = 'filterMetadata.';\n\nexport const isTraceMetadataFieldId = (fieldId: string) =>\n fieldId.startsWith(TRACE_METADATA_FILTER_FIELD_PREFIX) && fieldId.length > TRACE_METADATA_FILTER_FIELD_PREFIX.length;\n\nconst isTraceMetadataParam = (param: string) =>\n param.startsWith(TRACE_METADATA_FILTER_PARAM_PREFIX) && param.length > TRACE_METADATA_FILTER_PARAM_PREFIX.length;\n\nexport const metadataFieldIdToParam = (fieldId: string) =>\n TRACE_METADATA_FILTER_PARAM_PREFIX + fieldId.slice(TRACE_METADATA_FILTER_FIELD_PREFIX.length);\n\nexport const metadataParamToFieldId = (param: string) =>\n TRACE_METADATA_FILTER_FIELD_PREFIX + param.slice(TRACE_METADATA_FILTER_PARAM_PREFIX.length);\n\nexport const TRACE_ROOT_ENTITY_TYPE_PARAM = 'rootEntityType';\nexport const TRACE_STATUS_PARAM = 'status';\n\n/** Synthetic fields keep their own URL param instead of a `filterX` one. */\nconst TRACE_SYNTHETIC_PARAM_BY_FIELD: Record<string, string> = {\n rootEntityType: TRACE_ROOT_ENTITY_TYPE_PARAM,\n status: TRACE_STATUS_PARAM,\n};\n\nexport const TRACE_LIST_MODE_PARAM = 'listMode';\n/** Branch-mode only: identifies the anchor span that defines the displayed subtree.\n * Stable across intra-panel span navigation (which only changes `spanId`). */\nexport const TRACE_ANCHOR_SPAN_ID_PARAM = 'anchorSpanId';\nexport const TRACE_LIST_MODE_VALUES = new Set(['traces', 'branches'] as const);\nexport type { TraceListMode };\n\nexport const TRACE_LIST_MODE_OPTIONS = [\n { label: 'Traces (default)', value: 'traces' },\n { label: 'Branches', value: 'branches' },\n] as const satisfies readonly { label: string; value: TraceListMode }[];\nexport const TRACE_DATE_PRESET_PARAM = 'datePreset';\nexport const TRACE_DATE_FROM_PARAM = 'dateFrom';\nexport const TRACE_DATE_TO_PARAM = 'dateTo';\n\nexport const TRACE_DATE_PRESET_VALUES = new Set<TraceDatePreset>([\n 'all',\n 'last-24h',\n 'last-3d',\n 'last-7d',\n 'last-14d',\n 'last-30d',\n 'custom',\n]);\n\nexport const TRACE_PROPERTY_FILTER_PARAM_BY_FIELD = {\n tags: 'filterTags',\n entityId: 'filterEntityId',\n entityName: 'filterEntityName',\n traceId: 'filterTraceId',\n durationMs: 'filterDurationMs',\n timeToFirstChunkMs: 'filterTimeToFirstChunkMs',\n timeToFirstTokenMs: 'filterTimeToFirstTokenMs',\n runId: 'filterRunId',\n threadId: 'filterThreadId',\n sessionId: 'filterSessionId',\n requestId: 'filterRequestId',\n resourceId: 'filterResourceId',\n userId: 'filterUserId',\n organizationId: 'filterOrganizationId',\n serviceName: 'filterServiceName',\n environment: 'filterEnvironment',\n experimentId: 'filterExperimentId',\n outcome: 'filterOutcome',\n stopReason: 'filterStopReason',\n 'spans.name': 'filterSpanName',\n 'spans.spanType': 'filterSpanType',\n 'spans.model': 'filterSpanModel',\n 'spans.provider': 'filterSpanProvider',\n 'spans.durationMs': 'filterSpanDurationMs',\n 'spans.timeToFirstChunkMs': 'filterSpanTimeToFirstChunkMs',\n 'spans.timeToFirstTokenMs': 'filterSpanTimeToFirstTokenMs',\n 'spans.error': 'filterSpanError',\n 'scores.scorerId': 'filterScorerId',\n 'scores.score': 'filterScore',\n 'feedback.feedbackType': 'filterFeedbackType',\n 'feedback.value': 'filterFeedbackValue',\n 'feedback.comment': 'filterFeedbackComment',\n} as const;\n\nexport const TRACE_PROPERTY_FILTER_FIELD_IDS = Object.keys(TRACE_PROPERTY_FILTER_PARAM_BY_FIELD) as Array<\n keyof typeof TRACE_PROPERTY_FILTER_PARAM_BY_FIELD\n>;\n\n/** The operator of a filter lives in a sibling `<valueParam>.op` param; omitted\n * means the default (`is`). Metadata keys cannot contain dots, so the suffix is\n * unambiguous. */\nexport const TRACE_FILTER_OPERATOR_PARAM_SUFFIX = '.op';\nexport const traceFilterOperatorParam = (valueParam: string) => valueParam + TRACE_FILTER_OPERATOR_PARAM_SUFFIX;\nconst isTraceFilterOperatorParam = (param: string) => param.endsWith(TRACE_FILTER_OPERATOR_PARAM_SUFFIX);\n\nconst isPresenceOperator = (operatorId: TraceFilterOperatorId | undefined) =>\n operatorId === 'exists' || operatorId === 'notExists';\nconst isManyOperator = (operatorId: TraceFilterOperatorId | undefined) => operatorId === 'in' || operatorId === 'notIn';\n\n/** Default operator for a token without one: arrays mean set membership. */\nexport const traceFilterTokenOperator = (token: TraceFilterToken): TraceFilterOperatorId =>\n token.operatorId ?? (Array.isArray(token.value) ? 'in' : 'is');\n\n/** The legacy pick-multi neutral value. A text-match literal `Any` is a real word, not the sentinel. */\nexport const isLegacyAnyValue = (value: unknown, operatorId: TraceFilterOperatorId): boolean =>\n value === 'Any' && operatorId !== 'matches' && operatorId !== 'notMatches';\n\nconst readTraceFilterOperator = (searchParams: URLSearchParams, valueParam: string) => {\n const raw = searchParams.get(traceFilterOperatorParam(valueParam));\n return raw !== null && isTraceFilterOperatorId(raw) ? raw : undefined;\n};\n\nexport const TRACE_STATUS_VALUES = new Set<TraceStatusFilter>(['running', 'success', 'error']);\n\nexport const DEFAULT_TRACE_FILTERS_STORAGE_KEY = 'mastra:traces:saved-filters';\n\n/** Serialize the filter-related URL params (relative date preset + rootEntityType +\n * status + generic filterX set) to localStorage so the user can restore them on next\n * visit. A `custom` absolute range is never saved: it would be stale by the next visit.\n * An empty set clears the key. Throws no errors — storage being unavailable is fine. */\nexport function saveTraceFiltersToStorage(\n params: URLSearchParams,\n storageKey: string = DEFAULT_TRACE_FILTERS_STORAGE_KEY,\n): void {\n const serialized = getPreservedTraceFilterParams(params);\n const preset = params.get(TRACE_DATE_PRESET_PARAM);\n if (preset && preset !== 'custom') serialized.set(TRACE_DATE_PRESET_PARAM, preset);\n // An empty group is editor state (popover still open), not a filter worth restoring.\n const groups = getTraceFilterGroups(serialized).filter(group => group.nodes.length > 0);\n serialized.delete(TRACE_FILTER_GROUP_PARAM);\n for (const group of groups) serialized.append(TRACE_FILTER_GROUP_PARAM, serializeTraceFilterGroup(group));\n\n if (!serialized.toString()) {\n clearSavedTraceFilters(storageKey);\n return;\n }\n\n try {\n localStorage.setItem(storageKey, serialized.toString());\n } catch {\n // localStorage may be unavailable (private mode / quota) — silently skip.\n }\n}\n\n/** Forget any previously saved filter set. Called from the \"Remove filters\"\n * action so the next plain sidebar nav lands on an empty page. */\nexport function clearSavedTraceFilters(storageKey: string = DEFAULT_TRACE_FILTERS_STORAGE_KEY): void {\n try {\n localStorage.removeItem(storageKey);\n } catch {\n // ignore — storage may be unavailable\n }\n}\n\n/** Read a previously saved filter set and return it as URLSearchParams, or\n * null if nothing is saved or storage is unavailable. */\nexport function loadTraceFiltersFromStorage(\n storageKey: string = DEFAULT_TRACE_FILTERS_STORAGE_KEY,\n): URLSearchParams | null {\n try {\n const raw = localStorage.getItem(storageKey);\n if (!raw) return null;\n const parsed = new URLSearchParams(raw);\n return parsed.toString() ? parsed : null;\n } catch {\n return null;\n }\n}\n\n/** True when `params` carries any filter-related key — used to decide whether\n * to hydrate from localStorage on page mount (we only hydrate when the URL is\n * filter-clean, i.e. the user landed here via a plain sidebar nav). */\nexport function hasAnyTraceFilterParams(params: URLSearchParams): boolean {\n if (params.has(TRACE_DATE_PRESET_PARAM)) return true;\n if (params.has(TRACE_DATE_FROM_PARAM)) return true;\n if (params.has(TRACE_DATE_TO_PARAM)) return true;\n if (params.has(TRACE_ROOT_ENTITY_TYPE_PARAM)) return true;\n if (params.has(TRACE_STATUS_PARAM)) return true;\n if (params.has(TRACE_LIST_MODE_PARAM)) return true;\n if (params.has(TRACE_FILTER_GROUP_PARAM)) return true;\n for (const fieldId of TRACE_PROPERTY_FILTER_FIELD_IDS) {\n if (params.has(TRACE_PROPERTY_FILTER_PARAM_BY_FIELD[fieldId])) return true;\n }\n for (const param of params.keys()) {\n if (isTraceMetadataParam(param)) return true;\n }\n return false;\n}\n\n/** Every operator the trace query API supports, keyed by the UI id that goes in the URL. */\nexport const TRACE_FILTER_BAR_OPERATORS: (FilterBarOperator & { id: TraceFilterOperatorId })[] = [\n { id: 'is', label: 'is', widensTo: 'in' },\n { id: 'isNot', label: 'is not', widensTo: 'notIn' },\n { id: 'in', label: 'is any of', arity: 'many' },\n { id: 'notIn', label: 'is none of', arity: 'many' },\n { id: 'exists', label: 'exists', arity: 'none' },\n { id: 'notExists', label: 'does not exist', arity: 'none' },\n { id: 'gt', label: 'greater than' },\n { id: 'gte', label: 'at least' },\n { id: 'lt', label: 'less than' },\n { id: 'lte', label: 'at most' },\n { id: 'matches', label: 'matches', freeText: true },\n { id: 'notMatches', label: 'does not match', freeText: true },\n];\n\nexport const TRACE_STRING_OPERATORS: TraceFilterOperatorId[] = ['is', 'isNot', 'in', 'notIn', 'exists', 'notExists'];\n/** Human-written text fields also support case-insensitive word matching. */\nexport const TRACE_TEXT_OPERATORS: TraceFilterOperatorId[] = [...TRACE_STRING_OPERATORS, 'matches', 'notMatches'];\n/** Fields every trace carries (`traceId`, `entityName`): presence operators would never be false. */\nexport const TRACE_REQUIRED_STRING_OPERATORS: TraceFilterOperatorId[] = ['is', 'isNot', 'in', 'notIn'];\nexport const TRACE_NUMBER_OPERATORS: TraceFilterOperatorId[] = [\n 'is',\n 'isNot',\n 'gt',\n 'gte',\n 'lt',\n 'lte',\n 'exists',\n 'notExists',\n];\n/** Root duration: only ranges make sense on a millisecond value. */\nconst TRACE_ROOT_DURATION_OPERATORS: TraceFilterOperatorId[] = ['gt', 'gte', 'lt', 'lte'];\nexport const TRACE_PRESENCE_OPERATORS: TraceFilterOperatorId[] = ['exists', 'notExists'];\nexport const TRACE_TAGS_OPERATORS: TraceFilterOperatorId[] = ['in', 'notIn', 'exists', 'notExists'];\nconst TRACE_TAGS_OPERATOR_TO_QUERY_OP: Partial<Record<TraceFilterOperatorId, string>> = {\n in: 'includes',\n notIn: 'notIncludes',\n exists: 'exists',\n notExists: 'notExists',\n};\n\n/** Structural subset of a discovery `canonicalFields` entry. */\nexport type TraceQueryCanonicalFieldDescriptor = {\n path: string;\n operators: readonly string[];\n valueSuggestions: boolean;\n};\n/** Synthetic fields live in a single dedicated URL param, so they cannot carry an operator. */\nexport const TRACE_SYNTHETIC_OPERATORS: TraceFilterOperatorId[] = ['is', 'in'];\n// The legacy list endpoint only matches by equality.\nconst TRACE_LEGACY_OPERATORS: TraceFilterOperatorId[] = ['is'];\n\nexport const TRACE_FILTER_BAR_LABELS: Record<string, string> = {\n rootEntityType: 'Primitive type',\n entityName: 'Primitive name',\n entityId: 'Primitive ID',\n status: 'Status',\n outcome: 'Outcome',\n stopReason: 'Stop reason',\n tags: 'Tags',\n serviceName: 'Service Name',\n environment: 'Environment',\n traceId: 'Trace ID',\n runId: 'Run ID',\n threadId: 'Thread ID',\n sessionId: 'Session ID',\n requestId: 'Request ID',\n resourceId: 'Resource ID',\n userId: 'User ID',\n organizationId: 'Organization ID',\n experimentId: 'Experiment ID',\n 'spans.name': 'Span name',\n 'spans.spanType': 'Span type',\n 'spans.model': 'Span Model',\n 'spans.provider': 'Provider',\n durationMs: 'Duration (ms)',\n timeToFirstChunkMs: 'Time to first chunk (ms)',\n timeToFirstTokenMs: 'Time to first token (ms)',\n 'spans.durationMs': 'Span duration (ms)',\n 'spans.timeToFirstChunkMs': 'Span time to first chunk (ms)',\n 'spans.timeToFirstTokenMs': 'Span time to first token (ms)',\n 'spans.error': 'Span error',\n 'scores.scorerId': 'Scorer',\n 'scores.score': 'Score',\n 'feedback.feedbackType': 'Feedback type',\n 'feedback.value': 'Feedback value',\n 'feedback.comment': 'Feedback comment',\n};\n\nconst TRACE_FILTER_BAR_FIELD_ICONS: Record<string, LucideIcon> = {\n timeRange: ClockIcon,\n rootEntityType: BoxIcon,\n entityName: TagIcon,\n entityId: FingerprintIcon,\n status: ActivityIcon,\n outcome: FlagIcon,\n stopReason: OctagonIcon,\n tags: TagsIcon,\n serviceName: ServerIcon,\n environment: GlobeIcon,\n traceId: WaypointsIcon,\n runId: PlayIcon,\n threadId: MessageSquareIcon,\n sessionId: LayersIcon,\n requestId: RadioIcon,\n resourceId: HashIcon,\n userId: UserIcon,\n organizationId: BuildingIcon,\n experimentId: FlaskConicalIcon,\n 'spans.name': GitBranchIcon,\n 'spans.spanType': ShapesIcon,\n 'spans.model': CpuIcon,\n 'spans.provider': CloudIcon,\n durationMs: TimerIcon,\n timeToFirstChunkMs: TimerIcon,\n timeToFirstTokenMs: TimerIcon,\n 'spans.durationMs': TimerIcon,\n 'spans.timeToFirstChunkMs': TimerIcon,\n 'spans.timeToFirstTokenMs': TimerIcon,\n 'spans.error': TriangleAlertIcon,\n 'scores.scorerId': GaugeIcon,\n 'scores.score': PercentIcon,\n 'feedback.feedbackType': ThumbsUpIcon,\n 'feedback.value': StarIcon,\n 'feedback.comment': MessageCircleIcon,\n};\n\n/** Which optional trace query fields the server declares support for. */\nexport type TraceQueryFieldSupport = {\n /** Root `durationMs`, declared by `traceQueryRootDuration`. */\n withRootDuration?: boolean;\n /** Root and span `timeToFirstChunkMs`, declared by `traceQueryTimeToFirstChunk`. */\n withTimeToFirstChunk?: boolean;\n /** Root and span `timeToFirstTokenMs`, declared by `traceQueryTimeToFirstToken`. */\n withTimeToFirstToken?: boolean;\n /** Root `outcome` and `stopReason`, declared by `traceQueryOutcomeFields`. */\n withOutcomeFields?: boolean;\n};\n\nconst ROOT_DURATION_FIELD_IDS = ['durationMs'];\nconst OUTCOME_FIELD_IDS = ['outcome', 'stopReason'];\nconst TIME_TO_FIRST_CHUNK_FIELD_IDS = ['timeToFirstChunkMs', 'spans.timeToFirstChunkMs'];\nconst TIME_TO_FIRST_TOKEN_FIELD_IDS = ['timeToFirstTokenMs', 'spans.timeToFirstTokenMs'];\n\n/** The optional fields this server can't query: each needs its capability. */\nexport const traceQueryUnqueryableFieldIds = ({\n withRootDuration = false,\n withTimeToFirstChunk = false,\n withTimeToFirstToken = false,\n withOutcomeFields = false,\n}: TraceQueryFieldSupport): ReadonlySet<string> =>\n new Set([\n ...(withRootDuration ? [] : ROOT_DURATION_FIELD_IDS),\n ...(withOutcomeFields ? [] : OUTCOME_FIELD_IDS),\n ...(withTimeToFirstChunk ? [] : TIME_TO_FIRST_CHUNK_FIELD_IDS),\n ...(withTimeToFirstToken ? [] : TIME_TO_FIRST_TOKEN_FIELD_IDS),\n ]);\n\n/** Which streaming timings the store records. Spans and threads query them without a prefix. */\nexport type StreamingTimingSupport = Required<\n Pick<TraceQueryFieldSupport, 'withTimeToFirstChunk' | 'withTimeToFirstToken'>\n>;\n\n/** `fieldIds` without the streaming timings the store doesn't record: the query rejects a condition on one. */\nexport function withoutUnrecordedStreamingTimings(\n fieldIds: ReadonlySet<string>,\n { withTimeToFirstChunk, withTimeToFirstToken }: StreamingTimingSupport,\n): ReadonlySet<string> {\n if (withTimeToFirstChunk && withTimeToFirstToken) return fieldIds;\n return new Set(\n [...fieldIds].filter(\n id =>\n (withTimeToFirstChunk || id !== 'timeToFirstChunkMs') && (withTimeToFirstToken || id !== 'timeToFirstTokenMs'),\n ),\n );\n}\n\nexport const traceFilterFieldIcon = (fieldId: string) => TRACE_FILTER_BAR_FIELD_ICONS[fieldId];\n\n/** Shared neutral accent for built-in, time-range, and dynamic filters. */\nexport const traceFilterFieldColor = (_fieldId: string) => 'var(--muted-foreground)';\n\nconst traceFieldBase = (id: string) => ({\n id,\n label: TRACE_FILTER_BAR_LABELS[id] ?? id,\n icon: traceFilterFieldIcon(id),\n color: traceFilterFieldColor(id),\n});\n\nconst TRACE_FILTER_BAR_TEXT_FIELD_IDS = [\n 'entityId',\n 'traceId',\n 'runId',\n 'threadId',\n 'sessionId',\n 'requestId',\n 'resourceId',\n 'userId',\n 'organizationId',\n 'experimentId',\n] as const;\n\nconst TRACE_FILTER_BAR_RELATED_FIELD_IDS = [\n 'spans.name',\n 'spans.spanType',\n 'spans.model',\n 'spans.provider',\n 'spans.durationMs',\n 'spans.timeToFirstChunkMs',\n 'spans.timeToFirstTokenMs',\n 'spans.error',\n 'scores.scorerId',\n 'scores.score',\n 'feedback.feedbackType',\n 'feedback.value',\n 'feedback.comment',\n] as const;\ntype TraceFilterRelatedFieldId = (typeof TRACE_FILTER_BAR_RELATED_FIELD_IDS)[number];\n\nconst TRACE_FILTER_BAR_PRESENCE_FIELD_IDS = new Set<string>(['spans.error']);\nconst TRACE_FILTER_BAR_TEXT_MATCH_FIELD_IDS = new Set<string>(['spans.name', 'feedback.comment']);\n/** Free text with no value discovery: the values endpoint rejects these paths. */\nconst TRACE_FILTER_BAR_FREE_TEXT_RELATED_FIELD_IDS = new Set<string>(['feedback.comment']);\n\nconst byLabel = (a: FilterBarField, b: FilterBarField) => a.label.localeCompare(b.label);\n\n/** Outcome and stop reason: free text (custom spans set arbitrary values) with discovered suggestions. */\nexport function createOutcomeFilterBarFields(\n base: (id: string) => Pick<FilterBarField, 'id' | 'label' | 'icon' | 'color'>,\n valueSuggestions?: (path: string) => FilterBarSuggestionsResolver | undefined,\n): FilterBarField[] {\n return (['outcome', 'stopReason'] as const).map(id => {\n const suggestions = valueSuggestions?.(id);\n return {\n ...base(id),\n operators: TRACE_STRING_OPERATORS,\n ...(id === 'outcome' ? { operatorLabels: { notExists: 'is not recorded' } } : {}),\n ...(suggestions ? { suggestions } : {}),\n };\n });\n}\n\n/** The Tags field, or `undefined` until the backend describes `tags`: its operators\n * can't be inferred safely from the static catalog. Only UI operators whose query\n * operator the backend accepts are offered, and suggestions are wired only when the\n * backend says the field has them. */\nfunction createTagsFilterBarField(\n canonicalTraceFields: readonly TraceQueryCanonicalFieldDescriptor[],\n valueSuggestions?: (scope: 'trace', path: string) => FilterBarSuggestionsResolver,\n): FilterBarField | undefined {\n const descriptor = canonicalTraceFields.find(field => field.path === 'tags');\n if (!descriptor) return undefined;\n\n const operators = TRACE_TAGS_OPERATORS.filter(op =>\n descriptor.operators.includes(TRACE_TAGS_OPERATOR_TO_QUERY_OP[op] ?? ''),\n );\n if (operators.length === 0) return undefined;\n\n const suggestions = descriptor.valueSuggestions ? valueSuggestions?.('trace', 'tags') : undefined;\n return { ...traceFieldBase('tags'), operators, ...(suggestions ? { suggestions } : {}) };\n}\n\n/** FilterBar field definitions for the trace pages. Fields the query API cannot\n * filter on (see `TRACE_QUERY_UNSUPPORTED_FILTER_FIELDS`) are omitted, as is the\n * `running` status, so no chip advertises a filter that has no effect. Hidden\n * fields are never offered in the input's field step but still label existing\n * (e.g. scoped, read-only) chips. */\nexport function createTraceFilterBarFields({\n availableRootEntityNames,\n availableEnvironments,\n hiddenFieldIds = [],\n metadataFields = [],\n canonicalTraceFields = [],\n valueSuggestions,\n withQueryTrace = true,\n ...support\n}: TraceQueryFieldSupport & {\n /** Trace-scope field descriptors from the query discovery endpoint. Empty when discovery is unavailable. */\n canonicalTraceFields?: readonly TraceQueryCanonicalFieldDescriptor[];\n availableRootEntityNames: string[];\n availableEnvironments: string[];\n hiddenFieldIds?: readonly string[];\n /** Discovered `metadata.<key>` paths with a lazy value-suggestions resolver each. */\n metadataFields?: readonly TraceMetadataFilterField[];\n /** Builds a lazy value resolver for a related-scope field (`spans.model`, …). Absent → free text. */\n valueSuggestions?: (scope: TraceQueryRelatedScope | 'trace', path: string) => FilterBarSuggestionsResolver;\n /**\n * When false, only fields the legacy list endpoint (`buildTraceListFilters`) can express are offered, each with\n * the `is` operator only: no related-scope (`spans.*`, `scores.*`, `feedback.*`) or metadata fields.\n */\n withQueryTrace?: boolean;\n}): FilterBarField[] {\n const pick = (\n id: string,\n suggestions: { value: string; label?: string }[],\n operators: TraceFilterOperatorId[] = TRACE_STRING_OPERATORS,\n ): FilterBarField => ({\n ...traceFieldBase(id),\n operators,\n strict: true,\n suggestions,\n });\n const text = (id: string): FilterBarField => ({\n ...traceFieldBase(id),\n operators: id === 'traceId' ? TRACE_REQUIRED_STRING_OPERATORS : TRACE_STRING_OPERATORS,\n });\n const relatedPick = (id: TraceFilterRelatedFieldId): FilterBarField => {\n const [scope, path] = id.split('.') as [TraceQueryRelatedScope, string];\n const resolver = TRACE_FILTER_BAR_FREE_TEXT_RELATED_FIELD_IDS.has(id) ? undefined : valueSuggestions?.(scope, path);\n return {\n ...traceFieldBase(id),\n operators: TRACE_FILTER_BAR_TEXT_MATCH_FIELD_IDS.has(id) ? TRACE_TEXT_OPERATORS : TRACE_STRING_OPERATORS,\n ...(resolver ? { strict: true, suggestions: resolver } : {}),\n };\n };\n const number = (id: string): FilterBarField => ({\n ...traceFieldBase(id),\n type: 'number',\n operators: TRACE_NUMBER_OPERATORS,\n });\n const presence = (id: string): FilterBarField => ({ ...traceFieldBase(id), operators: TRACE_PRESENCE_OPERATORS });\n\n const pickFields: FilterBarField[] = [\n pick(\n 'rootEntityType',\n ROOT_ENTITY_TYPE_OPTIONS.map(o => ({ value: o.entityType, label: o.label })),\n TRACE_SYNTHETIC_OPERATORS,\n ),\n pick(\n 'entityName',\n availableRootEntityNames.map(name => ({ value: name })),\n TRACE_REQUIRED_STRING_OPERATORS,\n ),\n pick(\n 'status',\n TRACE_STATUS_OPTIONS.filter(o => o.value !== 'running').map(o => ({ value: o.value, label: o.label })),\n TRACE_SYNTHETIC_OPERATORS,\n ),\n pick(\n 'environment',\n availableEnvironments.map(env => ({ value: env })),\n ),\n ];\n const textFields = TRACE_FILTER_BAR_TEXT_FIELD_IDS.map(text);\n const relatedFields = (['spans', 'scores', 'feedback'] as const).flatMap(scope =>\n TRACE_FILTER_BAR_RELATED_FIELD_IDS.filter(id => id.startsWith(`${scope}.`))\n .map(id => {\n if (TRACE_QUERY_NUMERIC_FIELD_IDS.has(id)) return number(id);\n if (TRACE_FILTER_BAR_PRESENCE_FIELD_IDS.has(id)) return presence(id);\n return relatedPick(id);\n })\n .sort(byLabel),\n );\n const metadataBarFields: FilterBarField[] = metadataFields\n .filter(({ path }) => isTraceMetadataFieldId(path))\n .map(({ path, suggestions }) => ({\n id: path,\n label: path.slice(TRACE_METADATA_FILTER_FIELD_PREFIX.length),\n icon: BracesIcon,\n color: traceFilterFieldColor(path),\n operators: TRACE_STRING_OPERATORS,\n suggestions,\n }));\n\n const tagsField = createTagsFilterBarField(canonicalTraceFields, valueSuggestions);\n const tagsFields = tagsField ? [tagsField] : [];\n\n const hidden = new Set(hiddenFieldIds);\n const unqueryable = traceQueryUnqueryableFieldIds(support);\n if (!withQueryTrace) {\n return [...pickFields.sort(byLabel), ...textFields.sort(byLabel)].map(field => ({\n ...field,\n operators: TRACE_LEGACY_OPERATORS,\n ...(hidden.has(field.id) ? { hidden: true } : {}),\n }));\n }\n return [\n ...[...pickFields, ...tagsFields].sort(byLabel),\n ...[\n ...textFields,\n { ...number('durationMs'), operators: TRACE_ROOT_DURATION_OPERATORS },\n number('timeToFirstChunkMs'),\n number('timeToFirstTokenMs'),\n ...createOutcomeFilterBarFields(traceFieldBase, path => valueSuggestions?.('trace', path)),\n ].sort(byLabel),\n ...relatedFields,\n ...metadataBarFields.sort(byLabel),\n ]\n .filter(field => !TRACE_QUERY_UNSUPPORTED_FILTER_FIELDS.has(field.id) && !unqueryable.has(field.id))\n .map(field => (hidden.has(field.id) ? { ...field, hidden: true } : field));\n}\n\n/** One FilterBar item per token, keyed by field id so chip order == URL order.\n * Empty values ('' / []) are kept: that's a pending chip whose field was just\n * changed and whose value hasn't been picked yet (the query builder skips it).\n * Only the legacy 'Any' sentinel is mapped back to an empty value. */\nexport function traceTokensToFilterBarItems(tokens: TraceFilterToken[]): FilterBarItem[] {\n return tokens.map(token => ({\n id: token.fieldId,\n fieldId: token.fieldId,\n operatorId: traceFilterTokenOperator(token),\n value: isLegacyAnyValue(token.value, traceFilterTokenOperator(token)) ? '' : token.value,\n }));\n}\n\nexport function filterBarItemsToTraceTokens(items: FilterBarItem[]): TraceFilterToken[] {\n return items.map(filterBarItemToTraceToken);\n}\n\nfunction filterBarItemToTraceToken(item: FilterBarItem): TraceFilterToken {\n const token: TraceFilterToken = {\n fieldId: item.fieldId,\n value: Array.isArray(item.value) ? item.value.map(String) : String(item.value),\n };\n // Only carry a non-default operator so tokens stay minimal (and URLs stay short).\n if (isTraceFilterOperatorId(item.operatorId) && item.operatorId !== traceFilterTokenOperator(token)) {\n token.operatorId = item.operatorId;\n }\n return token;\n}\n\n/** Expression-mode value for the FilterBar: root tokens as items, then one\n * group node per advanced filter. Ids inside groups are carried as-is. */\nexport function traceFiltersToFilterBarExpression(\n tokens: TraceFilterToken[],\n groups: TraceFilterGroup[],\n): FilterBarExpression {\n return { logic: 'and', nodes: [...traceTokensToFilterBarItems(tokens), ...groups.map(traceGroupToFilterBarGroup)] };\n}\n\nfunction traceGroupToFilterBarGroup(group: TraceFilterGroup): FilterBarGroup {\n return {\n id: group.id,\n kind: 'group',\n logic: group.logic,\n nodes: group.nodes.map(node =>\n isTraceFilterGroup(node)\n ? traceGroupToFilterBarGroup(node)\n : {\n id: node.id ?? node.fieldId,\n fieldId: node.fieldId,\n operatorId: traceFilterTokenOperator(node),\n value: isLegacyAnyValue(node.value, traceFilterTokenOperator(node)) ? '' : node.value,\n },\n ),\n };\n}\n\nexport function filterBarExpressionToTraceFilters(expression: FilterBarExpression): {\n tokens: TraceFilterToken[];\n groups: TraceFilterGroup[];\n} {\n const items = expression.nodes.filter((node): node is FilterBarItem => !isFilterBarGroup(node));\n const groups = expression.nodes.filter(isFilterBarGroup).map(filterBarGroupToTraceGroup);\n return { tokens: filterBarItemsToTraceTokens(items), groups };\n}\n\nfunction filterBarGroupToTraceGroup(group: FilterBarGroup): TraceFilterGroup {\n const nodes = group.nodes.map(\n (node): TraceFilterNode =>\n isFilterBarGroup(node) ? filterBarGroupToTraceGroup(node) : { id: node.id, ...filterBarItemToTraceToken(node) },\n );\n // Empty groups are kept: \"Advanced filter…\" emits one and opens its editor, and the\n // FilterBar prunes it itself when the popover closes without any condition.\n return { id: group.id, logic: group.logic, nodes };\n}\n\n/**\n * Read filter tokens from URL search params preserving the order in which each\n * filter was first added (URLSearchParams iterates in insertion order). This\n * is used by the Filter popover + PropertyFilterApplied pills so the UI reflects the\n * order the user created the filters in.\n */\nexport function getTracePropertyFilterTokens(searchParams: URLSearchParams): TraceFilterToken[] {\n const tokens: TraceFilterToken[] = [];\n\n // Map URL param name → fieldId for both generic filterX params and the\n // dedicated synthetic params (rootEntityType, status).\n const paramToFieldId = new Map<string, string>([\n [TRACE_ROOT_ENTITY_TYPE_PARAM, 'rootEntityType'],\n [TRACE_STATUS_PARAM, 'status'],\n ]);\n for (const fieldId of TRACE_PROPERTY_FILTER_FIELD_IDS) {\n paramToFieldId.set(TRACE_PROPERTY_FILTER_PARAM_BY_FIELD[fieldId], fieldId);\n }\n\n const seen = new Set<string>();\n for (const [paramName] of searchParams.entries()) {\n if (isTraceFilterOperatorParam(paramName)) continue;\n const fieldId = isTraceMetadataParam(paramName) ? metadataParamToFieldId(paramName) : paramToFieldId.get(paramName);\n if (!fieldId || seen.has(fieldId)) continue;\n seen.add(fieldId);\n\n const operatorId = readTraceFilterOperator(searchParams, paramName);\n const raw = searchParams.getAll(paramName);\n\n // Presence-only fields can't match a value; a hand-edited URL that gives\n // them one would show a chip for a filter that is never applied. A pending\n // chip (empty value, no operator yet) must still survive the round-trip.\n if (TRACE_FILTER_BAR_PRESENCE_FIELD_IDS.has(fieldId)) {\n if (operatorId ? !isPresenceOperator(operatorId) : Boolean(raw[0])) continue;\n }\n\n if (fieldId === 'tags' || isManyOperator(operatorId)) {\n // An empty `filterTags=` sentinel keeps the pill alive after a Reset\n // (neutral state = no selections) so users can re-pick without losing\n // the pill's position. Non-empty entries are the actual selected values.\n tokens.push({ fieldId, value: raw.filter(Boolean), ...(operatorId ? { operatorId } : {}) });\n continue;\n }\n\n // Text and synthetic single-value fields: include empty strings so\n // pending-but-not-yet-filled filters survive URL round-trips.\n const value = raw[0];\n if (value !== undefined) tokens.push({ fieldId, value, ...(operatorId ? { operatorId } : {}) });\n }\n\n return tokens;\n}\n\nexport function getPreservedTraceFilterParams(searchParams: URLSearchParams) {\n const next = new URLSearchParams();\n\n const preserve = (param: string) => {\n const operatorId = readTraceFilterOperator(searchParams, param);\n const values = searchParams.getAll(param).filter(value => value || isPresenceOperator(operatorId));\n if (!values.length) return;\n for (const value of values) next.append(param, value);\n if (operatorId) next.set(traceFilterOperatorParam(param), operatorId);\n };\n\n preserve(TRACE_ROOT_ENTITY_TYPE_PARAM);\n preserve(TRACE_STATUS_PARAM);\n\n const listMode = searchParams.get(TRACE_LIST_MODE_PARAM);\n if (listMode) next.set(TRACE_LIST_MODE_PARAM, listMode);\n\n for (const fieldId of TRACE_PROPERTY_FILTER_FIELD_IDS) {\n const param = TRACE_PROPERTY_FILTER_PARAM_BY_FIELD[fieldId];\n if (fieldId === 'tags') {\n for (const value of searchParams.getAll(param)) {\n next.append(param, value);\n }\n const operatorId = readTraceFilterOperator(searchParams, param);\n if (operatorId && searchParams.has(param)) next.set(traceFilterOperatorParam(param), operatorId);\n continue;\n }\n preserve(param);\n }\n\n const seenMetadata = new Set<string>();\n for (const param of searchParams.keys()) {\n if (!isTraceMetadataParam(param) || isTraceFilterOperatorParam(param) || seenMetadata.has(param)) continue;\n seenMetadata.add(param);\n preserve(param);\n }\n\n for (const group of getTraceFilterGroups(searchParams)) {\n next.append(TRACE_FILTER_GROUP_PARAM, serializeTraceFilterGroup(group));\n }\n\n return next;\n}\n\n/**\n * Clear all filter params from `params` and re-add them in the given `tokens`\n * order so the URL (and therefore the PropertyFilterApplied pills) reflects the\n * creation order of filters. Handles the generic `filterX` params plus the\n * dedicated synthetic params (rootEntityType, status).\n */\nexport function applyTracePropertyFilterTokens(\n params: URLSearchParams,\n tokens: TraceFilterToken[],\n groups: TraceFilterGroup[] = [],\n) {\n for (const param of Object.values(TRACE_SYNTHETIC_PARAM_BY_FIELD)) {\n params.delete(param);\n params.delete(traceFilterOperatorParam(param));\n }\n params.delete(TRACE_FILTER_GROUP_PARAM);\n for (const fieldId of TRACE_PROPERTY_FILTER_FIELD_IDS) {\n const param = TRACE_PROPERTY_FILTER_PARAM_BY_FIELD[fieldId];\n params.delete(param);\n params.delete(traceFilterOperatorParam(param));\n }\n for (const param of Array.from(params.keys())) {\n if (isTraceMetadataParam(param)) params.delete(param);\n }\n\n for (const token of tokens) {\n const param = isTraceMetadataFieldId(token.fieldId)\n ? metadataFieldIdToParam(token.fieldId)\n : (TRACE_SYNTHETIC_PARAM_BY_FIELD[token.fieldId] ??\n TRACE_PROPERTY_FILTER_PARAM_BY_FIELD[token.fieldId as keyof typeof TRACE_PROPERTY_FILTER_PARAM_BY_FIELD]);\n if (!param) continue;\n\n if (Array.isArray(token.value)) {\n if (token.value.length === 0) {\n // Empty sentinel — keeps the pill visible after Reset.\n params.append(param, '');\n } else {\n for (const value of token.value) {\n params.append(param, value);\n }\n }\n } else {\n // Persist empty / 'Any' values too so neutralized-but-still-visible pills\n // survive URL round-trips. The query builder skips these so neutrals\n // never reach the backend.\n params.set(param, token.value.trim());\n }\n\n // Only `is` is implicit on read. `in` must be written explicitly (except\n // for tags, which are always multi-valued) or a reload would collapse the\n // selection to its first value.\n const operatorId = traceFilterTokenOperator(token);\n const implicit = token.fieldId === 'tags' ? 'in' : 'is';\n if (operatorId !== implicit) params.set(traceFilterOperatorParam(param), operatorId);\n }\n\n for (const group of groups) {\n params.append(TRACE_FILTER_GROUP_PARAM, serializeTraceFilterGroup(group));\n }\n}\n\n/** Root-level advanced filter groups live in a repeatable `filterGroup` param,\n * one compact JSON subtree each. Node ids are part of the payload so the\n * FilterBar keeps chip identity across URL round-trips. */\nexport const TRACE_FILTER_GROUP_PARAM = 'filterGroup';\n\nexport const serializeTraceFilterGroup = (group: TraceFilterGroup): string => JSON.stringify(group);\n\nexport function getTraceFilterGroups(searchParams: URLSearchParams): TraceFilterGroup[] {\n return searchParams\n .getAll(TRACE_FILTER_GROUP_PARAM)\n .map(parseTraceFilterGroupParam)\n .filter((group): group is TraceFilterGroup => group !== undefined);\n}\n\nexport function parseTraceFilterGroupParam(raw: string): TraceFilterGroup | undefined {\n try {\n return parseTraceFilterGroup(JSON.parse(raw));\n } catch {\n return undefined;\n }\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => typeof value === 'object' && value !== null;\n\nconst isStringArray = (value: unknown): value is string[] =>\n Array.isArray(value) && value.every(entry => typeof entry === 'string');\n\nfunction parseTraceFilterGroup(input: unknown): TraceFilterGroup | undefined {\n if (!isRecord(input) || typeof input.id !== 'string') return undefined;\n if (input.logic !== 'and' && input.logic !== 'or') return undefined;\n if (!Array.isArray(input.nodes)) return undefined;\n const nodes = input.nodes.map(parseTraceFilterNode).filter((node): node is TraceFilterNode => node !== undefined);\n return { id: input.id, logic: input.logic, nodes };\n}\n\nfunction parseTraceFilterNode(input: unknown): TraceFilterNode | undefined {\n if (!isRecord(input)) return undefined;\n if ('nodes' in input) return parseTraceFilterGroup(input);\n if (typeof input.id !== 'string' || typeof input.fieldId !== 'string') return undefined;\n if (typeof input.value !== 'string' && !isStringArray(input.value)) return undefined;\n const token: TraceFilterToken = { id: input.id, fieldId: input.fieldId, value: input.value };\n if (typeof input.operatorId === 'string' && isTraceFilterOperatorId(input.operatorId)) {\n token.operatorId = input.operatorId;\n }\n return token;\n}\n\nexport function buildTraceListFilters({\n rootEntityType,\n status,\n dateFrom,\n dateTo,\n tokens,\n}: {\n rootEntityType?: string;\n status?: TraceStatusFilter;\n dateFrom?: Date;\n dateTo?: Date;\n tokens: PropertyFilterToken[];\n}): ListTracesArgs['filters'] {\n const filters: NonNullable<ListTracesArgs['filters']> = {};\n\n if (rootEntityType) {\n filters.entityType = rootEntityType as NonNullable<ListTracesArgs['filters']>['entityType'];\n }\n\n if (status) {\n filters.status = status as NonNullable<ListTracesArgs['filters']>['status'];\n }\n\n if (dateFrom) {\n filters.startedAt = { start: dateFrom };\n }\n\n if (dateTo) {\n filters.endedAt = { end: dateTo };\n }\n\n for (const token of tokens) {\n if (token.fieldId === 'tags') {\n if (Array.isArray(token.value) && token.value.length > 0) {\n filters.tags = token.value;\n } else if (typeof token.value === 'string' && token.value.trim()) {\n // pick-multi tags: single-string token → wrap for the server's array schema.\n filters.tags = [token.value.trim()];\n }\n continue;\n }\n\n if (typeof token.value !== 'string') continue;\n // Skip empty-string tokens (unfilled pending filters) and 'Any'\n // (pick-multi single-select neutral state) so neutrals never reach the\n // backend.\n if (!token.value.trim()) continue;\n if (token.value === 'Any') continue;\n\n switch (token.fieldId) {\n case 'entityId':\n filters.entityId = token.value;\n break;\n case 'entityName':\n filters.entityName = token.value;\n break;\n case 'traceId':\n filters.traceId = token.value;\n break;\n case 'runId':\n filters.runId = token.value;\n break;\n case 'threadId':\n filters.threadId = token.value;\n break;\n case 'sessionId':\n filters.sessionId = token.value;\n break;\n case 'requestId':\n filters.requestId = token.value;\n break;\n case 'resourceId':\n filters.resourceId = token.value;\n break;\n case 'userId':\n filters.userId = token.value;\n break;\n case 'organizationId':\n filters.organizationId = token.value;\n break;\n case 'serviceName':\n filters.serviceName = token.value;\n break;\n case 'environment':\n filters.environment = token.value;\n break;\n case 'experimentId':\n filters.experimentId = token.value;\n break;\n default:\n break;\n }\n }\n\n return filters;\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"trace-filters-BNEZ31HX.cjs","names":["ROOT_ENTITY_TYPES","ClockIcon","BoxIcon","TagIcon","FingerprintIcon","ActivityIcon","FlagIcon","OctagonIcon","TagsIcon","ServerIcon","GlobeIcon","WaypointsIcon","PlayIcon","MessageSquareIcon","LayersIcon","RadioIcon","HashIcon","UserIcon","BuildingIcon","FlaskConicalIcon","GitBranchIcon","ShapesIcon","CpuIcon","CloudIcon","TimerIcon","TriangleAlertIcon","GaugeIcon","PercentIcon","ThumbsUpIcon","StarIcon","MessageCircleIcon","BracesIcon","isFilterBarGroup"],"sources":["../src/domains/traces/trace-query-filters.ts","../src/domains/traces/trace-filters.ts"],"sourcesContent":["import type { QueryTracesInput } from '@mastra/client-js';\nimport type { TraceQueryPredicate, TraceQueryScalarPredicate } from '@mastra/core/storage';\nimport { isLegacyAnyValue } from './trace-filters';\nimport type { buildTraceListFilters, TraceStatusFilter } from './trace-filters';\nimport type { PropertyFilterToken } from '@/ds/components/PropertyFilter/types';\n\nexport const TRACE_QUERY_UNSUPPORTED_FILTER_FIELDS = new Set([\n 'runId',\n 'sessionId',\n 'requestId',\n 'userId',\n 'organizationId',\n 'serviceName',\n 'experimentId',\n]);\n\nexport const TRACE_FILTER_OPERATOR_IDS = [\n 'is',\n 'isNot',\n 'in',\n 'notIn',\n 'exists',\n 'notExists',\n 'gt',\n 'gte',\n 'lt',\n 'lte',\n 'matches',\n 'notMatches',\n] as const;\nexport type TraceFilterOperatorId = (typeof TRACE_FILTER_OPERATOR_IDS)[number];\n\nexport const isTraceFilterOperatorId = (value: string): value is TraceFilterOperatorId =>\n (TRACE_FILTER_OPERATOR_IDS as readonly string[]).includes(value);\n\n/** A trace filter chip: `operatorId` defaults to `is` (equality / set membership). */\nexport type TraceFilterToken = PropertyFilterToken & {\n operatorId?: TraceFilterOperatorId;\n /** Only set for tokens inside a group: a group may hold several tokens on the same field. */\n id?: string;\n};\n\nexport type TraceFilterLogic = 'and' | 'or';\n\n/** An advanced filter: a nested boolean combination of tokens. */\nexport type TraceFilterGroup = { id: string; logic: TraceFilterLogic; nodes: TraceFilterNode[] };\nexport type TraceFilterNode = TraceFilterToken | TraceFilterGroup;\n\nexport const isTraceFilterGroup = (node: TraceFilterNode): node is TraceFilterGroup => 'nodes' in node;\n\nconst TRACE_FILTER_OPERATOR_TO_QUERY_OP = {\n is: 'eq',\n isNot: 'ne',\n in: 'in',\n notIn: 'notIn',\n exists: 'exists',\n notExists: 'notExists',\n gt: 'gt',\n gte: 'gte',\n lt: 'lt',\n lte: 'lte',\n matches: 'matches',\n notMatches: 'notMatches',\n} as const satisfies Record<TraceFilterOperatorId, TraceQueryScalarPredicate['op']>;\n\n/** Fields whose values must be sent as numbers. Non-numeric input is dropped. */\nexport const TRACE_QUERY_NUMERIC_FIELD_IDS = new Set([\n 'durationMs',\n 'timeToFirstChunkMs',\n 'timeToFirstTokenMs',\n 'spans.durationMs',\n 'spans.timeToFirstChunkMs',\n 'spans.timeToFirstTokenMs',\n 'scores.score',\n 'feedback.value',\n]);\n\nconst TRACE_QUERY_TRACE_FIELD_IDS = new Set([\n 'entityType',\n 'status',\n 'entityName',\n 'environment',\n 'traceId',\n 'threadId',\n 'resourceId',\n 'durationMs',\n 'timeToFirstChunkMs',\n 'timeToFirstTokenMs',\n 'outcome',\n 'stopReason',\n]);\n\n/** Trace-level fields that may be unset. \"is not X\" on these must also keep traces\n * where the field is missing, so the predicate is `or[ne, notExists]`. */\nexport const TRACE_QUERY_OPTIONAL_TRACE_FIELD_IDS = new Set([\n 'threadId',\n 'resourceId',\n 'environment',\n 'durationMs',\n 'timeToFirstChunkMs',\n 'timeToFirstTokenMs',\n 'outcome',\n 'stopReason',\n]);\n\n/** Negative operators are expressed as `none(<positive>)` on related collections. */\nconst NEGATIVE_TO_POSITIVE = {\n isNot: 'is',\n notIn: 'in',\n notExists: 'exists',\n notMatches: 'matches',\n} as const satisfies Partial<Record<TraceFilterOperatorId, TraceFilterOperatorId>>;\ntype NegativeOperatorId = keyof typeof NEGATIVE_TO_POSITIVE;\nconst isNegativeOperator = (op: TraceFilterOperatorId): op is NegativeOperatorId => op in NEGATIVE_TO_POSITIVE;\n\nconst TRACE_QUERY_RELATED_SCOPES = ['spans', 'scores', 'feedback'] as const;\nexport type TraceQueryRelatedScope = (typeof TRACE_QUERY_RELATED_SCOPES)[number];\n\n/** Split a field id into its related scope (`spans.` / `scores.` / `feedback.`) and\n * the path inside that scope. Trace-level fields have no scope. `entityId` is the\n * legacy id for `spans.entityId`. */\nfunction resolveTraceQueryPath(fieldId: string): { scope?: TraceQueryRelatedScope; path: string } {\n if (fieldId === 'entityId') return { scope: 'spans', path: 'entityId' };\n for (const scope of TRACE_QUERY_RELATED_SCOPES) {\n if (fieldId.startsWith(`${scope}.`) && fieldId.length > scope.length + 1) {\n return { scope, path: fieldId.slice(scope.length + 1) };\n }\n }\n return { path: fieldId };\n}\n\nexport function scalarPredicate(\n op: TraceFilterOperatorId,\n path: string,\n values: (string | number)[],\n): TraceQueryScalarPredicate | undefined {\n const queryOp = TRACE_FILTER_OPERATOR_TO_QUERY_OP[op];\n switch (queryOp) {\n case 'exists':\n case 'notExists':\n return { op: queryOp, path };\n case 'in':\n case 'notIn':\n return values.length ? { op: queryOp, value: { path }, set: values } : undefined;\n case 'matches':\n case 'notMatches': {\n const [literal] = values;\n return typeof literal === 'string' ? { op: queryOp, left: { path }, right: { literal } } : undefined;\n }\n default: {\n if (!values.length) return undefined;\n // `is` with several values is set membership; `isNot` with several is exclusion.\n if (values.length > 1) {\n if (queryOp === 'eq') return { op: 'in', value: { path }, set: values };\n if (queryOp === 'ne') return { op: 'notIn', value: { path }, set: values };\n }\n const [literal] = values;\n return literal === undefined ? undefined : { op: queryOp, left: { path }, right: { literal } };\n }\n }\n}\n\ntype TokenPredicate =\n | { predicate: TraceQueryPredicate }\n /** A positive predicate on a related row; the caller decides how to wrap it in `some`. */\n | { scope: TraceQueryRelatedScope; predicate: TraceQueryScalarPredicate };\n\n/** `tags` is a string array: membership is `includes` per tag; \"in\" any of\n * several tags is an `or`, \"not in\" all of them is an `and`. `notIncludes`\n * does not match traces without tags, so exclusion also keeps untagged traces. */\nfunction tagsPredicate(operatorId: TraceFilterOperatorId, tags: string[]): TraceQueryPredicate | undefined {\n if (operatorId === 'exists' || operatorId === 'notExists') return { op: operatorId, path: 'tags' };\n const negative = operatorId === 'notIn' || operatorId === 'isNot';\n const args: TraceQueryPredicate[] = tags.map(value => ({\n op: negative ? 'notIncludes' : 'includes',\n path: 'tags',\n value,\n }));\n const combined = args.length <= 1 ? args[0] : { op: negative ? ('and' as const) : ('or' as const), args };\n if (!combined || !negative) return combined;\n return { op: 'or', args: [combined, { op: 'notExists', path: 'tags' }] };\n}\n\n/** Fields the query API can only test for presence; any other operator is rejected with a 422. */\nconst TRACE_QUERY_PRESENCE_ONLY_FIELD_IDS = new Set<string>(['spans.error']);\n\nfunction tokenToTraceQueryPredicate(\n token: TraceFilterToken,\n excludedFieldIds: ReadonlySet<string>,\n): TokenPredicate | undefined {\n if (TRACE_QUERY_UNSUPPORTED_FILTER_FIELDS.has(token.fieldId) || excludedFieldIds.has(token.fieldId)) return undefined;\n const operatorId = token.operatorId ?? (token.fieldId === 'tags' ? 'in' : 'is');\n const isPresence = operatorId === 'exists' || operatorId === 'notExists';\n // Hand-edited URLs can pair these fields with value operators; drop them rather than fail the page.\n if (TRACE_QUERY_PRESENCE_ONLY_FIELD_IDS.has(token.fieldId) && !isPresence) return undefined;\n\n const rawValues = (Array.isArray(token.value) ? token.value : [token.value]).filter(\n (value): value is string =>\n typeof value === 'string' && Boolean(value.trim()) && !isLegacyAnyValue(value, operatorId),\n );\n if (!rawValues.length && !isPresence) return undefined;\n\n if (token.fieldId === 'tags') {\n const predicate = tagsPredicate(operatorId, rawValues);\n return predicate ? { predicate } : undefined;\n }\n\n let fieldId = token.fieldId;\n let values: (string | number)[] = rawValues;\n // Discovered metadata fields: the field id is already the predicate path (`metadata.<key>`).\n if (fieldId.startsWith('metadata.')) {\n if (fieldId.length === 'metadata.'.length) return undefined;\n } else if (fieldId === 'rootEntityType' || fieldId === 'entityType') {\n fieldId = 'entityType';\n } else if (fieldId === 'status') {\n values = rawValues.filter(value => value !== 'running');\n if (!values.length && !isPresence) return undefined;\n } else if (TRACE_QUERY_NUMERIC_FIELD_IDS.has(fieldId)) {\n values = rawValues.map(Number).filter(value => !Number.isNaN(value));\n if (!values.length && !isPresence) return undefined;\n }\n if (operatorId === 'matches' || operatorId === 'notMatches') {\n // The query rejects a text literal with no letters or digits; drop it like non-numeric input.\n values = values.filter(value => /[\\p{L}\\p{M}\\p{N}]/u.test(String(value)));\n if (!values.length) return undefined;\n }\n\n const { scope, path } = resolveTraceQueryPath(fieldId);\n const isMetadata = fieldId.startsWith('metadata.');\n if (!scope && !isMetadata && !TRACE_QUERY_TRACE_FIELD_IDS.has(fieldId)) return undefined;\n\n if (scope && isNegativeOperator(operatorId)) {\n // `some(model ne X)` matches any trace with one span that differs; the user\n // means \"no span with model X\", which is `none(model eq X)`.\n const positive = scalarPredicate(NEGATIVE_TO_POSITIVE[operatorId], path, values);\n return positive ? { predicate: { [scope]: { none: positive } } as TraceQueryPredicate } : undefined;\n }\n\n const predicate = scalarPredicate(operatorId, path, values);\n if (!predicate) return undefined;\n if (scope) return { scope, predicate };\n if (\n (operatorId === 'isNot' || operatorId === 'notIn') &&\n (isMetadata || TRACE_QUERY_OPTIONAL_TRACE_FIELD_IDS.has(fieldId))\n ) {\n return { predicate: { op: 'or', args: [predicate, { op: 'notExists', path }] } };\n }\n return { predicate };\n}\n\n/** Convert tokens to predicates. With `mergeRelated`, tokens on the same related\n * collection must match the same row (e.g. scorer X AND score < 0.6), so they are\n * merged into a single `some`. Inside an `or` group each token stands alone. */\nfunction predicatesForTokens(\n tokens: TraceFilterToken[],\n { mergeRelated, excludedFieldIds }: { mergeRelated: boolean; excludedFieldIds: ReadonlySet<string> },\n) {\n const args: TraceQueryPredicate[] = [];\n const related: Record<TraceQueryRelatedScope, TraceQueryScalarPredicate[]> = { spans: [], scores: [], feedback: [] };\n\n for (const token of tokens) {\n const result = tokenToTraceQueryPredicate(token, excludedFieldIds);\n if (!result) continue;\n if (!('scope' in result)) {\n args.push(result.predicate);\n } else if (mergeRelated) {\n related[result.scope].push(result.predicate);\n } else {\n args.push({ [result.scope]: { some: result.predicate } } as TraceQueryPredicate);\n }\n }\n\n for (const scope of TRACE_QUERY_RELATED_SCOPES) {\n const [first, ...rest] = related[scope];\n if (!first) continue;\n const some = rest.length ? { op: 'and' as const, args: [first, ...rest] } : first;\n args.push({ [scope]: { some } } as TraceQueryPredicate);\n }\n\n return args;\n}\n\nfunction groupToTraceQueryPredicate(\n group: TraceFilterGroup,\n excludedFieldIds: ReadonlySet<string>,\n): TraceQueryPredicate | undefined {\n const tokens = group.nodes.filter((node): node is TraceFilterToken => !isTraceFilterGroup(node));\n const args = predicatesForTokens(tokens, { mergeRelated: group.logic === 'and', excludedFieldIds });\n for (const node of group.nodes) {\n if (!isTraceFilterGroup(node)) continue;\n const predicate = groupToTraceQueryPredicate(node, excludedFieldIds);\n if (predicate) args.push(predicate);\n }\n if (args.length === 0) return undefined;\n return args.length === 1 ? args[0] : { op: group.logic, args };\n}\n\nexport function buildTraceQueryRequest({\n rootEntityType,\n status,\n dateFrom,\n dateTo,\n tokens,\n groups = [],\n excludedFieldIds = new Set(),\n now,\n}: Omit<Parameters<typeof buildTraceListFilters>[0], 'tokens' | 'status'> & {\n status?: TraceStatusFilter;\n tokens: TraceFilterToken[];\n groups?: TraceFilterGroup[];\n /** Fields the server cannot query (e.g. `durationMs` without `traceQueryRootDuration`); dropped from tokens and groups. */\n excludedFieldIds?: ReadonlySet<string>;\n now: Date;\n}): Pick<QueryTracesInput, 'timeRange' | 'where'> {\n const args: TraceQueryPredicate[] = [];\n\n if (rootEntityType) args.push({ op: 'eq', left: { path: 'entityType' }, right: { literal: rootEntityType } });\n if (status && status !== 'running') args.push({ op: 'eq', left: { path: 'status' }, right: { literal: status } });\n\n args.push(...predicatesForTokens(tokens, { mergeRelated: true, excludedFieldIds }));\n\n for (const group of groups) {\n const predicate = groupToTraceQueryPredicate(group, excludedFieldIds);\n if (predicate) args.push(predicate);\n }\n\n return {\n timeRange: resolveTraceQueryTimeRange(dateFrom, dateTo, now),\n ...(args.length ? { where: { op: 'and' as const, args } } : {}),\n };\n}\n\n/** The query window for a date range: open ends fall back to the last seven days up to `now`. */\nexport function resolveTraceQueryTimeRange(\n dateFrom: Date | undefined,\n dateTo: Date | undefined,\n now: Date,\n): QueryTracesInput['timeRange'] {\n return {\n from: (dateFrom ?? new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000)).toISOString(),\n to: (dateTo ?? now).toISOString(),\n };\n}\n","import type { EntityType } from '@mastra/core/observability';\nimport type { ListTracesArgs } from '@mastra/core/storage';\nimport { ROOT_ENTITY_TYPES } from '@mastra/react/hooks/traces';\nimport type { TraceListMode, TraceMetadataFilterField } from '@mastra/react/hooks/traces';\nimport {\n ActivityIcon,\n BoxIcon,\n BracesIcon,\n BuildingIcon,\n ClockIcon,\n CloudIcon,\n CpuIcon,\n FingerprintIcon,\n FlagIcon,\n FlaskConicalIcon,\n GaugeIcon,\n GitBranchIcon,\n GlobeIcon,\n HashIcon,\n LayersIcon,\n MessageCircleIcon,\n MessageSquareIcon,\n OctagonIcon,\n PercentIcon,\n PlayIcon,\n RadioIcon,\n ServerIcon,\n ShapesIcon,\n StarIcon,\n TagIcon,\n TagsIcon,\n ThumbsUpIcon,\n TimerIcon,\n TriangleAlertIcon,\n UserIcon,\n WaypointsIcon,\n} from 'lucide-react';\nimport type { LucideIcon } from 'lucide-react';\nimport {\n isTraceFilterGroup,\n isTraceFilterOperatorId,\n TRACE_QUERY_NUMERIC_FIELD_IDS,\n TRACE_QUERY_UNSUPPORTED_FILTER_FIELDS,\n} from './trace-query-filters';\nimport type {\n TraceFilterGroup,\n TraceFilterNode,\n TraceFilterOperatorId,\n TraceFilterToken,\n TraceQueryRelatedScope,\n} from './trace-query-filters';\nimport type { TraceDatePreset } from './types';\nimport { isFilterBarGroup } from '@/ds/components/FilterBar/types';\nimport type {\n FilterBarExpression,\n FilterBarField,\n FilterBarGroup,\n FilterBarItem,\n FilterBarOperator,\n FilterBarSuggestionsResolver,\n} from '@/ds/components/FilterBar/types';\nimport type { PropertyFilterToken } from '@/ds/components/PropertyFilter/types';\n\nexport type {\n TraceFilterGroup,\n TraceFilterLogic,\n TraceFilterNode,\n TraceFilterOperatorId,\n TraceFilterToken,\n TraceQueryRelatedScope,\n} from './trace-query-filters';\nexport { isTraceFilterGroup } from './trace-query-filters';\n\ntype EntityTypeValue = `${EntityType}`;\n\nexport type EntityOptions = { label: string; entityType: EntityTypeValue };\n\nexport { ROOT_ENTITY_TYPES };\n\nexport const ROOT_ENTITY_TYPE_OPTIONS = [\n { label: 'Agent', entityType: ROOT_ENTITY_TYPES.AGENT },\n { label: 'Workflow', entityType: ROOT_ENTITY_TYPES.WORKFLOW },\n { label: 'Scorer', entityType: ROOT_ENTITY_TYPES.SCORER },\n { label: 'Ingest', entityType: ROOT_ENTITY_TYPES.INGEST },\n { label: 'Classifier', entityType: ROOT_ENTITY_TYPES.CLASSIFIER },\n] as const satisfies readonly EntityOptions[];\n\nexport type TraceStatusFilter = 'running' | 'success' | 'error';\n\nexport const TRACE_STATUS_OPTIONS = [\n { label: 'Running', value: 'running' },\n { label: 'Success', value: 'success' },\n { label: 'Error', value: 'error' },\n] as const satisfies readonly { label: string; value: TraceStatusFilter }[];\n\n/** Field ids for \"synthetic\" filter entries — they live in dedicated URL params\n * rather than the generic `filter*` set, but appear as rows in the Filter\n * popover so users can manage all filters from one place. */\nexport const TRACE_SYNTHETIC_FILTER_FIELD_IDS = ['rootEntityType', 'status'] as const;\n\n/** Discovered `metadata.<key>` fields are dynamic, so they use a prefix-based URL\n * scheme (`filterMetadata.<key>`) instead of the fixed `filter*` param map. */\nexport const TRACE_METADATA_FILTER_FIELD_PREFIX = 'metadata.';\nexport const TRACE_METADATA_FILTER_PARAM_PREFIX = 'filterMetadata.';\n\nexport const isTraceMetadataFieldId = (fieldId: string) =>\n fieldId.startsWith(TRACE_METADATA_FILTER_FIELD_PREFIX) && fieldId.length > TRACE_METADATA_FILTER_FIELD_PREFIX.length;\n\nconst isTraceMetadataParam = (param: string) =>\n param.startsWith(TRACE_METADATA_FILTER_PARAM_PREFIX) && param.length > TRACE_METADATA_FILTER_PARAM_PREFIX.length;\n\nexport const metadataFieldIdToParam = (fieldId: string) =>\n TRACE_METADATA_FILTER_PARAM_PREFIX + fieldId.slice(TRACE_METADATA_FILTER_FIELD_PREFIX.length);\n\nexport const metadataParamToFieldId = (param: string) =>\n TRACE_METADATA_FILTER_FIELD_PREFIX + param.slice(TRACE_METADATA_FILTER_PARAM_PREFIX.length);\n\nexport const TRACE_ROOT_ENTITY_TYPE_PARAM = 'rootEntityType';\nexport const TRACE_STATUS_PARAM = 'status';\n\n/** Synthetic fields keep their own URL param instead of a `filterX` one. */\nconst TRACE_SYNTHETIC_PARAM_BY_FIELD: Record<string, string> = {\n rootEntityType: TRACE_ROOT_ENTITY_TYPE_PARAM,\n status: TRACE_STATUS_PARAM,\n};\n\nexport const TRACE_LIST_MODE_PARAM = 'listMode';\n/** Branch-mode only: identifies the anchor span that defines the displayed subtree.\n * Stable across intra-panel span navigation (which only changes `spanId`). */\nexport const TRACE_ANCHOR_SPAN_ID_PARAM = 'anchorSpanId';\nexport const TRACE_LIST_MODE_VALUES = new Set(['traces', 'branches'] as const);\nexport type { TraceListMode };\n\nexport const TRACE_LIST_MODE_OPTIONS = [\n { label: 'Traces (default)', value: 'traces' },\n { label: 'Branches', value: 'branches' },\n] as const satisfies readonly { label: string; value: TraceListMode }[];\nexport const TRACE_DATE_PRESET_PARAM = 'datePreset';\nexport const TRACE_DATE_FROM_PARAM = 'dateFrom';\nexport const TRACE_DATE_TO_PARAM = 'dateTo';\n\nexport const TRACE_DATE_PRESET_VALUES = new Set<TraceDatePreset>([\n 'all',\n 'last-24h',\n 'last-3d',\n 'last-7d',\n 'last-14d',\n 'last-30d',\n 'custom',\n]);\n\nexport const TRACE_PROPERTY_FILTER_PARAM_BY_FIELD = {\n tags: 'filterTags',\n entityId: 'filterEntityId',\n entityName: 'filterEntityName',\n traceId: 'filterTraceId',\n durationMs: 'filterDurationMs',\n timeToFirstChunkMs: 'filterTimeToFirstChunkMs',\n timeToFirstTokenMs: 'filterTimeToFirstTokenMs',\n runId: 'filterRunId',\n threadId: 'filterThreadId',\n sessionId: 'filterSessionId',\n requestId: 'filterRequestId',\n resourceId: 'filterResourceId',\n userId: 'filterUserId',\n organizationId: 'filterOrganizationId',\n serviceName: 'filterServiceName',\n environment: 'filterEnvironment',\n experimentId: 'filterExperimentId',\n outcome: 'filterOutcome',\n stopReason: 'filterStopReason',\n 'spans.name': 'filterSpanName',\n 'spans.spanType': 'filterSpanType',\n 'spans.model': 'filterSpanModel',\n 'spans.provider': 'filterSpanProvider',\n 'spans.durationMs': 'filterSpanDurationMs',\n 'spans.timeToFirstChunkMs': 'filterSpanTimeToFirstChunkMs',\n 'spans.timeToFirstTokenMs': 'filterSpanTimeToFirstTokenMs',\n 'spans.error': 'filterSpanError',\n 'scores.scorerId': 'filterScorerId',\n 'scores.score': 'filterScore',\n 'feedback.feedbackType': 'filterFeedbackType',\n 'feedback.value': 'filterFeedbackValue',\n 'feedback.comment': 'filterFeedbackComment',\n} as const;\n\nexport const TRACE_PROPERTY_FILTER_FIELD_IDS = Object.keys(TRACE_PROPERTY_FILTER_PARAM_BY_FIELD) as Array<\n keyof typeof TRACE_PROPERTY_FILTER_PARAM_BY_FIELD\n>;\n\n/** The operator of a filter lives in a sibling `<valueParam>.op` param; omitted\n * means the default (`is`). Metadata keys cannot contain dots, so the suffix is\n * unambiguous. */\nexport const TRACE_FILTER_OPERATOR_PARAM_SUFFIX = '.op';\nexport const traceFilterOperatorParam = (valueParam: string) => valueParam + TRACE_FILTER_OPERATOR_PARAM_SUFFIX;\nconst isTraceFilterOperatorParam = (param: string) => param.endsWith(TRACE_FILTER_OPERATOR_PARAM_SUFFIX);\n\nconst isPresenceOperator = (operatorId: TraceFilterOperatorId | undefined) =>\n operatorId === 'exists' || operatorId === 'notExists';\nconst isManyOperator = (operatorId: TraceFilterOperatorId | undefined) => operatorId === 'in' || operatorId === 'notIn';\n\n/** Default operator for a token without one: arrays mean set membership. */\nexport const traceFilterTokenOperator = (token: TraceFilterToken): TraceFilterOperatorId =>\n token.operatorId ?? (Array.isArray(token.value) ? 'in' : 'is');\n\n/** The legacy pick-multi neutral value. A text-match literal `Any` is a real word, not the sentinel. */\nexport const isLegacyAnyValue = (value: unknown, operatorId: TraceFilterOperatorId): boolean =>\n value === 'Any' && operatorId !== 'matches' && operatorId !== 'notMatches';\n\nconst readTraceFilterOperator = (searchParams: URLSearchParams, valueParam: string) => {\n const raw = searchParams.get(traceFilterOperatorParam(valueParam));\n return raw !== null && isTraceFilterOperatorId(raw) ? raw : undefined;\n};\n\nexport const TRACE_STATUS_VALUES = new Set<TraceStatusFilter>(['running', 'success', 'error']);\n\nexport const DEFAULT_TRACE_FILTERS_STORAGE_KEY = 'mastra:traces:saved-filters';\n\n/** Serialize the filter-related URL params (relative date preset + rootEntityType +\n * status + generic filterX set) to localStorage so the user can restore them on next\n * visit. A `custom` absolute range is never saved: it would be stale by the next visit.\n * An empty set clears the key. Throws no errors — storage being unavailable is fine. */\nexport function saveTraceFiltersToStorage(\n params: URLSearchParams,\n storageKey: string = DEFAULT_TRACE_FILTERS_STORAGE_KEY,\n): void {\n const serialized = getPreservedTraceFilterParams(params);\n const preset = params.get(TRACE_DATE_PRESET_PARAM);\n if (preset && preset !== 'custom') serialized.set(TRACE_DATE_PRESET_PARAM, preset);\n // An empty group is editor state (popover still open), not a filter worth restoring.\n const groups = getTraceFilterGroups(serialized).filter(group => group.nodes.length > 0);\n serialized.delete(TRACE_FILTER_GROUP_PARAM);\n for (const group of groups) serialized.append(TRACE_FILTER_GROUP_PARAM, serializeTraceFilterGroup(group));\n\n if (!serialized.toString()) {\n clearSavedTraceFilters(storageKey);\n return;\n }\n\n try {\n localStorage.setItem(storageKey, serialized.toString());\n } catch {\n // localStorage may be unavailable (private mode / quota) — silently skip.\n }\n}\n\n/** Forget any previously saved filter set. Called from the \"Remove filters\"\n * action so the next plain sidebar nav lands on an empty page. */\nexport function clearSavedTraceFilters(storageKey: string = DEFAULT_TRACE_FILTERS_STORAGE_KEY): void {\n try {\n localStorage.removeItem(storageKey);\n } catch {\n // ignore — storage may be unavailable\n }\n}\n\n/** Read a previously saved filter set and return it as URLSearchParams, or\n * null if nothing is saved or storage is unavailable. */\nexport function loadTraceFiltersFromStorage(\n storageKey: string = DEFAULT_TRACE_FILTERS_STORAGE_KEY,\n): URLSearchParams | null {\n try {\n const raw = localStorage.getItem(storageKey);\n if (!raw) return null;\n const parsed = new URLSearchParams(raw);\n return parsed.toString() ? parsed : null;\n } catch {\n return null;\n }\n}\n\n/** True when `params` carries any filter-related key — used to decide whether\n * to hydrate from localStorage on page mount (we only hydrate when the URL is\n * filter-clean, i.e. the user landed here via a plain sidebar nav). */\nexport function hasAnyTraceFilterParams(params: URLSearchParams): boolean {\n if (params.has(TRACE_DATE_PRESET_PARAM)) return true;\n if (params.has(TRACE_DATE_FROM_PARAM)) return true;\n if (params.has(TRACE_DATE_TO_PARAM)) return true;\n if (params.has(TRACE_ROOT_ENTITY_TYPE_PARAM)) return true;\n if (params.has(TRACE_STATUS_PARAM)) return true;\n if (params.has(TRACE_LIST_MODE_PARAM)) return true;\n if (params.has(TRACE_FILTER_GROUP_PARAM)) return true;\n for (const fieldId of TRACE_PROPERTY_FILTER_FIELD_IDS) {\n if (params.has(TRACE_PROPERTY_FILTER_PARAM_BY_FIELD[fieldId])) return true;\n }\n for (const param of params.keys()) {\n if (isTraceMetadataParam(param)) return true;\n }\n return false;\n}\n\n/** Every operator the trace query API supports, keyed by the UI id that goes in the URL. */\nexport const TRACE_FILTER_BAR_OPERATORS: (FilterBarOperator & { id: TraceFilterOperatorId })[] = [\n { id: 'is', label: 'is', widensTo: 'in' },\n { id: 'isNot', label: 'is not', widensTo: 'notIn' },\n { id: 'in', label: 'is any of', arity: 'many' },\n { id: 'notIn', label: 'is none of', arity: 'many' },\n { id: 'exists', label: 'exists', arity: 'none' },\n { id: 'notExists', label: 'does not exist', arity: 'none' },\n { id: 'gt', label: 'greater than' },\n { id: 'gte', label: 'at least' },\n { id: 'lt', label: 'less than' },\n { id: 'lte', label: 'at most' },\n { id: 'matches', label: 'matches', freeText: true },\n { id: 'notMatches', label: 'does not match', freeText: true },\n];\n\nexport const TRACE_STRING_OPERATORS: TraceFilterOperatorId[] = ['is', 'isNot', 'in', 'notIn', 'exists', 'notExists'];\n/** Human-written text fields also support case-insensitive word matching. */\nexport const TRACE_TEXT_OPERATORS: TraceFilterOperatorId[] = [...TRACE_STRING_OPERATORS, 'matches', 'notMatches'];\n/** Fields every trace carries (`traceId`, `entityName`): presence operators would never be false. */\nexport const TRACE_REQUIRED_STRING_OPERATORS: TraceFilterOperatorId[] = ['is', 'isNot', 'in', 'notIn'];\nexport const TRACE_NUMBER_OPERATORS: TraceFilterOperatorId[] = [\n 'is',\n 'isNot',\n 'gt',\n 'gte',\n 'lt',\n 'lte',\n 'exists',\n 'notExists',\n];\n/** Root duration: only ranges make sense on a millisecond value. */\nconst TRACE_ROOT_DURATION_OPERATORS: TraceFilterOperatorId[] = ['gt', 'gte', 'lt', 'lte'];\nexport const TRACE_PRESENCE_OPERATORS: TraceFilterOperatorId[] = ['exists', 'notExists'];\nexport const TRACE_TAGS_OPERATORS: TraceFilterOperatorId[] = ['in', 'notIn', 'exists', 'notExists'];\nconst TRACE_TAGS_OPERATOR_TO_QUERY_OP: Partial<Record<TraceFilterOperatorId, string>> = {\n in: 'includes',\n notIn: 'notIncludes',\n exists: 'exists',\n notExists: 'notExists',\n};\n\n/** Structural subset of a discovery `canonicalFields` entry. */\nexport type TraceQueryCanonicalFieldDescriptor = {\n path: string;\n operators: readonly string[];\n valueSuggestions: boolean;\n};\n/** Synthetic fields live in a single dedicated URL param, so they cannot carry an operator. */\nexport const TRACE_SYNTHETIC_OPERATORS: TraceFilterOperatorId[] = ['is', 'in'];\n// The legacy list endpoint only matches by equality.\nconst TRACE_LEGACY_OPERATORS: TraceFilterOperatorId[] = ['is'];\n\nexport const TRACE_FILTER_BAR_LABELS: Record<string, string> = {\n rootEntityType: 'Primitive type',\n entityName: 'Primitive name',\n entityId: 'Primitive ID',\n status: 'Status',\n outcome: 'Outcome',\n stopReason: 'Stop reason',\n tags: 'Tags',\n serviceName: 'Service Name',\n environment: 'Environment',\n traceId: 'Trace ID',\n runId: 'Run ID',\n threadId: 'Thread ID',\n sessionId: 'Session ID',\n requestId: 'Request ID',\n resourceId: 'Resource ID',\n userId: 'User ID',\n organizationId: 'Organization ID',\n experimentId: 'Experiment ID',\n 'spans.name': 'Span name',\n 'spans.spanType': 'Span type',\n 'spans.model': 'Span Model',\n 'spans.provider': 'Provider',\n durationMs: 'Duration (ms)',\n timeToFirstChunkMs: 'Time to first chunk (ms)',\n timeToFirstTokenMs: 'Time to first token (ms)',\n 'spans.durationMs': 'Span duration (ms)',\n 'spans.timeToFirstChunkMs': 'Span time to first chunk (ms)',\n 'spans.timeToFirstTokenMs': 'Span time to first token (ms)',\n 'spans.error': 'Span error',\n 'scores.scorerId': 'Scorer',\n 'scores.score': 'Score',\n 'feedback.feedbackType': 'Feedback type',\n 'feedback.value': 'Feedback value',\n 'feedback.comment': 'Feedback comment',\n};\n\nconst TRACE_FILTER_BAR_FIELD_ICONS: Record<string, LucideIcon> = {\n timeRange: ClockIcon,\n rootEntityType: BoxIcon,\n entityName: TagIcon,\n entityId: FingerprintIcon,\n status: ActivityIcon,\n outcome: FlagIcon,\n stopReason: OctagonIcon,\n tags: TagsIcon,\n serviceName: ServerIcon,\n environment: GlobeIcon,\n traceId: WaypointsIcon,\n runId: PlayIcon,\n threadId: MessageSquareIcon,\n sessionId: LayersIcon,\n requestId: RadioIcon,\n resourceId: HashIcon,\n userId: UserIcon,\n organizationId: BuildingIcon,\n experimentId: FlaskConicalIcon,\n 'spans.name': GitBranchIcon,\n 'spans.spanType': ShapesIcon,\n 'spans.model': CpuIcon,\n 'spans.provider': CloudIcon,\n durationMs: TimerIcon,\n timeToFirstChunkMs: TimerIcon,\n timeToFirstTokenMs: TimerIcon,\n 'spans.durationMs': TimerIcon,\n 'spans.timeToFirstChunkMs': TimerIcon,\n 'spans.timeToFirstTokenMs': TimerIcon,\n 'spans.error': TriangleAlertIcon,\n 'scores.scorerId': GaugeIcon,\n 'scores.score': PercentIcon,\n 'feedback.feedbackType': ThumbsUpIcon,\n 'feedback.value': StarIcon,\n 'feedback.comment': MessageCircleIcon,\n};\n\n/** Which optional trace query fields the server declares support for. */\nexport type TraceQueryFieldSupport = {\n /** Root `durationMs`, declared by `traceQueryRootDuration`. */\n withRootDuration?: boolean;\n /** Root and span `timeToFirstChunkMs`, declared by `traceQueryTimeToFirstChunk`. */\n withTimeToFirstChunk?: boolean;\n /** Root and span `timeToFirstTokenMs`, declared by `traceQueryTimeToFirstToken`. */\n withTimeToFirstToken?: boolean;\n /** Root `outcome` and `stopReason`, declared by `traceQueryOutcomeFields`. */\n withOutcomeFields?: boolean;\n};\n\nconst ROOT_DURATION_FIELD_IDS = ['durationMs'];\nconst OUTCOME_FIELD_IDS = ['outcome', 'stopReason'];\nconst TIME_TO_FIRST_CHUNK_FIELD_IDS = ['timeToFirstChunkMs', 'spans.timeToFirstChunkMs'];\nconst TIME_TO_FIRST_TOKEN_FIELD_IDS = ['timeToFirstTokenMs', 'spans.timeToFirstTokenMs'];\n\n/** The optional fields this server can't query: each needs its capability. */\nexport const traceQueryUnqueryableFieldIds = ({\n withRootDuration = false,\n withTimeToFirstChunk = false,\n withTimeToFirstToken = false,\n withOutcomeFields = false,\n}: TraceQueryFieldSupport): ReadonlySet<string> =>\n new Set([\n ...(withRootDuration ? [] : ROOT_DURATION_FIELD_IDS),\n ...(withOutcomeFields ? [] : OUTCOME_FIELD_IDS),\n ...(withTimeToFirstChunk ? [] : TIME_TO_FIRST_CHUNK_FIELD_IDS),\n ...(withTimeToFirstToken ? [] : TIME_TO_FIRST_TOKEN_FIELD_IDS),\n ]);\n\n/** Which streaming timings the store records. Spans and threads query them without a prefix. */\nexport type StreamingTimingSupport = Required<\n Pick<TraceQueryFieldSupport, 'withTimeToFirstChunk' | 'withTimeToFirstToken'>\n>;\n\n/** `fieldIds` without the streaming timings the store doesn't record: the query rejects a condition on one. */\nexport function withoutUnrecordedStreamingTimings(\n fieldIds: ReadonlySet<string>,\n { withTimeToFirstChunk, withTimeToFirstToken }: StreamingTimingSupport,\n): ReadonlySet<string> {\n if (withTimeToFirstChunk && withTimeToFirstToken) return fieldIds;\n return new Set(\n [...fieldIds].filter(\n id =>\n (withTimeToFirstChunk || id !== 'timeToFirstChunkMs') && (withTimeToFirstToken || id !== 'timeToFirstTokenMs'),\n ),\n );\n}\n\nexport const traceFilterFieldIcon = (fieldId: string) => TRACE_FILTER_BAR_FIELD_ICONS[fieldId];\n\n/** Shared neutral accent for built-in, time-range, and dynamic filters. */\nexport const traceFilterFieldColor = (_fieldId: string) => 'var(--muted-foreground)';\n\nconst traceFieldBase = (id: string) => ({\n id,\n label: TRACE_FILTER_BAR_LABELS[id] ?? id,\n icon: traceFilterFieldIcon(id),\n color: traceFilterFieldColor(id),\n});\n\nconst TRACE_FILTER_BAR_TEXT_FIELD_IDS = [\n 'entityId',\n 'traceId',\n 'runId',\n 'threadId',\n 'sessionId',\n 'requestId',\n 'resourceId',\n 'userId',\n 'organizationId',\n 'experimentId',\n] as const;\n\nconst TRACE_FILTER_BAR_RELATED_FIELD_IDS = [\n 'spans.name',\n 'spans.spanType',\n 'spans.model',\n 'spans.provider',\n 'spans.durationMs',\n 'spans.timeToFirstChunkMs',\n 'spans.timeToFirstTokenMs',\n 'spans.error',\n 'scores.scorerId',\n 'scores.score',\n 'feedback.feedbackType',\n 'feedback.value',\n 'feedback.comment',\n] as const;\ntype TraceFilterRelatedFieldId = (typeof TRACE_FILTER_BAR_RELATED_FIELD_IDS)[number];\n\nconst TRACE_FILTER_BAR_PRESENCE_FIELD_IDS = new Set<string>(['spans.error']);\nconst TRACE_FILTER_BAR_TEXT_MATCH_FIELD_IDS = new Set<string>(['spans.name', 'feedback.comment']);\n/** Free text with no value discovery: the values endpoint rejects these paths. */\nconst TRACE_FILTER_BAR_FREE_TEXT_RELATED_FIELD_IDS = new Set<string>(['feedback.comment']);\n\nconst byLabel = (a: FilterBarField, b: FilterBarField) => a.label.localeCompare(b.label);\n\n/** Outcome and stop reason: free text (custom spans set arbitrary values) with discovered suggestions. */\nexport function createOutcomeFilterBarFields(\n base: (id: string) => Pick<FilterBarField, 'id' | 'label' | 'icon' | 'color'>,\n valueSuggestions?: (path: string) => FilterBarSuggestionsResolver | undefined,\n): FilterBarField[] {\n return (['outcome', 'stopReason'] as const).map(id => {\n const suggestions = valueSuggestions?.(id);\n return {\n ...base(id),\n operators: TRACE_STRING_OPERATORS,\n ...(id === 'outcome' ? { operatorLabels: { notExists: 'is not recorded' } } : {}),\n ...(suggestions ? { suggestions } : {}),\n };\n });\n}\n\n/** The Tags field, or `undefined` until the backend describes `tags`: its operators\n * can't be inferred safely from the static catalog. Only UI operators whose query\n * operator the backend accepts are offered, and suggestions are wired only when the\n * backend says the field has them. */\nfunction createTagsFilterBarField(\n canonicalTraceFields: readonly TraceQueryCanonicalFieldDescriptor[],\n valueSuggestions?: (scope: 'trace', path: string) => FilterBarSuggestionsResolver,\n): FilterBarField | undefined {\n const descriptor = canonicalTraceFields.find(field => field.path === 'tags');\n if (!descriptor) return undefined;\n\n const operators = TRACE_TAGS_OPERATORS.filter(op =>\n descriptor.operators.includes(TRACE_TAGS_OPERATOR_TO_QUERY_OP[op] ?? ''),\n );\n if (operators.length === 0) return undefined;\n\n const suggestions = descriptor.valueSuggestions ? valueSuggestions?.('trace', 'tags') : undefined;\n return { ...traceFieldBase('tags'), operators, ...(suggestions ? { suggestions } : {}) };\n}\n\n/** FilterBar field definitions for the trace pages. Fields the query API cannot\n * filter on (see `TRACE_QUERY_UNSUPPORTED_FILTER_FIELDS`) are omitted, as is the\n * `running` status, so no chip advertises a filter that has no effect. Hidden\n * fields are never offered in the input's field step but still label existing\n * (e.g. scoped, read-only) chips. */\nexport function createTraceFilterBarFields({\n availableRootEntityNames,\n availableEnvironments,\n hiddenFieldIds = [],\n metadataFields = [],\n canonicalTraceFields = [],\n valueSuggestions,\n withQueryTrace = true,\n ...support\n}: TraceQueryFieldSupport & {\n /** Trace-scope field descriptors from the query discovery endpoint. Empty when discovery is unavailable. */\n canonicalTraceFields?: readonly TraceQueryCanonicalFieldDescriptor[];\n availableRootEntityNames: string[];\n availableEnvironments: string[];\n hiddenFieldIds?: readonly string[];\n /** Discovered `metadata.<key>` paths with a lazy value-suggestions resolver each. */\n metadataFields?: readonly TraceMetadataFilterField[];\n /** Builds a lazy value resolver for a related-scope field (`spans.model`, …). Absent → free text. */\n valueSuggestions?: (scope: TraceQueryRelatedScope | 'trace', path: string) => FilterBarSuggestionsResolver;\n /**\n * When false, only fields the legacy list endpoint (`buildTraceListFilters`) can express are offered, each with\n * the `is` operator only: no related-scope (`spans.*`, `scores.*`, `feedback.*`) or metadata fields.\n */\n withQueryTrace?: boolean;\n}): FilterBarField[] {\n const pick = (\n id: string,\n suggestions: { value: string; label?: string }[],\n operators: TraceFilterOperatorId[] = TRACE_STRING_OPERATORS,\n ): FilterBarField => ({\n ...traceFieldBase(id),\n operators,\n strict: true,\n suggestions,\n });\n const text = (id: string): FilterBarField => ({\n ...traceFieldBase(id),\n operators: id === 'traceId' ? TRACE_REQUIRED_STRING_OPERATORS : TRACE_STRING_OPERATORS,\n });\n const relatedPick = (id: TraceFilterRelatedFieldId): FilterBarField => {\n const [scope, path] = id.split('.') as [TraceQueryRelatedScope, string];\n const resolver = TRACE_FILTER_BAR_FREE_TEXT_RELATED_FIELD_IDS.has(id) ? undefined : valueSuggestions?.(scope, path);\n return {\n ...traceFieldBase(id),\n operators: TRACE_FILTER_BAR_TEXT_MATCH_FIELD_IDS.has(id) ? TRACE_TEXT_OPERATORS : TRACE_STRING_OPERATORS,\n ...(resolver ? { strict: true, suggestions: resolver } : {}),\n };\n };\n const number = (id: string): FilterBarField => ({\n ...traceFieldBase(id),\n type: 'number',\n operators: TRACE_NUMBER_OPERATORS,\n });\n const presence = (id: string): FilterBarField => ({ ...traceFieldBase(id), operators: TRACE_PRESENCE_OPERATORS });\n\n const pickFields: FilterBarField[] = [\n pick(\n 'rootEntityType',\n ROOT_ENTITY_TYPE_OPTIONS.map(o => ({ value: o.entityType, label: o.label })),\n TRACE_SYNTHETIC_OPERATORS,\n ),\n pick(\n 'entityName',\n availableRootEntityNames.map(name => ({ value: name })),\n TRACE_REQUIRED_STRING_OPERATORS,\n ),\n pick(\n 'status',\n TRACE_STATUS_OPTIONS.filter(o => o.value !== 'running').map(o => ({ value: o.value, label: o.label })),\n TRACE_SYNTHETIC_OPERATORS,\n ),\n pick(\n 'environment',\n availableEnvironments.map(env => ({ value: env })),\n ),\n ];\n const textFields = TRACE_FILTER_BAR_TEXT_FIELD_IDS.map(text);\n const relatedFields = (['spans', 'scores', 'feedback'] as const).flatMap(scope =>\n TRACE_FILTER_BAR_RELATED_FIELD_IDS.filter(id => id.startsWith(`${scope}.`))\n .map(id => {\n if (TRACE_QUERY_NUMERIC_FIELD_IDS.has(id)) return number(id);\n if (TRACE_FILTER_BAR_PRESENCE_FIELD_IDS.has(id)) return presence(id);\n return relatedPick(id);\n })\n .sort(byLabel),\n );\n const metadataBarFields: FilterBarField[] = metadataFields\n .filter(({ path }) => isTraceMetadataFieldId(path))\n .map(({ path, suggestions }) => ({\n id: path,\n label: path.slice(TRACE_METADATA_FILTER_FIELD_PREFIX.length),\n icon: BracesIcon,\n color: traceFilterFieldColor(path),\n operators: TRACE_STRING_OPERATORS,\n suggestions,\n }));\n\n const tagsField = createTagsFilterBarField(canonicalTraceFields, valueSuggestions);\n const tagsFields = tagsField ? [tagsField] : [];\n\n const hidden = new Set(hiddenFieldIds);\n const unqueryable = traceQueryUnqueryableFieldIds(support);\n if (!withQueryTrace) {\n return [...pickFields.sort(byLabel), ...textFields.sort(byLabel)].map(field => ({\n ...field,\n operators: TRACE_LEGACY_OPERATORS,\n ...(hidden.has(field.id) ? { hidden: true } : {}),\n }));\n }\n return [\n ...[...pickFields, ...tagsFields].sort(byLabel),\n ...[\n ...textFields,\n { ...number('durationMs'), operators: TRACE_ROOT_DURATION_OPERATORS },\n number('timeToFirstChunkMs'),\n number('timeToFirstTokenMs'),\n ...createOutcomeFilterBarFields(traceFieldBase, path => valueSuggestions?.('trace', path)),\n ].sort(byLabel),\n ...relatedFields,\n ...metadataBarFields.sort(byLabel),\n ]\n .filter(field => !TRACE_QUERY_UNSUPPORTED_FILTER_FIELDS.has(field.id) && !unqueryable.has(field.id))\n .map(field => (hidden.has(field.id) ? { ...field, hidden: true } : field));\n}\n\n/** One FilterBar item per token, keyed by field id so chip order == URL order.\n * Empty values ('' / []) are kept: that's a pending chip whose field was just\n * changed and whose value hasn't been picked yet (the query builder skips it).\n * Only the legacy 'Any' sentinel is mapped back to an empty value. */\nexport function traceTokensToFilterBarItems(tokens: TraceFilterToken[]): FilterBarItem[] {\n return tokens.map(token => ({\n id: token.fieldId,\n fieldId: token.fieldId,\n operatorId: traceFilterTokenOperator(token),\n value: isLegacyAnyValue(token.value, traceFilterTokenOperator(token)) ? '' : token.value,\n }));\n}\n\nexport function filterBarItemsToTraceTokens(items: FilterBarItem[]): TraceFilterToken[] {\n return items.map(filterBarItemToTraceToken);\n}\n\nfunction filterBarItemToTraceToken(item: FilterBarItem): TraceFilterToken {\n const token: TraceFilterToken = {\n fieldId: item.fieldId,\n value: Array.isArray(item.value) ? item.value.map(String) : String(item.value),\n };\n // Only carry a non-default operator so tokens stay minimal (and URLs stay short).\n if (isTraceFilterOperatorId(item.operatorId) && item.operatorId !== traceFilterTokenOperator(token)) {\n token.operatorId = item.operatorId;\n }\n return token;\n}\n\n/** Expression-mode value for the FilterBar: root tokens as items, then one\n * group node per advanced filter. Ids inside groups are carried as-is. */\nexport function traceFiltersToFilterBarExpression(\n tokens: TraceFilterToken[],\n groups: TraceFilterGroup[],\n): FilterBarExpression {\n return { logic: 'and', nodes: [...traceTokensToFilterBarItems(tokens), ...groups.map(traceGroupToFilterBarGroup)] };\n}\n\nfunction traceGroupToFilterBarGroup(group: TraceFilterGroup): FilterBarGroup {\n return {\n id: group.id,\n kind: 'group',\n logic: group.logic,\n nodes: group.nodes.map(node =>\n isTraceFilterGroup(node)\n ? traceGroupToFilterBarGroup(node)\n : {\n id: node.id ?? node.fieldId,\n fieldId: node.fieldId,\n operatorId: traceFilterTokenOperator(node),\n value: isLegacyAnyValue(node.value, traceFilterTokenOperator(node)) ? '' : node.value,\n },\n ),\n };\n}\n\nexport function filterBarExpressionToTraceFilters(expression: FilterBarExpression): {\n tokens: TraceFilterToken[];\n groups: TraceFilterGroup[];\n} {\n const items = expression.nodes.filter((node): node is FilterBarItem => !isFilterBarGroup(node));\n const groups = expression.nodes.filter(isFilterBarGroup).map(filterBarGroupToTraceGroup);\n return { tokens: filterBarItemsToTraceTokens(items), groups };\n}\n\nfunction filterBarGroupToTraceGroup(group: FilterBarGroup): TraceFilterGroup {\n const nodes = group.nodes.map(\n (node): TraceFilterNode =>\n isFilterBarGroup(node) ? filterBarGroupToTraceGroup(node) : { id: node.id, ...filterBarItemToTraceToken(node) },\n );\n // Empty groups are kept: \"Advanced filter…\" emits one and opens its editor, and the\n // FilterBar prunes it itself when the popover closes without any condition.\n return { id: group.id, logic: group.logic, nodes };\n}\n\n/**\n * Read filter tokens from URL search params preserving the order in which each\n * filter was first added (URLSearchParams iterates in insertion order). This\n * is used by the Filter popover + PropertyFilterApplied pills so the UI reflects the\n * order the user created the filters in.\n */\nexport function getTracePropertyFilterTokens(searchParams: URLSearchParams): TraceFilterToken[] {\n const tokens: TraceFilterToken[] = [];\n\n // Map URL param name → fieldId for both generic filterX params and the\n // dedicated synthetic params (rootEntityType, status).\n const paramToFieldId = new Map<string, string>([\n [TRACE_ROOT_ENTITY_TYPE_PARAM, 'rootEntityType'],\n [TRACE_STATUS_PARAM, 'status'],\n ]);\n for (const fieldId of TRACE_PROPERTY_FILTER_FIELD_IDS) {\n paramToFieldId.set(TRACE_PROPERTY_FILTER_PARAM_BY_FIELD[fieldId], fieldId);\n }\n\n const seen = new Set<string>();\n for (const [paramName] of searchParams.entries()) {\n if (isTraceFilterOperatorParam(paramName)) continue;\n const fieldId = isTraceMetadataParam(paramName) ? metadataParamToFieldId(paramName) : paramToFieldId.get(paramName);\n if (!fieldId || seen.has(fieldId)) continue;\n seen.add(fieldId);\n\n const operatorId = readTraceFilterOperator(searchParams, paramName);\n const raw = searchParams.getAll(paramName);\n\n // Presence-only fields can't match a value; a hand-edited URL that gives\n // them one would show a chip for a filter that is never applied. A pending\n // chip (empty value, no operator yet) must still survive the round-trip.\n if (TRACE_FILTER_BAR_PRESENCE_FIELD_IDS.has(fieldId)) {\n if (operatorId ? !isPresenceOperator(operatorId) : Boolean(raw[0])) continue;\n }\n\n if (fieldId === 'tags' || isManyOperator(operatorId)) {\n // An empty `filterTags=` sentinel keeps the pill alive after a Reset\n // (neutral state = no selections) so users can re-pick without losing\n // the pill's position. Non-empty entries are the actual selected values.\n tokens.push({ fieldId, value: raw.filter(Boolean), ...(operatorId ? { operatorId } : {}) });\n continue;\n }\n\n // Text and synthetic single-value fields: include empty strings so\n // pending-but-not-yet-filled filters survive URL round-trips.\n const value = raw[0];\n if (value !== undefined) tokens.push({ fieldId, value, ...(operatorId ? { operatorId } : {}) });\n }\n\n return tokens;\n}\n\nexport function getPreservedTraceFilterParams(searchParams: URLSearchParams) {\n const next = new URLSearchParams();\n\n const preserve = (param: string) => {\n const operatorId = readTraceFilterOperator(searchParams, param);\n const values = searchParams.getAll(param).filter(value => value || isPresenceOperator(operatorId));\n if (!values.length) return;\n for (const value of values) next.append(param, value);\n if (operatorId) next.set(traceFilterOperatorParam(param), operatorId);\n };\n\n preserve(TRACE_ROOT_ENTITY_TYPE_PARAM);\n preserve(TRACE_STATUS_PARAM);\n\n const listMode = searchParams.get(TRACE_LIST_MODE_PARAM);\n if (listMode) next.set(TRACE_LIST_MODE_PARAM, listMode);\n\n for (const fieldId of TRACE_PROPERTY_FILTER_FIELD_IDS) {\n const param = TRACE_PROPERTY_FILTER_PARAM_BY_FIELD[fieldId];\n if (fieldId === 'tags') {\n for (const value of searchParams.getAll(param)) {\n next.append(param, value);\n }\n const operatorId = readTraceFilterOperator(searchParams, param);\n if (operatorId && searchParams.has(param)) next.set(traceFilterOperatorParam(param), operatorId);\n continue;\n }\n preserve(param);\n }\n\n const seenMetadata = new Set<string>();\n for (const param of searchParams.keys()) {\n if (!isTraceMetadataParam(param) || isTraceFilterOperatorParam(param) || seenMetadata.has(param)) continue;\n seenMetadata.add(param);\n preserve(param);\n }\n\n for (const group of getTraceFilterGroups(searchParams)) {\n next.append(TRACE_FILTER_GROUP_PARAM, serializeTraceFilterGroup(group));\n }\n\n return next;\n}\n\n/**\n * Clear all filter params from `params` and re-add them in the given `tokens`\n * order so the URL (and therefore the PropertyFilterApplied pills) reflects the\n * creation order of filters. Handles the generic `filterX` params plus the\n * dedicated synthetic params (rootEntityType, status).\n */\nexport function applyTracePropertyFilterTokens(\n params: URLSearchParams,\n tokens: TraceFilterToken[],\n groups: TraceFilterGroup[] = [],\n) {\n for (const param of Object.values(TRACE_SYNTHETIC_PARAM_BY_FIELD)) {\n params.delete(param);\n params.delete(traceFilterOperatorParam(param));\n }\n params.delete(TRACE_FILTER_GROUP_PARAM);\n for (const fieldId of TRACE_PROPERTY_FILTER_FIELD_IDS) {\n const param = TRACE_PROPERTY_FILTER_PARAM_BY_FIELD[fieldId];\n params.delete(param);\n params.delete(traceFilterOperatorParam(param));\n }\n for (const param of Array.from(params.keys())) {\n if (isTraceMetadataParam(param)) params.delete(param);\n }\n\n for (const token of tokens) {\n const param = isTraceMetadataFieldId(token.fieldId)\n ? metadataFieldIdToParam(token.fieldId)\n : (TRACE_SYNTHETIC_PARAM_BY_FIELD[token.fieldId] ??\n TRACE_PROPERTY_FILTER_PARAM_BY_FIELD[token.fieldId as keyof typeof TRACE_PROPERTY_FILTER_PARAM_BY_FIELD]);\n if (!param) continue;\n\n if (Array.isArray(token.value)) {\n if (token.value.length === 0) {\n // Empty sentinel — keeps the pill visible after Reset.\n params.append(param, '');\n } else {\n for (const value of token.value) {\n params.append(param, value);\n }\n }\n } else {\n // Persist empty / 'Any' values too so neutralized-but-still-visible pills\n // survive URL round-trips. The query builder skips these so neutrals\n // never reach the backend.\n params.set(param, token.value.trim());\n }\n\n // Only `is` is implicit on read. `in` must be written explicitly (except\n // for tags, which are always multi-valued) or a reload would collapse the\n // selection to its first value.\n const operatorId = traceFilterTokenOperator(token);\n const implicit = token.fieldId === 'tags' ? 'in' : 'is';\n if (operatorId !== implicit) params.set(traceFilterOperatorParam(param), operatorId);\n }\n\n for (const group of groups) {\n params.append(TRACE_FILTER_GROUP_PARAM, serializeTraceFilterGroup(group));\n }\n}\n\n/** Root-level advanced filter groups live in a repeatable `filterGroup` param,\n * one compact JSON subtree each. Node ids are part of the payload so the\n * FilterBar keeps chip identity across URL round-trips. */\nexport const TRACE_FILTER_GROUP_PARAM = 'filterGroup';\n\nexport const serializeTraceFilterGroup = (group: TraceFilterGroup): string => JSON.stringify(group);\n\nexport function getTraceFilterGroups(searchParams: URLSearchParams): TraceFilterGroup[] {\n return searchParams\n .getAll(TRACE_FILTER_GROUP_PARAM)\n .map(parseTraceFilterGroupParam)\n .filter((group): group is TraceFilterGroup => group !== undefined);\n}\n\nexport function parseTraceFilterGroupParam(raw: string): TraceFilterGroup | undefined {\n try {\n return parseTraceFilterGroup(JSON.parse(raw));\n } catch {\n return undefined;\n }\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => typeof value === 'object' && value !== null;\n\nconst isStringArray = (value: unknown): value is string[] =>\n Array.isArray(value) && value.every(entry => typeof entry === 'string');\n\nfunction parseTraceFilterGroup(input: unknown): TraceFilterGroup | undefined {\n if (!isRecord(input) || typeof input.id !== 'string') return undefined;\n if (input.logic !== 'and' && input.logic !== 'or') return undefined;\n if (!Array.isArray(input.nodes)) return undefined;\n const nodes = input.nodes.map(parseTraceFilterNode).filter((node): node is TraceFilterNode => node !== undefined);\n return { id: input.id, logic: input.logic, nodes };\n}\n\nfunction parseTraceFilterNode(input: unknown): TraceFilterNode | undefined {\n if (!isRecord(input)) return undefined;\n if ('nodes' in input) return parseTraceFilterGroup(input);\n if (typeof input.id !== 'string' || typeof input.fieldId !== 'string') return undefined;\n if (typeof input.value !== 'string' && !isStringArray(input.value)) return undefined;\n const token: TraceFilterToken = { id: input.id, fieldId: input.fieldId, value: input.value };\n if (typeof input.operatorId === 'string' && isTraceFilterOperatorId(input.operatorId)) {\n token.operatorId = input.operatorId;\n }\n return token;\n}\n\nexport function buildTraceListFilters({\n rootEntityType,\n status,\n dateFrom,\n dateTo,\n tokens,\n}: {\n rootEntityType?: string;\n status?: TraceStatusFilter;\n dateFrom?: Date;\n dateTo?: Date;\n tokens: PropertyFilterToken[];\n}): ListTracesArgs['filters'] {\n const filters: NonNullable<ListTracesArgs['filters']> = {};\n\n if (rootEntityType) {\n filters.entityType = rootEntityType as NonNullable<ListTracesArgs['filters']>['entityType'];\n }\n\n if (status) {\n filters.status = status as NonNullable<ListTracesArgs['filters']>['status'];\n }\n\n if (dateFrom) {\n filters.startedAt = { start: dateFrom };\n }\n\n if (dateTo) {\n filters.endedAt = { end: dateTo };\n }\n\n for (const token of tokens) {\n if (token.fieldId === 'tags') {\n if (Array.isArray(token.value) && token.value.length > 0) {\n filters.tags = token.value;\n } else if (typeof token.value === 'string' && token.value.trim()) {\n // pick-multi tags: single-string token → wrap for the server's array schema.\n filters.tags = [token.value.trim()];\n }\n continue;\n }\n\n if (typeof token.value !== 'string') continue;\n // Skip empty-string tokens (unfilled pending filters) and 'Any'\n // (pick-multi single-select neutral state) so neutrals never reach the\n // backend.\n if (!token.value.trim()) continue;\n if (token.value === 'Any') continue;\n\n switch (token.fieldId) {\n case 'entityId':\n filters.entityId = token.value;\n break;\n case 'entityName':\n filters.entityName = token.value;\n break;\n case 'traceId':\n filters.traceId = token.value;\n break;\n case 'runId':\n filters.runId = token.value;\n break;\n case 'threadId':\n filters.threadId = token.value;\n break;\n case 'sessionId':\n filters.sessionId = token.value;\n break;\n case 'requestId':\n filters.requestId = token.value;\n break;\n case 'resourceId':\n filters.resourceId = token.value;\n break;\n case 'userId':\n filters.userId = token.value;\n break;\n case 'organizationId':\n filters.organizationId = token.value;\n break;\n case 'serviceName':\n filters.serviceName = token.value;\n break;\n case 'environment':\n filters.environment = token.value;\n break;\n case 'experimentId':\n filters.experimentId = token.value;\n break;\n default:\n break;\n }\n }\n\n return filters;\n}\n"],"mappings":"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"}
|