@mastra/playground-ui 69.0.0-alpha.0 → 69.0.0-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components.css +6 -0
- package/dist/{CodeEditor-ZoBu3Gjw.js → CodeEditor-BqAM9L7t.js} +5 -2
- package/dist/{CodeEditor-ZoBu3Gjw.js.map → CodeEditor-BqAM9L7t.js.map} +1 -1
- package/dist/{CodeEditor-DHIDfP5g.cjs → CodeEditor-zMSUzPdX.cjs} +5 -2
- package/dist/{CodeEditor-DHIDfP5g.cjs.map → CodeEditor-zMSUzPdX.cjs.map} +1 -1
- package/dist/{Comment-rQxuMDQv.cjs → Comment-A07IvOt2.cjs} +3 -3
- package/dist/{Comment-rQxuMDQv.cjs.map → Comment-A07IvOt2.cjs.map} +1 -1
- package/dist/{Comment-2q9SomE2.js → Comment-D_gSx7oM.js} +3 -3
- package/dist/{Comment-2q9SomE2.js.map → Comment-D_gSx7oM.js.map} +1 -1
- package/dist/{Composer-u1K6edoZ.cjs → Composer-D2BqRyb5.cjs} +2 -2
- package/dist/Composer-D2BqRyb5.cjs.map +1 -0
- package/dist/{Composer-bVE8qK52.js → Composer-kjwmlIgL.js} +2 -2
- package/dist/Composer-kjwmlIgL.js.map +1 -0
- package/dist/{DataCodeSection-CTodi9wg.js → DataCodeSection-CcX8Z68Y.js} +2 -2
- package/dist/{DataCodeSection-CTodi9wg.js.map → DataCodeSection-CcX8Z68Y.js.map} +1 -1
- package/dist/{DataCodeSection-7SvRJj6f.cjs → DataCodeSection-JPGTWLcL.cjs} +2 -2
- package/dist/{DataCodeSection-7SvRJj6f.cjs.map → DataCodeSection-JPGTWLcL.cjs.map} +1 -1
- package/dist/{DataDetailsPanel-BDoD6pxx.cjs → DataDetailsPanel-DCMlaG7j.cjs} +2 -2
- package/dist/{DataDetailsPanel-BDoD6pxx.cjs.map → DataDetailsPanel-DCMlaG7j.cjs.map} +1 -1
- package/dist/{DataDetailsPanel-BU05psHL.js → DataDetailsPanel-mTfbbQho.js} +2 -2
- package/dist/{DataDetailsPanel-BU05psHL.js.map → DataDetailsPanel-mTfbbQho.js.map} +1 -1
- package/dist/{DataPanel-BRRAvWYQ.cjs → DataPanel-LfExjFpP.cjs} +2 -2
- package/dist/{DataPanel-BRRAvWYQ.cjs.map → DataPanel-LfExjFpP.cjs.map} +1 -1
- package/dist/{DataPanel-pVr5LVaK.js → DataPanel-Rv5Mb_pf.js} +2 -2
- package/dist/{DataPanel-pVr5LVaK.js.map → DataPanel-Rv5Mb_pf.js.map} +1 -1
- package/dist/{FilterBar-Kmn6gMgO.js → FilterBar-DgHNtsDI.js} +5 -5
- package/dist/FilterBar-DgHNtsDI.js.map +1 -0
- package/dist/{FilterBar-jBz6yaNu.cjs → FilterBar-O8SYau_Q.cjs} +5 -5
- package/dist/FilterBar-O8SYau_Q.cjs.map +1 -0
- package/dist/KnowledgePageGraph.css +1 -3
- package/dist/{MarkdownRenderer-CY8LGt-l.js → MarkdownRenderer-BSGb65Ze.js} +2 -2
- package/dist/{MarkdownRenderer-CY8LGt-l.js.map → MarkdownRenderer-BSGb65Ze.js.map} +1 -1
- package/dist/{MarkdownRenderer-CUYpmuPh.cjs → MarkdownRenderer-CDwlvw0Y.cjs} +2 -2
- package/dist/{MarkdownRenderer-CUYpmuPh.cjs.map → MarkdownRenderer-CDwlvw0Y.cjs.map} +1 -1
- package/dist/{MetricsCard-DojbLiEx.cjs → MetricsCard-CSJ4TsNq.cjs} +3 -3
- package/dist/MetricsCard-CSJ4TsNq.cjs.map +1 -0
- package/dist/{MetricsCard-kAqSCPPe.js → MetricsCard-D6bQfynP.js} +3 -3
- package/dist/MetricsCard-D6bQfynP.js.map +1 -0
- package/dist/{Tree-Caz4FTCU.cjs → Tree-6pubDJLQ.cjs} +4 -3
- package/dist/Tree-6pubDJLQ.cjs.map +1 -0
- package/dist/{Tree-od43gLMO.js → Tree-DpRLmis3.js} +4 -3
- package/dist/Tree-DpRLmis3.js.map +1 -0
- package/dist/{Workflow-mIbUYdv0.js → Workflow-BVVYys0W.js} +3 -3
- package/dist/{Workflow-mIbUYdv0.js.map → Workflow-BVVYys0W.js.map} +1 -1
- package/dist/{Workflow-XR5L-3cJ.cjs → Workflow-CwIjxwC6.cjs} +3 -3
- package/dist/{Workflow-XR5L-3cJ.cjs.map → Workflow-CwIjxwC6.cjs.map} +1 -1
- package/dist/{activity-ClFChYfl.js → activity-BH_eegMA.js} +2 -2
- package/dist/{activity-ClFChYfl.js.map → activity-BH_eegMA.js.map} +1 -1
- package/dist/{activity-BprmG6yH.cjs → activity-Ciolopq8.cjs} +2 -2
- package/dist/{activity-BprmG6yH.cjs.map → activity-Ciolopq8.cjs.map} +1 -1
- package/dist/{ask-user-D4ezQ6pt.js → ask-user-CqzPUD9E.js} +2 -2
- package/dist/{ask-user-D4ezQ6pt.js.map → ask-user-CqzPUD9E.js.map} +1 -1
- package/dist/{ask-user-DcnUNMM5.cjs → ask-user-DIYcPkoX.cjs} +2 -2
- package/dist/{ask-user-DcnUNMM5.cjs.map → ask-user-DIYcPkoX.cjs.map} +1 -1
- package/dist/{combobox-lbSxWRMl.js → combobox-DLdInLYm.js} +2 -2
- package/dist/{combobox-lbSxWRMl.js.map → combobox-DLdInLYm.js.map} +1 -1
- package/dist/{combobox-i723LxeC.cjs → combobox-DU2jsrGa.cjs} +2 -2
- package/dist/{combobox-i723LxeC.cjs.map → combobox-DU2jsrGa.cjs.map} +1 -1
- package/dist/{combobox-parts-BeNqgCbj.cjs → combobox-parts-C236ZHtn.cjs} +2 -2
- package/dist/combobox-parts-C236ZHtn.cjs.map +1 -0
- package/dist/{combobox-parts-C9o4UfH_.js → combobox-parts-_m3Qgmci.js} +2 -2
- package/dist/combobox-parts-_m3Qgmci.js.map +1 -0
- package/dist/components/Breadcrumb.cjs.js.map +1 -1
- package/dist/components/Breadcrumb.es.js.map +1 -1
- package/dist/components/CodeBlock.cjs.js +1 -1
- package/dist/components/CodeBlock.es.js +1 -1
- package/dist/components/CodeEditor.cjs.js +1 -1
- package/dist/components/CodeEditor.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 +1 -1
- package/dist/components/Command.cjs.js.map +1 -1
- package/dist/components/Command.es.js +1 -1
- 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/Composer.cjs.js +1 -1
- package/dist/components/Composer.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 +1 -1
- package/dist/components/DataList.es.js +1 -1
- package/dist/components/DataPanel.cjs.js +1 -1
- package/dist/components/DataPanel.es.js +1 -1
- package/dist/components/DateTimePicker.cjs.js +1 -1
- package/dist/components/DateTimePicker.es.js +1 -1
- package/dist/components/DateTimeRangePicker.cjs.js +1 -1
- package/dist/components/DateTimeRangePicker.es.js +1 -1
- package/dist/components/DropdownMenu.cjs.js +1 -1
- package/dist/components/DropdownMenu.es.js +1 -1
- package/dist/components/EnvironmentVariablesEditor.cjs.js +1 -1
- package/dist/components/EnvironmentVariablesEditor.es.js +1 -1
- package/dist/components/FilterBar.cjs.js +3 -3
- package/dist/components/FilterBar.es.js +3 -3
- package/dist/components/FormFieldBlocks.cjs.js +1 -1
- package/dist/components/FormFieldBlocks.es.js +1 -1
- package/dist/components/Input.cjs.js +1 -1
- package/dist/components/Input.es.js +1 -1
- package/dist/components/InputGroup.cjs.js +1 -1
- package/dist/components/InputGroup.es.js +1 -1
- package/dist/components/InputNumber.cjs.js +1 -1
- package/dist/components/InputNumber.es.js +1 -1
- package/dist/components/JSONSchemaForm.cjs.js +1 -1
- package/dist/components/JSONSchemaForm.es.js +1 -1
- package/dist/components/MarkdownRenderer.cjs.js +1 -1
- package/dist/components/MarkdownRenderer.es.js +1 -1
- package/dist/components/MetricsCard.cjs.js +1 -1
- package/dist/components/MetricsCard.es.js +1 -1
- package/dist/components/PropertyFilter.cjs.js +2 -2
- package/dist/components/PropertyFilter.es.js +2 -2
- package/dist/components/RuleBuilder.cjs.js +1 -1
- package/dist/components/RuleBuilder.es.js +1 -1
- package/dist/components/SavedViews.cjs.js +3 -3
- package/dist/components/SavedViews.cjs.js.map +1 -1
- package/dist/components/SavedViews.es.js +3 -3
- package/dist/components/SavedViews.es.js.map +1 -1
- package/dist/components/SearchInput.cjs.js +1 -1
- package/dist/components/SearchInput.es.js +1 -1
- package/dist/components/SideDialog.cjs.js +1 -1
- package/dist/components/SideDialog.es.js +1 -1
- package/dist/components/Sidebar.cjs.js +1 -1
- package/dist/components/Sidebar.es.js +1 -1
- package/dist/components/Tabs.cjs.js +2 -2
- package/dist/components/Tabs.es.js +2 -2
- package/dist/components/Textarea.cjs.js +1 -1
- package/dist/components/Textarea.cjs.js.map +1 -1
- package/dist/components/Textarea.es.js +1 -1
- package/dist/components/Textarea.es.js.map +1 -1
- package/dist/components/ThreadRail.cjs.js +2 -0
- package/dist/components/ThreadRail.cjs.js.map +1 -1
- package/dist/components/ThreadRail.es.js +2 -0
- package/dist/components/ThreadRail.es.js.map +1 -1
- package/dist/components/Tree.cjs.js +1 -1
- package/dist/components/Tree.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 +1 -1
- package/dist/components/ai/plan.es.js +1 -1
- package/dist/components/ai/tool-approval.cjs.js +1 -1
- package/dist/components/ai/tool-approval.es.js +1 -1
- package/dist/components/ai/tool-call.cjs.js +1 -1
- package/dist/components/ai/tool-call.es.js +1 -1
- package/dist/{date-time-range-picker-DdNgKD87.js → date-time-range-picker-CJyhcug7.js} +3 -3
- package/dist/{date-time-range-picker-DdNgKD87.js.map → date-time-range-picker-CJyhcug7.js.map} +1 -1
- package/dist/{date-time-range-picker-Bq-8IPtS.cjs → date-time-range-picker-Dhnuwa-U.cjs} +3 -3
- package/dist/{date-time-range-picker-Bq-8IPtS.cjs.map → date-time-range-picker-Dhnuwa-U.cjs.map} +1 -1
- 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/calls-panel.cjs.js +1 -1
- package/dist/domains/chat/activity/components/calls-panel.es.js +1 -1
- package/dist/domains/chat/activity/components/stretch-content.cjs.js +1 -1
- package/dist/domains/chat/activity/components/stretch-content.es.js +1 -1
- package/dist/domains/chat/activity/components/stretch-thought.cjs.js +1 -1
- package/dist/domains/chat/activity/components/stretch-thought.es.js +1 -1
- package/dist/domains/chat/activity/model/activity-segments.cjs.js +1 -1
- package/dist/domains/chat/activity/model/activity-segments.es.js +1 -1
- package/dist/domains/chat/activity/model/activity-words.cjs.js +1 -1
- package/dist/domains/chat/activity/model/activity-words.es.js +1 -1
- package/dist/domains/chat/attachments/composer-attachment-list.cjs.js +1 -1
- package/dist/domains/chat/attachments/composer-attachment-list.es.js +1 -1
- package/dist/domains/chat/attachments/split-message-attachments.cjs.js +4 -1
- package/dist/domains/chat/attachments/split-message-attachments.cjs.js.map +1 -1
- package/dist/domains/chat/attachments/split-message-attachments.es.js +4 -1
- package/dist/domains/chat/attachments/split-message-attachments.es.js.map +1 -1
- package/dist/domains/chat/components/badge-wrapper.cjs.js +1 -1
- package/dist/domains/chat/components/badge-wrapper.es.js +1 -1
- package/dist/domains/chat/components/network-choice-metadata-dialog.cjs.js +1 -1
- package/dist/domains/chat/components/network-choice-metadata-dialog.es.js +1 -1
- package/dist/domains/chat/knowledge/pinned-knowledge.cjs.js +1 -1
- package/dist/domains/chat/knowledge/pinned-knowledge.es.js +1 -1
- package/dist/domains/chat/messages/dataset-save-action.cjs.js +1 -1
- package/dist/domains/chat/messages/dataset-save-action.es.js +1 -1
- package/dist/domains/chat/messages/message-row.cjs.js +2 -2
- package/dist/domains/chat/messages/message-row.es.js +2 -2
- 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 +1 -1
- package/dist/domains/chat/messages/renderers/message-text.es.js +1 -1
- 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/signal-badge.cjs.js +1 -1
- package/dist/domains/chat/messages/signal-badge.es.js +1 -1
- package/dist/domains/chat/messages/skill-message.cjs.js +2 -2
- package/dist/domains/chat/messages/skill-message.es.js +2 -2
- package/dist/domains/chat/messages/system-reminder-badge.cjs.js +1 -1
- package/dist/domains/chat/messages/system-reminder-badge.es.js +1 -1
- package/dist/domains/chat/messages/tripwire-notice.cjs.js +5 -10
- package/dist/domains/chat/messages/tripwire-notice.cjs.js.map +1 -1
- package/dist/domains/chat/messages/tripwire-notice.es.js +5 -10
- package/dist/domains/chat/messages/tripwire-notice.es.js.map +1 -1
- 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 +1 -1
- package/dist/domains/chat/tools/badges/background-task-metadata-dialog.es.js +1 -1
- package/dist/domains/chat/tools/badges/code-mode-badge.cjs.js +1 -1
- package/dist/domains/chat/tools/badges/code-mode-badge.es.js +1 -1
- package/dist/domains/chat/tools/badges/file-tree-badge.cjs.js +1 -1
- package/dist/domains/chat/tools/badges/file-tree-badge.es.js +1 -1
- package/dist/domains/chat/tools/badges/knowledge-tool-badge.cjs.js +2 -2
- package/dist/domains/chat/tools/badges/knowledge-tool-badge.es.js +2 -2
- package/dist/domains/chat/tools/badges/observation-marker-badge.cjs.js +2 -2
- package/dist/domains/chat/tools/badges/observation-marker-badge.es.js +2 -2
- package/dist/domains/chat/tools/badges/observation-marker-details.cjs.js +2 -2
- package/dist/domains/chat/tools/badges/observation-marker-details.es.js +2 -2
- package/dist/domains/chat/tools/badges/observation-renderer.cjs.js +1 -1
- package/dist/domains/chat/tools/badges/observation-renderer.es.js +1 -1
- package/dist/domains/chat/tools/badges/sandbox-execution-badge.cjs.js +1 -1
- package/dist/domains/chat/tools/badges/sandbox-execution-badge.es.js +1 -1
- package/dist/domains/chat/tools/badges/tool-approval-badge.cjs.js +1 -1
- package/dist/domains/chat/tools/badges/tool-approval-badge.es.js +1 -1
- package/dist/domains/chat/tools/badges/tool-badge.cjs.js +2 -2
- package/dist/domains/chat/tools/badges/tool-badge.es.js +2 -2
- package/dist/domains/chat/tools/badges/workflow-badge.cjs.js +2 -2
- package/dist/domains/chat/tools/badges/workflow-badge.es.js +2 -2
- package/dist/domains/chat/tools/mcp-input-request-tool.cjs.js +2 -2
- package/dist/domains/chat/tools/mcp-input-request-tool.es.js +2 -2
- package/dist/domains/chat/tools/tool-card.cjs.js +1 -1
- package/dist/domains/chat/tools/tool-card.es.js +1 -1
- package/dist/domains/chat/tools/tool-groups.cjs.js +1 -1
- package/dist/domains/chat/tools/tool-groups.es.js +1 -1
- package/dist/domains/dashboards/components/connected-widget.cjs.js +55 -0
- package/dist/domains/dashboards/components/connected-widget.cjs.js.map +1 -0
- package/dist/domains/dashboards/components/connected-widget.d.ts +1 -0
- package/dist/domains/dashboards/components/connected-widget.es.js +54 -0
- package/dist/domains/dashboards/components/connected-widget.es.js.map +1 -0
- package/dist/domains/dashboards/components/dashboard-renderer.cjs.js +13 -8
- package/dist/domains/dashboards/components/dashboard-renderer.cjs.js.map +1 -1
- package/dist/domains/dashboards/components/dashboard-renderer.es.js +13 -8
- package/dist/domains/dashboards/components/dashboard-renderer.es.js.map +1 -1
- package/dist/domains/dashboards/components/stateless-widget.cjs.js +30 -0
- package/dist/domains/dashboards/components/stateless-widget.cjs.js.map +1 -0
- package/dist/domains/dashboards/components/stateless-widget.d.ts +1 -0
- package/dist/domains/dashboards/components/stateless-widget.es.js +29 -0
- package/dist/domains/dashboards/components/stateless-widget.es.js.map +1 -0
- package/dist/domains/dashboards/components/view-gate.cjs.js +18 -40
- package/dist/domains/dashboards/components/view-gate.cjs.js.map +1 -1
- package/dist/domains/dashboards/components/view-gate.es.js +18 -40
- package/dist/domains/dashboards/components/view-gate.es.js.map +1 -1
- package/dist/domains/dashboards/components/widget-chrome.cjs.js +1 -1
- package/dist/domains/dashboards/components/widget-chrome.es.js +1 -1
- package/dist/domains/dashboards/components/widget-controls.cjs.js +106 -0
- package/dist/domains/dashboards/components/widget-controls.cjs.js.map +1 -1
- package/dist/domains/dashboards/components/widget-controls.es.js +107 -3
- package/dist/domains/dashboards/components/widget-controls.es.js.map +1 -1
- package/dist/domains/dashboards/components/widget-error.cjs.js +1 -1
- package/dist/domains/dashboards/components/widget-error.es.js +1 -1
- package/dist/domains/dashboards/hooks/use-dashboard-environment.cjs.js +55 -0
- package/dist/domains/dashboards/hooks/use-dashboard-environment.cjs.js.map +1 -0
- package/dist/domains/dashboards/hooks/use-dashboard-environment.d.ts +1 -0
- package/dist/domains/dashboards/hooks/use-dashboard-environment.es.js +53 -0
- package/dist/domains/dashboards/hooks/use-dashboard-environment.es.js.map +1 -0
- package/dist/domains/dashboards/hooks/use-dashboard-requests.cjs.js +24 -0
- package/dist/domains/dashboards/hooks/use-dashboard-requests.cjs.js.map +1 -1
- package/dist/domains/dashboards/hooks/use-dashboard-requests.es.js +23 -1
- package/dist/domains/dashboards/hooks/use-dashboard-requests.es.js.map +1 -1
- package/dist/domains/dashboards/hooks/use-widget-views.cjs.js +10 -6
- package/dist/domains/dashboards/hooks/use-widget-views.cjs.js.map +1 -1
- package/dist/domains/dashboards/hooks/use-widget-views.es.js +10 -7
- package/dist/domains/dashboards/hooks/use-widget-views.es.js.map +1 -1
- package/dist/domains/dashboards/kinds/kpis/kpis-plan.cjs.js +11 -0
- package/dist/domains/dashboards/kinds/kpis/kpis-plan.cjs.js.map +1 -0
- package/dist/domains/dashboards/kinds/kpis/kpis-plan.d.ts +1 -0
- package/dist/domains/dashboards/kinds/kpis/kpis-plan.es.js +9 -0
- package/dist/domains/dashboards/kinds/kpis/kpis-plan.es.js.map +1 -0
- package/dist/domains/dashboards/kinds/kpis/kpis-widget.cjs.js +18 -19
- package/dist/domains/dashboards/kinds/kpis/kpis-widget.cjs.js.map +1 -1
- package/dist/domains/dashboards/kinds/kpis/kpis-widget.es.js +18 -19
- package/dist/domains/dashboards/kinds/kpis/kpis-widget.es.js.map +1 -1
- package/dist/domains/dashboards/kinds/kpis.cjs.js +3 -0
- package/dist/domains/dashboards/kinds/kpis.cjs.js.map +1 -1
- package/dist/domains/dashboards/kinds/kpis.es.js +3 -0
- package/dist/domains/dashboards/kinds/kpis.es.js.map +1 -1
- package/dist/domains/dashboards/kinds/scores/scores-plan.cjs.js +27 -0
- package/dist/domains/dashboards/kinds/scores/scores-plan.cjs.js.map +1 -0
- package/dist/domains/dashboards/kinds/scores/scores-plan.d.ts +1 -0
- package/dist/domains/dashboards/kinds/scores/scores-plan.es.js +24 -0
- package/dist/domains/dashboards/kinds/scores/scores-plan.es.js.map +1 -0
- package/dist/domains/dashboards/kinds/scores/scores-widget.cjs.js +25 -32
- package/dist/domains/dashboards/kinds/scores/scores-widget.cjs.js.map +1 -1
- package/dist/domains/dashboards/kinds/scores/scores-widget.es.js +26 -33
- package/dist/domains/dashboards/kinds/scores/scores-widget.es.js.map +1 -1
- package/dist/domains/dashboards/kinds/scores.cjs.js +4 -0
- package/dist/domains/dashboards/kinds/scores.cjs.js.map +1 -1
- package/dist/domains/dashboards/kinds/scores.es.js +4 -0
- package/dist/domains/dashboards/kinds/scores.es.js.map +1 -1
- package/dist/domains/dashboards/kinds/table/table-cells.cjs.js +2 -6
- package/dist/domains/dashboards/kinds/table/table-cells.cjs.js.map +1 -1
- package/dist/domains/dashboards/kinds/table/table-cells.es.js +2 -6
- package/dist/domains/dashboards/kinds/table/table-cells.es.js.map +1 -1
- package/dist/domains/dashboards/kinds/table/table-columns.cjs.js +5 -3
- package/dist/domains/dashboards/kinds/table/table-columns.cjs.js.map +1 -1
- package/dist/domains/dashboards/kinds/table/table-columns.es.js +5 -3
- package/dist/domains/dashboards/kinds/table/table-columns.es.js.map +1 -1
- package/dist/domains/dashboards/kinds/table/table-plan.cjs.js +47 -0
- package/dist/domains/dashboards/kinds/table/table-plan.cjs.js.map +1 -0
- package/dist/domains/dashboards/kinds/table/table-plan.d.ts +1 -0
- package/dist/domains/dashboards/kinds/table/table-plan.es.js +44 -0
- package/dist/domains/dashboards/kinds/table/table-plan.es.js.map +1 -0
- package/dist/domains/dashboards/kinds/table/table-tabs.cjs.js +20 -26
- package/dist/domains/dashboards/kinds/table/table-tabs.cjs.js.map +1 -1
- package/dist/domains/dashboards/kinds/table/table-tabs.es.js +22 -28
- package/dist/domains/dashboards/kinds/table/table-tabs.es.js.map +1 -1
- package/dist/domains/dashboards/kinds/table/table-view.cjs.js +13 -13
- package/dist/domains/dashboards/kinds/table/table-view.cjs.js.map +1 -1
- package/dist/domains/dashboards/kinds/table/table-view.es.js +14 -14
- package/dist/domains/dashboards/kinds/table/table-view.es.js.map +1 -1
- package/dist/domains/dashboards/kinds/table/table-widget.cjs.js +13 -17
- package/dist/domains/dashboards/kinds/table/table-widget.cjs.js.map +1 -1
- package/dist/domains/dashboards/kinds/table/table-widget.es.js +13 -17
- package/dist/domains/dashboards/kinds/table/table-widget.es.js.map +1 -1
- package/dist/domains/dashboards/kinds/table.cjs.js +4 -0
- package/dist/domains/dashboards/kinds/table.cjs.js.map +1 -1
- package/dist/domains/dashboards/kinds/table.es.js +4 -0
- package/dist/domains/dashboards/kinds/table.es.js.map +1 -1
- package/dist/domains/dashboards/kinds/timeseries/timeseries-plan.cjs.js +18 -0
- package/dist/domains/dashboards/kinds/timeseries/timeseries-plan.cjs.js.map +1 -0
- package/dist/domains/dashboards/kinds/timeseries/timeseries-plan.d.ts +1 -0
- package/dist/domains/dashboards/kinds/timeseries/timeseries-plan.es.js +16 -0
- package/dist/domains/dashboards/kinds/timeseries/timeseries-plan.es.js.map +1 -0
- package/dist/domains/dashboards/kinds/timeseries/timeseries-widget.cjs.js +22 -22
- package/dist/domains/dashboards/kinds/timeseries/timeseries-widget.cjs.js.map +1 -1
- package/dist/domains/dashboards/kinds/timeseries/timeseries-widget.es.js +25 -25
- package/dist/domains/dashboards/kinds/timeseries/timeseries-widget.es.js.map +1 -1
- package/dist/domains/dashboards/kinds/timeseries.cjs.js +3 -0
- package/dist/domains/dashboards/kinds/timeseries.cjs.js.map +1 -1
- package/dist/domains/dashboards/kinds/timeseries.es.js +3 -0
- package/dist/domains/dashboards/kinds/timeseries.es.js.map +1 -1
- package/dist/domains/dashboards/lib/alert-actions.cjs.js +123 -0
- package/dist/domains/dashboards/lib/alert-actions.cjs.js.map +1 -0
- package/dist/domains/dashboards/lib/alert-actions.d.ts +1 -0
- package/dist/domains/dashboards/lib/alert-actions.es.js +118 -0
- package/dist/domains/dashboards/lib/alert-actions.es.js.map +1 -0
- package/dist/domains/dashboards/lib/gate.cjs.js +62 -0
- package/dist/domains/dashboards/lib/gate.cjs.js.map +1 -0
- package/dist/domains/dashboards/lib/gate.d.ts +1 -0
- package/dist/domains/dashboards/lib/gate.es.js +60 -0
- package/dist/domains/dashboards/lib/gate.es.js.map +1 -0
- package/dist/domains/dashboards/lib/plan-widget.cjs.js +41 -0
- package/dist/domains/dashboards/lib/plan-widget.cjs.js.map +1 -0
- package/dist/domains/dashboards/lib/plan-widget.d.ts +1 -0
- package/dist/domains/dashboards/lib/plan-widget.es.js +38 -0
- package/dist/domains/dashboards/lib/plan-widget.es.js.map +1 -0
- package/dist/domains/dashboards/lib/requests.cjs.js +47 -0
- package/dist/domains/dashboards/lib/requests.cjs.js.map +1 -1
- package/dist/domains/dashboards/lib/requests.es.js +46 -1
- package/dist/domains/dashboards/lib/requests.es.js.map +1 -1
- package/dist/domains/dashboards/lib/scores.cjs.js +32 -0
- package/dist/domains/dashboards/lib/scores.cjs.js.map +1 -1
- package/dist/domains/dashboards/lib/scores.es.js +31 -1
- package/dist/domains/dashboards/lib/scores.es.js.map +1 -1
- package/dist/domains/dashboards/lib/timeseries.cjs.js +17 -0
- package/dist/domains/dashboards/lib/timeseries.cjs.js.map +1 -1
- package/dist/domains/dashboards/lib/timeseries.es.js +17 -1
- package/dist/domains/dashboards/lib/timeseries.es.js.map +1 -1
- package/dist/domains/dashboards/lib/values.cjs.js.map +1 -1
- package/dist/domains/dashboards/lib/values.es.js.map +1 -1
- package/dist/domains/dashboards/widget-kind.cjs.js.map +1 -1
- package/dist/domains/dashboards/widget-kind.es.js.map +1 -1
- package/dist/domains/dashboards.cjs.js +19 -2
- package/dist/domains/dashboards.es.js +9 -5
- package/dist/domains/datasets/components/add-dataset-item-dialog/add-dataset-item-dialog.cjs.js +1 -1
- package/dist/domains/datasets/components/add-dataset-item-dialog/add-dataset-item-dialog.es.js +1 -1
- package/dist/domains/datasets/components/add-dataset-item-dialog/trajectory-editor.cjs.js +2 -2
- package/dist/domains/datasets/components/add-dataset-item-dialog/trajectory-editor.es.js +2 -2
- package/dist/domains/datasets/components/save-as-dataset-item-dialog.cjs.js +2 -2
- package/dist/domains/datasets/components/save-as-dataset-item-dialog.es.js +2 -2
- package/dist/domains/knowledge/components/KnowledgePageDetail.cjs.js +186 -212
- package/dist/domains/knowledge/components/KnowledgePageDetail.cjs.js.map +1 -1
- package/dist/domains/knowledge/components/KnowledgePageDetail.es.js +188 -215
- package/dist/domains/knowledge/components/KnowledgePageDetail.es.js.map +1 -1
- package/dist/domains/knowledge/components/KnowledgePageExplorer.cjs.js +620 -268
- package/dist/domains/knowledge/components/KnowledgePageExplorer.cjs.js.map +1 -1
- package/dist/domains/knowledge/components/KnowledgePageExplorer.es.js +622 -270
- package/dist/domains/knowledge/components/KnowledgePageExplorer.es.js.map +1 -1
- package/dist/domains/knowledge/components/KnowledgePageGraph.cjs.js +544 -454
- package/dist/domains/knowledge/components/KnowledgePageGraph.cjs.js.map +1 -1
- package/dist/domains/knowledge/components/KnowledgePageGraph.es.js +548 -458
- package/dist/domains/knowledge/components/KnowledgePageGraph.es.js.map +1 -1
- package/dist/domains/knowledge/components/KnowledgePageTree.cjs.js +21 -12
- package/dist/domains/knowledge/components/KnowledgePageTree.cjs.js.map +1 -1
- package/dist/domains/knowledge/components/KnowledgePageTree.es.js +22 -13
- package/dist/domains/knowledge/components/KnowledgePageTree.es.js.map +1 -1
- package/dist/domains/knowledge/components/KnowledgeSourceIcon.cjs.js +16 -0
- package/dist/domains/knowledge/components/KnowledgeSourceIcon.cjs.js.map +1 -0
- package/dist/domains/knowledge/components/KnowledgeSourceIcon.d.ts +1 -0
- package/dist/domains/knowledge/components/KnowledgeSourceIcon.es.js +15 -0
- package/dist/domains/knowledge/components/KnowledgeSourceIcon.es.js.map +1 -0
- package/dist/domains/knowledge/components/KnowledgeTooltip.cjs.js +10 -0
- package/dist/domains/knowledge/components/KnowledgeTooltip.cjs.js.map +1 -0
- package/dist/domains/knowledge/components/KnowledgeTooltip.d.ts +1 -0
- package/dist/domains/knowledge/components/KnowledgeTooltip.es.js +9 -0
- package/dist/domains/knowledge/components/KnowledgeTooltip.es.js.map +1 -0
- package/dist/domains/knowledge/lib/fitViewport.cjs.js +22 -8
- package/dist/domains/knowledge/lib/fitViewport.cjs.js.map +1 -1
- package/dist/domains/knowledge/lib/fitViewport.es.js +22 -9
- package/dist/domains/knowledge/lib/fitViewport.es.js.map +1 -1
- package/dist/domains/knowledge/lib/pageAddress.cjs.js +51 -0
- package/dist/domains/knowledge/lib/pageAddress.cjs.js.map +1 -1
- package/dist/domains/knowledge/lib/pageAddress.es.js +50 -1
- package/dist/domains/knowledge/lib/pageAddress.es.js.map +1 -1
- package/dist/domains/knowledge/lib/pageRefs.cjs.js +43 -2
- package/dist/domains/knowledge/lib/pageRefs.cjs.js.map +1 -1
- package/dist/domains/knowledge/lib/pageRefs.es.js +43 -3
- package/dist/domains/knowledge/lib/pageRefs.es.js.map +1 -1
- package/dist/domains/knowledge/lib/pagesByRefContext.cjs.js +10 -0
- package/dist/domains/knowledge/lib/pagesByRefContext.cjs.js.map +1 -0
- package/dist/domains/knowledge/lib/pagesByRefContext.d.ts +1 -0
- package/dist/domains/knowledge/lib/pagesByRefContext.es.js +10 -0
- package/dist/domains/knowledge/lib/pagesByRefContext.es.js.map +1 -0
- package/dist/domains/logs/components/log-data-panel.cjs.js +1 -1
- package/dist/domains/logs/components/log-data-panel.es.js +1 -1
- package/dist/domains/logs/components/logs-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/mcps/components/mcp-app-tool-result.cjs.js +28 -3
- package/dist/domains/mcps/components/mcp-app-tool-result.cjs.js.map +1 -1
- package/dist/domains/mcps/components/mcp-app-tool-result.es.js +27 -2
- package/dist/domains/mcps/components/mcp-app-tool-result.es.js.map +1 -1
- package/dist/domains/mcps/components/mcp-app-viewer.cjs.js +163 -2
- package/dist/domains/mcps/components/mcp-app-viewer.cjs.js.map +1 -0
- package/dist/domains/mcps/components/mcp-app-viewer.es.js +163 -1
- package/dist/domains/mcps/components/mcp-app-viewer.es.js.map +1 -0
- package/dist/domains/mcps/context/mcp-app-host-context-value.cjs.js +11 -0
- package/dist/domains/mcps/context/mcp-app-host-context-value.cjs.js.map +1 -0
- package/dist/domains/mcps/context/mcp-app-host-context-value.d.ts +1 -0
- package/dist/domains/mcps/context/mcp-app-host-context-value.es.js +9 -0
- package/dist/domains/mcps/context/mcp-app-host-context-value.es.js.map +1 -0
- package/dist/domains/mcps/context/mcp-app-host-context.cjs.js +14 -0
- package/dist/domains/mcps/context/mcp-app-host-context.cjs.js.map +1 -0
- package/dist/domains/mcps/context/mcp-app-host-context.d.ts +1 -0
- package/dist/domains/mcps/context/mcp-app-host-context.es.js +13 -0
- package/dist/domains/mcps/context/mcp-app-host-context.es.js.map +1 -0
- package/dist/domains/mcps/hooks/use-mcp-app-tool-call.cjs.js +2 -1
- package/dist/domains/mcps/hooks/use-mcp-app-tool-call.cjs.js.map +1 -1
- package/dist/domains/mcps/hooks/use-mcp-app-tool-call.es.js +2 -1
- package/dist/domains/mcps/hooks/use-mcp-app-tool-call.es.js.map +1 -1
- package/dist/domains/mcps.cjs.js +5 -0
- package/dist/domains/mcps.d.ts +1 -0
- package/dist/domains/mcps.es.js +3 -0
- package/dist/domains/metrics/components/agent-runs-card.cjs.js +1 -1
- package/dist/domains/metrics/components/agent-runs-card.es.js +1 -1
- package/dist/domains/metrics/components/breakdown/breakdown-tab-body.cjs.js +1 -1
- package/dist/domains/metrics/components/breakdown/breakdown-tab-body.es.js +1 -1
- package/dist/domains/metrics/components/breakdown-card.cjs.js +1 -1
- package/dist/domains/metrics/components/breakdown-card.es.js +1 -1
- package/dist/domains/metrics/components/chart-area.cjs.js +1 -1
- package/dist/domains/metrics/components/chart-area.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/chart-card.cjs.js +1 -1
- package/dist/domains/metrics/components/chart-card.es.js +1 -1
- package/dist/domains/metrics/components/date-range-selector.cjs.js +1 -1
- package/dist/domains/metrics/components/date-range-selector.es.js +1 -1
- package/dist/domains/metrics/components/distinct-ids/distinct-ids-chart.cjs.js +1 -1
- package/dist/domains/metrics/components/distinct-ids/distinct-ids-chart.es.js +1 -1
- package/dist/domains/metrics/components/failure-rate-card.cjs.js +1 -1
- package/dist/domains/metrics/components/failure-rate-card.es.js +1 -1
- package/dist/domains/metrics/components/latency-card.cjs.js +1 -1
- package/dist/domains/metrics/components/latency-card.es.js +1 -1
- package/dist/domains/metrics/components/metrics-time-range-chip.cjs.js +1 -1
- package/dist/domains/metrics/components/metrics-time-range-chip.es.js +1 -1
- package/dist/domains/metrics/components/token-usage-card.cjs.js +1 -1
- package/dist/domains/metrics/components/token-usage-card.es.js +1 -1
- package/dist/domains/metrics/components/trace-aggregate-card.cjs.js +1 -1
- package/dist/domains/metrics/components/trace-aggregate-card.es.js +1 -1
- package/dist/domains/metrics.cjs.js +3 -3
- package/dist/domains/metrics.es.js +3 -3
- package/dist/domains/observability/saved-views/observability-saved-views.cjs.js +1 -1
- package/dist/domains/observability/saved-views/observability-saved-views.es.js +1 -1
- package/dist/domains/observability/saved-views.cjs.js +1 -1
- package/dist/domains/observability/saved-views.es.js +1 -1
- package/dist/domains/observability.cjs.js +1 -1
- package/dist/domains/observability.es.js +1 -1
- package/dist/domains/scores/components/score-data-panel.cjs.js +1 -1
- package/dist/domains/scores/components/score-data-panel.es.js +1 -1
- package/dist/domains/scores/components/span-scoring.cjs.js +1 -1
- package/dist/domains/scores/components/span-scoring.es.js +1 -1
- package/dist/domains/scores/components/trace-scores-list.cjs.js +1 -1
- package/dist/domains/scores/components/trace-scores-list.es.js +1 -1
- package/dist/domains/skills/skill-simple-form.cjs.js +3 -3
- package/dist/domains/skills/skill-simple-form.es.js +3 -3
- package/dist/domains/spans/components/spans-explorer-body.cjs.js +1 -1
- package/dist/domains/spans/components/spans-explorer-body.es.js +1 -1
- package/dist/domains/spans/components/spans-filter-bar.cjs.js +2 -2
- package/dist/domains/spans/components/spans-filter-bar.es.js +2 -2
- package/dist/domains/spans/hooks/use-spans-filter-bar.cjs.js +1 -1
- package/dist/domains/spans/hooks/use-spans-filter-bar.es.js +1 -1
- package/dist/domains/threads/components/threads-explorer-body.cjs.js +1 -1
- package/dist/domains/threads/components/threads-explorer-body.es.js +1 -1
- package/dist/domains/threads/components/threads-filter-bar.cjs.js +2 -2
- package/dist/domains/threads/components/threads-filter-bar.es.js +2 -2
- package/dist/domains/threads/hooks/use-threads-filter-bar.cjs.js +1 -1
- package/dist/domains/threads/hooks/use-threads-filter-bar.es.js +1 -1
- package/dist/domains/traces/components/feedback-options.cjs.js +0 -0
- package/dist/domains/traces/components/feedback-options.d.ts +1 -0
- package/dist/domains/traces/components/feedback-options.es.js +0 -0
- package/dist/domains/traces/components/feedback-thread.cjs.js +10 -4
- package/dist/domains/traces/components/feedback-thread.cjs.js.map +1 -1
- package/dist/domains/traces/components/feedback-thread.es.js +10 -4
- package/dist/domains/traces/components/feedback-thread.es.js.map +1 -1
- package/dist/domains/traces/components/span-data-panel-view.cjs.js +2 -2
- package/dist/domains/traces/components/span-data-panel-view.es.js +2 -2
- 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-feedback-tab.cjs.js +8 -5
- package/dist/domains/traces/components/span-feedback-tab.cjs.js.map +1 -1
- package/dist/domains/traces/components/span-feedback-tab.es.js +8 -5
- package/dist/domains/traces/components/span-feedback-tab.es.js.map +1 -1
- package/dist/domains/traces/components/span-payload/span-error-renderer.cjs.js +1 -1
- package/dist/domains/traces/components/span-payload/span-error-renderer.es.js +1 -1
- package/dist/domains/traces/components/span-payload/span-input-renderers.cjs.js +1 -1
- package/dist/domains/traces/components/span-payload/span-input-renderers.es.js +1 -1
- package/dist/domains/traces/components/span-payload/span-output-renderers.cjs.js +2 -2
- package/dist/domains/traces/components/span-payload/span-output-renderers.es.js +2 -2
- 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 +2 -2
- package/dist/domains/traces/components/span-payload/span-payload-messages.es.js +2 -2
- package/dist/domains/traces/components/span-payload/span-payload-primitives.cjs.js +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-primitives.es.js +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-processor.cjs.js +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-processor.es.js +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-tool.cjs.js +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-view-by-trace.cjs.js +5 -3
- package/dist/domains/traces/components/thread-view-by-trace.cjs.js.map +1 -1
- package/dist/domains/traces/components/thread-view-by-trace.es.js +5 -3
- package/dist/domains/traces/components/thread-view-by-trace.es.js.map +1 -1
- package/dist/domains/traces/components/trace-columns-menu.cjs.js +2 -2
- package/dist/domains/traces/components/trace-columns-menu.es.js +2 -2
- package/dist/domains/traces/components/trace-data-panel-view.cjs.js +2 -2
- package/dist/domains/traces/components/trace-data-panel-view.es.js +2 -2
- package/dist/domains/traces/components/trace-details-view.cjs.js +1 -1
- package/dist/domains/traces/components/trace-details-view.es.js +1 -1
- package/dist/domains/traces/components/trace-feedback-tab.cjs.js +9 -4
- package/dist/domains/traces/components/trace-feedback-tab.cjs.js.map +1 -1
- package/dist/domains/traces/components/trace-feedback-tab.es.js +9 -4
- package/dist/domains/traces/components/trace-feedback-tab.es.js.map +1 -1
- package/dist/domains/traces/components/trace-id-button.cjs.js +1 -1
- package/dist/domains/traces/components/trace-id-button.es.js +1 -1
- package/dist/domains/traces/components/trace-span-panel.cjs.js +2 -1
- package/dist/domains/traces/components/trace-span-panel.cjs.js.map +1 -1
- package/dist/domains/traces/components/trace-span-panel.es.js +2 -1
- package/dist/domains/traces/components/trace-span-panel.es.js.map +1 -1
- package/dist/domains/traces/components/trace-summary-description.cjs.js +1 -1
- package/dist/domains/traces/components/trace-summary-description.es.js +1 -1
- package/dist/domains/traces/components/trace-thread-panel.cjs.js +3 -2
- package/dist/domains/traces/components/trace-thread-panel.cjs.js.map +1 -1
- package/dist/domains/traces/components/trace-thread-panel.es.js +3 -2
- package/dist/domains/traces/components/trace-thread-panel.es.js.map +1 -1
- package/dist/domains/traces/components/traces-explorer/traces-explorer-context.cjs.js.map +1 -1
- package/dist/domains/traces/components/traces-explorer/traces-explorer-context.es.js.map +1 -1
- package/dist/domains/traces/components/traces-explorer/traces-explorer-filter-bar.cjs.js +2 -2
- package/dist/domains/traces/components/traces-explorer/traces-explorer-filter-bar.es.js +2 -2
- package/dist/domains/traces/components/traces-explorer/traces-explorer-panel.cjs.js +8 -3
- package/dist/domains/traces/components/traces-explorer/traces-explorer-panel.cjs.js.map +1 -1
- package/dist/domains/traces/components/traces-explorer/traces-explorer-panel.es.js +8 -3
- package/dist/domains/traces/components/traces-explorer/traces-explorer-panel.es.js.map +1 -1
- package/dist/domains/traces/components/traces-explorer/traces-explorer-root.cjs.js +14 -1
- package/dist/domains/traces/components/traces-explorer/traces-explorer-root.cjs.js.map +1 -1
- package/dist/domains/traces/components/traces-explorer/traces-explorer-root.es.js +14 -1
- package/dist/domains/traces/components/traces-explorer/traces-explorer-root.es.js.map +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 +1 -1
- package/dist/domains/traces/components/traces-explorer/use-traces-filter-bar.es.js +1 -1
- package/dist/domains/traces/components/traces-explorer.cjs.js.map +1 -1
- package/dist/domains/traces/components/traces-explorer.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 +1 -1
- package/dist/domains/traces/components/traces-list-view.es.js +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/workflows/components/workflow-combobox.cjs.js +1 -1
- package/dist/domains/workflows/components/workflow-combobox.es.js +1 -1
- 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/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 +1 -1
- package/dist/domains/workflows/workflow/data/workflow-data-inspector.es.js +1 -1
- 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/use-workflow-graph-runtime.cjs.js +1 -1
- package/dist/domains/workflows/workflow/use-workflow-graph-runtime.es.js +1 -1
- package/dist/domains/workflows/workflow/utils.cjs.js +1 -1
- package/dist/domains/workflows/workflow/utils.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-body-graph.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-body-graph.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-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-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 +1 -1
- package/dist/domains/workflows/workflow/workflow-map-config-dialog.es.js +1 -1
- 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-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 +1 -1
- package/dist/domains/workflows/workflow/workflow-step-action-bar.es.js +1 -1
- 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 +1 -1
- package/dist/domains/workflows/workflow/workflow-suspended-steps.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-time-travel-form.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-time-travel-form.es.js +1 -1
- package/dist/domains/workspace/components/workspace-add-skill-dialog.cjs.js +1 -1
- package/dist/domains/workspace/components/workspace-add-skill-dialog.es.js +1 -1
- package/dist/domains/workspace/components/workspace-create-directory.cjs.js +1 -1
- package/dist/domains/workspace/components/workspace-create-directory.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/{dropdown-menu-Dx-jCOIv.cjs → dropdown-menu-D3D8USIY.cjs} +9 -1
- package/dist/dropdown-menu-D3D8USIY.cjs.map +1 -0
- package/dist/{dropdown-menu-DKoWI8kD.js → dropdown-menu-jsf9D-J_.js} +9 -1
- package/dist/dropdown-menu-jsf9D-J_.js.map +1 -0
- 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 +1 -1
- package/dist/ee/signals/settings/signal-definition-form-dialog.es.js +1 -1
- package/dist/ee/signals/settings/trace-signal-settings.cjs.js +1 -1
- package/dist/ee/signals/settings/trace-signal-settings.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/{filter-bar-chip-NBtfDca9.js → filter-bar-chip-Cz5GYBWP.js} +2 -2
- package/dist/{filter-bar-chip-NBtfDca9.js.map → filter-bar-chip-Cz5GYBWP.js.map} +1 -1
- package/dist/{filter-bar-chip-DFsbUZ-V.cjs → filter-bar-chip-q2Zr-cnY.cjs} +2 -2
- package/dist/{filter-bar-chip-DFsbUZ-V.cjs.map → filter-bar-chip-q2Zr-cnY.cjs.map} +1 -1
- package/dist/{filter-bar-time-range-DlVNjw43.cjs → filter-bar-time-range-D4C3kU0J.cjs} +3 -3
- package/dist/{filter-bar-time-range-DlVNjw43.cjs.map → filter-bar-time-range-D4C3kU0J.cjs.map} +1 -1
- package/dist/{filter-bar-time-range-D9SnzR2J.js → filter-bar-time-range-ao2YiYEJ.js} +3 -3
- package/dist/{filter-bar-time-range-D9SnzR2J.js.map → filter-bar-time-range-ao2YiYEJ.js.map} +1 -1
- package/dist/icons/ConfluenceIcon.cjs.js +18 -0
- package/dist/icons/ConfluenceIcon.cjs.js.map +1 -0
- package/dist/icons/ConfluenceIcon.d.ts +1 -0
- package/dist/icons/ConfluenceIcon.es.js +15 -0
- package/dist/icons/ConfluenceIcon.es.js.map +1 -0
- package/dist/icons/NotionIcon.cjs.js +18 -0
- package/dist/icons/NotionIcon.cjs.js.map +1 -0
- package/dist/icons/NotionIcon.d.ts +1 -0
- package/dist/icons/NotionIcon.es.js +15 -0
- package/dist/icons/NotionIcon.es.js.map +1 -0
- package/dist/icons/ZendeskIcon.cjs.js +18 -0
- package/dist/icons/ZendeskIcon.cjs.js.map +1 -0
- package/dist/icons/ZendeskIcon.d.ts +1 -0
- package/dist/icons/ZendeskIcon.es.js +15 -0
- package/dist/icons/ZendeskIcon.es.js.map +1 -0
- package/dist/{input-Cyit5ZSc.js → input-BNykbvOz.js} +2 -2
- package/dist/input-BNykbvOz.js.map +1 -0
- package/dist/{input-BpnUsQSt.cjs → input-D_V0m95F.cjs} +2 -2
- package/dist/input-D_V0m95F.cjs.map +1 -0
- package/dist/{input-group-NV4ZzKOk.js → input-group-CCSyY4J5.js} +3 -3
- package/dist/{input-group-NV4ZzKOk.js.map → input-group-CCSyY4J5.js.map} +1 -1
- package/dist/{input-group-DBCilXjT.cjs → input-group-Da8HBo30.cjs} +3 -3
- package/dist/{input-group-DBCilXjT.cjs.map → input-group-Da8HBo30.cjs.map} +1 -1
- package/dist/layout/tabbed-container.cjs.js +1 -1
- package/dist/layout/tabbed-container.es.js +1 -1
- package/dist/lib/form/components/number-field.cjs.js +1 -1
- package/dist/lib/form/components/number-field.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/{observability-saved-views-DgABvgat.cjs → observability-saved-views-CzRPN_9m.cjs} +4 -4
- package/dist/{observability-saved-views-DgABvgat.cjs.map → observability-saved-views-CzRPN_9m.cjs.map} +1 -1
- package/dist/{observability-saved-views-Ch53fh5_.js → observability-saved-views-hu_hkXVY.js} +4 -4
- package/dist/{observability-saved-views-Ch53fh5_.js.map → observability-saved-views-hu_hkXVY.js.map} +1 -1
- package/dist/primitives/menu-item.cjs.js +1 -1
- package/dist/primitives/menu-item.cjs.js.map +1 -1
- package/dist/primitives/menu-item.es.js +1 -1
- package/dist/primitives/menu-item.es.js.map +1 -1
- package/dist/{property-filter-applied-DuyL4S_K.cjs → property-filter-applied-ML84st6J.cjs} +3 -3
- package/dist/{property-filter-applied-DuyL4S_K.cjs.map → property-filter-applied-ML84st6J.cjs.map} +1 -1
- package/dist/{property-filter-applied-DoxQHG09.js → property-filter-applied-PaJ7sLsM.js} +3 -3
- package/dist/{property-filter-applied-DoxQHG09.js.map → property-filter-applied-PaJ7sLsM.js.map} +1 -1
- package/dist/{span-payload-primitives-D2NWznGy.cjs → span-payload-primitives-CL3hlirm.cjs} +3 -3
- package/dist/{span-payload-primitives-D2NWznGy.cjs.map → span-payload-primitives-CL3hlirm.cjs.map} +1 -1
- package/dist/{span-payload-primitives-BKkRpVVO.js → span-payload-primitives-KxqoXspn.js} +3 -3
- package/dist/{span-payload-primitives-BKkRpVVO.js.map → span-payload-primitives-KxqoXspn.js.map} +1 -1
- package/dist/src/domains/dashboards/components/connected-widget.d.ts +9 -0
- package/dist/src/domains/dashboards/components/dashboard-renderer.d.ts +9 -2
- package/dist/src/domains/dashboards/components/stateless-widget.d.ts +40 -0
- package/dist/src/domains/dashboards/components/view-gate.d.ts +2 -10
- package/dist/src/domains/dashboards/components/widget-controls.d.ts +25 -1
- package/dist/src/domains/dashboards/hooks/use-dashboard-environment.d.ts +8 -0
- package/dist/src/domains/dashboards/hooks/use-dashboard-requests.d.ts +11 -1
- package/dist/src/domains/dashboards/hooks/use-widget-views.d.ts +8 -2
- package/dist/src/domains/dashboards/index.d.ts +14 -6
- package/dist/src/domains/dashboards/kinds/kpis/kpis-plan.d.ts +355 -0
- package/dist/src/domains/dashboards/kinds/kpis/kpis-widget.d.ts +1 -1
- package/dist/src/domains/dashboards/kinds/scores/scores-plan.d.ts +358 -0
- package/dist/src/domains/dashboards/kinds/scores/scores-widget.d.ts +1 -1
- package/dist/src/domains/dashboards/kinds/table/table-cells.d.ts +6 -2
- package/dist/src/domains/dashboards/kinds/table/table-columns.d.ts +2 -1
- package/dist/src/domains/dashboards/kinds/table/table-plan.d.ts +18 -0
- package/dist/src/domains/dashboards/kinds/table/table-tabs.d.ts +1 -1
- package/dist/src/domains/dashboards/kinds/table/table-view.d.ts +1 -0
- package/dist/src/domains/dashboards/kinds/timeseries/timeseries-plan.d.ts +355 -0
- package/dist/src/domains/dashboards/lib/alert-actions.d.ts +36 -0
- package/dist/src/domains/dashboards/lib/gate.d.ts +65 -0
- package/dist/src/domains/dashboards/lib/plan-widget.d.ts +390 -0
- package/dist/src/domains/dashboards/lib/requests.d.ts +22 -0
- package/dist/src/domains/dashboards/lib/scores.d.ts +11 -1
- package/dist/src/domains/dashboards/lib/timeseries.d.ts +6 -1
- package/dist/src/domains/dashboards/lib/values.d.ts +5 -0
- package/dist/src/domains/dashboards/widget-kind.d.ts +105 -2
- package/dist/src/domains/knowledge/components/KnowledgePageDetail.d.ts +7 -1
- package/dist/src/domains/knowledge/components/KnowledgePageExplorer.d.ts +4 -1
- package/dist/src/domains/knowledge/components/KnowledgePageGraph.d.ts +3 -0
- package/dist/src/domains/knowledge/components/KnowledgeSourceIcon.d.ts +5 -0
- package/dist/src/domains/knowledge/components/KnowledgeTooltip.d.ts +5 -0
- package/dist/src/domains/knowledge/lib/fitViewport.d.ts +9 -2
- package/dist/src/domains/knowledge/lib/pageAddress.d.ts +10 -0
- package/dist/src/domains/knowledge/lib/pageRefs.d.ts +12 -1
- package/dist/src/domains/knowledge/lib/pagesByRefContext.d.ts +6 -0
- package/dist/src/domains/mcps/components/mcp-app-tool-result.d.ts +3 -1
- package/dist/src/domains/mcps/components/mcp-app-viewer.d.ts +6 -1
- package/dist/src/domains/mcps/context/mcp-app-host-context-value.d.ts +23 -0
- package/dist/src/domains/mcps/context/mcp-app-host-context.d.ts +7 -0
- package/dist/src/domains/mcps/index.d.ts +3 -0
- package/dist/src/domains/traces/components/feedback-options.d.ts +8 -0
- package/dist/src/domains/traces/components/feedback-thread.d.ts +2 -1
- package/dist/src/domains/traces/components/span-feedback-tab.d.ts +4 -2
- package/dist/src/domains/traces/components/thread-view-by-trace.d.ts +4 -1
- package/dist/src/domains/traces/components/trace-feedback-tab.d.ts +4 -2
- package/dist/src/domains/traces/components/trace-span-panel.d.ts +3 -1
- package/dist/src/domains/traces/components/trace-thread-panel.d.ts +3 -1
- package/dist/src/domains/traces/components/traces-explorer/index.d.ts +1 -0
- package/dist/src/domains/traces/components/traces-explorer/traces-explorer-context.d.ts +2 -0
- package/dist/src/domains/traces/components/traces-explorer/traces-explorer-root.d.ts +4 -1
- package/dist/src/ds/components/Breadcrumb/Breadcrumb.d.ts +2 -0
- package/dist/src/ds/components/DropdownMenu/dropdown-menu.d.ts +3 -0
- package/dist/src/ds/components/Tree/tree-label.d.ts +1 -1
- package/dist/src/ds/icons/ConfluenceIcon.d.ts +2 -0
- package/dist/src/ds/icons/NotionIcon.d.ts +2 -0
- package/dist/src/ds/icons/ZendeskIcon.d.ts +2 -0
- package/dist/src/ds/icons/index.d.ts +3 -0
- package/dist/src/utils/mcp-app-context.d.ts +6 -0
- package/dist/style.css +85 -35
- package/dist/{tabbed-container-Bhfi-DWr.cjs → tabbed-container-BMLD6mvc.cjs} +4 -4
- package/dist/{tabbed-container-Bhfi-DWr.cjs.map → tabbed-container-BMLD6mvc.cjs.map} +1 -1
- package/dist/{tabbed-container-DOkHshha.js → tabbed-container-CaS8cZCS.js} +4 -4
- package/dist/{tabbed-container-DOkHshha.js.map → tabbed-container-CaS8cZCS.js.map} +1 -1
- package/dist/{tabs-content-DwU_eA-a.js → tabs-content-BGkPZ5EQ.js} +2 -2
- package/dist/{tabs-content-DwU_eA-a.js.map → tabs-content-BGkPZ5EQ.js.map} +1 -1
- package/dist/{tabs-content-BACwMrMG.cjs → tabs-content-D_ic2ZqI.cjs} +2 -2
- package/dist/{tabs-content-BACwMrMG.cjs.map → tabs-content-D_ic2ZqI.cjs.map} +1 -1
- package/dist/{tabs-tab-BHs639jL.js → tabs-tab-CJVS0WED.js} +2 -2
- package/dist/{tabs-tab-BHs639jL.js.map → tabs-tab-CJVS0WED.js.map} +1 -1
- package/dist/{tabs-tab-CANh2eAD.cjs → tabs-tab-Dj2huH5T.cjs} +2 -2
- package/dist/{tabs-tab-CANh2eAD.cjs.map → tabs-tab-Dj2huH5T.cjs.map} +1 -1
- package/dist/{tool-approval-CguPaikn.cjs → tool-approval-C4WNL8VD.cjs} +3 -3
- package/dist/{tool-approval-CguPaikn.cjs.map → tool-approval-C4WNL8VD.cjs.map} +1 -1
- package/dist/{tool-approval-Cjz0yAzw.js → tool-approval-ZfL3-Vvi.js} +3 -3
- package/dist/{tool-approval-Cjz0yAzw.js.map → tool-approval-ZfL3-Vvi.js.map} +1 -1
- package/dist/{tool-call-ChJKYCfu.js → tool-call-BLzYTI-x.js} +2 -2
- package/dist/{tool-call-ChJKYCfu.js.map → tool-call-BLzYTI-x.js.map} +1 -1
- package/dist/{tool-call-BqDI9mrY.cjs → tool-call-C4TBpJ6Y.cjs} +2 -2
- package/dist/{tool-call-BqDI9mrY.cjs.map → tool-call-C4TBpJ6Y.cjs.map} +1 -1
- package/dist/{tool-card-GSiCfxMz.js → tool-card-CM0aHG3p.js} +4 -3
- package/dist/{tool-card-GSiCfxMz.js.map → tool-card-CM0aHG3p.js.map} +1 -1
- package/dist/{tool-card-Dg4VOYV6.cjs → tool-card-xDlCD0m6.cjs} +4 -3
- package/dist/{tool-card-Dg4VOYV6.cjs.map → tool-card-xDlCD0m6.cjs.map} +1 -1
- package/dist/{mcp-app-viewer-BV7FI498.js → types-BwdKiX24.js} +2 -144
- package/dist/types-BwdKiX24.js.map +1 -0
- package/dist/{mcp-app-viewer-M3-pqAlo.cjs → types-KjLUPShK.cjs} +8 -144
- package/dist/types-KjLUPShK.cjs.map +1 -0
- package/dist/{use-workflow-graph-runtime-BfCL6nd4.cjs → use-workflow-graph-runtime-DEJA9rk4.cjs} +2 -2
- package/dist/{use-workflow-graph-runtime-BfCL6nd4.cjs.map → use-workflow-graph-runtime-DEJA9rk4.cjs.map} +1 -1
- package/dist/{use-workflow-graph-runtime-B3VUuhUE.js → use-workflow-graph-runtime-DHOsA1DM.js} +2 -2
- package/dist/{use-workflow-graph-runtime-B3VUuhUE.js.map → use-workflow-graph-runtime-DHOsA1DM.js.map} +1 -1
- package/dist/utils/mcp-app-context.cjs.js +17 -0
- package/dist/utils/mcp-app-context.cjs.js.map +1 -0
- package/dist/utils/mcp-app-context.d.ts +1 -0
- package/dist/utils/mcp-app-context.es.js +15 -0
- package/dist/utils/mcp-app-context.es.js.map +1 -0
- package/package.json +8 -8
- package/dist/Composer-bVE8qK52.js.map +0 -1
- package/dist/Composer-u1K6edoZ.cjs.map +0 -1
- package/dist/FilterBar-Kmn6gMgO.js.map +0 -1
- package/dist/FilterBar-jBz6yaNu.cjs.map +0 -1
- package/dist/MetricsCard-DojbLiEx.cjs.map +0 -1
- package/dist/MetricsCard-kAqSCPPe.js.map +0 -1
- package/dist/Tree-Caz4FTCU.cjs.map +0 -1
- package/dist/Tree-od43gLMO.js.map +0 -1
- package/dist/combobox-parts-BeNqgCbj.cjs.map +0 -1
- package/dist/combobox-parts-C9o4UfH_.js.map +0 -1
- package/dist/domains/dashboards/hooks/use-scorers.cjs.js +0 -41
- package/dist/domains/dashboards/hooks/use-scorers.cjs.js.map +0 -1
- package/dist/domains/dashboards/hooks/use-scorers.d.ts +0 -1
- package/dist/domains/dashboards/hooks/use-scorers.es.js +0 -40
- package/dist/domains/dashboards/hooks/use-scorers.es.js.map +0 -1
- package/dist/dropdown-menu-DKoWI8kD.js.map +0 -1
- package/dist/dropdown-menu-Dx-jCOIv.cjs.map +0 -1
- package/dist/input-BpnUsQSt.cjs.map +0 -1
- package/dist/input-Cyit5ZSc.js.map +0 -1
- package/dist/mcp-app-viewer-BV7FI498.js.map +0 -1
- package/dist/mcp-app-viewer-M3-pqAlo.cjs.map +0 -1
- package/dist/src/domains/dashboards/hooks/use-scorers.d.ts +0 -66
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"requests.cjs.js","names":["intersectFilters","bucketPlan","toTraceAggregateTimeRange","previousWindow","AGGREGATE_PRIORITY"],"sources":["../../../../src/domains/dashboards/lib/requests.ts"],"sourcesContent":["import type { AggregateSpansArgs, AggregateTracesArgs, DashboardQuery, MastraClient } from '@mastra/client-js';\nimport type { MetricsQueryFilters } from '@mastra/react/hooks/metrics';\nimport { bucketPlan } from '../../metrics/lib/metrics-buckets';\nimport { AGGREGATE_PRIORITY } from '../../metrics/lib/request-limiter';\nimport type { AggregatePriority } from '../../metrics/lib/request-limiter';\nimport { previousWindow } from '../../metrics/lib/time-window';\nimport { toTraceAggregateTimeRange } from '../../metrics/lib/trace-aggregate';\nimport { intersectFilters } from './filters';\n\ntype Window = { start: Date; end: Date };\ntype Interval = '1h' | '1d';\ntype Args<M extends keyof MastraClient> = MastraClient[M] extends (args: infer A, ...rest: never[]) => unknown\n ? A\n : never;\n\ntype Call =\n | { method: 'aggregateTraces'; args: AggregateTracesArgs; priority?: AggregatePriority }\n | { method: 'aggregateSpans'; args: AggregateSpansArgs; priority?: AggregatePriority }\n | { method: 'getMetricAggregate'; args: Args<'getMetricAggregate'> }\n | { method: 'getMetricBreakdown'; args: Args<'getMetricBreakdown'> }\n | { method: 'getMetricTimeSeries'; args: Args<'getMetricTimeSeries'> }\n | { method: 'getMetricPercentiles'; args: Args<'getMetricPercentiles'> }\n | { method: 'getScoreAggregate'; args: Args<'getScoreAggregate'> }\n | { method: 'getScoreBreakdown'; args: Args<'getScoreBreakdown'> }\n | { method: 'getScoreTimeSeries'; args: Args<'getScoreTimeSeries'> }\n | { method: 'getScorePercentiles'; args: Args<'getScorePercentiles'> };\n\n/** One call a dashboard query makes, with the args it sends. */\nexport type DashboardRequest = Call & {\n /** Its filters contradict the page's, so nothing can match: it isn't sent and answers empty. */\n unsatisfiable?: true;\n};\n\nexport type DashboardRequestMethod = DashboardRequest['method'];\n\ntype Answers = { [M in DashboardRequestMethod]: Awaited<ReturnType<MastraClient[M]>> };\n\n/** A request's answer, tagged with the method that produced it so a widget narrows it by `method`. */\nexport type DashboardAnswer = {\n [M in DashboardRequestMethod]: { method: M; data: Answers[M] };\n}[DashboardRequestMethod];\n\ntype TraceWhere = NonNullable<AggregateTracesArgs['where']>;\ntype SpanWhere = NonNullable<AggregateSpansArgs['where']>;\n\n/** What the page adds to every widget's query: its frozen window and its filter bar. */\nexport type DashboardPageContext = {\n window: Window;\n /** The page's metrics and scores filters, `timestamp` included. */\n filters: MetricsQueryFilters['filters'];\n /** The filter bar as trace and span predicates, from the aggregate gates. */\n traceWhere?: TraceWhere;\n spanWhere?: SpanWhere;\n};\n\n/** How the widget kind sends a query. */\nexport type DashboardRequestOptions = {\n /** The bucket size, for a query that doesn't set its own. Unset sends the query as written. */\n interval?: Interval;\n};\n\n/** The widget's predicate and the page's, both required; the widget's comes first. */\nfunction andTrace(widget: TraceWhere | undefined, page: TraceWhere | undefined): TraceWhere | undefined {\n return widget && page ? { op: 'and', args: [widget, page] } : (widget ?? page);\n}\n\nfunction andSpan(widget: SpanWhere | undefined, page: SpanWhere | undefined): SpanWhere | undefined {\n return widget && page ? { op: 'and', args: [widget, page] } : (widget ?? page);\n}\n\ntype ValuesQuery = Extract<DashboardQuery, { source: 'metrics' | 'scores' }>;\n\n/**\n * A metrics or scores query's args, the page's filters intersected with its own, over `window`;\n * `unsatisfiable` when they contradict.\n */\nfunction valuesArgs<Q extends ValuesQuery>(query: Q, page: DashboardPageContext, window: Window) {\n const { source: _source, id: _id, request, compare, filters, ...rest } = query;\n const combined = intersectFilters(page.filters, filters);\n return {\n unsatisfiable: combined === undefined ? (true as const) : undefined,\n args: {\n ...rest,\n filters: { ...(combined ?? page.filters), timestamp: window },\n // An aggregate compares in the same request; anything else sends a second one over `window`.\n comparePeriod: request === 'aggregate' && compare === 'previousWindow' ? ('previous_period' as const) : undefined,\n },\n };\n}\n\n/** A bucketed request's interval: its own, else the kind's, else the bar charts' for `window`. */\nfunction bucketOf<I extends string>(own: I | undefined, interval: Interval | undefined, window: Window) {\n return own ?? interval ?? bucketPlan(window.start, window.end).interval;\n}\n\n/**\n * The request a query sends over `window`, the page's filters ANDed with the widget's: trace and span\n * predicates are joined with `and`; metrics and scores filters intersect (`intersectFilters`), and a\n * contradiction marks the request unsatisfiable. A scores query without a scorer sends nothing: the\n * `scores` kind expands it per scorer first.\n */\nexport function buildRequest(\n query: DashboardQuery,\n page: DashboardPageContext,\n { interval }: DashboardRequestOptions,\n window: Window = page.window,\n priority?: AggregatePriority,\n): DashboardRequest | undefined {\n if (query.source === 'traceAggregate') {\n const { source: _source, id: _id, compare: _compare, where, interval: own, ...rest } = query;\n return {\n method: 'aggregateTraces',\n args: {\n timeRange: toTraceAggregateTimeRange(window),\n ...rest,\n interval: own ?? interval,\n where: andTrace(where, page.traceWhere),\n },\n priority,\n };\n }\n if (query.source === 'spanAggregate') {\n const { source: _source, id: _id, compare: _compare, where, interval: own, ...rest } = query;\n return {\n method: 'aggregateSpans',\n args: {\n timeRange: toTraceAggregateTimeRange(window),\n ...rest,\n interval: own ?? interval,\n where: andSpan(where, page.spanWhere),\n },\n priority,\n };\n }\n if (query.source === 'metrics') {\n switch (query.request) {\n case 'aggregate': {\n const { args, unsatisfiable } = valuesArgs(query, page, window);\n return { method: 'getMetricAggregate', args, unsatisfiable };\n }\n case 'breakdown': {\n const { args, unsatisfiable } = valuesArgs(query, page, window);\n return { method: 'getMetricBreakdown', args, unsatisfiable };\n }\n case 'timeSeries': {\n const { args, unsatisfiable } = valuesArgs(query, page, window);\n const bucketed = { ...args, interval: bucketOf(query.interval, interval, window) };\n return { method: 'getMetricTimeSeries', args: bucketed, unsatisfiable };\n }\n case 'percentiles': {\n const { args, unsatisfiable } = valuesArgs(query, page, window);\n const bucketed = { ...args, interval: bucketOf(query.interval, interval, window) };\n return { method: 'getMetricPercentiles', args: bucketed, unsatisfiable };\n }\n }\n }\n const { scorerId } = query;\n if (scorerId === undefined) return undefined;\n switch (query.request) {\n case 'aggregate': {\n const { args, unsatisfiable } = valuesArgs(query, page, window);\n return { method: 'getScoreAggregate', args: { ...args, scorerId }, unsatisfiable };\n }\n case 'breakdown': {\n const { args, unsatisfiable } = valuesArgs(query, page, window);\n return { method: 'getScoreBreakdown', args: { ...args, scorerId }, unsatisfiable };\n }\n case 'timeSeries': {\n const { args, unsatisfiable } = valuesArgs(query, page, window);\n const bucketed = { ...args, scorerId, interval: bucketOf(query.interval, interval, window) };\n return { method: 'getScoreTimeSeries', args: bucketed, unsatisfiable };\n }\n case 'percentiles': {\n const { args, unsatisfiable } = valuesArgs(query, page, window);\n const bucketed = { ...args, scorerId, interval: bucketOf(query.interval, interval, window) };\n return { method: 'getScorePercentiles', args: bucketed, unsatisfiable };\n }\n }\n}\n\n/** Whether a query asks for the previous window as a request of its own. */\nexport function sendsPreviousRequest(query: DashboardQuery) {\n if (query.compare !== 'previousWindow') return false;\n return !((query.source === 'metrics' || query.source === 'scores') && query.request === 'aggregate');\n}\n\n/** The previous window's request, sent last so the widget never waits on it. */\nexport function buildPreviousRequest(\n query: DashboardQuery,\n page: DashboardPageContext,\n options: DashboardRequestOptions,\n): DashboardRequest | undefined {\n if (!sendsPreviousRequest(query)) return undefined;\n return buildRequest(query, page, options, previousWindow(page.window), AGGREGATE_PRIORITY.last);\n}\n\n/** What an unsatisfiable request answers: nothing matched. */\nfunction emptyAnswer(method: DashboardRequestMethod): DashboardAnswer {\n switch (method) {\n case 'aggregateTraces':\n case 'aggregateSpans':\n return { method, data: { rows: [], truncated: false } };\n case 'getMetricAggregate':\n case 'getScoreAggregate':\n return { method, data: { value: null } };\n case 'getMetricBreakdown':\n case 'getScoreBreakdown':\n return { method, data: { groups: [] } };\n case 'getMetricTimeSeries':\n case 'getMetricPercentiles':\n case 'getScoreTimeSeries':\n case 'getScorePercentiles':\n return { method, data: { series: [] } };\n }\n}\n\n/** Runs a request on the client; an unsatisfiable one answers empty without a call. */\nexport async function sendRequest(client: MastraClient, request: DashboardRequest): Promise<DashboardAnswer> {\n if (request.unsatisfiable) return emptyAnswer(request.method);\n switch (request.method) {\n case 'aggregateTraces':\n return { method: request.method, data: await client.aggregateTraces(request.args) };\n case 'aggregateSpans':\n return { method: request.method, data: await client.aggregateSpans(request.args) };\n case 'getMetricAggregate':\n return { method: request.method, data: await client.getMetricAggregate(request.args) };\n case 'getMetricBreakdown':\n return { method: request.method, data: await client.getMetricBreakdown(request.args) };\n case 'getMetricTimeSeries':\n return { method: request.method, data: await client.getMetricTimeSeries(request.args) };\n case 'getMetricPercentiles':\n return { method: request.method, data: await client.getMetricPercentiles(request.args) };\n case 'getScoreAggregate':\n return { method: request.method, data: await client.getScoreAggregate(request.args) };\n case 'getScoreBreakdown':\n return { method: request.method, data: await client.getScoreBreakdown(request.args) };\n case 'getScoreTimeSeries':\n return { method: request.method, data: await client.getScoreTimeSeries(request.args) };\n case 'getScorePercentiles':\n return { method: request.method, data: await client.getScorePercentiles(request.args) };\n }\n}\n\n/**\n * The React Query key. Answers are cached tagged with their method, so they live under the dashboards'\n * own keys rather than `useTraceAggregate`'s, whose entries hold the bare response.\n */\nexport function requestKey(request: DashboardRequest): readonly unknown[] {\n if (request.unsatisfiable) return ['dashboards', 'unsatisfiable', request.method];\n return ['dashboards', request.method, request.args];\n}\n\n/** Whether a query needs the trace or span aggregate gate. */\nexport const aggregateSource = (query: DashboardQuery) =>\n query.source === 'traceAggregate' ? 'trace' : query.source === 'spanAggregate' ? 'span' : undefined;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"requests.cjs.js","names":["intersectFilters","bucketPlan","toTraceAggregateTimeRange","previousWindow","AGGREGATE_PRIORITY"],"sources":["../../../../src/domains/dashboards/lib/requests.ts"],"sourcesContent":["import type { AggregateSpansArgs, AggregateTracesArgs, DashboardQuery, MastraClient } from '@mastra/client-js';\nimport type { MetricsQueryFilters } from '@mastra/react/hooks/metrics';\nimport { bucketPlan } from '../../metrics/lib/metrics-buckets';\nimport { AGGREGATE_PRIORITY } from '../../metrics/lib/request-limiter';\nimport type { AggregatePriority } from '../../metrics/lib/request-limiter';\nimport { previousWindow } from '../../metrics/lib/time-window';\nimport { toTraceAggregateTimeRange } from '../../metrics/lib/trace-aggregate';\nimport { intersectFilters } from './filters';\n\ntype Window = { start: Date; end: Date };\ntype Interval = '1h' | '1d';\ntype Args<M extends keyof MastraClient> = MastraClient[M] extends (args: infer A, ...rest: never[]) => unknown\n ? A\n : never;\n\ntype Call =\n | { method: 'aggregateTraces'; args: AggregateTracesArgs; priority?: AggregatePriority }\n | { method: 'aggregateSpans'; args: AggregateSpansArgs; priority?: AggregatePriority }\n | { method: 'getMetricAggregate'; args: Args<'getMetricAggregate'> }\n | { method: 'getMetricBreakdown'; args: Args<'getMetricBreakdown'> }\n | { method: 'getMetricTimeSeries'; args: Args<'getMetricTimeSeries'> }\n | { method: 'getMetricPercentiles'; args: Args<'getMetricPercentiles'> }\n | { method: 'getScoreAggregate'; args: Args<'getScoreAggregate'> }\n | { method: 'getScoreBreakdown'; args: Args<'getScoreBreakdown'> }\n | { method: 'getScoreTimeSeries'; args: Args<'getScoreTimeSeries'> }\n | { method: 'getScorePercentiles'; args: Args<'getScorePercentiles'> }\n | { method: 'listScores'; args: Args<'listScores'> };\n\n/** One call a dashboard query makes, with the args it sends. */\nexport type DashboardRequest = Call & {\n /** Its filters contradict the page's, so nothing can match: it isn't sent and answers empty. */\n unsatisfiable?: true;\n};\n\nexport type DashboardRequestMethod = DashboardRequest['method'];\n\ntype Answers = { [M in DashboardRequestMethod]: Awaited<ReturnType<MastraClient[M]>> };\n\n/** A request's answer, tagged with the method that produced it so a widget narrows it by `method`. */\nexport type DashboardAnswer = {\n [M in DashboardRequestMethod]: { method: M; data: Answers[M] };\n}[DashboardRequestMethod];\n\n/**\n * Where a request's answer stands, as plain data: what a widget renders from, whoever fetched it.\n * `isLoading` has no answer yet; `isRefetching` has one and is fetching it again.\n */\nexport type DashboardResult = {\n data?: DashboardAnswer;\n isLoading: boolean;\n isRefetching: boolean;\n isError: boolean;\n error?: unknown;\n};\n\ntype TraceWhere = NonNullable<AggregateTracesArgs['where']>;\ntype SpanWhere = NonNullable<AggregateSpansArgs['where']>;\n\n/** What the page adds to every widget's query: its frozen window and its filter bar. */\nexport type DashboardPageContext = {\n window: Window;\n /** The page's metrics and scores filters, `timestamp` included. */\n filters: MetricsQueryFilters['filters'];\n /** The filter bar as trace and span predicates, from the aggregate gates. */\n traceWhere?: TraceWhere;\n spanWhere?: SpanWhere;\n};\n\n/** How the widget kind sends a query. */\nexport type DashboardRequestOptions = {\n /** The bucket size, for a query that doesn't set its own. Unset sends the query as written. */\n interval?: Interval;\n};\n\n/** The widget's predicate and the page's, both required; the widget's comes first. */\nfunction andTrace(widget: TraceWhere | undefined, page: TraceWhere | undefined): TraceWhere | undefined {\n return widget && page ? { op: 'and', args: [widget, page] } : (widget ?? page);\n}\n\nfunction andSpan(widget: SpanWhere | undefined, page: SpanWhere | undefined): SpanWhere | undefined {\n return widget && page ? { op: 'and', args: [widget, page] } : (widget ?? page);\n}\n\ntype ValuesQuery = Extract<DashboardQuery, { source: 'metrics' | 'scores' }>;\n\n/**\n * A metrics or scores query's args, the page's filters intersected with its own, over `window`;\n * `unsatisfiable` when they contradict.\n */\nfunction valuesArgs<Q extends ValuesQuery>(query: Q, page: DashboardPageContext, window: Window) {\n const { source: _source, id: _id, request, compare, filters, ...rest } = query;\n const combined = intersectFilters(page.filters, filters);\n return {\n unsatisfiable: combined === undefined ? (true as const) : undefined,\n args: {\n ...rest,\n filters: { ...(combined ?? page.filters), timestamp: window },\n // An aggregate compares in the same request; anything else sends a second one over `window`.\n comparePeriod: request === 'aggregate' && compare === 'previousWindow' ? ('previous_period' as const) : undefined,\n },\n };\n}\n\n/**\n * The query with the page's filter bar ANDed in, as `buildRequest` applies it, but without the time\n * window: trace and span predicates joined with `and`, metrics and scores filters intersected.\n * `'unsatisfiable'` when the filters contradict, so nothing can match.\n */\nexport function pageQuery(query: DashboardQuery, page: DashboardPageContext): DashboardQuery | 'unsatisfiable' {\n if (query.source === 'traceAggregate') {\n const where = andTrace(query.where, page.traceWhere);\n return where ? { ...query, where } : query;\n }\n if (query.source === 'spanAggregate') {\n const where = andSpan(query.where, page.spanWhere);\n return where ? { ...query, where } : query;\n }\n const combined = intersectFilters(page.filters, query.filters);\n if (combined === undefined) return 'unsatisfiable';\n const { timestamp: _timestamp, ...filters } = combined;\n const { filters: _own, ...rest } = query;\n return Object.keys(filters).length > 0 ? { ...rest, filters } : rest;\n}\n\n/** A bucketed request's interval: its own, else the kind's, else the bar charts' for `window`. */\nfunction bucketOf<I extends string>(own: I | undefined, interval: Interval | undefined, window: Window) {\n return own ?? interval ?? bucketPlan(window.start, window.end).interval;\n}\n\n/**\n * The request a query sends over `window`, the page's filters ANDed with the widget's: trace and span\n * predicates are joined with `and`; metrics and scores filters intersect (`intersectFilters`), and a\n * contradiction marks the request unsatisfiable. A scores query without a scorer sends nothing: the\n * `scores` kind expands it per scorer first.\n */\nexport function buildRequest(\n query: DashboardQuery,\n page: DashboardPageContext,\n { interval }: DashboardRequestOptions,\n window: Window = page.window,\n priority?: AggregatePriority,\n): DashboardRequest | undefined {\n if (query.source === 'traceAggregate') {\n const { source: _source, id: _id, compare: _compare, where, interval: own, ...rest } = query;\n return {\n method: 'aggregateTraces',\n args: {\n timeRange: toTraceAggregateTimeRange(window),\n ...rest,\n interval: own ?? interval,\n where: andTrace(where, page.traceWhere),\n },\n priority,\n };\n }\n if (query.source === 'spanAggregate') {\n const { source: _source, id: _id, compare: _compare, where, interval: own, ...rest } = query;\n return {\n method: 'aggregateSpans',\n args: {\n timeRange: toTraceAggregateTimeRange(window),\n ...rest,\n interval: own ?? interval,\n where: andSpan(where, page.spanWhere),\n },\n priority,\n };\n }\n if (query.source === 'metrics') {\n switch (query.request) {\n case 'aggregate': {\n const { args, unsatisfiable } = valuesArgs(query, page, window);\n return { method: 'getMetricAggregate', args, unsatisfiable };\n }\n case 'breakdown': {\n const { args, unsatisfiable } = valuesArgs(query, page, window);\n return { method: 'getMetricBreakdown', args, unsatisfiable };\n }\n case 'timeSeries': {\n const { args, unsatisfiable } = valuesArgs(query, page, window);\n const bucketed = { ...args, interval: bucketOf(query.interval, interval, window) };\n return { method: 'getMetricTimeSeries', args: bucketed, unsatisfiable };\n }\n case 'percentiles': {\n const { args, unsatisfiable } = valuesArgs(query, page, window);\n const bucketed = { ...args, interval: bucketOf(query.interval, interval, window) };\n return { method: 'getMetricPercentiles', args: bucketed, unsatisfiable };\n }\n }\n }\n const { scorerId } = query;\n if (scorerId === undefined) return undefined;\n switch (query.request) {\n case 'aggregate': {\n const { args, unsatisfiable } = valuesArgs(query, page, window);\n return { method: 'getScoreAggregate', args: { ...args, scorerId }, unsatisfiable };\n }\n case 'breakdown': {\n const { args, unsatisfiable } = valuesArgs(query, page, window);\n return { method: 'getScoreBreakdown', args: { ...args, scorerId }, unsatisfiable };\n }\n case 'timeSeries': {\n const { args, unsatisfiable } = valuesArgs(query, page, window);\n const bucketed = { ...args, scorerId, interval: bucketOf(query.interval, interval, window) };\n return { method: 'getScoreTimeSeries', args: bucketed, unsatisfiable };\n }\n case 'percentiles': {\n const { args, unsatisfiable } = valuesArgs(query, page, window);\n const bucketed = { ...args, scorerId, interval: bucketOf(query.interval, interval, window) };\n return { method: 'getScorePercentiles', args: bucketed, unsatisfiable };\n }\n }\n}\n\n/** Whether a query asks for the previous window as a request of its own. */\nexport function sendsPreviousRequest(query: DashboardQuery) {\n if (query.compare !== 'previousWindow') return false;\n return !((query.source === 'metrics' || query.source === 'scores') && query.request === 'aggregate');\n}\n\n/** The previous window's request, sent last so the widget never waits on it. */\nexport function buildPreviousRequest(\n query: DashboardQuery,\n page: DashboardPageContext,\n options: DashboardRequestOptions,\n): DashboardRequest | undefined {\n if (!sendsPreviousRequest(query)) return undefined;\n return buildRequest(query, page, options, previousWindow(page.window), AGGREGATE_PRIORITY.last);\n}\n\n/** What an unsatisfiable request answers: nothing matched. */\nexport function emptyAnswer(method: DashboardRequestMethod): DashboardAnswer {\n switch (method) {\n case 'aggregateTraces':\n case 'aggregateSpans':\n return { method, data: { rows: [], truncated: false } };\n case 'getMetricAggregate':\n case 'getScoreAggregate':\n return { method, data: { value: null } };\n case 'getMetricBreakdown':\n case 'getScoreBreakdown':\n return { method, data: { groups: [] } };\n case 'getMetricTimeSeries':\n case 'getMetricPercentiles':\n case 'getScoreTimeSeries':\n case 'getScorePercentiles':\n return { method, data: { series: [] } };\n case 'listScores':\n return { method, data: { scores: [], pagination: { total: 0, page: 0, perPage: 0, hasMore: false } } };\n }\n}\n\n/** Runs a request on the client; an unsatisfiable one answers empty without a call. */\nexport async function sendRequest(client: MastraClient, request: DashboardRequest): Promise<DashboardAnswer> {\n if (request.unsatisfiable) return emptyAnswer(request.method);\n switch (request.method) {\n case 'aggregateTraces':\n return { method: request.method, data: await client.aggregateTraces(request.args) };\n case 'aggregateSpans':\n return { method: request.method, data: await client.aggregateSpans(request.args) };\n case 'getMetricAggregate':\n return { method: request.method, data: await client.getMetricAggregate(request.args) };\n case 'getMetricBreakdown':\n return { method: request.method, data: await client.getMetricBreakdown(request.args) };\n case 'getMetricTimeSeries':\n return { method: request.method, data: await client.getMetricTimeSeries(request.args) };\n case 'getMetricPercentiles':\n return { method: request.method, data: await client.getMetricPercentiles(request.args) };\n case 'getScoreAggregate':\n return { method: request.method, data: await client.getScoreAggregate(request.args) };\n case 'getScoreBreakdown':\n return { method: request.method, data: await client.getScoreBreakdown(request.args) };\n case 'getScoreTimeSeries':\n return { method: request.method, data: await client.getScoreTimeSeries(request.args) };\n case 'getScorePercentiles':\n return { method: request.method, data: await client.getScorePercentiles(request.args) };\n case 'listScores':\n return { method: request.method, data: await client.listScores(request.args) };\n }\n}\n\n/**\n * The React Query key. Answers are cached tagged with their method, so they live under the dashboards'\n * own keys rather than `useTraceAggregate`'s, whose entries hold the bare response.\n */\nexport function requestKey(request: DashboardRequest): readonly unknown[] {\n if (request.unsatisfiable) return ['dashboards', 'unsatisfiable', request.method];\n return ['dashboards', request.method, request.args];\n}\n\n/** Whether a query needs the trace or span aggregate gate. */\nexport const aggregateSource = (query: DashboardQuery) =>\n query.source === 'traceAggregate' ? 'trace' : query.source === 'spanAggregate' ? 'span' : undefined;\n"],"mappings":"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"}
|
|
@@ -36,6 +36,35 @@ function valuesArgs(query, page, window) {
|
|
|
36
36
|
}
|
|
37
37
|
};
|
|
38
38
|
}
|
|
39
|
+
/**
|
|
40
|
+
* The query with the page's filter bar ANDed in, as `buildRequest` applies it, but without the time
|
|
41
|
+
* window: trace and span predicates joined with `and`, metrics and scores filters intersected.
|
|
42
|
+
* `'unsatisfiable'` when the filters contradict, so nothing can match.
|
|
43
|
+
*/
|
|
44
|
+
function pageQuery(query, page) {
|
|
45
|
+
if (query.source === "traceAggregate") {
|
|
46
|
+
const where = andTrace(query.where, page.traceWhere);
|
|
47
|
+
return where ? {
|
|
48
|
+
...query,
|
|
49
|
+
where
|
|
50
|
+
} : query;
|
|
51
|
+
}
|
|
52
|
+
if (query.source === "spanAggregate") {
|
|
53
|
+
const where = andSpan(query.where, page.spanWhere);
|
|
54
|
+
return where ? {
|
|
55
|
+
...query,
|
|
56
|
+
where
|
|
57
|
+
} : query;
|
|
58
|
+
}
|
|
59
|
+
const combined = intersectFilters(page.filters, query.filters);
|
|
60
|
+
if (combined === void 0) return "unsatisfiable";
|
|
61
|
+
const { timestamp: _timestamp, ...filters } = combined;
|
|
62
|
+
const { filters: _own, ...rest } = query;
|
|
63
|
+
return Object.keys(filters).length > 0 ? {
|
|
64
|
+
...rest,
|
|
65
|
+
filters
|
|
66
|
+
} : rest;
|
|
67
|
+
}
|
|
39
68
|
/** A bucketed request's interval: its own, else the kind's, else the bar charts' for `window`. */
|
|
40
69
|
function bucketOf(own, interval, window) {
|
|
41
70
|
return own ?? interval ?? bucketPlan(window.start, window.end).interval;
|
|
@@ -202,6 +231,18 @@ function emptyAnswer(method) {
|
|
|
202
231
|
method,
|
|
203
232
|
data: { series: [] }
|
|
204
233
|
};
|
|
234
|
+
case "listScores": return {
|
|
235
|
+
method,
|
|
236
|
+
data: {
|
|
237
|
+
scores: [],
|
|
238
|
+
pagination: {
|
|
239
|
+
total: 0,
|
|
240
|
+
page: 0,
|
|
241
|
+
perPage: 0,
|
|
242
|
+
hasMore: false
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
};
|
|
205
246
|
}
|
|
206
247
|
}
|
|
207
248
|
/** Runs a request on the client; an unsatisfiable one answers empty without a call. */
|
|
@@ -248,6 +289,10 @@ async function sendRequest(client, request) {
|
|
|
248
289
|
method: request.method,
|
|
249
290
|
data: await client.getScorePercentiles(request.args)
|
|
250
291
|
};
|
|
292
|
+
case "listScores": return {
|
|
293
|
+
method: request.method,
|
|
294
|
+
data: await client.listScores(request.args)
|
|
295
|
+
};
|
|
251
296
|
}
|
|
252
297
|
}
|
|
253
298
|
/**
|
|
@@ -268,6 +313,6 @@ function requestKey(request) {
|
|
|
268
313
|
}
|
|
269
314
|
/** Whether a query needs the trace or span aggregate gate. */
|
|
270
315
|
var aggregateSource = (query) => query.source === "traceAggregate" ? "trace" : query.source === "spanAggregate" ? "span" : void 0;
|
|
271
|
-
export { aggregateSource, buildPreviousRequest, buildRequest, requestKey, sendRequest, sendsPreviousRequest };
|
|
316
|
+
export { aggregateSource, buildPreviousRequest, buildRequest, emptyAnswer, pageQuery, requestKey, sendRequest, sendsPreviousRequest };
|
|
272
317
|
|
|
273
318
|
//# sourceMappingURL=requests.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"requests.es.js","names":[],"sources":["../../../../src/domains/dashboards/lib/requests.ts"],"sourcesContent":["import type { AggregateSpansArgs, AggregateTracesArgs, DashboardQuery, MastraClient } from '@mastra/client-js';\nimport type { MetricsQueryFilters } from '@mastra/react/hooks/metrics';\nimport { bucketPlan } from '../../metrics/lib/metrics-buckets';\nimport { AGGREGATE_PRIORITY } from '../../metrics/lib/request-limiter';\nimport type { AggregatePriority } from '../../metrics/lib/request-limiter';\nimport { previousWindow } from '../../metrics/lib/time-window';\nimport { toTraceAggregateTimeRange } from '../../metrics/lib/trace-aggregate';\nimport { intersectFilters } from './filters';\n\ntype Window = { start: Date; end: Date };\ntype Interval = '1h' | '1d';\ntype Args<M extends keyof MastraClient> = MastraClient[M] extends (args: infer A, ...rest: never[]) => unknown\n ? A\n : never;\n\ntype Call =\n | { method: 'aggregateTraces'; args: AggregateTracesArgs; priority?: AggregatePriority }\n | { method: 'aggregateSpans'; args: AggregateSpansArgs; priority?: AggregatePriority }\n | { method: 'getMetricAggregate'; args: Args<'getMetricAggregate'> }\n | { method: 'getMetricBreakdown'; args: Args<'getMetricBreakdown'> }\n | { method: 'getMetricTimeSeries'; args: Args<'getMetricTimeSeries'> }\n | { method: 'getMetricPercentiles'; args: Args<'getMetricPercentiles'> }\n | { method: 'getScoreAggregate'; args: Args<'getScoreAggregate'> }\n | { method: 'getScoreBreakdown'; args: Args<'getScoreBreakdown'> }\n | { method: 'getScoreTimeSeries'; args: Args<'getScoreTimeSeries'> }\n | { method: 'getScorePercentiles'; args: Args<'getScorePercentiles'> };\n\n/** One call a dashboard query makes, with the args it sends. */\nexport type DashboardRequest = Call & {\n /** Its filters contradict the page's, so nothing can match: it isn't sent and answers empty. */\n unsatisfiable?: true;\n};\n\nexport type DashboardRequestMethod = DashboardRequest['method'];\n\ntype Answers = { [M in DashboardRequestMethod]: Awaited<ReturnType<MastraClient[M]>> };\n\n/** A request's answer, tagged with the method that produced it so a widget narrows it by `method`. */\nexport type DashboardAnswer = {\n [M in DashboardRequestMethod]: { method: M; data: Answers[M] };\n}[DashboardRequestMethod];\n\ntype TraceWhere = NonNullable<AggregateTracesArgs['where']>;\ntype SpanWhere = NonNullable<AggregateSpansArgs['where']>;\n\n/** What the page adds to every widget's query: its frozen window and its filter bar. */\nexport type DashboardPageContext = {\n window: Window;\n /** The page's metrics and scores filters, `timestamp` included. */\n filters: MetricsQueryFilters['filters'];\n /** The filter bar as trace and span predicates, from the aggregate gates. */\n traceWhere?: TraceWhere;\n spanWhere?: SpanWhere;\n};\n\n/** How the widget kind sends a query. */\nexport type DashboardRequestOptions = {\n /** The bucket size, for a query that doesn't set its own. Unset sends the query as written. */\n interval?: Interval;\n};\n\n/** The widget's predicate and the page's, both required; the widget's comes first. */\nfunction andTrace(widget: TraceWhere | undefined, page: TraceWhere | undefined): TraceWhere | undefined {\n return widget && page ? { op: 'and', args: [widget, page] } : (widget ?? page);\n}\n\nfunction andSpan(widget: SpanWhere | undefined, page: SpanWhere | undefined): SpanWhere | undefined {\n return widget && page ? { op: 'and', args: [widget, page] } : (widget ?? page);\n}\n\ntype ValuesQuery = Extract<DashboardQuery, { source: 'metrics' | 'scores' }>;\n\n/**\n * A metrics or scores query's args, the page's filters intersected with its own, over `window`;\n * `unsatisfiable` when they contradict.\n */\nfunction valuesArgs<Q extends ValuesQuery>(query: Q, page: DashboardPageContext, window: Window) {\n const { source: _source, id: _id, request, compare, filters, ...rest } = query;\n const combined = intersectFilters(page.filters, filters);\n return {\n unsatisfiable: combined === undefined ? (true as const) : undefined,\n args: {\n ...rest,\n filters: { ...(combined ?? page.filters), timestamp: window },\n // An aggregate compares in the same request; anything else sends a second one over `window`.\n comparePeriod: request === 'aggregate' && compare === 'previousWindow' ? ('previous_period' as const) : undefined,\n },\n };\n}\n\n/** A bucketed request's interval: its own, else the kind's, else the bar charts' for `window`. */\nfunction bucketOf<I extends string>(own: I | undefined, interval: Interval | undefined, window: Window) {\n return own ?? interval ?? bucketPlan(window.start, window.end).interval;\n}\n\n/**\n * The request a query sends over `window`, the page's filters ANDed with the widget's: trace and span\n * predicates are joined with `and`; metrics and scores filters intersect (`intersectFilters`), and a\n * contradiction marks the request unsatisfiable. A scores query without a scorer sends nothing: the\n * `scores` kind expands it per scorer first.\n */\nexport function buildRequest(\n query: DashboardQuery,\n page: DashboardPageContext,\n { interval }: DashboardRequestOptions,\n window: Window = page.window,\n priority?: AggregatePriority,\n): DashboardRequest | undefined {\n if (query.source === 'traceAggregate') {\n const { source: _source, id: _id, compare: _compare, where, interval: own, ...rest } = query;\n return {\n method: 'aggregateTraces',\n args: {\n timeRange: toTraceAggregateTimeRange(window),\n ...rest,\n interval: own ?? interval,\n where: andTrace(where, page.traceWhere),\n },\n priority,\n };\n }\n if (query.source === 'spanAggregate') {\n const { source: _source, id: _id, compare: _compare, where, interval: own, ...rest } = query;\n return {\n method: 'aggregateSpans',\n args: {\n timeRange: toTraceAggregateTimeRange(window),\n ...rest,\n interval: own ?? interval,\n where: andSpan(where, page.spanWhere),\n },\n priority,\n };\n }\n if (query.source === 'metrics') {\n switch (query.request) {\n case 'aggregate': {\n const { args, unsatisfiable } = valuesArgs(query, page, window);\n return { method: 'getMetricAggregate', args, unsatisfiable };\n }\n case 'breakdown': {\n const { args, unsatisfiable } = valuesArgs(query, page, window);\n return { method: 'getMetricBreakdown', args, unsatisfiable };\n }\n case 'timeSeries': {\n const { args, unsatisfiable } = valuesArgs(query, page, window);\n const bucketed = { ...args, interval: bucketOf(query.interval, interval, window) };\n return { method: 'getMetricTimeSeries', args: bucketed, unsatisfiable };\n }\n case 'percentiles': {\n const { args, unsatisfiable } = valuesArgs(query, page, window);\n const bucketed = { ...args, interval: bucketOf(query.interval, interval, window) };\n return { method: 'getMetricPercentiles', args: bucketed, unsatisfiable };\n }\n }\n }\n const { scorerId } = query;\n if (scorerId === undefined) return undefined;\n switch (query.request) {\n case 'aggregate': {\n const { args, unsatisfiable } = valuesArgs(query, page, window);\n return { method: 'getScoreAggregate', args: { ...args, scorerId }, unsatisfiable };\n }\n case 'breakdown': {\n const { args, unsatisfiable } = valuesArgs(query, page, window);\n return { method: 'getScoreBreakdown', args: { ...args, scorerId }, unsatisfiable };\n }\n case 'timeSeries': {\n const { args, unsatisfiable } = valuesArgs(query, page, window);\n const bucketed = { ...args, scorerId, interval: bucketOf(query.interval, interval, window) };\n return { method: 'getScoreTimeSeries', args: bucketed, unsatisfiable };\n }\n case 'percentiles': {\n const { args, unsatisfiable } = valuesArgs(query, page, window);\n const bucketed = { ...args, scorerId, interval: bucketOf(query.interval, interval, window) };\n return { method: 'getScorePercentiles', args: bucketed, unsatisfiable };\n }\n }\n}\n\n/** Whether a query asks for the previous window as a request of its own. */\nexport function sendsPreviousRequest(query: DashboardQuery) {\n if (query.compare !== 'previousWindow') return false;\n return !((query.source === 'metrics' || query.source === 'scores') && query.request === 'aggregate');\n}\n\n/** The previous window's request, sent last so the widget never waits on it. */\nexport function buildPreviousRequest(\n query: DashboardQuery,\n page: DashboardPageContext,\n options: DashboardRequestOptions,\n): DashboardRequest | undefined {\n if (!sendsPreviousRequest(query)) return undefined;\n return buildRequest(query, page, options, previousWindow(page.window), AGGREGATE_PRIORITY.last);\n}\n\n/** What an unsatisfiable request answers: nothing matched. */\nfunction emptyAnswer(method: DashboardRequestMethod): DashboardAnswer {\n switch (method) {\n case 'aggregateTraces':\n case 'aggregateSpans':\n return { method, data: { rows: [], truncated: false } };\n case 'getMetricAggregate':\n case 'getScoreAggregate':\n return { method, data: { value: null } };\n case 'getMetricBreakdown':\n case 'getScoreBreakdown':\n return { method, data: { groups: [] } };\n case 'getMetricTimeSeries':\n case 'getMetricPercentiles':\n case 'getScoreTimeSeries':\n case 'getScorePercentiles':\n return { method, data: { series: [] } };\n }\n}\n\n/** Runs a request on the client; an unsatisfiable one answers empty without a call. */\nexport async function sendRequest(client: MastraClient, request: DashboardRequest): Promise<DashboardAnswer> {\n if (request.unsatisfiable) return emptyAnswer(request.method);\n switch (request.method) {\n case 'aggregateTraces':\n return { method: request.method, data: await client.aggregateTraces(request.args) };\n case 'aggregateSpans':\n return { method: request.method, data: await client.aggregateSpans(request.args) };\n case 'getMetricAggregate':\n return { method: request.method, data: await client.getMetricAggregate(request.args) };\n case 'getMetricBreakdown':\n return { method: request.method, data: await client.getMetricBreakdown(request.args) };\n case 'getMetricTimeSeries':\n return { method: request.method, data: await client.getMetricTimeSeries(request.args) };\n case 'getMetricPercentiles':\n return { method: request.method, data: await client.getMetricPercentiles(request.args) };\n case 'getScoreAggregate':\n return { method: request.method, data: await client.getScoreAggregate(request.args) };\n case 'getScoreBreakdown':\n return { method: request.method, data: await client.getScoreBreakdown(request.args) };\n case 'getScoreTimeSeries':\n return { method: request.method, data: await client.getScoreTimeSeries(request.args) };\n case 'getScorePercentiles':\n return { method: request.method, data: await client.getScorePercentiles(request.args) };\n }\n}\n\n/**\n * The React Query key. Answers are cached tagged with their method, so they live under the dashboards'\n * own keys rather than `useTraceAggregate`'s, whose entries hold the bare response.\n */\nexport function requestKey(request: DashboardRequest): readonly unknown[] {\n if (request.unsatisfiable) return ['dashboards', 'unsatisfiable', request.method];\n return ['dashboards', request.method, request.args];\n}\n\n/** Whether a query needs the trace or span aggregate gate. */\nexport const aggregateSource = (query: DashboardQuery) =>\n query.source === 'traceAggregate' ? 'trace' : query.source === 'spanAggregate' ? 'span' : undefined;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"requests.es.js","names":[],"sources":["../../../../src/domains/dashboards/lib/requests.ts"],"sourcesContent":["import type { AggregateSpansArgs, AggregateTracesArgs, DashboardQuery, MastraClient } from '@mastra/client-js';\nimport type { MetricsQueryFilters } from '@mastra/react/hooks/metrics';\nimport { bucketPlan } from '../../metrics/lib/metrics-buckets';\nimport { AGGREGATE_PRIORITY } from '../../metrics/lib/request-limiter';\nimport type { AggregatePriority } from '../../metrics/lib/request-limiter';\nimport { previousWindow } from '../../metrics/lib/time-window';\nimport { toTraceAggregateTimeRange } from '../../metrics/lib/trace-aggregate';\nimport { intersectFilters } from './filters';\n\ntype Window = { start: Date; end: Date };\ntype Interval = '1h' | '1d';\ntype Args<M extends keyof MastraClient> = MastraClient[M] extends (args: infer A, ...rest: never[]) => unknown\n ? A\n : never;\n\ntype Call =\n | { method: 'aggregateTraces'; args: AggregateTracesArgs; priority?: AggregatePriority }\n | { method: 'aggregateSpans'; args: AggregateSpansArgs; priority?: AggregatePriority }\n | { method: 'getMetricAggregate'; args: Args<'getMetricAggregate'> }\n | { method: 'getMetricBreakdown'; args: Args<'getMetricBreakdown'> }\n | { method: 'getMetricTimeSeries'; args: Args<'getMetricTimeSeries'> }\n | { method: 'getMetricPercentiles'; args: Args<'getMetricPercentiles'> }\n | { method: 'getScoreAggregate'; args: Args<'getScoreAggregate'> }\n | { method: 'getScoreBreakdown'; args: Args<'getScoreBreakdown'> }\n | { method: 'getScoreTimeSeries'; args: Args<'getScoreTimeSeries'> }\n | { method: 'getScorePercentiles'; args: Args<'getScorePercentiles'> }\n | { method: 'listScores'; args: Args<'listScores'> };\n\n/** One call a dashboard query makes, with the args it sends. */\nexport type DashboardRequest = Call & {\n /** Its filters contradict the page's, so nothing can match: it isn't sent and answers empty. */\n unsatisfiable?: true;\n};\n\nexport type DashboardRequestMethod = DashboardRequest['method'];\n\ntype Answers = { [M in DashboardRequestMethod]: Awaited<ReturnType<MastraClient[M]>> };\n\n/** A request's answer, tagged with the method that produced it so a widget narrows it by `method`. */\nexport type DashboardAnswer = {\n [M in DashboardRequestMethod]: { method: M; data: Answers[M] };\n}[DashboardRequestMethod];\n\n/**\n * Where a request's answer stands, as plain data: what a widget renders from, whoever fetched it.\n * `isLoading` has no answer yet; `isRefetching` has one and is fetching it again.\n */\nexport type DashboardResult = {\n data?: DashboardAnswer;\n isLoading: boolean;\n isRefetching: boolean;\n isError: boolean;\n error?: unknown;\n};\n\ntype TraceWhere = NonNullable<AggregateTracesArgs['where']>;\ntype SpanWhere = NonNullable<AggregateSpansArgs['where']>;\n\n/** What the page adds to every widget's query: its frozen window and its filter bar. */\nexport type DashboardPageContext = {\n window: Window;\n /** The page's metrics and scores filters, `timestamp` included. */\n filters: MetricsQueryFilters['filters'];\n /** The filter bar as trace and span predicates, from the aggregate gates. */\n traceWhere?: TraceWhere;\n spanWhere?: SpanWhere;\n};\n\n/** How the widget kind sends a query. */\nexport type DashboardRequestOptions = {\n /** The bucket size, for a query that doesn't set its own. Unset sends the query as written. */\n interval?: Interval;\n};\n\n/** The widget's predicate and the page's, both required; the widget's comes first. */\nfunction andTrace(widget: TraceWhere | undefined, page: TraceWhere | undefined): TraceWhere | undefined {\n return widget && page ? { op: 'and', args: [widget, page] } : (widget ?? page);\n}\n\nfunction andSpan(widget: SpanWhere | undefined, page: SpanWhere | undefined): SpanWhere | undefined {\n return widget && page ? { op: 'and', args: [widget, page] } : (widget ?? page);\n}\n\ntype ValuesQuery = Extract<DashboardQuery, { source: 'metrics' | 'scores' }>;\n\n/**\n * A metrics or scores query's args, the page's filters intersected with its own, over `window`;\n * `unsatisfiable` when they contradict.\n */\nfunction valuesArgs<Q extends ValuesQuery>(query: Q, page: DashboardPageContext, window: Window) {\n const { source: _source, id: _id, request, compare, filters, ...rest } = query;\n const combined = intersectFilters(page.filters, filters);\n return {\n unsatisfiable: combined === undefined ? (true as const) : undefined,\n args: {\n ...rest,\n filters: { ...(combined ?? page.filters), timestamp: window },\n // An aggregate compares in the same request; anything else sends a second one over `window`.\n comparePeriod: request === 'aggregate' && compare === 'previousWindow' ? ('previous_period' as const) : undefined,\n },\n };\n}\n\n/**\n * The query with the page's filter bar ANDed in, as `buildRequest` applies it, but without the time\n * window: trace and span predicates joined with `and`, metrics and scores filters intersected.\n * `'unsatisfiable'` when the filters contradict, so nothing can match.\n */\nexport function pageQuery(query: DashboardQuery, page: DashboardPageContext): DashboardQuery | 'unsatisfiable' {\n if (query.source === 'traceAggregate') {\n const where = andTrace(query.where, page.traceWhere);\n return where ? { ...query, where } : query;\n }\n if (query.source === 'spanAggregate') {\n const where = andSpan(query.where, page.spanWhere);\n return where ? { ...query, where } : query;\n }\n const combined = intersectFilters(page.filters, query.filters);\n if (combined === undefined) return 'unsatisfiable';\n const { timestamp: _timestamp, ...filters } = combined;\n const { filters: _own, ...rest } = query;\n return Object.keys(filters).length > 0 ? { ...rest, filters } : rest;\n}\n\n/** A bucketed request's interval: its own, else the kind's, else the bar charts' for `window`. */\nfunction bucketOf<I extends string>(own: I | undefined, interval: Interval | undefined, window: Window) {\n return own ?? interval ?? bucketPlan(window.start, window.end).interval;\n}\n\n/**\n * The request a query sends over `window`, the page's filters ANDed with the widget's: trace and span\n * predicates are joined with `and`; metrics and scores filters intersect (`intersectFilters`), and a\n * contradiction marks the request unsatisfiable. A scores query without a scorer sends nothing: the\n * `scores` kind expands it per scorer first.\n */\nexport function buildRequest(\n query: DashboardQuery,\n page: DashboardPageContext,\n { interval }: DashboardRequestOptions,\n window: Window = page.window,\n priority?: AggregatePriority,\n): DashboardRequest | undefined {\n if (query.source === 'traceAggregate') {\n const { source: _source, id: _id, compare: _compare, where, interval: own, ...rest } = query;\n return {\n method: 'aggregateTraces',\n args: {\n timeRange: toTraceAggregateTimeRange(window),\n ...rest,\n interval: own ?? interval,\n where: andTrace(where, page.traceWhere),\n },\n priority,\n };\n }\n if (query.source === 'spanAggregate') {\n const { source: _source, id: _id, compare: _compare, where, interval: own, ...rest } = query;\n return {\n method: 'aggregateSpans',\n args: {\n timeRange: toTraceAggregateTimeRange(window),\n ...rest,\n interval: own ?? interval,\n where: andSpan(where, page.spanWhere),\n },\n priority,\n };\n }\n if (query.source === 'metrics') {\n switch (query.request) {\n case 'aggregate': {\n const { args, unsatisfiable } = valuesArgs(query, page, window);\n return { method: 'getMetricAggregate', args, unsatisfiable };\n }\n case 'breakdown': {\n const { args, unsatisfiable } = valuesArgs(query, page, window);\n return { method: 'getMetricBreakdown', args, unsatisfiable };\n }\n case 'timeSeries': {\n const { args, unsatisfiable } = valuesArgs(query, page, window);\n const bucketed = { ...args, interval: bucketOf(query.interval, interval, window) };\n return { method: 'getMetricTimeSeries', args: bucketed, unsatisfiable };\n }\n case 'percentiles': {\n const { args, unsatisfiable } = valuesArgs(query, page, window);\n const bucketed = { ...args, interval: bucketOf(query.interval, interval, window) };\n return { method: 'getMetricPercentiles', args: bucketed, unsatisfiable };\n }\n }\n }\n const { scorerId } = query;\n if (scorerId === undefined) return undefined;\n switch (query.request) {\n case 'aggregate': {\n const { args, unsatisfiable } = valuesArgs(query, page, window);\n return { method: 'getScoreAggregate', args: { ...args, scorerId }, unsatisfiable };\n }\n case 'breakdown': {\n const { args, unsatisfiable } = valuesArgs(query, page, window);\n return { method: 'getScoreBreakdown', args: { ...args, scorerId }, unsatisfiable };\n }\n case 'timeSeries': {\n const { args, unsatisfiable } = valuesArgs(query, page, window);\n const bucketed = { ...args, scorerId, interval: bucketOf(query.interval, interval, window) };\n return { method: 'getScoreTimeSeries', args: bucketed, unsatisfiable };\n }\n case 'percentiles': {\n const { args, unsatisfiable } = valuesArgs(query, page, window);\n const bucketed = { ...args, scorerId, interval: bucketOf(query.interval, interval, window) };\n return { method: 'getScorePercentiles', args: bucketed, unsatisfiable };\n }\n }\n}\n\n/** Whether a query asks for the previous window as a request of its own. */\nexport function sendsPreviousRequest(query: DashboardQuery) {\n if (query.compare !== 'previousWindow') return false;\n return !((query.source === 'metrics' || query.source === 'scores') && query.request === 'aggregate');\n}\n\n/** The previous window's request, sent last so the widget never waits on it. */\nexport function buildPreviousRequest(\n query: DashboardQuery,\n page: DashboardPageContext,\n options: DashboardRequestOptions,\n): DashboardRequest | undefined {\n if (!sendsPreviousRequest(query)) return undefined;\n return buildRequest(query, page, options, previousWindow(page.window), AGGREGATE_PRIORITY.last);\n}\n\n/** What an unsatisfiable request answers: nothing matched. */\nexport function emptyAnswer(method: DashboardRequestMethod): DashboardAnswer {\n switch (method) {\n case 'aggregateTraces':\n case 'aggregateSpans':\n return { method, data: { rows: [], truncated: false } };\n case 'getMetricAggregate':\n case 'getScoreAggregate':\n return { method, data: { value: null } };\n case 'getMetricBreakdown':\n case 'getScoreBreakdown':\n return { method, data: { groups: [] } };\n case 'getMetricTimeSeries':\n case 'getMetricPercentiles':\n case 'getScoreTimeSeries':\n case 'getScorePercentiles':\n return { method, data: { series: [] } };\n case 'listScores':\n return { method, data: { scores: [], pagination: { total: 0, page: 0, perPage: 0, hasMore: false } } };\n }\n}\n\n/** Runs a request on the client; an unsatisfiable one answers empty without a call. */\nexport async function sendRequest(client: MastraClient, request: DashboardRequest): Promise<DashboardAnswer> {\n if (request.unsatisfiable) return emptyAnswer(request.method);\n switch (request.method) {\n case 'aggregateTraces':\n return { method: request.method, data: await client.aggregateTraces(request.args) };\n case 'aggregateSpans':\n return { method: request.method, data: await client.aggregateSpans(request.args) };\n case 'getMetricAggregate':\n return { method: request.method, data: await client.getMetricAggregate(request.args) };\n case 'getMetricBreakdown':\n return { method: request.method, data: await client.getMetricBreakdown(request.args) };\n case 'getMetricTimeSeries':\n return { method: request.method, data: await client.getMetricTimeSeries(request.args) };\n case 'getMetricPercentiles':\n return { method: request.method, data: await client.getMetricPercentiles(request.args) };\n case 'getScoreAggregate':\n return { method: request.method, data: await client.getScoreAggregate(request.args) };\n case 'getScoreBreakdown':\n return { method: request.method, data: await client.getScoreBreakdown(request.args) };\n case 'getScoreTimeSeries':\n return { method: request.method, data: await client.getScoreTimeSeries(request.args) };\n case 'getScorePercentiles':\n return { method: request.method, data: await client.getScorePercentiles(request.args) };\n case 'listScores':\n return { method: request.method, data: await client.listScores(request.args) };\n }\n}\n\n/**\n * The React Query key. Answers are cached tagged with their method, so they live under the dashboards'\n * own keys rather than `useTraceAggregate`'s, whose entries hold the bare response.\n */\nexport function requestKey(request: DashboardRequest): readonly unknown[] {\n if (request.unsatisfiable) return ['dashboards', 'unsatisfiable', request.method];\n return ['dashboards', request.method, request.args];\n}\n\n/** Whether a query needs the trace or span aggregate gate. */\nexport const aggregateSource = (query: DashboardQuery) =>\n query.source === 'traceAggregate' ? 'trace' : query.source === 'spanAggregate' ? 'span' : undefined;\n"],"mappings":"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"}
|
|
@@ -21,6 +21,36 @@ function discoveredScorers(scores) {
|
|
|
21
21
|
name: names.get(scorerId) ?? scorerId
|
|
22
22
|
}));
|
|
23
23
|
}
|
|
24
|
+
/** How many recent scores to read to find the scorers in the range (the API's page limit). */
|
|
25
|
+
var DISCOVERY_PAGE_SIZE = 100;
|
|
26
|
+
/**
|
|
27
|
+
* The range's most recent scores, read to find the scorers when the queries leave theirs out (the API
|
|
28
|
+
* can't list scorers); `undefined` when they name their own.
|
|
29
|
+
*/
|
|
30
|
+
function scorerDiscoveryRequest(queries, page) {
|
|
31
|
+
if (!queries.some(needsScorer)) return void 0;
|
|
32
|
+
return {
|
|
33
|
+
method: "listScores",
|
|
34
|
+
args: {
|
|
35
|
+
filters: page.filters,
|
|
36
|
+
pagination: {
|
|
37
|
+
page: 0,
|
|
38
|
+
perPage: DISCOVERY_PAGE_SIZE
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* The scorers to chart: the queries' own scorer, or, when they leave it out, every scorer among the
|
|
45
|
+
* discovery request's answer, as the Scores card finds them.
|
|
46
|
+
*/
|
|
47
|
+
function scorersOf(queries, discovery) {
|
|
48
|
+
if (!queries.some(needsScorer)) return ownScorers(queries);
|
|
49
|
+
return discoveredScorers((discovery?.method === "listScores" ? discovery.data.scores : []).map((s) => ({
|
|
50
|
+
scorerId: s.scorerId,
|
|
51
|
+
scorerName: s.scorerName ?? void 0
|
|
52
|
+
})));
|
|
53
|
+
}
|
|
24
54
|
/** The query for one scorer: its own scorer if it names one, else `scorerId`. */
|
|
25
55
|
var withScorer = (query, scorerId) => query?.source === "scores" && query.scorerId === void 0 ? {
|
|
26
56
|
...query,
|
|
@@ -52,6 +82,8 @@ function shapeScores(scorers, means, points, window, stepHours) {
|
|
|
52
82
|
exports.discoveredScorers = discoveredScorers;
|
|
53
83
|
exports.needsScorer = needsScorer;
|
|
54
84
|
exports.ownScorers = ownScorers;
|
|
85
|
+
exports.scorerDiscoveryRequest = scorerDiscoveryRequest;
|
|
86
|
+
exports.scorersOf = scorersOf;
|
|
55
87
|
exports.shapeScores = shapeScores;
|
|
56
88
|
exports.withScorer = withScorer;
|
|
57
89
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scores.cjs.js","names":["bucketGrid","gridIndex","seriesOf","valueOf"],"sources":["../../../../src/domains/dashboards/lib/scores.ts"],"sourcesContent":["import type { DashboardQuery } from '@mastra/client-js';\nimport type { BucketLabels } from '../../metrics/lib/bucket-labels';\nimport { bucketGrid, gridIndex } from '../../metrics/lib/metrics-buckets';\nimport { seriesOf, valueOf } from './answers';\nimport type { DashboardAnswer } from './requests';\n\nexport type Scorer = { scorerId: string; name: string };\n\nexport type ScoresBucket = BucketLabels & Record<string, number | string | undefined>;\n\n/** Whether the query leaves its scorer out, so the widget has to find the scorers itself. */\nexport const needsScorer = (query: DashboardQuery | undefined) =>\n query?.source === 'scores' && query.scorerId === undefined;\n\n/** The scorer the view's queries name themselves, when none of them leaves it out. */\nexport function ownScorers(queries: DashboardQuery[]): Scorer[] {\n const own = queries.find(q => q.source === 'scores' && q.scorerId);\n const scorerId = own?.source === 'scores' ? own.scorerId : undefined;\n return scorerId ? [{ scorerId, name: scorerId }] : [];\n}\n\n/** Every scorer among the recent scores, sorted by id, named as the scores name them. */\nexport function discoveredScorers(scores: { scorerId: string; scorerName?: string }[]): Scorer[] {\n const names = new Map(scores.map(s => [s.scorerId, s.scorerName ?? s.scorerId]));\n return [...names.keys()].toSorted().map(scorerId => ({ scorerId, name: names.get(scorerId) ?? scorerId }));\n}\n\n/** The query for one scorer: its own scorer if it names one, else `scorerId`. */\nexport const withScorer = (query: DashboardQuery | undefined, scorerId: string): DashboardQuery | undefined =>\n query?.source === 'scores' && query.scorerId === undefined ? { ...query, scorerId } : query;\n\n/**\n * Lays each scorer's points on the window's bucket grid, keyed by scorer id, and reads each scorer's\n * mean (0 when the aggregate has no value, as the Scores card shows it). `means` and `points` hold\n * one answer per scorer, in `scorers`' order.\n */\nexport function shapeScores(\n scorers: Scorer[],\n means: (DashboardAnswer | undefined)[],\n points: (DashboardAnswer | undefined)[],\n window: { start: Date; end: Date },\n stepHours: number,\n) {\n const buckets: ScoresBucket[] = bucketGrid(window.start, window.end, stepHours);\n const indexOf = gridIndex(buckets, stepHours);\n scorers.forEach(({ scorerId }, i) => {\n for (const s of seriesOf(points[i]) ?? []) {\n for (const p of s.points) {\n const at = indexOf(p);\n const bucket = at === undefined ? undefined : buckets[at];\n if (bucket) bucket[scorerId] = p.value;\n }\n }\n });\n const lines = scorers.map((scorer, i) => ({ ...scorer, mean: valueOf(means[i])?.value ?? 0 }));\n return { buckets, lines };\n}\n"],"mappings":";;;;;AAWA,IAAa,eAAe,UAC1B,OAAO,WAAW,YAAY,MAAM,aAAa,KAAA;;AAGnD,SAAgB,WAAW,SAAqC;CAC9D,MAAM,MAAM,QAAQ,MAAK,MAAK,EAAE,WAAW,YAAY,EAAE,QAAQ;CACjE,MAAM,WAAW,KAAK,WAAW,WAAW,IAAI,WAAW,KAAA;CAC3D,OAAO,WAAW,CAAC;EAAE;EAAU,MAAM;CAAS,CAAC,IAAI,CAAC;AACtD;;AAGA,SAAgB,kBAAkB,QAA+D;CAC/F,MAAM,QAAQ,IAAI,IAAI,OAAO,KAAI,MAAK,CAAC,EAAE,UAAU,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;CAC/E,OAAO,CAAC,GAAG,MAAM,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,KAAI,cAAa;EAAE;EAAU,MAAM,MAAM,IAAI,QAAQ,KAAK;CAAS,EAAE;AAC3G;;AAGA,IAAa,cAAc,OAAmC,aAC5D,OAAO,WAAW,YAAY,MAAM,aAAa,KAAA,IAAY;CAAE,GAAG;CAAO;AAAS,IAAI;;;;;;AAOxF,SAAgB,YACd,SACA,OACA,QACA,QACA,WACA;CACA,MAAM,UAA0BA,4CAAAA,WAAW,OAAO,OAAO,OAAO,KAAK,SAAS;CAC9E,MAAM,UAAUC,4CAAAA,UAAU,SAAS,SAAS;CAC5C,QAAQ,SAAS,EAAE,YAAY,MAAM;EACnC,KAAK,MAAM,KAAKC,uCAAAA,SAAS,OAAO,EAAE,KAAK,CAAC,GACtC,KAAK,MAAM,KAAK,EAAE,QAAQ;GACxB,MAAM,KAAK,QAAQ,CAAC;GACpB,MAAM,SAAS,OAAO,KAAA,IAAY,KAAA,IAAY,QAAQ;GACtD,IAAI,QAAQ,OAAO,YAAY,EAAE;EACnC;CAEJ,CAAC;CAED,OAAO;EAAE;EAAS,OADJ,QAAQ,KAAK,QAAQ,OAAO;GAAE,GAAG;GAAQ,MAAMC,uCAAAA,QAAQ,MAAM,EAAE,CAAC,EAAE,SAAS;EAAE,EACzE;CAAM;AAC1B"}
|
|
1
|
+
{"version":3,"file":"scores.cjs.js","names":["bucketGrid","gridIndex","seriesOf","valueOf"],"sources":["../../../../src/domains/dashboards/lib/scores.ts"],"sourcesContent":["import type { DashboardQuery } from '@mastra/client-js';\nimport type { BucketLabels } from '../../metrics/lib/bucket-labels';\nimport { bucketGrid, gridIndex } from '../../metrics/lib/metrics-buckets';\nimport { seriesOf, valueOf } from './answers';\nimport type { DashboardAnswer, DashboardPageContext, DashboardRequest } from './requests';\n\nexport type Scorer = { scorerId: string; name: string };\n\nexport type ScoresBucket = BucketLabels & Record<string, number | string | undefined>;\n\n/** Whether the query leaves its scorer out, so the widget has to find the scorers itself. */\nexport const needsScorer = (query: DashboardQuery | undefined) =>\n query?.source === 'scores' && query.scorerId === undefined;\n\n/** The scorer the view's queries name themselves, when none of them leaves it out. */\nexport function ownScorers(queries: DashboardQuery[]): Scorer[] {\n const own = queries.find(q => q.source === 'scores' && q.scorerId);\n const scorerId = own?.source === 'scores' ? own.scorerId : undefined;\n return scorerId ? [{ scorerId, name: scorerId }] : [];\n}\n\n/** Every scorer among the recent scores, sorted by id, named as the scores name them. */\nexport function discoveredScorers(scores: { scorerId: string; scorerName?: string }[]): Scorer[] {\n const names = new Map(scores.map(s => [s.scorerId, s.scorerName ?? s.scorerId]));\n return [...names.keys()].toSorted().map(scorerId => ({ scorerId, name: names.get(scorerId) ?? scorerId }));\n}\n\n/** How many recent scores to read to find the scorers in the range (the API's page limit). */\nconst DISCOVERY_PAGE_SIZE = 100;\n\n/**\n * The range's most recent scores, read to find the scorers when the queries leave theirs out (the API\n * can't list scorers); `undefined` when they name their own.\n */\nexport function scorerDiscoveryRequest(\n queries: DashboardQuery[],\n page: DashboardPageContext,\n): DashboardRequest | undefined {\n if (!queries.some(needsScorer)) return undefined;\n return {\n method: 'listScores',\n args: { filters: page.filters, pagination: { page: 0, perPage: DISCOVERY_PAGE_SIZE } },\n };\n}\n\n/**\n * The scorers to chart: the queries' own scorer, or, when they leave it out, every scorer among the\n * discovery request's answer, as the Scores card finds them.\n */\nexport function scorersOf(queries: DashboardQuery[], discovery: DashboardAnswer | undefined): Scorer[] {\n if (!queries.some(needsScorer)) return ownScorers(queries);\n const scores = discovery?.method === 'listScores' ? discovery.data.scores : [];\n return discoveredScorers(scores.map(s => ({ scorerId: s.scorerId, scorerName: s.scorerName ?? undefined })));\n}\n\n/** The query for one scorer: its own scorer if it names one, else `scorerId`. */\nexport const withScorer = (query: DashboardQuery | undefined, scorerId: string): DashboardQuery | undefined =>\n query?.source === 'scores' && query.scorerId === undefined ? { ...query, scorerId } : query;\n\n/**\n * Lays each scorer's points on the window's bucket grid, keyed by scorer id, and reads each scorer's\n * mean (0 when the aggregate has no value, as the Scores card shows it). `means` and `points` hold\n * one answer per scorer, in `scorers`' order.\n */\nexport function shapeScores(\n scorers: Scorer[],\n means: (DashboardAnswer | undefined)[],\n points: (DashboardAnswer | undefined)[],\n window: { start: Date; end: Date },\n stepHours: number,\n) {\n const buckets: ScoresBucket[] = bucketGrid(window.start, window.end, stepHours);\n const indexOf = gridIndex(buckets, stepHours);\n scorers.forEach(({ scorerId }, i) => {\n for (const s of seriesOf(points[i]) ?? []) {\n for (const p of s.points) {\n const at = indexOf(p);\n const bucket = at === undefined ? undefined : buckets[at];\n if (bucket) bucket[scorerId] = p.value;\n }\n }\n });\n const lines = scorers.map((scorer, i) => ({ ...scorer, mean: valueOf(means[i])?.value ?? 0 }));\n return { buckets, lines };\n}\n"],"mappings":";;;;;AAWA,IAAa,eAAe,UAC1B,OAAO,WAAW,YAAY,MAAM,aAAa,KAAA;;AAGnD,SAAgB,WAAW,SAAqC;CAC9D,MAAM,MAAM,QAAQ,MAAK,MAAK,EAAE,WAAW,YAAY,EAAE,QAAQ;CACjE,MAAM,WAAW,KAAK,WAAW,WAAW,IAAI,WAAW,KAAA;CAC3D,OAAO,WAAW,CAAC;EAAE;EAAU,MAAM;CAAS,CAAC,IAAI,CAAC;AACtD;;AAGA,SAAgB,kBAAkB,QAA+D;CAC/F,MAAM,QAAQ,IAAI,IAAI,OAAO,KAAI,MAAK,CAAC,EAAE,UAAU,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;CAC/E,OAAO,CAAC,GAAG,MAAM,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,KAAI,cAAa;EAAE;EAAU,MAAM,MAAM,IAAI,QAAQ,KAAK;CAAS,EAAE;AAC3G;;AAGA,IAAM,sBAAsB;;;;;AAM5B,SAAgB,uBACd,SACA,MAC8B;CAC9B,IAAI,CAAC,QAAQ,KAAK,WAAW,GAAG,OAAO,KAAA;CACvC,OAAO;EACL,QAAQ;EACR,MAAM;GAAE,SAAS,KAAK;GAAS,YAAY;IAAE,MAAM;IAAG,SAAS;GAAoB;EAAE;CACvF;AACF;;;;;AAMA,SAAgB,UAAU,SAA2B,WAAkD;CACrG,IAAI,CAAC,QAAQ,KAAK,WAAW,GAAG,OAAO,WAAW,OAAO;CAEzD,OAAO,mBADQ,WAAW,WAAW,eAAe,UAAU,KAAK,SAAS,CAAC,EAAA,CAC7C,KAAI,OAAM;EAAE,UAAU,EAAE;EAAU,YAAY,EAAE,cAAc,KAAA;CAAU,EAAE,CAAC;AAC7G;;AAGA,IAAa,cAAc,OAAmC,aAC5D,OAAO,WAAW,YAAY,MAAM,aAAa,KAAA,IAAY;CAAE,GAAG;CAAO;AAAS,IAAI;;;;;;AAOxF,SAAgB,YACd,SACA,OACA,QACA,QACA,WACA;CACA,MAAM,UAA0BA,4CAAAA,WAAW,OAAO,OAAO,OAAO,KAAK,SAAS;CAC9E,MAAM,UAAUC,4CAAAA,UAAU,SAAS,SAAS;CAC5C,QAAQ,SAAS,EAAE,YAAY,MAAM;EACnC,KAAK,MAAM,KAAKC,uCAAAA,SAAS,OAAO,EAAE,KAAK,CAAC,GACtC,KAAK,MAAM,KAAK,EAAE,QAAQ;GACxB,MAAM,KAAK,QAAQ,CAAC;GACpB,MAAM,SAAS,OAAO,KAAA,IAAY,KAAA,IAAY,QAAQ;GACtD,IAAI,QAAQ,OAAO,YAAY,EAAE;EACnC;CAEJ,CAAC;CAED,OAAO;EAAE;EAAS,OADJ,QAAQ,KAAK,QAAQ,OAAO;GAAE,GAAG;GAAQ,MAAMC,uCAAAA,QAAQ,MAAM,EAAE,CAAC,EAAE,SAAS;EAAE,EACzE;CAAM;AAC1B"}
|
|
@@ -20,6 +20,36 @@ function discoveredScorers(scores) {
|
|
|
20
20
|
name: names.get(scorerId) ?? scorerId
|
|
21
21
|
}));
|
|
22
22
|
}
|
|
23
|
+
/** How many recent scores to read to find the scorers in the range (the API's page limit). */
|
|
24
|
+
var DISCOVERY_PAGE_SIZE = 100;
|
|
25
|
+
/**
|
|
26
|
+
* The range's most recent scores, read to find the scorers when the queries leave theirs out (the API
|
|
27
|
+
* can't list scorers); `undefined` when they name their own.
|
|
28
|
+
*/
|
|
29
|
+
function scorerDiscoveryRequest(queries, page) {
|
|
30
|
+
if (!queries.some(needsScorer)) return void 0;
|
|
31
|
+
return {
|
|
32
|
+
method: "listScores",
|
|
33
|
+
args: {
|
|
34
|
+
filters: page.filters,
|
|
35
|
+
pagination: {
|
|
36
|
+
page: 0,
|
|
37
|
+
perPage: DISCOVERY_PAGE_SIZE
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* The scorers to chart: the queries' own scorer, or, when they leave it out, every scorer among the
|
|
44
|
+
* discovery request's answer, as the Scores card finds them.
|
|
45
|
+
*/
|
|
46
|
+
function scorersOf(queries, discovery) {
|
|
47
|
+
if (!queries.some(needsScorer)) return ownScorers(queries);
|
|
48
|
+
return discoveredScorers((discovery?.method === "listScores" ? discovery.data.scores : []).map((s) => ({
|
|
49
|
+
scorerId: s.scorerId,
|
|
50
|
+
scorerName: s.scorerName ?? void 0
|
|
51
|
+
})));
|
|
52
|
+
}
|
|
23
53
|
/** The query for one scorer: its own scorer if it names one, else `scorerId`. */
|
|
24
54
|
var withScorer = (query, scorerId) => query?.source === "scores" && query.scorerId === void 0 ? {
|
|
25
55
|
...query,
|
|
@@ -48,6 +78,6 @@ function shapeScores(scorers, means, points, window, stepHours) {
|
|
|
48
78
|
}))
|
|
49
79
|
};
|
|
50
80
|
}
|
|
51
|
-
export { discoveredScorers, needsScorer, ownScorers, shapeScores, withScorer };
|
|
81
|
+
export { discoveredScorers, needsScorer, ownScorers, scorerDiscoveryRequest, scorersOf, shapeScores, withScorer };
|
|
52
82
|
|
|
53
83
|
//# sourceMappingURL=scores.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scores.es.js","names":[],"sources":["../../../../src/domains/dashboards/lib/scores.ts"],"sourcesContent":["import type { DashboardQuery } from '@mastra/client-js';\nimport type { BucketLabels } from '../../metrics/lib/bucket-labels';\nimport { bucketGrid, gridIndex } from '../../metrics/lib/metrics-buckets';\nimport { seriesOf, valueOf } from './answers';\nimport type { DashboardAnswer } from './requests';\n\nexport type Scorer = { scorerId: string; name: string };\n\nexport type ScoresBucket = BucketLabels & Record<string, number | string | undefined>;\n\n/** Whether the query leaves its scorer out, so the widget has to find the scorers itself. */\nexport const needsScorer = (query: DashboardQuery | undefined) =>\n query?.source === 'scores' && query.scorerId === undefined;\n\n/** The scorer the view's queries name themselves, when none of them leaves it out. */\nexport function ownScorers(queries: DashboardQuery[]): Scorer[] {\n const own = queries.find(q => q.source === 'scores' && q.scorerId);\n const scorerId = own?.source === 'scores' ? own.scorerId : undefined;\n return scorerId ? [{ scorerId, name: scorerId }] : [];\n}\n\n/** Every scorer among the recent scores, sorted by id, named as the scores name them. */\nexport function discoveredScorers(scores: { scorerId: string; scorerName?: string }[]): Scorer[] {\n const names = new Map(scores.map(s => [s.scorerId, s.scorerName ?? s.scorerId]));\n return [...names.keys()].toSorted().map(scorerId => ({ scorerId, name: names.get(scorerId) ?? scorerId }));\n}\n\n/** The query for one scorer: its own scorer if it names one, else `scorerId`. */\nexport const withScorer = (query: DashboardQuery | undefined, scorerId: string): DashboardQuery | undefined =>\n query?.source === 'scores' && query.scorerId === undefined ? { ...query, scorerId } : query;\n\n/**\n * Lays each scorer's points on the window's bucket grid, keyed by scorer id, and reads each scorer's\n * mean (0 when the aggregate has no value, as the Scores card shows it). `means` and `points` hold\n * one answer per scorer, in `scorers`' order.\n */\nexport function shapeScores(\n scorers: Scorer[],\n means: (DashboardAnswer | undefined)[],\n points: (DashboardAnswer | undefined)[],\n window: { start: Date; end: Date },\n stepHours: number,\n) {\n const buckets: ScoresBucket[] = bucketGrid(window.start, window.end, stepHours);\n const indexOf = gridIndex(buckets, stepHours);\n scorers.forEach(({ scorerId }, i) => {\n for (const s of seriesOf(points[i]) ?? []) {\n for (const p of s.points) {\n const at = indexOf(p);\n const bucket = at === undefined ? undefined : buckets[at];\n if (bucket) bucket[scorerId] = p.value;\n }\n }\n });\n const lines = scorers.map((scorer, i) => ({ ...scorer, mean: valueOf(means[i])?.value ?? 0 }));\n return { buckets, lines };\n}\n"],"mappings":";;;;AAWA,IAAa,eAAe,UAC1B,OAAO,WAAW,YAAY,MAAM,aAAa,KAAA;;AAGnD,SAAgB,WAAW,SAAqC;CAC9D,MAAM,MAAM,QAAQ,MAAK,MAAK,EAAE,WAAW,YAAY,EAAE,QAAQ;CACjE,MAAM,WAAW,KAAK,WAAW,WAAW,IAAI,WAAW,KAAA;CAC3D,OAAO,WAAW,CAAC;EAAE;EAAU,MAAM;CAAS,CAAC,IAAI,CAAC;AACtD;;AAGA,SAAgB,kBAAkB,QAA+D;CAC/F,MAAM,QAAQ,IAAI,IAAI,OAAO,KAAI,MAAK,CAAC,EAAE,UAAU,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;CAC/E,OAAO,CAAC,GAAG,MAAM,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,KAAI,cAAa;EAAE;EAAU,MAAM,MAAM,IAAI,QAAQ,KAAK;CAAS,EAAE;AAC3G;;AAGA,IAAa,cAAc,OAAmC,aAC5D,OAAO,WAAW,YAAY,MAAM,aAAa,KAAA,IAAY;CAAE,GAAG;CAAO;AAAS,IAAI;;;;;;AAOxF,SAAgB,YACd,SACA,OACA,QACA,QACA,WACA;CACA,MAAM,UAA0B,WAAW,OAAO,OAAO,OAAO,KAAK,SAAS;CAC9E,MAAM,UAAU,UAAU,SAAS,SAAS;CAC5C,QAAQ,SAAS,EAAE,YAAY,MAAM;EACnC,KAAK,MAAM,KAAK,SAAS,OAAO,EAAE,KAAK,CAAC,GACtC,KAAK,MAAM,KAAK,EAAE,QAAQ;GACxB,MAAM,KAAK,QAAQ,CAAC;GACpB,MAAM,SAAS,OAAO,KAAA,IAAY,KAAA,IAAY,QAAQ;GACtD,IAAI,QAAQ,OAAO,YAAY,EAAE;EACnC;CAEJ,CAAC;CAED,OAAO;EAAE;EAAS,OADJ,QAAQ,KAAK,QAAQ,OAAO;GAAE,GAAG;GAAQ,MAAM,QAAQ,MAAM,EAAE,CAAC,EAAE,SAAS;EAAE,EACzE;CAAM;AAC1B"}
|
|
1
|
+
{"version":3,"file":"scores.es.js","names":[],"sources":["../../../../src/domains/dashboards/lib/scores.ts"],"sourcesContent":["import type { DashboardQuery } from '@mastra/client-js';\nimport type { BucketLabels } from '../../metrics/lib/bucket-labels';\nimport { bucketGrid, gridIndex } from '../../metrics/lib/metrics-buckets';\nimport { seriesOf, valueOf } from './answers';\nimport type { DashboardAnswer, DashboardPageContext, DashboardRequest } from './requests';\n\nexport type Scorer = { scorerId: string; name: string };\n\nexport type ScoresBucket = BucketLabels & Record<string, number | string | undefined>;\n\n/** Whether the query leaves its scorer out, so the widget has to find the scorers itself. */\nexport const needsScorer = (query: DashboardQuery | undefined) =>\n query?.source === 'scores' && query.scorerId === undefined;\n\n/** The scorer the view's queries name themselves, when none of them leaves it out. */\nexport function ownScorers(queries: DashboardQuery[]): Scorer[] {\n const own = queries.find(q => q.source === 'scores' && q.scorerId);\n const scorerId = own?.source === 'scores' ? own.scorerId : undefined;\n return scorerId ? [{ scorerId, name: scorerId }] : [];\n}\n\n/** Every scorer among the recent scores, sorted by id, named as the scores name them. */\nexport function discoveredScorers(scores: { scorerId: string; scorerName?: string }[]): Scorer[] {\n const names = new Map(scores.map(s => [s.scorerId, s.scorerName ?? s.scorerId]));\n return [...names.keys()].toSorted().map(scorerId => ({ scorerId, name: names.get(scorerId) ?? scorerId }));\n}\n\n/** How many recent scores to read to find the scorers in the range (the API's page limit). */\nconst DISCOVERY_PAGE_SIZE = 100;\n\n/**\n * The range's most recent scores, read to find the scorers when the queries leave theirs out (the API\n * can't list scorers); `undefined` when they name their own.\n */\nexport function scorerDiscoveryRequest(\n queries: DashboardQuery[],\n page: DashboardPageContext,\n): DashboardRequest | undefined {\n if (!queries.some(needsScorer)) return undefined;\n return {\n method: 'listScores',\n args: { filters: page.filters, pagination: { page: 0, perPage: DISCOVERY_PAGE_SIZE } },\n };\n}\n\n/**\n * The scorers to chart: the queries' own scorer, or, when they leave it out, every scorer among the\n * discovery request's answer, as the Scores card finds them.\n */\nexport function scorersOf(queries: DashboardQuery[], discovery: DashboardAnswer | undefined): Scorer[] {\n if (!queries.some(needsScorer)) return ownScorers(queries);\n const scores = discovery?.method === 'listScores' ? discovery.data.scores : [];\n return discoveredScorers(scores.map(s => ({ scorerId: s.scorerId, scorerName: s.scorerName ?? undefined })));\n}\n\n/** The query for one scorer: its own scorer if it names one, else `scorerId`. */\nexport const withScorer = (query: DashboardQuery | undefined, scorerId: string): DashboardQuery | undefined =>\n query?.source === 'scores' && query.scorerId === undefined ? { ...query, scorerId } : query;\n\n/**\n * Lays each scorer's points on the window's bucket grid, keyed by scorer id, and reads each scorer's\n * mean (0 when the aggregate has no value, as the Scores card shows it). `means` and `points` hold\n * one answer per scorer, in `scorers`' order.\n */\nexport function shapeScores(\n scorers: Scorer[],\n means: (DashboardAnswer | undefined)[],\n points: (DashboardAnswer | undefined)[],\n window: { start: Date; end: Date },\n stepHours: number,\n) {\n const buckets: ScoresBucket[] = bucketGrid(window.start, window.end, stepHours);\n const indexOf = gridIndex(buckets, stepHours);\n scorers.forEach(({ scorerId }, i) => {\n for (const s of seriesOf(points[i]) ?? []) {\n for (const p of s.points) {\n const at = indexOf(p);\n const bucket = at === undefined ? undefined : buckets[at];\n if (bucket) bucket[scorerId] = p.value;\n }\n }\n });\n const lines = scorers.map((scorer, i) => ({ ...scorer, mean: valueOf(means[i])?.value ?? 0 }));\n return { buckets, lines };\n}\n"],"mappings":";;;;AAWA,IAAa,eAAe,UAC1B,OAAO,WAAW,YAAY,MAAM,aAAa,KAAA;;AAGnD,SAAgB,WAAW,SAAqC;CAC9D,MAAM,MAAM,QAAQ,MAAK,MAAK,EAAE,WAAW,YAAY,EAAE,QAAQ;CACjE,MAAM,WAAW,KAAK,WAAW,WAAW,IAAI,WAAW,KAAA;CAC3D,OAAO,WAAW,CAAC;EAAE;EAAU,MAAM;CAAS,CAAC,IAAI,CAAC;AACtD;;AAGA,SAAgB,kBAAkB,QAA+D;CAC/F,MAAM,QAAQ,IAAI,IAAI,OAAO,KAAI,MAAK,CAAC,EAAE,UAAU,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;CAC/E,OAAO,CAAC,GAAG,MAAM,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,KAAI,cAAa;EAAE;EAAU,MAAM,MAAM,IAAI,QAAQ,KAAK;CAAS,EAAE;AAC3G;;AAGA,IAAM,sBAAsB;;;;;AAM5B,SAAgB,uBACd,SACA,MAC8B;CAC9B,IAAI,CAAC,QAAQ,KAAK,WAAW,GAAG,OAAO,KAAA;CACvC,OAAO;EACL,QAAQ;EACR,MAAM;GAAE,SAAS,KAAK;GAAS,YAAY;IAAE,MAAM;IAAG,SAAS;GAAoB;EAAE;CACvF;AACF;;;;;AAMA,SAAgB,UAAU,SAA2B,WAAkD;CACrG,IAAI,CAAC,QAAQ,KAAK,WAAW,GAAG,OAAO,WAAW,OAAO;CAEzD,OAAO,mBADQ,WAAW,WAAW,eAAe,UAAU,KAAK,SAAS,CAAC,EAAA,CAC7C,KAAI,OAAM;EAAE,UAAU,EAAE;EAAU,YAAY,EAAE,cAAc,KAAA;CAAU,EAAE,CAAC;AAC7G;;AAGA,IAAa,cAAc,OAAmC,aAC5D,OAAO,WAAW,YAAY,MAAM,aAAa,KAAA,IAAY;CAAE,GAAG;CAAO;AAAS,IAAI;;;;;;AAOxF,SAAgB,YACd,SACA,OACA,QACA,QACA,WACA;CACA,MAAM,UAA0B,WAAW,OAAO,OAAO,OAAO,KAAK,SAAS;CAC9E,MAAM,UAAU,UAAU,SAAS,SAAS;CAC5C,QAAQ,SAAS,EAAE,YAAY,MAAM;EACnC,KAAK,MAAM,KAAK,SAAS,OAAO,EAAE,KAAK,CAAC,GACtC,KAAK,MAAM,KAAK,EAAE,QAAQ;GACxB,MAAM,KAAK,QAAQ,CAAC;GACpB,MAAM,SAAS,OAAO,KAAA,IAAY,KAAA,IAAY,QAAQ;GACtD,IAAI,QAAQ,OAAO,YAAY,EAAE;EACnC;CAEJ,CAAC;CAED,OAAO;EAAE;EAAS,OADJ,QAAQ,KAAK,QAAQ,OAAO;GAAE,GAAG;GAAQ,MAAM,QAAQ,MAAM,EAAE,CAAC,EAAE,SAAS;EAAE,EACzE;CAAM;AAC1B"}
|
|
@@ -150,6 +150,22 @@ function shapeTimeseries({ options, responses, window, hasTraceQueries }) {
|
|
|
150
150
|
/** Aggregations whose values for several groups add up to the value for all of them. */
|
|
151
151
|
var ADDITIVE = /* @__PURE__ */ new Set(["sum", "count"]);
|
|
152
152
|
/**
|
|
153
|
+
* The numbers an alert could watch: each series over the range (its `rangeTotal`, else its value),
|
|
154
|
+
* then the card's total when it is an expression.
|
|
155
|
+
*/
|
|
156
|
+
function timeseriesAlertValues(options) {
|
|
157
|
+
const values = options.series.map((s) => ({
|
|
158
|
+
label: s.label,
|
|
159
|
+
value: s.rangeTotal ?? s.value
|
|
160
|
+
}));
|
|
161
|
+
const total = options.total?.value;
|
|
162
|
+
if (total && total !== "total" && !("peak" in total)) values.push({
|
|
163
|
+
label: "Total",
|
|
164
|
+
value: total
|
|
165
|
+
});
|
|
166
|
+
return values;
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
153
169
|
* What the schema can't say: query ids the view has, bucketed queries that leave their interval to the
|
|
154
170
|
* chart's grid, refs that pick one of the percentiles their query asks for, and refs that pick one group
|
|
155
171
|
* of a grouped aggregation that can't be added up.
|
|
@@ -185,6 +201,7 @@ function timeseriesIssues(options, queries) {
|
|
|
185
201
|
];
|
|
186
202
|
}
|
|
187
203
|
exports.shapeTimeseries = shapeTimeseries;
|
|
204
|
+
exports.timeseriesAlertValues = timeseriesAlertValues;
|
|
188
205
|
exports.timeseriesIssues = timeseriesIssues;
|
|
189
206
|
exports.timeseriesOptionsSchema = timeseriesOptionsSchema;
|
|
190
207
|
exports.timeseriesSeriesSchema = timeseriesSeriesSchema;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timeseries.cjs.js","names":["z","colorSchema","valueExprSchema","formatSchema","queryRefSchema","measureOf","rowsOf","valueOf","bucketPlan","intervalHours","bucketGrid","gridIndex","seriesOf","matchesGroups","evaluate","exprRefs","unknownQueryIssues"],"sources":["../../../../src/domains/dashboards/lib/timeseries.ts"],"sourcesContent":["import type { DashboardQuery } from '@mastra/client-js';\nimport { z } from 'zod/v4';\nimport type { BucketLabels } from '../../metrics/lib/bucket-labels';\nimport { bucketGrid, bucketPlan, gridIndex, intervalHours } from '../../metrics/lib/metrics-buckets';\nimport type { ApiInterval } from '../../metrics/lib/metrics-buckets';\nimport { bucketTraceAggregateRows } from '../../metrics/lib/trace-aggregate';\nimport type { TraceAggregateRow } from '../../metrics/lib/trace-aggregate';\nimport { measureOf, rowsOf, seriesOf, valueOf } from './answers';\nimport type { DashboardAnswer } from './requests';\nimport {\n colorSchema,\n evaluate,\n exprRefs,\n formatSchema,\n matchesGroups,\n queryRefSchema,\n unknownQueryIssues,\n valueExprSchema,\n} from './values';\nimport type { ValueExpr, ValueRef } from './values';\n\nexport const timeseriesSeriesSchema = z\n .object({\n dataKey: z.string().min(1),\n label: z.string().min(1),\n color: colorSchema,\n emphasis: z.boolean().optional(),\n /** The series' value per bucket. */\n value: valueExprSchema,\n /** The series' value over the whole range, shown beside the card's title marked with the series' color. */\n rangeTotal: valueExprSchema.optional(),\n /** Rounds each bucket's value to a whole number. */\n round: z.boolean().optional(),\n })\n .strict();\n\nexport const timeseriesOptionsSchema = z\n .object({\n chart: z.enum(['stackedBar', 'line']),\n format: formatSchema,\n /** `false` leaves the y-axis to the chart's default labels. */\n axis: z.boolean().optional(),\n series: z.array(timeseriesSeriesSchema).min(1),\n /**\n * `chart` re-buckets metrics onto the bar charts' grid (sums merge); `api` keeps the API's 1h or 1d\n * buckets (percentiles and averages can't merge). Trace and span aggregates always keep the API's.\n */\n buckets: z.enum(['chart', 'api']).optional(),\n /** Ids of queries sent over the whole range, without an interval (e.g. distinct counts, which can't be summed). */\n totals: z.array(queryRefSchema).optional(),\n /** Hides a series whose range total (or, without one, sum of buckets) is zero. */\n hideEmpty: z.boolean().optional(),\n /** Emphasizes the first series shown. */\n emphasizeFirst: z.boolean().optional(),\n xLabels: z.literal('edges').optional(),\n /** The y-axis range when every plotted value is zero. */\n flatYDomain: z.tuple([z.number(), z.number()]).optional(),\n yDomain: z.tuple([z.number(), z.number()]).optional(),\n /** The card's total, beside its title. Ignored when a series has a `rangeTotal`. */\n total: z\n .object({\n /** `total`: every series summed over the range; `peak`: one series' highest bucket; or an expression over range totals. */\n value: z.union([z.literal('total'), z.object({ peak: z.string().min(1) }).strict(), valueExprSchema]),\n format: formatSchema.optional(),\n })\n .strict()\n .optional(),\n emptyMessage: z.string().optional(),\n /** Empty when this is zero over the range; by default, when every plotted value is zero. */\n emptyWhenZero: valueExprSchema.optional(),\n })\n .strict();\n\nexport type TimeseriesOptions = z.infer<typeof timeseriesOptionsSchema>;\nexport type TimeseriesSeries = z.infer<typeof timeseriesSeriesSchema>;\n\ntype Window = { start: Date; end: Date };\n\nexport type ChartBucket = BucketLabels & Record<string, number | string | undefined>;\n\nexport type ShapedTimeseries = {\n data: ChartBucket[];\n /** The series shown, each with its range total when it has one. */\n series: (Omit<TimeseriesSeries, 'rangeTotal'> & { rangeTotal?: number })[];\n /** Hours per bucket, for a clicked bucket's window. */\n stepHours: number;\n /** The card's total, from `options.total`. */\n total?: number;\n /** Every plotted value is zero (or missing). */\n flat: boolean;\n /** Nothing to show in the range. */\n empty: boolean;\n};\n\n/** A ref's value in one trace aggregate row set (ungrouped: one row). */\nfunction fromRows(rows: TraceAggregateRow[], ref: ValueRef) {\n const { measure } = ref;\n if (!measure) return undefined;\n const values = rows.flatMap(r => measureOf(r.measures, measure) ?? []);\n return values.length ? values.reduce((a, b) => a + b, 0) : undefined;\n}\n\n/** A ref's value over the whole range, from a totals query or the sum of its buckets. */\nfunction rangeValue(answer: DashboardAnswer | undefined, ref: ValueRef, perBucket: (number | undefined)[] | undefined) {\n const aggregate = rowsOf(answer);\n if (aggregate && !aggregate.rows.some(r => r.bucket)) return fromRows(aggregate.rows, ref) ?? 0;\n const value = valueOf(answer);\n if (value) return (ref.field === 'estimatedCost' ? value.estimatedCost : value.value) ?? undefined;\n return perBucket?.reduce<number>((sum, v) => sum + (v ?? 0), 0);\n}\n\n/**\n * Lays a timeseries view's answers on the chart's bucket grid. `chart` buckets add every point that\n * falls in a bucket (missing is 0); `api` buckets take the API's point (missing stays unset).\n */\nexport function shapeTimeseries({\n options,\n responses,\n window,\n hasTraceQueries,\n}: {\n options: TimeseriesOptions;\n /** Each query's answer, by query id. */\n responses: ReadonlyMap<string, DashboardAnswer | undefined>;\n window: Window;\n hasTraceQueries: boolean;\n}): ShapedTimeseries {\n const plan = bucketPlan(window.start, window.end);\n const merged = !hasTraceQueries && (options.buckets ?? 'chart') === 'chart';\n const stepHours = merged ? plan.stepHours : intervalHours(plan.interval);\n const grid: BucketLabels[] = bucketGrid(window.start, window.end, stepHours);\n const indexOf = gridIndex(grid, stepHours);\n const totals = new Set(options.totals ?? []);\n\n const cache = new Map<string, (number | undefined)[]>();\n const bucketed = (ref: ValueRef): (number | undefined)[] => {\n const key = JSON.stringify(ref);\n const hit = cache.get(key);\n if (hit) return hit;\n const values: (number | undefined)[] = grid.map(() => (merged ? 0 : undefined));\n const answer = responses.get(ref.query);\n const aggregate = rowsOf(answer);\n if (aggregate) {\n bucketTraceAggregateRows(aggregate.rows, window).forEach((b, i) => {\n values[i] = fromRows(b.rows, ref) ?? 0;\n });\n }\n for (const s of seriesOf(answer) ?? []) {\n if (ref.percentile !== undefined && s.percentile !== ref.percentile) continue;\n if (!matchesGroups(ref, s.name ?? '')) continue;\n for (const p of s.points) {\n const i = indexOf(p);\n if (i === undefined) continue;\n const v = ref.field === 'estimatedCost' ? (p.estimatedCost ?? 0) : p.value;\n // Every series the ref matches adds up (e.g. a grouped count); `api` buckets stay unset until one answers.\n values[i] = (values[i] ?? 0) + v;\n }\n }\n cache.set(key, values);\n return values;\n };\n const rangeOf = (ref: ValueRef) =>\n rangeValue(responses.get(ref.query), ref, totals.has(ref.query) ? undefined : bucketed(ref)) ?? 0;\n const overRange = (expr: ValueExpr) => evaluate(expr, rangeOf) ?? 0;\n\n const perSeries = options.series.map(s => {\n const values = grid.map((_, i) => {\n const v = evaluate(s.value, ref => bucketed(ref)[i]);\n return v === undefined ? undefined : s.round ? Math.round(v) : v;\n });\n const sum = values.reduce<number>((a, v) => a + (v ?? 0), 0);\n return { s, values, rangeTotal: s.rangeTotal ? overRange(s.rangeTotal) : undefined, sum };\n });\n\n const shown = perSeries.filter(p => !options.hideEmpty || (p.rangeTotal ?? p.sum) > 0);\n const data: ChartBucket[] = grid.map((labels, i) => {\n const bucket: ChartBucket = { ...labels };\n for (const p of shown) {\n const v = p.values[i];\n if (v !== undefined) bucket[p.s.dataKey] = v;\n }\n return bucket;\n });\n\n let total: number | undefined;\n const spec = options.total?.value;\n if (spec === 'total') total = shown.reduce((a, p) => a + p.sum, 0);\n else if (spec && 'peak' in spec) {\n const peak = perSeries.find(p => p.s.dataKey === spec.peak);\n total = Math.max(0, ...(peak?.values ?? []).map(v => v ?? 0));\n } else if (spec) total = overRange(spec);\n\n const flat = shown.every(p => p.values.every(v => !v));\n return {\n data,\n series: shown.map((p, i) => ({\n ...p.s,\n emphasis: options.emphasizeFirst ? i === 0 : p.s.emphasis,\n rangeTotal: p.rangeTotal,\n })),\n stepHours,\n total,\n flat,\n empty: options.emptyWhenZero ? overRange(options.emptyWhenZero) === 0 : flat,\n };\n}\n\n/** Aggregations whose values for several groups add up to the value for all of them. */\nconst ADDITIVE = new Set<string>(['sum', 'count']);\n\n/**\n * What the schema can't say: query ids the view has, bucketed queries that leave their interval to the\n * chart's grid, refs that pick one of the percentiles their query asks for, and refs that pick one group\n * of a grouped aggregation that can't be added up.\n */\nexport function timeseriesIssues(options: TimeseriesOptions, queries: readonly DashboardQuery[]): string[] {\n const exprs = options.series.flatMap(s => (s.rangeTotal ? [s.value, s.rangeTotal] : [s.value]));\n const total = options.total?.value;\n if (total && total !== 'total' && !('peak' in total)) exprs.push(total);\n if (options.emptyWhenZero) exprs.push(options.emptyWhenZero);\n const refs = exprs.flatMap(exprRefs);\n const totals = new Set(options.totals ?? []);\n const byId = new Map(queries.map(q => [q.id, q]));\n\n // The chart lays every query on one grid built from the page's range; a query's own interval would\n // land its points in the wrong buckets.\n const ownIntervals = queries\n .filter(q => q.id !== undefined && !totals.has(q.id) && 'interval' in q && q.interval !== undefined)\n .map(q => `query '${q.id}' sets its own interval; the chart's buckets follow the page's range`);\n // Percentiles of one metric can't be added up, so a ref must pick one when its query asks for several.\n const ambiguousPercentiles = refs\n .filter(r => {\n const query = byId.get(r.query);\n return (\n r.percentile === undefined &&\n query !== undefined &&\n 'request' in query &&\n query.request === 'percentiles' &&\n query.percentiles.length > 1\n );\n })\n .map(r => `a value reading query '${r.query}' must pick one of its percentiles`);\n const missingPercentiles = refs\n .filter(r => {\n const query = byId.get(r.query);\n return (\n r.percentile !== undefined &&\n query !== undefined &&\n 'request' in query &&\n query.request === 'percentiles' &&\n !query.percentiles.includes(r.percentile)\n );\n })\n .map(r => `a value reading query '${r.query}' picks percentile ${r.percentile}, which the query doesn't ask for`);\n // Every series a ref matches adds up, which is only right for counts and sums.\n const mixedGroups = refs\n .filter(r => {\n const query = byId.get(r.query);\n return (\n r.groups?.length !== 1 &&\n query !== undefined &&\n 'request' in query &&\n query.request === 'timeSeries' &&\n (query.groupBy?.length ?? 0) > 0 &&\n !ADDITIVE.has(query.aggregation)\n );\n })\n .map(r => `a value reading query '${r.query}' must pick one group, since its groups' values can't be added up`);\n\n return [\n ...unknownQueryIssues(\n refs.map(r => r.query),\n queries,\n ),\n ...unknownQueryIssues(options.totals ?? [], queries, 'options.totals'),\n ...ownIntervals,\n ...new Set(ambiguousPercentiles),\n ...new Set(missingPercentiles),\n ...new Set(mixedGroups),\n ];\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"timeseries.cjs.js","names":["z","colorSchema","valueExprSchema","formatSchema","queryRefSchema","measureOf","rowsOf","valueOf","bucketPlan","intervalHours","bucketGrid","gridIndex","seriesOf","matchesGroups","evaluate","exprRefs","unknownQueryIssues"],"sources":["../../../../src/domains/dashboards/lib/timeseries.ts"],"sourcesContent":["import type { DashboardQuery } from '@mastra/client-js';\nimport { z } from 'zod/v4';\nimport type { BucketLabels } from '../../metrics/lib/bucket-labels';\nimport { bucketGrid, bucketPlan, gridIndex, intervalHours } from '../../metrics/lib/metrics-buckets';\nimport type { ApiInterval } from '../../metrics/lib/metrics-buckets';\nimport { bucketTraceAggregateRows } from '../../metrics/lib/trace-aggregate';\nimport type { TraceAggregateRow } from '../../metrics/lib/trace-aggregate';\nimport { measureOf, rowsOf, seriesOf, valueOf } from './answers';\nimport type { DashboardAnswer } from './requests';\nimport {\n colorSchema,\n evaluate,\n exprRefs,\n formatSchema,\n matchesGroups,\n queryRefSchema,\n unknownQueryIssues,\n valueExprSchema,\n} from './values';\nimport type { LabelledValue, ValueExpr, ValueRef } from './values';\n\nexport const timeseriesSeriesSchema = z\n .object({\n dataKey: z.string().min(1),\n label: z.string().min(1),\n color: colorSchema,\n emphasis: z.boolean().optional(),\n /** The series' value per bucket. */\n value: valueExprSchema,\n /** The series' value over the whole range, shown beside the card's title marked with the series' color. */\n rangeTotal: valueExprSchema.optional(),\n /** Rounds each bucket's value to a whole number. */\n round: z.boolean().optional(),\n })\n .strict();\n\nexport const timeseriesOptionsSchema = z\n .object({\n chart: z.enum(['stackedBar', 'line']),\n format: formatSchema,\n /** `false` leaves the y-axis to the chart's default labels. */\n axis: z.boolean().optional(),\n series: z.array(timeseriesSeriesSchema).min(1),\n /**\n * `chart` re-buckets metrics onto the bar charts' grid (sums merge); `api` keeps the API's 1h or 1d\n * buckets (percentiles and averages can't merge). Trace and span aggregates always keep the API's.\n */\n buckets: z.enum(['chart', 'api']).optional(),\n /** Ids of queries sent over the whole range, without an interval (e.g. distinct counts, which can't be summed). */\n totals: z.array(queryRefSchema).optional(),\n /** Hides a series whose range total (or, without one, sum of buckets) is zero. */\n hideEmpty: z.boolean().optional(),\n /** Emphasizes the first series shown. */\n emphasizeFirst: z.boolean().optional(),\n xLabels: z.literal('edges').optional(),\n /** The y-axis range when every plotted value is zero. */\n flatYDomain: z.tuple([z.number(), z.number()]).optional(),\n yDomain: z.tuple([z.number(), z.number()]).optional(),\n /** The card's total, beside its title. Ignored when a series has a `rangeTotal`. */\n total: z\n .object({\n /** `total`: every series summed over the range; `peak`: one series' highest bucket; or an expression over range totals. */\n value: z.union([z.literal('total'), z.object({ peak: z.string().min(1) }).strict(), valueExprSchema]),\n format: formatSchema.optional(),\n })\n .strict()\n .optional(),\n emptyMessage: z.string().optional(),\n /** Empty when this is zero over the range; by default, when every plotted value is zero. */\n emptyWhenZero: valueExprSchema.optional(),\n })\n .strict();\n\nexport type TimeseriesOptions = z.infer<typeof timeseriesOptionsSchema>;\nexport type TimeseriesSeries = z.infer<typeof timeseriesSeriesSchema>;\n\ntype Window = { start: Date; end: Date };\n\nexport type ChartBucket = BucketLabels & Record<string, number | string | undefined>;\n\nexport type ShapedTimeseries = {\n data: ChartBucket[];\n /** The series shown, each with its range total when it has one. */\n series: (Omit<TimeseriesSeries, 'rangeTotal'> & { rangeTotal?: number })[];\n /** Hours per bucket, for a clicked bucket's window. */\n stepHours: number;\n /** The card's total, from `options.total`. */\n total?: number;\n /** Every plotted value is zero (or missing). */\n flat: boolean;\n /** Nothing to show in the range. */\n empty: boolean;\n};\n\n/** A ref's value in one trace aggregate row set (ungrouped: one row). */\nfunction fromRows(rows: TraceAggregateRow[], ref: ValueRef) {\n const { measure } = ref;\n if (!measure) return undefined;\n const values = rows.flatMap(r => measureOf(r.measures, measure) ?? []);\n return values.length ? values.reduce((a, b) => a + b, 0) : undefined;\n}\n\n/** A ref's value over the whole range, from a totals query or the sum of its buckets. */\nfunction rangeValue(answer: DashboardAnswer | undefined, ref: ValueRef, perBucket: (number | undefined)[] | undefined) {\n const aggregate = rowsOf(answer);\n if (aggregate && !aggregate.rows.some(r => r.bucket)) return fromRows(aggregate.rows, ref) ?? 0;\n const value = valueOf(answer);\n if (value) return (ref.field === 'estimatedCost' ? value.estimatedCost : value.value) ?? undefined;\n return perBucket?.reduce<number>((sum, v) => sum + (v ?? 0), 0);\n}\n\n/**\n * Lays a timeseries view's answers on the chart's bucket grid. `chart` buckets add every point that\n * falls in a bucket (missing is 0); `api` buckets take the API's point (missing stays unset).\n */\nexport function shapeTimeseries({\n options,\n responses,\n window,\n hasTraceQueries,\n}: {\n options: TimeseriesOptions;\n /** Each query's answer, by query id. */\n responses: ReadonlyMap<string, DashboardAnswer | undefined>;\n window: Window;\n hasTraceQueries: boolean;\n}): ShapedTimeseries {\n const plan = bucketPlan(window.start, window.end);\n const merged = !hasTraceQueries && (options.buckets ?? 'chart') === 'chart';\n const stepHours = merged ? plan.stepHours : intervalHours(plan.interval);\n const grid: BucketLabels[] = bucketGrid(window.start, window.end, stepHours);\n const indexOf = gridIndex(grid, stepHours);\n const totals = new Set(options.totals ?? []);\n\n const cache = new Map<string, (number | undefined)[]>();\n const bucketed = (ref: ValueRef): (number | undefined)[] => {\n const key = JSON.stringify(ref);\n const hit = cache.get(key);\n if (hit) return hit;\n const values: (number | undefined)[] = grid.map(() => (merged ? 0 : undefined));\n const answer = responses.get(ref.query);\n const aggregate = rowsOf(answer);\n if (aggregate) {\n bucketTraceAggregateRows(aggregate.rows, window).forEach((b, i) => {\n values[i] = fromRows(b.rows, ref) ?? 0;\n });\n }\n for (const s of seriesOf(answer) ?? []) {\n if (ref.percentile !== undefined && s.percentile !== ref.percentile) continue;\n if (!matchesGroups(ref, s.name ?? '')) continue;\n for (const p of s.points) {\n const i = indexOf(p);\n if (i === undefined) continue;\n const v = ref.field === 'estimatedCost' ? (p.estimatedCost ?? 0) : p.value;\n // Every series the ref matches adds up (e.g. a grouped count); `api` buckets stay unset until one answers.\n values[i] = (values[i] ?? 0) + v;\n }\n }\n cache.set(key, values);\n return values;\n };\n const rangeOf = (ref: ValueRef) =>\n rangeValue(responses.get(ref.query), ref, totals.has(ref.query) ? undefined : bucketed(ref)) ?? 0;\n const overRange = (expr: ValueExpr) => evaluate(expr, rangeOf) ?? 0;\n\n const perSeries = options.series.map(s => {\n const values = grid.map((_, i) => {\n const v = evaluate(s.value, ref => bucketed(ref)[i]);\n return v === undefined ? undefined : s.round ? Math.round(v) : v;\n });\n const sum = values.reduce<number>((a, v) => a + (v ?? 0), 0);\n return { s, values, rangeTotal: s.rangeTotal ? overRange(s.rangeTotal) : undefined, sum };\n });\n\n const shown = perSeries.filter(p => !options.hideEmpty || (p.rangeTotal ?? p.sum) > 0);\n const data: ChartBucket[] = grid.map((labels, i) => {\n const bucket: ChartBucket = { ...labels };\n for (const p of shown) {\n const v = p.values[i];\n if (v !== undefined) bucket[p.s.dataKey] = v;\n }\n return bucket;\n });\n\n let total: number | undefined;\n const spec = options.total?.value;\n if (spec === 'total') total = shown.reduce((a, p) => a + p.sum, 0);\n else if (spec && 'peak' in spec) {\n const peak = perSeries.find(p => p.s.dataKey === spec.peak);\n total = Math.max(0, ...(peak?.values ?? []).map(v => v ?? 0));\n } else if (spec) total = overRange(spec);\n\n const flat = shown.every(p => p.values.every(v => !v));\n return {\n data,\n series: shown.map((p, i) => ({\n ...p.s,\n emphasis: options.emphasizeFirst ? i === 0 : p.s.emphasis,\n rangeTotal: p.rangeTotal,\n })),\n stepHours,\n total,\n flat,\n empty: options.emptyWhenZero ? overRange(options.emptyWhenZero) === 0 : flat,\n };\n}\n\n/** Aggregations whose values for several groups add up to the value for all of them. */\nconst ADDITIVE = new Set<string>(['sum', 'count']);\n\n/**\n * The numbers an alert could watch: each series over the range (its `rangeTotal`, else its value),\n * then the card's total when it is an expression.\n */\nexport function timeseriesAlertValues(options: TimeseriesOptions): LabelledValue[] {\n const values = options.series.map(s => ({ label: s.label, value: s.rangeTotal ?? s.value }));\n const total = options.total?.value;\n if (total && total !== 'total' && !('peak' in total)) values.push({ label: 'Total', value: total });\n return values;\n}\n\n/**\n * What the schema can't say: query ids the view has, bucketed queries that leave their interval to the\n * chart's grid, refs that pick one of the percentiles their query asks for, and refs that pick one group\n * of a grouped aggregation that can't be added up.\n */\nexport function timeseriesIssues(options: TimeseriesOptions, queries: readonly DashboardQuery[]): string[] {\n const exprs = options.series.flatMap(s => (s.rangeTotal ? [s.value, s.rangeTotal] : [s.value]));\n const total = options.total?.value;\n if (total && total !== 'total' && !('peak' in total)) exprs.push(total);\n if (options.emptyWhenZero) exprs.push(options.emptyWhenZero);\n const refs = exprs.flatMap(exprRefs);\n const totals = new Set(options.totals ?? []);\n const byId = new Map(queries.map(q => [q.id, q]));\n\n // The chart lays every query on one grid built from the page's range; a query's own interval would\n // land its points in the wrong buckets.\n const ownIntervals = queries\n .filter(q => q.id !== undefined && !totals.has(q.id) && 'interval' in q && q.interval !== undefined)\n .map(q => `query '${q.id}' sets its own interval; the chart's buckets follow the page's range`);\n // Percentiles of one metric can't be added up, so a ref must pick one when its query asks for several.\n const ambiguousPercentiles = refs\n .filter(r => {\n const query = byId.get(r.query);\n return (\n r.percentile === undefined &&\n query !== undefined &&\n 'request' in query &&\n query.request === 'percentiles' &&\n query.percentiles.length > 1\n );\n })\n .map(r => `a value reading query '${r.query}' must pick one of its percentiles`);\n const missingPercentiles = refs\n .filter(r => {\n const query = byId.get(r.query);\n return (\n r.percentile !== undefined &&\n query !== undefined &&\n 'request' in query &&\n query.request === 'percentiles' &&\n !query.percentiles.includes(r.percentile)\n );\n })\n .map(r => `a value reading query '${r.query}' picks percentile ${r.percentile}, which the query doesn't ask for`);\n // Every series a ref matches adds up, which is only right for counts and sums.\n const mixedGroups = refs\n .filter(r => {\n const query = byId.get(r.query);\n return (\n r.groups?.length !== 1 &&\n query !== undefined &&\n 'request' in query &&\n query.request === 'timeSeries' &&\n (query.groupBy?.length ?? 0) > 0 &&\n !ADDITIVE.has(query.aggregation)\n );\n })\n .map(r => `a value reading query '${r.query}' must pick one group, since its groups' values can't be added up`);\n\n return [\n ...unknownQueryIssues(\n refs.map(r => r.query),\n queries,\n ),\n ...unknownQueryIssues(options.totals ?? [], queries, 'options.totals'),\n ...ownIntervals,\n ...new Set(ambiguousPercentiles),\n ...new Set(missingPercentiles),\n ...new Set(mixedGroups),\n ];\n}\n"],"mappings":"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"}
|
|
@@ -149,6 +149,22 @@ function shapeTimeseries({ options, responses, window, hasTraceQueries }) {
|
|
|
149
149
|
/** Aggregations whose values for several groups add up to the value for all of them. */
|
|
150
150
|
var ADDITIVE = /* @__PURE__ */ new Set(["sum", "count"]);
|
|
151
151
|
/**
|
|
152
|
+
* The numbers an alert could watch: each series over the range (its `rangeTotal`, else its value),
|
|
153
|
+
* then the card's total when it is an expression.
|
|
154
|
+
*/
|
|
155
|
+
function timeseriesAlertValues(options) {
|
|
156
|
+
const values = options.series.map((s) => ({
|
|
157
|
+
label: s.label,
|
|
158
|
+
value: s.rangeTotal ?? s.value
|
|
159
|
+
}));
|
|
160
|
+
const total = options.total?.value;
|
|
161
|
+
if (total && total !== "total" && !("peak" in total)) values.push({
|
|
162
|
+
label: "Total",
|
|
163
|
+
value: total
|
|
164
|
+
});
|
|
165
|
+
return values;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
152
168
|
* What the schema can't say: query ids the view has, bucketed queries that leave their interval to the
|
|
153
169
|
* chart's grid, refs that pick one of the percentiles their query asks for, and refs that pick one group
|
|
154
170
|
* of a grouped aggregation that can't be added up.
|
|
@@ -183,6 +199,6 @@ function timeseriesIssues(options, queries) {
|
|
|
183
199
|
...new Set(mixedGroups)
|
|
184
200
|
];
|
|
185
201
|
}
|
|
186
|
-
export { shapeTimeseries, timeseriesIssues, timeseriesOptionsSchema, timeseriesSeriesSchema };
|
|
202
|
+
export { shapeTimeseries, timeseriesAlertValues, timeseriesIssues, timeseriesOptionsSchema, timeseriesSeriesSchema };
|
|
187
203
|
|
|
188
204
|
//# sourceMappingURL=timeseries.es.js.map
|