@mastra/playground-ui 68.0.0-alpha.2 → 68.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{FilterBar-CQl04O6t.cjs → FilterBar-BSP2UTjc.cjs} +2 -2
- package/dist/{FilterBar-CQl04O6t.cjs.map → FilterBar-BSP2UTjc.cjs.map} +1 -1
- package/dist/{FilterBar-BgW2dqRQ.js → FilterBar-PSQ1OwqH.js} +2 -2
- package/dist/{FilterBar-BgW2dqRQ.js.map → FilterBar-PSQ1OwqH.js.map} +1 -1
- 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/{MetricsCard-CEB-f2sv.cjs → MetricsCard-BEwiS7Pe.cjs} +8 -8
- package/dist/MetricsCard-BEwiS7Pe.cjs.map +1 -0
- package/dist/{MetricsCard-M8awJ2B_.js → MetricsCard-ua6C6b8a.js} +10 -10
- package/dist/MetricsCard-ua6C6b8a.js.map +1 -0
- package/dist/{MetricsLineChart-BhHoduO0.js → MetricsLineChart-4SwxBbQx.js} +14 -3
- package/dist/MetricsLineChart-4SwxBbQx.js.map +1 -0
- package/dist/{MetricsLineChart-CjBm4IXu.cjs → MetricsLineChart-tZxsauau.cjs} +13 -2
- package/dist/MetricsLineChart-tZxsauau.cjs.map +1 -0
- package/dist/{MetricsStackedBarChart-BdMlKv6G.cjs → MetricsStackedBarChart-CDLE76IB.cjs} +2 -2
- package/dist/{MetricsStackedBarChart-BdMlKv6G.cjs.map → MetricsStackedBarChart-CDLE76IB.cjs.map} +1 -1
- package/dist/{MetricsStackedBarChart-BRuA6MTE.js → MetricsStackedBarChart-D2QyS4-z.js} +2 -2
- package/dist/{MetricsStackedBarChart-BRuA6MTE.js.map → MetricsStackedBarChart-D2QyS4-z.js.map} +1 -1
- 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/components/DateTimeRangePicker.cjs.js +1 -1
- package/dist/components/DateTimeRangePicker.es.js +1 -1
- package/dist/components/FilterBar.cjs.js +2 -2
- package/dist/components/FilterBar.es.js +2 -2
- package/dist/components/MarkdownRenderer.cjs.js +1 -1
- package/dist/components/MarkdownRenderer.es.js +1 -1
- package/dist/components/MetricsCard.cjs.js +1 -1
- package/dist/components/MetricsCard.es.js +1 -1
- package/dist/components/MetricsLineChart.cjs.js +1 -1
- package/dist/components/MetricsLineChart.es.js +1 -1
- package/dist/components/MetricsStackedBarChart.cjs.js +1 -1
- package/dist/components/MetricsStackedBarChart.es.js +1 -1
- package/dist/components/SavedViews.cjs.js +1 -1
- package/dist/components/SavedViews.es.js +1 -1
- package/dist/components/ai/activity.cjs.js +1 -1
- package/dist/components/ai/activity.es.js +1 -1
- package/dist/components/ai/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/{date-time-range-picker-CTt7Od0P.cjs → date-time-range-picker-CWGjoR3j.cjs} +40 -13
- package/dist/date-time-range-picker-CWGjoR3j.cjs.map +1 -0
- package/dist/{date-time-range-picker-DKh1K9Iy.js → date-time-range-picker-CdSiXwB4.js} +40 -13
- package/dist/date-time-range-picker-CdSiXwB4.js.map +1 -0
- 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/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/connect-prompt-tool.cjs.js +79 -4
- package/dist/domains/chat/tools/connect-prompt-tool.cjs.js.map +1 -1
- package/dist/domains/chat/tools/connect-prompt-tool.es.js +79 -4
- package/dist/domains/chat/tools/connect-prompt-tool.es.js.map +1 -1
- package/dist/domains/chat/tools/mcp-input-request-tool.cjs.js +238 -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 +237 -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 +9 -4
- package/dist/domains/chat/tools/tool-card-kind.cjs.js.map +1 -1
- package/dist/domains/chat/tools/tool-card-kind.es.js +9 -5
- 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/connect/types.cjs.js.map +1 -1
- package/dist/domains/connect/types.es.js.map +1 -1
- package/dist/domains/connect/use-user-connect.cjs.js +19 -2
- package/dist/domains/connect/use-user-connect.cjs.js.map +1 -1
- package/dist/domains/connect/use-user-connect.es.js +19 -2
- package/dist/domains/connect/use-user-connect.es.js.map +1 -1
- package/dist/domains/dashboards/components/dashboard-renderer.cjs.js +4 -3
- package/dist/domains/dashboards/components/dashboard-renderer.cjs.js.map +1 -1
- package/dist/domains/dashboards/components/dashboard-renderer.es.js +4 -3
- package/dist/domains/dashboards/components/dashboard-renderer.es.js.map +1 -1
- package/dist/domains/dashboards/components/widget-chrome.cjs.js +1 -1
- package/dist/domains/dashboards/components/widget-chrome.es.js +1 -1
- package/dist/domains/dashboards/components/widget-error.cjs.js +1 -1
- package/dist/domains/dashboards/components/widget-error.es.js +1 -1
- package/dist/domains/dashboards/hooks/use-widget-views.cjs.js +4 -3
- package/dist/domains/dashboards/hooks/use-widget-views.cjs.js.map +1 -1
- package/dist/domains/dashboards/hooks/use-widget-views.es.js +4 -3
- package/dist/domains/dashboards/hooks/use-widget-views.es.js.map +1 -1
- package/dist/domains/dashboards/kinds/scores/scores-widget.cjs.js +9 -6
- package/dist/domains/dashboards/kinds/scores/scores-widget.cjs.js.map +1 -1
- package/dist/domains/dashboards/kinds/scores/scores-widget.es.js +9 -6
- package/dist/domains/dashboards/kinds/scores/scores-widget.es.js.map +1 -1
- package/dist/domains/dashboards/kinds/table/table-tabs.cjs.js +2 -2
- package/dist/domains/dashboards/kinds/table/table-tabs.es.js +2 -2
- package/dist/domains/dashboards/kinds/table/table-widget.cjs.js +1 -1
- package/dist/domains/dashboards/kinds/table/table-widget.es.js +1 -1
- package/dist/domains/dashboards/kinds/timeseries/timeseries-widget.cjs.js +6 -5
- package/dist/domains/dashboards/kinds/timeseries/timeseries-widget.cjs.js.map +1 -1
- package/dist/domains/dashboards/kinds/timeseries/timeseries-widget.es.js +6 -5
- package/dist/domains/dashboards/kinds/timeseries/timeseries-widget.es.js.map +1 -1
- package/dist/domains/dashboards/lib/chrome.cjs.js +9 -2
- package/dist/domains/dashboards/lib/chrome.cjs.js.map +1 -1
- package/dist/domains/dashboards/lib/chrome.es.js +9 -2
- package/dist/domains/dashboards/lib/chrome.es.js.map +1 -1
- package/dist/domains/dashboards/widget-kind.cjs.js.map +1 -1
- package/dist/domains/dashboards/widget-kind.es.js.map +1 -1
- package/dist/domains/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/metrics/components/agent-runs-card.cjs.js +3 -3
- package/dist/domains/metrics/components/agent-runs-card.es.js +3 -3
- package/dist/domains/metrics/components/breakdown/breakdown-tab-body.cjs.js +1 -1
- package/dist/domains/metrics/components/breakdown/breakdown-tab-body.es.js +1 -1
- package/dist/domains/metrics/components/breakdown-card.cjs.js +1 -1
- package/dist/domains/metrics/components/breakdown-card.es.js +1 -1
- package/dist/domains/metrics/components/chart-area.cjs.js +1 -1
- package/dist/domains/metrics/components/chart-area.es.js +1 -1
- package/dist/domains/metrics/components/chart-card-error.cjs.js +1 -1
- package/dist/domains/metrics/components/chart-card-error.es.js +1 -1
- package/dist/domains/metrics/components/chart-card.cjs.js +1 -1
- package/dist/domains/metrics/components/chart-card.es.js +1 -1
- package/dist/domains/metrics/components/date-range-selector.cjs.js +1 -1
- package/dist/domains/metrics/components/date-range-selector.es.js +1 -1
- package/dist/domains/metrics/components/distinct-ids/distinct-ids-chart.cjs.js +3 -2
- package/dist/domains/metrics/components/distinct-ids/distinct-ids-chart.cjs.js.map +1 -1
- package/dist/domains/metrics/components/distinct-ids/distinct-ids-chart.es.js +3 -2
- package/dist/domains/metrics/components/distinct-ids/distinct-ids-chart.es.js.map +1 -1
- package/dist/domains/metrics/components/failure-rate-card.cjs.js +3 -2
- package/dist/domains/metrics/components/failure-rate-card.cjs.js.map +1 -1
- package/dist/domains/metrics/components/failure-rate-card.es.js +3 -2
- package/dist/domains/metrics/components/failure-rate-card.es.js.map +1 -1
- package/dist/domains/metrics/components/latency-card.cjs.js +3 -2
- package/dist/domains/metrics/components/latency-card.cjs.js.map +1 -1
- package/dist/domains/metrics/components/latency-card.es.js +3 -2
- package/dist/domains/metrics/components/latency-card.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/metrics/components/scores-card.cjs.js +2 -1
- package/dist/domains/metrics/components/scores-card.cjs.js.map +1 -1
- package/dist/domains/metrics/components/scores-card.es.js +2 -1
- package/dist/domains/metrics/components/scores-card.es.js.map +1 -1
- package/dist/domains/metrics/components/token-usage-card.cjs.js +3 -3
- package/dist/domains/metrics/components/token-usage-card.es.js +3 -3
- package/dist/domains/metrics/components/trace-aggregate-card.cjs.js +1 -1
- package/dist/domains/metrics/components/trace-aggregate-card.es.js +1 -1
- package/dist/domains/observability/components/observability-histogram.cjs.js +1 -1
- package/dist/domains/observability/components/observability-histogram.es.js +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 +1 -1
- package/dist/domains/skills/skill-simple-form.es.js +1 -1
- package/dist/domains/spans/components/spans-filter-bar.cjs.js +2 -2
- package/dist/domains/spans/components/spans-filter-bar.es.js +2 -2
- package/dist/domains/spans/hooks/use-spans-filter-bar.cjs.js +1 -1
- package/dist/domains/spans/hooks/use-spans-filter-bar.es.js +1 -1
- package/dist/domains/threads/components/threads-filter-bar.cjs.js +2 -2
- package/dist/domains/threads/components/threads-filter-bar.es.js +2 -2
- package/dist/domains/threads/hooks/use-threads-filter-bar.cjs.js +1 -1
- package/dist/domains/threads/hooks/use-threads-filter-bar.es.js +1 -1
- package/dist/domains/traces/components/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-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/trace-data-panel-view.cjs.js +8 -2
- 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 +8 -2
- 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/traces-explorer/traces-explorer-filter-bar.cjs.js +2 -2
- package/dist/domains/traces/components/traces-explorer/traces-explorer-filter-bar.es.js +2 -2
- package/dist/domains/traces/components/traces-explorer/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/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 +2 -2
- package/dist/domains/workflows/workflow/input/workflow-processor-input.es.js +2 -2
- 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 +1 -1
- package/dist/domains/workspace/components/workspace-add-skill-dialog.es.js +1 -1
- package/dist/domains/workspace/components/workspace-markdown-preview.cjs.js +1 -1
- package/dist/domains/workspace/components/workspace-markdown-preview.es.js +1 -1
- package/dist/{filter-bar-time-range-mg9JeYue.js → filter-bar-time-range-qlV8p7hp.js} +2 -2
- package/dist/{filter-bar-time-range-mg9JeYue.js.map → filter-bar-time-range-qlV8p7hp.js.map} +1 -1
- package/dist/{filter-bar-time-range-BA-pXMlo.cjs → filter-bar-time-range-zdM024JD.cjs} +2 -2
- package/dist/{filter-bar-time-range-BA-pXMlo.cjs.map → filter-bar-time-range-zdM024JD.cjs.map} +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/{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/connect-prompt-tool.d.ts +10 -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/connect/types.d.ts +16 -0
- package/dist/src/domains/dashboards/components/dashboard-renderer.d.ts +4 -2
- package/dist/src/domains/dashboards/hooks/use-widget-views.d.ts +4 -3
- package/dist/src/domains/dashboards/index.d.ts +1 -1
- package/dist/src/domains/dashboards/kinds/scores/scores-widget.d.ts +1 -1
- package/dist/src/domains/dashboards/lib/chrome.d.ts +6 -4
- package/dist/src/domains/dashboards/widget-kind.d.ts +12 -0
- 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/DateTimeRangePicker/date-time-range-picker.d.ts +12 -1
- package/dist/src/ds/components/MarkdownRenderer/markdown-renderer.d.ts +8 -1
- package/dist/src/ds/components/MetricsCard/metrics-card-headline.d.ts +1 -1
- package/dist/src/ds/components/MetricsLineChart/metrics-line-chart.d.ts +8 -0
- package/dist/src/ds/components/ai/tool-call/tool-phrases.d.ts +6 -0
- package/dist/style.css +73 -2
- 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-BOLXeKIp.cjs} +167 -126
- package/dist/tool-card-BOLXeKIp.cjs.map +1 -0
- package/dist/{tool-card-sO6P2Qj4.js → tool-card-HZ5bm7ue.js} +168 -127
- package/dist/tool-card-HZ5bm7ue.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/package.json +11 -11
- package/dist/MarkdownRenderer-2GOXQJEv.js.map +0 -1
- package/dist/MarkdownRenderer-CB8Z_CHc.cjs.map +0 -1
- package/dist/MetricsCard-CEB-f2sv.cjs.map +0 -1
- package/dist/MetricsCard-M8awJ2B_.js.map +0 -1
- package/dist/MetricsLineChart-BhHoduO0.js.map +0 -1
- package/dist/MetricsLineChart-CjBm4IXu.cjs.map +0 -1
- package/dist/date-time-range-picker-CTt7Od0P.cjs.map +0 -1
- package/dist/date-time-range-picker-DKh1K9Iy.js.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/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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"KnowledgePageExplorer.es.js","names":["_Fragment"],"sources":["../../../../src/domains/knowledge/components/KnowledgePageExplorer.tsx"],"sourcesContent":["import { X } from 'lucide-react';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\n\nimport { mentionPopupPlacement } from '../lib/popupPlacement';\n\nimport type {\n KnowledgePageActivityPayload,\n KnowledgeNotePayload,\n KnowledgePageEdge,\n KnowledgePagePayload,\n KnowledgePinPayload,\n KnowledgeScopeGrantPayload,\n} from '../pageTypes';\nimport { KnowledgeNoteItem, KnowledgePageDetail } from './KnowledgePageDetail';\nimport { KnowledgePageGraph } from './KnowledgePageGraph';\nimport { KNOWLEDGE_TREE_ROOT, KnowledgePageTree } from './KnowledgePageTree';\n\nimport { EmptyState } from '@/ds/components/EmptyState';\nimport { Txt } from '@/ds/components/Txt';\nimport { useIsMobile } from '@/hooks/use-is-mobile';\n\n/** `tree` is only a choice below `lg`; wider screens always show the tree beside the graph or the page. */\nexport type KnowledgeExplorerView = 'tree' | 'graph' | 'page';\n\n/** The bounded page graph a host loads. Without `useTreeLevels`, its pages also feed the tree. */\nexport interface KnowledgeExplorerGraph {\n pages: KnowledgePagePayload[];\n edges: KnowledgePageEdge[];\n pinnedIds: string[];\n /** Access grants between scopes; hosts whose server doesn't send them leave this out. */\n grants?: KnowledgeScopeGrantPayload[];\n truncated: boolean;\n}\n\nexport interface KnowledgeExplorerPageDetail {\n page: KnowledgePagePayload;\n notes: KnowledgeNotePayload[];\n /** Cursor for the page's next notes. */\n notesNextCursor?: string;\n pin?: KnowledgePinPayload | null;\n /** Ancestors and referenced pages, which may sit outside the loaded graph. */\n ancestors: KnowledgePagePayload[];\n related: KnowledgePagePayload[];\n /** Notes on other pages that mention this one. */\n mentionedBy?: KnowledgeNotePayload[];\n}\n\n/** One level of the tree: a parent's child scopes then its child pages, paged. */\nexport interface KnowledgeExplorerTreeLevel {\n pages: KnowledgePagePayload[];\n nextCursor?: string;\n}\n\nexport interface KnowledgeExplorerActivity {\n events: KnowledgePageActivityPayload[];\n}\n\nexport interface KnowledgeExplorerQueryState<T> {\n data?: T;\n isPending: boolean;\n isError: boolean;\n error: Error | null;\n}\n\n/** One request for a tree level: `parentId: null` for the root scopes. */\nexport interface KnowledgeExplorerTreeRequest {\n parentId: string | null;\n cursor?: string;\n}\n\n/**\n * Host data hooks. Each host binds them to its own routes (Studio to the Mastra client, Factory to its\n * project-scoped routes), so the explorer never knows a URL or an id outside the page ids it shows.\n * Pass the same functions every render: they are called as hooks.\n */\nexport interface KnowledgeExplorerSource {\n /** One page; `noteCursor` fetches a later page of its notes. Disabled when `pageId` is null. */\n usePage: (pageId: string | null, noteCursor?: string) => KnowledgeExplorerQueryState<KnowledgeExplorerPageDetail>;\n useSearch: (query: string) => { data?: { results: Array<{ page: KnowledgePagePayload }> } };\n /** Tree levels, one result per request in order (e.g. `useQueries`). Enables the lazily loaded tree and child pages. */\n useTreeLevels?: (\n requests: KnowledgeExplorerTreeRequest[],\n ) => Array<KnowledgeExplorerQueryState<KnowledgeExplorerTreeLevel>>;\n /** A page's recent activity, newest first. */\n useActivity?: (pageId: string) => KnowledgeExplorerQueryState<KnowledgeExplorerActivity>;\n}\n\nexport interface KnowledgePageExplorerProps {\n graph: KnowledgeExplorerGraph;\n source: KnowledgeExplorerSource;\n selectedPageId: string | null;\n /** `null` clears the selection: a click on empty graph canvas. */\n onSelect: (pageId: string | null) => void;\n view: KnowledgeExplorerView;\n onViewChange: (view: KnowledgeExplorerView) => void;\n}\n\nconst MIN_SEARCH_LENGTH = 2;\nconst noTreeLevels = () => [];\nconst noActivity = (): KnowledgeExplorerQueryState<KnowledgeExplorerActivity> => ({\n isPending: false,\n isError: false,\n error: null,\n});\n\nfunction isNotFound(error: unknown): boolean {\n return !!error && typeof error === 'object' && 'status' in error && error.status === 404;\n}\n\nfunction withPages(\n base: ReadonlyMap<string, KnowledgePagePayload>,\n pages: KnowledgePagePayload[],\n): ReadonlyMap<string, KnowledgePagePayload> {\n if (pages.length === 0) return base;\n const merged = new Map(base);\n for (const page of pages) merged.set(page.id, page);\n return merged;\n}\n\n/** `pages` narrowed to `scopeId` and everything below it, following parent links among the given pages. */\nfunction withinScope(pages: KnowledgePagePayload[], scopeId: string | null): KnowledgePagePayload[] {\n if (!scopeId) return pages;\n const byId = new Map(pages.map(page => [page.id, page]));\n const inside = new Map<string, boolean>([[scopeId, true]]);\n const isInside = (page: KnowledgePagePayload): boolean => {\n const known = inside.get(page.id);\n if (known !== undefined) return known;\n const parent = page.parentId ? byId.get(page.parentId) : undefined;\n inside.set(page.id, false);\n const result = !!parent && parent.id !== page.id && isInside(parent);\n inside.set(page.id, result);\n return result;\n };\n return pages.filter(isInside);\n}\n\nfunction MoreButton({ onClick, label = 'Load more' }: { onClick: () => void; label?: string }) {\n return (\n <button\n type=\"button\"\n className=\"self-start text-caption text-muted-foreground hover:text-foreground\"\n onClick={onClick}\n >\n {label}\n </button>\n );\n}\n\n/** The next page of a page's notes, then a button for the one after. */\nfunction MoreNotes({\n source,\n pageId,\n cursor,\n pagesById,\n onPageClick,\n}: {\n source: KnowledgeExplorerSource;\n pageId: string;\n cursor: string;\n pagesById: ReadonlyMap<string, KnowledgePagePayload>;\n onPageClick: (page: KnowledgePagePayload) => void;\n}) {\n const chunk = source.usePage(pageId, cursor);\n const [showNext, setShowNext] = useState(false);\n const known = useMemo(() => withPages(pagesById, chunk.data?.related ?? []), [chunk.data, pagesById]);\n if (chunk.isPending) return <p className=\"text-caption text-muted-foreground\">Loading notes…</p>;\n if (!chunk.data) return null;\n const next = chunk.data.notesNextCursor;\n return (\n <>\n <ul className=\"flex flex-col gap-3\">\n {chunk.data.notes.map(note => (\n <KnowledgeNoteItem key={note.id} note={note} pagesById={known} onPageClick={onPageClick} />\n ))}\n </ul>\n {next ? (\n showNext ? (\n <MoreNotes source={source} pageId={pageId} cursor={next} pagesById={pagesById} onPageClick={onPageClick} />\n ) : (\n <MoreButton label=\"Load more notes\" onClick={() => setShowNext(true)} />\n )\n ) : null}\n </>\n );\n}\n\n/** A page's children, a page at a time. */\nfunction ChildPages({\n useTreeLevels,\n parentId,\n onPageClick,\n}: {\n useTreeLevels: NonNullable<KnowledgeExplorerSource['useTreeLevels']>;\n parentId: string;\n onPageClick: (page: KnowledgePagePayload) => void;\n}) {\n const [cursors, setCursors] = useState<string[]>([]);\n const requests = useMemo(() => [{ parentId }, ...cursors.map(cursor => ({ parentId, cursor }))], [parentId, cursors]);\n const levels = useTreeLevels(requests);\n const pages = levels.flatMap(level => level.data?.pages ?? []);\n const last = levels[levels.length - 1];\n if (levels[0]?.isPending) return <p className=\"text-caption text-muted-foreground\">Loading pages…</p>;\n if (pages.length === 0) {\n return (\n <p className=\"text-body text-muted-foreground\" data-testid=\"knowledge-no-child-pages\">\n No pages under this one.\n </p>\n );\n }\n const next = last?.data?.nextCursor;\n return (\n <>\n <ul className=\"flex flex-col gap-1\">\n {pages.map(child => (\n <li key={child.id} className=\"flex flex-col\">\n <button\n type=\"button\"\n className=\"text-left text-body font-medium text-info-indicator hover:underline\"\n onClick={() => onPageClick(child)}\n >\n {child.name}\n </button>\n {child.description ? (\n <span className=\"truncate text-caption text-muted-foreground\">{child.description}</span>\n ) : null}\n </li>\n ))}\n </ul>\n {next ? <MoreButton onClick={() => setCursors(current => [...current, next])} /> : null}\n </>\n );\n}\n\ninterface MentionSelection {\n source: KnowledgePagePayload;\n target: KnowledgePagePayload;\n point: { x: number; y: number };\n pane: { width: number; height: number };\n}\n\n/** What a clicked mention line stands for: the notes on one page that mention the other. */\nfunction MentionPopup({\n source,\n mention,\n pagesById,\n onOpen,\n onClose,\n}: {\n source: KnowledgeExplorerSource;\n mention: MentionSelection;\n pagesById: ReadonlyMap<string, KnowledgePagePayload>;\n onOpen: (pageId: string) => void;\n onClose: () => void;\n}) {\n const detail = source.usePage(mention.source.id);\n const notes = (detail.data?.notes ?? []).filter(note => note.mentions.includes(mention.target.id));\n useEffect(() => {\n const onKey = (event: KeyboardEvent) => {\n if (event.key === 'Escape') onClose();\n };\n window.addEventListener('keydown', onKey);\n return () => window.removeEventListener('keydown', onKey);\n }, [onClose]);\n return (\n <div\n role=\"dialog\"\n aria-label={`${mention.source.name} mentions ${mention.target.name}`}\n data-testid=\"knowledge-mention-popup\"\n className=\"absolute z-20 flex w-80 max-w-[calc(100%-1rem)] flex-col gap-2 overflow-hidden rounded-lg border border-border bg-card p-3 shadow-overlay\"\n style={mentionPopupPlacement(mention)}\n >\n <div className=\"flex items-start gap-2\">\n <Txt as=\"h3\" variant=\"card-title\" className=\"min-w-0 flex-1\">\n <button type=\"button\" className=\"hover:underline\" onClick={() => onOpen(mention.source.id)}>\n {mention.source.name}\n </button>\n <Txt as=\"span\" variant=\"card-title\" tone=\"muted\">\n {' '}\n mentions{' '}\n </Txt>\n <button type=\"button\" className=\"hover:underline\" onClick={() => onOpen(mention.target.id)}>\n {mention.target.name}\n </button>\n </Txt>\n <button\n type=\"button\"\n aria-label=\"Close\"\n className=\"rounded p-0.5 text-muted-foreground hover:bg-fill hover:text-foreground\"\n onClick={onClose}\n >\n <X size={14} aria-hidden />\n </button>\n </div>\n <div className=\"min-h-0 overflow-y-auto\">\n {detail.isPending ? (\n <Txt variant=\"caption\" tone=\"muted\">\n Loading notes…\n </Txt>\n ) : notes.length === 0 ? (\n <Txt variant=\"caption\" tone=\"muted\">\n The notes that make this mention aren't in the first page of notes. Open {mention.source.name} to read them\n all.\n </Txt>\n ) : (\n <ul className=\"flex flex-col gap-2\">\n {notes.map(note => (\n <KnowledgeNoteItem\n key={note.id}\n note={note}\n pagesById={withPages(pagesById, detail.data?.related ?? [])}\n onPageClick={page => onOpen(page.id)}\n compact\n />\n ))}\n </ul>\n )}\n </div>\n </div>\n );\n}\n\nfunction SelectedPage({\n source,\n pageId,\n pagesById,\n onSelect,\n highlightMentionOf,\n}: {\n source: KnowledgeExplorerSource;\n pageId: string;\n pagesById: ReadonlyMap<string, KnowledgePagePayload>;\n onSelect: (pageId: string) => void;\n highlightMentionOf?: string;\n}) {\n const detail = source.usePage(pageId);\n const activity = (source.useActivity ?? noActivity)(pageId);\n const [moreNotes, setMoreNotes] = useState<{ pageId: string } | null>(null);\n const known = useMemo(\n () => (detail.data ? withPages(pagesById, [...detail.data.ancestors, ...detail.data.related]) : pagesById),\n [detail.data, pagesById],\n );\n\n if (detail.isPending) return <p className=\"text-ui-md p-4 text-muted-foreground\">Loading page…</p>;\n if (detail.isError || !detail.data) {\n const notFound = isNotFound(detail.error);\n return (\n <EmptyState\n tone=\"error\"\n variant=\"fill\"\n titleSlot={notFound ? 'Page not found' : 'Failed to load the page'}\n descriptionSlot={notFound ? 'It may have been deleted or merged.' : (detail.error?.message ?? '')}\n />\n );\n }\n const onPageClick = (page: KnowledgePagePayload) => onSelect(page.id);\n const next = detail.data.notesNextCursor;\n return (\n <KnowledgePageDetail\n page={detail.data.page}\n notes={detail.data.notes}\n pin={detail.data.pin ?? undefined}\n pagesById={known}\n onPageClick={onPageClick}\n highlightMentionOf={highlightMentionOf}\n ancestors={detail.data.ancestors}\n mentionedBy={detail.data.mentionedBy}\n activity={activity.data?.events}\n childPages={\n source.useTreeLevels ? (\n <ChildPages key={pageId} useTreeLevels={source.useTreeLevels} parentId={pageId} onPageClick={onPageClick} />\n ) : undefined\n }\n notesMore={\n next ? (\n moreNotes?.pageId === pageId ? (\n <MoreNotes source={source} pageId={pageId} cursor={next} pagesById={known} onPageClick={onPageClick} />\n ) : (\n <MoreButton label=\"Load more notes\" onClick={() => setMoreNotes({ pageId })} />\n )\n ) : undefined\n }\n />\n );\n}\n\nfunction SearchBox({ source, onSelect }: { source: KnowledgeExplorerSource; onSelect: (pageId: string) => void }) {\n const [query, setQuery] = useState('');\n const search = source.useSearch(query);\n const results = query.trim().length >= MIN_SEARCH_LENGTH ? (search.data?.results ?? []) : [];\n const seen = new Set<string>();\n const pages = results\n .map(hit => hit.page)\n .filter(page => (seen.has(page.id) ? false : (seen.add(page.id), true)))\n .slice(0, 10);\n return (\n <div className=\"relative min-w-60 flex-1\">\n <input\n aria-label=\"Search knowledge\"\n placeholder=\"Search pages and notes\"\n className=\"text-ui-md h-8 w-full rounded border border-border bg-card px-2\"\n value={query}\n onChange={event => setQuery(event.target.value)}\n />\n {pages.length > 0 ? (\n <ul\n role=\"listbox\"\n aria-label=\"Search results\"\n className=\"absolute z-20 mt-1 max-h-72 w-full overflow-auto rounded border border-border bg-card shadow-raised\"\n >\n {pages.map(page => (\n <li key={page.id} role=\"option\" aria-selected={false}>\n <button\n type=\"button\"\n className=\"text-ui-md w-full px-2 py-1.5 text-left hover:bg-muted\"\n onClick={() => {\n onSelect(page.id);\n setQuery('');\n }}\n >\n {page.name}\n </button>\n </li>\n ))}\n </ul>\n ) : null}\n </div>\n );\n}\n\n/**\n * The tree loaded a level at a time through `useTreeLevels`: the root scopes, then each level as it is\n * opened, plus the path to the selected page. Unloaded pages keep a chevron until opened.\n */\nfunction useLazyTree(\n source: KnowledgeExplorerSource,\n graph: KnowledgeExplorerGraph,\n selected: KnowledgeExplorerPageDetail | undefined,\n) {\n const [expanded, setExpanded] = useState<ReadonlySet<string>>(() => new Set());\n const [more, setMore] = useState<ReadonlyMap<string, string[]>>(() => new Map());\n const requests = useMemo(() => {\n const list: KnowledgeExplorerTreeRequest[] = [{ parentId: null }];\n for (const id of expanded) {\n list.push({ parentId: id });\n for (const cursor of more.get(id) ?? []) list.push({ parentId: id, cursor });\n }\n return list;\n }, [expanded, more]);\n const levels = (source.useTreeLevels ?? noTreeLevels)(requests);\n\n const { pages, loaded, nextCursor } = useMemo(() => {\n const byId = new Map<string, KnowledgePagePayload>();\n const loadedIds = new Set<string>();\n const next = new Map<string, string>();\n levels.forEach((level, index) => {\n const request = requests[index];\n if (!request || !level.data) return;\n const key = request.parentId ?? KNOWLEDGE_TREE_ROOT;\n loadedIds.add(key);\n for (const page of level.data.pages) byId.set(page.id, page);\n if (level.data.nextCursor) next.set(key, level.data.nextCursor);\n else next.delete(key);\n });\n // The selected page and its path, so the tree can open down to a page outside the loaded levels.\n for (const page of [...(selected?.ancestors ?? []), ...(selected ? [selected.page] : [])]) {\n if (!byId.has(page.id)) byId.set(page.id, page);\n }\n return { pages: [...byId.values()], loaded: loadedIds, nextCursor: next };\n }, [levels, requests, selected]);\n\n // With the whole graph loaded, its structure is complete: only pages with children get a chevron.\n const graphParents = useMemo(\n () => (graph.truncated ? null : new Set(graph.pages.map(page => page.parentId).filter(id => id !== null))),\n [graph],\n );\n const mayHaveChildren = useCallback(\n (page: KnowledgePagePayload) => !loaded.has(page.id) && (graphParents ? graphParents.has(page.id) : true),\n [loaded, graphParents],\n );\n const loadMore = useMemo(() => {\n const map = new Map<string, () => void>();\n for (const [parentId, cursor] of nextCursor) {\n map.set(parentId, () =>\n setMore(current => new Map(current).set(parentId, [...(current.get(parentId) ?? []), cursor])),\n );\n }\n return map;\n }, [nextCursor]);\n const onExpandedChange = useCallback((ids: ReadonlySet<string>) => setExpanded(new Set(ids)), []);\n\n return { pages, mayHaveChildren, loadMore, onExpandedChange, rootsPending: levels[0]?.isPending ?? false };\n}\n\n/**\n * Search, the page tree, and either the page graph or the selected page, kept in sync on one selection.\n * Wide screens show the tree beside the graph or the page; below `lg` one toggle picks tree, graph or page.\n * A first click on a page in the graph selects it; clicking it again opens it as a page. A search result\n * opens it as a page straight away. Selecting in the tree keeps the current view, so the graph frames the\n * page instead.\n */\nexport function KnowledgePageExplorer({\n graph,\n source,\n selectedPageId,\n onSelect,\n view,\n onViewChange,\n}: KnowledgePageExplorerProps) {\n const pagesById = useMemo(() => new Map(graph.pages.map(page => [page.id, page])), [graph.pages]);\n // A scope picked in the tree narrows the tree and the graph to that scope and what sits under it.\n const [focusScopeId, setFocusScopeId] = useState<string | null>(null);\n const mentionEdges = useMemo(() => graph.edges.filter(edge => edge.kind === 'mention'), [graph.edges]);\n // A clicked mention line shows the notes that make the mention; opening the page from there marks them.\n const [mention, setMention] = useState<MentionSelection | null>(null);\n const [marked, setMarked] = useState<{ source: string; target: string } | null>(null);\n const closeMention = useCallback(() => setMention(null), []);\n // Below lg the graph shares its slot with the tree. Mount it only when it is showing: a graph mounted\n // into a hidden 0×0 pane has nothing to fit and was left unfitted when the toggle revealed it.\n const narrow = useIsMobile(1024);\n const graphShown = !narrow || view === 'graph';\n const highlightMentionOf = marked && marked.source === selectedPageId ? marked.target : undefined;\n const selected = source.usePage(selectedPageId);\n const lazy = useLazyTree(source, graph, selected.data);\n const showPage = view === 'page' && !!selectedPageId;\n const openPage = (pageId: string) => {\n onSelect(pageId);\n onViewChange('page');\n };\n // From the tree: frame the page in the graph when the graph is up, otherwise open it.\n const selectFromTree = (page: KnowledgePagePayload) => {\n if (page.isScope) setFocusScopeId(page.id);\n if (view === 'graph') onSelect(page.id);\n else openPage(page.id);\n };\n // Pages reached from outside the tree (search, links, mentions) clear a focus they fall outside of.\n const openAnywhere = (pageId: string) => {\n if (focusScopeId && !withinScope([...lazy.pages, ...graph.pages], focusScopeId).some(page => page.id === pageId)) {\n setFocusScopeId(null);\n }\n openPage(pageId);\n };\n const focusScope = focusScopeId\n ? (lazy.pages.find(page => page.id === focusScopeId) ?? pagesById.get(focusScopeId))\n : undefined;\n const treePages = withinScope(source.useTreeLevels ? lazy.pages : graph.pages, focusScope ? focusScopeId : null);\n const graphPages = useMemo(\n () => withinScope(graph.pages, focusScope ? focusScopeId : null),\n [graph.pages, focusScope, focusScopeId],\n );\n const views: Array<{ value: KnowledgeExplorerView; label: string; narrowOnly?: boolean }> = [\n { value: 'tree', label: 'Tree', narrowOnly: true },\n { value: 'graph', label: 'Graph' },\n { value: 'page', label: 'Page' },\n ];\n\n return (\n <div className=\"flex min-h-0 flex-1 flex-col gap-3\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <SearchBox source={source} onSelect={openAnywhere} />\n <div role=\"group\" aria-label=\"View\" className=\"flex rounded border border-border\">\n {views.map(option => (\n <button\n key={option.value}\n type=\"button\"\n aria-pressed={\n option.value === 'page'\n ? showPage\n : option.value === 'graph'\n ? !showPage && view !== 'tree'\n : view === 'tree'\n }\n disabled={option.value === 'page' && !selectedPageId}\n className={`text-ui-md px-3 py-1 disabled:opacity-50 aria-pressed:bg-muted ${option.narrowOnly ? 'lg:hidden' : ''}`}\n onClick={() => onViewChange(option.value)}\n >\n {option.label}\n </button>\n ))}\n </div>\n </div>\n {graph.truncated && !showPage ? (\n <p className=\"text-ui-sm text-muted-foreground\">\n The graph shows the first {graph.pages.length} pages. Open the tree or search to reach the rest.\n </p>\n ) : null}\n {selectedPageId && !showPage && isNotFound(selected.error) ? (\n <p role=\"alert\" className=\"text-ui-sm text-destructive-foreground\">\n Page not found. The linked page may have been deleted or merged.\n </p>\n ) : null}\n <div className=\"flex min-h-0 flex-1 flex-col gap-3 lg:flex-row\">\n <aside\n className={`min-h-0 w-full flex-1 flex-col overflow-hidden rounded-lg border border-border bg-card lg:flex lg:w-72 lg:flex-none lg:shrink-0 ${view === 'tree' ? 'flex' : 'hidden'}`}\n >\n {focusScope ? (\n <div\n className=\"flex items-center gap-2 border-b border-border bg-fill-subtle px-3 py-2\"\n data-testid=\"knowledge-scope-focus\"\n >\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <Txt as=\"span\" variant=\"eyebrow\" tone=\"muted\" className=\"uppercase\">\n {focusScope.displayLabel ?? 'Scope'}\n </Txt>\n <Txt as=\"span\" variant=\"label\" tone=\"ink\" className=\"truncate\">\n {focusScope.address ?? focusScope.name}\n </Txt>\n </div>\n <button\n type=\"button\"\n className=\"text-ui-sm shrink-0 rounded px-2 py-1 text-muted-foreground hover:bg-fill hover:text-foreground\"\n onClick={() => setFocusScopeId(null)}\n >\n All scopes\n </button>\n </div>\n ) : null}\n <div className=\"min-h-0 flex-1 overflow-auto\">\n {source.useTreeLevels && lazy.rootsPending ? (\n <p className=\"px-3 py-2 text-body text-muted-foreground\">Loading pages…</p>\n ) : (\n <KnowledgePageTree\n key={focusScope ? focusScope.id : 'all'}\n pages={treePages}\n pinnedIds={graph.pinnedIds}\n selectedPageId={selectedPageId}\n onSelect={selectFromTree}\n initiallyExpanded={focusScope ? [focusScope.id] : undefined}\n {...(source.useTreeLevels\n ? {\n mayHaveChildren: lazy.mayHaveChildren,\n onExpandedChange: lazy.onExpandedChange,\n loadMore: lazy.loadMore,\n }\n : {})}\n />\n )}\n </div>\n </aside>\n {showPage ? (\n <section\n aria-label=\"Selected page\"\n className=\"min-h-0 min-w-0 flex-1 overflow-auto rounded-lg border border-border bg-card\"\n >\n <SelectedPage\n source={source}\n pageId={selectedPageId}\n pagesById={pagesById}\n onSelect={openAnywhere}\n highlightMentionOf={highlightMentionOf}\n />\n </section>\n ) : (\n <div\n className={`relative min-h-0 min-w-0 flex-1 overflow-hidden rounded-lg border border-border bg-background lg:block lg:h-full ${view === 'graph' ? 'block' : 'hidden'}`}\n data-testid=\"knowledge-graph-container\"\n >\n {graphShown ? (\n <KnowledgePageGraph\n pages={graphPages}\n edges={mentionEdges}\n pinnedIds={graph.pinnedIds}\n grants={graph.grants}\n selectedPageId={selectedPageId}\n onSelect={page => {\n onSelect(page.id);\n // Hosts resolve a `?page=` with no view to the page view, so say graph outright.\n if (view !== 'graph') onViewChange('graph');\n }}\n onOpen={page => openPage(page.id)}\n onClearSelection={() => {\n setMention(null);\n if (selectedPageId) onSelect(null);\n }}\n onMentionSelect={setMention}\n />\n ) : null}\n {mention && graphShown ? (\n <MentionPopup\n source={source}\n mention={mention}\n pagesById={pagesById}\n onClose={closeMention}\n onOpen={pageId => {\n setMarked(\n pageId === mention.source.id ? { source: mention.source.id, target: mention.target.id } : null,\n );\n setMention(null);\n openAnywhere(pageId);\n }}\n />\n ) : null}\n </div>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;AAiGA,IAAM,oBAAoB;AAC1B,IAAM,qBAAqB,CAAC;AAC5B,IAAM,oBAA4E;CAChF,WAAW;CACX,SAAS;CACT,OAAO;AACT;AAEA,SAAS,WAAW,OAAyB;CAC3C,OAAO,CAAC,CAAC,SAAS,OAAO,UAAU,YAAY,YAAY,SAAS,MAAM,WAAW;AACvF;AAEA,SAAS,UACP,MACA,OAC2C;CAC3C,IAAI,MAAM,WAAW,GAAG,OAAO;CAC/B,MAAM,SAAS,IAAI,IAAI,IAAI;CAC3B,KAAK,MAAM,QAAQ,OAAO,OAAO,IAAI,KAAK,IAAI,IAAI;CAClD,OAAO;AACT;;AAGA,SAAS,YAAY,OAA+B,SAAgD;CAClG,IAAI,CAAC,SAAS,OAAO;CACrB,MAAM,OAAO,IAAI,IAAI,MAAM,KAAI,SAAQ,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC;CACvD,MAAM,yBAAS,IAAI,IAAqB,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC;CACzD,MAAM,YAAY,SAAwC;EACxD,MAAM,QAAQ,OAAO,IAAI,KAAK,EAAE;EAChC,IAAI,UAAU,KAAA,GAAW,OAAO;EAChC,MAAM,SAAS,KAAK,WAAW,KAAK,IAAI,KAAK,QAAQ,IAAI,KAAA;EACzD,OAAO,IAAI,KAAK,IAAI,KAAK;EACzB,MAAM,SAAS,CAAC,CAAC,UAAU,OAAO,OAAO,KAAK,MAAM,SAAS,MAAM;EACnE,OAAO,IAAI,KAAK,IAAI,MAAM;EAC1B,OAAO;CACT;CACA,OAAO,MAAM,OAAO,QAAQ;AAC9B;AAEA,SAAS,WAAW,EAAE,SAAS,QAAQ,eAAwD;CAC7F,OACE,oBAAC,UAAD;EACE,MAAK;EACL,WAAU;EACD;EAER,UAAA;CACK,CAAA;AAEZ;;AAGA,SAAS,UAAU,EACjB,QACA,QACA,QACA,WACA,eAOC;CACD,MAAM,QAAQ,OAAO,QAAQ,QAAQ,MAAM;CAC3C,MAAM,CAAC,UAAU,eAAe,SAAS,KAAK;CAC9C,MAAM,QAAQ,cAAc,UAAU,WAAW,MAAM,MAAM,WAAW,CAAC,CAAC,GAAG,CAAC,MAAM,MAAM,SAAS,CAAC;CACpG,IAAI,MAAM,WAAW,OAAO,oBAAC,KAAD;EAAG,WAAU;EAAqC,UAAA;CAAiB,CAAA;CAC/F,IAAI,CAAC,MAAM,MAAM,OAAO;CACxB,MAAM,OAAO,MAAM,KAAK;CACxB,OACE,qBAAAA,YAAA,EAAA,UAAA,CACE,oBAAC,MAAD;EAAI,WAAU;EACX,UAAA,MAAM,KAAK,MAAM,KAAI,SACpB,oBAAC,mBAAD;GAAuC;GAAM,WAAW;GAAoB;EAAc,GAAlE,KAAK,EAA6D,CAC3F;CACC,CAAA,GACH,OACC,WACE,oBAAC,WAAD;EAAmB;EAAgB;EAAQ,QAAQ;EAAiB;EAAwB;CAAc,CAAA,IAE1G,oBAAC,YAAD;EAAY,OAAM;EAAkB,eAAe,YAAY,IAAI;CAAI,CAAA,IAEvE,IACJ,EAAA,CAAA;AAEN;;AAGA,SAAS,WAAW,EAClB,eACA,UACA,eAKC;CACD,MAAM,CAAC,SAAS,cAAc,SAAmB,CAAC,CAAC;CAEnD,MAAM,SAAS,cADE,cAAc,CAAC,EAAE,SAAS,GAAG,GAAG,QAAQ,KAAI,YAAW;EAAE;EAAU;CAAO,EAAE,CAAC,GAAG,CAAC,UAAU,OAAO,CACtF,CAAQ;CACrC,MAAM,QAAQ,OAAO,SAAQ,UAAS,MAAM,MAAM,SAAS,CAAC,CAAC;CAC7D,MAAM,OAAO,OAAO,OAAO,SAAS;CACpC,IAAI,OAAO,EAAE,EAAE,WAAW,OAAO,oBAAC,KAAD;EAAG,WAAU;EAAqC,UAAA;CAAiB,CAAA;CACpG,IAAI,MAAM,WAAW,GACnB,OACE,oBAAC,KAAD;EAAG,WAAU;EAAkC,eAAY;EAA2B,UAAA;CAEnF,CAAA;CAGP,MAAM,OAAO,MAAM,MAAM;CACzB,OACE,qBAAAA,YAAA,EAAA,UAAA,CACE,oBAAC,MAAD;EAAI,WAAU;EACX,UAAA,MAAM,KAAI,UACT,qBAAC,MAAD;GAAmB,WAAU;GAA7B,UAAA,CACE,oBAAC,UAAD;IACE,MAAK;IACL,WAAU;IACV,eAAe,YAAY,KAAK;IAE/B,UAAA,MAAM;GACD,CAAA,GACP,MAAM,cACL,oBAAC,QAAD;IAAM,WAAU;IAA+C,UAAA,MAAM;GAAkB,CAAA,IACrF,IACF;EAXK,GAAA,MAAM,EAWX,CACL;CACC,CAAA,GACH,OAAO,oBAAC,YAAD,EAAY,eAAe,YAAW,YAAW,CAAC,GAAG,SAAS,IAAI,CAAC,EAAI,CAAA,IAAI,IACnF,EAAA,CAAA;AAEN;;AAUA,SAAS,aAAa,EACpB,QACA,SACA,WACA,QACA,WAOC;CACD,MAAM,SAAS,OAAO,QAAQ,QAAQ,OAAO,EAAE;CAC/C,MAAM,SAAS,OAAO,MAAM,SAAS,CAAC,EAAA,CAAG,QAAO,SAAQ,KAAK,SAAS,SAAS,QAAQ,OAAO,EAAE,CAAC;CACjG,gBAAgB;EACd,MAAM,SAAS,UAAyB;GACtC,IAAI,MAAM,QAAQ,UAAU,QAAQ;EACtC;EACA,OAAO,iBAAiB,WAAW,KAAK;EACxC,aAAa,OAAO,oBAAoB,WAAW,KAAK;CAC1D,GAAG,CAAC,OAAO,CAAC;CACZ,OACE,qBAAC,OAAD;EACE,MAAK;EACL,cAAY,GAAG,QAAQ,OAAO,KAAK,YAAY,QAAQ,OAAO;EAC9D,eAAY;EACZ,WAAU;EACV,OAAO,sBAAsB,OAAO;EALtC,UAAA,CAOE,qBAAC,OAAD;GAAK,WAAU;GAAf,UAAA,CACE,qBAAC,KAAD;IAAK,IAAG;IAAK,SAAQ;IAAa,WAAU;IAA5C,UAAA;KACE,oBAAC,UAAD;MAAQ,MAAK;MAAS,WAAU;MAAkB,eAAe,OAAO,QAAQ,OAAO,EAAE;MACtF,UAAA,QAAQ,OAAO;KACV,CAAA;KACR,qBAAC,KAAD;MAAK,IAAG;MAAO,SAAQ;MAAa,MAAK;MAAzC,UAAA;OACG;OAAI;OACI;MACN;;KACL,oBAAC,UAAD;MAAQ,MAAK;MAAS,WAAU;MAAkB,eAAe,OAAO,QAAQ,OAAO,EAAE;MACtF,UAAA,QAAQ,OAAO;KACV,CAAA;IACL;GACL,CAAA,GAAA,oBAAC,UAAD;IACE,MAAK;IACL,cAAW;IACX,WAAU;IACV,SAAS;IAET,UAAA,oBAAC,GAAD;KAAG,MAAM;KAAI,eAAA;IAAa,CAAA;GACpB,CAAA,CACL;EACL,CAAA,GAAA,oBAAC,OAAD;GAAK,WAAU;GACZ,UAAA,OAAO,YACN,oBAAC,KAAD;IAAK,SAAQ;IAAU,MAAK;IAAQ,UAAA;GAE/B,CAAA,IACH,MAAM,WAAW,IACnB,qBAAC,KAAD;IAAK,SAAQ;IAAU,MAAK;IAA5B,UAAA;KAAoC;KACwC,QAAQ,OAAO;KAAK;IAE3F;GAEL,CAAA,IAAA,oBAAC,MAAD;IAAI,WAAU;IACX,UAAA,MAAM,KAAI,SACT,oBAAC,mBAAD;KAEQ;KACN,WAAW,UAAU,WAAW,OAAO,MAAM,WAAW,CAAC,CAAC;KAC1D,cAAa,SAAQ,OAAO,KAAK,EAAE;KACnC,SAAA;IACD,GALM,KAAK,EAKX,CACF;GACC,CAAA;EAEH,CAAA,CACF;;AAET;AAEA,SAAS,aAAa,EACpB,QACA,QACA,WACA,UACA,sBAOC;CACD,MAAM,SAAS,OAAO,QAAQ,MAAM;CACpC,MAAM,YAAY,OAAO,eAAe,WAAA,CAAY,MAAM;CAC1D,MAAM,CAAC,WAAW,gBAAgB,SAAoC,IAAI;CAC1E,MAAM,QAAQ,cACL,OAAO,OAAO,UAAU,WAAW,CAAC,GAAG,OAAO,KAAK,WAAW,GAAG,OAAO,KAAK,OAAO,CAAC,IAAI,WAChG,CAAC,OAAO,MAAM,SAAS,CACzB;CAEA,IAAI,OAAO,WAAW,OAAO,oBAAC,KAAD;EAAG,WAAU;EAAuC,UAAA;CAAgB,CAAA;CACjG,IAAI,OAAO,WAAW,CAAC,OAAO,MAAM;EAClC,MAAM,WAAW,WAAW,OAAO,KAAK;EACxC,OACE,oBAAC,YAAD;GACE,MAAK;GACL,SAAQ;GACR,WAAW,WAAW,mBAAmB;GACzC,iBAAiB,WAAW,wCAAyC,OAAO,OAAO,WAAW;EAC/F,CAAA;CAEL;CACA,MAAM,eAAe,SAA+B,SAAS,KAAK,EAAE;CACpE,MAAM,OAAO,OAAO,KAAK;CACzB,OACE,oBAAC,qBAAD;EACE,MAAM,OAAO,KAAK;EAClB,OAAO,OAAO,KAAK;EACnB,KAAK,OAAO,KAAK,OAAO,KAAA;EACxB,WAAW;EACE;EACO;EACpB,WAAW,OAAO,KAAK;EACvB,aAAa,OAAO,KAAK;EACzB,UAAU,SAAS,MAAM;EACzB,YACE,OAAO,gBACL,oBAAC,YAAD;GAAyB,eAAe,OAAO;GAAe,UAAU;GAAqB;EAAc,GAA1F,MAA0F,IACzG,KAAA;EAEN,WACE,OACE,WAAW,WAAW,SACpB,oBAAC,WAAD;GAAmB;GAAgB;GAAQ,QAAQ;GAAM,WAAW;GAAoB;EAAc,CAAA,IAEtG,oBAAC,YAAD;GAAY,OAAM;GAAkB,eAAe,aAAa,EAAE,OAAO,CAAC;EAAI,CAAA,IAE9E,KAAA;CAEP,CAAA;AAEL;AAEA,SAAS,UAAU,EAAE,QAAQ,YAAqF;CAChH,MAAM,CAAC,OAAO,YAAY,SAAS,EAAE;CACrC,MAAM,SAAS,OAAO,UAAU,KAAK;CACrC,MAAM,UAAU,MAAM,KAAK,CAAC,CAAC,UAAU,oBAAqB,OAAO,MAAM,WAAW,CAAC,IAAK,CAAC;CAC3F,MAAM,uBAAO,IAAI,IAAY;CAC7B,MAAM,QAAQ,QACX,KAAI,QAAO,IAAI,IAAI,CAAC,CACpB,QAAO,SAAS,KAAK,IAAI,KAAK,EAAE,IAAI,SAAS,KAAK,IAAI,KAAK,EAAE,GAAG,KAAM,CAAC,CACvE,MAAM,GAAG,EAAE;CACd,OACE,qBAAC,OAAD;EAAK,WAAU;EAAf,UAAA,CACE,oBAAC,SAAD;GACE,cAAW;GACX,aAAY;GACZ,WAAU;GACV,OAAO;GACP,WAAU,UAAS,SAAS,MAAM,OAAO,KAAK;EAC/C,CAAA,GACA,MAAM,SAAS,IACd,oBAAC,MAAD;GACE,MAAK;GACL,cAAW;GACX,WAAU;GAET,UAAA,MAAM,KAAI,SACT,oBAAC,MAAD;IAAkB,MAAK;IAAS,iBAAe;IAC7C,UAAA,oBAAC,UAAD;KACE,MAAK;KACL,WAAU;KACV,eAAe;MACb,SAAS,KAAK,EAAE;MAChB,SAAS,EAAE;KACb;KAEC,UAAA,KAAK;IACA,CAAA;GACN,GAXK,KAAK,EAWV,CACL;EACC,CAAA,IACF,IACD;;AAET;;;;;AAMA,SAAS,YACP,QACA,OACA,UACA;CACA,MAAM,CAAC,UAAU,eAAe,+BAAoC,IAAI,IAAI,CAAC;CAC7E,MAAM,CAAC,MAAM,WAAW,+BAA8C,IAAI,IAAI,CAAC;CAC/E,MAAM,WAAW,cAAc;EAC7B,MAAM,OAAuC,CAAC,EAAE,UAAU,KAAK,CAAC;EAChE,KAAK,MAAM,MAAM,UAAU;GACzB,KAAK,KAAK,EAAE,UAAU,GAAG,CAAC;GAC1B,KAAK,MAAM,UAAU,KAAK,IAAI,EAAE,KAAK,CAAC,GAAG,KAAK,KAAK;IAAE,UAAU;IAAI;GAAO,CAAC;EAC7E;EACA,OAAO;CACT,GAAG,CAAC,UAAU,IAAI,CAAC;CACnB,MAAM,UAAU,OAAO,iBAAiB,aAAA,CAAc,QAAQ;CAE9D,MAAM,EAAE,OAAO,QAAQ,eAAe,cAAc;EAClD,MAAM,uBAAO,IAAI,IAAkC;EACnD,MAAM,4BAAY,IAAI,IAAY;EAClC,MAAM,uBAAO,IAAI,IAAoB;EACrC,OAAO,SAAS,OAAO,UAAU;GAC/B,MAAM,UAAU,SAAS;GACzB,IAAI,CAAC,WAAW,CAAC,MAAM,MAAM;GAC7B,MAAM,MAAM,QAAQ,YAAA;GACpB,UAAU,IAAI,GAAG;GACjB,KAAK,MAAM,QAAQ,MAAM,KAAK,OAAO,KAAK,IAAI,KAAK,IAAI,IAAI;GAC3D,IAAI,MAAM,KAAK,YAAY,KAAK,IAAI,KAAK,MAAM,KAAK,UAAU;QACzD,KAAK,OAAO,GAAG;EACtB,CAAC;EAED,KAAK,MAAM,QAAQ,CAAC,GAAI,UAAU,aAAa,CAAC,GAAI,GAAI,WAAW,CAAC,SAAS,IAAI,IAAI,CAAC,CAAE,GACtF,IAAI,CAAC,KAAK,IAAI,KAAK,EAAE,GAAG,KAAK,IAAI,KAAK,IAAI,IAAI;EAEhD,OAAO;GAAE,OAAO,CAAC,GAAG,KAAK,OAAO,CAAC;GAAG,QAAQ;GAAW,YAAY;EAAK;CAC1E,GAAG;EAAC;EAAQ;EAAU;CAAQ,CAAC;CAG/B,MAAM,eAAe,cACZ,MAAM,YAAY,OAAO,IAAI,IAAI,MAAM,MAAM,KAAI,SAAQ,KAAK,QAAQ,CAAC,CAAC,QAAO,OAAM,OAAO,IAAI,CAAC,GACxG,CAAC,KAAK,CACR;CAgBA,OAAO;EAAE;EAAO,iBAfQ,aACrB,SAA+B,CAAC,OAAO,IAAI,KAAK,EAAE,MAAM,eAAe,aAAa,IAAI,KAAK,EAAE,IAAI,OACpG,CAAC,QAAQ,YAAY,CAaP;EAAiB,UAXhB,cAAc;GAC7B,MAAM,sBAAM,IAAI,IAAwB;GACxC,KAAK,MAAM,CAAC,UAAU,WAAW,YAC/B,IAAI,IAAI,gBACN,SAAQ,YAAW,IAAI,IAAI,OAAO,CAAC,CAAC,IAAI,UAAU,CAAC,GAAI,QAAQ,IAAI,QAAQ,KAAK,CAAC,GAAI,MAAM,CAAC,CAAC,CAC/F;GAEF,OAAO;EACT,GAAG,CAAC,UAAU,CAGmB;EAAU,kBAFlB,aAAa,QAA6B,YAAY,IAAI,IAAI,GAAG,CAAC,GAAG,CAAC,CAEpD;EAAkB,cAAc,OAAO,EAAE,EAAE,aAAa;CAAM;AAC3G;;;;;;;;AASA,SAAgB,sBAAsB,EACpC,OACA,QACA,gBACA,UACA,MACA,gBAC6B;CAC7B,MAAM,YAAY,cAAc,IAAI,IAAI,MAAM,MAAM,KAAI,SAAQ,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC;CAEhG,MAAM,CAAC,cAAc,mBAAmB,SAAwB,IAAI;CACpE,MAAM,eAAe,cAAc,MAAM,MAAM,QAAO,SAAQ,KAAK,SAAS,SAAS,GAAG,CAAC,MAAM,KAAK,CAAC;CAErG,MAAM,CAAC,SAAS,cAAc,SAAkC,IAAI;CACpE,MAAM,CAAC,QAAQ,aAAa,SAAoD,IAAI;CACpF,MAAM,eAAe,kBAAkB,WAAW,IAAI,GAAG,CAAC,CAAC;CAI3D,MAAM,aAAa,CADJ,YAAY,IACP,KAAU,SAAS;CACvC,MAAM,qBAAqB,UAAU,OAAO,WAAW,iBAAiB,OAAO,SAAS,KAAA;CACxF,MAAM,WAAW,OAAO,QAAQ,cAAc;CAC9C,MAAM,OAAO,YAAY,QAAQ,OAAO,SAAS,IAAI;CACrD,MAAM,WAAW,SAAS,UAAU,CAAC,CAAC;CACtC,MAAM,YAAY,WAAmB;EACnC,SAAS,MAAM;EACf,aAAa,MAAM;CACrB;CAEA,MAAM,kBAAkB,SAA+B;EACrD,IAAI,KAAK,SAAS,gBAAgB,KAAK,EAAE;EACzC,IAAI,SAAS,SAAS,SAAS,KAAK,EAAE;OACjC,SAAS,KAAK,EAAE;CACvB;CAEA,MAAM,gBAAgB,WAAmB;EACvC,IAAI,gBAAgB,CAAC,YAAY,CAAC,GAAG,KAAK,OAAO,GAAG,MAAM,KAAK,GAAG,YAAY,CAAC,CAAC,MAAK,SAAQ,KAAK,OAAO,MAAM,GAC7G,gBAAgB,IAAI;EAEtB,SAAS,MAAM;CACjB;CACA,MAAM,aAAa,eACd,KAAK,MAAM,MAAK,SAAQ,KAAK,OAAO,YAAY,KAAK,UAAU,IAAI,YAAY,IAChF,KAAA;CACJ,MAAM,YAAY,YAAY,OAAO,gBAAgB,KAAK,QAAQ,MAAM,OAAO,aAAa,eAAe,IAAI;CAC/G,MAAM,aAAa,cACX,YAAY,MAAM,OAAO,aAAa,eAAe,IAAI,GAC/D;EAAC,MAAM;EAAO;EAAY;CAAY,CACxC;CAOA,OACE,qBAAC,OAAD;EAAK,WAAU;EAAf,UAAA;GACE,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,oBAAC,WAAD;KAAmB;KAAQ,UAAU;IAAe,CAAA,GACpD,oBAAC,OAAD;KAAK,MAAK;KAAQ,cAAW;KAAO,WAAU;KAC3C,UAAA;MAVP;OAAE,OAAO;OAAQ,OAAO;OAAQ,YAAY;MAAK;MACjD;OAAE,OAAO;OAAS,OAAO;MAAQ;MACjC;OAAE,OAAO;OAAQ,OAAO;MAAO;KAQxB,CAAA,CAAM,KAAI,WACT,oBAAC,UAAD;MAEE,MAAK;MACL,gBACE,OAAO,UAAU,SACb,WACA,OAAO,UAAU,UACf,CAAC,YAAY,SAAS,SACtB,SAAS;MAEjB,UAAU,OAAO,UAAU,UAAU,CAAC;MACtC,WAAW,kEAAkE,OAAO,aAAa,cAAc;MAC/G,eAAe,aAAa,OAAO,KAAK;MAEvC,UAAA,OAAO;KACF,GAdD,OAAO,KAcN,CACT;IACE,CAAA,CACF;;GACJ,MAAM,aAAa,CAAC,WACnB,qBAAC,KAAD;IAAG,WAAU;IAAb,UAAA;KAAgD;KACnB,MAAM,MAAM;KAAO;IAC7C;GACD,CAAA,IAAA;GACH,kBAAkB,CAAC,YAAY,WAAW,SAAS,KAAK,IACvD,oBAAC,KAAD;IAAG,MAAK;IAAQ,WAAU;IAAyC,UAAA;GAEhE,CAAA,IACD;GACJ,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,qBAAC,SAAD;KACE,WAAW,mIAAmI,SAAS,SAAS,SAAS;KAD3K,UAAA,CAGG,aACC,qBAAC,OAAD;MACE,WAAU;MACV,eAAY;MAFd,UAAA,CAIE,qBAAC,OAAD;OAAK,WAAU;OAAf,UAAA,CACE,oBAAC,KAAD;QAAK,IAAG;QAAO,SAAQ;QAAU,MAAK;QAAQ,WAAU;QACrD,UAAA,WAAW,gBAAgB;OACzB,CAAA,GACL,oBAAC,KAAD;QAAK,IAAG;QAAO,SAAQ;QAAQ,MAAK;QAAM,WAAU;QACjD,UAAA,WAAW,WAAW,WAAW;OAC/B,CAAA,CACF;MACL,CAAA,GAAA,oBAAC,UAAD;OACE,MAAK;OACL,WAAU;OACV,eAAe,gBAAgB,IAAI;OACpC,UAAA;MAEO,CAAA,CACL;KACH,CAAA,IAAA,MACJ,oBAAC,OAAD;MAAK,WAAU;MACZ,UAAA,OAAO,iBAAiB,KAAK,eAC5B,oBAAC,KAAD;OAAG,WAAU;OAA4C,UAAA;MAAiB,CAAA,IAE1E,oBAAC,mBAAD;OAEE,OAAO;OACP,WAAW,MAAM;OACD;OAChB,UAAU;OACV,mBAAmB,aAAa,CAAC,WAAW,EAAE,IAAI,KAAA;OAClD,GAAK,OAAO,gBACR;QACE,iBAAiB,KAAK;QACtB,kBAAkB,KAAK;QACvB,UAAU,KAAK;OACjB,IACA,CAAC;MACN,GAbM,aAAa,WAAW,KAAK,KAanC;KAEA,CAAA,CACA;IACN,CAAA,GAAA,WACC,oBAAC,WAAD;KACE,cAAW;KACX,WAAU;KAEV,UAAA,oBAAC,cAAD;MACU;MACR,QAAQ;MACG;MACX,UAAU;MACU;KACrB,CAAA;IACM,CAAA,IAET,qBAAC,OAAD;KACE,WAAW,oHAAoH,SAAS,UAAU,UAAU;KAC5J,eAAY;KAFd,UAAA,CAIG,aACC,oBAAC,oBAAD;MACE,OAAO;MACP,OAAO;MACP,WAAW,MAAM;MACjB,QAAQ,MAAM;MACE;MAChB,WAAU,SAAQ;OAChB,SAAS,KAAK,EAAE;OAEhB,IAAI,SAAS,SAAS,aAAa,OAAO;MAC5C;MACA,SAAQ,SAAQ,SAAS,KAAK,EAAE;MAChC,wBAAwB;OACtB,WAAW,IAAI;OACf,IAAI,gBAAgB,SAAS,IAAI;MACnC;MACA,iBAAiB;KAClB,CAAA,IACC,MACH,WAAW,aACV,oBAAC,cAAD;MACU;MACC;MACE;MACX,SAAS;MACT,SAAQ,WAAU;OAChB,UACE,WAAW,QAAQ,OAAO,KAAK;QAAE,QAAQ,QAAQ,OAAO;QAAI,QAAQ,QAAQ,OAAO;OAAG,IAAI,IAC5F;OACA,WAAW,IAAI;OACf,aAAa,MAAM;MACrB;KACD,CAAA,IACC,IACD;IAEJ,CAAA,CAAA;;EACF;;AAET"}
|
|
1
|
+
{"version":3,"file":"KnowledgePageExplorer.es.js","names":["_Fragment"],"sources":["../../../../src/domains/knowledge/components/KnowledgePageExplorer.tsx"],"sourcesContent":["import { ArrowLeft, Hash, Link2, X } from 'lucide-react';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { REST_BATCH, isChildPlaceholder, isRestCircle, isScopeGroup, lazyGraph } from '../lib/graphShape';\nimport { bodyLinkEdges, bodyLinkRefs, knowledgePageRefIndex } from '../lib/pageRefs';\nimport { childCountLabel } from '../lib/pageTree';\nimport { mentionPopupPlacement } from '../lib/popupPlacement';\nimport { useStableWhile } from '../lib/useStableWhile';\n\nimport type {\n KnowledgePageActivityPayload,\n KnowledgeNotePayload,\n KnowledgePageEdge,\n KnowledgePagePayload,\n KnowledgePinPayload,\n KnowledgeScopeGrantPayload,\n} from '../pageTypes';\nimport { KnowledgeNoteItem, KnowledgePageDetail } from './KnowledgePageDetail';\nimport { KnowledgePageGraph } from './KnowledgePageGraph';\nimport { KNOWLEDGE_TREE_ROOT, KnowledgePageTree } from './KnowledgePageTree';\n\nimport { EmptyState } from '@/ds/components/EmptyState';\nimport { Txt } from '@/ds/components/Txt';\nimport { useIsMobile } from '@/hooks/use-is-mobile';\n\n/** `tree` is only a choice below `lg`; wider screens always show the tree beside the graph or the page. */\nexport type KnowledgeExplorerView = 'tree' | 'graph' | 'page';\n\n/** The bounded page graph a host loads. Without `useTreeLevels`, its pages also feed the tree. */\nexport interface KnowledgeExplorerGraph {\n pages: KnowledgePagePayload[];\n edges: KnowledgePageEdge[];\n pinnedIds: string[];\n /** Access grants between scopes; hosts whose server doesn't send them leave this out. */\n grants?: KnowledgeScopeGrantPayload[];\n truncated: boolean;\n}\n\nexport interface KnowledgeExplorerPageDetail {\n page: KnowledgePagePayload;\n notes: KnowledgeNotePayload[];\n /** Cursor for the page's next notes. */\n notesNextCursor?: string;\n pin?: KnowledgePinPayload | null;\n /** Ancestors and referenced pages, which may sit outside the loaded graph. */\n ancestors: KnowledgePagePayload[];\n related: KnowledgePagePayload[];\n /** Notes on other pages that mention this one. */\n mentionedBy?: KnowledgeNotePayload[];\n}\n\n/** One level of the tree: a parent's child scopes then its child pages, paged. */\nexport interface KnowledgeExplorerTreeLevel {\n pages: KnowledgePagePayload[];\n nextCursor?: string;\n}\n\nexport interface KnowledgeExplorerActivity {\n events: KnowledgePageActivityPayload[];\n}\n\nexport interface KnowledgeExplorerQueryState<T> {\n data?: T;\n isPending: boolean;\n isError: boolean;\n error: Error | null;\n}\n\nexport interface KnowledgeExplorerPageLinks {\n edges: Array<{ fromPageId: string; toPageId: string; kind: 'body' | 'note'; count: number }>;\n pages: KnowledgePagePayload[];\n truncated: boolean;\n}\n\n/** One request for a tree level: `parentId: null` for the root scopes. */\nexport interface KnowledgeExplorerTreeRequest {\n parentId: string | null;\n cursor?: string;\n}\n\n/** Page ids are ULIDs; a bare `[[id]]` is askable, a bare `[[Name]]` is not. */\nconst PAGE_ID_SHAPE = /^[0-9A-Z]{26}$/;\nconst JUST_CREATED_MS = 60_000;\nconst isJustCreated = (page: KnowledgePagePayload) => Date.now() - Date.parse(page.createdAt) < JUST_CREATED_MS;\n\n/**\n * Host data hooks. Each host binds them to its own routes (Studio to the Mastra client, Factory to its\n * project-scoped routes), so the explorer never knows a URL or an id outside the page ids it shows.\n * Pass the same functions every render: they are called as hooks.\n */\nexport interface KnowledgeExplorerSource {\n /** One page; `noteCursor` fetches a later page of its notes. Disabled when `pageId` is null. */\n usePage: (pageId: string | null, noteCursor?: string) => KnowledgeExplorerQueryState<KnowledgeExplorerPageDetail>;\n useSearch: (query: string) => { data?: { results: Array<{ page: KnowledgePagePayload }> } };\n /** Tree levels, one result per request in order (e.g. `useQueries`). Enables the lazily loaded tree and child pages. */\n useTreeLevels?: (\n requests: KnowledgeExplorerTreeRequest[],\n ) => Array<KnowledgeExplorerQueryState<KnowledgeExplorerTreeLevel>>;\n /**\n * Pages a link reaches, by id or `[[ref]]` (`scope#path`), one result per entry in order (e.g.\n * `useQueries`). Lets the focused page draw links to pages the graph hasn't loaded; without it only\n * links to loaded pages are drawn. A key the host can't resolve should come back as an error.\n */\n useLinkedPages?: (keys: string[]) => Array<KnowledgeExplorerQueryState<KnowledgeExplorerPageDetail>>;\n /**\n * Exact links into and out of each page (by `[[ref]]` or note mention), counted over the whole store, for\n * the pages the graph draws. Without it, or when it errors (a server with no link index answers 501), the\n * graph counts only the links between pages it has loaded.\n */\n useLinkCounts?: (pageIds: string[]) => KnowledgeExplorerQueryState<Record<string, { in: number; out: number }>>;\n /** One page's links with the pages at their other ends; fetched for the page under the pointer. Null disables it. */\n usePageLinks?: (pageId: string | null) => KnowledgeExplorerQueryState<KnowledgeExplorerPageLinks>;\n /** A page's recent activity, newest first. */\n useActivity?: (pageId: string) => KnowledgeExplorerQueryState<KnowledgeExplorerActivity>;\n}\n\nexport interface KnowledgePageExplorerProps {\n graph: KnowledgeExplorerGraph;\n source: KnowledgeExplorerSource;\n selectedPageId: string | null;\n /** `null` clears the selection: a click on empty graph canvas. */\n onSelect: (pageId: string | null) => void;\n view: KnowledgeExplorerView;\n onViewChange: (view: KnowledgeExplorerView) => void;\n}\n\nconst MIN_SEARCH_LENGTH = 2;\n/** Links of the selected page drawn at most in each direction; the rest are counted. */\nexport const FOCUS_LINK_CAP = 20;\n/** Keys fetched per direction: a page reached by a note and by the body is two keys but one link, so this is twice the cap. */\nconst FOCUS_LINK_FETCH_CAP = FOCUS_LINK_CAP * 2;\n\nfunction edgeKey(edge: KnowledgePageEdge) {\n return `${edge.kind}\\u0000${edge.source}\\u0000${edge.target}`;\n}\n\n/**\n * The links to draw, and per page how many of its links (into it, out of it) go undrawn. With all links\n * on, every link between drawn pages shows. Otherwise only the selected page's, up to\n * {@link FOCUS_LINK_CAP} each way; with nothing selected, none.\n */\nfunction visibleLinks(\n known: KnowledgePageEdge[],\n drawn: ReadonlyMap<string, KnowledgePagePayload>,\n selectedId: string | null,\n all: boolean,\n): { edges: KnowledgePageEdge[]; hidden: Map<string, { in: number; out: number }>; more: { in: number; out: number } } {\n const unique = new Map<string, KnowledgePageEdge>();\n for (const edge of known)\n if (edge.source !== edge.target && !unique.has(edgeKey(edge))) unique.set(edgeKey(edge), edge);\n // One link per pair and direction for counting, whether a note or a body makes it.\n const pairs = new Map<string, KnowledgePageEdge>();\n for (const edge of unique.values()) pairs.set(`${edge.source}\\u0000${edge.target}`, edge);\n const shown = new Set<string>();\n const more = { in: 0, out: 0 };\n if (all) {\n for (const [key, edge] of unique) if (drawn.has(edge.source) && drawn.has(edge.target)) shown.add(key);\n } else if (selectedId) {\n // The cap counts pages linked, not lines: a page reached by a note and by the body is one link.\n const admitted = new Set<string>();\n const over = new Set<string>();\n let ins = 0;\n let outs = 0;\n for (const [key, edge] of unique) {\n if (!drawn.has(edge.source) || !drawn.has(edge.target)) continue;\n const side = edge.source === selectedId ? 'out' : edge.target === selectedId ? 'in' : null;\n if (!side) continue;\n const pair = `${edge.source}\\u0000${edge.target}`;\n if (!admitted.has(pair) && !over.has(pair)) {\n if ((side === 'out' ? outs : ins) >= FOCUS_LINK_CAP) {\n over.add(pair);\n more[side]++;\n } else {\n admitted.add(pair);\n if (side === 'out') outs++;\n else ins++;\n }\n }\n if (admitted.has(pair)) shown.add(key);\n }\n }\n const drawnPairs = new Set(\n [...shown].map(key => {\n const edge = unique.get(key) as KnowledgePageEdge;\n return `${edge.source}\\u0000${edge.target}`;\n }),\n );\n const hidden = new Map<string, { in: number; out: number }>();\n const bump = (id: string, side: 'in' | 'out') => {\n if (!drawn.has(id)) return;\n const counts = hidden.get(id) ?? { in: 0, out: 0 };\n counts[side]++;\n hidden.set(id, counts);\n };\n for (const [pair, edge] of pairs) {\n if (drawnPairs.has(pair)) continue;\n bump(edge.source, 'out');\n bump(edge.target, 'in');\n }\n return { edges: [...unique.values()].filter(edge => shown.has(edgeKey(edge))), hidden, more };\n}\n/** The round buttons floating over the graph: muted when off or idle, a solid fill when pressed. */\nconst FLOAT_BUTTON =\n 'flex size-9 cursor-pointer items-center justify-center rounded-full border border-border bg-card text-muted-foreground shadow-overlay transition-colors hover:bg-fill-subtle hover:text-foreground aria-pressed:border-transparent aria-pressed:bg-fill-inverse aria-pressed:text-background aria-pressed:hover:bg-fill-inverse disabled:cursor-not-allowed disabled:opacity-40 disabled:hover:bg-card';\n\n/** How many earlier focuses Back remembers. */\nconst FOCUS_HISTORY_CAP = 50;\nconst noTreeLevels = () => [];\nconst noKeys: string[] = [];\nconst noLinkedPages = (): Array<KnowledgeExplorerQueryState<KnowledgeExplorerPageDetail>> => [];\nconst noLinkQuery = <T,>(): KnowledgeExplorerQueryState<T> => ({ isPending: false, isError: false, error: null });\n/** Longest a pointer rests on a page before its links are fetched, so sweeping across the graph fetches none. */\nconst HOVER_FETCH_DELAY_MS = 150;\n\n/** Per page, the links into and out of it that none of `shown` draws, given the exact totals. */\nfunction undrawnLinks(\n exact: ReadonlyMap<string, { in: number; out: number }>,\n shown: readonly KnowledgePageEdge[],\n): Map<string, { in: number; out: number }> {\n const drawn = new Map<string, { in: number; out: number }>();\n const pairs = new Set<string>();\n for (const edge of shown) {\n if (edge.kind === 'parent' || pairs.has(`${edge.source}\\u0000${edge.target}`)) continue;\n pairs.add(`${edge.source}\\u0000${edge.target}`);\n const out = drawn.get(edge.source) ?? { in: 0, out: 0 };\n out.out++;\n drawn.set(edge.source, out);\n const into = drawn.get(edge.target) ?? { in: 0, out: 0 };\n into.in++;\n drawn.set(edge.target, into);\n }\n const hidden = new Map<string, { in: number; out: number }>();\n for (const [id, total] of exact) {\n const seen = drawn.get(id) ?? { in: 0, out: 0 };\n hidden.set(id, { in: Math.max(0, total.in - seen.in), out: Math.max(0, total.out - seen.out) });\n }\n return hidden;\n}\nconst noActivity = (): KnowledgeExplorerQueryState<KnowledgeExplorerActivity> => ({\n isPending: false,\n isError: false,\n error: null,\n});\n\nfunction isNotFound(error: unknown): boolean {\n return !!error && typeof error === 'object' && 'status' in error && error.status === 404;\n}\n\nfunction withPages(\n base: ReadonlyMap<string, KnowledgePagePayload>,\n pages: KnowledgePagePayload[],\n): ReadonlyMap<string, KnowledgePagePayload> {\n if (pages.length === 0) return base;\n const merged = new Map(base);\n for (const page of pages) merged.set(page.id, page);\n return merged;\n}\n\n/** `pages` narrowed to `scopeId` and everything below it, following parent links among the given pages. */\nfunction withinScope(pages: KnowledgePagePayload[], scopeId: string | null): KnowledgePagePayload[] {\n if (!scopeId) return pages;\n const byId = new Map(pages.map(page => [page.id, page]));\n const inside = new Map<string, boolean>([[scopeId, true]]);\n const isInside = (page: KnowledgePagePayload): boolean => {\n const known = inside.get(page.id);\n if (known !== undefined) return known;\n const parent = page.parentId ? byId.get(page.parentId) : undefined;\n inside.set(page.id, false);\n const result = !!parent && parent.id !== page.id && isInside(parent);\n inside.set(page.id, result);\n return result;\n };\n return pages.filter(isInside);\n}\n\nfunction MoreButton({ onClick, label = 'Load more' }: { onClick: () => void; label?: string }) {\n return (\n <button\n type=\"button\"\n className=\"self-start text-caption text-muted-foreground hover:text-foreground\"\n onClick={onClick}\n >\n {label}\n </button>\n );\n}\n\n/** The next page of a page's notes, then a button for the one after. */\nfunction MoreNotes({\n source,\n pageId,\n cursor,\n pagesById,\n onPageClick,\n}: {\n source: KnowledgeExplorerSource;\n pageId: string;\n cursor: string;\n pagesById: ReadonlyMap<string, KnowledgePagePayload>;\n onPageClick: (page: KnowledgePagePayload) => void;\n}) {\n const chunk = source.usePage(pageId, cursor);\n const [showNext, setShowNext] = useState(false);\n const known = useMemo(() => withPages(pagesById, chunk.data?.related ?? []), [chunk.data, pagesById]);\n if (chunk.isPending) return <p className=\"text-caption text-muted-foreground\">Loading notes…</p>;\n if (!chunk.data) return null;\n const next = chunk.data.notesNextCursor;\n return (\n <>\n <ul className=\"flex flex-col gap-3\">\n {chunk.data.notes.map(note => (\n <KnowledgeNoteItem key={note.id} note={note} pagesById={known} onPageClick={onPageClick} />\n ))}\n </ul>\n {next ? (\n showNext ? (\n <MoreNotes source={source} pageId={pageId} cursor={next} pagesById={pagesById} onPageClick={onPageClick} />\n ) : (\n <MoreButton label=\"Load more notes\" onClick={() => setShowNext(true)} />\n )\n ) : null}\n </>\n );\n}\n\n/** A page's children, a page at a time. */\nfunction ChildPages({\n useTreeLevels,\n parentId,\n onPageClick,\n}: {\n useTreeLevels: NonNullable<KnowledgeExplorerSource['useTreeLevels']>;\n parentId: string;\n onPageClick: (page: KnowledgePagePayload) => void;\n}) {\n const [cursors, setCursors] = useState<string[]>([]);\n const requests = useMemo(() => [{ parentId }, ...cursors.map(cursor => ({ parentId, cursor }))], [parentId, cursors]);\n const levels = useTreeLevels(requests);\n const pages = levels.flatMap(level => level.data?.pages ?? []);\n const last = levels[levels.length - 1];\n if (levels[0]?.isPending) return <p className=\"text-caption text-muted-foreground\">Loading pages…</p>;\n if (pages.length === 0) {\n return (\n <p className=\"text-body text-muted-foreground\" data-testid=\"knowledge-no-child-pages\">\n No pages under this one.\n </p>\n );\n }\n const next = last?.data?.nextCursor;\n return (\n <>\n <ul className=\"flex flex-col gap-1\">\n {pages.map(child => (\n <li key={child.id} className=\"flex flex-col\">\n <button\n type=\"button\"\n className=\"text-left text-body font-medium text-info-indicator hover:underline\"\n onClick={() => onPageClick(child)}\n >\n {child.name}\n </button>\n {child.description ? (\n <span className=\"truncate text-caption text-muted-foreground\">{child.description}</span>\n ) : null}\n </li>\n ))}\n </ul>\n {next ? <MoreButton onClick={() => setCursors(current => [...current, next])} /> : null}\n </>\n );\n}\n\ninterface MentionSelection {\n source: KnowledgePagePayload;\n target: KnowledgePagePayload;\n point: { x: number; y: number };\n pane: { width: number; height: number };\n}\n\n/** What a clicked mention line stands for: the notes on one page that mention the other. */\nfunction MentionPopup({\n source,\n mention,\n pagesById,\n onOpen,\n onClose,\n}: {\n source: KnowledgeExplorerSource;\n mention: MentionSelection;\n pagesById: ReadonlyMap<string, KnowledgePagePayload>;\n onOpen: (pageId: string) => void;\n onClose: () => void;\n}) {\n const detail = source.usePage(mention.source.id);\n const notes = (detail.data?.notes ?? []).filter(note => note.mentions.includes(mention.target.id));\n useEffect(() => {\n const onKey = (event: KeyboardEvent) => {\n if (event.key === 'Escape') onClose();\n };\n window.addEventListener('keydown', onKey);\n return () => window.removeEventListener('keydown', onKey);\n }, [onClose]);\n return (\n <div\n role=\"dialog\"\n aria-label={`${mention.source.name} mentions ${mention.target.name}`}\n data-testid=\"knowledge-mention-popup\"\n className=\"absolute z-20 flex w-80 max-w-[calc(100%-1rem)] flex-col gap-2 overflow-hidden rounded-lg border border-border bg-card p-3 shadow-overlay\"\n style={mentionPopupPlacement(mention)}\n >\n <div className=\"flex items-start gap-2\">\n <Txt as=\"h3\" variant=\"card-title\" className=\"min-w-0 flex-1\">\n <button type=\"button\" className=\"hover:underline\" onClick={() => onOpen(mention.source.id)}>\n {mention.source.name}\n </button>\n <Txt as=\"span\" variant=\"card-title\" tone=\"muted\">\n {' '}\n mentions{' '}\n </Txt>\n <button type=\"button\" className=\"hover:underline\" onClick={() => onOpen(mention.target.id)}>\n {mention.target.name}\n </button>\n </Txt>\n <button\n type=\"button\"\n aria-label=\"Close\"\n className=\"rounded p-0.5 text-muted-foreground hover:bg-fill hover:text-foreground\"\n onClick={onClose}\n >\n <X size={14} aria-hidden />\n </button>\n </div>\n <div className=\"min-h-0 overflow-y-auto\">\n {detail.isPending ? (\n <Txt variant=\"caption\" tone=\"muted\">\n Loading notes…\n </Txt>\n ) : notes.length === 0 ? (\n <Txt variant=\"caption\" tone=\"muted\">\n The notes that make this mention aren't in the first page of notes. Open {mention.source.name} to read them\n all.\n </Txt>\n ) : (\n <ul className=\"flex flex-col gap-2\">\n {notes.map(note => (\n <KnowledgeNoteItem\n key={note.id}\n note={note}\n pagesById={withPages(pagesById, detail.data?.related ?? [])}\n onPageClick={page => onOpen(page.id)}\n compact\n />\n ))}\n </ul>\n )}\n </div>\n </div>\n );\n}\n\nfunction SelectedPage({\n source,\n pageId,\n pagesById,\n onSelect,\n highlightMentionOf,\n}: {\n source: KnowledgeExplorerSource;\n pageId: string;\n pagesById: ReadonlyMap<string, KnowledgePagePayload>;\n onSelect: (pageId: string) => void;\n highlightMentionOf?: string;\n}) {\n const detail = source.usePage(pageId);\n const activity = (source.useActivity ?? noActivity)(pageId);\n const [moreNotes, setMoreNotes] = useState<{ pageId: string } | null>(null);\n const known = useMemo(\n () => (detail.data ? withPages(pagesById, [...detail.data.ancestors, ...detail.data.related]) : pagesById),\n [detail.data, pagesById],\n );\n\n if (detail.isPending) return <p className=\"text-ui-md p-4 text-muted-foreground\">Loading page…</p>;\n if (detail.isError || !detail.data) {\n const notFound = isNotFound(detail.error);\n return (\n <EmptyState\n tone=\"error\"\n variant=\"fill\"\n titleSlot={notFound ? 'Page not found' : 'Failed to load the page'}\n descriptionSlot={notFound ? 'It may have been deleted or merged.' : (detail.error?.message ?? '')}\n />\n );\n }\n const onPageClick = (page: KnowledgePagePayload) => onSelect(page.id);\n const next = detail.data.notesNextCursor;\n return (\n <KnowledgePageDetail\n page={detail.data.page}\n notes={detail.data.notes}\n pin={detail.data.pin ?? undefined}\n pagesById={known}\n onPageClick={onPageClick}\n highlightMentionOf={highlightMentionOf}\n ancestors={detail.data.ancestors}\n mentionedBy={detail.data.mentionedBy}\n activity={activity.data?.events}\n childPages={\n source.useTreeLevels ? (\n <ChildPages key={pageId} useTreeLevels={source.useTreeLevels} parentId={pageId} onPageClick={onPageClick} />\n ) : undefined\n }\n notesMore={\n next ? (\n moreNotes?.pageId === pageId ? (\n <MoreNotes source={source} pageId={pageId} cursor={next} pagesById={known} onPageClick={onPageClick} />\n ) : (\n <MoreButton label=\"Load more notes\" onClick={() => setMoreNotes({ pageId })} />\n )\n ) : undefined\n }\n />\n );\n}\n\nfunction SearchBox({ source, onSelect }: { source: KnowledgeExplorerSource; onSelect: (pageId: string) => void }) {\n const [query, setQuery] = useState('');\n const search = source.useSearch(query);\n const results = query.trim().length >= MIN_SEARCH_LENGTH ? (search.data?.results ?? []) : [];\n const seen = new Set<string>();\n const pages = results\n .map(hit => hit.page)\n .filter(page => (seen.has(page.id) ? false : (seen.add(page.id), true)))\n .slice(0, 10);\n return (\n <div className=\"relative min-w-60 flex-1\">\n <input\n aria-label=\"Search knowledge\"\n placeholder=\"Search pages and notes\"\n className=\"text-ui-md h-8 w-full rounded border border-border bg-card px-2\"\n value={query}\n onChange={event => setQuery(event.target.value)}\n />\n {pages.length > 0 ? (\n <ul\n role=\"listbox\"\n aria-label=\"Search results\"\n className=\"absolute z-20 mt-1 max-h-72 w-full overflow-auto rounded border border-border bg-card shadow-raised\"\n >\n {pages.map(page => (\n <li key={page.id} role=\"option\" aria-selected={false}>\n <button\n type=\"button\"\n className=\"text-ui-md w-full px-2 py-1.5 text-left hover:bg-muted\"\n onClick={() => {\n onSelect(page.id);\n setQuery('');\n }}\n >\n {page.name}\n </button>\n </li>\n ))}\n </ul>\n ) : null}\n </div>\n );\n}\n\ntype LevelResult = {\n pages: KnowledgePagePayload[];\n loaded: ReadonlySet<string>;\n failed: ReadonlySet<string>;\n nextCursor: ReadonlyMap<string, string>;\n};\n\n// Compares pages by identity, so a host must not mutate a page payload in place: a new page is a new object.\nfunction sameLevels(a: LevelResult, b: LevelResult) {\n const sameSet = (x: ReadonlySet<string>, y: ReadonlySet<string>) =>\n x.size === y.size && [...x].every(id => y.has(id));\n return (\n a.pages.length === b.pages.length &&\n a.pages.every((page, index) => page === b.pages[index]) &&\n sameSet(a.loaded, b.loaded) &&\n sameSet(a.failed, b.failed) &&\n a.nextCursor.size === b.nextCursor.size &&\n [...a.nextCursor].every(([id, cursor]) => b.nextCursor.get(id) === cursor)\n );\n}\n\n/**\n * The tree loaded a level at a time through `useTreeLevels`: the root scopes, then each level as it is\n * opened, plus the path to the selected page. Unloaded pages keep a chevron until opened.\n */\nfunction useLazyTree(\n source: KnowledgeExplorerSource,\n graph: KnowledgeExplorerGraph,\n selected: KnowledgeExplorerPageDetail | undefined,\n // Pages focused in the graph: their first level of children loads too, so the graph can draw them.\n graphOpened: readonly string[],\n) {\n const [expanded, setExpanded] = useState<ReadonlySet<string>>(() => new Set());\n const [more, setMore] = useState<ReadonlyMap<string, string[]>>(() => new Map());\n const requests = useMemo(() => {\n const list: KnowledgeExplorerTreeRequest[] = [{ parentId: null }];\n for (const id of expanded) {\n list.push({ parentId: id });\n for (const cursor of more.get(id) ?? []) list.push({ parentId: id, cursor });\n }\n for (const id of graphOpened) if (!expanded.has(id)) list.push({ parentId: id });\n return list;\n }, [expanded, more, graphOpened]);\n const levels = (source.useTreeLevels ?? noTreeLevels)(requests);\n\n const built = useMemo(() => {\n const failedIds = new Set<string>();\n const byId = new Map<string, KnowledgePagePayload>();\n const loadedIds = new Set<string>();\n const next = new Map<string, string>();\n levels.forEach((level, index) => {\n const request = requests[index];\n if (!request) return;\n const key = request.parentId ?? KNOWLEDGE_TREE_ROOT;\n if (level.isError) failedIds.add(key);\n if (!level.data) return;\n loadedIds.add(key);\n for (const page of level.data.pages) byId.set(page.id, page);\n if (level.data.nextCursor) next.set(key, level.data.nextCursor);\n else next.delete(key);\n });\n // The selected page and its path, so the tree can open down to a page outside the loaded levels.\n for (const page of [...(selected?.ancestors ?? []), ...(selected ? [selected.page] : [])]) {\n if (!byId.has(page.id)) byId.set(page.id, page);\n }\n return { pages: [...byId.values()], loaded: loadedIds, failed: failedIds, nextCursor: next };\n }, [levels, requests, selected]);\n // `levels` is a new array every render, so what is built from it is too: keep the previous result while\n // its pages are the same objects, or every render (a hover's, say) would lay the whole graph out again.\n const { pages, loaded, failed, nextCursor } = useStableWhile(built, sameLevels);\n\n // With the whole graph loaded, its structure is complete: only pages with children get a chevron.\n const graphParents = useMemo(\n () => (graph.truncated ? null : new Set(graph.pages.map(page => page.parentId).filter(id => id !== null))),\n [graph],\n );\n // A counted page has children exactly when its count says so. An uncounted one is guessed from the graph,\n // except a page created a moment ago, which has no children yet and shows no arrow while its level is counted.\n const mayHaveChildren = useCallback(\n (page: KnowledgePagePayload) =>\n !loaded.has(page.id) &&\n (page.childCountCapped ||\n (page.childCount !== undefined\n ? page.childCount > 0\n : !isJustCreated(page) && (graphParents ? graphParents.has(page.id) : true))),\n [loaded, graphParents],\n );\n const loadMore = useMemo(() => {\n const map = new Map<string, () => void>();\n for (const [parentId, cursor] of nextCursor) {\n map.set(parentId, () =>\n setMore(current => new Map(current).set(parentId, [...(current.get(parentId) ?? []), cursor])),\n );\n }\n return map;\n }, [nextCursor]);\n const onExpandedChange = useCallback((ids: ReadonlySet<string>) => setExpanded(new Set(ids)), []);\n\n return {\n pages,\n loaded,\n failed,\n mayHaveChildren,\n loadMore,\n onExpandedChange,\n rootsPending: levels[0]?.isPending ?? false,\n };\n}\n\n/**\n * Search, the page tree, and either the page graph or the selected page, kept in sync on one selection.\n * Wide screens show the tree beside the graph or the page; below `lg` one toggle picks tree, graph or page.\n * A first click on a page in the graph selects it; clicking it again opens it as a page. A search result\n * opens it as a page straight away. Selecting in the tree keeps the current view, so the graph frames the\n * page instead.\n */\nexport function KnowledgePageExplorer({\n graph,\n source,\n selectedPageId,\n onSelect,\n view,\n onViewChange,\n}: KnowledgePageExplorerProps) {\n const selected = source.usePage(selectedPageId);\n const lazyMode = !!source.useTreeLevels;\n // Parents whose next level the graph loads: the focus and its parent (or the root scopes), plus any\n // page whose stand-in dots the pointer rested on.\n const [graphOpened, setGraphOpened] = useState<readonly string[]>([]);\n const [previewed, setPreviewed] = useState<readonly string[]>([]);\n const [openGroups, setOpenGroups] = useState<ReadonlySet<string>>(() => new Set());\n // Children drawn past the cap, per parent, as its \"+N more\" circle is clicked.\n const [revealed, setRevealed] = useState<ReadonlyMap<string, number>>(() => new Map());\n const [allLinks, setAllLinks] = useState(false);\n const [dotCounts, setDotCounts] = useState(true);\n const lazy = useLazyTree(source, graph, selected.data, graphOpened);\n // With tree levels the graph loads like the tree: the focus (or the root scopes) and what sits around\n // it, never the whole instance. Without them it draws the host's bounded graph as it is.\n const drawnGraph = useMemo(\n () =>\n lazyMode\n ? lazyGraph({\n // The host's bounded graph fills in pages a level's first chunk didn't reach; tree levels win.\n pages: [...new Map([...graph.pages, ...lazy.pages].map(page => [page.id, page])).values()],\n loadedParents: lazy.loaded,\n rootKey: KNOWLEDGE_TREE_ROOT,\n focusId: selectedPageId,\n openGroups,\n revealed,\n })\n : {\n pages: graph.pages,\n hiddenChildren: new Map<string, { hidden: number; drawn: number }>(),\n wanted: [],\n hub: null,\n },\n [lazyMode, lazy.pages, lazy.loaded, selectedPageId, openGroups, revealed, graph.pages],\n );\n // The pages the focus needs are in (or failed to load): only then does the graph move to the new focus.\n const graphSettled = !lazyMode || drawnGraph.wanted.every(id => lazy.loaded.has(id) || lazy.failed.has(id));\n useEffect(() => {\n if (!lazyMode || view === 'page') return;\n const next = [...new Set([...drawnGraph.wanted, ...previewed])];\n setGraphOpened(current =>\n current.length === next.length && current.every((id, index) => id === next[index]) ? current : next,\n );\n }, [lazyMode, view, drawnGraph.wanted, previewed]);\n\n // The selected page's own links: its notes' mentions and `[[links]]` in its body going out, notes\n // elsewhere that mention it coming in. Each end is a page id or a ref; the ends the explorer holds\n // resolve at once, the rest are fetched (up to twice FOCUS_LINK_CAP keys each way, outranking sibling dots).\n const focusLinkList = (source.usePageLinks ?? noLinkQuery)(view === 'graph' ? selectedPageId : null).data;\n const linkEnds = useMemo(() => {\n const detail = selected.data;\n if (!detail || detail.page.id !== selectedPageId) return null;\n const known = new Map([...lazy.pages, ...detail.ancestors, ...detail.related].map(page => [page.id, page]));\n const index = knowledgePageRefIndex(known.values());\n const own = detail.page.id;\n const mentions = detail.notes.flatMap(note => note.mentions).filter(key => key && key !== own);\n const refs = bodyLinkRefs(detail.page.body ?? '')\n .map(ref => ref.trim())\n .filter(key => key && key !== own);\n const out = [...mentions, ...refs];\n // The page route resolves ids and `scope#path` refs, never a bare name: a `[[Name]]` the explorer does not hold\n // is not fetched (the link index supplies its edge), so it does not 404.\n const mentioned = new Set(mentions);\n const unaskable = new Set(\n refs.filter(ref => !ref.includes(':') && !PAGE_ID_SHAPE.test(ref) && !mentioned.has(ref)),\n );\n // Notes that mention this page, and (when the host lists links) bodies that link to it: a note edge is a\n // mention, a body edge a link, so a page that both links and mentions draws each once.\n const listed = (focusLinkList?.edges ?? []).filter(edge => edge.toPageId === own);\n const noteInto = [\n ...new Set([\n ...(detail.mentionedBy ?? []).map(note => note.pageId),\n ...listed.filter(edge => edge.kind === 'note').map(edge => edge.fromPageId),\n ]),\n ].filter(id => id !== own);\n const bodyInto = [...new Set(listed.filter(edge => edge.kind === 'body').map(edge => edge.fromPageId))].filter(\n id => id !== own,\n );\n const into = [...new Set([...noteInto, ...bodyInto])];\n const lookup = (key: string) => known.get(key) ?? index.resolve(key);\n const missing = (keys: string[]) => [...new Set(keys.filter(key => !lookup(key) && !unaskable.has(key)))];\n const resolvedCount = (keys: string[]) => new Set(keys.flatMap(key => lookup(key)?.id ?? [])).size;\n const room = (keys: string[]) => Math.max(0, FOCUS_LINK_FETCH_CAP - resolvedCount(keys));\n const wantOut = missing(out);\n const wantIn = missing(into);\n return {\n detail,\n known,\n mentions,\n refs,\n into,\n noteInto,\n bodyInto,\n lookup,\n fetchKeys: [...wantOut.slice(0, room(out)), ...wantIn.slice(0, room(into))],\n unfetched: {\n out: Math.max(0, wantOut.length - room(out)),\n in: Math.max(0, wantIn.length - room(into)),\n },\n };\n }, [selected.data, selectedPageId, lazy.pages, focusLinkList]);\n const fetchKeys = linkEnds?.fetchKeys ?? noKeys;\n const fetchedStates = (source.useLinkedPages ?? noLinkedPages)(fetchKeys);\n const fetchedSignature = fetchKeys\n .map((key, index) => `${key}=${fetchedStates[index]?.data?.page?.id ?? ''}`)\n .join('|');\n const fetchedPages = useMemo(() => {\n const byKey = new Map<string, KnowledgePagePayload>();\n fetchKeys.forEach((key, index) => {\n const page = fetchedStates[index]?.data?.page;\n if (page) byKey.set(key, page);\n });\n return byKey;\n // eslint-disable-next-line react-hooks/exhaustive-deps -- states are new arrays each render; the signature names which pages arrived\n }, [fetchedSignature]);\n const focusLinks = useMemo(() => {\n if (!linkEnds) return { edges: [], pages: [], unfetched: { in: 0, out: 0 } };\n const { detail, lookup, mentions, refs, noteInto, bodyInto } = linkEnds;\n const resolve = (key: string) => lookup(key) ?? fetchedPages.get(key);\n const own = detail.page.id;\n const edges: KnowledgePageEdge[] = [];\n const pages = new Map<string, KnowledgePagePayload>();\n const reach = (key: string, kind: 'mention' | 'link', side: 'out' | 'in') => {\n const target = resolve(key);\n if (!target || target.id === own) {\n // An unfetched id still draws its edge, counted as not shown until its page arrives.\n if (!target && kind === 'mention' && side === 'out') edges.push({ source: own, target: key, kind });\n if (!target && side === 'in') edges.push({ source: key, target: own, kind });\n return;\n }\n pages.set(target.id, target);\n edges.push(side === 'out' ? { source: own, target: target.id, kind } : { source: target.id, target: own, kind });\n };\n for (const key of mentions) reach(key, 'mention', 'out');\n for (const key of refs) reach(key, 'link', 'out');\n for (const key of noteInto) reach(key, 'mention', 'in');\n for (const key of bodyInto) reach(key, 'link', 'in');\n return {\n edges: edges.filter(edge => edge.source !== edge.target),\n pages: [...pages.values()],\n unfetched: linkEnds.unfetched,\n };\n }, [linkEnds, fetchedPages]);\n\n const focusLinkIds = useMemo(() => new Set(focusLinks.pages.map(page => page.id)), [focusLinks.pages]);\n const drawn = useMemo(() => {\n const ids = new Set(drawnGraph.pages.map(page => page.id));\n const extra = focusLinks.pages.filter(page => !ids.has(page.id));\n return { ...drawnGraph, pages: extra.length ? [...drawnGraph.pages, ...extra] : drawnGraph.pages };\n }, [drawnGraph, focusLinks.pages]);\n const pagesById = useMemo(() => new Map(drawn.pages.map(page => [page.id, page])), [drawn.pages]);\n const previewParent = (parentId: string) =>\n // The last few only, so hovering around the graph never keeps an unbounded set of levels loading.\n setPreviewed(current => (current.includes(parentId) ? current : [...current, parentId].slice(-8)));\n // A scope picked in the tree narrows the tree and the graph to that scope and what sits under it.\n const [focusScopeId, setFocusScopeId] = useState<string | null>(null);\n // Every link the explorer knows of: mentions the host's graph found, `[[links]]` in loaded bodies,\n // and the selected page's own. Only the selected page's are drawn (capped) unless all links are on.\n const knownLinks = useMemo(() => {\n // A body link the loaded page shows and the link index lists is one line, not two.\n const seen = new Set<string>();\n return [\n ...graph.edges.filter(edge => edge.kind === 'mention'),\n ...bodyLinkEdges(drawn.pages),\n ...focusLinks.edges,\n ].filter(edge => {\n const key = `${edge.kind}:${edge.source}>${edge.target}`;\n return seen.has(key) ? false : (seen.add(key), true);\n });\n }, [graph.edges, drawn.pages, focusLinks.edges]);\n const linkView = useMemo(\n () => visibleLinks(knownLinks, pagesById, selectedPageId, allLinks),\n [knownLinks, pagesById, selectedPageId, allLinks],\n );\n const linkEdges = linkView.edges;\n // Exact counts for the pages the graph holds, in batches the host's route accepts; a failure (a\n // server with no link index) leaves the counts to what the loaded pages show.\n const countIds = useMemo(\n () =>\n drawn.pages\n .filter(page => !isChildPlaceholder(page) && !isRestCircle(page) && !isScopeGroup(page))\n .map(page => page.id)\n .sort(),\n [drawn.pages],\n );\n const counted = (source.useLinkCounts ?? noLinkQuery)(view === 'graph' ? countIds : []);\n const exactCounts = useMemo(() => (counted.data ? new Map(Object.entries(counted.data)) : undefined), [counted.data]);\n const hiddenLinks = useMemo(\n () => (exactCounts ? undrawnLinks(exactCounts, linkEdges) : linkView.hidden),\n [exactCounts, linkEdges, linkView.hidden],\n );\n // The page under the pointer: once it rests there its real links are fetched and drawn to whichever\n // ends are on screen; the rest are counted as not shown.\n // Only a pointer that rests re-renders the explorer: passing over pages sets and clears a timer.\n const [hoverFetchId, setHoverFetchId] = useState<string | null>(null);\n const hoverTimer = useRef<ReturnType<typeof setTimeout>>(undefined);\n const setHoveredId = useCallback((id: string | null) => {\n clearTimeout(hoverTimer.current);\n if (id) hoverTimer.current = setTimeout(() => setHoverFetchId(id), HOVER_FETCH_DELAY_MS);\n else setHoverFetchId(null);\n }, []);\n useEffect(() => () => clearTimeout(hoverTimer.current), []);\n const hovered = (source.usePageLinks ?? noLinkQuery)(hoverFetchId);\n const hoverEdges = useMemo<KnowledgePageEdge[]>(\n () =>\n hoverFetchId && hovered.data\n ? hovered.data.edges.map(edge => ({\n source: edge.fromPageId,\n target: edge.toPageId,\n kind: edge.kind === 'body' ? ('link' as const) : ('mention' as const),\n count: edge.count,\n }))\n : [],\n [hoverFetchId, hovered.data],\n );\n\n // A clicked mention line shows the notes that make the mention; opening the page from there marks them.\n const [mention, setMention] = useState<MentionSelection | null>(null);\n const [marked, setMarked] = useState<{ source: string; target: string } | null>(null);\n const closeMention = useCallback(() => setMention(null), []);\n // Below lg the graph shares its slot with the tree. Mount it only when it is showing: a graph mounted\n // into a hidden 0×0 pane has nothing to fit and was left unfitted when the toggle revealed it.\n const narrow = useIsMobile(1024);\n const graphShown = !narrow || view === 'graph';\n const highlightMentionOf = marked && marked.source === selectedPageId ? marked.target : undefined;\n const showPage = view === 'page' && !!selectedPageId;\n // The pages focused before this one, most recent last, so Back retraces a walk through the levels.\n const [history, setHistory] = useState<readonly string[]>([]);\n const lastSelected = useRef<string | null>(selectedPageId);\n const goingBackTo = useRef<string | null>(null);\n useEffect(() => {\n const previous = lastSelected.current;\n lastSelected.current = selectedPageId;\n const backTarget = goingBackTo.current;\n goingBackTo.current = null;\n // Arriving where Back pointed isn't a new step; any other selection is, even if Back's was ignored.\n if (backTarget && backTarget === selectedPageId) return;\n if (!previous || !selectedPageId || previous === selectedPageId) return;\n setHistory(current => [...current.filter(id => id !== selectedPageId), previous].slice(-FOCUS_HISTORY_CAP));\n }, [selectedPageId]);\n const backTo = history.length ? history[history.length - 1] : undefined;\n const goBack = () => {\n if (!backTo) return;\n goingBackTo.current = backTo;\n setHistory(current => current.slice(0, -1));\n onSelect(backTo);\n };\n const openPage = (pageId: string) => {\n onSelect(pageId);\n onViewChange('page');\n };\n // From the tree: in the graph, a first click frames the page there and a second click on the same\n // page opens it, like clicking a node. Elsewhere it opens. A lazily loaded graph loads around whatever\n // is focused; a host's fixed graph that lacks the page has nothing to frame, so it opens as a page.\n const selectFromTree = (page: KnowledgePagePayload) => {\n if (page.isScope) setFocusScopeId(page.id);\n if (view === 'graph' && (lazyMode || pagesById.has(page.id)) && page.id !== selectedPageId) onSelect(page.id);\n else openPage(page.id);\n };\n // Pages reached from outside the tree (search, links, mentions) clear a focus they fall outside of.\n const leaveScopeFocusFor = (pageId: string) => {\n if (focusScopeId && !withinScope([...lazy.pages, ...drawn.pages], focusScopeId).some(page => page.id === pageId)) {\n setFocusScopeId(null);\n }\n };\n const openAnywhere = (pageId: string) => {\n leaveScopeFocusFor(pageId);\n openPage(pageId);\n };\n // From search: in the graph, a first pick frames the page there and a second pick of the focused page opens\n // it, like the tree. A fixed graph that lacks the page has nothing to frame, so it opens as a page.\n const selectFromSearch = (pageId: string) => {\n if (view === 'graph' && (lazyMode || pagesById.has(pageId)) && pageId !== selectedPageId) {\n leaveScopeFocusFor(pageId);\n onSelect(pageId);\n } else openAnywhere(pageId);\n };\n const focusScope = focusScopeId\n ? (lazy.pages.find(page => page.id === focusScopeId) ?? pagesById.get(focusScopeId))\n : undefined;\n const treePages = withinScope(source.useTreeLevels ? lazy.pages : graph.pages, focusScope ? focusScopeId : null);\n const graphPages = useMemo(\n () => withinScope(drawn.pages, focusScope ? focusScopeId : null),\n [drawn.pages, focusScope, focusScopeId],\n );\n // With nothing selected the graph still centres on its first root scope, so that scope's \"more\" note shows.\n const focusedInGraph = view === 'graph' ? pagesById.get(selectedPageId ?? drawn.hub ?? '') : undefined;\n const children = focusedInGraph ? drawn.hiddenChildren.get(focusedInGraph.id) : undefined;\n const views: Array<{ value: KnowledgeExplorerView; label: string; narrowOnly?: boolean }> = [\n { value: 'tree', label: 'Tree', narrowOnly: true },\n { value: 'graph', label: 'Graph' },\n { value: 'page', label: 'Page' },\n ];\n\n return (\n <div className=\"flex min-h-0 flex-1 flex-col gap-3\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <SearchBox source={source} onSelect={selectFromSearch} />\n <div role=\"group\" aria-label=\"View\" className=\"flex overflow-hidden rounded border border-border\">\n {views.map(option => (\n <button\n key={option.value}\n type=\"button\"\n aria-pressed={\n option.value === 'page'\n ? showPage\n : option.value === 'graph'\n ? !showPage && view !== 'tree'\n : view === 'tree'\n }\n disabled={option.value === 'page' && !selectedPageId}\n className={`text-ui-md px-3 py-1 text-muted-foreground disabled:opacity-50 aria-pressed:bg-fill-inverse aria-pressed:text-background ${option.narrowOnly ? 'lg:hidden' : ''}`}\n onClick={() => onViewChange(option.value)}\n >\n {option.label}\n </button>\n ))}\n </div>\n </div>\n {!lazyMode && graph.truncated && !showPage ? (\n <p className=\"text-ui-sm text-muted-foreground\">\n The graph shows the first {graph.pages.length} pages. Open the tree or search to reach the rest.\n </p>\n ) : null}\n {selectedPageId && !showPage && isNotFound(selected.error) ? (\n <p role=\"alert\" className=\"text-ui-sm text-destructive-foreground\">\n Page not found. The linked page may have been deleted or merged.\n </p>\n ) : null}\n <div className=\"flex min-h-0 flex-1 flex-col gap-3 lg:flex-row\">\n <aside\n className={`min-h-0 w-full flex-1 flex-col overflow-hidden rounded-lg border border-border bg-card lg:flex lg:w-72 lg:flex-none lg:shrink-0 ${view === 'tree' ? 'flex' : 'hidden'}`}\n >\n {focusScope ? (\n <div\n className=\"flex items-center gap-2 border-b border-border bg-fill-subtle px-3 py-2\"\n data-testid=\"knowledge-scope-focus\"\n >\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <Txt as=\"span\" variant=\"eyebrow\" tone=\"muted\" className=\"uppercase\">\n {focusScope.displayLabel ?? 'Scope'}\n </Txt>\n <Txt as=\"span\" variant=\"label\" tone=\"ink\" className=\"truncate\">\n {focusScope.address ?? focusScope.name}\n </Txt>\n </div>\n <button\n type=\"button\"\n className=\"text-ui-sm shrink-0 rounded px-2 py-1 text-muted-foreground hover:bg-fill hover:text-foreground\"\n onClick={() => setFocusScopeId(null)}\n >\n All scopes\n </button>\n </div>\n ) : null}\n <div className=\"min-h-0 flex-1 overflow-auto\">\n {source.useTreeLevels && lazy.rootsPending ? (\n <p className=\"px-3 py-2 text-body text-muted-foreground\">Loading pages…</p>\n ) : (\n <KnowledgePageTree\n key={focusScope ? focusScope.id : 'all'}\n pages={treePages}\n pinnedIds={graph.pinnedIds}\n selectedPageId={selectedPageId}\n onSelect={selectFromTree}\n initiallyExpanded={focusScope ? [focusScope.id] : undefined}\n {...(source.useTreeLevels\n ? {\n mayHaveChildren: lazy.mayHaveChildren,\n onExpandedChange: lazy.onExpandedChange,\n loadMore: lazy.loadMore,\n }\n : {})}\n />\n )}\n </div>\n </aside>\n {showPage ? (\n <section\n aria-label=\"Selected page\"\n className=\"min-h-0 min-w-0 flex-1 overflow-auto rounded-lg border border-border bg-card\"\n >\n <SelectedPage\n source={source}\n pageId={selectedPageId}\n pagesById={pagesById}\n onSelect={openAnywhere}\n highlightMentionOf={highlightMentionOf}\n />\n </section>\n ) : (\n <div\n className={`relative min-h-0 min-w-0 flex-1 overflow-hidden rounded-lg border border-border bg-background lg:block lg:h-full ${view === 'graph' ? 'block' : 'hidden'}`}\n data-testid=\"knowledge-graph-container\"\n >\n {graphShown ? (\n <div className=\"absolute top-3 right-3 z-10 flex flex-col gap-2\">\n <button\n type=\"button\"\n data-testid=\"knowledge-graph-back\"\n aria-label=\"Back\"\n title={backTo ? 'Back to the page you focused before this one' : 'Back (nothing to go back to yet)'}\n disabled={!backTo}\n className={FLOAT_BUTTON}\n onClick={goBack}\n >\n <ArrowLeft aria-hidden className=\"size-4\" />\n </button>\n <button\n type=\"button\"\n aria-label=\"All links\"\n aria-pressed={allLinks}\n data-testid=\"knowledge-graph-all-links\"\n title={`All links: ${allLinks ? 'on' : 'off'}. Draw every link between the pages in the graph, not only the selected page's`}\n className={FLOAT_BUTTON}\n onClick={() => setAllLinks(current => !current)}\n >\n <Link2 aria-hidden className=\"size-4\" />\n </button>\n <button\n type=\"button\"\n aria-label=\"Link counts\"\n aria-pressed={dotCounts}\n data-testid=\"knowledge-graph-dot-counts\"\n title={`Link counts: ${dotCounts ? 'on' : 'off'}. Write how many links go in and out of each dot inside it`}\n className={FLOAT_BUTTON}\n onClick={() => setDotCounts(current => !current)}\n >\n <Hash aria-hidden className=\"size-4\" />\n </button>\n </div>\n ) : null}\n {graphShown ? (\n <KnowledgePageGraph\n pages={graphPages}\n edges={linkEdges}\n pinnedIds={graph.pinnedIds}\n grants={graph.grants}\n selectedPageId={selectedPageId}\n centerId={drawn.hub}\n hiddenLinks={hiddenLinks}\n knownLinks={knownLinks}\n fetchedLinks={hoverEdges}\n exactLinkCounts={exactCounts}\n onHover={setHoveredId}\n nearIds={focusLinkIds}\n settled={graphSettled}\n showCounts={dotCounts}\n onPreview={page => {\n if (isChildPlaceholder(page) && page.parentId) previewParent(page.parentId);\n }}\n onSelect={page => {\n // A stand-in loads its parent's children; a scope group opens into its scopes.\n if (isChildPlaceholder(page)) return page.parentId ? previewParent(page.parentId) : undefined;\n if (isRestCircle(page)) {\n const parentId = page.parentId;\n if (!parentId) return undefined;\n setRevealed(current => new Map(current).set(parentId, (current.get(parentId) ?? 0) + REST_BATCH));\n // Past the children loaded so far, fetch the next chunk too.\n return lazy.loadMore.get(parentId)?.();\n }\n if (isScopeGroup(page)) return setOpenGroups(current => new Set(current).add(page.id));\n onSelect(page.id);\n // Hosts resolve a `?page=` with no view to the page view, so say graph outright.\n if (view !== 'graph') onViewChange('graph');\n }}\n onOpen={page => openPage(page.id)}\n onClearSelection={() => {\n setMention(null);\n if (selectedPageId) onSelect(null);\n }}\n onMentionSelect={setMention}\n />\n ) : null}\n {mention && graphShown ? (\n <MentionPopup\n source={source}\n mention={mention}\n pagesById={pagesById}\n onClose={closeMention}\n onOpen={pageId => {\n setMarked(\n pageId === mention.source.id ? { source: mention.source.id, target: mention.target.id } : null,\n );\n setMention(null);\n openAnywhere(pageId);\n }}\n />\n ) : null}\n </div>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|