@mastra/playground-ui 68.0.0-alpha.2 → 68.0.0-alpha.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/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/{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/MarkdownRenderer.cjs.js +1 -1
- package/dist/components/MarkdownRenderer.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/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/mcp-input-request-tool.cjs.js +240 -0
- package/dist/domains/chat/tools/mcp-input-request-tool.cjs.js.map +1 -0
- package/dist/domains/chat/tools/mcp-input-request-tool.d.ts +1 -0
- package/dist/domains/chat/tools/mcp-input-request-tool.es.js +239 -0
- package/dist/domains/chat/tools/mcp-input-request-tool.es.js.map +1 -0
- package/dist/domains/chat/tools/mcp-input-request.cjs.js +40 -0
- package/dist/domains/chat/tools/mcp-input-request.cjs.js.map +1 -0
- package/dist/domains/chat/tools/mcp-input-request.d.ts +1 -0
- package/dist/domains/chat/tools/mcp-input-request.es.js +33 -0
- package/dist/domains/chat/tools/mcp-input-request.es.js.map +1 -0
- package/dist/domains/chat/tools/tool-card-kind.cjs.js +8 -3
- package/dist/domains/chat/tools/tool-card-kind.cjs.js.map +1 -1
- package/dist/domains/chat/tools/tool-card-kind.es.js +8 -4
- package/dist/domains/chat/tools/tool-card-kind.es.js.map +1 -1
- package/dist/domains/chat/tools/tool-card.cjs.js +1 -1
- package/dist/domains/chat/tools/tool-card.es.js +1 -1
- package/dist/domains/chat/tools/tool-groups.cjs.js +1 -1
- package/dist/domains/chat/tools/tool-groups.es.js +1 -1
- package/dist/domains/chat.cjs.js +5 -3
- package/dist/domains/chat.es.js +4 -4
- package/dist/domains/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/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/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/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/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/mcp-input-request-tool.d.ts +18 -0
- package/dist/src/domains/chat/tools/mcp-input-request.d.ts +40 -0
- package/dist/src/domains/chat/tools/tool-card-kind.d.ts +4 -2
- package/dist/src/domains/chat/tools/tool-card.d.ts +1 -1
- package/dist/src/domains/knowledge/components/KnowledgePageCard.d.ts +23 -0
- package/dist/src/domains/knowledge/components/KnowledgePageExplorer.d.ts +29 -0
- package/dist/src/domains/knowledge/components/KnowledgePageGraph.d.ts +27 -1
- package/dist/src/domains/knowledge/components/KnowledgePageTree.d.ts +2 -1
- package/dist/src/domains/knowledge/lib/circleText.d.ts +2 -0
- package/dist/src/domains/knowledge/lib/fitViewport.d.ts +67 -0
- package/dist/src/domains/knowledge/lib/graphShape.d.ts +131 -0
- package/dist/src/domains/knowledge/lib/linkCountsText.d.ts +5 -0
- package/dist/src/domains/knowledge/lib/pageAddress.d.ts +5 -0
- package/dist/src/domains/knowledge/lib/pageGraph.d.ts +4 -4
- package/dist/src/domains/knowledge/lib/pageRefs.d.ts +15 -0
- package/dist/src/domains/knowledge/lib/pageTree.d.ts +2 -0
- package/dist/src/domains/knowledge/lib/remarkKnowledgeLinks.d.ts +13 -0
- package/dist/src/domains/knowledge/lib/tooltipSide.d.ts +40 -0
- package/dist/src/domains/knowledge/lib/useLeavingNodes.d.ts +14 -0
- package/dist/src/domains/knowledge/lib/useStableWhile.d.ts +5 -0
- package/dist/src/domains/knowledge/pageTypes.d.ts +6 -1
- package/dist/src/ds/components/MarkdownRenderer/markdown-renderer.d.ts +8 -1
- package/dist/src/ds/components/ai/tool-call/tool-phrases.d.ts +6 -0
- package/dist/style.css +69 -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-rxhTDpk_.cjs} +164 -126
- package/dist/tool-card-rxhTDpk_.cjs.map +1 -0
- package/dist/{tool-card-sO6P2Qj4.js → tool-card-toDgoZzJ.js} +165 -127
- package/dist/tool-card-toDgoZzJ.js.map +1 -0
- package/dist/{tool-presentation-DvCsb_kz.js → tool-presentation-CvibOP1J.js} +6 -1
- package/dist/tool-presentation-CvibOP1J.js.map +1 -0
- package/dist/{tool-presentation-CQlDEwgS.cjs → tool-presentation-D6nzVruN.cjs} +6 -1
- package/dist/tool-presentation-D6nzVruN.cjs.map +1 -0
- package/package.json +10 -10
- package/dist/MarkdownRenderer-2GOXQJEv.js.map +0 -1
- package/dist/MarkdownRenderer-CB8Z_CHc.cjs.map +0 -1
- package/dist/domains/knowledge/lib/pageLayout.cjs.js +0 -49
- package/dist/domains/knowledge/lib/pageLayout.cjs.js.map +0 -1
- package/dist/domains/knowledge/lib/pageLayout.d.ts +0 -1
- package/dist/domains/knowledge/lib/pageLayout.es.js +0 -48
- package/dist/domains/knowledge/lib/pageLayout.es.js.map +0 -1
- package/dist/src/domains/knowledge/lib/pageLayout.d.ts +0 -24
- package/dist/tool-card-DrqPZfPQ.cjs.map +0 -1
- package/dist/tool-card-sO6P2Qj4.js.map +0 -1
- package/dist/tool-presentation-CQlDEwgS.cjs.map +0 -1
- package/dist/tool-presentation-DvCsb_kz.js.map +0 -1
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
// src/domains/knowledge/lib/pageAddress.ts
|
|
3
|
+
/** The page's place from its root scope down, through the pages the graph holds. */
|
|
4
|
+
function pagePath(page, byId) {
|
|
5
|
+
const names = [];
|
|
6
|
+
const seen = /* @__PURE__ */ new Set();
|
|
7
|
+
for (let up = page.parentId ? byId.get(page.parentId) : void 0; up && !seen.has(up.id);) {
|
|
8
|
+
seen.add(up.id);
|
|
9
|
+
names.unshift(up.isScope && up.address ? up.address : up.name);
|
|
10
|
+
up = up.parentId ? byId.get(up.parentId) : void 0;
|
|
11
|
+
}
|
|
12
|
+
return names.join(" › ");
|
|
13
|
+
}
|
|
14
|
+
/** How the page is addressed: its scope's address, then the keys down to it. Scopes are just their address. */
|
|
15
|
+
function pageRef(page, byId) {
|
|
16
|
+
if (page.isScope) return page.address;
|
|
17
|
+
const keys = [];
|
|
18
|
+
const seen = /* @__PURE__ */ new Set();
|
|
19
|
+
for (let at = page; at && !seen.has(at.id); at = at.parentId ? byId.get(at.parentId) : void 0) {
|
|
20
|
+
seen.add(at.id);
|
|
21
|
+
if (at.isScope) return at.address ? `${at.address}#${keys.reverse().join("/")}` : void 0;
|
|
22
|
+
if (!at.key) return void 0;
|
|
23
|
+
keys.push(at.key);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
exports.pagePath = pagePath;
|
|
27
|
+
exports.pageRef = pageRef;
|
|
28
|
+
|
|
29
|
+
//# sourceMappingURL=pageAddress.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pageAddress.cjs.js","names":[],"sources":["../../../../src/domains/knowledge/lib/pageAddress.ts"],"sourcesContent":["import type { KnowledgePagePayload } from '../pageTypes';\n\n/** The page's place from its root scope down, through the pages the graph holds. */\nexport function pagePath(page: KnowledgePagePayload, byId: ReadonlyMap<string, KnowledgePagePayload>): string {\n const names: string[] = [];\n const seen = new Set<string>();\n for (let up = page.parentId ? byId.get(page.parentId) : undefined; up && !seen.has(up.id);) {\n seen.add(up.id);\n names.unshift(up.isScope && up.address ? up.address : up.name);\n up = up.parentId ? byId.get(up.parentId) : undefined;\n }\n return names.join(' › ');\n}\n\n/** How the page is addressed: its scope's address, then the keys down to it. Scopes are just their address. */\nexport function pageRef(\n page: KnowledgePagePayload,\n byId: ReadonlyMap<string, KnowledgePagePayload>,\n): string | undefined {\n if (page.isScope) return page.address;\n const keys: string[] = [];\n const seen = new Set<string>();\n for (\n let at: KnowledgePagePayload | undefined = page;\n at && !seen.has(at.id);\n at = at.parentId ? byId.get(at.parentId) : undefined\n ) {\n seen.add(at.id);\n if (at.isScope) return at.address ? `${at.address}#${keys.reverse().join('/')}` : undefined;\n if (!at.key) return undefined;\n keys.push(at.key);\n }\n return undefined;\n}\n"],"mappings":";;;AAGA,SAAgB,SAAS,MAA4B,MAAyD;CAC5G,MAAM,QAAkB,CAAC;CACzB,MAAM,uBAAO,IAAI,IAAY;CAC7B,KAAK,IAAI,KAAK,KAAK,WAAW,KAAK,IAAI,KAAK,QAAQ,IAAI,KAAA,GAAW,MAAM,CAAC,KAAK,IAAI,GAAG,EAAE,IAAI;EAC1F,KAAK,IAAI,GAAG,EAAE;EACd,MAAM,QAAQ,GAAG,WAAW,GAAG,UAAU,GAAG,UAAU,GAAG,IAAI;EAC7D,KAAK,GAAG,WAAW,KAAK,IAAI,GAAG,QAAQ,IAAI,KAAA;CAC7C;CACA,OAAO,MAAM,KAAK,KAAK;AACzB;;AAGA,SAAgB,QACd,MACA,MACoB;CACpB,IAAI,KAAK,SAAS,OAAO,KAAK;CAC9B,MAAM,OAAiB,CAAC;CACxB,MAAM,uBAAO,IAAI,IAAY;CAC7B,KACE,IAAI,KAAuC,MAC3C,MAAM,CAAC,KAAK,IAAI,GAAG,EAAE,GACrB,KAAK,GAAG,WAAW,KAAK,IAAI,GAAG,QAAQ,IAAI,KAAA,GAC3C;EACA,KAAK,IAAI,GAAG,EAAE;EACd,IAAI,GAAG,SAAS,OAAO,GAAG,UAAU,GAAG,GAAG,QAAQ,GAAG,KAAK,QAAQ,CAAC,CAAC,KAAK,GAAG,MAAM,KAAA;EAClF,IAAI,CAAC,GAAG,KAAK,OAAO,KAAA;EACpB,KAAK,KAAK,GAAG,GAAG;CAClB;AAEF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from '../../../src/domains/knowledge/lib/pageAddress';
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
// src/domains/knowledge/lib/pageAddress.ts
|
|
2
|
+
/** The page's place from its root scope down, through the pages the graph holds. */
|
|
3
|
+
function pagePath(page, byId) {
|
|
4
|
+
const names = [];
|
|
5
|
+
const seen = /* @__PURE__ */ new Set();
|
|
6
|
+
for (let up = page.parentId ? byId.get(page.parentId) : void 0; up && !seen.has(up.id);) {
|
|
7
|
+
seen.add(up.id);
|
|
8
|
+
names.unshift(up.isScope && up.address ? up.address : up.name);
|
|
9
|
+
up = up.parentId ? byId.get(up.parentId) : void 0;
|
|
10
|
+
}
|
|
11
|
+
return names.join(" › ");
|
|
12
|
+
}
|
|
13
|
+
/** How the page is addressed: its scope's address, then the keys down to it. Scopes are just their address. */
|
|
14
|
+
function pageRef(page, byId) {
|
|
15
|
+
if (page.isScope) return page.address;
|
|
16
|
+
const keys = [];
|
|
17
|
+
const seen = /* @__PURE__ */ new Set();
|
|
18
|
+
for (let at = page; at && !seen.has(at.id); at = at.parentId ? byId.get(at.parentId) : void 0) {
|
|
19
|
+
seen.add(at.id);
|
|
20
|
+
if (at.isScope) return at.address ? `${at.address}#${keys.reverse().join("/")}` : void 0;
|
|
21
|
+
if (!at.key) return void 0;
|
|
22
|
+
keys.push(at.key);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export { pagePath, pageRef };
|
|
26
|
+
|
|
27
|
+
//# sourceMappingURL=pageAddress.es.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pageAddress.es.js","names":[],"sources":["../../../../src/domains/knowledge/lib/pageAddress.ts"],"sourcesContent":["import type { KnowledgePagePayload } from '../pageTypes';\n\n/** The page's place from its root scope down, through the pages the graph holds. */\nexport function pagePath(page: KnowledgePagePayload, byId: ReadonlyMap<string, KnowledgePagePayload>): string {\n const names: string[] = [];\n const seen = new Set<string>();\n for (let up = page.parentId ? byId.get(page.parentId) : undefined; up && !seen.has(up.id);) {\n seen.add(up.id);\n names.unshift(up.isScope && up.address ? up.address : up.name);\n up = up.parentId ? byId.get(up.parentId) : undefined;\n }\n return names.join(' › ');\n}\n\n/** How the page is addressed: its scope's address, then the keys down to it. Scopes are just their address. */\nexport function pageRef(\n page: KnowledgePagePayload,\n byId: ReadonlyMap<string, KnowledgePagePayload>,\n): string | undefined {\n if (page.isScope) return page.address;\n const keys: string[] = [];\n const seen = new Set<string>();\n for (\n let at: KnowledgePagePayload | undefined = page;\n at && !seen.has(at.id);\n at = at.parentId ? byId.get(at.parentId) : undefined\n ) {\n seen.add(at.id);\n if (at.isScope) return at.address ? `${at.address}#${keys.reverse().join('/')}` : undefined;\n if (!at.key) return undefined;\n keys.push(at.key);\n }\n return undefined;\n}\n"],"mappings":";;AAGA,SAAgB,SAAS,MAA4B,MAAyD;CAC5G,MAAM,QAAkB,CAAC;CACzB,MAAM,uBAAO,IAAI,IAAY;CAC7B,KAAK,IAAI,KAAK,KAAK,WAAW,KAAK,IAAI,KAAK,QAAQ,IAAI,KAAA,GAAW,MAAM,CAAC,KAAK,IAAI,GAAG,EAAE,IAAI;EAC1F,KAAK,IAAI,GAAG,EAAE;EACd,MAAM,QAAQ,GAAG,WAAW,GAAG,UAAU,GAAG,UAAU,GAAG,IAAI;EAC7D,KAAK,GAAG,WAAW,KAAK,IAAI,GAAG,QAAQ,IAAI,KAAA;CAC7C;CACA,OAAO,MAAM,KAAK,KAAK;AACzB;;AAGA,SAAgB,QACd,MACA,MACoB;CACpB,IAAI,KAAK,SAAS,OAAO,KAAK;CAC9B,MAAM,OAAiB,CAAC;CACxB,MAAM,uBAAO,IAAI,IAAY;CAC7B,KACE,IAAI,KAAuC,MAC3C,MAAM,CAAC,KAAK,IAAI,GAAG,EAAE,GACrB,KAAK,GAAG,WAAW,KAAK,IAAI,GAAG,QAAQ,IAAI,KAAA,GAC3C;EACA,KAAK,IAAI,GAAG,EAAE;EACd,IAAI,GAAG,SAAS,OAAO,GAAG,UAAU,GAAG,GAAG,QAAQ,GAAG,KAAK,QAAQ,CAAC,CAAC,KAAK,GAAG,MAAM,KAAA;EAClF,IAAI,CAAC,GAAG,KAAK,OAAO,KAAA;EACpB,KAAK,KAAK,GAAG,GAAG;CAClB;AAEF"}
|
|
@@ -2,10 +2,10 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
|
2
2
|
// src/domains/knowledge/lib/pageGraph.ts
|
|
3
3
|
/**
|
|
4
4
|
* Edges among loaded, live pages: a parent edge for every loaded parent, and
|
|
5
|
-
* the given mention edges merged per source → target
|
|
6
|
-
*
|
|
5
|
+
* the given mention and body-link edges merged per kind and source → target
|
|
6
|
+
* (counts summed). Self links and edges to unloaded pages are dropped.
|
|
7
7
|
*/
|
|
8
|
-
function pageGraphEdges(pages,
|
|
8
|
+
function pageGraphEdges(pages, linkEdges = []) {
|
|
9
9
|
const live = new Set(pages.filter((page) => !page.deletedAt && !page.mergedInto).map((page) => page.id));
|
|
10
10
|
const edges = [];
|
|
11
11
|
for (const page of pages) if (live.has(page.id) && page.parentId && page.parentId !== page.id && live.has(page.parentId)) edges.push({
|
|
@@ -13,22 +13,22 @@ function pageGraphEdges(pages, mentionEdges = []) {
|
|
|
13
13
|
target: page.id,
|
|
14
14
|
kind: "parent"
|
|
15
15
|
});
|
|
16
|
-
const
|
|
17
|
-
for (const edge of
|
|
18
|
-
if (edge.kind !== "mention" || edge.source === edge.target) continue;
|
|
16
|
+
const links = /* @__PURE__ */ new Map();
|
|
17
|
+
for (const edge of linkEdges) {
|
|
18
|
+
if (edge.kind !== "mention" && edge.kind !== "link" || edge.source === edge.target) continue;
|
|
19
19
|
if (!live.has(edge.source) || !live.has(edge.target)) continue;
|
|
20
|
-
const key = `${edge.source}\u0000${edge.target}`;
|
|
21
|
-
const existing =
|
|
20
|
+
const key = `${edge.kind}\u0000${edge.source}\u0000${edge.target}`;
|
|
21
|
+
const existing = links.get(key);
|
|
22
22
|
const count = edge.count ?? 1;
|
|
23
23
|
if (existing) existing.count = (existing.count ?? 1) + count;
|
|
24
|
-
else
|
|
24
|
+
else links.set(key, {
|
|
25
25
|
source: edge.source,
|
|
26
26
|
target: edge.target,
|
|
27
|
-
kind:
|
|
27
|
+
kind: edge.kind,
|
|
28
28
|
count
|
|
29
29
|
});
|
|
30
30
|
}
|
|
31
|
-
return [...edges, ...
|
|
31
|
+
return [...edges, ...links.values()];
|
|
32
32
|
}
|
|
33
33
|
/** Id of the placeholder circle for a declared principal that has no scope page yet. */
|
|
34
34
|
function unplacedScopeId(address) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pageGraph.cjs.js","names":[],"sources":["../../../../src/domains/knowledge/lib/pageGraph.ts"],"sourcesContent":["/**\n * Pure page-graph logic for the schema-4 explorer: parent links plus resolved\n * mentions between loaded pages → React Flow nodes and edges. Every scope is\n * one size and every page another, so a circle's size says what it is and its\n * name always fits inside.\n */\n\nimport type { Edge, Node } from '@xyflow/react';\n\nimport type { KnowledgePageEdge, KnowledgePagePayload, KnowledgeScopeGrantPayload } from '../pageTypes';\n\n/**\n * Edges among loaded, live pages: a parent edge for every loaded parent, and\n * the given mention edges merged per source → target (counts summed). Self
|
|
1
|
+
{"version":3,"file":"pageGraph.cjs.js","names":[],"sources":["../../../../src/domains/knowledge/lib/pageGraph.ts"],"sourcesContent":["/**\n * Pure page-graph logic for the schema-4 explorer: parent links plus resolved\n * mentions and body links between loaded pages → React Flow nodes and edges. Every scope is\n * one size and every page another, so a circle's size says what it is and its\n * name always fits inside.\n */\n\nimport type { Edge, Node } from '@xyflow/react';\n\nimport type { KnowledgePageEdge, KnowledgePagePayload, KnowledgeScopeGrantPayload } from '../pageTypes';\n\n/**\n * Edges among loaded, live pages: a parent edge for every loaded parent, and\n * the given mention and body-link edges merged per kind and source → target\n * (counts summed). Self links and edges to unloaded pages are dropped.\n */\nexport function pageGraphEdges(\n pages: KnowledgePagePayload[],\n linkEdges: KnowledgePageEdge[] = [],\n): KnowledgePageEdge[] {\n const live = new Set(pages.filter(page => !page.deletedAt && !page.mergedInto).map(page => page.id));\n const edges: KnowledgePageEdge[] = [];\n for (const page of pages) {\n if (live.has(page.id) && page.parentId && page.parentId !== page.id && live.has(page.parentId)) {\n edges.push({ source: page.parentId, target: page.id, kind: 'parent' });\n }\n }\n const links = new Map<string, KnowledgePageEdge>();\n for (const edge of linkEdges) {\n if ((edge.kind !== 'mention' && edge.kind !== 'link') || edge.source === edge.target) continue;\n if (!live.has(edge.source) || !live.has(edge.target)) continue;\n const key = `${edge.kind}\\u0000${edge.source}\\u0000${edge.target}`;\n const existing = links.get(key);\n const count = edge.count ?? 1;\n if (existing) existing.count = (existing.count ?? 1) + count;\n else links.set(key, { source: edge.source, target: edge.target, kind: edge.kind, count });\n }\n return [...edges, ...links.values()];\n}\n\n/** Id of the placeholder circle for a declared principal that has no scope page yet. */\nexport function unplacedScopeId(address: string): string {\n return `unplaced:${address}`;\n}\n\n/**\n * Grants as graph pages and edges. A grant from a principal with a loaded scope page draws from that\n * page; one whose principal has no scope page yet draws from a placeholder scope (one per address), so\n * a role nobody has written to still shows what it can reach. Grants to unloaded targets are dropped.\n */\nexport function grantGraph(\n pages: KnowledgePagePayload[],\n grants: readonly KnowledgeScopeGrantPayload[] = [],\n): { placeholders: KnowledgePagePayload[]; edges: KnowledgePageEdge[] } {\n const live = new Set(pages.filter(page => !page.deletedAt && !page.mergedInto).map(page => page.id));\n const placeholders = new Map<string, KnowledgePagePayload>();\n const edges = new Map<string, KnowledgePageEdge>();\n for (const grant of grants) {\n if (!live.has(grant.target)) continue;\n let source = grant.principalId && live.has(grant.principalId) ? grant.principalId : null;\n if (!source) {\n if (grant.principalId) continue;\n source = unplacedScopeId(grant.principal);\n if (!placeholders.has(source)) placeholders.set(source, placeholderScope(source, grant));\n }\n if (source === grant.target) continue;\n edges.set(`${source}\\u0000${grant.target}`, { source, target: grant.target, kind: 'grant', role: grant.role });\n }\n return { placeholders: [...placeholders.values()], edges: [...edges.values()] };\n}\n\nfunction placeholderScope(id: string, grant: KnowledgeScopeGrantPayload): KnowledgePagePayload {\n const nobody = { author: '' };\n return {\n id,\n scopeId: id,\n parentId: null,\n isScope: true,\n address: grant.principal,\n displayLabel: grant.principalLabel,\n position: '',\n name: grant.principal,\n version: 0,\n createdBy: nobody,\n updatedBy: nobody,\n createdAt: '',\n updatedAt: '',\n };\n}\n\n/** The page plus every page one edge away from it, either direction. */\nexport function pageNeighbourIds(pageId: string, edges: KnowledgePageEdge[]): Set<string> {\n const ids = new Set([pageId]);\n for (const edge of edges) {\n if (edge.source === pageId) ids.add(edge.target);\n if (edge.target === pageId) ids.add(edge.source);\n }\n return ids;\n}\n\n/** Circle diameters: big enough for a kind label and three lines of name. */\nexport const KNOWLEDGE_SCOPE_SIZE = 124;\nexport const KNOWLEDGE_PAGE_SIZE = 108;\n\nexport type PageFlowNode = Node<{\n page: KnowledgePagePayload;\n size: number;\n selected: boolean;\n}>;\n\nexport type PageFlowEdge = Edge<{ kind: KnowledgePageEdge['kind']; count: number; role?: KnowledgePageEdge['role'] }>;\n\n/** Converts pages and their edges to React Flow elements; positions are left to the layout. */\nexport function toPageFlow(\n pages: KnowledgePagePayload[],\n edges: KnowledgePageEdge[],\n selectedId?: string | null,\n): { nodes: PageFlowNode[]; edges: PageFlowEdge[] } {\n const nodes = pages\n .filter(page => !page.deletedAt && !page.mergedInto)\n .map((page): PageFlowNode => {\n return {\n id: page.id,\n type: 'page',\n position: { x: 0, y: 0 },\n data: {\n page,\n size: page.isScope ? KNOWLEDGE_SCOPE_SIZE : KNOWLEDGE_PAGE_SIZE,\n selected: page.id === selectedId,\n },\n };\n });\n return {\n nodes,\n edges: edges.map(\n (edge): PageFlowEdge => ({\n id: `${edge.kind}:${edge.source}->${edge.target}`,\n source: edge.source,\n target: edge.target,\n data: { kind: edge.kind, count: edge.count ?? 1, ...(edge.role ? { role: edge.role } : {}) },\n }),\n ),\n };\n}\n"],"mappings":"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"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
// src/domains/knowledge/lib/pageGraph.ts
|
|
2
2
|
/**
|
|
3
3
|
* Edges among loaded, live pages: a parent edge for every loaded parent, and
|
|
4
|
-
* the given mention edges merged per source → target
|
|
5
|
-
*
|
|
4
|
+
* the given mention and body-link edges merged per kind and source → target
|
|
5
|
+
* (counts summed). Self links and edges to unloaded pages are dropped.
|
|
6
6
|
*/
|
|
7
|
-
function pageGraphEdges(pages,
|
|
7
|
+
function pageGraphEdges(pages, linkEdges = []) {
|
|
8
8
|
const live = new Set(pages.filter((page) => !page.deletedAt && !page.mergedInto).map((page) => page.id));
|
|
9
9
|
const edges = [];
|
|
10
10
|
for (const page of pages) if (live.has(page.id) && page.parentId && page.parentId !== page.id && live.has(page.parentId)) edges.push({
|
|
@@ -12,22 +12,22 @@ function pageGraphEdges(pages, mentionEdges = []) {
|
|
|
12
12
|
target: page.id,
|
|
13
13
|
kind: "parent"
|
|
14
14
|
});
|
|
15
|
-
const
|
|
16
|
-
for (const edge of
|
|
17
|
-
if (edge.kind !== "mention" || edge.source === edge.target) continue;
|
|
15
|
+
const links = /* @__PURE__ */ new Map();
|
|
16
|
+
for (const edge of linkEdges) {
|
|
17
|
+
if (edge.kind !== "mention" && edge.kind !== "link" || edge.source === edge.target) continue;
|
|
18
18
|
if (!live.has(edge.source) || !live.has(edge.target)) continue;
|
|
19
|
-
const key = `${edge.source}\u0000${edge.target}`;
|
|
20
|
-
const existing =
|
|
19
|
+
const key = `${edge.kind}\u0000${edge.source}\u0000${edge.target}`;
|
|
20
|
+
const existing = links.get(key);
|
|
21
21
|
const count = edge.count ?? 1;
|
|
22
22
|
if (existing) existing.count = (existing.count ?? 1) + count;
|
|
23
|
-
else
|
|
23
|
+
else links.set(key, {
|
|
24
24
|
source: edge.source,
|
|
25
25
|
target: edge.target,
|
|
26
|
-
kind:
|
|
26
|
+
kind: edge.kind,
|
|
27
27
|
count
|
|
28
28
|
});
|
|
29
29
|
}
|
|
30
|
-
return [...edges, ...
|
|
30
|
+
return [...edges, ...links.values()];
|
|
31
31
|
}
|
|
32
32
|
/** Id of the placeholder circle for a declared principal that has no scope page yet. */
|
|
33
33
|
function unplacedScopeId(address) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pageGraph.es.js","names":[],"sources":["../../../../src/domains/knowledge/lib/pageGraph.ts"],"sourcesContent":["/**\n * Pure page-graph logic for the schema-4 explorer: parent links plus resolved\n * mentions between loaded pages → React Flow nodes and edges. Every scope is\n * one size and every page another, so a circle's size says what it is and its\n * name always fits inside.\n */\n\nimport type { Edge, Node } from '@xyflow/react';\n\nimport type { KnowledgePageEdge, KnowledgePagePayload, KnowledgeScopeGrantPayload } from '../pageTypes';\n\n/**\n * Edges among loaded, live pages: a parent edge for every loaded parent, and\n * the given mention edges merged per source → target (counts summed). Self
|
|
1
|
+
{"version":3,"file":"pageGraph.es.js","names":[],"sources":["../../../../src/domains/knowledge/lib/pageGraph.ts"],"sourcesContent":["/**\n * Pure page-graph logic for the schema-4 explorer: parent links plus resolved\n * mentions and body links between loaded pages → React Flow nodes and edges. Every scope is\n * one size and every page another, so a circle's size says what it is and its\n * name always fits inside.\n */\n\nimport type { Edge, Node } from '@xyflow/react';\n\nimport type { KnowledgePageEdge, KnowledgePagePayload, KnowledgeScopeGrantPayload } from '../pageTypes';\n\n/**\n * Edges among loaded, live pages: a parent edge for every loaded parent, and\n * the given mention and body-link edges merged per kind and source → target\n * (counts summed). Self links and edges to unloaded pages are dropped.\n */\nexport function pageGraphEdges(\n pages: KnowledgePagePayload[],\n linkEdges: KnowledgePageEdge[] = [],\n): KnowledgePageEdge[] {\n const live = new Set(pages.filter(page => !page.deletedAt && !page.mergedInto).map(page => page.id));\n const edges: KnowledgePageEdge[] = [];\n for (const page of pages) {\n if (live.has(page.id) && page.parentId && page.parentId !== page.id && live.has(page.parentId)) {\n edges.push({ source: page.parentId, target: page.id, kind: 'parent' });\n }\n }\n const links = new Map<string, KnowledgePageEdge>();\n for (const edge of linkEdges) {\n if ((edge.kind !== 'mention' && edge.kind !== 'link') || edge.source === edge.target) continue;\n if (!live.has(edge.source) || !live.has(edge.target)) continue;\n const key = `${edge.kind}\\u0000${edge.source}\\u0000${edge.target}`;\n const existing = links.get(key);\n const count = edge.count ?? 1;\n if (existing) existing.count = (existing.count ?? 1) + count;\n else links.set(key, { source: edge.source, target: edge.target, kind: edge.kind, count });\n }\n return [...edges, ...links.values()];\n}\n\n/** Id of the placeholder circle for a declared principal that has no scope page yet. */\nexport function unplacedScopeId(address: string): string {\n return `unplaced:${address}`;\n}\n\n/**\n * Grants as graph pages and edges. A grant from a principal with a loaded scope page draws from that\n * page; one whose principal has no scope page yet draws from a placeholder scope (one per address), so\n * a role nobody has written to still shows what it can reach. Grants to unloaded targets are dropped.\n */\nexport function grantGraph(\n pages: KnowledgePagePayload[],\n grants: readonly KnowledgeScopeGrantPayload[] = [],\n): { placeholders: KnowledgePagePayload[]; edges: KnowledgePageEdge[] } {\n const live = new Set(pages.filter(page => !page.deletedAt && !page.mergedInto).map(page => page.id));\n const placeholders = new Map<string, KnowledgePagePayload>();\n const edges = new Map<string, KnowledgePageEdge>();\n for (const grant of grants) {\n if (!live.has(grant.target)) continue;\n let source = grant.principalId && live.has(grant.principalId) ? grant.principalId : null;\n if (!source) {\n if (grant.principalId) continue;\n source = unplacedScopeId(grant.principal);\n if (!placeholders.has(source)) placeholders.set(source, placeholderScope(source, grant));\n }\n if (source === grant.target) continue;\n edges.set(`${source}\\u0000${grant.target}`, { source, target: grant.target, kind: 'grant', role: grant.role });\n }\n return { placeholders: [...placeholders.values()], edges: [...edges.values()] };\n}\n\nfunction placeholderScope(id: string, grant: KnowledgeScopeGrantPayload): KnowledgePagePayload {\n const nobody = { author: '' };\n return {\n id,\n scopeId: id,\n parentId: null,\n isScope: true,\n address: grant.principal,\n displayLabel: grant.principalLabel,\n position: '',\n name: grant.principal,\n version: 0,\n createdBy: nobody,\n updatedBy: nobody,\n createdAt: '',\n updatedAt: '',\n };\n}\n\n/** The page plus every page one edge away from it, either direction. */\nexport function pageNeighbourIds(pageId: string, edges: KnowledgePageEdge[]): Set<string> {\n const ids = new Set([pageId]);\n for (const edge of edges) {\n if (edge.source === pageId) ids.add(edge.target);\n if (edge.target === pageId) ids.add(edge.source);\n }\n return ids;\n}\n\n/** Circle diameters: big enough for a kind label and three lines of name. */\nexport const KNOWLEDGE_SCOPE_SIZE = 124;\nexport const KNOWLEDGE_PAGE_SIZE = 108;\n\nexport type PageFlowNode = Node<{\n page: KnowledgePagePayload;\n size: number;\n selected: boolean;\n}>;\n\nexport type PageFlowEdge = Edge<{ kind: KnowledgePageEdge['kind']; count: number; role?: KnowledgePageEdge['role'] }>;\n\n/** Converts pages and their edges to React Flow elements; positions are left to the layout. */\nexport function toPageFlow(\n pages: KnowledgePagePayload[],\n edges: KnowledgePageEdge[],\n selectedId?: string | null,\n): { nodes: PageFlowNode[]; edges: PageFlowEdge[] } {\n const nodes = pages\n .filter(page => !page.deletedAt && !page.mergedInto)\n .map((page): PageFlowNode => {\n return {\n id: page.id,\n type: 'page',\n position: { x: 0, y: 0 },\n data: {\n page,\n size: page.isScope ? KNOWLEDGE_SCOPE_SIZE : KNOWLEDGE_PAGE_SIZE,\n selected: page.id === selectedId,\n },\n };\n });\n return {\n nodes,\n edges: edges.map(\n (edge): PageFlowEdge => ({\n id: `${edge.kind}:${edge.source}->${edge.target}`,\n source: edge.source,\n target: edge.target,\n data: { kind: edge.kind, count: edge.count ?? 1, ...(edge.role ? { role: edge.role } : {}) },\n }),\n ),\n };\n}\n"],"mappings":";;;;;;AAgBA,SAAgB,eACd,OACA,YAAiC,CAAC,GACb;CACrB,MAAM,OAAO,IAAI,IAAI,MAAM,QAAO,SAAQ,CAAC,KAAK,aAAa,CAAC,KAAK,UAAU,CAAC,CAAC,KAAI,SAAQ,KAAK,EAAE,CAAC;CACnG,MAAM,QAA6B,CAAC;CACpC,KAAK,MAAM,QAAQ,OACjB,IAAI,KAAK,IAAI,KAAK,EAAE,KAAK,KAAK,YAAY,KAAK,aAAa,KAAK,MAAM,KAAK,IAAI,KAAK,QAAQ,GAC3F,MAAM,KAAK;EAAE,QAAQ,KAAK;EAAU,QAAQ,KAAK;EAAI,MAAM;CAAS,CAAC;CAGzE,MAAM,wBAAQ,IAAI,IAA+B;CACjD,KAAK,MAAM,QAAQ,WAAW;EAC5B,IAAK,KAAK,SAAS,aAAa,KAAK,SAAS,UAAW,KAAK,WAAW,KAAK,QAAQ;EACtF,IAAI,CAAC,KAAK,IAAI,KAAK,MAAM,KAAK,CAAC,KAAK,IAAI,KAAK,MAAM,GAAG;EACtD,MAAM,MAAM,GAAG,KAAK,KAAK,QAAQ,KAAK,OAAO,QAAQ,KAAK;EAC1D,MAAM,WAAW,MAAM,IAAI,GAAG;EAC9B,MAAM,QAAQ,KAAK,SAAS;EAC5B,IAAI,UAAU,SAAS,SAAS,SAAS,SAAS,KAAK;OAClD,MAAM,IAAI,KAAK;GAAE,QAAQ,KAAK;GAAQ,QAAQ,KAAK;GAAQ,MAAM,KAAK;GAAM;EAAM,CAAC;CAC1F;CACA,OAAO,CAAC,GAAG,OAAO,GAAG,MAAM,OAAO,CAAC;AACrC;;AAGA,SAAgB,gBAAgB,SAAyB;CACvD,OAAO,YAAY;AACrB;;;;;;AAOA,SAAgB,WACd,OACA,SAAgD,CAAC,GACqB;CACtE,MAAM,OAAO,IAAI,IAAI,MAAM,QAAO,SAAQ,CAAC,KAAK,aAAa,CAAC,KAAK,UAAU,CAAC,CAAC,KAAI,SAAQ,KAAK,EAAE,CAAC;CACnG,MAAM,+BAAe,IAAI,IAAkC;CAC3D,MAAM,wBAAQ,IAAI,IAA+B;CACjD,KAAK,MAAM,SAAS,QAAQ;EAC1B,IAAI,CAAC,KAAK,IAAI,MAAM,MAAM,GAAG;EAC7B,IAAI,SAAS,MAAM,eAAe,KAAK,IAAI,MAAM,WAAW,IAAI,MAAM,cAAc;EACpF,IAAI,CAAC,QAAQ;GACX,IAAI,MAAM,aAAa;GACvB,SAAS,gBAAgB,MAAM,SAAS;GACxC,IAAI,CAAC,aAAa,IAAI,MAAM,GAAG,aAAa,IAAI,QAAQ,iBAAiB,QAAQ,KAAK,CAAC;EACzF;EACA,IAAI,WAAW,MAAM,QAAQ;EAC7B,MAAM,IAAI,GAAG,OAAO,QAAQ,MAAM,UAAU;GAAE;GAAQ,QAAQ,MAAM;GAAQ,MAAM;GAAS,MAAM,MAAM;EAAK,CAAC;CAC/G;CACA,OAAO;EAAE,cAAc,CAAC,GAAG,aAAa,OAAO,CAAC;EAAG,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC;CAAE;AAChF;AAEA,SAAS,iBAAiB,IAAY,OAAyD;CAC7F,MAAM,SAAS,EAAE,QAAQ,GAAG;CAC5B,OAAO;EACL;EACA,SAAS;EACT,UAAU;EACV,SAAS;EACT,SAAS,MAAM;EACf,cAAc,MAAM;EACpB,UAAU;EACV,MAAM,MAAM;EACZ,SAAS;EACT,WAAW;EACX,WAAW;EACX,WAAW;EACX,WAAW;CACb;AACF;;AAGA,SAAgB,iBAAiB,QAAgB,OAAyC;CACxF,MAAM,sBAAM,IAAI,IAAI,CAAC,MAAM,CAAC;CAC5B,KAAK,MAAM,QAAQ,OAAO;EACxB,IAAI,KAAK,WAAW,QAAQ,IAAI,IAAI,KAAK,MAAM;EAC/C,IAAI,KAAK,WAAW,QAAQ,IAAI,IAAI,KAAK,MAAM;CACjD;CACA,OAAO;AACT;;AAGA,IAAa,uBAAuB;AACpC,IAAa,sBAAsB;;AAWnC,SAAgB,WACd,OACA,OACA,YACkD;CAelD,OAAO;EACL,OAfY,MACX,QAAO,SAAQ,CAAC,KAAK,aAAa,CAAC,KAAK,UAAU,CAAC,CACnD,KAAK,SAAuB;GAC3B,OAAO;IACL,IAAI,KAAK;IACT,MAAM;IACN,UAAU;KAAE,GAAG;KAAG,GAAG;IAAE;IACvB,MAAM;KACJ;KACA,MAAM,KAAK,UAAA,MAAA;KACX,UAAU,KAAK,OAAO;IACxB;GACF;EACF,CAEA;EACA,OAAO,MAAM,KACV,UAAwB;GACvB,IAAI,GAAG,KAAK,KAAK,GAAG,KAAK,OAAO,IAAI,KAAK;GACzC,QAAQ,KAAK;GACb,QAAQ,KAAK;GACb,MAAM;IAAE,MAAM,KAAK;IAAM,OAAO,KAAK,SAAS;IAAG,GAAI,KAAK,OAAO,EAAE,MAAM,KAAK,KAAK,IAAI,CAAC;GAAG;EAC7F,EACF;CACF;AACF"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
// src/domains/knowledge/lib/pageRefs.ts
|
|
3
|
+
/** Same as core's `canonicalKnowledgeName`. */
|
|
4
|
+
function canonicalName(name) {
|
|
5
|
+
return name.normalize("NFKC").trim().replace(/\s+/g, " ").toLowerCase();
|
|
6
|
+
}
|
|
7
|
+
function knowledgePageRefIndex(pages) {
|
|
8
|
+
const byId = /* @__PURE__ */ new Map();
|
|
9
|
+
const scopesByAddress = /* @__PURE__ */ new Map();
|
|
10
|
+
const childByKey = /* @__PURE__ */ new Map();
|
|
11
|
+
const byName = /* @__PURE__ */ new Map();
|
|
12
|
+
for (const page of pages) {
|
|
13
|
+
if (page.deletedAt || page.mergedInto) continue;
|
|
14
|
+
byId.set(page.id, page);
|
|
15
|
+
if (page.isScope && page.address) scopesByAddress.set(page.address, page);
|
|
16
|
+
if (!page.isScope && page.key && page.parentId) childByKey.set(`${page.parentId}\u0000${page.key}`, page);
|
|
17
|
+
const name = canonicalName(page.name);
|
|
18
|
+
byName.set(name, byName.has(name) ? null : page);
|
|
19
|
+
}
|
|
20
|
+
const byPath = (ref) => {
|
|
21
|
+
const hash = ref.indexOf("#");
|
|
22
|
+
if (hash <= 0) return void 0;
|
|
23
|
+
const scope = scopesByAddress.get(ref.slice(0, hash));
|
|
24
|
+
if (!scope) return void 0;
|
|
25
|
+
let page = scope;
|
|
26
|
+
for (const key of ref.slice(hash + 1).split("/")) {
|
|
27
|
+
page = childByKey.get(`${page.id}\u0000${key}`);
|
|
28
|
+
if (!page || page.scopeId !== scope.id) return void 0;
|
|
29
|
+
}
|
|
30
|
+
return page === scope ? void 0 : page;
|
|
31
|
+
};
|
|
32
|
+
return { resolve(raw) {
|
|
33
|
+
const ref = raw.trim();
|
|
34
|
+
if (!ref) return void 0;
|
|
35
|
+
return byId.get(ref) ?? byPath(ref) ?? scopesByAddress.get(ref) ?? byName.get(canonicalName(ref)) ?? void 0;
|
|
36
|
+
} };
|
|
37
|
+
}
|
|
38
|
+
var WIKILINK = /\[\[([^\]]+)\]\]/g;
|
|
39
|
+
var FENCED_CODE = /^(`{3,}|~{3,})[^\n]*\n[\s\S]*?(?:^\1[ \t]*$|(?![\s\S]))/gm;
|
|
40
|
+
var INLINE_CODE = /(`+)[\s\S]*?\1/g;
|
|
41
|
+
/** The `[[ref]]`s in a markdown body, outside code. */
|
|
42
|
+
function bodyLinkRefs(body) {
|
|
43
|
+
return [...body.replace(FENCED_CODE, "").replace(INLINE_CODE, "").matchAll(WIKILINK)].map((match) => match[1] ?? "");
|
|
44
|
+
}
|
|
45
|
+
/** One `link` edge per page whose body links another loaded page; `count` is how many times. */
|
|
46
|
+
function bodyLinkEdges(pages) {
|
|
47
|
+
const index = knowledgePageRefIndex(pages);
|
|
48
|
+
const edges = [];
|
|
49
|
+
for (const page of pages) {
|
|
50
|
+
if (!page.body || page.deletedAt || page.mergedInto) continue;
|
|
51
|
+
const counts = /* @__PURE__ */ new Map();
|
|
52
|
+
for (const ref of bodyLinkRefs(page.body)) {
|
|
53
|
+
const target = index.resolve(ref);
|
|
54
|
+
if (target && target.id !== page.id) counts.set(target.id, (counts.get(target.id) ?? 0) + 1);
|
|
55
|
+
}
|
|
56
|
+
for (const [target, count] of counts) edges.push({
|
|
57
|
+
source: page.id,
|
|
58
|
+
target,
|
|
59
|
+
kind: "link",
|
|
60
|
+
count
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
return edges;
|
|
64
|
+
}
|
|
65
|
+
exports.bodyLinkEdges = bodyLinkEdges;
|
|
66
|
+
exports.bodyLinkRefs = bodyLinkRefs;
|
|
67
|
+
exports.knowledgePageRefIndex = knowledgePageRefIndex;
|
|
68
|
+
|
|
69
|
+
//# sourceMappingURL=pageRefs.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pageRefs.cjs.js","names":[],"sources":["../../../../src/domains/knowledge/lib/pageRefs.ts"],"sourcesContent":["/**\n * Resolves `[[ref]]` links in page bodies and notes against the pages the explorer has loaded, in the\n * order core's `run.page(ref)` uses: page id, then `scope#key/key` path, then scope address, then a\n * unique page name (an ambiguous name resolves to nothing, as it throws in core). The server does not\n * resolve body links, so a link to a page outside the loaded set stays unresolved.\n */\n\nimport type { KnowledgePageEdge, KnowledgePagePayload } from '../pageTypes';\n\nexport interface KnowledgePageRefIndex {\n resolve: (ref: string) => KnowledgePagePayload | undefined;\n}\n\n/** Same as core's `canonicalKnowledgeName`. */\nfunction canonicalName(name: string): string {\n return name.normalize('NFKC').trim().replace(/\\s+/g, ' ').toLowerCase();\n}\n\nexport function knowledgePageRefIndex(pages: Iterable<KnowledgePagePayload>): KnowledgePageRefIndex {\n const byId = new Map<string, KnowledgePagePayload>();\n const scopesByAddress = new Map<string, KnowledgePagePayload>();\n const childByKey = new Map<string, KnowledgePagePayload>();\n const byName = new Map<string, KnowledgePagePayload | null>();\n for (const page of pages) {\n if (page.deletedAt || page.mergedInto) continue;\n byId.set(page.id, page);\n if (page.isScope && page.address) scopesByAddress.set(page.address, page);\n if (!page.isScope && page.key && page.parentId) childByKey.set(`${page.parentId}\\u0000${page.key}`, page);\n const name = canonicalName(page.name);\n byName.set(name, byName.has(name) ? null : page);\n }\n\n const byPath = (ref: string): KnowledgePagePayload | undefined => {\n const hash = ref.indexOf('#');\n if (hash <= 0) return undefined;\n const scope = scopesByAddress.get(ref.slice(0, hash));\n if (!scope) return undefined;\n let page: KnowledgePagePayload | undefined = scope;\n for (const key of ref.slice(hash + 1).split('/')) {\n page = childByKey.get(`${page.id}\\u0000${key}`);\n if (!page || page.scopeId !== scope.id) return undefined;\n }\n return page === scope ? undefined : page;\n };\n\n return {\n resolve(raw) {\n const ref = raw.trim();\n if (!ref) return undefined;\n return byId.get(ref) ?? byPath(ref) ?? scopesByAddress.get(ref) ?? byName.get(canonicalName(ref)) ?? undefined;\n },\n };\n}\n\nconst WIKILINK = /\\[\\[([^\\]]+)\\]\\]/g;\n// Code is shown as written, so a `[[ref]]` inside it is not a link.\nconst FENCED_CODE = /^(`{3,}|~{3,})[^\\n]*\\n[\\s\\S]*?(?:^\\1[ \\t]*$|(?![\\s\\S]))/gm;\nconst INLINE_CODE = /(`+)[\\s\\S]*?\\1/g;\n\n/** The `[[ref]]`s in a markdown body, outside code. */\nexport function bodyLinkRefs(body: string): string[] {\n const prose = body.replace(FENCED_CODE, '').replace(INLINE_CODE, '');\n return [...prose.matchAll(WIKILINK)].map(match => match[1] ?? '');\n}\n\n/** One `link` edge per page whose body links another loaded page; `count` is how many times. */\nexport function bodyLinkEdges(pages: KnowledgePagePayload[]): KnowledgePageEdge[] {\n const index = knowledgePageRefIndex(pages);\n const edges: KnowledgePageEdge[] = [];\n for (const page of pages) {\n if (!page.body || page.deletedAt || page.mergedInto) continue;\n const counts = new Map<string, number>();\n for (const ref of bodyLinkRefs(page.body)) {\n const target = index.resolve(ref);\n if (target && target.id !== page.id) counts.set(target.id, (counts.get(target.id) ?? 0) + 1);\n }\n for (const [target, count] of counts) edges.push({ source: page.id, target, kind: 'link', count });\n }\n return edges;\n}\n"],"mappings":";;;AAcA,SAAS,cAAc,MAAsB;CAC3C,OAAO,KAAK,UAAU,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,QAAQ,GAAG,CAAC,CAAC,YAAY;AACxE;AAEA,SAAgB,sBAAsB,OAA8D;CAClG,MAAM,uBAAO,IAAI,IAAkC;CACnD,MAAM,kCAAkB,IAAI,IAAkC;CAC9D,MAAM,6BAAa,IAAI,IAAkC;CACzD,MAAM,yBAAS,IAAI,IAAyC;CAC5D,KAAK,MAAM,QAAQ,OAAO;EACxB,IAAI,KAAK,aAAa,KAAK,YAAY;EACvC,KAAK,IAAI,KAAK,IAAI,IAAI;EACtB,IAAI,KAAK,WAAW,KAAK,SAAS,gBAAgB,IAAI,KAAK,SAAS,IAAI;EACxE,IAAI,CAAC,KAAK,WAAW,KAAK,OAAO,KAAK,UAAU,WAAW,IAAI,GAAG,KAAK,SAAS,QAAQ,KAAK,OAAO,IAAI;EACxG,MAAM,OAAO,cAAc,KAAK,IAAI;EACpC,OAAO,IAAI,MAAM,OAAO,IAAI,IAAI,IAAI,OAAO,IAAI;CACjD;CAEA,MAAM,UAAU,QAAkD;EAChE,MAAM,OAAO,IAAI,QAAQ,GAAG;EAC5B,IAAI,QAAQ,GAAG,OAAO,KAAA;EACtB,MAAM,QAAQ,gBAAgB,IAAI,IAAI,MAAM,GAAG,IAAI,CAAC;EACpD,IAAI,CAAC,OAAO,OAAO,KAAA;EACnB,IAAI,OAAyC;EAC7C,KAAK,MAAM,OAAO,IAAI,MAAM,OAAO,CAAC,CAAC,CAAC,MAAM,GAAG,GAAG;GAChD,OAAO,WAAW,IAAI,GAAG,KAAK,GAAG,QAAQ,KAAK;GAC9C,IAAI,CAAC,QAAQ,KAAK,YAAY,MAAM,IAAI,OAAO,KAAA;EACjD;EACA,OAAO,SAAS,QAAQ,KAAA,IAAY;CACtC;CAEA,OAAO,EACL,QAAQ,KAAK;EACX,MAAM,MAAM,IAAI,KAAK;EACrB,IAAI,CAAC,KAAK,OAAO,KAAA;EACjB,OAAO,KAAK,IAAI,GAAG,KAAK,OAAO,GAAG,KAAK,gBAAgB,IAAI,GAAG,KAAK,OAAO,IAAI,cAAc,GAAG,CAAC,KAAK,KAAA;CACvG,EACF;AACF;AAEA,IAAM,WAAW;AAEjB,IAAM,cAAc;AACpB,IAAM,cAAc;;AAGpB,SAAgB,aAAa,MAAwB;CAEnD,OAAO,CAAC,GADM,KAAK,QAAQ,aAAa,EAAE,CAAC,CAAC,QAAQ,aAAa,EACtD,CAAA,CAAM,SAAS,QAAQ,CAAC,CAAC,CAAC,KAAI,UAAS,MAAM,MAAM,EAAE;AAClE;;AAGA,SAAgB,cAAc,OAAoD;CAChF,MAAM,QAAQ,sBAAsB,KAAK;CACzC,MAAM,QAA6B,CAAC;CACpC,KAAK,MAAM,QAAQ,OAAO;EACxB,IAAI,CAAC,KAAK,QAAQ,KAAK,aAAa,KAAK,YAAY;EACrD,MAAM,yBAAS,IAAI,IAAoB;EACvC,KAAK,MAAM,OAAO,aAAa,KAAK,IAAI,GAAG;GACzC,MAAM,SAAS,MAAM,QAAQ,GAAG;GAChC,IAAI,UAAU,OAAO,OAAO,KAAK,IAAI,OAAO,IAAI,OAAO,KAAK,OAAO,IAAI,OAAO,EAAE,KAAK,KAAK,CAAC;EAC7F;EACA,KAAK,MAAM,CAAC,QAAQ,UAAU,QAAQ,MAAM,KAAK;GAAE,QAAQ,KAAK;GAAI;GAAQ,MAAM;GAAQ;EAAM,CAAC;CACnG;CACA,OAAO;AACT"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from '../../../src/domains/knowledge/lib/pageRefs';
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
// src/domains/knowledge/lib/pageRefs.ts
|
|
2
|
+
/** Same as core's `canonicalKnowledgeName`. */
|
|
3
|
+
function canonicalName(name) {
|
|
4
|
+
return name.normalize("NFKC").trim().replace(/\s+/g, " ").toLowerCase();
|
|
5
|
+
}
|
|
6
|
+
function knowledgePageRefIndex(pages) {
|
|
7
|
+
const byId = /* @__PURE__ */ new Map();
|
|
8
|
+
const scopesByAddress = /* @__PURE__ */ new Map();
|
|
9
|
+
const childByKey = /* @__PURE__ */ new Map();
|
|
10
|
+
const byName = /* @__PURE__ */ new Map();
|
|
11
|
+
for (const page of pages) {
|
|
12
|
+
if (page.deletedAt || page.mergedInto) continue;
|
|
13
|
+
byId.set(page.id, page);
|
|
14
|
+
if (page.isScope && page.address) scopesByAddress.set(page.address, page);
|
|
15
|
+
if (!page.isScope && page.key && page.parentId) childByKey.set(`${page.parentId}\u0000${page.key}`, page);
|
|
16
|
+
const name = canonicalName(page.name);
|
|
17
|
+
byName.set(name, byName.has(name) ? null : page);
|
|
18
|
+
}
|
|
19
|
+
const byPath = (ref) => {
|
|
20
|
+
const hash = ref.indexOf("#");
|
|
21
|
+
if (hash <= 0) return void 0;
|
|
22
|
+
const scope = scopesByAddress.get(ref.slice(0, hash));
|
|
23
|
+
if (!scope) return void 0;
|
|
24
|
+
let page = scope;
|
|
25
|
+
for (const key of ref.slice(hash + 1).split("/")) {
|
|
26
|
+
page = childByKey.get(`${page.id}\u0000${key}`);
|
|
27
|
+
if (!page || page.scopeId !== scope.id) return void 0;
|
|
28
|
+
}
|
|
29
|
+
return page === scope ? void 0 : page;
|
|
30
|
+
};
|
|
31
|
+
return { resolve(raw) {
|
|
32
|
+
const ref = raw.trim();
|
|
33
|
+
if (!ref) return void 0;
|
|
34
|
+
return byId.get(ref) ?? byPath(ref) ?? scopesByAddress.get(ref) ?? byName.get(canonicalName(ref)) ?? void 0;
|
|
35
|
+
} };
|
|
36
|
+
}
|
|
37
|
+
var WIKILINK = /\[\[([^\]]+)\]\]/g;
|
|
38
|
+
var FENCED_CODE = /^(`{3,}|~{3,})[^\n]*\n[\s\S]*?(?:^\1[ \t]*$|(?![\s\S]))/gm;
|
|
39
|
+
var INLINE_CODE = /(`+)[\s\S]*?\1/g;
|
|
40
|
+
/** The `[[ref]]`s in a markdown body, outside code. */
|
|
41
|
+
function bodyLinkRefs(body) {
|
|
42
|
+
return [...body.replace(FENCED_CODE, "").replace(INLINE_CODE, "").matchAll(WIKILINK)].map((match) => match[1] ?? "");
|
|
43
|
+
}
|
|
44
|
+
/** One `link` edge per page whose body links another loaded page; `count` is how many times. */
|
|
45
|
+
function bodyLinkEdges(pages) {
|
|
46
|
+
const index = knowledgePageRefIndex(pages);
|
|
47
|
+
const edges = [];
|
|
48
|
+
for (const page of pages) {
|
|
49
|
+
if (!page.body || page.deletedAt || page.mergedInto) continue;
|
|
50
|
+
const counts = /* @__PURE__ */ new Map();
|
|
51
|
+
for (const ref of bodyLinkRefs(page.body)) {
|
|
52
|
+
const target = index.resolve(ref);
|
|
53
|
+
if (target && target.id !== page.id) counts.set(target.id, (counts.get(target.id) ?? 0) + 1);
|
|
54
|
+
}
|
|
55
|
+
for (const [target, count] of counts) edges.push({
|
|
56
|
+
source: page.id,
|
|
57
|
+
target,
|
|
58
|
+
kind: "link",
|
|
59
|
+
count
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
return edges;
|
|
63
|
+
}
|
|
64
|
+
export { bodyLinkEdges, bodyLinkRefs, knowledgePageRefIndex };
|
|
65
|
+
|
|
66
|
+
//# sourceMappingURL=pageRefs.es.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pageRefs.es.js","names":[],"sources":["../../../../src/domains/knowledge/lib/pageRefs.ts"],"sourcesContent":["/**\n * Resolves `[[ref]]` links in page bodies and notes against the pages the explorer has loaded, in the\n * order core's `run.page(ref)` uses: page id, then `scope#key/key` path, then scope address, then a\n * unique page name (an ambiguous name resolves to nothing, as it throws in core). The server does not\n * resolve body links, so a link to a page outside the loaded set stays unresolved.\n */\n\nimport type { KnowledgePageEdge, KnowledgePagePayload } from '../pageTypes';\n\nexport interface KnowledgePageRefIndex {\n resolve: (ref: string) => KnowledgePagePayload | undefined;\n}\n\n/** Same as core's `canonicalKnowledgeName`. */\nfunction canonicalName(name: string): string {\n return name.normalize('NFKC').trim().replace(/\\s+/g, ' ').toLowerCase();\n}\n\nexport function knowledgePageRefIndex(pages: Iterable<KnowledgePagePayload>): KnowledgePageRefIndex {\n const byId = new Map<string, KnowledgePagePayload>();\n const scopesByAddress = new Map<string, KnowledgePagePayload>();\n const childByKey = new Map<string, KnowledgePagePayload>();\n const byName = new Map<string, KnowledgePagePayload | null>();\n for (const page of pages) {\n if (page.deletedAt || page.mergedInto) continue;\n byId.set(page.id, page);\n if (page.isScope && page.address) scopesByAddress.set(page.address, page);\n if (!page.isScope && page.key && page.parentId) childByKey.set(`${page.parentId}\\u0000${page.key}`, page);\n const name = canonicalName(page.name);\n byName.set(name, byName.has(name) ? null : page);\n }\n\n const byPath = (ref: string): KnowledgePagePayload | undefined => {\n const hash = ref.indexOf('#');\n if (hash <= 0) return undefined;\n const scope = scopesByAddress.get(ref.slice(0, hash));\n if (!scope) return undefined;\n let page: KnowledgePagePayload | undefined = scope;\n for (const key of ref.slice(hash + 1).split('/')) {\n page = childByKey.get(`${page.id}\\u0000${key}`);\n if (!page || page.scopeId !== scope.id) return undefined;\n }\n return page === scope ? undefined : page;\n };\n\n return {\n resolve(raw) {\n const ref = raw.trim();\n if (!ref) return undefined;\n return byId.get(ref) ?? byPath(ref) ?? scopesByAddress.get(ref) ?? byName.get(canonicalName(ref)) ?? undefined;\n },\n };\n}\n\nconst WIKILINK = /\\[\\[([^\\]]+)\\]\\]/g;\n// Code is shown as written, so a `[[ref]]` inside it is not a link.\nconst FENCED_CODE = /^(`{3,}|~{3,})[^\\n]*\\n[\\s\\S]*?(?:^\\1[ \\t]*$|(?![\\s\\S]))/gm;\nconst INLINE_CODE = /(`+)[\\s\\S]*?\\1/g;\n\n/** The `[[ref]]`s in a markdown body, outside code. */\nexport function bodyLinkRefs(body: string): string[] {\n const prose = body.replace(FENCED_CODE, '').replace(INLINE_CODE, '');\n return [...prose.matchAll(WIKILINK)].map(match => match[1] ?? '');\n}\n\n/** One `link` edge per page whose body links another loaded page; `count` is how many times. */\nexport function bodyLinkEdges(pages: KnowledgePagePayload[]): KnowledgePageEdge[] {\n const index = knowledgePageRefIndex(pages);\n const edges: KnowledgePageEdge[] = [];\n for (const page of pages) {\n if (!page.body || page.deletedAt || page.mergedInto) continue;\n const counts = new Map<string, number>();\n for (const ref of bodyLinkRefs(page.body)) {\n const target = index.resolve(ref);\n if (target && target.id !== page.id) counts.set(target.id, (counts.get(target.id) ?? 0) + 1);\n }\n for (const [target, count] of counts) edges.push({ source: page.id, target, kind: 'link', count });\n }\n return edges;\n}\n"],"mappings":";;AAcA,SAAS,cAAc,MAAsB;CAC3C,OAAO,KAAK,UAAU,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,QAAQ,GAAG,CAAC,CAAC,YAAY;AACxE;AAEA,SAAgB,sBAAsB,OAA8D;CAClG,MAAM,uBAAO,IAAI,IAAkC;CACnD,MAAM,kCAAkB,IAAI,IAAkC;CAC9D,MAAM,6BAAa,IAAI,IAAkC;CACzD,MAAM,yBAAS,IAAI,IAAyC;CAC5D,KAAK,MAAM,QAAQ,OAAO;EACxB,IAAI,KAAK,aAAa,KAAK,YAAY;EACvC,KAAK,IAAI,KAAK,IAAI,IAAI;EACtB,IAAI,KAAK,WAAW,KAAK,SAAS,gBAAgB,IAAI,KAAK,SAAS,IAAI;EACxE,IAAI,CAAC,KAAK,WAAW,KAAK,OAAO,KAAK,UAAU,WAAW,IAAI,GAAG,KAAK,SAAS,QAAQ,KAAK,OAAO,IAAI;EACxG,MAAM,OAAO,cAAc,KAAK,IAAI;EACpC,OAAO,IAAI,MAAM,OAAO,IAAI,IAAI,IAAI,OAAO,IAAI;CACjD;CAEA,MAAM,UAAU,QAAkD;EAChE,MAAM,OAAO,IAAI,QAAQ,GAAG;EAC5B,IAAI,QAAQ,GAAG,OAAO,KAAA;EACtB,MAAM,QAAQ,gBAAgB,IAAI,IAAI,MAAM,GAAG,IAAI,CAAC;EACpD,IAAI,CAAC,OAAO,OAAO,KAAA;EACnB,IAAI,OAAyC;EAC7C,KAAK,MAAM,OAAO,IAAI,MAAM,OAAO,CAAC,CAAC,CAAC,MAAM,GAAG,GAAG;GAChD,OAAO,WAAW,IAAI,GAAG,KAAK,GAAG,QAAQ,KAAK;GAC9C,IAAI,CAAC,QAAQ,KAAK,YAAY,MAAM,IAAI,OAAO,KAAA;EACjD;EACA,OAAO,SAAS,QAAQ,KAAA,IAAY;CACtC;CAEA,OAAO,EACL,QAAQ,KAAK;EACX,MAAM,MAAM,IAAI,KAAK;EACrB,IAAI,CAAC,KAAK,OAAO,KAAA;EACjB,OAAO,KAAK,IAAI,GAAG,KAAK,OAAO,GAAG,KAAK,gBAAgB,IAAI,GAAG,KAAK,OAAO,IAAI,cAAc,GAAG,CAAC,KAAK,KAAA;CACvG,EACF;AACF;AAEA,IAAM,WAAW;AAEjB,IAAM,cAAc;AACpB,IAAM,cAAc;;AAGpB,SAAgB,aAAa,MAAwB;CAEnD,OAAO,CAAC,GADM,KAAK,QAAQ,aAAa,EAAE,CAAC,CAAC,QAAQ,aAAa,EACtD,CAAA,CAAM,SAAS,QAAQ,CAAC,CAAC,CAAC,KAAI,UAAS,MAAM,MAAM,EAAE;AAClE;;AAGA,SAAgB,cAAc,OAAoD;CAChF,MAAM,QAAQ,sBAAsB,KAAK;CACzC,MAAM,QAA6B,CAAC;CACpC,KAAK,MAAM,QAAQ,OAAO;EACxB,IAAI,CAAC,KAAK,QAAQ,KAAK,aAAa,KAAK,YAAY;EACrD,MAAM,yBAAS,IAAI,IAAoB;EACvC,KAAK,MAAM,OAAO,aAAa,KAAK,IAAI,GAAG;GACzC,MAAM,SAAS,MAAM,QAAQ,GAAG;GAChC,IAAI,UAAU,OAAO,OAAO,KAAK,IAAI,OAAO,IAAI,OAAO,KAAK,OAAO,IAAI,OAAO,EAAE,KAAK,KAAK,CAAC;EAC7F;EACA,KAAK,MAAM,CAAC,QAAQ,UAAU,QAAQ,MAAM,KAAK;GAAE,QAAQ,KAAK;GAAI;GAAQ,MAAM;GAAQ;EAAM,CAAC;CACnG;CACA,OAAO;AACT"}
|
|
@@ -90,7 +90,12 @@ function pageAncestorIds(pages, pageId) {
|
|
|
90
90
|
}
|
|
91
91
|
return path;
|
|
92
92
|
}
|
|
93
|
+
/** A page's child count as shown: `1000+` when the server capped the count, so it never reads low. */
|
|
94
|
+
function childCountLabel(page) {
|
|
95
|
+
return page.childCountCapped ? `${page.childCount ?? 0}+` : String(page.childCount ?? 0);
|
|
96
|
+
}
|
|
93
97
|
exports.buildPageTree = buildPageTree;
|
|
98
|
+
exports.childCountLabel = childCountLabel;
|
|
94
99
|
exports.comparePagePosition = comparePagePosition;
|
|
95
100
|
exports.pageAncestorIds = pageAncestorIds;
|
|
96
101
|
exports.visiblePageRows = visiblePageRows;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pageTree.cjs.js","names":[],"sources":["../../../../src/domains/knowledge/lib/pageTree.ts"],"sourcesContent":["/**\n * Pure page-tree logic for the schema-4 explorer: loaded pages → a sorted\n * tree, the visible rows for a set of expanded ids, and the ancestor path\n * that must open to reveal a selection. Free of React so it unit-tests alone.\n */\n\nimport type { KnowledgePagePayload } from '../pageTypes';\n\nexport interface KnowledgePageTreeNode {\n page: KnowledgePagePayload;\n children: KnowledgePageTreeNode[];\n}\n\nexport interface KnowledgePageTreeRow {\n page: KnowledgePagePayload;\n depth: number;\n hasChildren: boolean;\n expanded: boolean;\n}\n\n/** Sibling order: position by UTF-16 code unit (as the store defines it), then id. */\nexport function comparePagePosition(a: KnowledgePagePayload, b: KnowledgePagePayload): number {\n if (a.position !== b.position) return a.position < b.position ? -1 : 1;\n if (a.id === b.id) return 0;\n return a.id < b.id ? -1 : 1;\n}\n\nfunction isLive(page: KnowledgePagePayload): boolean {\n return !page.deletedAt && !page.mergedInto;\n}\n\n/**\n * Builds the tree from whatever pages are loaded. A page whose parent isn't\n * loaded (or is deleted/merged) becomes a root, and so does the first page (in\n * sibling order) of any parent cycle, so no loaded live page is ever lost.\n */\nexport function buildPageTree(pages: KnowledgePagePayload[]): KnowledgePageTreeNode[] {\n const nodes = new Map<string, KnowledgePageTreeNode>();\n for (const page of pages) {\n if (isLive(page) && !nodes.has(page.id)) nodes.set(page.id, { page, children: [] });\n }\n const roots: KnowledgePageTreeNode[] = [];\n const parentOf = new Map<KnowledgePageTreeNode, KnowledgePageTreeNode>();\n for (const node of nodes.values()) {\n const parent = node.page.parentId ? nodes.get(node.page.parentId) : undefined;\n if (parent && parent !== node) {\n parent.children.push(node);\n parentOf.set(node, parent);\n } else roots.push(node);\n }\n const reached = new Set<KnowledgePageTreeNode>();\n const reach = (node: KnowledgePageTreeNode) => {\n if (reached.has(node)) return;\n reached.add(node);\n for (const child of node.children) reach(child);\n };\n roots.forEach(reach);\n // Whatever no root reaches sits in a parent cycle (or under one): cut each cycle at its first page.\n const stranded = [...nodes.values()].filter(node => !reached.has(node));\n stranded.sort((a, b) => comparePagePosition(a.page, b.page));\n for (const node of stranded) {\n if (reached.has(node)) continue;\n // Climb to the cycle this page hangs from, then cut it at the cycle's first page.\n const path: KnowledgePageTreeNode[] = [];\n let at: KnowledgePageTreeNode | undefined = node;\n while (at && !path.includes(at)) {\n path.push(at);\n at = parentOf.get(at);\n }\n const cycle = at ? path.slice(path.indexOf(at)) : [node];\n const cut = cycle.reduce((first, member) => (comparePagePosition(member.page, first.page) < 0 ? member : first));\n const parent = parentOf.get(cut);\n if (parent) parent.children.splice(parent.children.indexOf(cut), 1);\n roots.push(cut);\n reach(cut);\n }\n const sort = (list: KnowledgePageTreeNode[]) => {\n list.sort((a, b) => comparePagePosition(a.page, b.page));\n for (const node of list) sort(node.children);\n };\n sort(roots);\n return roots;\n}\n\n/** Depth-first rows for rendering, descending only into expanded pages. */\nexport function visiblePageRows(roots: KnowledgePageTreeNode[], expanded: ReadonlySet<string>): KnowledgePageTreeRow[] {\n const rows: KnowledgePageTreeRow[] = [];\n const walk = (list: KnowledgePageTreeNode[], depth: number) => {\n for (const node of list) {\n const open = expanded.has(node.page.id);\n rows.push({ page: node.page, depth, hasChildren: node.children.length > 0, expanded: open });\n if (open) walk(node.children, depth + 1);\n }\n };\n walk(roots, 0);\n return rows;\n}\n\n/** Ids from the root down to (not including) `pageId`; stops at unloaded parents and cycles. */\nexport function pageAncestorIds(pages: KnowledgePagePayload[], pageId: string): string[] {\n const byId = new Map(pages.map(page => [page.id, page]));\n const path: string[] = [];\n const seen = new Set<string>([pageId]);\n let parentId = byId.get(pageId)?.parentId ?? null;\n while (parentId && byId.has(parentId) && !seen.has(parentId)) {\n seen.add(parentId);\n path.unshift(parentId);\n parentId = byId.get(parentId)?.parentId ?? null;\n }\n return path;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pageTree.cjs.js","names":[],"sources":["../../../../src/domains/knowledge/lib/pageTree.ts"],"sourcesContent":["/**\n * Pure page-tree logic for the schema-4 explorer: loaded pages → a sorted\n * tree, the visible rows for a set of expanded ids, and the ancestor path\n * that must open to reveal a selection. Free of React so it unit-tests alone.\n */\n\nimport type { KnowledgePagePayload } from '../pageTypes';\n\nexport interface KnowledgePageTreeNode {\n page: KnowledgePagePayload;\n children: KnowledgePageTreeNode[];\n}\n\nexport interface KnowledgePageTreeRow {\n page: KnowledgePagePayload;\n depth: number;\n hasChildren: boolean;\n expanded: boolean;\n}\n\n/** Sibling order: position by UTF-16 code unit (as the store defines it), then id. */\nexport function comparePagePosition(a: KnowledgePagePayload, b: KnowledgePagePayload): number {\n if (a.position !== b.position) return a.position < b.position ? -1 : 1;\n if (a.id === b.id) return 0;\n return a.id < b.id ? -1 : 1;\n}\n\nfunction isLive(page: KnowledgePagePayload): boolean {\n return !page.deletedAt && !page.mergedInto;\n}\n\n/**\n * Builds the tree from whatever pages are loaded. A page whose parent isn't\n * loaded (or is deleted/merged) becomes a root, and so does the first page (in\n * sibling order) of any parent cycle, so no loaded live page is ever lost.\n */\nexport function buildPageTree(pages: KnowledgePagePayload[]): KnowledgePageTreeNode[] {\n const nodes = new Map<string, KnowledgePageTreeNode>();\n for (const page of pages) {\n if (isLive(page) && !nodes.has(page.id)) nodes.set(page.id, { page, children: [] });\n }\n const roots: KnowledgePageTreeNode[] = [];\n const parentOf = new Map<KnowledgePageTreeNode, KnowledgePageTreeNode>();\n for (const node of nodes.values()) {\n const parent = node.page.parentId ? nodes.get(node.page.parentId) : undefined;\n if (parent && parent !== node) {\n parent.children.push(node);\n parentOf.set(node, parent);\n } else roots.push(node);\n }\n const reached = new Set<KnowledgePageTreeNode>();\n const reach = (node: KnowledgePageTreeNode) => {\n if (reached.has(node)) return;\n reached.add(node);\n for (const child of node.children) reach(child);\n };\n roots.forEach(reach);\n // Whatever no root reaches sits in a parent cycle (or under one): cut each cycle at its first page.\n const stranded = [...nodes.values()].filter(node => !reached.has(node));\n stranded.sort((a, b) => comparePagePosition(a.page, b.page));\n for (const node of stranded) {\n if (reached.has(node)) continue;\n // Climb to the cycle this page hangs from, then cut it at the cycle's first page.\n const path: KnowledgePageTreeNode[] = [];\n let at: KnowledgePageTreeNode | undefined = node;\n while (at && !path.includes(at)) {\n path.push(at);\n at = parentOf.get(at);\n }\n const cycle = at ? path.slice(path.indexOf(at)) : [node];\n const cut = cycle.reduce((first, member) => (comparePagePosition(member.page, first.page) < 0 ? member : first));\n const parent = parentOf.get(cut);\n if (parent) parent.children.splice(parent.children.indexOf(cut), 1);\n roots.push(cut);\n reach(cut);\n }\n const sort = (list: KnowledgePageTreeNode[]) => {\n list.sort((a, b) => comparePagePosition(a.page, b.page));\n for (const node of list) sort(node.children);\n };\n sort(roots);\n return roots;\n}\n\n/** Depth-first rows for rendering, descending only into expanded pages. */\nexport function visiblePageRows(roots: KnowledgePageTreeNode[], expanded: ReadonlySet<string>): KnowledgePageTreeRow[] {\n const rows: KnowledgePageTreeRow[] = [];\n const walk = (list: KnowledgePageTreeNode[], depth: number) => {\n for (const node of list) {\n const open = expanded.has(node.page.id);\n rows.push({ page: node.page, depth, hasChildren: node.children.length > 0, expanded: open });\n if (open) walk(node.children, depth + 1);\n }\n };\n walk(roots, 0);\n return rows;\n}\n\n/** Ids from the root down to (not including) `pageId`; stops at unloaded parents and cycles. */\nexport function pageAncestorIds(pages: KnowledgePagePayload[], pageId: string): string[] {\n const byId = new Map(pages.map(page => [page.id, page]));\n const path: string[] = [];\n const seen = new Set<string>([pageId]);\n let parentId = byId.get(pageId)?.parentId ?? null;\n while (parentId && byId.has(parentId) && !seen.has(parentId)) {\n seen.add(parentId);\n path.unshift(parentId);\n parentId = byId.get(parentId)?.parentId ?? null;\n }\n return path;\n}\n\n/** A page's child count as shown: `1000+` when the server capped the count, so it never reads low. */\nexport function childCountLabel(page: KnowledgePagePayload): string {\n return page.childCountCapped ? `${page.childCount ?? 0}+` : String(page.childCount ?? 0);\n}\n"],"mappings":"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"}
|
|
@@ -89,6 +89,10 @@ function pageAncestorIds(pages, pageId) {
|
|
|
89
89
|
}
|
|
90
90
|
return path;
|
|
91
91
|
}
|
|
92
|
-
|
|
92
|
+
/** A page's child count as shown: `1000+` when the server capped the count, so it never reads low. */
|
|
93
|
+
function childCountLabel(page) {
|
|
94
|
+
return page.childCountCapped ? `${page.childCount ?? 0}+` : String(page.childCount ?? 0);
|
|
95
|
+
}
|
|
96
|
+
export { buildPageTree, childCountLabel, comparePagePosition, pageAncestorIds, visiblePageRows };
|
|
93
97
|
|
|
94
98
|
//# sourceMappingURL=pageTree.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pageTree.es.js","names":[],"sources":["../../../../src/domains/knowledge/lib/pageTree.ts"],"sourcesContent":["/**\n * Pure page-tree logic for the schema-4 explorer: loaded pages → a sorted\n * tree, the visible rows for a set of expanded ids, and the ancestor path\n * that must open to reveal a selection. Free of React so it unit-tests alone.\n */\n\nimport type { KnowledgePagePayload } from '../pageTypes';\n\nexport interface KnowledgePageTreeNode {\n page: KnowledgePagePayload;\n children: KnowledgePageTreeNode[];\n}\n\nexport interface KnowledgePageTreeRow {\n page: KnowledgePagePayload;\n depth: number;\n hasChildren: boolean;\n expanded: boolean;\n}\n\n/** Sibling order: position by UTF-16 code unit (as the store defines it), then id. */\nexport function comparePagePosition(a: KnowledgePagePayload, b: KnowledgePagePayload): number {\n if (a.position !== b.position) return a.position < b.position ? -1 : 1;\n if (a.id === b.id) return 0;\n return a.id < b.id ? -1 : 1;\n}\n\nfunction isLive(page: KnowledgePagePayload): boolean {\n return !page.deletedAt && !page.mergedInto;\n}\n\n/**\n * Builds the tree from whatever pages are loaded. A page whose parent isn't\n * loaded (or is deleted/merged) becomes a root, and so does the first page (in\n * sibling order) of any parent cycle, so no loaded live page is ever lost.\n */\nexport function buildPageTree(pages: KnowledgePagePayload[]): KnowledgePageTreeNode[] {\n const nodes = new Map<string, KnowledgePageTreeNode>();\n for (const page of pages) {\n if (isLive(page) && !nodes.has(page.id)) nodes.set(page.id, { page, children: [] });\n }\n const roots: KnowledgePageTreeNode[] = [];\n const parentOf = new Map<KnowledgePageTreeNode, KnowledgePageTreeNode>();\n for (const node of nodes.values()) {\n const parent = node.page.parentId ? nodes.get(node.page.parentId) : undefined;\n if (parent && parent !== node) {\n parent.children.push(node);\n parentOf.set(node, parent);\n } else roots.push(node);\n }\n const reached = new Set<KnowledgePageTreeNode>();\n const reach = (node: KnowledgePageTreeNode) => {\n if (reached.has(node)) return;\n reached.add(node);\n for (const child of node.children) reach(child);\n };\n roots.forEach(reach);\n // Whatever no root reaches sits in a parent cycle (or under one): cut each cycle at its first page.\n const stranded = [...nodes.values()].filter(node => !reached.has(node));\n stranded.sort((a, b) => comparePagePosition(a.page, b.page));\n for (const node of stranded) {\n if (reached.has(node)) continue;\n // Climb to the cycle this page hangs from, then cut it at the cycle's first page.\n const path: KnowledgePageTreeNode[] = [];\n let at: KnowledgePageTreeNode | undefined = node;\n while (at && !path.includes(at)) {\n path.push(at);\n at = parentOf.get(at);\n }\n const cycle = at ? path.slice(path.indexOf(at)) : [node];\n const cut = cycle.reduce((first, member) => (comparePagePosition(member.page, first.page) < 0 ? member : first));\n const parent = parentOf.get(cut);\n if (parent) parent.children.splice(parent.children.indexOf(cut), 1);\n roots.push(cut);\n reach(cut);\n }\n const sort = (list: KnowledgePageTreeNode[]) => {\n list.sort((a, b) => comparePagePosition(a.page, b.page));\n for (const node of list) sort(node.children);\n };\n sort(roots);\n return roots;\n}\n\n/** Depth-first rows for rendering, descending only into expanded pages. */\nexport function visiblePageRows(roots: KnowledgePageTreeNode[], expanded: ReadonlySet<string>): KnowledgePageTreeRow[] {\n const rows: KnowledgePageTreeRow[] = [];\n const walk = (list: KnowledgePageTreeNode[], depth: number) => {\n for (const node of list) {\n const open = expanded.has(node.page.id);\n rows.push({ page: node.page, depth, hasChildren: node.children.length > 0, expanded: open });\n if (open) walk(node.children, depth + 1);\n }\n };\n walk(roots, 0);\n return rows;\n}\n\n/** Ids from the root down to (not including) `pageId`; stops at unloaded parents and cycles. */\nexport function pageAncestorIds(pages: KnowledgePagePayload[], pageId: string): string[] {\n const byId = new Map(pages.map(page => [page.id, page]));\n const path: string[] = [];\n const seen = new Set<string>([pageId]);\n let parentId = byId.get(pageId)?.parentId ?? null;\n while (parentId && byId.has(parentId) && !seen.has(parentId)) {\n seen.add(parentId);\n path.unshift(parentId);\n parentId = byId.get(parentId)?.parentId ?? null;\n }\n return path;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pageTree.es.js","names":[],"sources":["../../../../src/domains/knowledge/lib/pageTree.ts"],"sourcesContent":["/**\n * Pure page-tree logic for the schema-4 explorer: loaded pages → a sorted\n * tree, the visible rows for a set of expanded ids, and the ancestor path\n * that must open to reveal a selection. Free of React so it unit-tests alone.\n */\n\nimport type { KnowledgePagePayload } from '../pageTypes';\n\nexport interface KnowledgePageTreeNode {\n page: KnowledgePagePayload;\n children: KnowledgePageTreeNode[];\n}\n\nexport interface KnowledgePageTreeRow {\n page: KnowledgePagePayload;\n depth: number;\n hasChildren: boolean;\n expanded: boolean;\n}\n\n/** Sibling order: position by UTF-16 code unit (as the store defines it), then id. */\nexport function comparePagePosition(a: KnowledgePagePayload, b: KnowledgePagePayload): number {\n if (a.position !== b.position) return a.position < b.position ? -1 : 1;\n if (a.id === b.id) return 0;\n return a.id < b.id ? -1 : 1;\n}\n\nfunction isLive(page: KnowledgePagePayload): boolean {\n return !page.deletedAt && !page.mergedInto;\n}\n\n/**\n * Builds the tree from whatever pages are loaded. A page whose parent isn't\n * loaded (or is deleted/merged) becomes a root, and so does the first page (in\n * sibling order) of any parent cycle, so no loaded live page is ever lost.\n */\nexport function buildPageTree(pages: KnowledgePagePayload[]): KnowledgePageTreeNode[] {\n const nodes = new Map<string, KnowledgePageTreeNode>();\n for (const page of pages) {\n if (isLive(page) && !nodes.has(page.id)) nodes.set(page.id, { page, children: [] });\n }\n const roots: KnowledgePageTreeNode[] = [];\n const parentOf = new Map<KnowledgePageTreeNode, KnowledgePageTreeNode>();\n for (const node of nodes.values()) {\n const parent = node.page.parentId ? nodes.get(node.page.parentId) : undefined;\n if (parent && parent !== node) {\n parent.children.push(node);\n parentOf.set(node, parent);\n } else roots.push(node);\n }\n const reached = new Set<KnowledgePageTreeNode>();\n const reach = (node: KnowledgePageTreeNode) => {\n if (reached.has(node)) return;\n reached.add(node);\n for (const child of node.children) reach(child);\n };\n roots.forEach(reach);\n // Whatever no root reaches sits in a parent cycle (or under one): cut each cycle at its first page.\n const stranded = [...nodes.values()].filter(node => !reached.has(node));\n stranded.sort((a, b) => comparePagePosition(a.page, b.page));\n for (const node of stranded) {\n if (reached.has(node)) continue;\n // Climb to the cycle this page hangs from, then cut it at the cycle's first page.\n const path: KnowledgePageTreeNode[] = [];\n let at: KnowledgePageTreeNode | undefined = node;\n while (at && !path.includes(at)) {\n path.push(at);\n at = parentOf.get(at);\n }\n const cycle = at ? path.slice(path.indexOf(at)) : [node];\n const cut = cycle.reduce((first, member) => (comparePagePosition(member.page, first.page) < 0 ? member : first));\n const parent = parentOf.get(cut);\n if (parent) parent.children.splice(parent.children.indexOf(cut), 1);\n roots.push(cut);\n reach(cut);\n }\n const sort = (list: KnowledgePageTreeNode[]) => {\n list.sort((a, b) => comparePagePosition(a.page, b.page));\n for (const node of list) sort(node.children);\n };\n sort(roots);\n return roots;\n}\n\n/** Depth-first rows for rendering, descending only into expanded pages. */\nexport function visiblePageRows(roots: KnowledgePageTreeNode[], expanded: ReadonlySet<string>): KnowledgePageTreeRow[] {\n const rows: KnowledgePageTreeRow[] = [];\n const walk = (list: KnowledgePageTreeNode[], depth: number) => {\n for (const node of list) {\n const open = expanded.has(node.page.id);\n rows.push({ page: node.page, depth, hasChildren: node.children.length > 0, expanded: open });\n if (open) walk(node.children, depth + 1);\n }\n };\n walk(roots, 0);\n return rows;\n}\n\n/** Ids from the root down to (not including) `pageId`; stops at unloaded parents and cycles. */\nexport function pageAncestorIds(pages: KnowledgePagePayload[], pageId: string): string[] {\n const byId = new Map(pages.map(page => [page.id, page]));\n const path: string[] = [];\n const seen = new Set<string>([pageId]);\n let parentId = byId.get(pageId)?.parentId ?? null;\n while (parentId && byId.has(parentId) && !seen.has(parentId)) {\n seen.add(parentId);\n path.unshift(parentId);\n parentId = byId.get(parentId)?.parentId ?? null;\n }\n return path;\n}\n\n/** A page's child count as shown: `1000+` when the server capped the count, so it never reads low. */\nexport function childCountLabel(page: KnowledgePagePayload): string {\n return page.childCountCapped ? `${page.childCount ?? 0}+` : String(page.childCount ?? 0);\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
// src/domains/knowledge/lib/remarkKnowledgeLinks.ts
|
|
3
|
+
var WIKILINK = /\[\[([^\]]+)\]\]/g;
|
|
4
|
+
/** `[[ref]]`, or a bare `type:value#path` address such as `docs:mastra#guides/memory` (never a URL or an email). */
|
|
5
|
+
var WIKILINK_OR_ADDRESS = /\[\[([^\]]+)\]\]|(?<![\w:/#@.-])([a-z][\w-]*:[\w.-]+#[\w./-]*[\w/])/g;
|
|
6
|
+
/** The hast property a `[[ref]]` carries on its `<span>`; react-markdown hands it to the `span` override. */
|
|
7
|
+
var KNOWLEDGE_REF_PROPERTY = "dataKnowledgeRef";
|
|
8
|
+
/** Set to `'bare'` on a ref written without `[[ ]]`: it only looks like an address, so a host links it once the page resolves. */
|
|
9
|
+
var KNOWLEDGE_BARE_PROPERTY = "dataKnowledgeBare";
|
|
10
|
+
/**
|
|
11
|
+
* A remark plugin that turns each `[[ref]]` in markdown prose into `<span data-knowledge-ref="ref">ref</span>`,
|
|
12
|
+
* for a `span` override to draw as a page link. It only splits text nodes, so code, inline code and
|
|
13
|
+
* existing links are left alone, and the ref stays text: nothing in a body becomes markup.
|
|
14
|
+
*/
|
|
15
|
+
function remarkKnowledgeLinks() {
|
|
16
|
+
return (tree) => {
|
|
17
|
+
visit(tree, WIKILINK);
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
/** `remarkKnowledgeLinks` for chat prose, where a model also writes a page's address bare. */
|
|
21
|
+
function remarkKnowledgeChatLinks() {
|
|
22
|
+
return (tree) => {
|
|
23
|
+
visit(tree, WIKILINK_OR_ADDRESS);
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
function visit(node, pattern) {
|
|
27
|
+
if (node.type === "link" || node.type === "linkReference") return;
|
|
28
|
+
const children = [];
|
|
29
|
+
let changed = false;
|
|
30
|
+
for (const child of node.children) {
|
|
31
|
+
if (child.type === "text") {
|
|
32
|
+
const split = splitText(child, pattern);
|
|
33
|
+
if (split) {
|
|
34
|
+
children.push(...split);
|
|
35
|
+
changed = true;
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
} else if ("children" in child) visit(child, pattern);
|
|
39
|
+
children.push(child);
|
|
40
|
+
}
|
|
41
|
+
if (changed) node.children = children;
|
|
42
|
+
}
|
|
43
|
+
function splitText(node, pattern) {
|
|
44
|
+
const { value } = node;
|
|
45
|
+
const parts = [];
|
|
46
|
+
let last = 0;
|
|
47
|
+
for (const match of value.matchAll(pattern)) {
|
|
48
|
+
const ref = match[1] ?? match[2] ?? "";
|
|
49
|
+
const bare = match[1] === void 0;
|
|
50
|
+
if (match.index > last) parts.push({
|
|
51
|
+
type: "text",
|
|
52
|
+
value: value.slice(last, match.index)
|
|
53
|
+
});
|
|
54
|
+
parts.push({
|
|
55
|
+
type: "emphasis",
|
|
56
|
+
data: {
|
|
57
|
+
hName: "span",
|
|
58
|
+
hProperties: {
|
|
59
|
+
[KNOWLEDGE_REF_PROPERTY]: ref,
|
|
60
|
+
...bare ? { [KNOWLEDGE_BARE_PROPERTY]: "bare" } : {}
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
children: [{
|
|
64
|
+
type: "text",
|
|
65
|
+
value: ref
|
|
66
|
+
}]
|
|
67
|
+
});
|
|
68
|
+
last = match.index + match[0].length;
|
|
69
|
+
}
|
|
70
|
+
if (last === 0) return null;
|
|
71
|
+
if (last < value.length) parts.push({
|
|
72
|
+
type: "text",
|
|
73
|
+
value: value.slice(last)
|
|
74
|
+
});
|
|
75
|
+
return parts;
|
|
76
|
+
}
|
|
77
|
+
exports.KNOWLEDGE_BARE_PROPERTY = KNOWLEDGE_BARE_PROPERTY;
|
|
78
|
+
exports.KNOWLEDGE_REF_PROPERTY = KNOWLEDGE_REF_PROPERTY;
|
|
79
|
+
exports.remarkKnowledgeChatLinks = remarkKnowledgeChatLinks;
|
|
80
|
+
exports.remarkKnowledgeLinks = remarkKnowledgeLinks;
|
|
81
|
+
|
|
82
|
+
//# sourceMappingURL=remarkKnowledgeLinks.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remarkKnowledgeLinks.cjs.js","names":[],"sources":["../../../../src/domains/knowledge/lib/remarkKnowledgeLinks.ts"],"sourcesContent":["import type { Parent, PhrasingContent, Root, Text } from 'mdast';\n\nconst WIKILINK = /\\[\\[([^\\]]+)\\]\\]/g;\n/** `[[ref]]`, or a bare `type:value#path` address such as `docs:mastra#guides/memory` (never a URL or an email). */\nconst WIKILINK_OR_ADDRESS = /\\[\\[([^\\]]+)\\]\\]|(?<![\\w:/#@.-])([a-z][\\w-]*:[\\w.-]+#[\\w./-]*[\\w/])/g;\n\n/** The hast property a `[[ref]]` carries on its `<span>`; react-markdown hands it to the `span` override. */\nexport const KNOWLEDGE_REF_PROPERTY = 'dataKnowledgeRef';\n/** Set to `'bare'` on a ref written without `[[ ]]`: it only looks like an address, so a host links it once the page resolves. */\nexport const KNOWLEDGE_BARE_PROPERTY = 'dataKnowledgeBare';\n\n/**\n * A remark plugin that turns each `[[ref]]` in markdown prose into `<span data-knowledge-ref=\"ref\">ref</span>`,\n * for a `span` override to draw as a page link. It only splits text nodes, so code, inline code and\n * existing links are left alone, and the ref stays text: nothing in a body becomes markup.\n */\nexport function remarkKnowledgeLinks() {\n return (tree: Root) => {\n visit(tree, WIKILINK);\n };\n}\n\n/** `remarkKnowledgeLinks` for chat prose, where a model also writes a page's address bare. */\nexport function remarkKnowledgeChatLinks() {\n return (tree: Root) => {\n visit(tree, WIKILINK_OR_ADDRESS);\n };\n}\n\nfunction visit(node: Parent, pattern: RegExp) {\n if (node.type === 'link' || node.type === 'linkReference') return;\n const children: Parent['children'] = [];\n let changed = false;\n for (const child of node.children) {\n if (child.type === 'text') {\n const split = splitText(child, pattern);\n if (split) {\n children.push(...split);\n changed = true;\n continue;\n }\n } else if ('children' in child) {\n visit(child, pattern);\n }\n children.push(child);\n }\n if (changed) node.children = children;\n}\n\nfunction splitText(node: Text, pattern: RegExp): PhrasingContent[] | null {\n const { value } = node;\n const parts: PhrasingContent[] = [];\n let last = 0;\n for (const match of value.matchAll(pattern)) {\n const ref = match[1] ?? match[2] ?? '';\n const bare = match[1] === undefined;\n if (match.index > last) parts.push({ type: 'text', value: value.slice(last, match.index) });\n parts.push({\n type: 'emphasis',\n data: {\n hName: 'span',\n hProperties: { [KNOWLEDGE_REF_PROPERTY]: ref, ...(bare ? { [KNOWLEDGE_BARE_PROPERTY]: 'bare' } : {}) },\n },\n children: [{ type: 'text', value: ref }],\n });\n last = match.index + match[0].length;\n }\n if (last === 0) return null;\n if (last < value.length) parts.push({ type: 'text', value: value.slice(last) });\n return parts;\n}\n"],"mappings":";;AAEA,IAAM,WAAW;;AAEjB,IAAM,sBAAsB;;AAG5B,IAAa,yBAAyB;;AAEtC,IAAa,0BAA0B;;;;;;AAOvC,SAAgB,uBAAuB;CACrC,QAAQ,SAAe;EACrB,MAAM,MAAM,QAAQ;CACtB;AACF;;AAGA,SAAgB,2BAA2B;CACzC,QAAQ,SAAe;EACrB,MAAM,MAAM,mBAAmB;CACjC;AACF;AAEA,SAAS,MAAM,MAAc,SAAiB;CAC5C,IAAI,KAAK,SAAS,UAAU,KAAK,SAAS,iBAAiB;CAC3D,MAAM,WAA+B,CAAC;CACtC,IAAI,UAAU;CACd,KAAK,MAAM,SAAS,KAAK,UAAU;EACjC,IAAI,MAAM,SAAS,QAAQ;GACzB,MAAM,QAAQ,UAAU,OAAO,OAAO;GACtC,IAAI,OAAO;IACT,SAAS,KAAK,GAAG,KAAK;IACtB,UAAU;IACV;GACF;EACF,OAAO,IAAI,cAAc,OACvB,MAAM,OAAO,OAAO;EAEtB,SAAS,KAAK,KAAK;CACrB;CACA,IAAI,SAAS,KAAK,WAAW;AAC/B;AAEA,SAAS,UAAU,MAAY,SAA2C;CACxE,MAAM,EAAE,UAAU;CAClB,MAAM,QAA2B,CAAC;CAClC,IAAI,OAAO;CACX,KAAK,MAAM,SAAS,MAAM,SAAS,OAAO,GAAG;EAC3C,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM;EACpC,MAAM,OAAO,MAAM,OAAO,KAAA;EAC1B,IAAI,MAAM,QAAQ,MAAM,MAAM,KAAK;GAAE,MAAM;GAAQ,OAAO,MAAM,MAAM,MAAM,MAAM,KAAK;EAAE,CAAC;EAC1F,MAAM,KAAK;GACT,MAAM;GACN,MAAM;IACJ,OAAO;IACP,aAAa;MAAG,yBAAyB;KAAK,GAAI,OAAO,GAAG,0BAA0B,OAAO,IAAI,CAAC;IAAG;GACvG;GACA,UAAU,CAAC;IAAE,MAAM;IAAQ,OAAO;GAAI,CAAC;EACzC,CAAC;EACD,OAAO,MAAM,QAAQ,MAAM,EAAE,CAAC;CAChC;CACA,IAAI,SAAS,GAAG,OAAO;CACvB,IAAI,OAAO,MAAM,QAAQ,MAAM,KAAK;EAAE,MAAM;EAAQ,OAAO,MAAM,MAAM,IAAI;CAAE,CAAC;CAC9E,OAAO;AACT"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from '../../../src/domains/knowledge/lib/remarkKnowledgeLinks';
|