@mastra/playground-ui 67.0.0 → 68.0.0-alpha.1
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-CcPmJPTp.cjs} +8 -8
- package/dist/{DataCodeSection-CZRPsStI.cjs.map → DataCodeSection-CcPmJPTp.cjs.map} +1 -1
- package/dist/{DataCodeSection-Ckd47p_S.js → DataCodeSection-KJRyRD1Q.js} +6 -6
- package/dist/{DataCodeSection-Ckd47p_S.js.map → DataCodeSection-KJRyRD1Q.js.map} +1 -1
- 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-CY1W5LHJ.js → DataPanel-Bv4M17xO.js} +3 -3
- package/dist/{DataPanel-CY1W5LHJ.js.map → DataPanel-Bv4M17xO.js.map} +1 -1
- package/dist/{DataPanel-C0Ll76Ne.cjs → DataPanel-BwB1Oifd.cjs} +3 -3
- package/dist/{DataPanel-C0Ll76Ne.cjs.map → DataPanel-BwB1Oifd.cjs.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-BO-vvvyq.js} +18 -22
- package/dist/FilterBar-BO-vvvyq.js.map +1 -0
- package/dist/{FilterBar-BUd4f7oi.cjs → FilterBar-Buw0tv51.cjs} +18 -22
- package/dist/FilterBar-Buw0tv51.cjs.map +1 -0
- package/dist/KnowledgePageGraph.css +11 -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/{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-BdjH9F7G.js → ask-user-B225wzWc.js} +2 -2
- package/dist/{ask-user-BdjH9F7G.js.map → ask-user-B225wzWc.js.map} +1 -1
- package/dist/{ask-user-C82m_G9W.cjs → ask-user-DdYz56qH.cjs} +2 -2
- package/dist/{ask-user-C82m_G9W.cjs.map → ask-user-DdYz56qH.cjs.map} +1 -1
- 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/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-8kNAJFlj.cjs → combobox-CMx2ayFN.cjs} +3 -3
- package/dist/{combobox-8kNAJFlj.cjs.map → combobox-CMx2ayFN.cjs.map} +1 -1
- package/dist/{combobox-wFudhN8F.js → combobox-CtCK0mNx.js} +3 -3
- package/dist/{combobox-wFudhN8F.js.map → combobox-CtCK0mNx.js.map} +1 -1
- package/dist/{combobox-parts-W7KRQUsV.js → combobox-parts-C1CugUAU.js} +11 -19
- package/dist/combobox-parts-C1CugUAU.js.map +1 -0
- package/dist/{combobox-parts-BZVXwbG7.cjs → combobox-parts-ScKcYjMR.cjs} +10 -18
- package/dist/combobox-parts-ScKcYjMR.cjs.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 +2 -2
- package/dist/components/DateTimePicker.es.js +2 -2
- 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 +2 -2
- package/dist/components/FormFieldBlocks.es.js +2 -2
- 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/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 +3 -3
- package/dist/components/PropertyFilter.es.js +3 -3
- 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 +3 -3
- package/dist/components/Sidebar.es.js +3 -3
- 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 +2 -2
- package/dist/components/ai/tool-call.es.js +2 -2
- 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 +2 -2
- package/dist/domains/chat/activity/model/activity-words.es.js +2 -2
- 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/knowledge-links.cjs.js +40 -0
- package/dist/domains/chat/knowledge/knowledge-links.cjs.js.map +1 -0
- package/dist/domains/chat/knowledge/knowledge-links.d.ts +1 -0
- package/dist/domains/chat/knowledge/knowledge-links.es.js +38 -0
- package/dist/domains/chat/knowledge/knowledge-links.es.js.map +1 -0
- package/dist/domains/chat/knowledge/pinned-knowledge-data.cjs.js +79 -0
- package/dist/domains/chat/knowledge/pinned-knowledge-data.cjs.js.map +1 -0
- package/dist/domains/chat/knowledge/pinned-knowledge-data.d.ts +1 -0
- package/dist/domains/chat/knowledge/pinned-knowledge-data.es.js +77 -0
- package/dist/domains/chat/knowledge/pinned-knowledge-data.es.js.map +1 -0
- package/dist/domains/chat/knowledge/pinned-knowledge.cjs.js +124 -0
- package/dist/domains/chat/knowledge/pinned-knowledge.cjs.js.map +1 -0
- package/dist/domains/chat/knowledge/pinned-knowledge.d.ts +1 -0
- package/dist/domains/chat/knowledge/pinned-knowledge.es.js +123 -0
- package/dist/domains/chat/knowledge/pinned-knowledge.es.js.map +1 -0
- package/dist/domains/chat/knowledge.cjs.js +12 -0
- package/dist/domains/chat/knowledge.d.ts +1 -0
- package/dist/domains/chat/knowledge.es.js +5 -0
- 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 +8 -1
- package/dist/domains/chat/messages/signal-badge.cjs.js.map +1 -1
- package/dist/domains/chat/messages/signal-badge.es.js +8 -1
- package/dist/domains/chat/messages/signal-badge.es.js.map +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 +2 -2
- package/dist/domains/chat/tools/badges/file-tree-badge.es.js +2 -2
- package/dist/domains/chat/tools/badges/knowledge-tool-badge.cjs.js +273 -0
- package/dist/domains/chat/tools/badges/knowledge-tool-badge.cjs.js.map +1 -0
- package/dist/domains/chat/tools/badges/knowledge-tool-badge.d.ts +1 -0
- package/dist/domains/chat/tools/badges/knowledge-tool-badge.es.js +270 -0
- package/dist/domains/chat/tools/badges/knowledge-tool-badge.es.js.map +1 -0
- 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 +2 -2
- package/dist/domains/chat/tools/badges/sandbox-execution-badge.es.js +2 -2
- 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 +4 -4
- package/dist/domains/chat/tools/badges/tool-badge.es.js +4 -4
- package/dist/domains/chat/tools/badges/workflow-badge.cjs.js +4 -4
- package/dist/domains/chat/tools/badges/workflow-badge.es.js +4 -4
- 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-kind.cjs.js +4 -2
- package/dist/domains/chat/tools/tool-card-kind.cjs.js.map +1 -1
- package/dist/domains/chat/tools/tool-card-kind.es.js +4 -2
- package/dist/domains/chat/tools/tool-card-kind.es.js.map +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 +3 -2
- package/dist/domains/chat/tools/tool-groups.cjs.js.map +1 -1
- package/dist/domains/chat/tools/tool-groups.es.js +3 -2
- package/dist/domains/chat/tools/tool-groups.es.js.map +1 -1
- package/dist/domains/chat.cjs.js +11 -0
- package/dist/domains/chat.es.js +5 -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/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 +438 -0
- package/dist/domains/knowledge/components/KnowledgePageDetail.cjs.js.map +1 -0
- package/dist/domains/knowledge/components/KnowledgePageDetail.d.ts +1 -0
- package/dist/domains/knowledge/components/KnowledgePageDetail.es.js +436 -0
- package/dist/domains/knowledge/components/KnowledgePageDetail.es.js.map +1 -0
- package/dist/domains/knowledge/components/KnowledgePageExplorer.cjs.js +521 -0
- package/dist/domains/knowledge/components/KnowledgePageExplorer.cjs.js.map +1 -0
- package/dist/domains/knowledge/components/KnowledgePageExplorer.d.ts +1 -0
- package/dist/domains/knowledge/components/KnowledgePageExplorer.es.js +520 -0
- package/dist/domains/knowledge/components/KnowledgePageExplorer.es.js.map +1 -0
- package/dist/domains/knowledge/components/KnowledgePageGraph.cjs.js +626 -0
- package/dist/domains/knowledge/components/KnowledgePageGraph.cjs.js.map +1 -0
- package/dist/domains/knowledge/components/KnowledgePageGraph.d.ts +1 -0
- package/dist/domains/knowledge/components/KnowledgePageGraph.es.js +625 -0
- package/dist/domains/knowledge/components/KnowledgePageGraph.es.js.map +1 -0
- package/dist/domains/knowledge/components/KnowledgePageTree.cjs.js +170 -0
- package/dist/domains/knowledge/components/KnowledgePageTree.cjs.js.map +1 -0
- package/dist/domains/knowledge/components/KnowledgePageTree.d.ts +1 -0
- package/dist/domains/knowledge/components/KnowledgePageTree.es.js +168 -0
- package/dist/domains/knowledge/components/KnowledgePageTree.es.js.map +1 -0
- package/dist/domains/knowledge/hooks/useInteractionIdle.cjs.js +37 -0
- package/dist/domains/knowledge/hooks/useInteractionIdle.cjs.js.map +1 -0
- package/dist/domains/knowledge/hooks/useInteractionIdle.d.ts +1 -0
- package/dist/domains/knowledge/hooks/useInteractionIdle.es.js +35 -0
- package/dist/domains/knowledge/hooks/useInteractionIdle.es.js.map +1 -0
- package/dist/domains/knowledge/lib/layout.cjs.js +93 -0
- package/dist/domains/knowledge/lib/layout.cjs.js.map +1 -0
- package/dist/domains/knowledge/lib/layout.d.ts +1 -0
- package/dist/domains/knowledge/lib/layout.es.js +92 -0
- package/dist/domains/knowledge/lib/layout.es.js.map +1 -0
- package/dist/domains/knowledge/lib/pageGraph.cjs.js +135 -0
- package/dist/domains/knowledge/lib/pageGraph.cjs.js.map +1 -0
- package/dist/domains/knowledge/lib/pageGraph.d.ts +1 -0
- package/dist/domains/knowledge/lib/pageGraph.es.js +128 -0
- package/dist/domains/knowledge/lib/pageGraph.es.js.map +1 -0
- package/dist/domains/knowledge/lib/pageLayout.cjs.js +49 -0
- package/dist/domains/knowledge/lib/pageLayout.cjs.js.map +1 -0
- package/dist/domains/knowledge/lib/pageLayout.d.ts +1 -0
- package/dist/domains/knowledge/lib/pageLayout.es.js +48 -0
- package/dist/domains/knowledge/lib/pageLayout.es.js.map +1 -0
- package/dist/domains/knowledge/lib/pageTree.cjs.js +98 -0
- package/dist/domains/knowledge/lib/pageTree.cjs.js.map +1 -0
- package/dist/domains/knowledge/lib/pageTree.d.ts +1 -0
- package/dist/domains/knowledge/lib/pageTree.es.js +94 -0
- package/dist/domains/knowledge/lib/pageTree.es.js.map +1 -0
- package/dist/domains/knowledge/lib/popupPlacement.cjs.js +22 -0
- package/dist/domains/knowledge/lib/popupPlacement.cjs.js.map +1 -0
- package/dist/domains/knowledge/lib/popupPlacement.d.ts +1 -0
- package/dist/domains/knowledge/lib/popupPlacement.es.js +21 -0
- package/dist/domains/knowledge/lib/popupPlacement.es.js.map +1 -0
- package/dist/domains/knowledge/lib/recordText.cjs.js +26 -0
- package/dist/domains/knowledge/lib/recordText.cjs.js.map +1 -0
- package/dist/domains/knowledge/lib/recordText.d.ts +1 -0
- package/dist/domains/knowledge/lib/recordText.es.js +25 -0
- package/dist/domains/knowledge/lib/recordText.es.js.map +1 -0
- package/dist/domains/knowledge/pageTypes.cjs.js +0 -0
- package/dist/domains/knowledge/pageTypes.d.ts +1 -0
- package/dist/domains/knowledge/pageTypes.es.js +0 -0
- 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/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/saved-views-provider.cjs.js +3 -2
- package/dist/domains/observability/saved-views/saved-views-provider.cjs.js.map +1 -1
- package/dist/domains/observability/saved-views/saved-views-provider.es.js +3 -2
- package/dist/domains/observability/saved-views/saved-views-provider.es.js.map +1 -1
- package/dist/domains/observability/saved-views/saved-views-source.cjs.js.map +1 -1
- package/dist/domains/observability/saved-views/saved-views-source.es.js.map +1 -1
- package/dist/domains/observability/saved-views/use-hosted-saved-views.cjs.js +3 -2
- package/dist/domains/observability/saved-views/use-hosted-saved-views.cjs.js.map +1 -1
- package/dist/domains/observability/saved-views/use-hosted-saved-views.es.js +3 -2
- package/dist/domains/observability/saved-views/use-hosted-saved-views.es.js.map +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 +4 -4
- package/dist/domains/scores/components/span-scoring.es.js +4 -4
- 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 +4 -4
- package/dist/domains/skills/skill-simple-form.cjs.js.map +1 -1
- package/dist/domains/skills/skill-simple-form.es.js +4 -4
- 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 +5 -5
- package/dist/domains/spans/components/spans-filter-bar.cjs.js.map +1 -1
- package/dist/domains/spans/components/spans-filter-bar.es.js +5 -5
- 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 +5 -5
- package/dist/domains/threads/components/threads-filter-bar.cjs.js.map +1 -1
- package/dist/domains/threads/components/threads-filter-bar.es.js +5 -5
- 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 +3 -3
- package/dist/domains/traces/components/feedback-thread.es.js +3 -3
- 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 +3 -4
- package/dist/domains/traces/components/trace-columns-menu.cjs.js.map +1 -1
- package/dist/domains/traces/components/trace-columns-menu.es.js +3 -4
- package/dist/domains/traces/components/trace-columns-menu.es.js.map +1 -1
- package/dist/domains/traces/components/trace-data-panel-view.cjs.js +4 -4
- package/dist/domains/traces/components/trace-data-panel-view.es.js +4 -4
- 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 +5 -5
- 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 +5 -5
- 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 +2 -2
- package/dist/domains/workflows/components/workflow-combobox.es.js +2 -2
- 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 +1 -1
- package/dist/domains/workflows/workflow/input/workflow-processor-input.es.js +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/use-workflow-trigger.cjs.js +2 -1
- package/dist/domains/workflows/workflow/use-workflow-trigger.cjs.js.map +1 -1
- package/dist/domains/workflows/workflow/use-workflow-trigger.es.js +2 -1
- package/dist/domains/workflows/workflow/use-workflow-trigger.es.js.map +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 +3 -3
- package/dist/domains/workspace/components/workspace-add-skill-dialog.es.js +3 -3
- 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-B4sV4gDm.js} +86 -71
- package/dist/filter-bar-chip-B4sV4gDm.js.map +1 -0
- package/dist/{filter-bar-chip-BUyMf8XQ.cjs → filter-bar-chip-CIEsWcEw.cjs} +88 -79
- package/dist/filter-bar-chip-CIEsWcEw.cjs.map +1 -0
- package/dist/filter-bar-chip.css +22 -0
- package/dist/filter-bar-time-range-CXQMBgpz.js +60 -0
- package/dist/filter-bar-time-range-CXQMBgpz.js.map +1 -0
- package/dist/filter-bar-time-range-DvuaFnkI.cjs +83 -0
- package/dist/filter-bar-time-range-DvuaFnkI.cjs.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/lib/form/dynamic-form.cjs.js +2 -2
- package/dist/lib/form/dynamic-form.cjs.js.map +1 -1
- package/dist/lib/form/dynamic-form.es.js +2 -2
- package/dist/lib/form/dynamic-form.es.js.map +1 -1
- package/dist/lib/form/json-draft.cjs.js +1 -1
- package/dist/lib/form/json-draft.es.js +1 -1
- package/dist/lib/form/zod-provider/compat.cjs.js +8 -0
- package/dist/lib/form/zod-provider/compat.cjs.js.map +1 -1
- package/dist/lib/form/zod-provider/compat.es.js +8 -1
- package/dist/lib/form/zod-provider/compat.es.js.map +1 -1
- package/dist/lib/form/zod-provider.cjs.js +1 -1
- package/dist/lib/form/zod-provider.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-CwCii7hh.cjs → observability-saved-views-BAzxxoAr.cjs} +10 -8
- package/dist/observability-saved-views-BAzxxoAr.cjs.map +1 -0
- package/dist/{observability-saved-views-Bo5kLN20.js → observability-saved-views-BBam8Fr5.js} +10 -8
- package/dist/observability-saved-views-BBam8Fr5.js.map +1 -0
- 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-DqsPFbYM.cjs → property-filter-applied-BCeRLcXb.cjs} +18 -18
- package/dist/{property-filter-applied-DqsPFbYM.cjs.map → property-filter-applied-BCeRLcXb.cjs.map} +1 -1
- package/dist/{property-filter-applied-DRglaEj-.js → property-filter-applied-p3dTTDdb.js} +3 -3
- package/dist/{property-filter-applied-DRglaEj-.js.map → property-filter-applied-p3dTTDdb.js.map} +1 -1
- 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-Dyhbqaa7.js → span-payload-primitives-B3RdahsC.js} +4 -4
- package/dist/{span-payload-primitives-Dyhbqaa7.js.map → span-payload-primitives-B3RdahsC.js.map} +1 -1
- package/dist/{span-payload-primitives-B10Xxmx7.cjs → span-payload-primitives-_2d-pAOD.cjs} +4 -4
- package/dist/{span-payload-primitives-B10Xxmx7.cjs.map → span-payload-primitives-_2d-pAOD.cjs.map} +1 -1
- package/dist/src/domains/chat/index.d.ts +1 -0
- package/dist/src/domains/chat/knowledge/index.d.ts +5 -0
- package/dist/src/domains/chat/knowledge/knowledge-links.d.ts +21 -0
- package/dist/src/domains/chat/knowledge/pinned-knowledge-data.d.ts +22 -0
- package/dist/src/domains/chat/knowledge/pinned-knowledge.d.ts +9 -0
- package/dist/src/domains/chat/tools/badges/knowledge-tool-badge.d.ts +19 -0
- package/dist/src/domains/chat/tools/tool-card-kind.d.ts +2 -2
- package/dist/src/domains/knowledge/components/KnowledgePageDetail.d.ts +42 -0
- package/dist/src/domains/knowledge/components/KnowledgePageExplorer.d.ts +80 -0
- package/dist/src/domains/knowledge/components/KnowledgePageGraph.d.ts +35 -0
- package/dist/src/domains/knowledge/components/KnowledgePageTree.d.ts +27 -0
- package/dist/src/domains/knowledge/hooks/useInteractionIdle.d.ts +12 -0
- package/dist/src/domains/knowledge/lib/layout.d.ts +35 -0
- package/dist/src/domains/knowledge/lib/pageGraph.d.ts +45 -0
- package/dist/src/domains/knowledge/lib/pageLayout.d.ts +24 -0
- package/dist/src/domains/knowledge/lib/pageTree.d.ts +28 -0
- package/dist/src/domains/knowledge/lib/popupPlacement.d.ts +12 -0
- package/dist/src/domains/knowledge/lib/recordText.d.ts +9 -0
- package/dist/src/domains/knowledge/pageTypes.d.ts +96 -0
- package/dist/src/domains/metrics/components/metrics-time-range-chip.d.ts +2 -2
- package/dist/src/domains/observability/saved-views/saved-views-provider.d.ts +6 -1
- package/dist/src/domains/observability/saved-views/saved-views-source.d.ts +1 -0
- package/dist/src/domains/observability/saved-views/use-hosted-saved-views.d.ts +1 -1
- package/dist/src/domains/skills/skill-simple-form.d.ts +3 -1
- 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/SavedViews/saved-view-picker.d.ts +3 -1
- package/dist/src/ds/components/ai/tool-call/tool-phrases.d.ts +30 -0
- package/dist/src/ds/primitives/control-icon.d.ts +3 -0
- package/dist/src/ds/primitives/control-size.d.ts +1 -0
- package/dist/src/lib/form/zod-provider/compat.d.ts +5 -0
- package/dist/style.css +181 -66
- package/dist/{tabbed-container-BKUqfEKy.js → tabbed-container-5j6dhoRX.js} +6 -6
- package/dist/{tabbed-container-BKUqfEKy.js.map → tabbed-container-5j6dhoRX.js.map} +1 -1
- package/dist/{tabbed-container-CFEImJOK.cjs → tabbed-container-DQU7pVio.cjs} +6 -6
- package/dist/{tabbed-container-CFEImJOK.cjs.map → tabbed-container-DQU7pVio.cjs.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-BfjoSNOC.cjs → tool-approval-1qiB4hhG.cjs} +5 -5
- package/dist/{tool-approval-BfjoSNOC.cjs.map → tool-approval-1qiB4hhG.cjs.map} +1 -1
- package/dist/{tool-approval-FeuyUUcL.js → tool-approval-B6MFcaKV.js} +5 -5
- package/dist/{tool-approval-FeuyUUcL.js.map → tool-approval-B6MFcaKV.js.map} +1 -1
- package/dist/{tool-call-CvilN9ti.cjs → tool-call-Bu66PkD-.cjs} +34 -4
- package/dist/{tool-call-CvilN9ti.cjs.map → tool-call-Bu66PkD-.cjs.map} +1 -1
- package/dist/{tool-call-BxYXs9w0.js → tool-call-Ch9-jjXU.js} +34 -4
- package/dist/{tool-call-BxYXs9w0.js.map → tool-call-Ch9-jjXU.js.map} +1 -1
- package/dist/{tool-card-B7O8AsRl.cjs → tool-card-DrqPZfPQ.cjs} +20 -6
- package/dist/tool-card-DrqPZfPQ.cjs.map +1 -0
- package/dist/{tool-card-ELW898uw.js → tool-card-sO6P2Qj4.js} +20 -6
- package/dist/tool-card-sO6P2Qj4.js.map +1 -0
- package/dist/{tool-presentation-BLErsb7c.cjs → tool-presentation-CQlDEwgS.cjs} +26 -1
- package/dist/tool-presentation-CQlDEwgS.cjs.map +1 -0
- package/dist/{tool-presentation-BSZYIWx2.js → tool-presentation-DvCsb_kz.js} +26 -1
- package/dist/tool-presentation-DvCsb_kz.js.map +1 -0
- 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/package.json +12 -10
- package/theme.css +4 -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/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/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-Bo5kLN20.js.map +0 -1
- package/dist/observability-saved-views-CwCii7hh.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/tool-card-B7O8AsRl.cjs.map +0 -1
- package/dist/tool-card-ELW898uw.js.map +0 -1
- package/dist/tool-presentation-BLErsb7c.cjs.map +0 -1
- package/dist/tool-presentation-BSZYIWx2.js.map +0 -1
- package/dist/trace-filters-BJaebsxJ.js.map +0 -1
- package/dist/trace-filters-BNEZ31HX.cjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-spans-filter-bar.cjs.js","names":["useMastraClient","useObservabilityCapabilities","useEntityNames","useEnvironments","useMemo","
|
|
1
|
+
{"version":3,"file":"use-spans-filter-bar.cjs.js","names":["useMastraClient","useObservabilityCapabilities","useEntityNames","useEnvironments","useMemo","FILTER_BAR_TIME_RANGE_FIELD","createSpanFilterBarFields","createTraceQueryValuesResolver","traceTokensToFilterBarItems","traceFiltersToFilterBarExpression","FILTER_BAR_TIME_RANGE_ITEM","useCallback","filterBarExpressionToTraceFilters","isFilterBarGroup"],"sources":["../../../../src/domains/spans/hooks/use-spans-filter-bar.ts"],"sourcesContent":["import { useMastraClient } from '@mastra/react';\nimport { useObservabilityCapabilities } from '@mastra/react/hooks/capabilities';\nimport { createTraceQueryValuesResolver, useEntityNames, useEnvironments } from '@mastra/react/hooks/traces';\nimport type { TraceQueryDiscoveryTimeRange } from '@mastra/react/hooks/traces';\nimport { useCallback, useMemo } from 'react';\nimport {\n filterBarExpressionToTraceFilters,\n traceFiltersToFilterBarExpression,\n traceTokensToFilterBarItems,\n} from '../../traces/trace-filters';\nimport type { TraceFilterGroup, TraceFilterToken } from '../../traces/trace-query-filters';\nimport type { TraceDatePreset } from '../../traces/types';\nimport { createSpanFilterBarFields } from '../span-filters';\nimport { isFilterBarGroup } from '@/ds/components/FilterBar';\nimport type { FilterBarExpression, FilterBarField, FilterBarItem } from '@/ds/components/FilterBar';\nimport {\n FILTER_BAR_TIME_RANGE_FIELD,\n FILTER_BAR_TIME_RANGE_FIELD_ID,\n FILTER_BAR_TIME_RANGE_ITEM,\n} from '@/ds/components/FilterBar/filter-bar-time-range';\n\n/** The time range presets the spans filter bar offers. */\nexport const SPAN_TIME_RANGE_PRESETS: readonly TraceDatePreset[] = [\n 'last-24h',\n 'last-3d',\n 'last-7d',\n 'last-14d',\n 'last-30d',\n 'custom',\n];\n\nconst NO_SUGGESTIONS: string[] = [];\n\nexport type UseSpansFilterBarFieldsOptions = {\n /** Window the value suggestions are looked up in. */\n timeRange: TraceQueryDiscoveryTimeRange;\n};\n\n/**\n * The fields the spans filter bar offers: the time range plus the fields `querySpans()` accepts.\n * Context, model and outcome fields and streaming timings are only included when the store declares them.\n */\nexport function useSpansFilterBarFields({ timeRange }: UseSpansFilterBarFieldsOptions): FilterBarField[] {\n const client = useMastraClient();\n const { data: capabilities } = useObservabilityCapabilities();\n const withContextFields = capabilities?.capabilities.spanQueryContextFields ?? false;\n const withTimeToFirstChunk = capabilities?.capabilities.traceQueryTimeToFirstChunk ?? false;\n const withTimeToFirstToken = capabilities?.capabilities.traceQueryTimeToFirstToken ?? false;\n const withOutcomeFields = capabilities?.capabilities.spanQueryOutcomeFields ?? false;\n const withModelFields = capabilities?.capabilities.spanQueryModelFields ?? false;\n const { data: entityNames = NO_SUGGESTIONS } = useEntityNames();\n const { data: environments = NO_SUGGESTIONS } = useEnvironments();\n\n // Memoized for correctness: static suggestion lists become the value editor's Combobox\n // `items`, which loops if handed a new array on every render.\n return useMemo(\n () => [\n FILTER_BAR_TIME_RANGE_FIELD,\n ...createSpanFilterBarFields({\n withContextFields,\n withTimeToFirstChunk,\n withTimeToFirstToken,\n withOutcomeFields,\n withModelFields,\n entityNames,\n environments,\n valueSuggestions: path => createTraceQueryValuesResolver(client, timeRange, 'spans', path),\n }),\n ],\n [\n withContextFields,\n withTimeToFirstChunk,\n withTimeToFirstToken,\n withOutcomeFields,\n withModelFields,\n entityNames,\n environments,\n client,\n timeRange,\n ],\n );\n}\n\nexport type UseSpansFilterBarOptions = {\n tokens: TraceFilterToken[];\n groups: TraceFilterGroup[];\n onFiltersChange: (tokens: TraceFilterToken[], groups: TraceFilterGroup[]) => void;\n};\n\n/**\n * The span filters as a filter bar value, and the handlers that write bar edits back.\n * The time range is a synthetic, always-present item; it never round-trips to tokens.\n */\nexport function useSpansFilterBar({ tokens, groups, onFiltersChange }: UseSpansFilterBarOptions): {\n filterBarValue: FilterBarExpression;\n onFilterBarChange: (expression: FilterBarExpression) => void;\n /** Replaces any filter on `fieldId` with `is value`, e.g. from a list cell. */\n onFilterByField: (fieldId: string, value: string) => void;\n} {\n const items = useMemo(() => traceTokensToFilterBarItems(tokens), [tokens]);\n\n const filterBarValue = useMemo<FilterBarExpression>(() => {\n const groupsExpression = traceFiltersToFilterBarExpression([], groups);\n return { ...groupsExpression, nodes: [FILTER_BAR_TIME_RANGE_ITEM, ...items, ...groupsExpression.nodes] };\n }, [items, groups]);\n\n const onFilterBarChange = useCallback(\n (expression: FilterBarExpression) => {\n const next = filterBarExpressionToTraceFilters({\n ...expression,\n nodes: expression.nodes.filter(\n node => isFilterBarGroup(node) || node.fieldId !== FILTER_BAR_TIME_RANGE_FIELD_ID,\n ),\n });\n onFiltersChange(next.tokens, next.groups);\n },\n [onFiltersChange],\n );\n\n const onFilterByField = useCallback(\n (fieldId: string, value: string) => {\n const withoutField = items.filter(item => item.fieldId !== fieldId);\n const item: FilterBarItem = { id: `${fieldId}:${value}`, fieldId, operatorId: 'is', value };\n const groupNodes = filterBarValue.nodes.filter(isFilterBarGroup);\n onFilterBarChange({ ...filterBarValue, nodes: [...withoutField, item, ...groupNodes] });\n },\n [items, filterBarValue, onFilterBarChange],\n );\n\n return { filterBarValue, onFilterBarChange, onFilterByField };\n}\n"],"mappings":";;;;;;;;;;;AAsBA,IAAa,0BAAsD;CACjE;CACA;CACA;CACA;CACA;CACA;AACF;AAEA,IAAM,iBAA2B,CAAC;;;;;AAWlC,SAAgB,wBAAwB,EAAE,aAA+D;CACvG,MAAM,UAAA,GAASA,cAAAA,gBAAAA,CAAgB;CAC/B,MAAM,EAAE,MAAM,kBAAA,GAAiBC,iCAAAA,6BAAAA,CAA6B;CAC5D,MAAM,oBAAoB,cAAc,aAAa,0BAA0B;CAC/E,MAAM,uBAAuB,cAAc,aAAa,8BAA8B;CACtF,MAAM,uBAAuB,cAAc,aAAa,8BAA8B;CACtF,MAAM,oBAAoB,cAAc,aAAa,0BAA0B;CAC/E,MAAM,kBAAkB,cAAc,aAAa,wBAAwB;CAC3E,MAAM,EAAE,MAAM,cAAc,oBAAA,GAAmBC,2BAAAA,eAAAA,CAAe;CAC9D,MAAM,EAAE,MAAM,eAAe,oBAAA,GAAmBC,2BAAAA,gBAAAA,CAAgB;CAIhE,QAAA,GAAOC,MAAAA,QAAAA,OACC,CACJC,8BAAAA,6BACA,GAAGC,mCAAAA,0BAA0B;EAC3B;EACA;EACA;EACA;EACA;EACA;EACA;EACA,mBAAkB,UAAA,GAAQC,2BAAAA,+BAAAA,CAA+B,QAAQ,WAAW,SAAS,IAAI;CAC3F,CAAC,CACH,GACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CACF;AACF;;;;;AAYA,SAAgB,kBAAkB,EAAE,QAAQ,QAAQ,mBAKlD;CACA,MAAM,SAAA,GAAQH,MAAAA,QAAAA,OAAcI,sBAAAA,4BAA4B,MAAM,GAAG,CAAC,MAAM,CAAC;CAEzE,MAAM,kBAAA,GAAiBJ,MAAAA,QAAAA,OAAmC;EACxD,MAAM,mBAAmBK,sBAAAA,kCAAkC,CAAC,GAAG,MAAM;EACrE,OAAO;GAAE,GAAG;GAAkB,OAAO;IAACC,8BAAAA;IAA4B,GAAG;IAAO,GAAG,iBAAiB;GAAK;EAAE;CACzG,GAAG,CAAC,OAAO,MAAM,CAAC;CAElB,MAAM,qBAAA,GAAoBC,MAAAA,YAAAA,EACvB,eAAoC;EACnC,MAAM,OAAOC,sBAAAA,kCAAkC;GAC7C,GAAG;GACH,OAAO,WAAW,MAAM,QACtB,SAAQC,cAAAA,iBAAiB,IAAI,KAAK,KAAK,YAAA,WACzC;EACF,CAAC;EACD,gBAAgB,KAAK,QAAQ,KAAK,MAAM;CAC1C,GACA,CAAC,eAAe,CAClB;CAYA,OAAO;EAAE;EAAgB;EAAmB,kBAAA,GAVpBF,MAAAA,YAAAA,EACrB,SAAiB,UAAkB;GAClC,MAAM,eAAe,MAAM,QAAO,SAAQ,KAAK,YAAY,OAAO;GAClE,MAAM,OAAsB;IAAE,IAAI,GAAG,QAAQ,GAAG;IAAS;IAAS,YAAY;IAAM;GAAM;GAC1F,MAAM,aAAa,eAAe,MAAM,OAAOE,cAAAA,gBAAgB;GAC/D,kBAAkB;IAAE,GAAG;IAAgB,OAAO;KAAC,GAAG;KAAc;KAAM,GAAG;IAAU;GAAE,CAAC;EACxF,GACA;GAAC;GAAO;GAAgB;EAAiB,CAGC;CAAgB;AAC9D"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { L as filterBarExpressionToTraceFilters, rt as traceTokensToFilterBarItems, tt as traceFiltersToFilterBarExpression } from "../../../trace-filters-
|
|
1
|
+
import { L as filterBarExpressionToTraceFilters, rt as traceTokensToFilterBarItems, tt as traceFiltersToFilterBarExpression } from "../../../trace-filters-CaWkw779.js";
|
|
2
2
|
import { t as isFilterBarGroup } from "../../../types-DiiL5mTO.js";
|
|
3
3
|
import { createSpanFilterBarFields } from "../span-filters.es.js";
|
|
4
|
-
import {
|
|
4
|
+
import { r as FILTER_BAR_TIME_RANGE_ITEM, t as FILTER_BAR_TIME_RANGE_FIELD } from "../../../filter-bar-time-range-CXQMBgpz.js";
|
|
5
5
|
import { useCallback, useMemo } from "react";
|
|
6
6
|
import { useMastraClient } from "@mastra/react";
|
|
7
7
|
import { useObservabilityCapabilities } from "@mastra/react/hooks/capabilities";
|
|
@@ -31,7 +31,7 @@ function useSpansFilterBarFields({ timeRange }) {
|
|
|
31
31
|
const withModelFields = capabilities?.capabilities.spanQueryModelFields ?? false;
|
|
32
32
|
const { data: entityNames = NO_SUGGESTIONS } = useEntityNames();
|
|
33
33
|
const { data: environments = NO_SUGGESTIONS } = useEnvironments();
|
|
34
|
-
return useMemo(() => [
|
|
34
|
+
return useMemo(() => [FILTER_BAR_TIME_RANGE_FIELD, ...createSpanFilterBarFields({
|
|
35
35
|
withContextFields,
|
|
36
36
|
withTimeToFirstChunk,
|
|
37
37
|
withTimeToFirstToken,
|
|
@@ -54,7 +54,7 @@ function useSpansFilterBarFields({ timeRange }) {
|
|
|
54
54
|
}
|
|
55
55
|
/**
|
|
56
56
|
* The span filters as a filter bar value, and the handlers that write bar edits back.
|
|
57
|
-
* The time
|
|
57
|
+
* The time range is a synthetic, always-present item; it never round-trips to tokens.
|
|
58
58
|
*/
|
|
59
59
|
function useSpansFilterBar({ tokens, groups, onFiltersChange }) {
|
|
60
60
|
const items = useMemo(() => traceTokensToFilterBarItems(tokens), [tokens]);
|
|
@@ -63,7 +63,7 @@ function useSpansFilterBar({ tokens, groups, onFiltersChange }) {
|
|
|
63
63
|
return {
|
|
64
64
|
...groupsExpression,
|
|
65
65
|
nodes: [
|
|
66
|
-
|
|
66
|
+
FILTER_BAR_TIME_RANGE_ITEM,
|
|
67
67
|
...items,
|
|
68
68
|
...groupsExpression.nodes
|
|
69
69
|
]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-spans-filter-bar.es.js","names":[],"sources":["../../../../src/domains/spans/hooks/use-spans-filter-bar.ts"],"sourcesContent":["import { useMastraClient } from '@mastra/react';\nimport { useObservabilityCapabilities } from '@mastra/react/hooks/capabilities';\nimport { createTraceQueryValuesResolver, useEntityNames, useEnvironments } from '@mastra/react/hooks/traces';\nimport type { TraceQueryDiscoveryTimeRange } from '@mastra/react/hooks/traces';\nimport { useCallback, useMemo } from 'react';\nimport {\n
|
|
1
|
+
{"version":3,"file":"use-spans-filter-bar.es.js","names":[],"sources":["../../../../src/domains/spans/hooks/use-spans-filter-bar.ts"],"sourcesContent":["import { useMastraClient } from '@mastra/react';\nimport { useObservabilityCapabilities } from '@mastra/react/hooks/capabilities';\nimport { createTraceQueryValuesResolver, useEntityNames, useEnvironments } from '@mastra/react/hooks/traces';\nimport type { TraceQueryDiscoveryTimeRange } from '@mastra/react/hooks/traces';\nimport { useCallback, useMemo } from 'react';\nimport {\n filterBarExpressionToTraceFilters,\n traceFiltersToFilterBarExpression,\n traceTokensToFilterBarItems,\n} from '../../traces/trace-filters';\nimport type { TraceFilterGroup, TraceFilterToken } from '../../traces/trace-query-filters';\nimport type { TraceDatePreset } from '../../traces/types';\nimport { createSpanFilterBarFields } from '../span-filters';\nimport { isFilterBarGroup } from '@/ds/components/FilterBar';\nimport type { FilterBarExpression, FilterBarField, FilterBarItem } from '@/ds/components/FilterBar';\nimport {\n FILTER_BAR_TIME_RANGE_FIELD,\n FILTER_BAR_TIME_RANGE_FIELD_ID,\n FILTER_BAR_TIME_RANGE_ITEM,\n} from '@/ds/components/FilterBar/filter-bar-time-range';\n\n/** The time range presets the spans filter bar offers. */\nexport const SPAN_TIME_RANGE_PRESETS: readonly TraceDatePreset[] = [\n 'last-24h',\n 'last-3d',\n 'last-7d',\n 'last-14d',\n 'last-30d',\n 'custom',\n];\n\nconst NO_SUGGESTIONS: string[] = [];\n\nexport type UseSpansFilterBarFieldsOptions = {\n /** Window the value suggestions are looked up in. */\n timeRange: TraceQueryDiscoveryTimeRange;\n};\n\n/**\n * The fields the spans filter bar offers: the time range plus the fields `querySpans()` accepts.\n * Context, model and outcome fields and streaming timings are only included when the store declares them.\n */\nexport function useSpansFilterBarFields({ timeRange }: UseSpansFilterBarFieldsOptions): FilterBarField[] {\n const client = useMastraClient();\n const { data: capabilities } = useObservabilityCapabilities();\n const withContextFields = capabilities?.capabilities.spanQueryContextFields ?? false;\n const withTimeToFirstChunk = capabilities?.capabilities.traceQueryTimeToFirstChunk ?? false;\n const withTimeToFirstToken = capabilities?.capabilities.traceQueryTimeToFirstToken ?? false;\n const withOutcomeFields = capabilities?.capabilities.spanQueryOutcomeFields ?? false;\n const withModelFields = capabilities?.capabilities.spanQueryModelFields ?? false;\n const { data: entityNames = NO_SUGGESTIONS } = useEntityNames();\n const { data: environments = NO_SUGGESTIONS } = useEnvironments();\n\n // Memoized for correctness: static suggestion lists become the value editor's Combobox\n // `items`, which loops if handed a new array on every render.\n return useMemo(\n () => [\n FILTER_BAR_TIME_RANGE_FIELD,\n ...createSpanFilterBarFields({\n withContextFields,\n withTimeToFirstChunk,\n withTimeToFirstToken,\n withOutcomeFields,\n withModelFields,\n entityNames,\n environments,\n valueSuggestions: path => createTraceQueryValuesResolver(client, timeRange, 'spans', path),\n }),\n ],\n [\n withContextFields,\n withTimeToFirstChunk,\n withTimeToFirstToken,\n withOutcomeFields,\n withModelFields,\n entityNames,\n environments,\n client,\n timeRange,\n ],\n );\n}\n\nexport type UseSpansFilterBarOptions = {\n tokens: TraceFilterToken[];\n groups: TraceFilterGroup[];\n onFiltersChange: (tokens: TraceFilterToken[], groups: TraceFilterGroup[]) => void;\n};\n\n/**\n * The span filters as a filter bar value, and the handlers that write bar edits back.\n * The time range is a synthetic, always-present item; it never round-trips to tokens.\n */\nexport function useSpansFilterBar({ tokens, groups, onFiltersChange }: UseSpansFilterBarOptions): {\n filterBarValue: FilterBarExpression;\n onFilterBarChange: (expression: FilterBarExpression) => void;\n /** Replaces any filter on `fieldId` with `is value`, e.g. from a list cell. */\n onFilterByField: (fieldId: string, value: string) => void;\n} {\n const items = useMemo(() => traceTokensToFilterBarItems(tokens), [tokens]);\n\n const filterBarValue = useMemo<FilterBarExpression>(() => {\n const groupsExpression = traceFiltersToFilterBarExpression([], groups);\n return { ...groupsExpression, nodes: [FILTER_BAR_TIME_RANGE_ITEM, ...items, ...groupsExpression.nodes] };\n }, [items, groups]);\n\n const onFilterBarChange = useCallback(\n (expression: FilterBarExpression) => {\n const next = filterBarExpressionToTraceFilters({\n ...expression,\n nodes: expression.nodes.filter(\n node => isFilterBarGroup(node) || node.fieldId !== FILTER_BAR_TIME_RANGE_FIELD_ID,\n ),\n });\n onFiltersChange(next.tokens, next.groups);\n },\n [onFiltersChange],\n );\n\n const onFilterByField = useCallback(\n (fieldId: string, value: string) => {\n const withoutField = items.filter(item => item.fieldId !== fieldId);\n const item: FilterBarItem = { id: `${fieldId}:${value}`, fieldId, operatorId: 'is', value };\n const groupNodes = filterBarValue.nodes.filter(isFilterBarGroup);\n onFilterBarChange({ ...filterBarValue, nodes: [...withoutField, item, ...groupNodes] });\n },\n [items, filterBarValue, onFilterBarChange],\n );\n\n return { filterBarValue, onFilterBarChange, onFilterByField };\n}\n"],"mappings":";;;;;;;;;;AAsBA,IAAa,0BAAsD;CACjE;CACA;CACA;CACA;CACA;CACA;AACF;AAEA,IAAM,iBAA2B,CAAC;;;;;AAWlC,SAAgB,wBAAwB,EAAE,aAA+D;CACvG,MAAM,SAAS,gBAAgB;CAC/B,MAAM,EAAE,MAAM,iBAAiB,6BAA6B;CAC5D,MAAM,oBAAoB,cAAc,aAAa,0BAA0B;CAC/E,MAAM,uBAAuB,cAAc,aAAa,8BAA8B;CACtF,MAAM,uBAAuB,cAAc,aAAa,8BAA8B;CACtF,MAAM,oBAAoB,cAAc,aAAa,0BAA0B;CAC/E,MAAM,kBAAkB,cAAc,aAAa,wBAAwB;CAC3E,MAAM,EAAE,MAAM,cAAc,mBAAmB,eAAe;CAC9D,MAAM,EAAE,MAAM,eAAe,mBAAmB,gBAAgB;CAIhE,OAAO,cACC,CACJ,6BACA,GAAG,0BAA0B;EAC3B;EACA;EACA;EACA;EACA;EACA;EACA;EACA,mBAAkB,SAAQ,+BAA+B,QAAQ,WAAW,SAAS,IAAI;CAC3F,CAAC,CACH,GACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CACF;AACF;;;;;AAYA,SAAgB,kBAAkB,EAAE,QAAQ,QAAQ,mBAKlD;CACA,MAAM,QAAQ,cAAc,4BAA4B,MAAM,GAAG,CAAC,MAAM,CAAC;CAEzE,MAAM,iBAAiB,cAAmC;EACxD,MAAM,mBAAmB,kCAAkC,CAAC,GAAG,MAAM;EACrE,OAAO;GAAE,GAAG;GAAkB,OAAO;IAAC;IAA4B,GAAG;IAAO,GAAG,iBAAiB;GAAK;EAAE;CACzG,GAAG,CAAC,OAAO,MAAM,CAAC;CAElB,MAAM,oBAAoB,aACvB,eAAoC;EACnC,MAAM,OAAO,kCAAkC;GAC7C,GAAG;GACH,OAAO,WAAW,MAAM,QACtB,SAAQ,iBAAiB,IAAI,KAAK,KAAK,YAAA,WACzC;EACF,CAAC;EACD,gBAAgB,KAAK,QAAQ,KAAK,MAAM;CAC1C,GACA,CAAC,eAAe,CAClB;CAYA,OAAO;EAAE;EAAgB;EAAmB,iBAVpB,aACrB,SAAiB,UAAkB;GAClC,MAAM,eAAe,MAAM,QAAO,SAAQ,KAAK,YAAY,OAAO;GAClE,MAAM,OAAsB;IAAE,IAAI,GAAG,QAAQ,GAAG;IAAS;IAAS,YAAY;IAAM;GAAM;GAC1F,MAAM,aAAa,eAAe,MAAM,OAAO,gBAAgB;GAC/D,kBAAkB;IAAE,GAAG;IAAgB,OAAO;KAAC,GAAG;KAAc;KAAM,GAAG;IAAU;GAAE,CAAC;EACxF,GACA;GAAC;GAAO;GAAgB;EAAiB,CAGC;CAAgB;AAC9D"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
const require_trace_filters = require("../../trace-filters-
|
|
2
|
+
const require_trace_filters = require("../../trace-filters-a0N9bf52.cjs");
|
|
3
3
|
let _mastra_core_observability = require("@mastra/core/observability");
|
|
4
4
|
// src/domains/spans/span-filters.ts
|
|
5
|
-
/** Span query fields every store accepts. `startedAt`/`endedAt` are left to the time
|
|
5
|
+
/** Span query fields every store accepts. `startedAt`/`endedAt` are left to the time range. */
|
|
6
6
|
var SPAN_CORE_FILTER_FIELD_IDS = [
|
|
7
7
|
"name",
|
|
8
8
|
"spanType",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"span-filters.cjs.js","names":["TRACE_FILTER_BAR_LABELS","traceFilterFieldIcon","traceFilterFieldColor","ROOT_ENTITY_TYPE_OPTIONS","SpanType","EntityType","TRACE_STATUS_OPTIONS","TRACE_STRING_OPERATORS","TRACE_SYNTHETIC_OPERATORS","TRACE_REQUIRED_STRING_OPERATORS","TRACE_TEXT_OPERATORS","TRACE_PRESENCE_OPERATORS","TRACE_NUMBER_OPERATORS","withoutUnrecordedStreamingTimings","createOutcomeFilterBarFields","isLegacyAnyValue","scalarPredicate","isTraceFilterGroup"],"sources":["../../../src/domains/spans/span-filters.ts"],"sourcesContent":["import { EntityType, SpanType } from '@mastra/core/observability';\nimport type { TraceQueryScalarPredicate } from '@mastra/core/storage';\nimport {\n isLegacyAnyValue,\n ROOT_ENTITY_TYPE_OPTIONS,\n TRACE_FILTER_BAR_LABELS,\n TRACE_NUMBER_OPERATORS,\n TRACE_PRESENCE_OPERATORS,\n TRACE_REQUIRED_STRING_OPERATORS,\n TRACE_STATUS_OPTIONS,\n TRACE_STRING_OPERATORS,\n TRACE_SYNTHETIC_OPERATORS,\n TRACE_TEXT_OPERATORS,\n createOutcomeFilterBarFields,\n traceFilterFieldColor,\n traceFilterFieldIcon,\n withoutUnrecordedStreamingTimings,\n} from '../traces/trace-filters';\nimport type { StreamingTimingSupport } from '../traces/trace-filters';\nimport { isTraceFilterGroup, scalarPredicate } from '../traces/trace-query-filters';\nimport type { TraceFilterGroup, TraceFilterOperatorId, TraceFilterToken } from '../traces/trace-query-filters';\nimport type { FilterBarField, FilterBarOption, FilterBarSuggestionsResolver } from '@/ds/components/FilterBar/types';\n\n/** Span query fields every store accepts. `startedAt`/`endedAt` are left to the time-range chip. */\nexport const SPAN_CORE_FILTER_FIELD_IDS = [\n 'name',\n 'spanType',\n 'status',\n 'error',\n 'durationMs',\n 'timeToFirstChunkMs',\n 'timeToFirstTokenMs',\n 'entityType',\n 'entityId',\n 'entityName',\n 'entityVersionId',\n 'parentEntityVersionId',\n 'rootEntityVersionId',\n 'runId',\n 'sessionId',\n 'userId',\n 'organizationId',\n] as const;\n\n/** Span query fields the server only accepts when the store declares `spanQueryContextFields`. */\nexport const SPAN_CONTEXT_FILTER_FIELD_IDS = [\n 'traceId',\n 'spanId',\n 'parentSpanId',\n 'threadId',\n 'resourceId',\n 'requestId',\n 'serviceName',\n 'experimentId',\n 'environment',\n 'executionSource',\n 'parentEntityType',\n 'parentEntityId',\n 'parentEntityName',\n 'rootEntityType',\n 'rootEntityId',\n 'rootEntityName',\n] as const;\n\n/** Span query fields the server only accepts when the store declares `spanQueryOutcomeFields`. */\nexport const SPAN_OUTCOME_FILTER_FIELD_IDS = ['outcome', 'stopReason'] as const;\n\n/** Span query fields the server only accepts when the store declares `spanQueryModelFields`. */\nexport const SPAN_MODEL_FILTER_FIELD_IDS = ['model', 'provider'] as const;\n\nconst NUMBER_FIELD_IDS: ReadonlySet<string> = new Set(['durationMs', 'timeToFirstChunkMs', 'timeToFirstTokenMs']);\n/** The query can only test `error` for presence; any other operator is rejected. */\nconst PRESENCE_ONLY_FIELD_IDS: ReadonlySet<string> = new Set(['error']);\n/** Fields every span carries. On any other field, \"is not X\" must also keep spans where it is missing. */\nconst REQUIRED_FIELD_IDS: ReadonlySet<string> = new Set([\n 'name',\n 'spanType',\n 'status',\n 'traceId',\n 'spanId',\n 'durationMs',\n]);\n\nconst SPAN_FILTER_BAR_LABELS: Record<string, string> = {\n ...TRACE_FILTER_BAR_LABELS,\n name: 'Span name',\n spanType: 'Span type',\n spanId: 'Span ID',\n parentSpanId: 'Parent span ID',\n error: 'Error',\n timeToFirstChunkMs: 'Time to first chunk (ms)',\n timeToFirstTokenMs: 'Time to first token (ms)',\n executionSource: 'Execution source',\n entityType: 'Primitive type',\n entityVersionId: 'Primitive version ID',\n parentEntityType: 'Parent primitive type',\n parentEntityId: 'Parent primitive ID',\n parentEntityName: 'Parent primitive name',\n parentEntityVersionId: 'Parent primitive version ID',\n rootEntityType: 'Root primitive type',\n rootEntityId: 'Root primitive ID',\n rootEntityName: 'Root primitive name',\n rootEntityVersionId: 'Root primitive version ID',\n model: 'Model',\n provider: 'Provider',\n};\n\n/** Span fields without their own trace icon borrow the icon of the closest trace field. */\nconst SPAN_ICON_FIELD_ALIASES: Record<string, string> = {\n name: 'spans.name',\n spanType: 'spans.spanType',\n error: 'spans.error',\n timeToFirstChunkMs: 'durationMs',\n timeToFirstTokenMs: 'durationMs',\n spanId: 'traceId',\n parentSpanId: 'traceId',\n executionSource: 'runId',\n entityType: 'rootEntityType',\n parentEntityType: 'rootEntityType',\n entityVersionId: 'entityId',\n parentEntityId: 'entityId',\n parentEntityVersionId: 'entityId',\n rootEntityId: 'entityId',\n rootEntityVersionId: 'entityId',\n parentEntityName: 'entityName',\n rootEntityName: 'entityName',\n model: 'spans.model',\n provider: 'spans.provider',\n};\n\nconst spanFieldBase = (id: string) => ({\n id,\n label: SPAN_FILTER_BAR_LABELS[id] ?? id,\n icon: traceFilterFieldIcon(SPAN_ICON_FIELD_ALIASES[id] ?? id),\n color: traceFilterFieldColor(id),\n});\n\nconst humanize = (value: string) => {\n const words = value.replace(/_/g, ' ');\n return words.charAt(0).toUpperCase() + words.slice(1);\n};\n\nconst byLabel = (a: { label?: string; value: string }, b: { label?: string; value: string }) =>\n (a.label ?? a.value).localeCompare(b.label ?? b.value);\n\nconst ENTITY_TYPE_LABELS: Record<string, string> = Object.fromEntries(\n ROOT_ENTITY_TYPE_OPTIONS.map(option => [option.entityType, option.label]),\n);\n\nconst SPAN_TYPE_OPTIONS: FilterBarOption[] = Object.values(SpanType)\n .map(value => ({ value, label: humanize(value) }))\n .sort(byLabel);\n\nconst ENTITY_TYPE_OPTIONS: FilterBarOption[] = Object.values(EntityType)\n .map(value => ({ value, label: ENTITY_TYPE_LABELS[value] ?? humanize(value) }))\n .sort(byLabel);\n\nconst STATUS_OPTIONS: FilterBarOption[] = TRACE_STATUS_OPTIONS.filter(option => option.value !== 'running').map(\n option => ({ value: option.value, label: option.label }),\n);\n\n/** FilterBar fields for the spans page: only paths and operators `querySpans()` accepts. */\nexport function createSpanFilterBarFields({\n withContextFields,\n withTimeToFirstChunk,\n withTimeToFirstToken,\n withOutcomeFields = false,\n withModelFields = false,\n entityNames,\n environments,\n valueSuggestions,\n}: StreamingTimingSupport & {\n /** Offer the context fields. Only when the server declares `spanQueryContextFields`. */\n withContextFields: boolean;\n /** Offer `outcome` and `stopReason`. Only when the server declares `spanQueryOutcomeFields`. */\n withOutcomeFields?: boolean;\n /** Offer `model` and `provider`. Only when the server declares `spanQueryModelFields`. */\n withModelFields?: boolean;\n entityNames: readonly string[];\n environments: readonly string[];\n /** Builds a lazy value resolver for a span field. Absent → free text. */\n valueSuggestions?: (path: string) => FilterBarSuggestionsResolver;\n}): FilterBarField[] {\n const pick = (\n id: string,\n suggestions: FilterBarOption[],\n operators: TraceFilterOperatorId[] = TRACE_STRING_OPERATORS,\n ): FilterBarField => ({ ...spanFieldBase(id), operators, strict: true, suggestions });\n const names = entityNames.map(value => ({ value }));\n\n const field = (id: string): FilterBarField => {\n switch (id) {\n case 'status':\n return pick(id, STATUS_OPTIONS, TRACE_SYNTHETIC_OPERATORS);\n case 'spanType':\n return pick(id, SPAN_TYPE_OPTIONS, TRACE_REQUIRED_STRING_OPERATORS);\n case 'entityType':\n case 'parentEntityType':\n case 'rootEntityType':\n return pick(id, ENTITY_TYPE_OPTIONS);\n case 'entityName':\n case 'rootEntityName':\n return pick(id, names);\n case 'environment':\n return pick(\n id,\n environments.map(value => ({ value })),\n );\n case 'name': {\n const resolver = valueSuggestions?.(id);\n return {\n ...spanFieldBase(id),\n operators: TRACE_TEXT_OPERATORS,\n ...(resolver ? { strict: true, suggestions: resolver } : {}),\n };\n }\n case 'error':\n return { ...spanFieldBase(id), operators: TRACE_PRESENCE_OPERATORS };\n case 'durationMs':\n case 'timeToFirstChunkMs':\n case 'timeToFirstTokenMs':\n return { ...spanFieldBase(id), type: 'number', operators: TRACE_NUMBER_OPERATORS };\n case 'traceId':\n case 'spanId':\n return { ...spanFieldBase(id), operators: TRACE_REQUIRED_STRING_OPERATORS };\n case 'model':\n case 'provider': {\n const resolver = valueSuggestions?.(id);\n return {\n ...spanFieldBase(id),\n operators: TRACE_STRING_OPERATORS,\n ...(resolver ? { suggestions: resolver } : {}),\n };\n }\n default:\n return { ...spanFieldBase(id), operators: TRACE_STRING_OPERATORS };\n }\n };\n\n const offered = withoutUnrecordedStreamingTimings(\n new Set([...SPAN_CORE_FILTER_FIELD_IDS, ...SPAN_CONTEXT_FILTER_FIELD_IDS]),\n {\n withTimeToFirstChunk,\n withTimeToFirstToken,\n },\n );\n const sortFields = (ids: readonly string[]) =>\n ids\n .filter(id => offered.has(id))\n .map(field)\n .sort((a, b) => a.label.localeCompare(b.label));\n return [\n ...sortFields(SPAN_CORE_FILTER_FIELD_IDS),\n ...(withContextFields ? sortFields(SPAN_CONTEXT_FILTER_FIELD_IDS) : []),\n ...(withModelFields ? SPAN_MODEL_FILTER_FIELD_IDS.map(field) : []),\n ...(withOutcomeFields ? createOutcomeFilterBarFields(spanFieldBase, valueSuggestions) : []),\n ];\n}\n\nfunction tokenToSpanQueryPredicate(\n token: TraceFilterToken,\n allowedFieldIds: ReadonlySet<string>,\n): TraceQueryScalarPredicate | undefined {\n const { fieldId } = token;\n if (!allowedFieldIds.has(fieldId)) return undefined;\n const operatorId = token.operatorId ?? 'is';\n const isPresence = operatorId === 'exists' || operatorId === 'notExists';\n if (PRESENCE_ONLY_FIELD_IDS.has(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 let values: (string | number)[] = rawValues;\n if (NUMBER_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.\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 predicate = scalarPredicate(operatorId, fieldId, values);\n if (!predicate) return undefined;\n if ((operatorId === 'isNot' || operatorId === 'notIn') && !REQUIRED_FIELD_IDS.has(fieldId)) {\n return { op: 'or', args: [predicate, { op: 'notExists', path: fieldId }] };\n }\n return predicate;\n}\n\nfunction groupToSpanQueryPredicate(\n group: TraceFilterGroup,\n allowedFieldIds: ReadonlySet<string>,\n): TraceQueryScalarPredicate | undefined {\n const args = group.nodes\n .map(node =>\n isTraceFilterGroup(node)\n ? groupToSpanQueryPredicate(node, allowedFieldIds)\n : tokenToSpanQueryPredicate(node, allowedFieldIds),\n )\n .filter((predicate): predicate is TraceQueryScalarPredicate => Boolean(predicate));\n if (args.length === 0) return undefined;\n return args.length === 1 ? args[0] : { op: group.logic, args };\n}\n\n/**\n * The span query `where` for the filter bar's tokens and groups, or `undefined` when nothing applies.\n * Conditions the span query can't run (unknown fields, context, model or outcome fields or streaming timings without\n * the capability, unusable values) are left out instead of failing the request.\n */\nexport function buildSpanQueryWhere(\n tokens: TraceFilterToken[],\n groups: TraceFilterGroup[],\n {\n withContextFields,\n withOutcomeFields = false,\n withModelFields = false,\n ...support\n }: StreamingTimingSupport & { withContextFields: boolean; withOutcomeFields?: boolean; withModelFields?: boolean },\n): TraceQueryScalarPredicate | undefined {\n const allowedFieldIds = withoutUnrecordedStreamingTimings(\n new Set([\n ...SPAN_CORE_FILTER_FIELD_IDS,\n ...(withContextFields ? SPAN_CONTEXT_FILTER_FIELD_IDS : []),\n ...(withOutcomeFields ? SPAN_OUTCOME_FILTER_FIELD_IDS : []),\n ...(withModelFields ? SPAN_MODEL_FILTER_FIELD_IDS : []),\n ]),\n support,\n );\n const args = [\n ...tokens.map(token => tokenToSpanQueryPredicate(token, allowedFieldIds)),\n ...groups.map(group => groupToSpanQueryPredicate(group, allowedFieldIds)),\n ].filter((predicate): predicate is TraceQueryScalarPredicate => Boolean(predicate));\n return args.length ? { op: 'and', args } : undefined;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"span-filters.cjs.js","names":["TRACE_FILTER_BAR_LABELS","traceFilterFieldIcon","traceFilterFieldColor","ROOT_ENTITY_TYPE_OPTIONS","SpanType","EntityType","TRACE_STATUS_OPTIONS","TRACE_STRING_OPERATORS","TRACE_SYNTHETIC_OPERATORS","TRACE_REQUIRED_STRING_OPERATORS","TRACE_TEXT_OPERATORS","TRACE_PRESENCE_OPERATORS","TRACE_NUMBER_OPERATORS","withoutUnrecordedStreamingTimings","createOutcomeFilterBarFields","isLegacyAnyValue","scalarPredicate","isTraceFilterGroup"],"sources":["../../../src/domains/spans/span-filters.ts"],"sourcesContent":["import { EntityType, SpanType } from '@mastra/core/observability';\nimport type { TraceQueryScalarPredicate } from '@mastra/core/storage';\nimport {\n isLegacyAnyValue,\n ROOT_ENTITY_TYPE_OPTIONS,\n TRACE_FILTER_BAR_LABELS,\n TRACE_NUMBER_OPERATORS,\n TRACE_PRESENCE_OPERATORS,\n TRACE_REQUIRED_STRING_OPERATORS,\n TRACE_STATUS_OPTIONS,\n TRACE_STRING_OPERATORS,\n TRACE_SYNTHETIC_OPERATORS,\n TRACE_TEXT_OPERATORS,\n createOutcomeFilterBarFields,\n traceFilterFieldColor,\n traceFilterFieldIcon,\n withoutUnrecordedStreamingTimings,\n} from '../traces/trace-filters';\nimport type { StreamingTimingSupport } from '../traces/trace-filters';\nimport { isTraceFilterGroup, scalarPredicate } from '../traces/trace-query-filters';\nimport type { TraceFilterGroup, TraceFilterOperatorId, TraceFilterToken } from '../traces/trace-query-filters';\nimport type { FilterBarField, FilterBarOption, FilterBarSuggestionsResolver } from '@/ds/components/FilterBar/types';\n\n/** Span query fields every store accepts. `startedAt`/`endedAt` are left to the time range. */\nexport const SPAN_CORE_FILTER_FIELD_IDS = [\n 'name',\n 'spanType',\n 'status',\n 'error',\n 'durationMs',\n 'timeToFirstChunkMs',\n 'timeToFirstTokenMs',\n 'entityType',\n 'entityId',\n 'entityName',\n 'entityVersionId',\n 'parentEntityVersionId',\n 'rootEntityVersionId',\n 'runId',\n 'sessionId',\n 'userId',\n 'organizationId',\n] as const;\n\n/** Span query fields the server only accepts when the store declares `spanQueryContextFields`. */\nexport const SPAN_CONTEXT_FILTER_FIELD_IDS = [\n 'traceId',\n 'spanId',\n 'parentSpanId',\n 'threadId',\n 'resourceId',\n 'requestId',\n 'serviceName',\n 'experimentId',\n 'environment',\n 'executionSource',\n 'parentEntityType',\n 'parentEntityId',\n 'parentEntityName',\n 'rootEntityType',\n 'rootEntityId',\n 'rootEntityName',\n] as const;\n\n/** Span query fields the server only accepts when the store declares `spanQueryOutcomeFields`. */\nexport const SPAN_OUTCOME_FILTER_FIELD_IDS = ['outcome', 'stopReason'] as const;\n\n/** Span query fields the server only accepts when the store declares `spanQueryModelFields`. */\nexport const SPAN_MODEL_FILTER_FIELD_IDS = ['model', 'provider'] as const;\n\nconst NUMBER_FIELD_IDS: ReadonlySet<string> = new Set(['durationMs', 'timeToFirstChunkMs', 'timeToFirstTokenMs']);\n/** The query can only test `error` for presence; any other operator is rejected. */\nconst PRESENCE_ONLY_FIELD_IDS: ReadonlySet<string> = new Set(['error']);\n/** Fields every span carries. On any other field, \"is not X\" must also keep spans where it is missing. */\nconst REQUIRED_FIELD_IDS: ReadonlySet<string> = new Set([\n 'name',\n 'spanType',\n 'status',\n 'traceId',\n 'spanId',\n 'durationMs',\n]);\n\nconst SPAN_FILTER_BAR_LABELS: Record<string, string> = {\n ...TRACE_FILTER_BAR_LABELS,\n name: 'Span name',\n spanType: 'Span type',\n spanId: 'Span ID',\n parentSpanId: 'Parent span ID',\n error: 'Error',\n timeToFirstChunkMs: 'Time to first chunk (ms)',\n timeToFirstTokenMs: 'Time to first token (ms)',\n executionSource: 'Execution source',\n entityType: 'Primitive type',\n entityVersionId: 'Primitive version ID',\n parentEntityType: 'Parent primitive type',\n parentEntityId: 'Parent primitive ID',\n parentEntityName: 'Parent primitive name',\n parentEntityVersionId: 'Parent primitive version ID',\n rootEntityType: 'Root primitive type',\n rootEntityId: 'Root primitive ID',\n rootEntityName: 'Root primitive name',\n rootEntityVersionId: 'Root primitive version ID',\n model: 'Model',\n provider: 'Provider',\n};\n\n/** Span fields without their own trace icon borrow the icon of the closest trace field. */\nconst SPAN_ICON_FIELD_ALIASES: Record<string, string> = {\n name: 'spans.name',\n spanType: 'spans.spanType',\n error: 'spans.error',\n timeToFirstChunkMs: 'durationMs',\n timeToFirstTokenMs: 'durationMs',\n spanId: 'traceId',\n parentSpanId: 'traceId',\n executionSource: 'runId',\n entityType: 'rootEntityType',\n parentEntityType: 'rootEntityType',\n entityVersionId: 'entityId',\n parentEntityId: 'entityId',\n parentEntityVersionId: 'entityId',\n rootEntityId: 'entityId',\n rootEntityVersionId: 'entityId',\n parentEntityName: 'entityName',\n rootEntityName: 'entityName',\n model: 'spans.model',\n provider: 'spans.provider',\n};\n\nconst spanFieldBase = (id: string) => ({\n id,\n label: SPAN_FILTER_BAR_LABELS[id] ?? id,\n icon: traceFilterFieldIcon(SPAN_ICON_FIELD_ALIASES[id] ?? id),\n color: traceFilterFieldColor(id),\n});\n\nconst humanize = (value: string) => {\n const words = value.replace(/_/g, ' ');\n return words.charAt(0).toUpperCase() + words.slice(1);\n};\n\nconst byLabel = (a: { label?: string; value: string }, b: { label?: string; value: string }) =>\n (a.label ?? a.value).localeCompare(b.label ?? b.value);\n\nconst ENTITY_TYPE_LABELS: Record<string, string> = Object.fromEntries(\n ROOT_ENTITY_TYPE_OPTIONS.map(option => [option.entityType, option.label]),\n);\n\nconst SPAN_TYPE_OPTIONS: FilterBarOption[] = Object.values(SpanType)\n .map(value => ({ value, label: humanize(value) }))\n .sort(byLabel);\n\nconst ENTITY_TYPE_OPTIONS: FilterBarOption[] = Object.values(EntityType)\n .map(value => ({ value, label: ENTITY_TYPE_LABELS[value] ?? humanize(value) }))\n .sort(byLabel);\n\nconst STATUS_OPTIONS: FilterBarOption[] = TRACE_STATUS_OPTIONS.filter(option => option.value !== 'running').map(\n option => ({ value: option.value, label: option.label }),\n);\n\n/** FilterBar fields for the spans page: only paths and operators `querySpans()` accepts. */\nexport function createSpanFilterBarFields({\n withContextFields,\n withTimeToFirstChunk,\n withTimeToFirstToken,\n withOutcomeFields = false,\n withModelFields = false,\n entityNames,\n environments,\n valueSuggestions,\n}: StreamingTimingSupport & {\n /** Offer the context fields. Only when the server declares `spanQueryContextFields`. */\n withContextFields: boolean;\n /** Offer `outcome` and `stopReason`. Only when the server declares `spanQueryOutcomeFields`. */\n withOutcomeFields?: boolean;\n /** Offer `model` and `provider`. Only when the server declares `spanQueryModelFields`. */\n withModelFields?: boolean;\n entityNames: readonly string[];\n environments: readonly string[];\n /** Builds a lazy value resolver for a span field. Absent → free text. */\n valueSuggestions?: (path: string) => FilterBarSuggestionsResolver;\n}): FilterBarField[] {\n const pick = (\n id: string,\n suggestions: FilterBarOption[],\n operators: TraceFilterOperatorId[] = TRACE_STRING_OPERATORS,\n ): FilterBarField => ({ ...spanFieldBase(id), operators, strict: true, suggestions });\n const names = entityNames.map(value => ({ value }));\n\n const field = (id: string): FilterBarField => {\n switch (id) {\n case 'status':\n return pick(id, STATUS_OPTIONS, TRACE_SYNTHETIC_OPERATORS);\n case 'spanType':\n return pick(id, SPAN_TYPE_OPTIONS, TRACE_REQUIRED_STRING_OPERATORS);\n case 'entityType':\n case 'parentEntityType':\n case 'rootEntityType':\n return pick(id, ENTITY_TYPE_OPTIONS);\n case 'entityName':\n case 'rootEntityName':\n return pick(id, names);\n case 'environment':\n return pick(\n id,\n environments.map(value => ({ value })),\n );\n case 'name': {\n const resolver = valueSuggestions?.(id);\n return {\n ...spanFieldBase(id),\n operators: TRACE_TEXT_OPERATORS,\n ...(resolver ? { strict: true, suggestions: resolver } : {}),\n };\n }\n case 'error':\n return { ...spanFieldBase(id), operators: TRACE_PRESENCE_OPERATORS };\n case 'durationMs':\n case 'timeToFirstChunkMs':\n case 'timeToFirstTokenMs':\n return { ...spanFieldBase(id), type: 'number', operators: TRACE_NUMBER_OPERATORS };\n case 'traceId':\n case 'spanId':\n return { ...spanFieldBase(id), operators: TRACE_REQUIRED_STRING_OPERATORS };\n case 'model':\n case 'provider': {\n const resolver = valueSuggestions?.(id);\n return {\n ...spanFieldBase(id),\n operators: TRACE_STRING_OPERATORS,\n ...(resolver ? { suggestions: resolver } : {}),\n };\n }\n default:\n return { ...spanFieldBase(id), operators: TRACE_STRING_OPERATORS };\n }\n };\n\n const offered = withoutUnrecordedStreamingTimings(\n new Set([...SPAN_CORE_FILTER_FIELD_IDS, ...SPAN_CONTEXT_FILTER_FIELD_IDS]),\n {\n withTimeToFirstChunk,\n withTimeToFirstToken,\n },\n );\n const sortFields = (ids: readonly string[]) =>\n ids\n .filter(id => offered.has(id))\n .map(field)\n .sort((a, b) => a.label.localeCompare(b.label));\n return [\n ...sortFields(SPAN_CORE_FILTER_FIELD_IDS),\n ...(withContextFields ? sortFields(SPAN_CONTEXT_FILTER_FIELD_IDS) : []),\n ...(withModelFields ? SPAN_MODEL_FILTER_FIELD_IDS.map(field) : []),\n ...(withOutcomeFields ? createOutcomeFilterBarFields(spanFieldBase, valueSuggestions) : []),\n ];\n}\n\nfunction tokenToSpanQueryPredicate(\n token: TraceFilterToken,\n allowedFieldIds: ReadonlySet<string>,\n): TraceQueryScalarPredicate | undefined {\n const { fieldId } = token;\n if (!allowedFieldIds.has(fieldId)) return undefined;\n const operatorId = token.operatorId ?? 'is';\n const isPresence = operatorId === 'exists' || operatorId === 'notExists';\n if (PRESENCE_ONLY_FIELD_IDS.has(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 let values: (string | number)[] = rawValues;\n if (NUMBER_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.\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 predicate = scalarPredicate(operatorId, fieldId, values);\n if (!predicate) return undefined;\n if ((operatorId === 'isNot' || operatorId === 'notIn') && !REQUIRED_FIELD_IDS.has(fieldId)) {\n return { op: 'or', args: [predicate, { op: 'notExists', path: fieldId }] };\n }\n return predicate;\n}\n\nfunction groupToSpanQueryPredicate(\n group: TraceFilterGroup,\n allowedFieldIds: ReadonlySet<string>,\n): TraceQueryScalarPredicate | undefined {\n const args = group.nodes\n .map(node =>\n isTraceFilterGroup(node)\n ? groupToSpanQueryPredicate(node, allowedFieldIds)\n : tokenToSpanQueryPredicate(node, allowedFieldIds),\n )\n .filter((predicate): predicate is TraceQueryScalarPredicate => Boolean(predicate));\n if (args.length === 0) return undefined;\n return args.length === 1 ? args[0] : { op: group.logic, args };\n}\n\n/**\n * The span query `where` for the filter bar's tokens and groups, or `undefined` when nothing applies.\n * Conditions the span query can't run (unknown fields, context, model or outcome fields or streaming timings without\n * the capability, unusable values) are left out instead of failing the request.\n */\nexport function buildSpanQueryWhere(\n tokens: TraceFilterToken[],\n groups: TraceFilterGroup[],\n {\n withContextFields,\n withOutcomeFields = false,\n withModelFields = false,\n ...support\n }: StreamingTimingSupport & { withContextFields: boolean; withOutcomeFields?: boolean; withModelFields?: boolean },\n): TraceQueryScalarPredicate | undefined {\n const allowedFieldIds = withoutUnrecordedStreamingTimings(\n new Set([\n ...SPAN_CORE_FILTER_FIELD_IDS,\n ...(withContextFields ? SPAN_CONTEXT_FILTER_FIELD_IDS : []),\n ...(withOutcomeFields ? SPAN_OUTCOME_FILTER_FIELD_IDS : []),\n ...(withModelFields ? SPAN_MODEL_FILTER_FIELD_IDS : []),\n ]),\n support,\n );\n const args = [\n ...tokens.map(token => tokenToSpanQueryPredicate(token, allowedFieldIds)),\n ...groups.map(group => groupToSpanQueryPredicate(group, allowedFieldIds)),\n ].filter((predicate): predicate is TraceQueryScalarPredicate => Boolean(predicate));\n return args.length ? { op: 'and', args } : undefined;\n}\n"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { D as TRACE_STRING_OPERATORS, F as createOutcomeFilterBarFields, Q as traceFilterFieldIcon, S as TRACE_REQUIRED_STRING_OPERATORS, U as isLegacyAnyValue, Z as traceFilterFieldColor, it as withoutUnrecordedStreamingTimings, j as TRACE_TEXT_OPERATORS, k as TRACE_SYNTHETIC_OPERATORS, l as TRACE_FILTER_BAR_LABELS, pt as scalarPredicate, r as ROOT_ENTITY_TYPE_OPTIONS, ut as isTraceFilterGroup, v as TRACE_NUMBER_OPERATORS, w as TRACE_STATUS_OPTIONS, y as TRACE_PRESENCE_OPERATORS } from "../../trace-filters-
|
|
1
|
+
import { D as TRACE_STRING_OPERATORS, F as createOutcomeFilterBarFields, Q as traceFilterFieldIcon, S as TRACE_REQUIRED_STRING_OPERATORS, U as isLegacyAnyValue, Z as traceFilterFieldColor, it as withoutUnrecordedStreamingTimings, j as TRACE_TEXT_OPERATORS, k as TRACE_SYNTHETIC_OPERATORS, l as TRACE_FILTER_BAR_LABELS, pt as scalarPredicate, r as ROOT_ENTITY_TYPE_OPTIONS, ut as isTraceFilterGroup, v as TRACE_NUMBER_OPERATORS, w as TRACE_STATUS_OPTIONS, y as TRACE_PRESENCE_OPERATORS } from "../../trace-filters-CaWkw779.js";
|
|
2
2
|
import { EntityType, SpanType } from "@mastra/core/observability";
|
|
3
3
|
// src/domains/spans/span-filters.ts
|
|
4
|
-
/** Span query fields every store accepts. `startedAt`/`endedAt` are left to the time
|
|
4
|
+
/** Span query fields every store accepts. `startedAt`/`endedAt` are left to the time range. */
|
|
5
5
|
var SPAN_CORE_FILTER_FIELD_IDS = [
|
|
6
6
|
"name",
|
|
7
7
|
"spanType",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"span-filters.es.js","names":[],"sources":["../../../src/domains/spans/span-filters.ts"],"sourcesContent":["import { EntityType, SpanType } from '@mastra/core/observability';\nimport type { TraceQueryScalarPredicate } from '@mastra/core/storage';\nimport {\n isLegacyAnyValue,\n ROOT_ENTITY_TYPE_OPTIONS,\n TRACE_FILTER_BAR_LABELS,\n TRACE_NUMBER_OPERATORS,\n TRACE_PRESENCE_OPERATORS,\n TRACE_REQUIRED_STRING_OPERATORS,\n TRACE_STATUS_OPTIONS,\n TRACE_STRING_OPERATORS,\n TRACE_SYNTHETIC_OPERATORS,\n TRACE_TEXT_OPERATORS,\n createOutcomeFilterBarFields,\n traceFilterFieldColor,\n traceFilterFieldIcon,\n withoutUnrecordedStreamingTimings,\n} from '../traces/trace-filters';\nimport type { StreamingTimingSupport } from '../traces/trace-filters';\nimport { isTraceFilterGroup, scalarPredicate } from '../traces/trace-query-filters';\nimport type { TraceFilterGroup, TraceFilterOperatorId, TraceFilterToken } from '../traces/trace-query-filters';\nimport type { FilterBarField, FilterBarOption, FilterBarSuggestionsResolver } from '@/ds/components/FilterBar/types';\n\n/** Span query fields every store accepts. `startedAt`/`endedAt` are left to the time-range chip. */\nexport const SPAN_CORE_FILTER_FIELD_IDS = [\n 'name',\n 'spanType',\n 'status',\n 'error',\n 'durationMs',\n 'timeToFirstChunkMs',\n 'timeToFirstTokenMs',\n 'entityType',\n 'entityId',\n 'entityName',\n 'entityVersionId',\n 'parentEntityVersionId',\n 'rootEntityVersionId',\n 'runId',\n 'sessionId',\n 'userId',\n 'organizationId',\n] as const;\n\n/** Span query fields the server only accepts when the store declares `spanQueryContextFields`. */\nexport const SPAN_CONTEXT_FILTER_FIELD_IDS = [\n 'traceId',\n 'spanId',\n 'parentSpanId',\n 'threadId',\n 'resourceId',\n 'requestId',\n 'serviceName',\n 'experimentId',\n 'environment',\n 'executionSource',\n 'parentEntityType',\n 'parentEntityId',\n 'parentEntityName',\n 'rootEntityType',\n 'rootEntityId',\n 'rootEntityName',\n] as const;\n\n/** Span query fields the server only accepts when the store declares `spanQueryOutcomeFields`. */\nexport const SPAN_OUTCOME_FILTER_FIELD_IDS = ['outcome', 'stopReason'] as const;\n\n/** Span query fields the server only accepts when the store declares `spanQueryModelFields`. */\nexport const SPAN_MODEL_FILTER_FIELD_IDS = ['model', 'provider'] as const;\n\nconst NUMBER_FIELD_IDS: ReadonlySet<string> = new Set(['durationMs', 'timeToFirstChunkMs', 'timeToFirstTokenMs']);\n/** The query can only test `error` for presence; any other operator is rejected. */\nconst PRESENCE_ONLY_FIELD_IDS: ReadonlySet<string> = new Set(['error']);\n/** Fields every span carries. On any other field, \"is not X\" must also keep spans where it is missing. */\nconst REQUIRED_FIELD_IDS: ReadonlySet<string> = new Set([\n 'name',\n 'spanType',\n 'status',\n 'traceId',\n 'spanId',\n 'durationMs',\n]);\n\nconst SPAN_FILTER_BAR_LABELS: Record<string, string> = {\n ...TRACE_FILTER_BAR_LABELS,\n name: 'Span name',\n spanType: 'Span type',\n spanId: 'Span ID',\n parentSpanId: 'Parent span ID',\n error: 'Error',\n timeToFirstChunkMs: 'Time to first chunk (ms)',\n timeToFirstTokenMs: 'Time to first token (ms)',\n executionSource: 'Execution source',\n entityType: 'Primitive type',\n entityVersionId: 'Primitive version ID',\n parentEntityType: 'Parent primitive type',\n parentEntityId: 'Parent primitive ID',\n parentEntityName: 'Parent primitive name',\n parentEntityVersionId: 'Parent primitive version ID',\n rootEntityType: 'Root primitive type',\n rootEntityId: 'Root primitive ID',\n rootEntityName: 'Root primitive name',\n rootEntityVersionId: 'Root primitive version ID',\n model: 'Model',\n provider: 'Provider',\n};\n\n/** Span fields without their own trace icon borrow the icon of the closest trace field. */\nconst SPAN_ICON_FIELD_ALIASES: Record<string, string> = {\n name: 'spans.name',\n spanType: 'spans.spanType',\n error: 'spans.error',\n timeToFirstChunkMs: 'durationMs',\n timeToFirstTokenMs: 'durationMs',\n spanId: 'traceId',\n parentSpanId: 'traceId',\n executionSource: 'runId',\n entityType: 'rootEntityType',\n parentEntityType: 'rootEntityType',\n entityVersionId: 'entityId',\n parentEntityId: 'entityId',\n parentEntityVersionId: 'entityId',\n rootEntityId: 'entityId',\n rootEntityVersionId: 'entityId',\n parentEntityName: 'entityName',\n rootEntityName: 'entityName',\n model: 'spans.model',\n provider: 'spans.provider',\n};\n\nconst spanFieldBase = (id: string) => ({\n id,\n label: SPAN_FILTER_BAR_LABELS[id] ?? id,\n icon: traceFilterFieldIcon(SPAN_ICON_FIELD_ALIASES[id] ?? id),\n color: traceFilterFieldColor(id),\n});\n\nconst humanize = (value: string) => {\n const words = value.replace(/_/g, ' ');\n return words.charAt(0).toUpperCase() + words.slice(1);\n};\n\nconst byLabel = (a: { label?: string; value: string }, b: { label?: string; value: string }) =>\n (a.label ?? a.value).localeCompare(b.label ?? b.value);\n\nconst ENTITY_TYPE_LABELS: Record<string, string> = Object.fromEntries(\n ROOT_ENTITY_TYPE_OPTIONS.map(option => [option.entityType, option.label]),\n);\n\nconst SPAN_TYPE_OPTIONS: FilterBarOption[] = Object.values(SpanType)\n .map(value => ({ value, label: humanize(value) }))\n .sort(byLabel);\n\nconst ENTITY_TYPE_OPTIONS: FilterBarOption[] = Object.values(EntityType)\n .map(value => ({ value, label: ENTITY_TYPE_LABELS[value] ?? humanize(value) }))\n .sort(byLabel);\n\nconst STATUS_OPTIONS: FilterBarOption[] = TRACE_STATUS_OPTIONS.filter(option => option.value !== 'running').map(\n option => ({ value: option.value, label: option.label }),\n);\n\n/** FilterBar fields for the spans page: only paths and operators `querySpans()` accepts. */\nexport function createSpanFilterBarFields({\n withContextFields,\n withTimeToFirstChunk,\n withTimeToFirstToken,\n withOutcomeFields = false,\n withModelFields = false,\n entityNames,\n environments,\n valueSuggestions,\n}: StreamingTimingSupport & {\n /** Offer the context fields. Only when the server declares `spanQueryContextFields`. */\n withContextFields: boolean;\n /** Offer `outcome` and `stopReason`. Only when the server declares `spanQueryOutcomeFields`. */\n withOutcomeFields?: boolean;\n /** Offer `model` and `provider`. Only when the server declares `spanQueryModelFields`. */\n withModelFields?: boolean;\n entityNames: readonly string[];\n environments: readonly string[];\n /** Builds a lazy value resolver for a span field. Absent → free text. */\n valueSuggestions?: (path: string) => FilterBarSuggestionsResolver;\n}): FilterBarField[] {\n const pick = (\n id: string,\n suggestions: FilterBarOption[],\n operators: TraceFilterOperatorId[] = TRACE_STRING_OPERATORS,\n ): FilterBarField => ({ ...spanFieldBase(id), operators, strict: true, suggestions });\n const names = entityNames.map(value => ({ value }));\n\n const field = (id: string): FilterBarField => {\n switch (id) {\n case 'status':\n return pick(id, STATUS_OPTIONS, TRACE_SYNTHETIC_OPERATORS);\n case 'spanType':\n return pick(id, SPAN_TYPE_OPTIONS, TRACE_REQUIRED_STRING_OPERATORS);\n case 'entityType':\n case 'parentEntityType':\n case 'rootEntityType':\n return pick(id, ENTITY_TYPE_OPTIONS);\n case 'entityName':\n case 'rootEntityName':\n return pick(id, names);\n case 'environment':\n return pick(\n id,\n environments.map(value => ({ value })),\n );\n case 'name': {\n const resolver = valueSuggestions?.(id);\n return {\n ...spanFieldBase(id),\n operators: TRACE_TEXT_OPERATORS,\n ...(resolver ? { strict: true, suggestions: resolver } : {}),\n };\n }\n case 'error':\n return { ...spanFieldBase(id), operators: TRACE_PRESENCE_OPERATORS };\n case 'durationMs':\n case 'timeToFirstChunkMs':\n case 'timeToFirstTokenMs':\n return { ...spanFieldBase(id), type: 'number', operators: TRACE_NUMBER_OPERATORS };\n case 'traceId':\n case 'spanId':\n return { ...spanFieldBase(id), operators: TRACE_REQUIRED_STRING_OPERATORS };\n case 'model':\n case 'provider': {\n const resolver = valueSuggestions?.(id);\n return {\n ...spanFieldBase(id),\n operators: TRACE_STRING_OPERATORS,\n ...(resolver ? { suggestions: resolver } : {}),\n };\n }\n default:\n return { ...spanFieldBase(id), operators: TRACE_STRING_OPERATORS };\n }\n };\n\n const offered = withoutUnrecordedStreamingTimings(\n new Set([...SPAN_CORE_FILTER_FIELD_IDS, ...SPAN_CONTEXT_FILTER_FIELD_IDS]),\n {\n withTimeToFirstChunk,\n withTimeToFirstToken,\n },\n );\n const sortFields = (ids: readonly string[]) =>\n ids\n .filter(id => offered.has(id))\n .map(field)\n .sort((a, b) => a.label.localeCompare(b.label));\n return [\n ...sortFields(SPAN_CORE_FILTER_FIELD_IDS),\n ...(withContextFields ? sortFields(SPAN_CONTEXT_FILTER_FIELD_IDS) : []),\n ...(withModelFields ? SPAN_MODEL_FILTER_FIELD_IDS.map(field) : []),\n ...(withOutcomeFields ? createOutcomeFilterBarFields(spanFieldBase, valueSuggestions) : []),\n ];\n}\n\nfunction tokenToSpanQueryPredicate(\n token: TraceFilterToken,\n allowedFieldIds: ReadonlySet<string>,\n): TraceQueryScalarPredicate | undefined {\n const { fieldId } = token;\n if (!allowedFieldIds.has(fieldId)) return undefined;\n const operatorId = token.operatorId ?? 'is';\n const isPresence = operatorId === 'exists' || operatorId === 'notExists';\n if (PRESENCE_ONLY_FIELD_IDS.has(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 let values: (string | number)[] = rawValues;\n if (NUMBER_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.\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 predicate = scalarPredicate(operatorId, fieldId, values);\n if (!predicate) return undefined;\n if ((operatorId === 'isNot' || operatorId === 'notIn') && !REQUIRED_FIELD_IDS.has(fieldId)) {\n return { op: 'or', args: [predicate, { op: 'notExists', path: fieldId }] };\n }\n return predicate;\n}\n\nfunction groupToSpanQueryPredicate(\n group: TraceFilterGroup,\n allowedFieldIds: ReadonlySet<string>,\n): TraceQueryScalarPredicate | undefined {\n const args = group.nodes\n .map(node =>\n isTraceFilterGroup(node)\n ? groupToSpanQueryPredicate(node, allowedFieldIds)\n : tokenToSpanQueryPredicate(node, allowedFieldIds),\n )\n .filter((predicate): predicate is TraceQueryScalarPredicate => Boolean(predicate));\n if (args.length === 0) return undefined;\n return args.length === 1 ? args[0] : { op: group.logic, args };\n}\n\n/**\n * The span query `where` for the filter bar's tokens and groups, or `undefined` when nothing applies.\n * Conditions the span query can't run (unknown fields, context, model or outcome fields or streaming timings without\n * the capability, unusable values) are left out instead of failing the request.\n */\nexport function buildSpanQueryWhere(\n tokens: TraceFilterToken[],\n groups: TraceFilterGroup[],\n {\n withContextFields,\n withOutcomeFields = false,\n withModelFields = false,\n ...support\n }: StreamingTimingSupport & { withContextFields: boolean; withOutcomeFields?: boolean; withModelFields?: boolean },\n): TraceQueryScalarPredicate | undefined {\n const allowedFieldIds = withoutUnrecordedStreamingTimings(\n new Set([\n ...SPAN_CORE_FILTER_FIELD_IDS,\n ...(withContextFields ? SPAN_CONTEXT_FILTER_FIELD_IDS : []),\n ...(withOutcomeFields ? SPAN_OUTCOME_FILTER_FIELD_IDS : []),\n ...(withModelFields ? SPAN_MODEL_FILTER_FIELD_IDS : []),\n ]),\n support,\n );\n const args = [\n ...tokens.map(token => tokenToSpanQueryPredicate(token, allowedFieldIds)),\n ...groups.map(group => groupToSpanQueryPredicate(group, allowedFieldIds)),\n ].filter((predicate): predicate is TraceQueryScalarPredicate => Boolean(predicate));\n return args.length ? { op: 'and', args } : undefined;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"span-filters.es.js","names":[],"sources":["../../../src/domains/spans/span-filters.ts"],"sourcesContent":["import { EntityType, SpanType } from '@mastra/core/observability';\nimport type { TraceQueryScalarPredicate } from '@mastra/core/storage';\nimport {\n isLegacyAnyValue,\n ROOT_ENTITY_TYPE_OPTIONS,\n TRACE_FILTER_BAR_LABELS,\n TRACE_NUMBER_OPERATORS,\n TRACE_PRESENCE_OPERATORS,\n TRACE_REQUIRED_STRING_OPERATORS,\n TRACE_STATUS_OPTIONS,\n TRACE_STRING_OPERATORS,\n TRACE_SYNTHETIC_OPERATORS,\n TRACE_TEXT_OPERATORS,\n createOutcomeFilterBarFields,\n traceFilterFieldColor,\n traceFilterFieldIcon,\n withoutUnrecordedStreamingTimings,\n} from '../traces/trace-filters';\nimport type { StreamingTimingSupport } from '../traces/trace-filters';\nimport { isTraceFilterGroup, scalarPredicate } from '../traces/trace-query-filters';\nimport type { TraceFilterGroup, TraceFilterOperatorId, TraceFilterToken } from '../traces/trace-query-filters';\nimport type { FilterBarField, FilterBarOption, FilterBarSuggestionsResolver } from '@/ds/components/FilterBar/types';\n\n/** Span query fields every store accepts. `startedAt`/`endedAt` are left to the time range. */\nexport const SPAN_CORE_FILTER_FIELD_IDS = [\n 'name',\n 'spanType',\n 'status',\n 'error',\n 'durationMs',\n 'timeToFirstChunkMs',\n 'timeToFirstTokenMs',\n 'entityType',\n 'entityId',\n 'entityName',\n 'entityVersionId',\n 'parentEntityVersionId',\n 'rootEntityVersionId',\n 'runId',\n 'sessionId',\n 'userId',\n 'organizationId',\n] as const;\n\n/** Span query fields the server only accepts when the store declares `spanQueryContextFields`. */\nexport const SPAN_CONTEXT_FILTER_FIELD_IDS = [\n 'traceId',\n 'spanId',\n 'parentSpanId',\n 'threadId',\n 'resourceId',\n 'requestId',\n 'serviceName',\n 'experimentId',\n 'environment',\n 'executionSource',\n 'parentEntityType',\n 'parentEntityId',\n 'parentEntityName',\n 'rootEntityType',\n 'rootEntityId',\n 'rootEntityName',\n] as const;\n\n/** Span query fields the server only accepts when the store declares `spanQueryOutcomeFields`. */\nexport const SPAN_OUTCOME_FILTER_FIELD_IDS = ['outcome', 'stopReason'] as const;\n\n/** Span query fields the server only accepts when the store declares `spanQueryModelFields`. */\nexport const SPAN_MODEL_FILTER_FIELD_IDS = ['model', 'provider'] as const;\n\nconst NUMBER_FIELD_IDS: ReadonlySet<string> = new Set(['durationMs', 'timeToFirstChunkMs', 'timeToFirstTokenMs']);\n/** The query can only test `error` for presence; any other operator is rejected. */\nconst PRESENCE_ONLY_FIELD_IDS: ReadonlySet<string> = new Set(['error']);\n/** Fields every span carries. On any other field, \"is not X\" must also keep spans where it is missing. */\nconst REQUIRED_FIELD_IDS: ReadonlySet<string> = new Set([\n 'name',\n 'spanType',\n 'status',\n 'traceId',\n 'spanId',\n 'durationMs',\n]);\n\nconst SPAN_FILTER_BAR_LABELS: Record<string, string> = {\n ...TRACE_FILTER_BAR_LABELS,\n name: 'Span name',\n spanType: 'Span type',\n spanId: 'Span ID',\n parentSpanId: 'Parent span ID',\n error: 'Error',\n timeToFirstChunkMs: 'Time to first chunk (ms)',\n timeToFirstTokenMs: 'Time to first token (ms)',\n executionSource: 'Execution source',\n entityType: 'Primitive type',\n entityVersionId: 'Primitive version ID',\n parentEntityType: 'Parent primitive type',\n parentEntityId: 'Parent primitive ID',\n parentEntityName: 'Parent primitive name',\n parentEntityVersionId: 'Parent primitive version ID',\n rootEntityType: 'Root primitive type',\n rootEntityId: 'Root primitive ID',\n rootEntityName: 'Root primitive name',\n rootEntityVersionId: 'Root primitive version ID',\n model: 'Model',\n provider: 'Provider',\n};\n\n/** Span fields without their own trace icon borrow the icon of the closest trace field. */\nconst SPAN_ICON_FIELD_ALIASES: Record<string, string> = {\n name: 'spans.name',\n spanType: 'spans.spanType',\n error: 'spans.error',\n timeToFirstChunkMs: 'durationMs',\n timeToFirstTokenMs: 'durationMs',\n spanId: 'traceId',\n parentSpanId: 'traceId',\n executionSource: 'runId',\n entityType: 'rootEntityType',\n parentEntityType: 'rootEntityType',\n entityVersionId: 'entityId',\n parentEntityId: 'entityId',\n parentEntityVersionId: 'entityId',\n rootEntityId: 'entityId',\n rootEntityVersionId: 'entityId',\n parentEntityName: 'entityName',\n rootEntityName: 'entityName',\n model: 'spans.model',\n provider: 'spans.provider',\n};\n\nconst spanFieldBase = (id: string) => ({\n id,\n label: SPAN_FILTER_BAR_LABELS[id] ?? id,\n icon: traceFilterFieldIcon(SPAN_ICON_FIELD_ALIASES[id] ?? id),\n color: traceFilterFieldColor(id),\n});\n\nconst humanize = (value: string) => {\n const words = value.replace(/_/g, ' ');\n return words.charAt(0).toUpperCase() + words.slice(1);\n};\n\nconst byLabel = (a: { label?: string; value: string }, b: { label?: string; value: string }) =>\n (a.label ?? a.value).localeCompare(b.label ?? b.value);\n\nconst ENTITY_TYPE_LABELS: Record<string, string> = Object.fromEntries(\n ROOT_ENTITY_TYPE_OPTIONS.map(option => [option.entityType, option.label]),\n);\n\nconst SPAN_TYPE_OPTIONS: FilterBarOption[] = Object.values(SpanType)\n .map(value => ({ value, label: humanize(value) }))\n .sort(byLabel);\n\nconst ENTITY_TYPE_OPTIONS: FilterBarOption[] = Object.values(EntityType)\n .map(value => ({ value, label: ENTITY_TYPE_LABELS[value] ?? humanize(value) }))\n .sort(byLabel);\n\nconst STATUS_OPTIONS: FilterBarOption[] = TRACE_STATUS_OPTIONS.filter(option => option.value !== 'running').map(\n option => ({ value: option.value, label: option.label }),\n);\n\n/** FilterBar fields for the spans page: only paths and operators `querySpans()` accepts. */\nexport function createSpanFilterBarFields({\n withContextFields,\n withTimeToFirstChunk,\n withTimeToFirstToken,\n withOutcomeFields = false,\n withModelFields = false,\n entityNames,\n environments,\n valueSuggestions,\n}: StreamingTimingSupport & {\n /** Offer the context fields. Only when the server declares `spanQueryContextFields`. */\n withContextFields: boolean;\n /** Offer `outcome` and `stopReason`. Only when the server declares `spanQueryOutcomeFields`. */\n withOutcomeFields?: boolean;\n /** Offer `model` and `provider`. Only when the server declares `spanQueryModelFields`. */\n withModelFields?: boolean;\n entityNames: readonly string[];\n environments: readonly string[];\n /** Builds a lazy value resolver for a span field. Absent → free text. */\n valueSuggestions?: (path: string) => FilterBarSuggestionsResolver;\n}): FilterBarField[] {\n const pick = (\n id: string,\n suggestions: FilterBarOption[],\n operators: TraceFilterOperatorId[] = TRACE_STRING_OPERATORS,\n ): FilterBarField => ({ ...spanFieldBase(id), operators, strict: true, suggestions });\n const names = entityNames.map(value => ({ value }));\n\n const field = (id: string): FilterBarField => {\n switch (id) {\n case 'status':\n return pick(id, STATUS_OPTIONS, TRACE_SYNTHETIC_OPERATORS);\n case 'spanType':\n return pick(id, SPAN_TYPE_OPTIONS, TRACE_REQUIRED_STRING_OPERATORS);\n case 'entityType':\n case 'parentEntityType':\n case 'rootEntityType':\n return pick(id, ENTITY_TYPE_OPTIONS);\n case 'entityName':\n case 'rootEntityName':\n return pick(id, names);\n case 'environment':\n return pick(\n id,\n environments.map(value => ({ value })),\n );\n case 'name': {\n const resolver = valueSuggestions?.(id);\n return {\n ...spanFieldBase(id),\n operators: TRACE_TEXT_OPERATORS,\n ...(resolver ? { strict: true, suggestions: resolver } : {}),\n };\n }\n case 'error':\n return { ...spanFieldBase(id), operators: TRACE_PRESENCE_OPERATORS };\n case 'durationMs':\n case 'timeToFirstChunkMs':\n case 'timeToFirstTokenMs':\n return { ...spanFieldBase(id), type: 'number', operators: TRACE_NUMBER_OPERATORS };\n case 'traceId':\n case 'spanId':\n return { ...spanFieldBase(id), operators: TRACE_REQUIRED_STRING_OPERATORS };\n case 'model':\n case 'provider': {\n const resolver = valueSuggestions?.(id);\n return {\n ...spanFieldBase(id),\n operators: TRACE_STRING_OPERATORS,\n ...(resolver ? { suggestions: resolver } : {}),\n };\n }\n default:\n return { ...spanFieldBase(id), operators: TRACE_STRING_OPERATORS };\n }\n };\n\n const offered = withoutUnrecordedStreamingTimings(\n new Set([...SPAN_CORE_FILTER_FIELD_IDS, ...SPAN_CONTEXT_FILTER_FIELD_IDS]),\n {\n withTimeToFirstChunk,\n withTimeToFirstToken,\n },\n );\n const sortFields = (ids: readonly string[]) =>\n ids\n .filter(id => offered.has(id))\n .map(field)\n .sort((a, b) => a.label.localeCompare(b.label));\n return [\n ...sortFields(SPAN_CORE_FILTER_FIELD_IDS),\n ...(withContextFields ? sortFields(SPAN_CONTEXT_FILTER_FIELD_IDS) : []),\n ...(withModelFields ? SPAN_MODEL_FILTER_FIELD_IDS.map(field) : []),\n ...(withOutcomeFields ? createOutcomeFilterBarFields(spanFieldBase, valueSuggestions) : []),\n ];\n}\n\nfunction tokenToSpanQueryPredicate(\n token: TraceFilterToken,\n allowedFieldIds: ReadonlySet<string>,\n): TraceQueryScalarPredicate | undefined {\n const { fieldId } = token;\n if (!allowedFieldIds.has(fieldId)) return undefined;\n const operatorId = token.operatorId ?? 'is';\n const isPresence = operatorId === 'exists' || operatorId === 'notExists';\n if (PRESENCE_ONLY_FIELD_IDS.has(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 let values: (string | number)[] = rawValues;\n if (NUMBER_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.\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 predicate = scalarPredicate(operatorId, fieldId, values);\n if (!predicate) return undefined;\n if ((operatorId === 'isNot' || operatorId === 'notIn') && !REQUIRED_FIELD_IDS.has(fieldId)) {\n return { op: 'or', args: [predicate, { op: 'notExists', path: fieldId }] };\n }\n return predicate;\n}\n\nfunction groupToSpanQueryPredicate(\n group: TraceFilterGroup,\n allowedFieldIds: ReadonlySet<string>,\n): TraceQueryScalarPredicate | undefined {\n const args = group.nodes\n .map(node =>\n isTraceFilterGroup(node)\n ? groupToSpanQueryPredicate(node, allowedFieldIds)\n : tokenToSpanQueryPredicate(node, allowedFieldIds),\n )\n .filter((predicate): predicate is TraceQueryScalarPredicate => Boolean(predicate));\n if (args.length === 0) return undefined;\n return args.length === 1 ? args[0] : { op: group.logic, args };\n}\n\n/**\n * The span query `where` for the filter bar's tokens and groups, or `undefined` when nothing applies.\n * Conditions the span query can't run (unknown fields, context, model or outcome fields or streaming timings without\n * the capability, unusable values) are left out instead of failing the request.\n */\nexport function buildSpanQueryWhere(\n tokens: TraceFilterToken[],\n groups: TraceFilterGroup[],\n {\n withContextFields,\n withOutcomeFields = false,\n withModelFields = false,\n ...support\n }: StreamingTimingSupport & { withContextFields: boolean; withOutcomeFields?: boolean; withModelFields?: boolean },\n): TraceQueryScalarPredicate | undefined {\n const allowedFieldIds = withoutUnrecordedStreamingTimings(\n new Set([\n ...SPAN_CORE_FILTER_FIELD_IDS,\n ...(withContextFields ? SPAN_CONTEXT_FILTER_FIELD_IDS : []),\n ...(withOutcomeFields ? SPAN_OUTCOME_FILTER_FIELD_IDS : []),\n ...(withModelFields ? SPAN_MODEL_FILTER_FIELD_IDS : []),\n ]),\n support,\n );\n const args = [\n ...tokens.map(token => tokenToSpanQueryPredicate(token, allowedFieldIds)),\n ...groups.map(group => groupToSpanQueryPredicate(group, allowedFieldIds)),\n ].filter((predicate): predicate is TraceQueryScalarPredicate => Boolean(predicate));\n return args.length ? { op: 'and', args } : undefined;\n}\n"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
2
|
const require_domains_threads_thread_filters = require("../thread-filters.cjs.js");
|
|
3
3
|
const require_domains_traces_trace_list_columns = require("../../traces/trace-list-columns.cjs.js");
|
|
4
|
-
const require_observability_saved_views = require("../../../observability-saved-views-
|
|
4
|
+
const require_observability_saved_views = require("../../../observability-saved-views-BAzxxoAr.cjs");
|
|
5
5
|
const require_domains_observability_components_observability_list_body = require("../../observability/components/observability-list-body.cjs.js");
|
|
6
6
|
const require_domains_observability_hooks_use_observability_list_filters = require("../../observability/hooks/use-observability-list-filters.cjs.js");
|
|
7
7
|
const require_domains_traces_components_columns_menu_columns_menu = require("../../traces/components/columns-menu/columns-menu.cjs.js");
|
|
@@ -9,7 +9,7 @@ const require_domains_traces_components_no_traces_info = require("../../traces/c
|
|
|
9
9
|
const require_domains_traces_components_traces_error_content = require("../../traces/components/traces-error-content.cjs.js");
|
|
10
10
|
const require_domains_traces_components_traces_list_view = require("../../traces/components/traces-list-view.cjs.js");
|
|
11
11
|
const require_domains_traces_hooks_use_trace_column_preferences = require("../../traces/hooks/use-trace-column-preferences.cjs.js");
|
|
12
|
-
const require_ActionRow = require("../../../ActionRow-
|
|
12
|
+
const require_ActionRow = require("../../../ActionRow-BlC9GAef.cjs");
|
|
13
13
|
const require_domains_threads_hooks_use_threads_list_source = require("../hooks/use-threads-list-source.cjs.js");
|
|
14
14
|
const require_domains_threads_thread_list_row = require("../thread-list-row.cjs.js");
|
|
15
15
|
const require_domains_threads_components_threads_filter_bar = require("./threads-filter-bar.cjs.js");
|
|
@@ -78,11 +78,7 @@ function ThreadsExplorerBody({ selectedThreadId, onSelectedThreadChange, onOpenS
|
|
|
78
78
|
page: "threads",
|
|
79
79
|
...urlState,
|
|
80
80
|
columns
|
|
81
|
-
}), /* @__PURE__ */ (0, react_jsx_runtime.
|
|
82
|
-
scope: "threads",
|
|
83
|
-
value: columns.preferences,
|
|
84
|
-
onChange: columns.setPreferences
|
|
85
|
-
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_domains_threads_components_threads_filter_bar.ThreadsFilterBar, {
|
|
81
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_ActionRow.ActionRow, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_ActionRow.ActionRow.Start, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_domains_threads_components_threads_filter_bar.ThreadsFilterBar, {
|
|
86
82
|
datePreset: filters.datePreset,
|
|
87
83
|
dateFrom: filters.dateFrom,
|
|
88
84
|
dateTo: filters.dateTo,
|
|
@@ -93,7 +89,11 @@ function ThreadsExplorerBody({ selectedThreadId, onSelectedThreadChange, onOpenS
|
|
|
93
89
|
onDateRangeChange: filters.onDateRangeChange,
|
|
94
90
|
onFiltersChange: filters.onFiltersChange,
|
|
95
91
|
disabled: isLoading
|
|
96
|
-
})
|
|
92
|
+
}) }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_ActionRow.ActionRow.End, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_domains_traces_components_columns_menu_columns_menu.ColumnsMenu, {
|
|
93
|
+
scope: "threads",
|
|
94
|
+
value: columns.preferences,
|
|
95
|
+
onChange: columns.setPreferences
|
|
96
|
+
}) })] })] }),
|
|
97
97
|
error: isError ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_domains_traces_components_traces_error_content.TracesErrorContent, {
|
|
98
98
|
error,
|
|
99
99
|
resource: "threads",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"threads-explorer-body.cjs.js","names":["useObservabilityListFilters","useTraceQueryAvailable","useFeedbackAvailable","useTraceColumnPreferences","useObservabilityCapabilities","useMemo","withoutUnrecordedStreamingColumns","buildThreadQueryWhere","useThreadsListSource","threadToListRow","_Fragment","ObservabilityListBody","ObservabilitySavedViews","ActionRow","ColumnsMenu","ThreadsFilterBar","TracesErrorContent","NoTracesInfo","TracesListView","TraceThreadPanel"],"sources":["../../../../src/domains/threads/components/threads-explorer-body.tsx"],"sourcesContent":["import { useObservabilityCapabilities } from '@mastra/react/hooks/capabilities';\nimport type { ThreadQueryArgs } from '@mastra/react/hooks/traces';\nimport { useMemo } from 'react';\nimport { useThreadsListSource } from '../hooks/use-threads-list-source';\nimport { buildThreadQueryWhere } from '../thread-filters';\nimport { threadToListRow } from '../thread-list-row';\nimport { ThreadsFilterBar } from './threads-filter-bar';\nimport { useFeedbackAvailable, useTraceQueryAvailable } from '@/domains/capabilities';\nimport { ObservabilityListBody } from '@/domains/observability/components/observability-list-body';\nimport { useObservabilityListFilters } from '@/domains/observability/hooks/use-observability-list-filters';\nimport type { ObservabilityListUrlState } from '@/domains/observability/hooks/use-observability-list-filters';\nimport { ObservabilitySavedViews } from '@/domains/observability/saved-views';\nimport { ColumnsMenu } from '@/domains/traces/components/columns-menu';\nimport { NoTracesInfo } from '@/domains/traces/components/no-traces-info';\nimport { TraceThreadPanel } from '@/domains/traces/components/trace-thread-panel';\nimport { TracesErrorContent } from '@/domains/traces/components/traces-error-content';\nimport { TracesListView } from '@/domains/traces/components/traces-list-view';\nimport type { TracesListViewTrace } from '@/domains/traces/components/traces-list-view';\nimport { useTraceColumnPreferences } from '@/domains/traces/hooks/use-trace-column-preferences';\nimport { withoutUnrecordedStreamingColumns } from '@/domains/traces/trace-list-columns';\nimport { ActionRow } from '@/ds/components/ActionRow';\n\nexport type ThreadsExplorerBodyProps = {\n /** The open thread. The host keeps it (e.g. in the URL) so it survives a reload. */\n selectedThreadId: string | undefined;\n onSelectedThreadChange: (threadId: string | undefined) => void;\n /** Opens a score from the thread drawer; scores live on host routes. */\n onOpenScore: (traceId: string, scoreId: string) => void;\n /** The host's search params, so the time range, filters and sort survive a reload. Omitted: kept in memory. */\n urlState?: ObservabilityListUrlState;\n};\n\n/** The threads page body: filter bar, thread list and the thread drawer. Router-agnostic. */\nexport function ThreadsExplorerBody({\n selectedThreadId,\n onSelectedThreadChange,\n onOpenScore,\n urlState,\n}: ThreadsExplorerBodyProps) {\n const filters = useObservabilityListFilters(urlState);\n const { timeRange, tokens, groups, sort } = filters;\n const withQueryTrace = useTraceQueryAvailable().enabled;\n const withFeedback = useFeedbackAvailable().enabled;\n const columns = useTraceColumnPreferences({ scope: 'threads' });\n const { data: capabilities, isLoading: isCapabilitiesLoading } = useObservabilityCapabilities();\n const withTimeToFirstChunk = capabilities?.capabilities.traceQueryTimeToFirstChunk ?? false;\n const withTimeToFirstToken = capabilities?.capabilities.traceQueryTimeToFirstToken ?? false;\n\n // Stored columns the store can't fill stay saved but aren't drawn, so they come back on a store that can.\n const displayedColumns = useMemo(\n () =>\n isCapabilitiesLoading\n ? columns.preferences\n : withoutUnrecordedStreamingColumns(columns.preferences, { withTimeToFirstChunk, withTimeToFirstToken }),\n [columns.preferences, isCapabilitiesLoading, withTimeToFirstChunk, withTimeToFirstToken],\n );\n\n // Threads with trace activity in the window, like the traces list for the same chip.\n const query = useMemo<ThreadQueryArgs>(() => {\n const where = buildThreadQueryWhere(tokens, groups, { withTimeToFirstChunk, withTimeToFirstToken });\n return {\n timeRange: { traces: timeRange },\n orderBy: [{ field: 'startedAt', direction: sort.direction }],\n ...(where ? { where } : {}),\n };\n }, [timeRange, sort, tokens, groups, withTimeToFirstChunk, withTimeToFirstToken]);\n\n const { threads, hasNextPage, isFetchingNextPage, setEndOfListElement, isLoading, isError, error } =\n useThreadsListSource({ query, rolling: filters.rolling });\n\n const rows = useMemo(() => (threads ?? []).map(threadToListRow), [threads]);\n const selectedRow = rows.find(row => row.threadId === selectedThreadId);\n\n // The drawer is modal, so the list behind it cannot be clicked while a thread is open.\n const handleThreadClick = (row: TracesListViewTrace) => {\n if (row.threadId) onSelectedThreadChange(row.threadId);\n };\n\n // Same rule as /traces: an empty window without filters gets the full-page empty state.\n const showEmptyState =\n !isLoading && !isError && rows.length === 0 && !filters.contentFiltersApplied && !selectedThreadId;\n\n return (\n <>\n <h1 className=\"sr-only\">Threads</h1>\n <ObservabilityListBody\n toolbar={\n <>\n {urlState && <ObservabilitySavedViews page=\"threads\" {...urlState} columns={columns} />}\n <ActionRow>\n <ActionRow.Start>\n <ColumnsMenu scope=\"threads\" value={columns.preferences} onChange={columns.setPreferences} />\n <ThreadsFilterBar\n datePreset={filters.datePreset}\n dateFrom={filters.dateFrom}\n dateTo={filters.dateTo}\n tokens={tokens}\n groups={groups}\n onDatePresetChange={filters.onDatePresetChange}\n onDateChange={filters.onDateChange}\n onDateRangeChange={filters.onDateRangeChange}\n onFiltersChange={filters.onFiltersChange}\n disabled={isLoading}\n />\n </ActionRow.Start>\n </ActionRow>\n </>\n }\n error={\n isError ? (\n <TracesErrorContent error={error} resource=\"threads\" errorTitle=\"Failed to load threads\" />\n ) : undefined\n }\n empty={\n showEmptyState ? (\n <NoTracesInfo\n resource=\"threads\"\n datePreset={filters.datePreset}\n dateFrom={filters.dateFrom}\n dateTo={filters.dateTo}\n />\n ) : undefined\n }\n >\n <TracesListView\n listId=\"all-threads\"\n columnPreferences={displayedColumns}\n outcomeColumn={false}\n traces={rows}\n isLoading={isLoading}\n isFetchingNextPage={isFetchingNextPage}\n hasNextPage={hasNextPage}\n setEndOfListElement={setEndOfListElement}\n filtersApplied={filters.filtersApplied}\n resource=\"threads\"\n sort={sort}\n onSortChange={next => filters.setSort({ field: 'startedAt', direction: next.direction })}\n featuredTraceId={selectedRow?.traceId}\n onTraceClick={handleThreadClick}\n />\n </ObservabilityListBody>\n <TraceThreadPanel\n open={!!selectedThreadId}\n threadId={selectedThreadId ?? ''}\n depth={1}\n closeLabel=\"Close\"\n withQueryTrace={withQueryTrace}\n withFeedback={withFeedback}\n onOpenScore={onOpenScore}\n onClose={() => onSelectedThreadChange(undefined)}\n />\n </>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"threads-explorer-body.cjs.js","names":["useObservabilityListFilters","useTraceQueryAvailable","useFeedbackAvailable","useTraceColumnPreferences","useObservabilityCapabilities","useMemo","withoutUnrecordedStreamingColumns","buildThreadQueryWhere","useThreadsListSource","threadToListRow","_Fragment","ObservabilityListBody","ObservabilitySavedViews","ActionRow","ThreadsFilterBar","ColumnsMenu","TracesErrorContent","NoTracesInfo","TracesListView","TraceThreadPanel"],"sources":["../../../../src/domains/threads/components/threads-explorer-body.tsx"],"sourcesContent":["import { useObservabilityCapabilities } from '@mastra/react/hooks/capabilities';\nimport type { ThreadQueryArgs } from '@mastra/react/hooks/traces';\nimport { useMemo } from 'react';\nimport { useThreadsListSource } from '../hooks/use-threads-list-source';\nimport { buildThreadQueryWhere } from '../thread-filters';\nimport { threadToListRow } from '../thread-list-row';\nimport { ThreadsFilterBar } from './threads-filter-bar';\nimport { useFeedbackAvailable, useTraceQueryAvailable } from '@/domains/capabilities';\nimport { ObservabilityListBody } from '@/domains/observability/components/observability-list-body';\nimport { useObservabilityListFilters } from '@/domains/observability/hooks/use-observability-list-filters';\nimport type { ObservabilityListUrlState } from '@/domains/observability/hooks/use-observability-list-filters';\nimport { ObservabilitySavedViews } from '@/domains/observability/saved-views';\nimport { ColumnsMenu } from '@/domains/traces/components/columns-menu';\nimport { NoTracesInfo } from '@/domains/traces/components/no-traces-info';\nimport { TraceThreadPanel } from '@/domains/traces/components/trace-thread-panel';\nimport { TracesErrorContent } from '@/domains/traces/components/traces-error-content';\nimport { TracesListView } from '@/domains/traces/components/traces-list-view';\nimport type { TracesListViewTrace } from '@/domains/traces/components/traces-list-view';\nimport { useTraceColumnPreferences } from '@/domains/traces/hooks/use-trace-column-preferences';\nimport { withoutUnrecordedStreamingColumns } from '@/domains/traces/trace-list-columns';\nimport { ActionRow } from '@/ds/components/ActionRow';\n\nexport type ThreadsExplorerBodyProps = {\n /** The open thread. The host keeps it (e.g. in the URL) so it survives a reload. */\n selectedThreadId: string | undefined;\n onSelectedThreadChange: (threadId: string | undefined) => void;\n /** Opens a score from the thread drawer; scores live on host routes. */\n onOpenScore: (traceId: string, scoreId: string) => void;\n /** The host's search params, so the time range, filters and sort survive a reload. Omitted: kept in memory. */\n urlState?: ObservabilityListUrlState;\n};\n\n/** The threads page body: filter bar, thread list and the thread drawer. Router-agnostic. */\nexport function ThreadsExplorerBody({\n selectedThreadId,\n onSelectedThreadChange,\n onOpenScore,\n urlState,\n}: ThreadsExplorerBodyProps) {\n const filters = useObservabilityListFilters(urlState);\n const { timeRange, tokens, groups, sort } = filters;\n const withQueryTrace = useTraceQueryAvailable().enabled;\n const withFeedback = useFeedbackAvailable().enabled;\n const columns = useTraceColumnPreferences({ scope: 'threads' });\n const { data: capabilities, isLoading: isCapabilitiesLoading } = useObservabilityCapabilities();\n const withTimeToFirstChunk = capabilities?.capabilities.traceQueryTimeToFirstChunk ?? false;\n const withTimeToFirstToken = capabilities?.capabilities.traceQueryTimeToFirstToken ?? false;\n\n // Stored columns the store can't fill stay saved but aren't drawn, so they come back on a store that can.\n const displayedColumns = useMemo(\n () =>\n isCapabilitiesLoading\n ? columns.preferences\n : withoutUnrecordedStreamingColumns(columns.preferences, { withTimeToFirstChunk, withTimeToFirstToken }),\n [columns.preferences, isCapabilitiesLoading, withTimeToFirstChunk, withTimeToFirstToken],\n );\n\n // Threads with trace activity in the window, like the traces list for the same chip.\n const query = useMemo<ThreadQueryArgs>(() => {\n const where = buildThreadQueryWhere(tokens, groups, { withTimeToFirstChunk, withTimeToFirstToken });\n return {\n timeRange: { traces: timeRange },\n orderBy: [{ field: 'startedAt', direction: sort.direction }],\n ...(where ? { where } : {}),\n };\n }, [timeRange, sort, tokens, groups, withTimeToFirstChunk, withTimeToFirstToken]);\n\n const { threads, hasNextPage, isFetchingNextPage, setEndOfListElement, isLoading, isError, error } =\n useThreadsListSource({ query, rolling: filters.rolling });\n\n const rows = useMemo(() => (threads ?? []).map(threadToListRow), [threads]);\n const selectedRow = rows.find(row => row.threadId === selectedThreadId);\n\n // The drawer is modal, so the list behind it cannot be clicked while a thread is open.\n const handleThreadClick = (row: TracesListViewTrace) => {\n if (row.threadId) onSelectedThreadChange(row.threadId);\n };\n\n // Same rule as /traces: an empty window without filters gets the full-page empty state.\n const showEmptyState =\n !isLoading && !isError && rows.length === 0 && !filters.contentFiltersApplied && !selectedThreadId;\n\n return (\n <>\n <h1 className=\"sr-only\">Threads</h1>\n <ObservabilityListBody\n toolbar={\n <>\n {urlState && <ObservabilitySavedViews page=\"threads\" {...urlState} columns={columns} />}\n <ActionRow>\n <ActionRow.Start>\n <ThreadsFilterBar\n datePreset={filters.datePreset}\n dateFrom={filters.dateFrom}\n dateTo={filters.dateTo}\n tokens={tokens}\n groups={groups}\n onDatePresetChange={filters.onDatePresetChange}\n onDateChange={filters.onDateChange}\n onDateRangeChange={filters.onDateRangeChange}\n onFiltersChange={filters.onFiltersChange}\n disabled={isLoading}\n />\n </ActionRow.Start>\n <ActionRow.End>\n <ColumnsMenu scope=\"threads\" value={columns.preferences} onChange={columns.setPreferences} />\n </ActionRow.End>\n </ActionRow>\n </>\n }\n error={\n isError ? (\n <TracesErrorContent error={error} resource=\"threads\" errorTitle=\"Failed to load threads\" />\n ) : undefined\n }\n empty={\n showEmptyState ? (\n <NoTracesInfo\n resource=\"threads\"\n datePreset={filters.datePreset}\n dateFrom={filters.dateFrom}\n dateTo={filters.dateTo}\n />\n ) : undefined\n }\n >\n <TracesListView\n listId=\"all-threads\"\n columnPreferences={displayedColumns}\n outcomeColumn={false}\n traces={rows}\n isLoading={isLoading}\n isFetchingNextPage={isFetchingNextPage}\n hasNextPage={hasNextPage}\n setEndOfListElement={setEndOfListElement}\n filtersApplied={filters.filtersApplied}\n resource=\"threads\"\n sort={sort}\n onSortChange={next => filters.setSort({ field: 'startedAt', direction: next.direction })}\n featuredTraceId={selectedRow?.traceId}\n onTraceClick={handleThreadClick}\n />\n </ObservabilityListBody>\n <TraceThreadPanel\n open={!!selectedThreadId}\n threadId={selectedThreadId ?? ''}\n depth={1}\n closeLabel=\"Close\"\n withQueryTrace={withQueryTrace}\n withFeedback={withFeedback}\n onOpenScore={onOpenScore}\n onClose={() => onSelectedThreadChange(undefined)}\n />\n </>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { useFeedbackAvailable, useTraceQueryAvailable } from "../../capabilities.es.js";
|
|
2
2
|
import { buildThreadQueryWhere } from "../thread-filters.es.js";
|
|
3
3
|
import { withoutUnrecordedStreamingColumns } from "../../traces/trace-list-columns.es.js";
|
|
4
|
-
import { t as ObservabilitySavedViews } from "../../../observability-saved-views-
|
|
4
|
+
import { t as ObservabilitySavedViews } from "../../../observability-saved-views-BBam8Fr5.js";
|
|
5
5
|
import { ObservabilityListBody } from "../../observability/components/observability-list-body.es.js";
|
|
6
6
|
import { useObservabilityListFilters } from "../../observability/hooks/use-observability-list-filters.es.js";
|
|
7
7
|
import { ColumnsMenu } from "../../traces/components/columns-menu/columns-menu.es.js";
|
|
@@ -9,7 +9,7 @@ import { NoTracesInfo } from "../../traces/components/no-traces-info.es.js";
|
|
|
9
9
|
import { TracesErrorContent } from "../../traces/components/traces-error-content.es.js";
|
|
10
10
|
import { TracesListView } from "../../traces/components/traces-list-view.es.js";
|
|
11
11
|
import { useTraceColumnPreferences } from "../../traces/hooks/use-trace-column-preferences.es.js";
|
|
12
|
-
import { t as ActionRow } from "../../../ActionRow-
|
|
12
|
+
import { t as ActionRow } from "../../../ActionRow-DCrRCvBq.js";
|
|
13
13
|
import { useThreadsListSource } from "../hooks/use-threads-list-source.es.js";
|
|
14
14
|
import { threadToListRow } from "../thread-list-row.es.js";
|
|
15
15
|
import { ThreadsFilterBar } from "./threads-filter-bar.es.js";
|
|
@@ -78,11 +78,7 @@ function ThreadsExplorerBody({ selectedThreadId, onSelectedThreadChange, onOpenS
|
|
|
78
78
|
page: "threads",
|
|
79
79
|
...urlState,
|
|
80
80
|
columns
|
|
81
|
-
}), /* @__PURE__ */
|
|
82
|
-
scope: "threads",
|
|
83
|
-
value: columns.preferences,
|
|
84
|
-
onChange: columns.setPreferences
|
|
85
|
-
}), /* @__PURE__ */ jsx(ThreadsFilterBar, {
|
|
81
|
+
}), /* @__PURE__ */ jsxs(ActionRow, { children: [/* @__PURE__ */ jsx(ActionRow.Start, { children: /* @__PURE__ */ jsx(ThreadsFilterBar, {
|
|
86
82
|
datePreset: filters.datePreset,
|
|
87
83
|
dateFrom: filters.dateFrom,
|
|
88
84
|
dateTo: filters.dateTo,
|
|
@@ -93,7 +89,11 @@ function ThreadsExplorerBody({ selectedThreadId, onSelectedThreadChange, onOpenS
|
|
|
93
89
|
onDateRangeChange: filters.onDateRangeChange,
|
|
94
90
|
onFiltersChange: filters.onFiltersChange,
|
|
95
91
|
disabled: isLoading
|
|
96
|
-
})
|
|
92
|
+
}) }), /* @__PURE__ */ jsx(ActionRow.End, { children: /* @__PURE__ */ jsx(ColumnsMenu, {
|
|
93
|
+
scope: "threads",
|
|
94
|
+
value: columns.preferences,
|
|
95
|
+
onChange: columns.setPreferences
|
|
96
|
+
}) })] })] }),
|
|
97
97
|
error: isError ? /* @__PURE__ */ jsx(TracesErrorContent, {
|
|
98
98
|
error,
|
|
99
99
|
resource: "threads",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"threads-explorer-body.es.js","names":["_Fragment"],"sources":["../../../../src/domains/threads/components/threads-explorer-body.tsx"],"sourcesContent":["import { useObservabilityCapabilities } from '@mastra/react/hooks/capabilities';\nimport type { ThreadQueryArgs } from '@mastra/react/hooks/traces';\nimport { useMemo } from 'react';\nimport { useThreadsListSource } from '../hooks/use-threads-list-source';\nimport { buildThreadQueryWhere } from '../thread-filters';\nimport { threadToListRow } from '../thread-list-row';\nimport { ThreadsFilterBar } from './threads-filter-bar';\nimport { useFeedbackAvailable, useTraceQueryAvailable } from '@/domains/capabilities';\nimport { ObservabilityListBody } from '@/domains/observability/components/observability-list-body';\nimport { useObservabilityListFilters } from '@/domains/observability/hooks/use-observability-list-filters';\nimport type { ObservabilityListUrlState } from '@/domains/observability/hooks/use-observability-list-filters';\nimport { ObservabilitySavedViews } from '@/domains/observability/saved-views';\nimport { ColumnsMenu } from '@/domains/traces/components/columns-menu';\nimport { NoTracesInfo } from '@/domains/traces/components/no-traces-info';\nimport { TraceThreadPanel } from '@/domains/traces/components/trace-thread-panel';\nimport { TracesErrorContent } from '@/domains/traces/components/traces-error-content';\nimport { TracesListView } from '@/domains/traces/components/traces-list-view';\nimport type { TracesListViewTrace } from '@/domains/traces/components/traces-list-view';\nimport { useTraceColumnPreferences } from '@/domains/traces/hooks/use-trace-column-preferences';\nimport { withoutUnrecordedStreamingColumns } from '@/domains/traces/trace-list-columns';\nimport { ActionRow } from '@/ds/components/ActionRow';\n\nexport type ThreadsExplorerBodyProps = {\n /** The open thread. The host keeps it (e.g. in the URL) so it survives a reload. */\n selectedThreadId: string | undefined;\n onSelectedThreadChange: (threadId: string | undefined) => void;\n /** Opens a score from the thread drawer; scores live on host routes. */\n onOpenScore: (traceId: string, scoreId: string) => void;\n /** The host's search params, so the time range, filters and sort survive a reload. Omitted: kept in memory. */\n urlState?: ObservabilityListUrlState;\n};\n\n/** The threads page body: filter bar, thread list and the thread drawer. Router-agnostic. */\nexport function ThreadsExplorerBody({\n selectedThreadId,\n onSelectedThreadChange,\n onOpenScore,\n urlState,\n}: ThreadsExplorerBodyProps) {\n const filters = useObservabilityListFilters(urlState);\n const { timeRange, tokens, groups, sort } = filters;\n const withQueryTrace = useTraceQueryAvailable().enabled;\n const withFeedback = useFeedbackAvailable().enabled;\n const columns = useTraceColumnPreferences({ scope: 'threads' });\n const { data: capabilities, isLoading: isCapabilitiesLoading } = useObservabilityCapabilities();\n const withTimeToFirstChunk = capabilities?.capabilities.traceQueryTimeToFirstChunk ?? false;\n const withTimeToFirstToken = capabilities?.capabilities.traceQueryTimeToFirstToken ?? false;\n\n // Stored columns the store can't fill stay saved but aren't drawn, so they come back on a store that can.\n const displayedColumns = useMemo(\n () =>\n isCapabilitiesLoading\n ? columns.preferences\n : withoutUnrecordedStreamingColumns(columns.preferences, { withTimeToFirstChunk, withTimeToFirstToken }),\n [columns.preferences, isCapabilitiesLoading, withTimeToFirstChunk, withTimeToFirstToken],\n );\n\n // Threads with trace activity in the window, like the traces list for the same chip.\n const query = useMemo<ThreadQueryArgs>(() => {\n const where = buildThreadQueryWhere(tokens, groups, { withTimeToFirstChunk, withTimeToFirstToken });\n return {\n timeRange: { traces: timeRange },\n orderBy: [{ field: 'startedAt', direction: sort.direction }],\n ...(where ? { where } : {}),\n };\n }, [timeRange, sort, tokens, groups, withTimeToFirstChunk, withTimeToFirstToken]);\n\n const { threads, hasNextPage, isFetchingNextPage, setEndOfListElement, isLoading, isError, error } =\n useThreadsListSource({ query, rolling: filters.rolling });\n\n const rows = useMemo(() => (threads ?? []).map(threadToListRow), [threads]);\n const selectedRow = rows.find(row => row.threadId === selectedThreadId);\n\n // The drawer is modal, so the list behind it cannot be clicked while a thread is open.\n const handleThreadClick = (row: TracesListViewTrace) => {\n if (row.threadId) onSelectedThreadChange(row.threadId);\n };\n\n // Same rule as /traces: an empty window without filters gets the full-page empty state.\n const showEmptyState =\n !isLoading && !isError && rows.length === 0 && !filters.contentFiltersApplied && !selectedThreadId;\n\n return (\n <>\n <h1 className=\"sr-only\">Threads</h1>\n <ObservabilityListBody\n toolbar={\n <>\n {urlState && <ObservabilitySavedViews page=\"threads\" {...urlState} columns={columns} />}\n <ActionRow>\n <ActionRow.Start>\n <
|
|
1
|
+
{"version":3,"file":"threads-explorer-body.es.js","names":["_Fragment"],"sources":["../../../../src/domains/threads/components/threads-explorer-body.tsx"],"sourcesContent":["import { useObservabilityCapabilities } from '@mastra/react/hooks/capabilities';\nimport type { ThreadQueryArgs } from '@mastra/react/hooks/traces';\nimport { useMemo } from 'react';\nimport { useThreadsListSource } from '../hooks/use-threads-list-source';\nimport { buildThreadQueryWhere } from '../thread-filters';\nimport { threadToListRow } from '../thread-list-row';\nimport { ThreadsFilterBar } from './threads-filter-bar';\nimport { useFeedbackAvailable, useTraceQueryAvailable } from '@/domains/capabilities';\nimport { ObservabilityListBody } from '@/domains/observability/components/observability-list-body';\nimport { useObservabilityListFilters } from '@/domains/observability/hooks/use-observability-list-filters';\nimport type { ObservabilityListUrlState } from '@/domains/observability/hooks/use-observability-list-filters';\nimport { ObservabilitySavedViews } from '@/domains/observability/saved-views';\nimport { ColumnsMenu } from '@/domains/traces/components/columns-menu';\nimport { NoTracesInfo } from '@/domains/traces/components/no-traces-info';\nimport { TraceThreadPanel } from '@/domains/traces/components/trace-thread-panel';\nimport { TracesErrorContent } from '@/domains/traces/components/traces-error-content';\nimport { TracesListView } from '@/domains/traces/components/traces-list-view';\nimport type { TracesListViewTrace } from '@/domains/traces/components/traces-list-view';\nimport { useTraceColumnPreferences } from '@/domains/traces/hooks/use-trace-column-preferences';\nimport { withoutUnrecordedStreamingColumns } from '@/domains/traces/trace-list-columns';\nimport { ActionRow } from '@/ds/components/ActionRow';\n\nexport type ThreadsExplorerBodyProps = {\n /** The open thread. The host keeps it (e.g. in the URL) so it survives a reload. */\n selectedThreadId: string | undefined;\n onSelectedThreadChange: (threadId: string | undefined) => void;\n /** Opens a score from the thread drawer; scores live on host routes. */\n onOpenScore: (traceId: string, scoreId: string) => void;\n /** The host's search params, so the time range, filters and sort survive a reload. Omitted: kept in memory. */\n urlState?: ObservabilityListUrlState;\n};\n\n/** The threads page body: filter bar, thread list and the thread drawer. Router-agnostic. */\nexport function ThreadsExplorerBody({\n selectedThreadId,\n onSelectedThreadChange,\n onOpenScore,\n urlState,\n}: ThreadsExplorerBodyProps) {\n const filters = useObservabilityListFilters(urlState);\n const { timeRange, tokens, groups, sort } = filters;\n const withQueryTrace = useTraceQueryAvailable().enabled;\n const withFeedback = useFeedbackAvailable().enabled;\n const columns = useTraceColumnPreferences({ scope: 'threads' });\n const { data: capabilities, isLoading: isCapabilitiesLoading } = useObservabilityCapabilities();\n const withTimeToFirstChunk = capabilities?.capabilities.traceQueryTimeToFirstChunk ?? false;\n const withTimeToFirstToken = capabilities?.capabilities.traceQueryTimeToFirstToken ?? false;\n\n // Stored columns the store can't fill stay saved but aren't drawn, so they come back on a store that can.\n const displayedColumns = useMemo(\n () =>\n isCapabilitiesLoading\n ? columns.preferences\n : withoutUnrecordedStreamingColumns(columns.preferences, { withTimeToFirstChunk, withTimeToFirstToken }),\n [columns.preferences, isCapabilitiesLoading, withTimeToFirstChunk, withTimeToFirstToken],\n );\n\n // Threads with trace activity in the window, like the traces list for the same chip.\n const query = useMemo<ThreadQueryArgs>(() => {\n const where = buildThreadQueryWhere(tokens, groups, { withTimeToFirstChunk, withTimeToFirstToken });\n return {\n timeRange: { traces: timeRange },\n orderBy: [{ field: 'startedAt', direction: sort.direction }],\n ...(where ? { where } : {}),\n };\n }, [timeRange, sort, tokens, groups, withTimeToFirstChunk, withTimeToFirstToken]);\n\n const { threads, hasNextPage, isFetchingNextPage, setEndOfListElement, isLoading, isError, error } =\n useThreadsListSource({ query, rolling: filters.rolling });\n\n const rows = useMemo(() => (threads ?? []).map(threadToListRow), [threads]);\n const selectedRow = rows.find(row => row.threadId === selectedThreadId);\n\n // The drawer is modal, so the list behind it cannot be clicked while a thread is open.\n const handleThreadClick = (row: TracesListViewTrace) => {\n if (row.threadId) onSelectedThreadChange(row.threadId);\n };\n\n // Same rule as /traces: an empty window without filters gets the full-page empty state.\n const showEmptyState =\n !isLoading && !isError && rows.length === 0 && !filters.contentFiltersApplied && !selectedThreadId;\n\n return (\n <>\n <h1 className=\"sr-only\">Threads</h1>\n <ObservabilityListBody\n toolbar={\n <>\n {urlState && <ObservabilitySavedViews page=\"threads\" {...urlState} columns={columns} />}\n <ActionRow>\n <ActionRow.Start>\n <ThreadsFilterBar\n datePreset={filters.datePreset}\n dateFrom={filters.dateFrom}\n dateTo={filters.dateTo}\n tokens={tokens}\n groups={groups}\n onDatePresetChange={filters.onDatePresetChange}\n onDateChange={filters.onDateChange}\n onDateRangeChange={filters.onDateRangeChange}\n onFiltersChange={filters.onFiltersChange}\n disabled={isLoading}\n />\n </ActionRow.Start>\n <ActionRow.End>\n <ColumnsMenu scope=\"threads\" value={columns.preferences} onChange={columns.setPreferences} />\n </ActionRow.End>\n </ActionRow>\n </>\n }\n error={\n isError ? (\n <TracesErrorContent error={error} resource=\"threads\" errorTitle=\"Failed to load threads\" />\n ) : undefined\n }\n empty={\n showEmptyState ? (\n <NoTracesInfo\n resource=\"threads\"\n datePreset={filters.datePreset}\n dateFrom={filters.dateFrom}\n dateTo={filters.dateTo}\n />\n ) : undefined\n }\n >\n <TracesListView\n listId=\"all-threads\"\n columnPreferences={displayedColumns}\n outcomeColumn={false}\n traces={rows}\n isLoading={isLoading}\n isFetchingNextPage={isFetchingNextPage}\n hasNextPage={hasNextPage}\n setEndOfListElement={setEndOfListElement}\n filtersApplied={filters.filtersApplied}\n resource=\"threads\"\n sort={sort}\n onSortChange={next => filters.setSort({ field: 'startedAt', direction: next.direction })}\n featuredTraceId={selectedRow?.traceId}\n onTraceClick={handleThreadClick}\n />\n </ObservabilityListBody>\n <TraceThreadPanel\n open={!!selectedThreadId}\n threadId={selectedThreadId ?? ''}\n depth={1}\n closeLabel=\"Close\"\n withQueryTrace={withQueryTrace}\n withFeedback={withFeedback}\n onOpenScore={onOpenScore}\n onClose={() => onSelectedThreadChange(undefined)}\n />\n </>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
const require_trace_filters = require("../../../trace-filters-
|
|
2
|
+
const require_trace_filters = require("../../../trace-filters-a0N9bf52.cjs");
|
|
3
3
|
const require_domains_traces_components_traces_explorer_traces_explorer_actions = require("../../traces/components/traces-explorer/traces-explorer-actions.cjs.js");
|
|
4
|
-
|
|
5
|
-
const require_FilterBar = require("../../../FilterBar-
|
|
4
|
+
require("../../../filter-bar-time-range-DvuaFnkI.cjs");
|
|
5
|
+
const require_FilterBar = require("../../../FilterBar-Buw0tv51.cjs");
|
|
6
6
|
const require_domains_threads_hooks_use_threads_filter_bar = require("../hooks/use-threads-filter-bar.cjs.js");
|
|
7
7
|
let react_jsx_runtime = require("react/jsx-runtime");
|
|
8
8
|
// src/domains/threads/components/threads-filter-bar.tsx
|
|
9
9
|
var createItemId = (fieldId) => fieldId;
|
|
10
|
-
/** The threads filter bar:
|
|
10
|
+
/** The threads filter bar: the time range plus the fields `queryTraceThreads()` accepts. */
|
|
11
11
|
function ThreadsFilterBar({ datePreset, dateFrom, dateTo, minDate, tokens, groups, onDatePresetChange, onDateChange, onDateRangeChange, onFiltersChange, disabled }) {
|
|
12
12
|
const fields = require_domains_threads_hooks_use_threads_filter_bar.useThreadsFilterBarFields();
|
|
13
13
|
const { filterBarValue, onFilterBarChange } = require_domains_threads_hooks_use_threads_filter_bar.useThreadsFilterBar({
|
|
@@ -24,7 +24,7 @@ function ThreadsFilterBar({ datePreset, dateFrom, dateTo, minDate, tokens, group
|
|
|
24
24
|
maxDepth: 3,
|
|
25
25
|
"aria-label": "Thread filters",
|
|
26
26
|
className: "min-w-64 flex-1",
|
|
27
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_FilterBar.FilterBar.Chips, { renderChip: (item) => item.fieldId === "timeRange" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
27
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_FilterBar.FilterBar.Chips, { renderChip: (item) => item.fieldId === "timeRange" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_FilterBar.FilterBar.TimeRange, {
|
|
28
28
|
preset: datePreset,
|
|
29
29
|
onPresetChange: onDatePresetChange,
|
|
30
30
|
dateFrom,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"threads-filter-bar.cjs.js","names":["useThreadsFilterBarFields","useThreadsFilterBar","FilterBar","TRACE_FILTER_BAR_OPERATORS","
|
|
1
|
+
{"version":3,"file":"threads-filter-bar.cjs.js","names":["useThreadsFilterBarFields","useThreadsFilterBar","FilterBar","TRACE_FILTER_BAR_OPERATORS","THREAD_TIME_RANGE_PRESETS","DEFAULT_TRACES_FILTERS"],"sources":["../../../../src/domains/threads/components/threads-filter-bar.tsx"],"sourcesContent":["import { DEFAULT_TRACES_FILTERS } from '../../traces/components/traces-explorer/traces-explorer-actions';\nimport { TRACE_FILTER_BAR_OPERATORS } from '../../traces/trace-filters';\nimport type { TraceFilterGroup, TraceFilterToken } from '../../traces/trace-query-filters';\nimport type { TraceDatePreset } from '../../traces/types';\nimport {\n THREAD_TIME_RANGE_PRESETS,\n useThreadsFilterBar,\n useThreadsFilterBarFields,\n} from '../hooks/use-threads-filter-bar';\nimport { FilterBar } from '@/ds/components/FilterBar';\nimport { FILTER_BAR_TIME_RANGE_FIELD_ID } from '@/ds/components/FilterBar/filter-bar-time-range';\n\n// Items are rebuilt from tokens with `id: fieldId` (traceTokensToFilterBarItems); give the\n// draft that id so the chip survives the round trip without remounting.\nconst createItemId = (fieldId: string) => fieldId;\n\nexport type ThreadsFilterBarProps = {\n datePreset: TraceDatePreset;\n dateFrom?: Date;\n dateTo?: Date;\n /** Earliest date the custom range picker allows. */\n minDate?: Date;\n tokens: TraceFilterToken[];\n groups: TraceFilterGroup[];\n onDatePresetChange: (preset: TraceDatePreset) => void;\n onDateChange: (value: Date | undefined, type: 'from' | 'to') => void;\n onDateRangeChange: (from: Date | undefined, to: Date | undefined) => void;\n onFiltersChange: (tokens: TraceFilterToken[], groups: TraceFilterGroup[]) => void;\n disabled?: boolean;\n};\n\n/** The threads filter bar: the time range plus the fields `queryTraceThreads()` accepts. */\nexport function ThreadsFilterBar({\n datePreset,\n dateFrom,\n dateTo,\n minDate,\n tokens,\n groups,\n onDatePresetChange,\n onDateChange,\n onDateRangeChange,\n onFiltersChange,\n disabled,\n}: ThreadsFilterBarProps) {\n const fields = useThreadsFilterBarFields();\n const { filterBarValue, onFilterBarChange } = useThreadsFilterBar({ tokens, groups, onFiltersChange });\n\n return (\n <FilterBar\n fields={fields}\n operators={TRACE_FILTER_BAR_OPERATORS}\n value={filterBarValue}\n onValueChange={onFilterBarChange}\n createItemId={createItemId}\n maxDepth={3}\n aria-label=\"Thread filters\"\n className=\"min-w-64 flex-1\"\n >\n <FilterBar.Chips\n renderChip={item =>\n item.fieldId === FILTER_BAR_TIME_RANGE_FIELD_ID ? (\n <FilterBar.TimeRange\n preset={datePreset}\n onPresetChange={onDatePresetChange}\n dateFrom={dateFrom}\n dateTo={dateTo}\n minDate={minDate}\n onDateChange={onDateChange}\n onDateRangeChange={onDateRangeChange}\n disabled={disabled}\n presets={THREAD_TIME_RANGE_PRESETS}\n defaultPreset={DEFAULT_TRACES_FILTERS.datePreset}\n />\n ) : (\n <FilterBar.Chip item={item} />\n )\n }\n />\n <FilterBar.Input placeholder=\"Filter threads…\" />\n </FilterBar>\n );\n}\n"],"mappings":";;;;;;;;AAcA,IAAM,gBAAgB,YAAoB;;AAkB1C,SAAgB,iBAAiB,EAC/B,YACA,UACA,QACA,SACA,QACA,QACA,oBACA,cACA,mBACA,iBACA,YACwB;CACxB,MAAM,SAASA,qDAAAA,0BAA0B;CACzC,MAAM,EAAE,gBAAgB,sBAAsBC,qDAAAA,oBAAoB;EAAE;EAAQ;EAAQ;CAAgB,CAAC;CAErG,OACE,iBAAA,GAAA,kBAAA,KAAA,CAACC,kBAAAA,WAAD;EACU;EACR,WAAWC,sBAAAA;EACX,OAAO;EACP,eAAe;EACD;EACd,UAAU;EACV,cAAW;EACX,WAAU;EARZ,UAAA,CAUE,iBAAA,GAAA,kBAAA,IAAA,CAACD,kBAAAA,UAAU,OAAX,EACE,aAAY,SACV,KAAK,YAAA,cACH,iBAAA,GAAA,kBAAA,IAAA,CAACA,kBAAAA,UAAU,WAAX;GACE,QAAQ;GACR,gBAAgB;GACN;GACF;GACC;GACK;GACK;GACT;GACV,SAASE,qDAAAA;GACT,eAAeC,0EAAAA,uBAAuB;EACvC,CAAA,IAED,iBAAA,GAAA,kBAAA,IAAA,CAACH,kBAAAA,UAAU,MAAX,EAAsB,KAAO,CAAA,EAGlC,CAAA,GACD,iBAAA,GAAA,kBAAA,IAAA,CAACA,kBAAAA,UAAU,OAAX,EAAiB,aAAY,kBAAmB,CAAA,CACvC;;AAEf"}
|