@mastra/playground-ui 68.0.0-alpha.1 → 68.0.0-alpha.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{DataCodeSection-CcPmJPTp.cjs → DataCodeSection-CFxXsQWH.cjs} +3 -3
- package/dist/DataCodeSection-CFxXsQWH.cjs.map +1 -0
- package/dist/{DataCodeSection-KJRyRD1Q.js → DataCodeSection-PY9XEg2C.js} +3 -3
- package/dist/DataCodeSection-PY9XEg2C.js.map +1 -0
- package/dist/{DataPanel-BwB1Oifd.cjs → DataPanel-Coc9h35I.cjs} +2 -2
- package/dist/{DataPanel-BwB1Oifd.cjs.map → DataPanel-Coc9h35I.cjs.map} +1 -1
- package/dist/{DataPanel-Bv4M17xO.js → DataPanel-IgB9D5PO.js} +2 -2
- package/dist/{DataPanel-Bv4M17xO.js.map → DataPanel-IgB9D5PO.js.map} +1 -1
- package/dist/{FilterBar-BO-vvvyq.js → FilterBar-BgW2dqRQ.js} +7 -7
- package/dist/FilterBar-BgW2dqRQ.js.map +1 -0
- package/dist/{FilterBar-Buw0tv51.cjs → FilterBar-CQl04O6t.cjs} +7 -7
- package/dist/FilterBar-CQl04O6t.cjs.map +1 -0
- package/dist/KnowledgePageGraph.css +55 -0
- package/dist/{MarkdownRenderer-2GOXQJEv.js → MarkdownRenderer-CI30RqdB.js} +19 -6
- package/dist/MarkdownRenderer-CI30RqdB.js.map +1 -0
- package/dist/{MarkdownRenderer-CB8Z_CHc.cjs → MarkdownRenderer-y65WGBhC.cjs} +19 -6
- package/dist/MarkdownRenderer-y65WGBhC.cjs.map +1 -0
- package/dist/{MetricsTable-D-aZf3dk.cjs → MetricsTable-BSl81oNe.cjs} +44 -9
- package/dist/MetricsTable-BSl81oNe.cjs.map +1 -0
- package/dist/{MetricsTable-CRPeLHe1.js → MetricsTable-DID6LRoP.js} +44 -9
- package/dist/MetricsTable-DID6LRoP.js.map +1 -0
- package/dist/{activity-rJ1NQl_2.js → activity-C8Ql81WM.js} +2 -2
- package/dist/{activity-rJ1NQl_2.js.map → activity-C8Ql81WM.js.map} +1 -1
- package/dist/{activity-DyB5H3gF.cjs → activity-CcQZeDYi.cjs} +2 -2
- package/dist/{activity-DyB5H3gF.cjs.map → activity-CcQZeDYi.cjs.map} +1 -1
- package/dist/{ask-user-DdYz56qH.cjs → ask-user-C1p2PEYe.cjs} +2 -2
- package/dist/ask-user-C1p2PEYe.cjs.map +1 -0
- package/dist/{ask-user-B225wzWc.js → ask-user-DPznrqGO.js} +2 -2
- package/dist/ask-user-DPznrqGO.js.map +1 -0
- package/dist/chart-plot.css +5 -4
- package/dist/{combobox-CtCK0mNx.js → combobox-D21no8t5.js} +4 -4
- package/dist/{combobox-CtCK0mNx.js.map → combobox-D21no8t5.js.map} +1 -1
- package/dist/{combobox-CMx2ayFN.cjs → combobox-DIT_6xiG.cjs} +4 -4
- package/dist/combobox-DIT_6xiG.cjs.map +1 -0
- package/dist/{combobox-parts-ScKcYjMR.cjs → combobox-parts-C4phOq4t.cjs} +2 -2
- package/dist/combobox-parts-C4phOq4t.cjs.map +1 -0
- package/dist/{combobox-parts-C1CugUAU.js → combobox-parts-D90ir0Py.js} +3 -3
- package/dist/combobox-parts-D90ir0Py.js.map +1 -0
- 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/DataCodeSection.cjs.js +1 -1
- package/dist/components/DataCodeSection.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.cjs.js.map +1 -1
- package/dist/components/DateTimePicker.es.js +1 -1
- package/dist/components/DateTimePicker.es.js.map +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.cjs.js.map +1 -1
- package/dist/components/FormFieldBlocks.es.js +1 -1
- package/dist/components/FormFieldBlocks.es.js.map +1 -1
- package/dist/components/MarkdownRenderer.cjs.js +1 -1
- package/dist/components/MarkdownRenderer.es.js +1 -1
- package/dist/components/MetricsTable.cjs.js +1 -1
- package/dist/components/MetricsTable.es.js +1 -1
- package/dist/components/PropertyFilter.cjs.js +3 -3
- package/dist/components/PropertyFilter.cjs.js.map +1 -1
- package/dist/components/PropertyFilter.es.js +3 -3
- package/dist/components/PropertyFilter.es.js.map +1 -1
- package/dist/components/SavedViews.cjs.js +2 -2
- package/dist/components/SavedViews.es.js +2 -2
- package/dist/components/Sidebar.cjs.js +8 -8
- package/dist/components/Sidebar.cjs.js.map +1 -1
- package/dist/components/Sidebar.es.js +9 -9
- package/dist/components/Sidebar.es.js.map +1 -1
- package/dist/components/ai/activity.cjs.js +1 -1
- package/dist/components/ai/activity.es.js +1 -1
- package/dist/components/ai/ask-user.cjs.js +1 -1
- package/dist/components/ai/ask-user.es.js +1 -1
- package/dist/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 +2 -2
- package/dist/components/ai/tool-call.es.js +2 -2
- package/dist/domains/chat/activity/activity-stretch-line.cjs.js +1 -1
- package/dist/domains/chat/activity/activity-stretch-line.es.js +1 -1
- package/dist/domains/chat/activity/components/activity-fold.cjs.js +1 -1
- package/dist/domains/chat/activity/components/activity-fold.es.js +1 -1
- package/dist/domains/chat/activity/components/activity-timed-trigger.cjs.js +1 -1
- package/dist/domains/chat/activity/components/activity-timed-trigger.es.js +1 -1
- package/dist/domains/chat/activity/components/calls-panel.cjs.js +1 -1
- package/dist/domains/chat/activity/components/calls-panel.es.js +1 -1
- package/dist/domains/chat/activity/components/stretch-content.cjs.js +1 -1
- package/dist/domains/chat/activity/components/stretch-content.es.js +1 -1
- package/dist/domains/chat/activity/components/stretch-thought.cjs.js +1 -1
- package/dist/domains/chat/activity/components/stretch-thought.es.js +1 -1
- package/dist/domains/chat/activity/model/activity-segments.cjs.js +1 -1
- package/dist/domains/chat/activity/model/activity-segments.es.js +1 -1
- package/dist/domains/chat/activity/model/activity-words.cjs.js +2 -2
- package/dist/domains/chat/activity/model/activity-words.es.js +2 -2
- package/dist/domains/chat/components/badge-wrapper.cjs.js +1 -1
- package/dist/domains/chat/components/badge-wrapper.es.js +1 -1
- package/dist/domains/chat/knowledge/knowledge-links.cjs.js +52 -6
- package/dist/domains/chat/knowledge/knowledge-links.cjs.js.map +1 -1
- package/dist/domains/chat/knowledge/knowledge-links.es.js +53 -9
- package/dist/domains/chat/knowledge/knowledge-links.es.js.map +1 -1
- package/dist/domains/chat/knowledge/pinned-knowledge-data.cjs.js +10 -3
- package/dist/domains/chat/knowledge/pinned-knowledge-data.cjs.js.map +1 -1
- package/dist/domains/chat/knowledge/pinned-knowledge-data.es.js +10 -3
- package/dist/domains/chat/knowledge/pinned-knowledge-data.es.js.map +1 -1
- package/dist/domains/chat/knowledge/pinned-knowledge.cjs.js +8 -3
- package/dist/domains/chat/knowledge/pinned-knowledge.cjs.js.map +1 -1
- package/dist/domains/chat/knowledge/pinned-knowledge.es.js +8 -3
- package/dist/domains/chat/knowledge/pinned-knowledge.es.js.map +1 -1
- package/dist/domains/chat/knowledge.cjs.js +2 -0
- package/dist/domains/chat/knowledge.es.js +2 -2
- package/dist/domains/chat/messages/message-row.cjs.js +3 -3
- package/dist/domains/chat/messages/message-row.es.js +3 -3
- 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 +35 -1
- package/dist/domains/chat/messages/renderers/message-text.cjs.js.map +1 -1
- package/dist/domains/chat/messages/renderers/message-text.es.js +36 -2
- package/dist/domains/chat/messages/renderers/message-text.es.js.map +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/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/file-tree-badge.cjs.js +2 -2
- package/dist/domains/chat/tools/badges/file-tree-badge.es.js +2 -2
- package/dist/domains/chat/tools/badges/knowledge-body-range.cjs.js +80 -0
- package/dist/domains/chat/tools/badges/knowledge-body-range.cjs.js.map +1 -0
- package/dist/domains/chat/tools/badges/knowledge-body-range.d.ts +1 -0
- package/dist/domains/chat/tools/badges/knowledge-body-range.es.js +78 -0
- package/dist/domains/chat/tools/badges/knowledge-body-range.es.js.map +1 -0
- package/dist/domains/chat/tools/badges/knowledge-tool-badge.cjs.js +163 -13
- package/dist/domains/chat/tools/badges/knowledge-tool-badge.cjs.js.map +1 -1
- package/dist/domains/chat/tools/badges/knowledge-tool-badge.es.js +165 -15
- package/dist/domains/chat/tools/badges/knowledge-tool-badge.es.js.map +1 -1
- package/dist/domains/chat/tools/badges/mcp-input-request-badge.cjs.js +51 -0
- package/dist/domains/chat/tools/badges/mcp-input-request-badge.cjs.js.map +1 -0
- package/dist/domains/chat/tools/badges/mcp-input-request-badge.d.ts +1 -0
- package/dist/domains/chat/tools/badges/mcp-input-request-badge.es.js +49 -0
- package/dist/domains/chat/tools/badges/mcp-input-request-badge.es.js.map +1 -0
- package/dist/domains/chat/tools/badges/mcp-task-chip.cjs.js +7 -2
- package/dist/domains/chat/tools/badges/mcp-task-chip.cjs.js.map +1 -1
- package/dist/domains/chat/tools/badges/mcp-task-chip.es.js +7 -2
- package/dist/domains/chat/tools/badges/mcp-task-chip.es.js.map +1 -1
- package/dist/domains/chat/tools/badges/observation-marker-badge.cjs.js +2 -2
- package/dist/domains/chat/tools/badges/observation-marker-badge.es.js +2 -2
- package/dist/domains/chat/tools/badges/observation-marker-details.cjs.js +2 -2
- package/dist/domains/chat/tools/badges/observation-marker-details.es.js +2 -2
- package/dist/domains/chat/tools/badges/observation-renderer.cjs.js +1 -1
- package/dist/domains/chat/tools/badges/observation-renderer.es.js +1 -1
- package/dist/domains/chat/tools/badges/sandbox-execution-badge.cjs.js +2 -2
- package/dist/domains/chat/tools/badges/sandbox-execution-badge.es.js +2 -2
- package/dist/domains/chat/tools/badges/tool-approval-badge.cjs.js +1 -1
- package/dist/domains/chat/tools/badges/tool-approval-badge.es.js +1 -1
- package/dist/domains/chat/tools/badges/tool-badge.cjs.js +9 -4
- package/dist/domains/chat/tools/badges/tool-badge.cjs.js.map +1 -1
- package/dist/domains/chat/tools/badges/tool-badge.es.js +9 -4
- package/dist/domains/chat/tools/badges/tool-badge.es.js.map +1 -1
- package/dist/domains/chat/tools/badges/use-deferred-input-request.cjs.js +81 -0
- package/dist/domains/chat/tools/badges/use-deferred-input-request.cjs.js.map +1 -0
- package/dist/domains/chat/tools/badges/use-deferred-input-request.d.ts +1 -0
- package/dist/domains/chat/tools/badges/use-deferred-input-request.es.js +77 -0
- package/dist/domains/chat/tools/badges/use-deferred-input-request.es.js.map +1 -0
- package/dist/domains/chat/tools/badges/use-mcp-task-progress.cjs.js +11 -2
- package/dist/domains/chat/tools/badges/use-mcp-task-progress.cjs.js.map +1 -1
- package/dist/domains/chat/tools/badges/use-mcp-task-progress.es.js +11 -2
- package/dist/domains/chat/tools/badges/use-mcp-task-progress.es.js.map +1 -1
- package/dist/domains/chat/tools/badges/workflow-badge.cjs.js +1 -1
- package/dist/domains/chat/tools/badges/workflow-badge.es.js +1 -1
- package/dist/domains/chat/tools/mcp-input-request-tool.cjs.js +240 -0
- package/dist/domains/chat/tools/mcp-input-request-tool.cjs.js.map +1 -0
- package/dist/domains/chat/tools/mcp-input-request-tool.d.ts +1 -0
- package/dist/domains/chat/tools/mcp-input-request-tool.es.js +239 -0
- package/dist/domains/chat/tools/mcp-input-request-tool.es.js.map +1 -0
- package/dist/domains/chat/tools/mcp-input-request.cjs.js +40 -0
- package/dist/domains/chat/tools/mcp-input-request.cjs.js.map +1 -0
- package/dist/domains/chat/tools/mcp-input-request.d.ts +1 -0
- package/dist/domains/chat/tools/mcp-input-request.es.js +33 -0
- package/dist/domains/chat/tools/mcp-input-request.es.js.map +1 -0
- package/dist/domains/chat/tools/tool-card-kind.cjs.js +8 -3
- package/dist/domains/chat/tools/tool-card-kind.cjs.js.map +1 -1
- package/dist/domains/chat/tools/tool-card-kind.es.js +8 -4
- package/dist/domains/chat/tools/tool-card-kind.es.js.map +1 -1
- package/dist/domains/chat/tools/tool-card.cjs.js +1 -1
- package/dist/domains/chat/tools/tool-card.es.js +1 -1
- package/dist/domains/chat/tools/tool-groups.cjs.js +1 -1
- package/dist/domains/chat/tools/tool-groups.es.js +1 -1
- package/dist/domains/chat.cjs.js +5 -3
- package/dist/domains/chat.es.js +4 -4
- package/dist/domains/dashboards/kinds/table/table-view.cjs.js +1 -1
- package/dist/domains/dashboards/kinds/table/table-view.es.js +1 -1
- package/dist/domains/dashboards/metrics-dashboard.cjs.js +1 -1
- package/dist/domains/dashboards/metrics-dashboard.cjs.js.map +1 -1
- package/dist/domains/dashboards/metrics-dashboard.es.js +1 -1
- package/dist/domains/dashboards/metrics-dashboard.es.js.map +1 -1
- package/dist/domains/datasets/components/save-as-dataset-item-dialog.cjs.js +1 -1
- package/dist/domains/datasets/components/save-as-dataset-item-dialog.es.js +1 -1
- package/dist/domains/knowledge/components/KnowledgePageCard.cjs.js +48 -0
- package/dist/domains/knowledge/components/KnowledgePageCard.cjs.js.map +1 -0
- package/dist/domains/knowledge/components/KnowledgePageCard.d.ts +1 -0
- package/dist/domains/knowledge/components/KnowledgePageCard.es.js +47 -0
- package/dist/domains/knowledge/components/KnowledgePageCard.es.js.map +1 -0
- package/dist/domains/knowledge/components/KnowledgePageDetail.cjs.js +63 -5
- package/dist/domains/knowledge/components/KnowledgePageDetail.cjs.js.map +1 -1
- package/dist/domains/knowledge/components/KnowledgePageDetail.es.js +64 -6
- package/dist/domains/knowledge/components/KnowledgePageDetail.es.js.map +1 -1
- package/dist/domains/knowledge/components/KnowledgePageExplorer.cjs.js +485 -47
- package/dist/domains/knowledge/components/KnowledgePageExplorer.cjs.js.map +1 -1
- package/dist/domains/knowledge/components/KnowledgePageExplorer.es.js +487 -50
- package/dist/domains/knowledge/components/KnowledgePageExplorer.es.js.map +1 -1
- package/dist/domains/knowledge/components/KnowledgePageGraph.cjs.js +1051 -123
- package/dist/domains/knowledge/components/KnowledgePageGraph.cjs.js.map +1 -1
- package/dist/domains/knowledge/components/KnowledgePageGraph.es.js +1054 -126
- package/dist/domains/knowledge/components/KnowledgePageGraph.es.js.map +1 -1
- package/dist/domains/knowledge/components/KnowledgePageTree.cjs.js +75 -3
- package/dist/domains/knowledge/components/KnowledgePageTree.cjs.js.map +1 -1
- package/dist/domains/knowledge/components/KnowledgePageTree.es.js +76 -4
- package/dist/domains/knowledge/components/KnowledgePageTree.es.js.map +1 -1
- package/dist/domains/knowledge/lib/circleText.cjs.js +9 -0
- package/dist/domains/knowledge/lib/circleText.cjs.js.map +1 -0
- package/dist/domains/knowledge/lib/circleText.d.ts +1 -0
- package/dist/domains/knowledge/lib/circleText.es.js +8 -0
- package/dist/domains/knowledge/lib/circleText.es.js.map +1 -0
- package/dist/domains/knowledge/lib/fitViewport.cjs.js +82 -0
- package/dist/domains/knowledge/lib/fitViewport.cjs.js.map +1 -0
- package/dist/domains/knowledge/lib/fitViewport.d.ts +1 -0
- package/dist/domains/knowledge/lib/fitViewport.es.js +73 -0
- package/dist/domains/knowledge/lib/fitViewport.es.js.map +1 -0
- package/dist/domains/knowledge/lib/graphShape.cjs.js +524 -0
- package/dist/domains/knowledge/lib/graphShape.cjs.js.map +1 -0
- package/dist/domains/knowledge/lib/graphShape.d.ts +1 -0
- package/dist/domains/knowledge/lib/graphShape.es.js +499 -0
- package/dist/domains/knowledge/lib/graphShape.es.js.map +1 -0
- package/dist/domains/knowledge/lib/linkCountsText.cjs.js +11 -0
- package/dist/domains/knowledge/lib/linkCountsText.cjs.js.map +1 -0
- package/dist/domains/knowledge/lib/linkCountsText.d.ts +1 -0
- package/dist/domains/knowledge/lib/linkCountsText.es.js +10 -0
- package/dist/domains/knowledge/lib/linkCountsText.es.js.map +1 -0
- package/dist/domains/knowledge/lib/pageAddress.cjs.js +29 -0
- package/dist/domains/knowledge/lib/pageAddress.cjs.js.map +1 -0
- package/dist/domains/knowledge/lib/pageAddress.d.ts +1 -0
- package/dist/domains/knowledge/lib/pageAddress.es.js +27 -0
- package/dist/domains/knowledge/lib/pageAddress.es.js.map +1 -0
- package/dist/domains/knowledge/lib/pageGraph.cjs.js +11 -11
- package/dist/domains/knowledge/lib/pageGraph.cjs.js.map +1 -1
- package/dist/domains/knowledge/lib/pageGraph.es.js +11 -11
- package/dist/domains/knowledge/lib/pageGraph.es.js.map +1 -1
- package/dist/domains/knowledge/lib/pageRefs.cjs.js +69 -0
- package/dist/domains/knowledge/lib/pageRefs.cjs.js.map +1 -0
- package/dist/domains/knowledge/lib/pageRefs.d.ts +1 -0
- package/dist/domains/knowledge/lib/pageRefs.es.js +66 -0
- package/dist/domains/knowledge/lib/pageRefs.es.js.map +1 -0
- package/dist/domains/knowledge/lib/pageTree.cjs.js +5 -0
- package/dist/domains/knowledge/lib/pageTree.cjs.js.map +1 -1
- package/dist/domains/knowledge/lib/pageTree.es.js +5 -1
- package/dist/domains/knowledge/lib/pageTree.es.js.map +1 -1
- package/dist/domains/knowledge/lib/remarkKnowledgeLinks.cjs.js +82 -0
- package/dist/domains/knowledge/lib/remarkKnowledgeLinks.cjs.js.map +1 -0
- package/dist/domains/knowledge/lib/remarkKnowledgeLinks.d.ts +1 -0
- package/dist/domains/knowledge/lib/remarkKnowledgeLinks.es.js +78 -0
- package/dist/domains/knowledge/lib/remarkKnowledgeLinks.es.js.map +1 -0
- package/dist/domains/knowledge/lib/tooltipSide.cjs.js +77 -0
- package/dist/domains/knowledge/lib/tooltipSide.cjs.js.map +1 -0
- package/dist/domains/knowledge/lib/tooltipSide.d.ts +1 -0
- package/dist/domains/knowledge/lib/tooltipSide.es.js +75 -0
- package/dist/domains/knowledge/lib/tooltipSide.es.js.map +1 -0
- package/dist/domains/knowledge/lib/useLeavingNodes.cjs.js +65 -0
- package/dist/domains/knowledge/lib/useLeavingNodes.cjs.js.map +1 -0
- package/dist/domains/knowledge/lib/useLeavingNodes.d.ts +1 -0
- package/dist/domains/knowledge/lib/useLeavingNodes.es.js +62 -0
- package/dist/domains/knowledge/lib/useLeavingNodes.es.js.map +1 -0
- package/dist/domains/knowledge/lib/useStableWhile.cjs.js +15 -0
- package/dist/domains/knowledge/lib/useStableWhile.cjs.js.map +1 -0
- package/dist/domains/knowledge/lib/useStableWhile.d.ts +1 -0
- package/dist/domains/knowledge/lib/useStableWhile.es.js +14 -0
- package/dist/domains/knowledge/lib/useStableWhile.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/metrics/components/breakdown/breakdown-table.cjs.js +2 -2
- package/dist/domains/metrics/components/breakdown/breakdown-table.cjs.js.map +1 -1
- package/dist/domains/metrics/components/breakdown/breakdown-table.es.js +2 -2
- package/dist/domains/metrics/components/breakdown/breakdown-table.es.js.map +1 -1
- package/dist/domains/metrics/components/metrics-time-range-chip.cjs.js +1 -1
- package/dist/domains/metrics/components/metrics-time-range-chip.es.js +1 -1
- package/dist/domains/observability/saved-views/observability-saved-views.cjs.js +1 -1
- package/dist/domains/observability/saved-views/observability-saved-views.es.js +1 -1
- package/dist/domains/observability/saved-views.cjs.js +1 -1
- package/dist/domains/observability/saved-views.es.js +1 -1
- package/dist/domains/observability.cjs.js +1 -1
- package/dist/domains/observability.es.js +1 -1
- package/dist/domains/scores/components/score-data-panel.cjs.js +1 -1
- package/dist/domains/scores/components/score-data-panel.es.js +1 -1
- package/dist/domains/scores/components/span-scoring.cjs.js +3 -3
- package/dist/domains/scores/components/span-scoring.cjs.js.map +1 -1
- package/dist/domains/scores/components/span-scoring.es.js +3 -3
- package/dist/domains/scores/components/span-scoring.es.js.map +1 -1
- package/dist/domains/scores/components/trace-scores-list.cjs.js +2 -2
- package/dist/domains/scores/components/trace-scores-list.es.js +2 -2
- package/dist/domains/skills/skill-simple-form.cjs.js +2 -2
- package/dist/domains/skills/skill-simple-form.cjs.js.map +1 -1
- package/dist/domains/skills/skill-simple-form.es.js +2 -2
- package/dist/domains/skills/skill-simple-form.es.js.map +1 -1
- 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 +3 -3
- package/dist/domains/spans/components/spans-filter-bar.cjs.js.map +1 -1
- package/dist/domains/spans/components/spans-filter-bar.es.js +3 -3
- package/dist/domains/spans/components/spans-filter-bar.es.js.map +1 -1
- 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 +3 -3
- package/dist/domains/threads/components/threads-filter-bar.cjs.js.map +1 -1
- package/dist/domains/threads/components/threads-filter-bar.es.js +3 -3
- package/dist/domains/threads/components/threads-filter-bar.es.js.map +1 -1
- 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-thread.cjs.js +1 -1
- package/dist/domains/traces/components/feedback-thread.cjs.js.map +1 -1
- package/dist/domains/traces/components/feedback-thread.es.js +1 -1
- package/dist/domains/traces/components/feedback-thread.es.js.map +1 -1
- package/dist/domains/traces/components/span-data-panel-view.cjs.js +1 -1
- package/dist/domains/traces/components/span-data-panel-view.es.js +1 -1
- package/dist/domains/traces/components/span-payload/span-error-renderer.cjs.js +1 -1
- package/dist/domains/traces/components/span-payload/span-error-renderer.es.js +1 -1
- package/dist/domains/traces/components/span-payload/span-input-renderers.cjs.js +1 -1
- package/dist/domains/traces/components/span-payload/span-input-renderers.es.js +1 -1
- package/dist/domains/traces/components/span-payload/span-output-renderers.cjs.js +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-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/span-timeline-row.cjs.js +1 -1
- package/dist/domains/traces/components/span-timeline-row.es.js +1 -1
- package/dist/domains/traces/components/span-timing-hover-card.cjs.js +1 -1
- package/dist/domains/traces/components/span-timing-hover-card.es.js +1 -1
- package/dist/domains/traces/components/thread-trace/thread-trace-details.cjs.js +1 -1
- package/dist/domains/traces/components/thread-trace/thread-trace-details.es.js +1 -1
- package/dist/domains/traces/components/trace-columns-menu.cjs.js +3 -3
- package/dist/domains/traces/components/trace-columns-menu.cjs.js.map +1 -1
- package/dist/domains/traces/components/trace-columns-menu.es.js +3 -3
- package/dist/domains/traces/components/trace-columns-menu.es.js.map +1 -1
- package/dist/domains/traces/components/trace-data-panel-view.cjs.js +10 -4
- package/dist/domains/traces/components/trace-data-panel-view.cjs.js.map +1 -1
- package/dist/domains/traces/components/trace-data-panel-view.es.js +10 -4
- package/dist/domains/traces/components/trace-data-panel-view.es.js.map +1 -1
- package/dist/domains/traces/components/trace-error-cell.cjs.js +1 -1
- package/dist/domains/traces/components/trace-error-cell.es.js +1 -1
- package/dist/domains/traces/components/trace-id-button.cjs.js +1 -1
- package/dist/domains/traces/components/trace-id-button.es.js +1 -1
- package/dist/domains/traces/components/trace-summary-description.cjs.js +1 -1
- package/dist/domains/traces/components/trace-summary-description.es.js +1 -1
- package/dist/domains/traces/components/trace-thread-panel.cjs.js +1 -1
- package/dist/domains/traces/components/trace-thread-panel.es.js +1 -1
- package/dist/domains/traces/components/traces-explorer/traces-explorer-filter-bar.cjs.js +3 -3
- package/dist/domains/traces/components/traces-explorer/traces-explorer-filter-bar.cjs.js.map +1 -1
- package/dist/domains/traces/components/traces-explorer/traces-explorer-filter-bar.es.js +3 -3
- package/dist/domains/traces/components/traces-explorer/traces-explorer-filter-bar.es.js.map +1 -1
- package/dist/domains/traces/components/traces-explorer/traces-explorer-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/workflows/components/workflow-combobox.cjs.js +2 -2
- package/dist/domains/workflows/components/workflow-combobox.cjs.js.map +1 -1
- package/dist/domains/workflows/components/workflow-combobox.es.js +2 -2
- package/dist/domains/workflows/components/workflow-combobox.es.js.map +1 -1
- package/dist/domains/workflows/runs/workflow-run-list.cjs.js +1 -1
- package/dist/domains/workflows/runs/workflow-run-list.es.js +1 -1
- package/dist/domains/workflows/workflow/input/workflow-processor-input.cjs.js +3 -3
- package/dist/domains/workflows/workflow/input/workflow-processor-input.cjs.js.map +1 -1
- package/dist/domains/workflows/workflow/input/workflow-processor-input.es.js +3 -3
- package/dist/domains/workflows/workflow/input/workflow-processor-input.es.js.map +1 -1
- package/dist/domains/workflows/workflow/use-workflow-trigger.cjs.js +3 -3
- package/dist/domains/workflows/workflow/use-workflow-trigger.es.js +3 -3
- package/dist/domains/workflows/workflow/workflow-input-data.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-input-data.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-suspended-steps.cjs.js +2 -2
- package/dist/domains/workflows/workflow/workflow-suspended-steps.es.js +2 -2
- package/dist/domains/workflows/workflow/workflow-time-travel-form.cjs.js +2 -2
- package/dist/domains/workflows/workflow/workflow-time-travel-form.es.js +2 -2
- package/dist/domains/workspace/components/workspace-add-skill-dialog.cjs.js +2 -2
- package/dist/domains/workspace/components/workspace-add-skill-dialog.cjs.js.map +1 -1
- package/dist/domains/workspace/components/workspace-add-skill-dialog.es.js +2 -2
- package/dist/domains/workspace/components/workspace-add-skill-dialog.es.js.map +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/{filter-bar-chip-B4sV4gDm.js → filter-bar-chip-CABeKrtf.js} +4 -4
- package/dist/{filter-bar-chip-B4sV4gDm.js.map → filter-bar-chip-CABeKrtf.js.map} +1 -1
- package/dist/{filter-bar-chip-CIEsWcEw.cjs → filter-bar-chip-Cg-UbIwP.cjs} +4 -4
- package/dist/{filter-bar-chip-CIEsWcEw.cjs.map → filter-bar-chip-Cg-UbIwP.cjs.map} +1 -1
- package/dist/{filter-bar-time-range-DvuaFnkI.cjs → filter-bar-time-range-BA-pXMlo.cjs} +2 -2
- package/dist/{filter-bar-time-range-DvuaFnkI.cjs.map → filter-bar-time-range-BA-pXMlo.cjs.map} +1 -1
- package/dist/{filter-bar-time-range-CXQMBgpz.js → filter-bar-time-range-mg9JeYue.js} +2 -2
- package/dist/{filter-bar-time-range-CXQMBgpz.js.map → filter-bar-time-range-mg9JeYue.js.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/dynamic-form.cjs.js +2 -2
- package/dist/lib/form/dynamic-form.es.js +2 -2
- package/dist/lib/form/json-draft.cjs.js +1 -1
- package/dist/lib/form/json-draft.es.js +1 -1
- package/dist/lib/form/zod-provider.cjs.js +1 -1
- package/dist/lib/form/zod-provider.es.js +1 -1
- package/dist/{observability-saved-views-BBam8Fr5.js → observability-saved-views-CjKTEp1V.js} +3 -3
- package/dist/observability-saved-views-CjKTEp1V.js.map +1 -0
- package/dist/{observability-saved-views-BAzxxoAr.cjs → observability-saved-views-Daizz4tU.cjs} +3 -3
- package/dist/observability-saved-views-Daizz4tU.cjs.map +1 -0
- package/dist/primitives/chart-plot.cjs.js +8 -6
- package/dist/primitives/chart-plot.cjs.js.map +1 -1
- package/dist/primitives/chart-plot.es.js +8 -6
- package/dist/primitives/chart-plot.es.js.map +1 -1
- package/dist/primitives/control-icon.cjs.js.map +1 -1
- package/dist/primitives/control-icon.es.js.map +1 -1
- package/dist/{property-filter-applied-p3dTTDdb.js → property-filter-applied--U5EZdaA.js} +2 -2
- package/dist/property-filter-applied--U5EZdaA.js.map +1 -0
- package/dist/{property-filter-applied-BCeRLcXb.cjs → property-filter-applied-BkkIObRq.cjs} +2 -2
- package/dist/property-filter-applied-BkkIObRq.cjs.map +1 -0
- package/dist/{span-payload-primitives-B3RdahsC.js → span-payload-primitives-CKKIAVPJ.js} +4 -4
- package/dist/{span-payload-primitives-B3RdahsC.js.map → span-payload-primitives-CKKIAVPJ.js.map} +1 -1
- package/dist/{span-payload-primitives-_2d-pAOD.cjs → span-payload-primitives-D4tHWN2W.cjs} +4 -4
- package/dist/{span-payload-primitives-_2d-pAOD.cjs.map → span-payload-primitives-D4tHWN2W.cjs.map} +1 -1
- package/dist/src/domains/chat/knowledge/knowledge-links.d.ts +32 -4
- package/dist/src/domains/chat/knowledge/pinned-knowledge-data.d.ts +2 -0
- package/dist/src/domains/chat/tools/badges/knowledge-body-range.d.ts +12 -0
- package/dist/src/domains/chat/tools/badges/knowledge-tool-badge.d.ts +5 -2
- package/dist/src/domains/chat/tools/badges/mcp-input-request-badge.d.ts +18 -0
- package/dist/src/domains/chat/tools/badges/tool-badge.d.ts +4 -1
- package/dist/src/domains/chat/tools/badges/use-deferred-input-request.d.ts +44 -0
- package/dist/src/domains/chat/tools/badges/use-mcp-task-progress.d.ts +6 -1
- package/dist/src/domains/chat/tools/mcp-input-request-tool.d.ts +18 -0
- package/dist/src/domains/chat/tools/mcp-input-request.d.ts +40 -0
- package/dist/src/domains/chat/tools/tool-card-kind.d.ts +4 -2
- package/dist/src/domains/chat/tools/tool-card.d.ts +1 -1
- package/dist/src/domains/knowledge/components/KnowledgePageCard.d.ts +23 -0
- package/dist/src/domains/knowledge/components/KnowledgePageExplorer.d.ts +29 -0
- package/dist/src/domains/knowledge/components/KnowledgePageGraph.d.ts +27 -1
- package/dist/src/domains/knowledge/components/KnowledgePageTree.d.ts +2 -1
- package/dist/src/domains/knowledge/lib/circleText.d.ts +2 -0
- package/dist/src/domains/knowledge/lib/fitViewport.d.ts +67 -0
- package/dist/src/domains/knowledge/lib/graphShape.d.ts +131 -0
- package/dist/src/domains/knowledge/lib/linkCountsText.d.ts +5 -0
- package/dist/src/domains/knowledge/lib/pageAddress.d.ts +5 -0
- package/dist/src/domains/knowledge/lib/pageGraph.d.ts +4 -4
- package/dist/src/domains/knowledge/lib/pageRefs.d.ts +15 -0
- package/dist/src/domains/knowledge/lib/pageTree.d.ts +2 -0
- package/dist/src/domains/knowledge/lib/remarkKnowledgeLinks.d.ts +13 -0
- package/dist/src/domains/knowledge/lib/tooltipSide.d.ts +40 -0
- package/dist/src/domains/knowledge/lib/useLeavingNodes.d.ts +14 -0
- package/dist/src/domains/knowledge/lib/useStableWhile.d.ts +5 -0
- package/dist/src/domains/knowledge/pageTypes.d.ts +6 -1
- package/dist/src/ds/components/MarkdownRenderer/markdown-renderer.d.ts +8 -1
- package/dist/src/ds/components/MetricsTable/metrics-table-rows.d.ts +10 -3
- package/dist/src/ds/components/MetricsTable/metrics-table.d.ts +1 -1
- package/dist/src/ds/components/ai/tool-call/tool-phrases.d.ts +6 -0
- package/dist/style.css +83 -3
- package/dist/{tabbed-container-DQU7pVio.cjs → tabbed-container-B4lCBgRP.cjs} +2 -2
- package/dist/{tabbed-container-DQU7pVio.cjs.map → tabbed-container-B4lCBgRP.cjs.map} +1 -1
- package/dist/{tabbed-container-5j6dhoRX.js → tabbed-container-DI1GI1Qv.js} +2 -2
- package/dist/{tabbed-container-5j6dhoRX.js.map → tabbed-container-DI1GI1Qv.js.map} +1 -1
- package/dist/{tool-approval-1qiB4hhG.cjs → tool-approval-CJvPDL7D.cjs} +4 -4
- package/dist/{tool-approval-1qiB4hhG.cjs.map → tool-approval-CJvPDL7D.cjs.map} +1 -1
- package/dist/{tool-approval-B6MFcaKV.js → tool-approval-DyN11vFA.js} +4 -4
- package/dist/{tool-approval-B6MFcaKV.js.map → tool-approval-DyN11vFA.js.map} +1 -1
- package/dist/{tool-call-Bu66PkD-.cjs → tool-call-DBn14X-3.cjs} +9 -3
- package/dist/{tool-call-Bu66PkD-.cjs.map → tool-call-DBn14X-3.cjs.map} +1 -1
- package/dist/{tool-call-Ch9-jjXU.js → tool-call-Dsj43lvJ.js} +9 -3
- package/dist/{tool-call-Ch9-jjXU.js.map → tool-call-Dsj43lvJ.js.map} +1 -1
- package/dist/{tool-card-DrqPZfPQ.cjs → tool-card-rxhTDpk_.cjs} +164 -126
- package/dist/tool-card-rxhTDpk_.cjs.map +1 -0
- package/dist/{tool-card-sO6P2Qj4.js → tool-card-toDgoZzJ.js} +165 -127
- package/dist/tool-card-toDgoZzJ.js.map +1 -0
- package/dist/{tool-presentation-DvCsb_kz.js → tool-presentation-CvibOP1J.js} +6 -1
- package/dist/tool-presentation-CvibOP1J.js.map +1 -0
- package/dist/{tool-presentation-CQlDEwgS.cjs → tool-presentation-D6nzVruN.cjs} +6 -1
- package/dist/tool-presentation-D6nzVruN.cjs.map +1 -0
- package/oxlint/index.js +90 -0
- package/package.json +9 -9
- package/theme.css +4 -3
- package/dist/DataCodeSection-CcPmJPTp.cjs.map +0 -1
- package/dist/DataCodeSection-KJRyRD1Q.js.map +0 -1
- package/dist/FilterBar-BO-vvvyq.js.map +0 -1
- package/dist/FilterBar-Buw0tv51.cjs.map +0 -1
- package/dist/MarkdownRenderer-2GOXQJEv.js.map +0 -1
- package/dist/MarkdownRenderer-CB8Z_CHc.cjs.map +0 -1
- package/dist/MetricsTable-CRPeLHe1.js.map +0 -1
- package/dist/MetricsTable-D-aZf3dk.cjs.map +0 -1
- package/dist/ask-user-B225wzWc.js.map +0 -1
- package/dist/ask-user-DdYz56qH.cjs.map +0 -1
- package/dist/combobox-CMx2ayFN.cjs.map +0 -1
- package/dist/combobox-parts-C1CugUAU.js.map +0 -1
- package/dist/combobox-parts-ScKcYjMR.cjs.map +0 -1
- package/dist/domains/knowledge/lib/pageLayout.cjs.js +0 -49
- package/dist/domains/knowledge/lib/pageLayout.cjs.js.map +0 -1
- package/dist/domains/knowledge/lib/pageLayout.d.ts +0 -1
- package/dist/domains/knowledge/lib/pageLayout.es.js +0 -48
- package/dist/domains/knowledge/lib/pageLayout.es.js.map +0 -1
- package/dist/observability-saved-views-BAzxxoAr.cjs.map +0 -1
- package/dist/observability-saved-views-BBam8Fr5.js.map +0 -1
- package/dist/property-filter-applied-BCeRLcXb.cjs.map +0 -1
- package/dist/property-filter-applied-p3dTTDdb.js.map +0 -1
- package/dist/src/domains/knowledge/lib/pageLayout.d.ts +0 -24
- package/dist/tool-card-DrqPZfPQ.cjs.map +0 -1
- package/dist/tool-card-sO6P2Qj4.js.map +0 -1
- package/dist/tool-presentation-CQlDEwgS.cjs.map +0 -1
- package/dist/tool-presentation-DvCsb_kz.js.map +0 -1
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
// src/domains/knowledge/lib/remarkKnowledgeLinks.ts
|
|
2
|
+
var WIKILINK = /\[\[([^\]]+)\]\]/g;
|
|
3
|
+
/** `[[ref]]`, or a bare `type:value#path` address such as `docs:mastra#guides/memory` (never a URL or an email). */
|
|
4
|
+
var WIKILINK_OR_ADDRESS = /\[\[([^\]]+)\]\]|(?<![\w:/#@.-])([a-z][\w-]*:[\w.-]+#[\w./-]*[\w/])/g;
|
|
5
|
+
/** The hast property a `[[ref]]` carries on its `<span>`; react-markdown hands it to the `span` override. */
|
|
6
|
+
var KNOWLEDGE_REF_PROPERTY = "dataKnowledgeRef";
|
|
7
|
+
/** Set to `'bare'` on a ref written without `[[ ]]`: it only looks like an address, so a host links it once the page resolves. */
|
|
8
|
+
var KNOWLEDGE_BARE_PROPERTY = "dataKnowledgeBare";
|
|
9
|
+
/**
|
|
10
|
+
* A remark plugin that turns each `[[ref]]` in markdown prose into `<span data-knowledge-ref="ref">ref</span>`,
|
|
11
|
+
* for a `span` override to draw as a page link. It only splits text nodes, so code, inline code and
|
|
12
|
+
* existing links are left alone, and the ref stays text: nothing in a body becomes markup.
|
|
13
|
+
*/
|
|
14
|
+
function remarkKnowledgeLinks() {
|
|
15
|
+
return (tree) => {
|
|
16
|
+
visit(tree, WIKILINK);
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
/** `remarkKnowledgeLinks` for chat prose, where a model also writes a page's address bare. */
|
|
20
|
+
function remarkKnowledgeChatLinks() {
|
|
21
|
+
return (tree) => {
|
|
22
|
+
visit(tree, WIKILINK_OR_ADDRESS);
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
function visit(node, pattern) {
|
|
26
|
+
if (node.type === "link" || node.type === "linkReference") return;
|
|
27
|
+
const children = [];
|
|
28
|
+
let changed = false;
|
|
29
|
+
for (const child of node.children) {
|
|
30
|
+
if (child.type === "text") {
|
|
31
|
+
const split = splitText(child, pattern);
|
|
32
|
+
if (split) {
|
|
33
|
+
children.push(...split);
|
|
34
|
+
changed = true;
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
} else if ("children" in child) visit(child, pattern);
|
|
38
|
+
children.push(child);
|
|
39
|
+
}
|
|
40
|
+
if (changed) node.children = children;
|
|
41
|
+
}
|
|
42
|
+
function splitText(node, pattern) {
|
|
43
|
+
const { value } = node;
|
|
44
|
+
const parts = [];
|
|
45
|
+
let last = 0;
|
|
46
|
+
for (const match of value.matchAll(pattern)) {
|
|
47
|
+
const ref = match[1] ?? match[2] ?? "";
|
|
48
|
+
const bare = match[1] === void 0;
|
|
49
|
+
if (match.index > last) parts.push({
|
|
50
|
+
type: "text",
|
|
51
|
+
value: value.slice(last, match.index)
|
|
52
|
+
});
|
|
53
|
+
parts.push({
|
|
54
|
+
type: "emphasis",
|
|
55
|
+
data: {
|
|
56
|
+
hName: "span",
|
|
57
|
+
hProperties: {
|
|
58
|
+
[KNOWLEDGE_REF_PROPERTY]: ref,
|
|
59
|
+
...bare ? { [KNOWLEDGE_BARE_PROPERTY]: "bare" } : {}
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
children: [{
|
|
63
|
+
type: "text",
|
|
64
|
+
value: ref
|
|
65
|
+
}]
|
|
66
|
+
});
|
|
67
|
+
last = match.index + match[0].length;
|
|
68
|
+
}
|
|
69
|
+
if (last === 0) return null;
|
|
70
|
+
if (last < value.length) parts.push({
|
|
71
|
+
type: "text",
|
|
72
|
+
value: value.slice(last)
|
|
73
|
+
});
|
|
74
|
+
return parts;
|
|
75
|
+
}
|
|
76
|
+
export { KNOWLEDGE_BARE_PROPERTY, KNOWLEDGE_REF_PROPERTY, remarkKnowledgeChatLinks, remarkKnowledgeLinks };
|
|
77
|
+
|
|
78
|
+
//# sourceMappingURL=remarkKnowledgeLinks.es.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remarkKnowledgeLinks.es.js","names":[],"sources":["../../../../src/domains/knowledge/lib/remarkKnowledgeLinks.ts"],"sourcesContent":["import type { Parent, PhrasingContent, Root, Text } from 'mdast';\n\nconst WIKILINK = /\\[\\[([^\\]]+)\\]\\]/g;\n/** `[[ref]]`, or a bare `type:value#path` address such as `docs:mastra#guides/memory` (never a URL or an email). */\nconst WIKILINK_OR_ADDRESS = /\\[\\[([^\\]]+)\\]\\]|(?<![\\w:/#@.-])([a-z][\\w-]*:[\\w.-]+#[\\w./-]*[\\w/])/g;\n\n/** The hast property a `[[ref]]` carries on its `<span>`; react-markdown hands it to the `span` override. */\nexport const KNOWLEDGE_REF_PROPERTY = 'dataKnowledgeRef';\n/** Set to `'bare'` on a ref written without `[[ ]]`: it only looks like an address, so a host links it once the page resolves. */\nexport const KNOWLEDGE_BARE_PROPERTY = 'dataKnowledgeBare';\n\n/**\n * A remark plugin that turns each `[[ref]]` in markdown prose into `<span data-knowledge-ref=\"ref\">ref</span>`,\n * for a `span` override to draw as a page link. It only splits text nodes, so code, inline code and\n * existing links are left alone, and the ref stays text: nothing in a body becomes markup.\n */\nexport function remarkKnowledgeLinks() {\n return (tree: Root) => {\n visit(tree, WIKILINK);\n };\n}\n\n/** `remarkKnowledgeLinks` for chat prose, where a model also writes a page's address bare. */\nexport function remarkKnowledgeChatLinks() {\n return (tree: Root) => {\n visit(tree, WIKILINK_OR_ADDRESS);\n };\n}\n\nfunction visit(node: Parent, pattern: RegExp) {\n if (node.type === 'link' || node.type === 'linkReference') return;\n const children: Parent['children'] = [];\n let changed = false;\n for (const child of node.children) {\n if (child.type === 'text') {\n const split = splitText(child, pattern);\n if (split) {\n children.push(...split);\n changed = true;\n continue;\n }\n } else if ('children' in child) {\n visit(child, pattern);\n }\n children.push(child);\n }\n if (changed) node.children = children;\n}\n\nfunction splitText(node: Text, pattern: RegExp): PhrasingContent[] | null {\n const { value } = node;\n const parts: PhrasingContent[] = [];\n let last = 0;\n for (const match of value.matchAll(pattern)) {\n const ref = match[1] ?? match[2] ?? '';\n const bare = match[1] === undefined;\n if (match.index > last) parts.push({ type: 'text', value: value.slice(last, match.index) });\n parts.push({\n type: 'emphasis',\n data: {\n hName: 'span',\n hProperties: { [KNOWLEDGE_REF_PROPERTY]: ref, ...(bare ? { [KNOWLEDGE_BARE_PROPERTY]: 'bare' } : {}) },\n },\n children: [{ type: 'text', value: ref }],\n });\n last = match.index + match[0].length;\n }\n if (last === 0) return null;\n if (last < value.length) parts.push({ type: 'text', value: value.slice(last) });\n return parts;\n}\n"],"mappings":";AAEA,IAAM,WAAW;;AAEjB,IAAM,sBAAsB;;AAG5B,IAAa,yBAAyB;;AAEtC,IAAa,0BAA0B;;;;;;AAOvC,SAAgB,uBAAuB;CACrC,QAAQ,SAAe;EACrB,MAAM,MAAM,QAAQ;CACtB;AACF;;AAGA,SAAgB,2BAA2B;CACzC,QAAQ,SAAe;EACrB,MAAM,MAAM,mBAAmB;CACjC;AACF;AAEA,SAAS,MAAM,MAAc,SAAiB;CAC5C,IAAI,KAAK,SAAS,UAAU,KAAK,SAAS,iBAAiB;CAC3D,MAAM,WAA+B,CAAC;CACtC,IAAI,UAAU;CACd,KAAK,MAAM,SAAS,KAAK,UAAU;EACjC,IAAI,MAAM,SAAS,QAAQ;GACzB,MAAM,QAAQ,UAAU,OAAO,OAAO;GACtC,IAAI,OAAO;IACT,SAAS,KAAK,GAAG,KAAK;IACtB,UAAU;IACV;GACF;EACF,OAAO,IAAI,cAAc,OACvB,MAAM,OAAO,OAAO;EAEtB,SAAS,KAAK,KAAK;CACrB;CACA,IAAI,SAAS,KAAK,WAAW;AAC/B;AAEA,SAAS,UAAU,MAAY,SAA2C;CACxE,MAAM,EAAE,UAAU;CAClB,MAAM,QAA2B,CAAC;CAClC,IAAI,OAAO;CACX,KAAK,MAAM,SAAS,MAAM,SAAS,OAAO,GAAG;EAC3C,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM;EACpC,MAAM,OAAO,MAAM,OAAO,KAAA;EAC1B,IAAI,MAAM,QAAQ,MAAM,MAAM,KAAK;GAAE,MAAM;GAAQ,OAAO,MAAM,MAAM,MAAM,MAAM,KAAK;EAAE,CAAC;EAC1F,MAAM,KAAK;GACT,MAAM;GACN,MAAM;IACJ,OAAO;IACP,aAAa;MAAG,yBAAyB;KAAK,GAAI,OAAO,GAAG,0BAA0B,OAAO,IAAI,CAAC;IAAG;GACvG;GACA,UAAU,CAAC;IAAE,MAAM;IAAQ,OAAO;GAAI,CAAC;EACzC,CAAC;EACD,OAAO,MAAM,QAAQ,MAAM,EAAE,CAAC;CAChC;CACA,IAAI,SAAS,GAAG,OAAO;CACvB,IAAI,OAAO,MAAM,QAAQ,MAAM,KAAK;EAAE,MAAM;EAAQ,OAAO,MAAM,MAAM,IAAI;CAAE,CAAC;CAC9E,OAAO;AACT"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
// src/domains/knowledge/lib/tooltipSide.ts
|
|
3
|
+
/** Sides in the order they win a tie: above is the one people expect. */
|
|
4
|
+
var SIDES = [
|
|
5
|
+
"top",
|
|
6
|
+
"bottom",
|
|
7
|
+
"right",
|
|
8
|
+
"left"
|
|
9
|
+
];
|
|
10
|
+
/** Where the tooltip would sit on a side of the dot, centred on it. */
|
|
11
|
+
function tooltipBox(side, { dot, tip, gap }) {
|
|
12
|
+
const centerX = (dot.left + dot.right) / 2;
|
|
13
|
+
const centerY = (dot.top + dot.bottom) / 2;
|
|
14
|
+
if (side === "top") return {
|
|
15
|
+
left: centerX - tip.width / 2,
|
|
16
|
+
right: centerX + tip.width / 2,
|
|
17
|
+
bottom: dot.top - gap,
|
|
18
|
+
top: dot.top - gap - tip.height
|
|
19
|
+
};
|
|
20
|
+
if (side === "bottom") return {
|
|
21
|
+
left: centerX - tip.width / 2,
|
|
22
|
+
right: centerX + tip.width / 2,
|
|
23
|
+
top: dot.bottom + gap,
|
|
24
|
+
bottom: dot.bottom + gap + tip.height
|
|
25
|
+
};
|
|
26
|
+
if (side === "left") return {
|
|
27
|
+
right: dot.left - gap,
|
|
28
|
+
left: dot.left - gap - tip.width,
|
|
29
|
+
top: centerY - tip.height / 2,
|
|
30
|
+
bottom: centerY + tip.height / 2
|
|
31
|
+
};
|
|
32
|
+
return {
|
|
33
|
+
left: dot.right + gap,
|
|
34
|
+
right: dot.right + gap + tip.width,
|
|
35
|
+
top: centerY - tip.height / 2,
|
|
36
|
+
bottom: centerY + tip.height / 2
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
function overlap(a, b) {
|
|
40
|
+
const width = Math.min(a.right, b.right) - Math.max(a.left, b.left);
|
|
41
|
+
const height = Math.min(a.bottom, b.bottom) - Math.max(a.top, b.top);
|
|
42
|
+
return width > 0 && height > 0 ? width * height : 0;
|
|
43
|
+
}
|
|
44
|
+
/** Whether a line passes through the box, by sampling along it. */
|
|
45
|
+
function crosses(box, from, to) {
|
|
46
|
+
const steps = Math.max(4, Math.ceil(Math.hypot(to.x - from.x, to.y - from.y) / 6));
|
|
47
|
+
for (let step = 0; step <= steps; step++) {
|
|
48
|
+
const x = from.x + (to.x - from.x) * step / steps;
|
|
49
|
+
const y = from.y + (to.y - from.y) * step / steps;
|
|
50
|
+
if (x >= box.left && x <= box.right && y >= box.top && y <= box.bottom) return true;
|
|
51
|
+
}
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Picks the side of the dot whose tooltip covers the least: leaving the bounds costs most, then covering a
|
|
56
|
+
* line, then covering a page. With nothing in the way (or nothing measured) it stays above.
|
|
57
|
+
*/
|
|
58
|
+
function chooseTooltipSide(input) {
|
|
59
|
+
const area = (box) => (box.right - box.left) * (box.bottom - box.top);
|
|
60
|
+
let best = "top";
|
|
61
|
+
let bestCost = Number.POSITIVE_INFINITY;
|
|
62
|
+
for (const side of SIDES) {
|
|
63
|
+
const box = tooltipBox(side, input);
|
|
64
|
+
let cost = (area(box) - overlap(box, input.bounds)) * 100;
|
|
65
|
+
for (const obstacle of input.obstacles) cost += overlap(box, obstacle) * 4;
|
|
66
|
+
for (const line of input.lines) if (crosses(box, line.from, line.to)) cost += 2e3;
|
|
67
|
+
if (cost < bestCost) {
|
|
68
|
+
best = side;
|
|
69
|
+
bestCost = cost;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return best;
|
|
73
|
+
}
|
|
74
|
+
exports.chooseTooltipSide = chooseTooltipSide;
|
|
75
|
+
exports.tooltipBox = tooltipBox;
|
|
76
|
+
|
|
77
|
+
//# sourceMappingURL=tooltipSide.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tooltipSide.cjs.js","names":[],"sources":["../../../../src/domains/knowledge/lib/tooltipSide.ts"],"sourcesContent":["export interface Box {\n left: number;\n top: number;\n right: number;\n bottom: number;\n}\n\nexport type TooltipSide = 'top' | 'bottom' | 'right' | 'left';\n\nexport interface TooltipPlacementInput {\n /** The hovered dot, in the same coordinates as everything else (the screen). */\n dot: Box;\n /** The tooltip's size once drawn. */\n tip: { width: number; height: number };\n /** Space between the dot and the tooltip. */\n gap: number;\n /** The tooltip must stay inside this. */\n bounds: Box;\n /** Things the tooltip must not cover: the focused page, the hovered page's neighbours, the legend, buttons. */\n obstacles: readonly Box[];\n /** Lines it must not cover: the hovered page's highlighted edges, as endpoints. */\n lines: ReadonlyArray<{ from: { x: number; y: number }; to: { x: number; y: number } }>;\n}\n\n/** Sides in the order they win a tie: above is the one people expect. */\nconst SIDES: TooltipSide[] = ['top', 'bottom', 'right', 'left'];\n\n/** Where the tooltip would sit on a side of the dot, centred on it. */\nexport function tooltipBox(\n side: TooltipSide,\n { dot, tip, gap }: Pick<TooltipPlacementInput, 'dot' | 'tip' | 'gap'>,\n): Box {\n const centerX = (dot.left + dot.right) / 2;\n const centerY = (dot.top + dot.bottom) / 2;\n if (side === 'top')\n return {\n left: centerX - tip.width / 2,\n right: centerX + tip.width / 2,\n bottom: dot.top - gap,\n top: dot.top - gap - tip.height,\n };\n if (side === 'bottom')\n return {\n left: centerX - tip.width / 2,\n right: centerX + tip.width / 2,\n top: dot.bottom + gap,\n bottom: dot.bottom + gap + tip.height,\n };\n if (side === 'left')\n return {\n right: dot.left - gap,\n left: dot.left - gap - tip.width,\n top: centerY - tip.height / 2,\n bottom: centerY + tip.height / 2,\n };\n return {\n left: dot.right + gap,\n right: dot.right + gap + tip.width,\n top: centerY - tip.height / 2,\n bottom: centerY + tip.height / 2,\n };\n}\n\nfunction overlap(a: Box, b: Box): number {\n const width = Math.min(a.right, b.right) - Math.max(a.left, b.left);\n const height = Math.min(a.bottom, b.bottom) - Math.max(a.top, b.top);\n return width > 0 && height > 0 ? width * height : 0;\n}\n\n/** Whether a line passes through the box, by sampling along it. */\nfunction crosses(box: Box, from: { x: number; y: number }, to: { x: number; y: number }): boolean {\n const steps = Math.max(4, Math.ceil(Math.hypot(to.x - from.x, to.y - from.y) / 6));\n for (let step = 0; step <= steps; step++) {\n const x = from.x + ((to.x - from.x) * step) / steps;\n const y = from.y + ((to.y - from.y) * step) / steps;\n if (x >= box.left && x <= box.right && y >= box.top && y <= box.bottom) return true;\n }\n return false;\n}\n\n/**\n * Picks the side of the dot whose tooltip covers the least: leaving the bounds costs most, then covering a\n * line, then covering a page. With nothing in the way (or nothing measured) it stays above.\n */\nexport function chooseTooltipSide(input: TooltipPlacementInput): TooltipSide {\n const area = (box: Box) => (box.right - box.left) * (box.bottom - box.top);\n let best: TooltipSide = 'top';\n let bestCost = Number.POSITIVE_INFINITY;\n for (const side of SIDES) {\n const box = tooltipBox(side, input);\n const outside = area(box) - overlap(box, input.bounds);\n let cost = outside * 100;\n for (const obstacle of input.obstacles) cost += overlap(box, obstacle) * 4;\n for (const line of input.lines) if (crosses(box, line.from, line.to)) cost += 2000;\n if (cost < bestCost) {\n best = side;\n bestCost = cost;\n }\n }\n return best;\n}\n"],"mappings":";;;AAyBA,IAAM,QAAuB;CAAC;CAAO;CAAU;CAAS;AAAM;;AAG9D,SAAgB,WACd,MACA,EAAE,KAAK,KAAK,OACP;CACL,MAAM,WAAW,IAAI,OAAO,IAAI,SAAS;CACzC,MAAM,WAAW,IAAI,MAAM,IAAI,UAAU;CACzC,IAAI,SAAS,OACX,OAAO;EACL,MAAM,UAAU,IAAI,QAAQ;EAC5B,OAAO,UAAU,IAAI,QAAQ;EAC7B,QAAQ,IAAI,MAAM;EAClB,KAAK,IAAI,MAAM,MAAM,IAAI;CAC3B;CACF,IAAI,SAAS,UACX,OAAO;EACL,MAAM,UAAU,IAAI,QAAQ;EAC5B,OAAO,UAAU,IAAI,QAAQ;EAC7B,KAAK,IAAI,SAAS;EAClB,QAAQ,IAAI,SAAS,MAAM,IAAI;CACjC;CACF,IAAI,SAAS,QACX,OAAO;EACL,OAAO,IAAI,OAAO;EAClB,MAAM,IAAI,OAAO,MAAM,IAAI;EAC3B,KAAK,UAAU,IAAI,SAAS;EAC5B,QAAQ,UAAU,IAAI,SAAS;CACjC;CACF,OAAO;EACL,MAAM,IAAI,QAAQ;EAClB,OAAO,IAAI,QAAQ,MAAM,IAAI;EAC7B,KAAK,UAAU,IAAI,SAAS;EAC5B,QAAQ,UAAU,IAAI,SAAS;CACjC;AACF;AAEA,SAAS,QAAQ,GAAQ,GAAgB;CACvC,MAAM,QAAQ,KAAK,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,KAAK,IAAI,EAAE,MAAM,EAAE,IAAI;CAClE,MAAM,SAAS,KAAK,IAAI,EAAE,QAAQ,EAAE,MAAM,IAAI,KAAK,IAAI,EAAE,KAAK,EAAE,GAAG;CACnE,OAAO,QAAQ,KAAK,SAAS,IAAI,QAAQ,SAAS;AACpD;;AAGA,SAAS,QAAQ,KAAU,MAAgC,IAAuC;CAChG,MAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,KAAK,KAAK,MAAM,GAAG,IAAI,KAAK,GAAG,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC;CACjF,KAAK,IAAI,OAAO,GAAG,QAAQ,OAAO,QAAQ;EACxC,MAAM,IAAI,KAAK,KAAM,GAAG,IAAI,KAAK,KAAK,OAAQ;EAC9C,MAAM,IAAI,KAAK,KAAM,GAAG,IAAI,KAAK,KAAK,OAAQ;EAC9C,IAAI,KAAK,IAAI,QAAQ,KAAK,IAAI,SAAS,KAAK,IAAI,OAAO,KAAK,IAAI,QAAQ,OAAO;CACjF;CACA,OAAO;AACT;;;;;AAMA,SAAgB,kBAAkB,OAA2C;CAC3E,MAAM,QAAQ,SAAc,IAAI,QAAQ,IAAI,SAAS,IAAI,SAAS,IAAI;CACtE,IAAI,OAAoB;CACxB,IAAI,WAAW,OAAO;CACtB,KAAK,MAAM,QAAQ,OAAO;EACxB,MAAM,MAAM,WAAW,MAAM,KAAK;EAElC,IAAI,QADY,KAAK,GAAG,IAAI,QAAQ,KAAK,MAAM,MAAM,KAChC;EACrB,KAAK,MAAM,YAAY,MAAM,WAAW,QAAQ,QAAQ,KAAK,QAAQ,IAAI;EACzE,KAAK,MAAM,QAAQ,MAAM,OAAO,IAAI,QAAQ,KAAK,KAAK,MAAM,KAAK,EAAE,GAAG,QAAQ;EAC9E,IAAI,OAAO,UAAU;GACnB,OAAO;GACP,WAAW;EACb;CACF;CACA,OAAO;AACT"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from '../../../src/domains/knowledge/lib/tooltipSide';
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
// src/domains/knowledge/lib/tooltipSide.ts
|
|
2
|
+
/** Sides in the order they win a tie: above is the one people expect. */
|
|
3
|
+
var SIDES = [
|
|
4
|
+
"top",
|
|
5
|
+
"bottom",
|
|
6
|
+
"right",
|
|
7
|
+
"left"
|
|
8
|
+
];
|
|
9
|
+
/** Where the tooltip would sit on a side of the dot, centred on it. */
|
|
10
|
+
function tooltipBox(side, { dot, tip, gap }) {
|
|
11
|
+
const centerX = (dot.left + dot.right) / 2;
|
|
12
|
+
const centerY = (dot.top + dot.bottom) / 2;
|
|
13
|
+
if (side === "top") return {
|
|
14
|
+
left: centerX - tip.width / 2,
|
|
15
|
+
right: centerX + tip.width / 2,
|
|
16
|
+
bottom: dot.top - gap,
|
|
17
|
+
top: dot.top - gap - tip.height
|
|
18
|
+
};
|
|
19
|
+
if (side === "bottom") return {
|
|
20
|
+
left: centerX - tip.width / 2,
|
|
21
|
+
right: centerX + tip.width / 2,
|
|
22
|
+
top: dot.bottom + gap,
|
|
23
|
+
bottom: dot.bottom + gap + tip.height
|
|
24
|
+
};
|
|
25
|
+
if (side === "left") return {
|
|
26
|
+
right: dot.left - gap,
|
|
27
|
+
left: dot.left - gap - tip.width,
|
|
28
|
+
top: centerY - tip.height / 2,
|
|
29
|
+
bottom: centerY + tip.height / 2
|
|
30
|
+
};
|
|
31
|
+
return {
|
|
32
|
+
left: dot.right + gap,
|
|
33
|
+
right: dot.right + gap + tip.width,
|
|
34
|
+
top: centerY - tip.height / 2,
|
|
35
|
+
bottom: centerY + tip.height / 2
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
function overlap(a, b) {
|
|
39
|
+
const width = Math.min(a.right, b.right) - Math.max(a.left, b.left);
|
|
40
|
+
const height = Math.min(a.bottom, b.bottom) - Math.max(a.top, b.top);
|
|
41
|
+
return width > 0 && height > 0 ? width * height : 0;
|
|
42
|
+
}
|
|
43
|
+
/** Whether a line passes through the box, by sampling along it. */
|
|
44
|
+
function crosses(box, from, to) {
|
|
45
|
+
const steps = Math.max(4, Math.ceil(Math.hypot(to.x - from.x, to.y - from.y) / 6));
|
|
46
|
+
for (let step = 0; step <= steps; step++) {
|
|
47
|
+
const x = from.x + (to.x - from.x) * step / steps;
|
|
48
|
+
const y = from.y + (to.y - from.y) * step / steps;
|
|
49
|
+
if (x >= box.left && x <= box.right && y >= box.top && y <= box.bottom) return true;
|
|
50
|
+
}
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Picks the side of the dot whose tooltip covers the least: leaving the bounds costs most, then covering a
|
|
55
|
+
* line, then covering a page. With nothing in the way (or nothing measured) it stays above.
|
|
56
|
+
*/
|
|
57
|
+
function chooseTooltipSide(input) {
|
|
58
|
+
const area = (box) => (box.right - box.left) * (box.bottom - box.top);
|
|
59
|
+
let best = "top";
|
|
60
|
+
let bestCost = Number.POSITIVE_INFINITY;
|
|
61
|
+
for (const side of SIDES) {
|
|
62
|
+
const box = tooltipBox(side, input);
|
|
63
|
+
let cost = (area(box) - overlap(box, input.bounds)) * 100;
|
|
64
|
+
for (const obstacle of input.obstacles) cost += overlap(box, obstacle) * 4;
|
|
65
|
+
for (const line of input.lines) if (crosses(box, line.from, line.to)) cost += 2e3;
|
|
66
|
+
if (cost < bestCost) {
|
|
67
|
+
best = side;
|
|
68
|
+
bestCost = cost;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return best;
|
|
72
|
+
}
|
|
73
|
+
export { chooseTooltipSide, tooltipBox };
|
|
74
|
+
|
|
75
|
+
//# sourceMappingURL=tooltipSide.es.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tooltipSide.es.js","names":[],"sources":["../../../../src/domains/knowledge/lib/tooltipSide.ts"],"sourcesContent":["export interface Box {\n left: number;\n top: number;\n right: number;\n bottom: number;\n}\n\nexport type TooltipSide = 'top' | 'bottom' | 'right' | 'left';\n\nexport interface TooltipPlacementInput {\n /** The hovered dot, in the same coordinates as everything else (the screen). */\n dot: Box;\n /** The tooltip's size once drawn. */\n tip: { width: number; height: number };\n /** Space between the dot and the tooltip. */\n gap: number;\n /** The tooltip must stay inside this. */\n bounds: Box;\n /** Things the tooltip must not cover: the focused page, the hovered page's neighbours, the legend, buttons. */\n obstacles: readonly Box[];\n /** Lines it must not cover: the hovered page's highlighted edges, as endpoints. */\n lines: ReadonlyArray<{ from: { x: number; y: number }; to: { x: number; y: number } }>;\n}\n\n/** Sides in the order they win a tie: above is the one people expect. */\nconst SIDES: TooltipSide[] = ['top', 'bottom', 'right', 'left'];\n\n/** Where the tooltip would sit on a side of the dot, centred on it. */\nexport function tooltipBox(\n side: TooltipSide,\n { dot, tip, gap }: Pick<TooltipPlacementInput, 'dot' | 'tip' | 'gap'>,\n): Box {\n const centerX = (dot.left + dot.right) / 2;\n const centerY = (dot.top + dot.bottom) / 2;\n if (side === 'top')\n return {\n left: centerX - tip.width / 2,\n right: centerX + tip.width / 2,\n bottom: dot.top - gap,\n top: dot.top - gap - tip.height,\n };\n if (side === 'bottom')\n return {\n left: centerX - tip.width / 2,\n right: centerX + tip.width / 2,\n top: dot.bottom + gap,\n bottom: dot.bottom + gap + tip.height,\n };\n if (side === 'left')\n return {\n right: dot.left - gap,\n left: dot.left - gap - tip.width,\n top: centerY - tip.height / 2,\n bottom: centerY + tip.height / 2,\n };\n return {\n left: dot.right + gap,\n right: dot.right + gap + tip.width,\n top: centerY - tip.height / 2,\n bottom: centerY + tip.height / 2,\n };\n}\n\nfunction overlap(a: Box, b: Box): number {\n const width = Math.min(a.right, b.right) - Math.max(a.left, b.left);\n const height = Math.min(a.bottom, b.bottom) - Math.max(a.top, b.top);\n return width > 0 && height > 0 ? width * height : 0;\n}\n\n/** Whether a line passes through the box, by sampling along it. */\nfunction crosses(box: Box, from: { x: number; y: number }, to: { x: number; y: number }): boolean {\n const steps = Math.max(4, Math.ceil(Math.hypot(to.x - from.x, to.y - from.y) / 6));\n for (let step = 0; step <= steps; step++) {\n const x = from.x + ((to.x - from.x) * step) / steps;\n const y = from.y + ((to.y - from.y) * step) / steps;\n if (x >= box.left && x <= box.right && y >= box.top && y <= box.bottom) return true;\n }\n return false;\n}\n\n/**\n * Picks the side of the dot whose tooltip covers the least: leaving the bounds costs most, then covering a\n * line, then covering a page. With nothing in the way (or nothing measured) it stays above.\n */\nexport function chooseTooltipSide(input: TooltipPlacementInput): TooltipSide {\n const area = (box: Box) => (box.right - box.left) * (box.bottom - box.top);\n let best: TooltipSide = 'top';\n let bestCost = Number.POSITIVE_INFINITY;\n for (const side of SIDES) {\n const box = tooltipBox(side, input);\n const outside = area(box) - overlap(box, input.bounds);\n let cost = outside * 100;\n for (const obstacle of input.obstacles) cost += overlap(box, obstacle) * 4;\n for (const line of input.lines) if (crosses(box, line.from, line.to)) cost += 2000;\n if (cost < bestCost) {\n best = side;\n bestCost = cost;\n }\n }\n return best;\n}\n"],"mappings":";;AAyBA,IAAM,QAAuB;CAAC;CAAO;CAAU;CAAS;AAAM;;AAG9D,SAAgB,WACd,MACA,EAAE,KAAK,KAAK,OACP;CACL,MAAM,WAAW,IAAI,OAAO,IAAI,SAAS;CACzC,MAAM,WAAW,IAAI,MAAM,IAAI,UAAU;CACzC,IAAI,SAAS,OACX,OAAO;EACL,MAAM,UAAU,IAAI,QAAQ;EAC5B,OAAO,UAAU,IAAI,QAAQ;EAC7B,QAAQ,IAAI,MAAM;EAClB,KAAK,IAAI,MAAM,MAAM,IAAI;CAC3B;CACF,IAAI,SAAS,UACX,OAAO;EACL,MAAM,UAAU,IAAI,QAAQ;EAC5B,OAAO,UAAU,IAAI,QAAQ;EAC7B,KAAK,IAAI,SAAS;EAClB,QAAQ,IAAI,SAAS,MAAM,IAAI;CACjC;CACF,IAAI,SAAS,QACX,OAAO;EACL,OAAO,IAAI,OAAO;EAClB,MAAM,IAAI,OAAO,MAAM,IAAI;EAC3B,KAAK,UAAU,IAAI,SAAS;EAC5B,QAAQ,UAAU,IAAI,SAAS;CACjC;CACF,OAAO;EACL,MAAM,IAAI,QAAQ;EAClB,OAAO,IAAI,QAAQ,MAAM,IAAI;EAC7B,KAAK,UAAU,IAAI,SAAS;EAC5B,QAAQ,UAAU,IAAI,SAAS;CACjC;AACF;AAEA,SAAS,QAAQ,GAAQ,GAAgB;CACvC,MAAM,QAAQ,KAAK,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,KAAK,IAAI,EAAE,MAAM,EAAE,IAAI;CAClE,MAAM,SAAS,KAAK,IAAI,EAAE,QAAQ,EAAE,MAAM,IAAI,KAAK,IAAI,EAAE,KAAK,EAAE,GAAG;CACnE,OAAO,QAAQ,KAAK,SAAS,IAAI,QAAQ,SAAS;AACpD;;AAGA,SAAS,QAAQ,KAAU,MAAgC,IAAuC;CAChG,MAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,KAAK,KAAK,MAAM,GAAG,IAAI,KAAK,GAAG,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC;CACjF,KAAK,IAAI,OAAO,GAAG,QAAQ,OAAO,QAAQ;EACxC,MAAM,IAAI,KAAK,KAAM,GAAG,IAAI,KAAK,KAAK,OAAQ;EAC9C,MAAM,IAAI,KAAK,KAAM,GAAG,IAAI,KAAK,KAAK,OAAQ;EAC9C,IAAI,KAAK,IAAI,QAAQ,KAAK,IAAI,SAAS,KAAK,IAAI,OAAO,KAAK,IAAI,QAAQ,OAAO;CACjF;CACA,OAAO;AACT;;;;;AAMA,SAAgB,kBAAkB,OAA2C;CAC3E,MAAM,QAAQ,SAAc,IAAI,QAAQ,IAAI,SAAS,IAAI,SAAS,IAAI;CACtE,IAAI,OAAoB;CACxB,IAAI,WAAW,OAAO;CACtB,KAAK,MAAM,QAAQ,OAAO;EACxB,MAAM,MAAM,WAAW,MAAM,KAAK;EAElC,IAAI,QADY,KAAK,GAAG,IAAI,QAAQ,KAAK,MAAM,MAAM,KAChC;EACrB,KAAK,MAAM,YAAY,MAAM,WAAW,QAAQ,QAAQ,KAAK,QAAQ,IAAI;EACzE,KAAK,MAAM,QAAQ,MAAM,OAAO,IAAI,QAAQ,KAAK,KAAK,MAAM,KAAK,EAAE,GAAG,QAAQ;EAC9E,IAAI,OAAO,UAAU;GACnB,OAAO;GACP,WAAW;EACb;CACF;CACA,OAAO;AACT"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
let react = require("react");
|
|
3
|
+
// src/domains/knowledge/lib/useLeavingNodes.ts
|
|
4
|
+
/** How long a view change takes: nodes glide, resize and fade over this. */
|
|
5
|
+
var KNOWLEDGE_GRAPH_TRANSITION_MS = 700;
|
|
6
|
+
/** Whether the person has not asked the system to cut motion. Without `matchMedia` (a test DOM) nothing animates. */
|
|
7
|
+
function prefersMotion() {
|
|
8
|
+
return typeof window !== "undefined" && !!window.matchMedia?.("(prefers-reduced-motion: no-preference)").matches;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* The nodes plus, for one transition after a view change, the nodes that just left: drawn where they were,
|
|
12
|
+
* then faded out, so a page that is not in the next view fades instead of vanishing. With `enabled` false
|
|
13
|
+
* (reduced motion) it returns the nodes untouched.
|
|
14
|
+
*/
|
|
15
|
+
function useLeavingNodes(nodes, enabled) {
|
|
16
|
+
const key = nodes.map((node) => node.id).join("\0");
|
|
17
|
+
const [previousKey, setPreviousKey] = (0, react.useState)(key);
|
|
18
|
+
const [ghosts, setGhosts] = (0, react.useState)([]);
|
|
19
|
+
const lastNodes = (0, react.useRef)(nodes);
|
|
20
|
+
(0, react.useEffect)(() => {
|
|
21
|
+
lastNodes.current = nodes;
|
|
22
|
+
});
|
|
23
|
+
if (previousKey !== key) {
|
|
24
|
+
setPreviousKey(key);
|
|
25
|
+
if (enabled) {
|
|
26
|
+
const present = new Set(nodes.map((node) => node.id));
|
|
27
|
+
const gone = lastNodes.current.filter((node) => !present.has(node.id));
|
|
28
|
+
setGhosts((current) => [...current.filter((ghost) => !present.has(ghost.node.id)), ...gone.filter((node) => !current.some((ghost) => ghost.node.id === node.id)).map((node) => ({
|
|
29
|
+
node,
|
|
30
|
+
fading: false
|
|
31
|
+
}))]);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
const waiting = ghosts.some((ghost) => !ghost.fading);
|
|
35
|
+
const removal = (0, react.useRef)(void 0);
|
|
36
|
+
(0, react.useEffect)(() => {
|
|
37
|
+
if (!waiting) return;
|
|
38
|
+
const frame = requestAnimationFrame(() => {
|
|
39
|
+
setGhosts((current) => current.map((ghost) => ({
|
|
40
|
+
...ghost,
|
|
41
|
+
fading: true
|
|
42
|
+
})));
|
|
43
|
+
clearTimeout(removal.current);
|
|
44
|
+
removal.current = setTimeout(() => setGhosts((current) => current.filter((ghost) => !ghost.fading)), 750);
|
|
45
|
+
});
|
|
46
|
+
return () => cancelAnimationFrame(frame);
|
|
47
|
+
}, [waiting, ghosts.length]);
|
|
48
|
+
(0, react.useEffect)(() => () => clearTimeout(removal.current), []);
|
|
49
|
+
if (!enabled || ghosts.length === 0) return nodes;
|
|
50
|
+
return [...nodes, ...ghosts.map(({ node, fading }) => ({
|
|
51
|
+
...node,
|
|
52
|
+
selectable: false,
|
|
53
|
+
focusable: false,
|
|
54
|
+
style: {
|
|
55
|
+
...node.style,
|
|
56
|
+
opacity: fading ? 0 : 1,
|
|
57
|
+
pointerEvents: "none"
|
|
58
|
+
}
|
|
59
|
+
}))];
|
|
60
|
+
}
|
|
61
|
+
exports.KNOWLEDGE_GRAPH_TRANSITION_MS = KNOWLEDGE_GRAPH_TRANSITION_MS;
|
|
62
|
+
exports.prefersMotion = prefersMotion;
|
|
63
|
+
exports.useLeavingNodes = useLeavingNodes;
|
|
64
|
+
|
|
65
|
+
//# sourceMappingURL=useLeavingNodes.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useLeavingNodes.cjs.js","names":["useState","useRef"],"sources":["../../../../src/domains/knowledge/lib/useLeavingNodes.ts"],"sourcesContent":["import type { CSSProperties } from 'react';\nimport { useEffect, useRef, useState } from 'react';\n\n/** How long a view change takes: nodes glide, resize and fade over this. */\nexport const KNOWLEDGE_GRAPH_TRANSITION_MS = 700;\n\n/** Whether the person has not asked the system to cut motion. Without `matchMedia` (a test DOM) nothing animates. */\nexport function prefersMotion(): boolean {\n return typeof window !== 'undefined' && !!window.matchMedia?.('(prefers-reduced-motion: no-preference)').matches;\n}\n\ninterface Ghost<N> {\n node: N;\n fading: boolean;\n}\n\n/**\n * The nodes plus, for one transition after a view change, the nodes that just left: drawn where they were,\n * then faded out, so a page that is not in the next view fades instead of vanishing. With `enabled` false\n * (reduced motion) it returns the nodes untouched.\n */\nexport function useLeavingNodes<N extends { id: string; style?: CSSProperties }>(nodes: N[], enabled: boolean): N[] {\n // The nodes are rebuilt on many renders, so a change of view is a change in which pages are drawn.\n const key = nodes.map(node => node.id).join('\\u0000');\n const [previousKey, setPreviousKey] = useState(key);\n const [ghosts, setGhosts] = useState<Ghost<N>[]>([]);\n const lastNodes = useRef(nodes);\n useEffect(() => {\n lastNodes.current = nodes;\n });\n // Adjusting state while rendering (not in an effect) keeps the leaving node from unmounting for a frame.\n if (previousKey !== key) {\n setPreviousKey(key);\n if (enabled) {\n const present = new Set(nodes.map(node => node.id));\n const gone = lastNodes.current.filter(node => !present.has(node.id));\n setGhosts(current => [\n ...current.filter(ghost => !present.has(ghost.node.id)),\n ...gone\n .filter(node => !current.some(ghost => ghost.node.id === node.id))\n .map(node => ({ node, fading: false })),\n ]);\n }\n }\n\n const waiting = ghosts.some(ghost => !ghost.fading);\n const removal = useRef<ReturnType<typeof setTimeout>>(undefined);\n useEffect(() => {\n if (!waiting) return;\n // One frame at full opacity, then the fade; the ghosts go once it has run.\n const frame = requestAnimationFrame(() => {\n setGhosts(current => current.map(ghost => ({ ...ghost, fading: true })));\n clearTimeout(removal.current);\n removal.current = setTimeout(\n () => setGhosts(current => current.filter(ghost => !ghost.fading)),\n KNOWLEDGE_GRAPH_TRANSITION_MS + 50,\n );\n });\n return () => cancelAnimationFrame(frame);\n }, [waiting, ghosts.length]);\n useEffect(() => () => clearTimeout(removal.current), []);\n\n if (!enabled || ghosts.length === 0) return nodes;\n return [\n ...nodes,\n ...ghosts.map(({ node, fading }) => ({\n ...node,\n selectable: false,\n focusable: false,\n style: { ...node.style, opacity: fading ? 0 : 1, pointerEvents: 'none' as const },\n })),\n ];\n}\n"],"mappings":";;;;AAIA,IAAa,gCAAgC;;AAG7C,SAAgB,gBAAyB;CACvC,OAAO,OAAO,WAAW,eAAe,CAAC,CAAC,OAAO,aAAa,yCAAyC,CAAC,CAAC;AAC3G;;;;;;AAYA,SAAgB,gBAAiE,OAAY,SAAuB;CAElH,MAAM,MAAM,MAAM,KAAI,SAAQ,KAAK,EAAE,CAAC,CAAC,KAAK,IAAQ;CACpD,MAAM,CAAC,aAAa,mBAAA,GAAkBA,MAAAA,SAAAA,CAAS,GAAG;CAClD,MAAM,CAAC,QAAQ,cAAA,GAAaA,MAAAA,SAAAA,CAAqB,CAAC,CAAC;CACnD,MAAM,aAAA,GAAYC,MAAAA,OAAAA,CAAO,KAAK;CAC9B,CAAA,GAAA,MAAA,UAAA,OAAgB;EACd,UAAU,UAAU;CACtB,CAAC;CAED,IAAI,gBAAgB,KAAK;EACvB,eAAe,GAAG;EAClB,IAAI,SAAS;GACX,MAAM,UAAU,IAAI,IAAI,MAAM,KAAI,SAAQ,KAAK,EAAE,CAAC;GAClD,MAAM,OAAO,UAAU,QAAQ,QAAO,SAAQ,CAAC,QAAQ,IAAI,KAAK,EAAE,CAAC;GACnE,WAAU,YAAW,CACnB,GAAG,QAAQ,QAAO,UAAS,CAAC,QAAQ,IAAI,MAAM,KAAK,EAAE,CAAC,GACtD,GAAG,KACA,QAAO,SAAQ,CAAC,QAAQ,MAAK,UAAS,MAAM,KAAK,OAAO,KAAK,EAAE,CAAC,CAAC,CACjE,KAAI,UAAS;IAAE;IAAM,QAAQ;GAAM,EAAE,CAC1C,CAAC;EACH;CACF;CAEA,MAAM,UAAU,OAAO,MAAK,UAAS,CAAC,MAAM,MAAM;CAClD,MAAM,WAAA,GAAUA,MAAAA,OAAAA,CAAsC,KAAA,CAAS;CAC/D,CAAA,GAAA,MAAA,UAAA,OAAgB;EACd,IAAI,CAAC,SAAS;EAEd,MAAM,QAAQ,4BAA4B;GACxC,WAAU,YAAW,QAAQ,KAAI,WAAU;IAAE,GAAG;IAAO,QAAQ;GAAK,EAAE,CAAC;GACvE,aAAa,QAAQ,OAAO;GAC5B,QAAQ,UAAU,iBACV,WAAU,YAAW,QAAQ,QAAO,UAAS,CAAC,MAAM,MAAM,CAAC,GACjE,GACF;EACF,CAAC;EACD,aAAa,qBAAqB,KAAK;CACzC,GAAG,CAAC,SAAS,OAAO,MAAM,CAAC;CAC3B,CAAA,GAAA,MAAA,UAAA,aAAsB,aAAa,QAAQ,OAAO,GAAG,CAAC,CAAC;CAEvD,IAAI,CAAC,WAAW,OAAO,WAAW,GAAG,OAAO;CAC5C,OAAO,CACL,GAAG,OACH,GAAG,OAAO,KAAK,EAAE,MAAM,cAAc;EACnC,GAAG;EACH,YAAY;EACZ,WAAW;EACX,OAAO;GAAE,GAAG,KAAK;GAAO,SAAS,SAAS,IAAI;GAAG,eAAe;EAAgB;CAClF,EAAE,CACJ;AACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from '../../../src/domains/knowledge/lib/useLeavingNodes';
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { useEffect, useRef, useState } from "react";
|
|
2
|
+
// src/domains/knowledge/lib/useLeavingNodes.ts
|
|
3
|
+
/** How long a view change takes: nodes glide, resize and fade over this. */
|
|
4
|
+
var KNOWLEDGE_GRAPH_TRANSITION_MS = 700;
|
|
5
|
+
/** Whether the person has not asked the system to cut motion. Without `matchMedia` (a test DOM) nothing animates. */
|
|
6
|
+
function prefersMotion() {
|
|
7
|
+
return typeof window !== "undefined" && !!window.matchMedia?.("(prefers-reduced-motion: no-preference)").matches;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* The nodes plus, for one transition after a view change, the nodes that just left: drawn where they were,
|
|
11
|
+
* then faded out, so a page that is not in the next view fades instead of vanishing. With `enabled` false
|
|
12
|
+
* (reduced motion) it returns the nodes untouched.
|
|
13
|
+
*/
|
|
14
|
+
function useLeavingNodes(nodes, enabled) {
|
|
15
|
+
const key = nodes.map((node) => node.id).join("\0");
|
|
16
|
+
const [previousKey, setPreviousKey] = useState(key);
|
|
17
|
+
const [ghosts, setGhosts] = useState([]);
|
|
18
|
+
const lastNodes = useRef(nodes);
|
|
19
|
+
useEffect(() => {
|
|
20
|
+
lastNodes.current = nodes;
|
|
21
|
+
});
|
|
22
|
+
if (previousKey !== key) {
|
|
23
|
+
setPreviousKey(key);
|
|
24
|
+
if (enabled) {
|
|
25
|
+
const present = new Set(nodes.map((node) => node.id));
|
|
26
|
+
const gone = lastNodes.current.filter((node) => !present.has(node.id));
|
|
27
|
+
setGhosts((current) => [...current.filter((ghost) => !present.has(ghost.node.id)), ...gone.filter((node) => !current.some((ghost) => ghost.node.id === node.id)).map((node) => ({
|
|
28
|
+
node,
|
|
29
|
+
fading: false
|
|
30
|
+
}))]);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
const waiting = ghosts.some((ghost) => !ghost.fading);
|
|
34
|
+
const removal = useRef(void 0);
|
|
35
|
+
useEffect(() => {
|
|
36
|
+
if (!waiting) return;
|
|
37
|
+
const frame = requestAnimationFrame(() => {
|
|
38
|
+
setGhosts((current) => current.map((ghost) => ({
|
|
39
|
+
...ghost,
|
|
40
|
+
fading: true
|
|
41
|
+
})));
|
|
42
|
+
clearTimeout(removal.current);
|
|
43
|
+
removal.current = setTimeout(() => setGhosts((current) => current.filter((ghost) => !ghost.fading)), 750);
|
|
44
|
+
});
|
|
45
|
+
return () => cancelAnimationFrame(frame);
|
|
46
|
+
}, [waiting, ghosts.length]);
|
|
47
|
+
useEffect(() => () => clearTimeout(removal.current), []);
|
|
48
|
+
if (!enabled || ghosts.length === 0) return nodes;
|
|
49
|
+
return [...nodes, ...ghosts.map(({ node, fading }) => ({
|
|
50
|
+
...node,
|
|
51
|
+
selectable: false,
|
|
52
|
+
focusable: false,
|
|
53
|
+
style: {
|
|
54
|
+
...node.style,
|
|
55
|
+
opacity: fading ? 0 : 1,
|
|
56
|
+
pointerEvents: "none"
|
|
57
|
+
}
|
|
58
|
+
}))];
|
|
59
|
+
}
|
|
60
|
+
export { KNOWLEDGE_GRAPH_TRANSITION_MS, prefersMotion, useLeavingNodes };
|
|
61
|
+
|
|
62
|
+
//# sourceMappingURL=useLeavingNodes.es.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useLeavingNodes.es.js","names":[],"sources":["../../../../src/domains/knowledge/lib/useLeavingNodes.ts"],"sourcesContent":["import type { CSSProperties } from 'react';\nimport { useEffect, useRef, useState } from 'react';\n\n/** How long a view change takes: nodes glide, resize and fade over this. */\nexport const KNOWLEDGE_GRAPH_TRANSITION_MS = 700;\n\n/** Whether the person has not asked the system to cut motion. Without `matchMedia` (a test DOM) nothing animates. */\nexport function prefersMotion(): boolean {\n return typeof window !== 'undefined' && !!window.matchMedia?.('(prefers-reduced-motion: no-preference)').matches;\n}\n\ninterface Ghost<N> {\n node: N;\n fading: boolean;\n}\n\n/**\n * The nodes plus, for one transition after a view change, the nodes that just left: drawn where they were,\n * then faded out, so a page that is not in the next view fades instead of vanishing. With `enabled` false\n * (reduced motion) it returns the nodes untouched.\n */\nexport function useLeavingNodes<N extends { id: string; style?: CSSProperties }>(nodes: N[], enabled: boolean): N[] {\n // The nodes are rebuilt on many renders, so a change of view is a change in which pages are drawn.\n const key = nodes.map(node => node.id).join('\\u0000');\n const [previousKey, setPreviousKey] = useState(key);\n const [ghosts, setGhosts] = useState<Ghost<N>[]>([]);\n const lastNodes = useRef(nodes);\n useEffect(() => {\n lastNodes.current = nodes;\n });\n // Adjusting state while rendering (not in an effect) keeps the leaving node from unmounting for a frame.\n if (previousKey !== key) {\n setPreviousKey(key);\n if (enabled) {\n const present = new Set(nodes.map(node => node.id));\n const gone = lastNodes.current.filter(node => !present.has(node.id));\n setGhosts(current => [\n ...current.filter(ghost => !present.has(ghost.node.id)),\n ...gone\n .filter(node => !current.some(ghost => ghost.node.id === node.id))\n .map(node => ({ node, fading: false })),\n ]);\n }\n }\n\n const waiting = ghosts.some(ghost => !ghost.fading);\n const removal = useRef<ReturnType<typeof setTimeout>>(undefined);\n useEffect(() => {\n if (!waiting) return;\n // One frame at full opacity, then the fade; the ghosts go once it has run.\n const frame = requestAnimationFrame(() => {\n setGhosts(current => current.map(ghost => ({ ...ghost, fading: true })));\n clearTimeout(removal.current);\n removal.current = setTimeout(\n () => setGhosts(current => current.filter(ghost => !ghost.fading)),\n KNOWLEDGE_GRAPH_TRANSITION_MS + 50,\n );\n });\n return () => cancelAnimationFrame(frame);\n }, [waiting, ghosts.length]);\n useEffect(() => () => clearTimeout(removal.current), []);\n\n if (!enabled || ghosts.length === 0) return nodes;\n return [\n ...nodes,\n ...ghosts.map(({ node, fading }) => ({\n ...node,\n selectable: false,\n focusable: false,\n style: { ...node.style, opacity: fading ? 0 : 1, pointerEvents: 'none' as const },\n })),\n ];\n}\n"],"mappings":";;;AAIA,IAAa,gCAAgC;;AAG7C,SAAgB,gBAAyB;CACvC,OAAO,OAAO,WAAW,eAAe,CAAC,CAAC,OAAO,aAAa,yCAAyC,CAAC,CAAC;AAC3G;;;;;;AAYA,SAAgB,gBAAiE,OAAY,SAAuB;CAElH,MAAM,MAAM,MAAM,KAAI,SAAQ,KAAK,EAAE,CAAC,CAAC,KAAK,IAAQ;CACpD,MAAM,CAAC,aAAa,kBAAkB,SAAS,GAAG;CAClD,MAAM,CAAC,QAAQ,aAAa,SAAqB,CAAC,CAAC;CACnD,MAAM,YAAY,OAAO,KAAK;CAC9B,gBAAgB;EACd,UAAU,UAAU;CACtB,CAAC;CAED,IAAI,gBAAgB,KAAK;EACvB,eAAe,GAAG;EAClB,IAAI,SAAS;GACX,MAAM,UAAU,IAAI,IAAI,MAAM,KAAI,SAAQ,KAAK,EAAE,CAAC;GAClD,MAAM,OAAO,UAAU,QAAQ,QAAO,SAAQ,CAAC,QAAQ,IAAI,KAAK,EAAE,CAAC;GACnE,WAAU,YAAW,CACnB,GAAG,QAAQ,QAAO,UAAS,CAAC,QAAQ,IAAI,MAAM,KAAK,EAAE,CAAC,GACtD,GAAG,KACA,QAAO,SAAQ,CAAC,QAAQ,MAAK,UAAS,MAAM,KAAK,OAAO,KAAK,EAAE,CAAC,CAAC,CACjE,KAAI,UAAS;IAAE;IAAM,QAAQ;GAAM,EAAE,CAC1C,CAAC;EACH;CACF;CAEA,MAAM,UAAU,OAAO,MAAK,UAAS,CAAC,MAAM,MAAM;CAClD,MAAM,UAAU,OAAsC,KAAA,CAAS;CAC/D,gBAAgB;EACd,IAAI,CAAC,SAAS;EAEd,MAAM,QAAQ,4BAA4B;GACxC,WAAU,YAAW,QAAQ,KAAI,WAAU;IAAE,GAAG;IAAO,QAAQ;GAAK,EAAE,CAAC;GACvE,aAAa,QAAQ,OAAO;GAC5B,QAAQ,UAAU,iBACV,WAAU,YAAW,QAAQ,QAAO,UAAS,CAAC,MAAM,MAAM,CAAC,GACjE,GACF;EACF,CAAC;EACD,aAAa,qBAAqB,KAAK;CACzC,GAAG,CAAC,SAAS,OAAO,MAAM,CAAC;CAC3B,sBAAsB,aAAa,QAAQ,OAAO,GAAG,CAAC,CAAC;CAEvD,IAAI,CAAC,WAAW,OAAO,WAAW,GAAG,OAAO;CAC5C,OAAO,CACL,GAAG,OACH,GAAG,OAAO,KAAK,EAAE,MAAM,cAAc;EACnC,GAAG;EACH,YAAY;EACZ,WAAW;EACX,OAAO;GAAE,GAAG,KAAK;GAAO,SAAS,SAAS,IAAI;GAAG,eAAe;EAAgB;CAClF,EAAE,CACJ;AACF"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
let react = require("react");
|
|
3
|
+
// src/domains/knowledge/lib/useStableWhile.ts
|
|
4
|
+
/**
|
|
5
|
+
* The previous value for as long as `equal` says the new one is the same. Hosts hand back fresh arrays
|
|
6
|
+
* every render (a list of query results, say); anything built from them would otherwise change every render.
|
|
7
|
+
*/
|
|
8
|
+
function useStableWhile(next, equal) {
|
|
9
|
+
const previous = (0, react.useRef)(next);
|
|
10
|
+
if (!equal(previous.current, next)) previous.current = next;
|
|
11
|
+
return previous.current;
|
|
12
|
+
}
|
|
13
|
+
exports.useStableWhile = useStableWhile;
|
|
14
|
+
|
|
15
|
+
//# sourceMappingURL=useStableWhile.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useStableWhile.cjs.js","names":["useRef"],"sources":["../../../../src/domains/knowledge/lib/useStableWhile.ts"],"sourcesContent":["import { useRef } from 'react';\n\n/**\n * The previous value for as long as `equal` says the new one is the same. Hosts hand back fresh arrays\n * every render (a list of query results, say); anything built from them would otherwise change every render.\n */\nexport function useStableWhile<T>(next: T, equal: (previous: T, next: T) => boolean): T {\n const previous = useRef(next);\n if (!equal(previous.current, next)) previous.current = next;\n return previous.current;\n}\n"],"mappings":";;;;;;;AAMA,SAAgB,eAAkB,MAAS,OAA6C;CACtF,MAAM,YAAA,GAAWA,MAAAA,OAAAA,CAAO,IAAI;CAC5B,IAAI,CAAC,MAAM,SAAS,SAAS,IAAI,GAAG,SAAS,UAAU;CACvD,OAAO,SAAS;AAClB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from '../../../src/domains/knowledge/lib/useStableWhile';
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { useRef } from "react";
|
|
2
|
+
// src/domains/knowledge/lib/useStableWhile.ts
|
|
3
|
+
/**
|
|
4
|
+
* The previous value for as long as `equal` says the new one is the same. Hosts hand back fresh arrays
|
|
5
|
+
* every render (a list of query results, say); anything built from them would otherwise change every render.
|
|
6
|
+
*/
|
|
7
|
+
function useStableWhile(next, equal) {
|
|
8
|
+
const previous = useRef(next);
|
|
9
|
+
if (!equal(previous.current, next)) previous.current = next;
|
|
10
|
+
return previous.current;
|
|
11
|
+
}
|
|
12
|
+
export { useStableWhile };
|
|
13
|
+
|
|
14
|
+
//# sourceMappingURL=useStableWhile.es.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useStableWhile.es.js","names":[],"sources":["../../../../src/domains/knowledge/lib/useStableWhile.ts"],"sourcesContent":["import { useRef } from 'react';\n\n/**\n * The previous value for as long as `equal` says the new one is the same. Hosts hand back fresh arrays\n * every render (a list of query results, say); anything built from them would otherwise change every render.\n */\nexport function useStableWhile<T>(next: T, equal: (previous: T, next: T) => boolean): T {\n const previous = useRef(next);\n if (!equal(previous.current, next)) previous.current = next;\n return previous.current;\n}\n"],"mappings":";;;;;;AAMA,SAAgB,eAAkB,MAAS,OAA6C;CACtF,MAAM,WAAW,OAAO,IAAI;CAC5B,IAAI,CAAC,MAAM,SAAS,SAAS,IAAI,GAAG,SAAS,UAAU;CACvD,OAAO,SAAS;AAClB"}
|
|
@@ -4,7 +4,7 @@ const require_Button = require("../../../Button-DLcMcuUL.cjs");
|
|
|
4
4
|
const require_Txt = require("../../../Txt-BnoSqxKE.cjs");
|
|
5
5
|
const require_copy_button = require("../../../copy-button-DJAQ6_3o.cjs");
|
|
6
6
|
const require_buttons_group = require("../../../buttons-group-Dc6R7YSs.cjs");
|
|
7
|
-
const require_DataPanel = require("../../../DataPanel-
|
|
7
|
+
const require_DataPanel = require("../../../DataPanel-Coc9h35I.cjs");
|
|
8
8
|
const require_DataKeysAndValues = require("../../../DataKeysAndValues-DsH6AbAo.cjs");
|
|
9
9
|
let react = require("react");
|
|
10
10
|
let react_jsx_runtime = require("react/jsx-runtime");
|
|
@@ -3,7 +3,7 @@ import { t as Button } from "../../../Button-CLXTbAY8.js";
|
|
|
3
3
|
import { t as Txt } from "../../../Txt-BM6TVV_c.js";
|
|
4
4
|
import { t as CopyButton } from "../../../copy-button-BXrbevLn.js";
|
|
5
5
|
import { t as ButtonsGroup } from "../../../buttons-group-DkFlnMiL.js";
|
|
6
|
-
import { t as DataPanel } from "../../../DataPanel-
|
|
6
|
+
import { t as DataPanel } from "../../../DataPanel-IgB9D5PO.js";
|
|
7
7
|
import { t as DataKeysAndValues } from "../../../DataKeysAndValues-PwOmGxyp.js";
|
|
8
8
|
import { Fragment } from "react";
|
|
9
9
|
import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
const require_observability_saved_views = require("../../../observability-saved-views-
|
|
2
|
+
const require_observability_saved_views = require("../../../observability-saved-views-Daizz4tU.cjs");
|
|
3
3
|
let react_jsx_runtime = require("react/jsx-runtime");
|
|
4
4
|
// src/domains/logs/components/logs-saved-views.tsx
|
|
5
5
|
/** Saved views of the logs page, placed by the host next to `LogsToolbar`. Renders nothing without a `SavedViewsProvider`. */
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as ObservabilitySavedViews } from "../../../observability-saved-views-
|
|
1
|
+
import { t as ObservabilitySavedViews } from "../../../observability-saved-views-CjKTEp1V.js";
|
|
2
2
|
import { jsx } from "react/jsx-runtime";
|
|
3
3
|
// src/domains/logs/components/logs-saved-views.tsx
|
|
4
4
|
/** Saved views of the logs page, placed by the host next to `LogsToolbar`. Renders nothing without a `SavedViewsProvider`. */
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
2
|
const require_utils = require("../../../utils-uDc1ofX1.cjs");
|
|
3
|
-
const require_property_filter_applied = require("../../../property-filter-applied-
|
|
3
|
+
const require_property_filter_applied = require("../../../property-filter-applied-BkkIObRq.cjs");
|
|
4
4
|
let react_jsx_runtime = require("react/jsx-runtime");
|
|
5
5
|
// src/domains/logs/components/logs-toolbar.tsx
|
|
6
6
|
function LogsToolbar({ onClear, onRemoveAll, onSave, onRemoveSaved, isLoading, filterFields, filterTokens, onFilterTokensChange, autoFocusFilterFieldId }) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { t as cn } from "../../../utils-DQx8TpNT.js";
|
|
2
|
-
import { r as PropertyFilterActions, t as PropertyFilterApplied } from "../../../property-filter-applied
|
|
2
|
+
import { r as PropertyFilterActions, t as PropertyFilterApplied } from "../../../property-filter-applied--U5EZdaA.js";
|
|
3
3
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
4
4
|
// src/domains/logs/components/logs-toolbar.tsx
|
|
5
5
|
function LogsToolbar({ onClear, onRemoveAll, onSave, onRemoveSaved, isLoading, filterFields, filterTokens, onFilterTokensChange, autoFocusFilterFieldId }) {
|
|
@@ -9,7 +9,7 @@ const require_domains_metrics_components_breakdown_breakdown_change_description
|
|
|
9
9
|
const require_domains_metrics_components_breakdown_breakdown_figure = require("./breakdown-figure.cjs.js");
|
|
10
10
|
const require_domains_metrics_components_breakdown_breakdown_text = require("./breakdown-text.cjs.js");
|
|
11
11
|
const require_domains_metrics_hooks_use_metrics_scope = require("../../hooks/use-metrics-scope.cjs.js");
|
|
12
|
-
const require_MetricsTable = require("../../../../MetricsTable-
|
|
12
|
+
const require_MetricsTable = require("../../../../MetricsTable-BSl81oNe.cjs");
|
|
13
13
|
const require_domains_metrics_components_breakdown_breakdown_change_cell = require("./breakdown-change-cell.cjs.js");
|
|
14
14
|
const require_domains_metrics_components_breakdown_breakdown_cost_cell = require("./breakdown-cost-cell.cjs.js");
|
|
15
15
|
const require_domains_metrics_components_breakdown_breakdown_frame = require("./breakdown-frame.cjs.js");
|
|
@@ -17,7 +17,7 @@ const require_domains_metrics_components_breakdown_breakdown_row_name = require(
|
|
|
17
17
|
let react = require("react");
|
|
18
18
|
let react_jsx_runtime = require("react/jsx-runtime");
|
|
19
19
|
// src/domains/metrics/components/breakdown/breakdown-table.tsx
|
|
20
|
-
var PAGE_SIZE =
|
|
20
|
+
var PAGE_SIZE = 10;
|
|
21
21
|
/** Busiest first; where a third click on a column's header returns to. */
|
|
22
22
|
var DEFAULT_SORT = {
|
|
23
23
|
column: "count",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"breakdown-table.cjs.js","names":["useMetricsScope","useState","isChangeMetric","BreakdownFrame","ChartCardError","hasErrors","showsProject","buildBreakdownRows","threadResources","previousFigures","tableRows","volumeLabel","rowChange","BreakdownRowName","BreakdownText","BreakdownFigure","formatPercent","formatDuration","formatCount","BreakdownCostCell","countDescription","BreakdownChangeDescription","comparedLabel","BreakdownChangeCell","ChartArea","MetricsTable","drilldownFor","Txt"],"sources":["../../../../../src/domains/metrics/components/breakdown/breakdown-table.tsx"],"sourcesContent":["import type { AggregateTracesResponse } from '@mastra/client-js';\nimport type { UseQueryResult } from '@tanstack/react-query';\nimport { useState } from 'react';\nimport { useMetricsScope } from '../../hooks/use-metrics-scope';\nimport type { useMetricsUsageTotals } from '../../hooks/use-metrics-usage-totals';\nimport { buildBreakdownRows, hasErrors, previousFigures, rowChange, threadResources } from '../../lib/breakdown';\nimport type { BreakdownRow, BreakdownTab, ChangeMetric } from '../../lib/breakdown';\nimport {\n DASH,\n comparedLabel,\n countDescription,\n drilldownFor,\n isChangeMetric,\n showsProject,\n tableRows,\n volumeLabel,\n} from '../../lib/breakdown-table';\nimport { formatCount, formatDuration, formatPercent } from '../../lib/chart-format';\nimport { ChartArea } from '../chart-area';\nimport { ChartCardError } from '../chart-card-error';\nimport { BreakdownChangeCell } from './breakdown-change-cell';\nimport { BreakdownChangeDescription } from './breakdown-change-description';\nimport { BreakdownCostCell } from './breakdown-cost-cell';\nimport { BreakdownFigure } from './breakdown-figure';\nimport { BreakdownFrame } from './breakdown-frame';\nimport type { BreakdownFrameProps } from './breakdown-frame';\nimport { BreakdownRowName } from './breakdown-row-name';\nimport { BreakdownText } from './breakdown-text';\nimport { MetricsTable } from '@/ds/components/MetricsTable';\nimport type { MetricsTableColumn, MetricsTableSort } from '@/ds/components/MetricsTable';\nimport { Txt } from '@/ds/components/Txt';\n\ntype UsageTotals = ReturnType<typeof useMetricsUsageTotals>;\n\nconst PAGE_SIZE = 13;\n\n/** Busiest first; where a third click on a column's header returns to. */\nconst DEFAULT_SORT: MetricsTableSort = { column: 'count', direction: 'desc' };\n\n/** The first column's header: what each row is. */\nconst NAME_HEADER: Record<BreakdownTab, string> = {\n projects: 'Project',\n agents: 'Agent',\n workflows: 'Workflow',\n tools: 'Tool',\n models: 'Model',\n threads: 'Thread',\n environments: 'Environment',\n};\n\nconst EMPTY: Record<BreakdownTab, string> = {\n projects: 'No traces in this range.',\n agents: 'No agent runs in this range.',\n workflows: 'No workflow runs in this range.',\n tools: 'No tool calls in this range.',\n models: 'No model usage in this range.',\n threads: 'No traces with a thread in this range.',\n environments: 'No traces in this range.',\n};\n\nexport type BreakdownTableProps = BreakdownFrameProps & {\n tab: BreakdownTab;\n groupBy: string[];\n window: { start: Date; end: Date };\n aggregate?: UseQueryResult<AggregateTracesResponse>;\n /** Tokens and cost per row. */\n totals?: UsageTotals;\n /** Model spans per row (Models tab). */\n spans?: UsageTotals;\n /** Rows naming each thread's resource (Threads tab). */\n resources?: UseQueryResult<AggregateTracesResponse>;\n previousAggregate?: UseQueryResult<AggregateTracesResponse>;\n previousUsage?: UsageTotals;\n previousSpans?: UsageTotals;\n /** The server's row cap, named when it truncates. */\n limit: number;\n};\n\n/** One tab's sortable table, with % Change against the previous window. */\nexport function BreakdownTable({\n tab,\n groupBy,\n window,\n aggregate,\n totals,\n spans,\n resources,\n previousAggregate,\n previousUsage,\n previousSpans,\n limit,\n ...frame\n}: BreakdownTableProps) {\n const scope = useMetricsScope();\n const [sort, setSort] = useState<MetricsTableSort>(DEFAULT_SORT);\n const [metric, setMetric] = useState<ChangeMetric>('count');\n const onSortChange = (next = DEFAULT_SORT) => {\n setSort(next);\n if (isChangeMetric(next.column)) setMetric(next.column);\n };\n\n const current = [aggregate, totals, spans].filter(q => q !== undefined);\n if (current.some(q => q.isError)) {\n return (\n <BreakdownFrame {...frame} tab={tab}>\n <ChartCardError onRetry={() => current.forEach(q => q.isError && void q.refetch())} />\n </BreakdownFrame>\n );\n }\n\n const isLoading = current.some(q => q.isLoading);\n const errors = hasErrors(tab);\n const usage = totals !== undefined;\n const project = showsProject(tab, frame.byProject);\n const truncated = aggregate?.data?.truncated === true;\n const built = isLoading\n ? []\n : buildBreakdownRows({\n tab,\n groupBy,\n aggregateRows: aggregate?.data?.rows,\n usageGroups: totals?.data?.groups,\n spanGroups: spans?.data?.groups,\n // The resource is a nicety: the table doesn't wait for it, and shows a dash without it.\n resources: resources?.data ? threadResources(resources.data.rows) : undefined,\n });\n // The previous window never holds the table up: until it answers, or if it fails, Change shows a dash.\n const previousSettled = [previousAggregate, previousUsage, previousSpans].every(\n q => !q || (!q.isLoading && !q.isError),\n );\n const previous =\n previousSettled && !isLoading\n ? previousFigures({\n tab,\n groupBy,\n aggregateRows: previousAggregate?.data?.rows,\n usageGroups: previousUsage?.data?.groups,\n spanGroups: previousSpans?.data?.groups,\n })\n : undefined;\n const rows = tableRows({ tab, built, previous, truncated, groupBy, usage });\n const volume = volumeLabel(tab);\n\n const changeOf = (row: BreakdownRow) => (previous ? rowChange(row, previous.get(row.key), metric) : undefined);\n const projectName = (row: BreakdownRow) => {\n if (!row.projectId) return DASH;\n return scope.projectLabel?.(row.projectId) ?? row.projectId;\n };\n\n const nameColumn: MetricsTableColumn<BreakdownRow> = {\n id: 'name',\n header: NAME_HEADER[tab],\n width: 'minmax(12rem,3fr)',\n cell: row => <BreakdownRowName tab={tab} row={row} />,\n };\n const projectColumn: MetricsTableColumn<BreakdownRow> = {\n id: 'project',\n header: 'Project',\n width: 'minmax(8rem,2fr)',\n cell: row => <BreakdownText text={projectName(row)} />,\n };\n const resourceColumn: MetricsTableColumn<BreakdownRow> = {\n id: 'resource',\n header: 'Resource',\n width: 'minmax(6rem,1fr)',\n cell: row => <BreakdownText text={row.resource ?? DASH} />,\n };\n const errorColumns: MetricsTableColumn<BreakdownRow>[] = [\n {\n id: 'errorRate',\n header: 'Errors',\n align: 'end',\n sortValue: row => row.errorRate,\n cell: row => (\n <BreakdownFigure muted>{row.errorRate === undefined ? DASH : formatPercent(row.errorRate)}</BreakdownFigure>\n ),\n },\n {\n id: 'p95',\n header: 'P95 latency',\n align: 'end',\n sortValue: row => row.p95,\n cell: row => <BreakdownFigure muted>{row.p95 === undefined ? DASH : formatDuration(row.p95)}</BreakdownFigure>,\n },\n ];\n const usageColumns: MetricsTableColumn<BreakdownRow>[] = [\n {\n id: 'tokens',\n header: 'Tokens',\n align: 'end',\n sortValue: row => row.tokens,\n cell: row => <BreakdownFigure muted>{row.tokens === undefined ? DASH : formatCount(row.tokens)}</BreakdownFigure>,\n },\n {\n id: 'cost',\n header: 'Cost',\n align: 'end',\n sortValue: row => row.cost,\n cell: row => (\n <BreakdownFigure muted>\n <BreakdownCostCell row={row} />\n </BreakdownFigure>\n ),\n },\n ];\n const countColumn: MetricsTableColumn<BreakdownRow> = {\n id: 'count',\n header: volume,\n align: 'end',\n description: countDescription(tab),\n sortValue: row => row.count,\n cell: row => <BreakdownFigure>{formatCount(row.count)}</BreakdownFigure>,\n };\n const changeColumn: MetricsTableColumn<BreakdownRow> = {\n id: 'change',\n header: '% Change',\n align: 'end',\n description: <BreakdownChangeDescription window={window} label={comparedLabel(tab, metric)} />,\n // Sorted by the change shown: biggest rise first, biggest fall first the other way. New rows\n // have no change to rank, so they sort last.\n sortValue: row => changeOf(row)?.change,\n cell: row => (\n <BreakdownFigure>\n <BreakdownChangeCell change={changeOf(row)} metric={metric} />\n </BreakdownFigure>\n ),\n };\n const columns = [\n nameColumn,\n ...(project ? [projectColumn] : []),\n ...(tab === 'threads' ? [resourceColumn] : []),\n ...(errors ? errorColumns : []),\n ...(usage ? usageColumns : []),\n countColumn,\n changeColumn,\n ];\n\n return (\n <BreakdownFrame {...frame} tab={tab} isUpdating={aggregate?.isPlaceholderData}>\n <ChartArea>\n <MetricsTable\n key={tab}\n aria-label={`${NAME_HEADER[tab]} breakdown`}\n columns={columns}\n rows={rows}\n getRowKey={row => row.key}\n sort={sort}\n defaultSort={DEFAULT_SORT}\n onSortChange={onSortChange}\n onRowClick={frame.onRowClick && (row => frame.onRowClick?.(drilldownFor(tab, row)))}\n pageSize={PAGE_SIZE}\n isLoading={isLoading}\n empty={EMPTY[tab]}\n />\n {!isLoading && truncated && (\n <Txt variant=\"caption\" tone=\"muted\" className=\"pt-2\">\n Showing the {formatCount(limit)} busiest; sorting covers only these.\n </Txt>\n )}\n </ChartArea>\n </BreakdownFrame>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"breakdown-table.cjs.js","names":["useMetricsScope","useState","isChangeMetric","BreakdownFrame","ChartCardError","hasErrors","showsProject","buildBreakdownRows","threadResources","previousFigures","tableRows","volumeLabel","rowChange","BreakdownRowName","BreakdownText","BreakdownFigure","formatPercent","formatDuration","formatCount","BreakdownCostCell","countDescription","BreakdownChangeDescription","comparedLabel","BreakdownChangeCell","ChartArea","MetricsTable","drilldownFor","Txt"],"sources":["../../../../../src/domains/metrics/components/breakdown/breakdown-table.tsx"],"sourcesContent":["import type { AggregateTracesResponse } from '@mastra/client-js';\nimport type { UseQueryResult } from '@tanstack/react-query';\nimport { useState } from 'react';\nimport { useMetricsScope } from '../../hooks/use-metrics-scope';\nimport type { useMetricsUsageTotals } from '../../hooks/use-metrics-usage-totals';\nimport { buildBreakdownRows, hasErrors, previousFigures, rowChange, threadResources } from '../../lib/breakdown';\nimport type { BreakdownRow, BreakdownTab, ChangeMetric } from '../../lib/breakdown';\nimport {\n DASH,\n comparedLabel,\n countDescription,\n drilldownFor,\n isChangeMetric,\n showsProject,\n tableRows,\n volumeLabel,\n} from '../../lib/breakdown-table';\nimport { formatCount, formatDuration, formatPercent } from '../../lib/chart-format';\nimport { ChartArea } from '../chart-area';\nimport { ChartCardError } from '../chart-card-error';\nimport { BreakdownChangeCell } from './breakdown-change-cell';\nimport { BreakdownChangeDescription } from './breakdown-change-description';\nimport { BreakdownCostCell } from './breakdown-cost-cell';\nimport { BreakdownFigure } from './breakdown-figure';\nimport { BreakdownFrame } from './breakdown-frame';\nimport type { BreakdownFrameProps } from './breakdown-frame';\nimport { BreakdownRowName } from './breakdown-row-name';\nimport { BreakdownText } from './breakdown-text';\nimport { MetricsTable } from '@/ds/components/MetricsTable';\nimport type { MetricsTableColumn, MetricsTableSort } from '@/ds/components/MetricsTable';\nimport { Txt } from '@/ds/components/Txt';\n\ntype UsageTotals = ReturnType<typeof useMetricsUsageTotals>;\n\nconst PAGE_SIZE = 10;\n\n/** Busiest first; where a third click on a column's header returns to. */\nconst DEFAULT_SORT: MetricsTableSort = { column: 'count', direction: 'desc' };\n\n/** The first column's header: what each row is. */\nconst NAME_HEADER: Record<BreakdownTab, string> = {\n projects: 'Project',\n agents: 'Agent',\n workflows: 'Workflow',\n tools: 'Tool',\n models: 'Model',\n threads: 'Thread',\n environments: 'Environment',\n};\n\nconst EMPTY: Record<BreakdownTab, string> = {\n projects: 'No traces in this range.',\n agents: 'No agent runs in this range.',\n workflows: 'No workflow runs in this range.',\n tools: 'No tool calls in this range.',\n models: 'No model usage in this range.',\n threads: 'No traces with a thread in this range.',\n environments: 'No traces in this range.',\n};\n\nexport type BreakdownTableProps = BreakdownFrameProps & {\n tab: BreakdownTab;\n groupBy: string[];\n window: { start: Date; end: Date };\n aggregate?: UseQueryResult<AggregateTracesResponse>;\n /** Tokens and cost per row. */\n totals?: UsageTotals;\n /** Model spans per row (Models tab). */\n spans?: UsageTotals;\n /** Rows naming each thread's resource (Threads tab). */\n resources?: UseQueryResult<AggregateTracesResponse>;\n previousAggregate?: UseQueryResult<AggregateTracesResponse>;\n previousUsage?: UsageTotals;\n previousSpans?: UsageTotals;\n /** The server's row cap, named when it truncates. */\n limit: number;\n};\n\n/** One tab's sortable table, with % Change against the previous window. */\nexport function BreakdownTable({\n tab,\n groupBy,\n window,\n aggregate,\n totals,\n spans,\n resources,\n previousAggregate,\n previousUsage,\n previousSpans,\n limit,\n ...frame\n}: BreakdownTableProps) {\n const scope = useMetricsScope();\n const [sort, setSort] = useState<MetricsTableSort>(DEFAULT_SORT);\n const [metric, setMetric] = useState<ChangeMetric>('count');\n const onSortChange = (next = DEFAULT_SORT) => {\n setSort(next);\n if (isChangeMetric(next.column)) setMetric(next.column);\n };\n\n const current = [aggregate, totals, spans].filter(q => q !== undefined);\n if (current.some(q => q.isError)) {\n return (\n <BreakdownFrame {...frame} tab={tab}>\n <ChartCardError onRetry={() => current.forEach(q => q.isError && void q.refetch())} />\n </BreakdownFrame>\n );\n }\n\n const isLoading = current.some(q => q.isLoading);\n const errors = hasErrors(tab);\n const usage = totals !== undefined;\n const project = showsProject(tab, frame.byProject);\n const truncated = aggregate?.data?.truncated === true;\n const built = isLoading\n ? []\n : buildBreakdownRows({\n tab,\n groupBy,\n aggregateRows: aggregate?.data?.rows,\n usageGroups: totals?.data?.groups,\n spanGroups: spans?.data?.groups,\n // The resource is a nicety: the table doesn't wait for it, and shows a dash without it.\n resources: resources?.data ? threadResources(resources.data.rows) : undefined,\n });\n // The previous window never holds the table up: until it answers, or if it fails, Change shows a dash.\n const previousSettled = [previousAggregate, previousUsage, previousSpans].every(\n q => !q || (!q.isLoading && !q.isError),\n );\n const previous =\n previousSettled && !isLoading\n ? previousFigures({\n tab,\n groupBy,\n aggregateRows: previousAggregate?.data?.rows,\n usageGroups: previousUsage?.data?.groups,\n spanGroups: previousSpans?.data?.groups,\n })\n : undefined;\n const rows = tableRows({ tab, built, previous, truncated, groupBy, usage });\n const volume = volumeLabel(tab);\n\n const changeOf = (row: BreakdownRow) => (previous ? rowChange(row, previous.get(row.key), metric) : undefined);\n const projectName = (row: BreakdownRow) => {\n if (!row.projectId) return DASH;\n return scope.projectLabel?.(row.projectId) ?? row.projectId;\n };\n\n const nameColumn: MetricsTableColumn<BreakdownRow> = {\n id: 'name',\n header: NAME_HEADER[tab],\n width: 'minmax(12rem,3fr)',\n cell: row => <BreakdownRowName tab={tab} row={row} />,\n };\n const projectColumn: MetricsTableColumn<BreakdownRow> = {\n id: 'project',\n header: 'Project',\n width: 'minmax(8rem,2fr)',\n cell: row => <BreakdownText text={projectName(row)} />,\n };\n const resourceColumn: MetricsTableColumn<BreakdownRow> = {\n id: 'resource',\n header: 'Resource',\n width: 'minmax(6rem,1fr)',\n cell: row => <BreakdownText text={row.resource ?? DASH} />,\n };\n const errorColumns: MetricsTableColumn<BreakdownRow>[] = [\n {\n id: 'errorRate',\n header: 'Errors',\n align: 'end',\n sortValue: row => row.errorRate,\n cell: row => (\n <BreakdownFigure muted>{row.errorRate === undefined ? DASH : formatPercent(row.errorRate)}</BreakdownFigure>\n ),\n },\n {\n id: 'p95',\n header: 'P95 latency',\n align: 'end',\n sortValue: row => row.p95,\n cell: row => <BreakdownFigure muted>{row.p95 === undefined ? DASH : formatDuration(row.p95)}</BreakdownFigure>,\n },\n ];\n const usageColumns: MetricsTableColumn<BreakdownRow>[] = [\n {\n id: 'tokens',\n header: 'Tokens',\n align: 'end',\n sortValue: row => row.tokens,\n cell: row => <BreakdownFigure muted>{row.tokens === undefined ? DASH : formatCount(row.tokens)}</BreakdownFigure>,\n },\n {\n id: 'cost',\n header: 'Cost',\n align: 'end',\n sortValue: row => row.cost,\n cell: row => (\n <BreakdownFigure muted>\n <BreakdownCostCell row={row} />\n </BreakdownFigure>\n ),\n },\n ];\n const countColumn: MetricsTableColumn<BreakdownRow> = {\n id: 'count',\n header: volume,\n align: 'end',\n description: countDescription(tab),\n sortValue: row => row.count,\n cell: row => <BreakdownFigure>{formatCount(row.count)}</BreakdownFigure>,\n };\n const changeColumn: MetricsTableColumn<BreakdownRow> = {\n id: 'change',\n header: '% Change',\n align: 'end',\n description: <BreakdownChangeDescription window={window} label={comparedLabel(tab, metric)} />,\n // Sorted by the change shown: biggest rise first, biggest fall first the other way. New rows\n // have no change to rank, so they sort last.\n sortValue: row => changeOf(row)?.change,\n cell: row => (\n <BreakdownFigure>\n <BreakdownChangeCell change={changeOf(row)} metric={metric} />\n </BreakdownFigure>\n ),\n };\n const columns = [\n nameColumn,\n ...(project ? [projectColumn] : []),\n ...(tab === 'threads' ? [resourceColumn] : []),\n ...(errors ? errorColumns : []),\n ...(usage ? usageColumns : []),\n countColumn,\n changeColumn,\n ];\n\n return (\n <BreakdownFrame {...frame} tab={tab} isUpdating={aggregate?.isPlaceholderData}>\n <ChartArea>\n <MetricsTable\n key={tab}\n aria-label={`${NAME_HEADER[tab]} breakdown`}\n columns={columns}\n rows={rows}\n getRowKey={row => row.key}\n sort={sort}\n defaultSort={DEFAULT_SORT}\n onSortChange={onSortChange}\n onRowClick={frame.onRowClick && (row => frame.onRowClick?.(drilldownFor(tab, row)))}\n pageSize={PAGE_SIZE}\n isLoading={isLoading}\n empty={EMPTY[tab]}\n />\n {!isLoading && truncated && (\n <Txt variant=\"caption\" tone=\"muted\" className=\"pt-2\">\n Showing the {formatCount(limit)} busiest; sorting covers only these.\n </Txt>\n )}\n </ChartArea>\n </BreakdownFrame>\n );\n}\n"],"mappings":"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"}
|