@principal-ai/subsystems-react 0.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +93 -0
- package/dist/components/ConfigurationSelector.d.ts +35 -0
- package/dist/components/ConfigurationSelector.d.ts.map +1 -0
- package/dist/components/ConfigurationSelector.js +63 -0
- package/dist/components/ConfigurationSelector.js.map +1 -0
- package/dist/components/GraphRenderer.d.ts +295 -0
- package/dist/components/GraphRenderer.d.ts.map +1 -0
- package/dist/components/GraphRenderer.js +2008 -0
- package/dist/components/GraphRenderer.js.map +1 -0
- package/dist/components/MultiCanvasRenderer.d.ts +75 -0
- package/dist/components/MultiCanvasRenderer.d.ts.map +1 -0
- package/dist/components/MultiCanvasRenderer.js +203 -0
- package/dist/components/MultiCanvasRenderer.js.map +1 -0
- package/dist/components/NodeTooltip.d.ts +24 -0
- package/dist/components/NodeTooltip.d.ts.map +1 -0
- package/dist/components/NodeTooltip.js +160 -0
- package/dist/components/NodeTooltip.js.map +1 -0
- package/dist/components/SelectionSidebar.d.ts +18 -0
- package/dist/components/SelectionSidebar.d.ts.map +1 -0
- package/dist/components/SelectionSidebar.js +190 -0
- package/dist/components/SelectionSidebar.js.map +1 -0
- package/dist/components/SequenceDiagramRenderer.d.ts +77 -0
- package/dist/components/SequenceDiagramRenderer.d.ts.map +1 -0
- package/dist/components/SequenceDiagramRenderer.js +604 -0
- package/dist/components/SequenceDiagramRenderer.js.map +1 -0
- package/dist/components/WorkflowSequenceDiagram.d.ts +63 -0
- package/dist/components/WorkflowSequenceDiagram.d.ts.map +1 -0
- package/dist/components/WorkflowSequenceDiagram.js +147 -0
- package/dist/components/WorkflowSequenceDiagram.js.map +1 -0
- package/dist/components/dashboard/DashboardRenderer.d.ts +10 -0
- package/dist/components/dashboard/DashboardRenderer.d.ts.map +1 -0
- package/dist/components/dashboard/DashboardRenderer.js +179 -0
- package/dist/components/dashboard/DashboardRenderer.js.map +1 -0
- package/dist/components/dashboard/MetricPanel.d.ts +10 -0
- package/dist/components/dashboard/MetricPanel.d.ts.map +1 -0
- package/dist/components/dashboard/MetricPanel.js +103 -0
- package/dist/components/dashboard/MetricPanel.js.map +1 -0
- package/dist/components/dashboard/MockDataProvider.d.ts +30 -0
- package/dist/components/dashboard/MockDataProvider.d.ts.map +1 -0
- package/dist/components/dashboard/MockDataProvider.js +270 -0
- package/dist/components/dashboard/MockDataProvider.js.map +1 -0
- package/dist/components/dashboard/components/BarChart.d.ts +10 -0
- package/dist/components/dashboard/components/BarChart.d.ts.map +1 -0
- package/dist/components/dashboard/components/BarChart.js +167 -0
- package/dist/components/dashboard/components/BarChart.js.map +1 -0
- package/dist/components/dashboard/components/LineChart.d.ts +10 -0
- package/dist/components/dashboard/components/LineChart.d.ts.map +1 -0
- package/dist/components/dashboard/components/LineChart.js +141 -0
- package/dist/components/dashboard/components/LineChart.js.map +1 -0
- package/dist/components/dashboard/components/MetricCard.d.ts +9 -0
- package/dist/components/dashboard/components/MetricCard.d.ts.map +1 -0
- package/dist/components/dashboard/components/MetricCard.js +163 -0
- package/dist/components/dashboard/components/MetricCard.js.map +1 -0
- package/dist/components/dashboard/components/SourceLink.d.ts +9 -0
- package/dist/components/dashboard/components/SourceLink.d.ts.map +1 -0
- package/dist/components/dashboard/components/SourceLink.js +39 -0
- package/dist/components/dashboard/components/SourceLink.js.map +1 -0
- package/dist/components/dashboard/components/TimeRangeSelector.d.ts +9 -0
- package/dist/components/dashboard/components/TimeRangeSelector.d.ts.map +1 -0
- package/dist/components/dashboard/components/TimeRangeSelector.js +167 -0
- package/dist/components/dashboard/components/TimeRangeSelector.js.map +1 -0
- package/dist/components/dashboard/components/index.d.ts +6 -0
- package/dist/components/dashboard/components/index.d.ts.map +1 -0
- package/dist/components/dashboard/components/index.js +6 -0
- package/dist/components/dashboard/components/index.js.map +1 -0
- package/dist/components/dashboard/index.d.ts +6 -0
- package/dist/components/dashboard/index.d.ts.map +1 -0
- package/dist/components/dashboard/index.js +8 -0
- package/dist/components/dashboard/index.js.map +1 -0
- package/dist/components/dashboard/types.d.ts +74 -0
- package/dist/components/dashboard/types.d.ts.map +1 -0
- package/dist/components/dashboard/types.js +8 -0
- package/dist/components/dashboard/types.js.map +1 -0
- package/dist/components/session-events/SessionEventFeed.d.ts +34 -0
- package/dist/components/session-events/SessionEventFeed.d.ts.map +1 -0
- package/dist/components/session-events/SessionEventFeed.js +1196 -0
- package/dist/components/session-events/SessionEventFeed.js.map +1 -0
- package/dist/components/session-events/index.d.ts +7 -0
- package/dist/components/session-events/index.d.ts.map +1 -0
- package/dist/components/session-events/index.js +6 -0
- package/dist/components/session-events/index.js.map +1 -0
- package/dist/components/state-view/PipelineView.d.ts +14 -0
- package/dist/components/state-view/PipelineView.d.ts.map +1 -0
- package/dist/components/state-view/PipelineView.js +195 -0
- package/dist/components/state-view/PipelineView.js.map +1 -0
- package/dist/components/state-view/index.d.ts +14 -0
- package/dist/components/state-view/index.d.ts.map +1 -0
- package/dist/components/state-view/index.js +12 -0
- package/dist/components/state-view/index.js.map +1 -0
- package/dist/components/state-view/types.d.ts +188 -0
- package/dist/components/state-view/types.d.ts.map +1 -0
- package/dist/components/state-view/types.js +10 -0
- package/dist/components/state-view/types.js.map +1 -0
- package/dist/components/state-view/useStateView.d.ts +32 -0
- package/dist/components/state-view/useStateView.d.ts.map +1 -0
- package/dist/components/state-view/useStateView.js +129 -0
- package/dist/components/state-view/useStateView.js.map +1 -0
- package/dist/contexts/GraphEditContext.d.ts +20 -0
- package/dist/contexts/GraphEditContext.d.ts.map +1 -0
- package/dist/contexts/GraphEditContext.js +8 -0
- package/dist/contexts/GraphEditContext.js.map +1 -0
- package/dist/contexts/TooltipPortalContext.d.ts +8 -0
- package/dist/contexts/TooltipPortalContext.d.ts.map +1 -0
- package/dist/contexts/TooltipPortalContext.js +8 -0
- package/dist/contexts/TooltipPortalContext.js.map +1 -0
- package/dist/edges/CustomEdge.d.ts +24 -0
- package/dist/edges/CustomEdge.d.ts.map +1 -0
- package/dist/edges/CustomEdge.js +222 -0
- package/dist/edges/CustomEdge.js.map +1 -0
- package/dist/edges/GenericEdge.d.ts +18 -0
- package/dist/edges/GenericEdge.d.ts.map +1 -0
- package/dist/edges/GenericEdge.js +10 -0
- package/dist/edges/GenericEdge.js.map +1 -0
- package/dist/graphify/anchor.d.ts +28 -0
- package/dist/graphify/anchor.d.ts.map +1 -0
- package/dist/graphify/anchor.js +132 -0
- package/dist/graphify/anchor.js.map +1 -0
- package/dist/graphify/consolidated.d.ts +210 -0
- package/dist/graphify/consolidated.d.ts.map +1 -0
- package/dist/graphify/consolidated.js +11 -0
- package/dist/graphify/consolidated.js.map +1 -0
- package/dist/graphify/ids.d.ts +19 -0
- package/dist/graphify/ids.d.ts.map +1 -0
- package/dist/graphify/ids.js +46 -0
- package/dist/graphify/ids.js.map +1 -0
- package/dist/graphify/index.d.ts +18 -0
- package/dist/graphify/index.d.ts.map +1 -0
- package/dist/graphify/index.js +12 -0
- package/dist/graphify/index.js.map +1 -0
- package/dist/graphify/kind.d.ts +23 -0
- package/dist/graphify/kind.d.ts.map +1 -0
- package/dist/graphify/kind.js +77 -0
- package/dist/graphify/kind.js.map +1 -0
- package/dist/graphify/resolve.d.ts +48 -0
- package/dist/graphify/resolve.d.ts.map +1 -0
- package/dist/graphify/resolve.js +83 -0
- package/dist/graphify/resolve.js.map +1 -0
- package/dist/graphify/signature.d.ts +87 -0
- package/dist/graphify/signature.d.ts.map +1 -0
- package/dist/graphify/signature.js +276 -0
- package/dist/graphify/signature.js.map +1 -0
- package/dist/graphify/types.d.ts +141 -0
- package/dist/graphify/types.d.ts.map +1 -0
- package/dist/graphify/types.js +8 -0
- package/dist/graphify/types.js.map +1 -0
- package/dist/hooks/useElkLayout.d.ts +66 -0
- package/dist/hooks/useElkLayout.d.ts.map +1 -0
- package/dist/hooks/useElkLayout.js +136 -0
- package/dist/hooks/useElkLayout.js.map +1 -0
- package/dist/hooks/usePathBasedEvents.d.ts +42 -0
- package/dist/hooks/usePathBasedEvents.d.ts.map +1 -0
- package/dist/hooks/usePathBasedEvents.js +119 -0
- package/dist/hooks/usePathBasedEvents.js.map +1 -0
- package/dist/hooks/useSequenceLayout.d.ts +186 -0
- package/dist/hooks/useSequenceLayout.d.ts.map +1 -0
- package/dist/hooks/useSequenceLayout.js +327 -0
- package/dist/hooks/useSequenceLayout.js.map +1 -0
- package/dist/hooks/useUndoRedo.d.ts +80 -0
- package/dist/hooks/useUndoRedo.d.ts.map +1 -0
- package/dist/hooks/useUndoRedo.js +70 -0
- package/dist/hooks/useUndoRedo.js.map +1 -0
- package/dist/index.d.ts +73 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +51 -0
- package/dist/index.js.map +1 -0
- package/dist/nodes/CustomNode.d.ts +28 -0
- package/dist/nodes/CustomNode.d.ts.map +1 -0
- package/dist/nodes/CustomNode.js +820 -0
- package/dist/nodes/CustomNode.js.map +1 -0
- package/dist/nodes/GenericNode.d.ts +20 -0
- package/dist/nodes/GenericNode.d.ts.map +1 -0
- package/dist/nodes/GenericNode.js +20 -0
- package/dist/nodes/GenericNode.js.map +1 -0
- package/dist/nodes/otel/OtelBoundaryNode.d.ts +55 -0
- package/dist/nodes/otel/OtelBoundaryNode.d.ts.map +1 -0
- package/dist/nodes/otel/OtelBoundaryNode.js +81 -0
- package/dist/nodes/otel/OtelBoundaryNode.js.map +1 -0
- package/dist/nodes/otel/OtelEventNode.d.ts +59 -0
- package/dist/nodes/otel/OtelEventNode.d.ts.map +1 -0
- package/dist/nodes/otel/OtelEventNode.js +82 -0
- package/dist/nodes/otel/OtelEventNode.js.map +1 -0
- package/dist/nodes/otel/OtelResourceNode.d.ts +53 -0
- package/dist/nodes/otel/OtelResourceNode.d.ts.map +1 -0
- package/dist/nodes/otel/OtelResourceNode.js +105 -0
- package/dist/nodes/otel/OtelResourceNode.js.map +1 -0
- package/dist/nodes/otel/OtelScopeNode.d.ts +53 -0
- package/dist/nodes/otel/OtelScopeNode.d.ts.map +1 -0
- package/dist/nodes/otel/OtelScopeNode.js +81 -0
- package/dist/nodes/otel/OtelScopeNode.js.map +1 -0
- package/dist/nodes/otel/OtelSpanConventionNode.d.ts +61 -0
- package/dist/nodes/otel/OtelSpanConventionNode.d.ts.map +1 -0
- package/dist/nodes/otel/OtelSpanConventionNode.js +131 -0
- package/dist/nodes/otel/OtelSpanConventionNode.js.map +1 -0
- package/dist/nodes/otel/index.d.ts +17 -0
- package/dist/nodes/otel/index.d.ts.map +1 -0
- package/dist/nodes/otel/index.js +13 -0
- package/dist/nodes/otel/index.js.map +1 -0
- package/dist/nodes/otel/shared/NodeBadges.d.ts +10 -0
- package/dist/nodes/otel/shared/NodeBadges.d.ts.map +1 -0
- package/dist/nodes/otel/shared/NodeBadges.js +178 -0
- package/dist/nodes/otel/shared/NodeBadges.js.map +1 -0
- package/dist/nodes/otel/shared/NodeContent.d.ts +10 -0
- package/dist/nodes/otel/shared/NodeContent.d.ts.map +1 -0
- package/dist/nodes/otel/shared/NodeContent.js +96 -0
- package/dist/nodes/otel/shared/NodeContent.js.map +1 -0
- package/dist/nodes/otel/shared/index.d.ts +8 -0
- package/dist/nodes/otel/shared/index.d.ts.map +1 -0
- package/dist/nodes/otel/shared/index.js +8 -0
- package/dist/nodes/otel/shared/index.js.map +1 -0
- package/dist/nodes/otel/shared/types.d.ts +129 -0
- package/dist/nodes/otel/shared/types.d.ts.map +1 -0
- package/dist/nodes/otel/shared/types.js +5 -0
- package/dist/nodes/otel/shared/types.js.map +1 -0
- package/dist/nodes/otel/shared/useNodeBehavior.d.ts +42 -0
- package/dist/nodes/otel/shared/useNodeBehavior.d.ts.map +1 -0
- package/dist/nodes/otel/shared/useNodeBehavior.js +61 -0
- package/dist/nodes/otel/shared/useNodeBehavior.js.map +1 -0
- package/dist/pierre/PierreFileView.d.ts +17 -0
- package/dist/pierre/PierreFileView.d.ts.map +1 -0
- package/dist/pierre/PierreFileView.js +46 -0
- package/dist/pierre/PierreFileView.js.map +1 -0
- package/dist/pierre/PierreSnippetView.d.ts +28 -0
- package/dist/pierre/PierreSnippetView.d.ts.map +1 -0
- package/dist/pierre/PierreSnippetView.js +105 -0
- package/dist/pierre/PierreSnippetView.js.map +1 -0
- package/dist/pierre/PierreThroughlineCodeView.d.ts +22 -0
- package/dist/pierre/PierreThroughlineCodeView.d.ts.map +1 -0
- package/dist/pierre/PierreThroughlineCodeView.js +206 -0
- package/dist/pierre/PierreThroughlineCodeView.js.map +1 -0
- package/dist/pierre/constructColors.d.ts +24 -0
- package/dist/pierre/constructColors.d.ts.map +1 -0
- package/dist/pierre/constructColors.js +91 -0
- package/dist/pierre/constructColors.js.map +1 -0
- package/dist/pierre/index.d.ts +12 -0
- package/dist/pierre/index.d.ts.map +1 -0
- package/dist/pierre/index.js +7 -0
- package/dist/pierre/index.js.map +1 -0
- package/dist/pierre/pierreBackground.d.ts +15 -0
- package/dist/pierre/pierreBackground.d.ts.map +1 -0
- package/dist/pierre/pierreBackground.js +31 -0
- package/dist/pierre/pierreBackground.js.map +1 -0
- package/dist/pierre/pierreFileLang.d.ts +27 -0
- package/dist/pierre/pierreFileLang.d.ts.map +1 -0
- package/dist/pierre/pierreFileLang.js +52 -0
- package/dist/pierre/pierreFileLang.js.map +1 -0
- package/dist/pierre/pierreSyntaxTheme.d.ts +11 -0
- package/dist/pierre/pierreSyntaxTheme.d.ts.map +1 -0
- package/dist/pierre/pierreSyntaxTheme.js +20 -0
- package/dist/pierre/pierreSyntaxTheme.js.map +1 -0
- package/dist/pierre/scrollAnchor.d.ts +5 -0
- package/dist/pierre/scrollAnchor.d.ts.map +1 -0
- package/dist/pierre/scrollAnchor.js +9 -0
- package/dist/pierre/scrollAnchor.js.map +1 -0
- package/dist/pierre/sliceSnippet.d.ts +10 -0
- package/dist/pierre/sliceSnippet.d.ts.map +1 -0
- package/dist/pierre/sliceSnippet.js +16 -0
- package/dist/pierre/sliceSnippet.js.map +1 -0
- package/dist/pierre/syntaxTokens.d.ts +11 -0
- package/dist/pierre/syntaxTokens.d.ts.map +1 -0
- package/dist/pierre/syntaxTokens.js +51 -0
- package/dist/pierre/syntaxTokens.js.map +1 -0
- package/dist/stories/Subsystem/ComponentGraph/fixtures.d.ts +8 -0
- package/dist/stories/Subsystem/ComponentGraph/fixtures.d.ts.map +1 -0
- package/dist/stories/Subsystem/ComponentGraph/fixtures.js +116 -0
- package/dist/stories/Subsystem/ComponentGraph/fixtures.js.map +1 -0
- package/dist/subsystem/ComponentDeclaration.d.ts +87 -0
- package/dist/subsystem/ComponentDeclaration.d.ts.map +1 -0
- package/dist/subsystem/ComponentDeclaration.js +374 -0
- package/dist/subsystem/ComponentDeclaration.js.map +1 -0
- package/dist/subsystem/FileDrawer.d.ts +17 -0
- package/dist/subsystem/FileDrawer.d.ts.map +1 -0
- package/dist/subsystem/FileDrawer.js +72 -0
- package/dist/subsystem/FileDrawer.js.map +1 -0
- package/dist/subsystem/GraphLayoutCover.d.ts +20 -0
- package/dist/subsystem/GraphLayoutCover.d.ts.map +1 -0
- package/dist/subsystem/GraphLayoutCover.js +42 -0
- package/dist/subsystem/GraphLayoutCover.js.map +1 -0
- package/dist/subsystem/SubsystemComponentGraph.d.ts +96 -0
- package/dist/subsystem/SubsystemComponentGraph.d.ts.map +1 -0
- package/dist/subsystem/SubsystemComponentGraph.js +1059 -0
- package/dist/subsystem/SubsystemComponentGraph.js.map +1 -0
- package/dist/subsystem/SubsystemFileTree.d.ts +24 -0
- package/dist/subsystem/SubsystemFileTree.d.ts.map +1 -0
- package/dist/subsystem/SubsystemFileTree.js +150 -0
- package/dist/subsystem/SubsystemFileTree.js.map +1 -0
- package/dist/subsystem/declarationRef.d.ts +39 -0
- package/dist/subsystem/declarationRef.d.ts.map +1 -0
- package/dist/subsystem/declarationRef.js +32 -0
- package/dist/subsystem/declarationRef.js.map +1 -0
- package/dist/subsystem/formatDeclaration.d.ts +11 -0
- package/dist/subsystem/formatDeclaration.d.ts.map +1 -0
- package/dist/subsystem/formatDeclaration.js +146 -0
- package/dist/subsystem/formatDeclaration.js.map +1 -0
- package/dist/subsystem/model.d.ts +353 -0
- package/dist/subsystem/model.d.ts.map +1 -0
- package/dist/subsystem/model.js +503 -0
- package/dist/subsystem/model.js.map +1 -0
- package/dist/subsystem/nodes.d.ts +69 -0
- package/dist/subsystem/nodes.d.ts.map +1 -0
- package/dist/subsystem/nodes.js +289 -0
- package/dist/subsystem/nodes.js.map +1 -0
- package/dist/subsystem/paths.d.ts +63 -0
- package/dist/subsystem/paths.d.ts.map +1 -0
- package/dist/subsystem/paths.js +86 -0
- package/dist/subsystem/paths.js.map +1 -0
- package/dist/subsystem/tokenizeComponent.d.ts +20 -0
- package/dist/subsystem/tokenizeComponent.d.ts.map +1 -0
- package/dist/subsystem/tokenizeComponent.js +56 -0
- package/dist/subsystem/tokenizeComponent.js.map +1 -0
- package/dist/subsystem/tokenizeFormatted.d.ts +12 -0
- package/dist/subsystem/tokenizeFormatted.d.ts.map +1 -0
- package/dist/subsystem/tokenizeFormatted.js +13 -0
- package/dist/subsystem/tokenizeFormatted.js.map +1 -0
- package/dist/utils/animationMapping.d.ts +53 -0
- package/dist/utils/animationMapping.d.ts.map +1 -0
- package/dist/utils/animationMapping.js +126 -0
- package/dist/utils/animationMapping.js.map +1 -0
- package/dist/utils/canvasBounds.d.ts +50 -0
- package/dist/utils/canvasBounds.d.ts.map +1 -0
- package/dist/utils/canvasBounds.js +88 -0
- package/dist/utils/canvasBounds.js.map +1 -0
- package/dist/utils/elkLayout.d.ts +137 -0
- package/dist/utils/elkLayout.d.ts.map +1 -0
- package/dist/utils/elkLayout.js +596 -0
- package/dist/utils/elkLayout.js.map +1 -0
- package/dist/utils/graphConverter.d.ts +18 -0
- package/dist/utils/graphConverter.d.ts.map +1 -0
- package/dist/utils/graphConverter.js +114 -0
- package/dist/utils/graphConverter.js.map +1 -0
- package/dist/utils/iconResolver.d.ts +29 -0
- package/dist/utils/iconResolver.d.ts.map +1 -0
- package/dist/utils/iconResolver.js +30 -0
- package/dist/utils/iconResolver.js.map +1 -0
- package/dist/utils/orientationUtils.d.ts +19 -0
- package/dist/utils/orientationUtils.d.ts.map +1 -0
- package/dist/utils/orientationUtils.js +62 -0
- package/dist/utils/orientationUtils.js.map +1 -0
- package/package.json +80 -0
- package/src/components/ConfigurationSelector.tsx +133 -0
- package/src/components/GraphRenderer.tsx +3195 -0
- package/src/components/MultiCanvasRenderer.tsx +295 -0
- package/src/components/NodeTooltip.tsx +279 -0
- package/src/components/PendingChanges.test.tsx +375 -0
- package/src/components/SelectionSidebar.tsx +352 -0
- package/src/components/SequenceDiagramRenderer.tsx +1156 -0
- package/src/components/WorkflowSequenceDiagram.tsx +270 -0
- package/src/components/dashboard/DashboardRenderer.tsx +317 -0
- package/src/components/dashboard/MetricPanel.tsx +254 -0
- package/src/components/dashboard/MockDataProvider.ts +330 -0
- package/src/components/dashboard/components/BarChart.tsx +299 -0
- package/src/components/dashboard/components/LineChart.tsx +279 -0
- package/src/components/dashboard/components/MetricCard.tsx +270 -0
- package/src/components/dashboard/components/SourceLink.tsx +63 -0
- package/src/components/dashboard/components/TimeRangeSelector.tsx +280 -0
- package/src/components/dashboard/components/index.ts +5 -0
- package/src/components/dashboard/index.ts +47 -0
- package/src/components/dashboard/types.ts +126 -0
- package/src/components/session-events/SessionEventFeed.tsx +1797 -0
- package/src/components/session-events/index.ts +13 -0
- package/src/components/state-view/PipelineView.tsx +347 -0
- package/src/components/state-view/index.ts +14 -0
- package/src/components/state-view/types.ts +261 -0
- package/src/components/state-view/useStateView.ts +205 -0
- package/src/contexts/GraphEditContext.tsx +27 -0
- package/src/contexts/TooltipPortalContext.ts +8 -0
- package/src/edges/CustomEdge.tsx +402 -0
- package/src/edges/GenericEdge.tsx +36 -0
- package/src/graphify/anchor.test.ts +124 -0
- package/src/graphify/anchor.ts +160 -0
- package/src/graphify/consolidated.ts +246 -0
- package/src/graphify/ids.ts +48 -0
- package/src/graphify/index.ts +72 -0
- package/src/graphify/kind.test.ts +108 -0
- package/src/graphify/kind.ts +120 -0
- package/src/graphify/resolve.test.ts +89 -0
- package/src/graphify/resolve.ts +115 -0
- package/src/graphify/signature.test.ts +278 -0
- package/src/graphify/signature.ts +354 -0
- package/src/graphify/types.ts +164 -0
- package/src/hooks/useElkLayout.test.ts +134 -0
- package/src/hooks/useElkLayout.ts +191 -0
- package/src/hooks/usePathBasedEvents.ts +192 -0
- package/src/hooks/useSequenceLayout.ts +543 -0
- package/src/hooks/useUndoRedo.ts +144 -0
- package/src/index.ts +341 -0
- package/src/nodes/CustomNode.tsx +1231 -0
- package/src/nodes/GenericNode.tsx +55 -0
- package/src/nodes/otel/OtelBoundaryNode.tsx +224 -0
- package/src/nodes/otel/OtelEventNode.tsx +225 -0
- package/src/nodes/otel/OtelResourceNode.tsx +251 -0
- package/src/nodes/otel/OtelScopeNode.tsx +221 -0
- package/src/nodes/otel/OtelSpanConventionNode.tsx +295 -0
- package/src/nodes/otel/index.ts +23 -0
- package/src/nodes/otel/shared/NodeBadges.tsx +295 -0
- package/src/nodes/otel/shared/NodeContent.tsx +204 -0
- package/src/nodes/otel/shared/index.ts +8 -0
- package/src/nodes/otel/shared/types.ts +138 -0
- package/src/nodes/otel/shared/useNodeBehavior.ts +114 -0
- package/src/pierre/PierreFileView.tsx +81 -0
- package/src/pierre/PierreSnippetView.tsx +184 -0
- package/src/pierre/PierreThroughlineCodeView.tsx +304 -0
- package/src/pierre/constructColors.test.ts +52 -0
- package/src/pierre/constructColors.ts +112 -0
- package/src/pierre/index.ts +18 -0
- package/src/pierre/pierreBackground.ts +33 -0
- package/src/pierre/pierreFileLang.test.ts +26 -0
- package/src/pierre/pierreFileLang.ts +55 -0
- package/src/pierre/pierreSyntaxTheme.ts +23 -0
- package/src/pierre/scrollAnchor.test.ts +13 -0
- package/src/pierre/scrollAnchor.ts +11 -0
- package/src/pierre/sliceSnippet.test.ts +21 -0
- package/src/pierre/sliceSnippet.ts +31 -0
- package/src/pierre/syntaxTokens.test.ts +35 -0
- package/src/pierre/syntaxTokens.ts +60 -0
- package/src/stories/Audit/BoundaryNodes.stories.tsx +385 -0
- package/src/stories/Audit/CanvasEdgeTypes.stories.tsx +1448 -0
- package/src/stories/Audit/CanvasNodeTypes.stories.tsx +1049 -0
- package/src/stories/Audit/ColorPriority.stories.tsx +895 -0
- package/src/stories/Audit/DiamondBadges.stories.tsx +629 -0
- package/src/stories/Audit/NodeDimensionsTesting.stories.tsx +724 -0
- package/src/stories/Audit/NodeFieldsAudit.stories.tsx +996 -0
- package/src/stories/Audit/NodeFontSizeTesting.stories.tsx +715 -0
- package/src/stories/Audit/NodeShapes.stories.tsx +1208 -0
- package/src/stories/Audit/WideNodesTesting.stories.tsx +1045 -0
- package/src/stories/Components/DashboardRenderer.stories.tsx +263 -0
- package/src/stories/Components/GraphRenderer.stories.tsx +3236 -0
- package/src/stories/Components/MultiCanvasRenderer.stories.tsx +370 -0
- package/src/stories/Components/SequenceDiagram.stories.tsx +255 -0
- package/src/stories/Components/StateView.stories.tsx +417 -0
- package/src/stories/Components/TraceViewer.stories.tsx +442 -0
- package/src/stories/Components/WorkflowSequenceDiagram.stories.tsx +802 -0
- package/src/stories/Features/AnimationWorkshop.stories.tsx +727 -0
- package/src/stories/Features/ChangeTypeVisual.stories.tsx +67 -0
- package/src/stories/Features/EventDrivenAnimations.stories.tsx +513 -0
- package/src/stories/Features/MultiConfig.stories.tsx +539 -0
- package/src/stories/Introduction.mdx +34 -0
- package/src/stories/Layout/ElkEdgeRouting.stories.tsx +539 -0
- package/src/stories/Layout/GraphOrientation.stories.tsx +500 -0
- package/src/stories/Layout/MultiDirectionalConnections.stories.tsx +352 -0
- package/src/stories/Nodes/NodeDefinitionComparison.stories.tsx +560 -0
- package/src/stories/Nodes/NodeNameFallbacks.stories.tsx +491 -0
- package/src/stories/Nodes/NumericColors.stories.tsx +440 -0
- package/src/stories/OTEL/EventNameDisplay.stories.tsx +694 -0
- package/src/stories/OTEL/EventNameFallback.stories.tsx +578 -0
- package/src/stories/OTEL/OtelComponents.stories.tsx +422 -0
- package/src/stories/OTEL/OtelNodeTypesPrototype.stories.tsx +806 -0
- package/src/stories/OTEL/RawEventCards.stories.tsx +57 -0
- package/src/stories/OTEL/SpanBadges.stories.tsx +840 -0
- package/src/stories/OTEL/ValidationEventsCanvas.stories.tsx +209 -0
- package/src/stories/Pierre/CodeView.stories.tsx +219 -0
- package/src/stories/RealWorld/BacklogMdCanvases.stories.tsx +721 -0
- package/src/stories/RealWorld/FileCitySequence.stories.tsx +516 -0
- package/src/stories/RealWorld/RealCanvasFiles.stories.tsx +336 -0
- package/src/stories/Subsystem/ComponentDeclarationAudit.stories.tsx +321 -0
- package/src/stories/Subsystem/ComponentGraph/Appearance.stories.tsx +365 -0
- package/src/stories/Subsystem/ComponentGraph/Basics.stories.tsx +137 -0
- package/src/stories/Subsystem/ComponentGraph/Captures.stories.tsx +238 -0
- package/src/stories/Subsystem/ComponentGraph/DetailPanel.stories.tsx +315 -0
- package/src/stories/Subsystem/ComponentGraph/Flows.stories.tsx +239 -0
- package/src/stories/Subsystem/ComponentGraph/FrameworkStereotype.stories.tsx +216 -0
- package/src/stories/Subsystem/ComponentGraph/GraphTitle.stories.tsx +70 -0
- package/src/stories/Subsystem/ComponentGraph/Processes.stories.tsx +68 -0
- package/src/stories/Subsystem/ComponentGraph/Scenarios.stories.tsx +959 -0
- package/src/stories/Subsystem/ComponentGraph/Spotlights.stories.tsx +681 -0
- package/src/stories/Subsystem/ComponentGraph/fixtures.ts +129 -0
- package/src/stories/__traces__/test-run.canvas.json +241 -0
- package/src/stories/data/activity-feed-analytics.dashboard.json +300 -0
- package/src/stories/data/file-city-images-transformed.otel.canvas.json +295 -0
- package/src/stories/data/file-city-workflows.json +269 -0
- package/src/stories/data/graph-converter-test-execution.json +443 -0
- package/src/stories/data/graph-converter-test.workflow.json +105 -0
- package/src/stories/data/graph-converter-validated-execution.json +58 -0
- package/src/stories/data/opencode-session-raw-events.json +273396 -0
- package/src/subsystem/ComponentDeclaration.tsx +643 -0
- package/src/subsystem/FileDrawer.tsx +106 -0
- package/src/subsystem/GraphLayoutCover.tsx +69 -0
- package/src/subsystem/SubsystemComponentGraph.tsx +1644 -0
- package/src/subsystem/SubsystemFileTree.tsx +190 -0
- package/src/subsystem/declarationRef.test.ts +33 -0
- package/src/subsystem/declarationRef.ts +63 -0
- package/src/subsystem/formatDeclaration.ts +174 -0
- package/src/subsystem/model.test.ts +244 -0
- package/src/subsystem/model.ts +850 -0
- package/src/subsystem/nodes.test.ts +56 -0
- package/src/subsystem/nodes.tsx +443 -0
- package/src/subsystem/paths.test.ts +123 -0
- package/src/subsystem/paths.ts +127 -0
- package/src/subsystem/tokenizeComponent.ts +70 -0
- package/src/subsystem/tokenizeFormatted.ts +19 -0
- package/src/utils/animationMapping.ts +166 -0
- package/src/utils/canvasBounds.ts +146 -0
- package/src/utils/elkLayout.test.ts +240 -0
- package/src/utils/elkLayout.ts +779 -0
- package/src/utils/graphConverter.ts +148 -0
- package/src/utils/iconResolver.tsx +53 -0
- package/src/utils/orientationUtils.ts +73 -0
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Multi-repo path handling for subsystem graphs.
|
|
3
|
+
*
|
|
4
|
+
* A component's `file` is relative to ITS OWN repo root — the repo identified
|
|
5
|
+
* by its `purl` (`pkg:github/<owner>/<name>[#<path>]`) — never to the machine.
|
|
6
|
+
* When a graph spans several repos the sidebar tree needs synthetic
|
|
7
|
+
* `<owner>/<name>/` prefixes to keep same-named paths apart; hosts resolve
|
|
8
|
+
* each file against `repoRoots[purlRepo] ?? repoRoot`.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
/** Normalize a purl to its repo key: fragment and surrounding whitespace stripped. */
|
|
12
|
+
export function purlRepoKey(purl: string | undefined): string | undefined {
|
|
13
|
+
if (!purl) return undefined;
|
|
14
|
+
const base = purl.split('#')[0]?.trim();
|
|
15
|
+
return base || undefined;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/** `owner/name` from a purl (`pkg:github/acme/widget#x/y.ts` → `acme/widget`). */
|
|
19
|
+
export function purlOwnerName(purl: string | undefined): string | undefined {
|
|
20
|
+
const key = purlRepoKey(purl);
|
|
21
|
+
if (!key) return undefined;
|
|
22
|
+
// pkg:<type>/<owner>/<name> → take the last two segments.
|
|
23
|
+
const parts = key.split('/').filter(Boolean);
|
|
24
|
+
if (parts.length < 2) return undefined;
|
|
25
|
+
return `${parts[parts.length - 2]}/${parts[parts.length - 1]}`;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export interface TreeEntry {
|
|
29
|
+
/** Path as shown in the sidebar tree (repo-prefixed when multi-repo). */
|
|
30
|
+
displayPath: string;
|
|
31
|
+
/** The component's own file value — what hosts resolve + drawers open. */
|
|
32
|
+
file: string;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export interface TreePathMapping {
|
|
36
|
+
entries: TreeEntry[];
|
|
37
|
+
/** True when components span more than one repo (prefixes are shown). */
|
|
38
|
+
multiRepo: boolean;
|
|
39
|
+
/** displayPath → file. */
|
|
40
|
+
toFile: Map<string, string>;
|
|
41
|
+
/** file → displayPath (first component wins). */
|
|
42
|
+
toDisplay: Map<string, string>;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Build the sidebar tree's path set from components. Single-repo graphs (and
|
|
47
|
+
* purl-less components) keep bare `file` values; mixed-repo graphs prefix each
|
|
48
|
+
* entry with its purl's `owner/name` so the tree groups by repo.
|
|
49
|
+
*/
|
|
50
|
+
export function buildTreePathMapping(components: ReadonlyArray<{ file?: string; purl?: string }>): TreePathMapping {
|
|
51
|
+
const withFiles = components.filter((c) => c.file);
|
|
52
|
+
const repos = new Set(
|
|
53
|
+
withFiles.map((c) => purlRepoKey(c.purl)).filter((k): k is string => !!k),
|
|
54
|
+
);
|
|
55
|
+
const multiRepo = repos.size > 1;
|
|
56
|
+
|
|
57
|
+
const entries: TreeEntry[] = [];
|
|
58
|
+
const toFile = new Map<string, string>();
|
|
59
|
+
const toDisplay = new Map<string, string>();
|
|
60
|
+
for (const c of withFiles) {
|
|
61
|
+
const ownerName = multiRepo ? purlOwnerName(c.purl) : undefined;
|
|
62
|
+
const displayPath = ownerName ? `${ownerName}/${c.file}` : c.file!;
|
|
63
|
+
if (toFile.has(displayPath)) continue;
|
|
64
|
+
entries.push({ displayPath, file: c.file! });
|
|
65
|
+
toFile.set(displayPath, c.file!);
|
|
66
|
+
if (!toDisplay.has(c.file!)) toDisplay.set(c.file!, displayPath);
|
|
67
|
+
}
|
|
68
|
+
return { entries, multiRepo, toFile, toDisplay };
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// ---------------------------------------------------------------------------
|
|
72
|
+
// Per-repo tree grouping — one sidebar tree per repo, each under its own
|
|
73
|
+
// styled header (owner avatar + repo name).
|
|
74
|
+
// ---------------------------------------------------------------------------
|
|
75
|
+
|
|
76
|
+
export interface RepoGroup {
|
|
77
|
+
/** Purl repo key (`pkg:github/owner/name`) — undefined for purl-less components. */
|
|
78
|
+
repoKey?: string;
|
|
79
|
+
/** `owner` segment of the purl, when present. */
|
|
80
|
+
owner?: string;
|
|
81
|
+
/** Repository name segment of the purl, when present. */
|
|
82
|
+
repo?: string;
|
|
83
|
+
/** The group's files, bare `file` values (each tree scopes its own paths). */
|
|
84
|
+
entries: TreeEntry[];
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Group components by repo for the multi-tree sidebar. Groups preserve
|
|
89
|
+
* first-appearance order; purl-less components land in a trailing unbadged
|
|
90
|
+
* group. Entries carry bare `file` values — separate trees scope their own
|
|
91
|
+
* path sets, so no synthetic prefixes are needed.
|
|
92
|
+
*/
|
|
93
|
+
export function buildRepoGroups(components: ReadonlyArray<{ file?: string; purl?: string }>): {
|
|
94
|
+
multiRepo: boolean;
|
|
95
|
+
groups: RepoGroup[];
|
|
96
|
+
} {
|
|
97
|
+
const withFiles = components.filter((c) => c.file);
|
|
98
|
+
const repos = new Set(
|
|
99
|
+
withFiles.map((c) => purlRepoKey(c.purl)).filter((k): k is string => !!k),
|
|
100
|
+
);
|
|
101
|
+
const multiRepo = repos.size > 1;
|
|
102
|
+
|
|
103
|
+
const byKey = new Map<string, RepoGroup>();
|
|
104
|
+
const order: Array<string | undefined> = [];
|
|
105
|
+
for (const c of withFiles) {
|
|
106
|
+
const key = purlRepoKey(c.purl);
|
|
107
|
+
let group = byKey.get(key ?? '');
|
|
108
|
+
if (!group) {
|
|
109
|
+
const ownerName = key ? purlOwnerName(c.purl) : undefined;
|
|
110
|
+
const [owner, repo] = ownerName?.split('/') ?? [];
|
|
111
|
+
group = { repoKey: key, owner, repo, entries: [] };
|
|
112
|
+
byKey.set(key ?? '', group);
|
|
113
|
+
order.push(key);
|
|
114
|
+
}
|
|
115
|
+
if (!group.entries.some((e) => e.file === c.file)) {
|
|
116
|
+
group.entries.push({ displayPath: c.file!, file: c.file! });
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return { multiRepo, groups: order.map((k) => byKey.get(k ?? '')!) };
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/** GitHub owner-avatar URL for a purl, or undefined for non-github hosts. */
|
|
123
|
+
export function repoAvatarUrl(purl: string | undefined): string | undefined {
|
|
124
|
+
const key = purlRepoKey(purl);
|
|
125
|
+
const match = key?.match(/^pkg:github\/([^/]+)\//);
|
|
126
|
+
return match ? `https://github.com/${match[1]}.png?size=64` : undefined;
|
|
127
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tokenize a SubsystemComponent into a flat token stream for the detail panel.
|
|
3
|
+
*
|
|
4
|
+
* Pipeline: generate declaration string → format with Prettier → tokenize
|
|
5
|
+
* with Shiki + Pierre themes. The `component.tokens` field, when present,
|
|
6
|
+
* overrides the entire pipeline (for pre-tokenized data from graphify).
|
|
7
|
+
*
|
|
8
|
+
* This function is async because Prettier's format() is async.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import type { PierreSyntaxThemeName } from '../pierre/pierreSyntaxTheme';
|
|
12
|
+
import type { SubsystemComponent, SubsystemDeclToken } from './model';
|
|
13
|
+
import { generateDeclarationString } from './formatDeclaration';
|
|
14
|
+
import { tokenizeFormatted } from './tokenizeFormatted';
|
|
15
|
+
|
|
16
|
+
// Lazy-loaded Prettier to avoid startup cost.
|
|
17
|
+
let prettierPromise: Promise<typeof import('prettier/standalone')> | null = null;
|
|
18
|
+
let prettierPluginsPromise: Promise<{
|
|
19
|
+
typescript: typeof import('prettier/plugins/typescript');
|
|
20
|
+
estree: typeof import('prettier/plugins/estree');
|
|
21
|
+
}> | null = null;
|
|
22
|
+
|
|
23
|
+
async function getPrettier() {
|
|
24
|
+
if (!prettierPromise) {
|
|
25
|
+
prettierPromise = import('prettier/standalone');
|
|
26
|
+
}
|
|
27
|
+
if (!prettierPluginsPromise) {
|
|
28
|
+
prettierPluginsPromise = Promise.all([
|
|
29
|
+
import('prettier/plugins/typescript'),
|
|
30
|
+
import('prettier/plugins/estree'),
|
|
31
|
+
]).then(([typescript, estree]) => ({ typescript, estree }));
|
|
32
|
+
}
|
|
33
|
+
const [prettier, plugins] = await Promise.all([prettierPromise, prettierPluginsPromise]);
|
|
34
|
+
return { prettier, plugins };
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Tokenize a SubsystemComponent into SubsystemDeclToken[].
|
|
39
|
+
*
|
|
40
|
+
* When `component.tokens` is present (pre-tokenized data from the wire),
|
|
41
|
+
* it's returned as-is. Otherwise the pipeline generates a TypeScript
|
|
42
|
+
* declaration string, formats it with Prettier, and tokenizes the output.
|
|
43
|
+
*/
|
|
44
|
+
export async function tokenizeComponent(
|
|
45
|
+
component: SubsystemComponent,
|
|
46
|
+
printWidth = 80,
|
|
47
|
+
themeName: PierreSyntaxThemeName = 'pierre-dark',
|
|
48
|
+
): Promise<SubsystemDeclToken[]> {
|
|
49
|
+
// Pre-tokenized tokens from the wire take precedence.
|
|
50
|
+
if (component.tokens) return component.tokens;
|
|
51
|
+
|
|
52
|
+
// External kind — not valid TypeScript, bypass Prettier.
|
|
53
|
+
const kind = component.detail?.kind ?? component.construct;
|
|
54
|
+
if (kind === 'external') {
|
|
55
|
+
const label = component.detail?.kind === 'external' ? component.detail.label : component.name;
|
|
56
|
+
const escaped = label.replace(/\\/g, '\\\\').replace(/'/g, "\\'");
|
|
57
|
+
return tokenizeFormatted(`external '${escaped}'`, themeName);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Generate → format → tokenize
|
|
61
|
+
const raw = generateDeclarationString(component);
|
|
62
|
+
const { prettier, plugins } = await getPrettier();
|
|
63
|
+
const formatted = await prettier.format(raw, {
|
|
64
|
+
parser: 'typescript',
|
|
65
|
+
plugins: [plugins.typescript, plugins.estree],
|
|
66
|
+
printWidth,
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
return tokenizeFormatted(formatted, themeName);
|
|
70
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tokenize a formatted TypeScript declaration string into SubsystemDeclToken[]
|
|
3
|
+
* using Shiki + Pierre themes (same highlighter stack as @pierre/diffs).
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { tokenizeWithPierreSyntax } from '../pierre/syntaxTokens';
|
|
7
|
+
import type { PierreSyntaxThemeName } from '../pierre/pierreSyntaxTheme';
|
|
8
|
+
import type { SubsystemDeclToken } from './model';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Tokenize a formatted TypeScript string into SubsystemDeclToken[].
|
|
12
|
+
* The input should already be formatted by Prettier (or be valid TS).
|
|
13
|
+
*/
|
|
14
|
+
export function tokenizeFormatted(
|
|
15
|
+
code: string,
|
|
16
|
+
themeName: PierreSyntaxThemeName = 'pierre-dark',
|
|
17
|
+
): Promise<SubsystemDeclToken[]> {
|
|
18
|
+
return tokenizeWithPierreSyntax(code, themeName);
|
|
19
|
+
}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Animation mapping utilities
|
|
3
|
+
*
|
|
4
|
+
* Maps log levels and component events to appropriate animations
|
|
5
|
+
* for Milestone 1 default visualization behavior
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { LogLevel } from '@principal-ai/subsystems-core';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Node animation configuration
|
|
12
|
+
*/
|
|
13
|
+
export interface NodeAnimation {
|
|
14
|
+
type: 'pulse' | 'flash' | 'shake' | 'entry';
|
|
15
|
+
duration: number;
|
|
16
|
+
intensity?: number; // 0-1 scale
|
|
17
|
+
color?: string;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Edge animation configuration
|
|
22
|
+
*/
|
|
23
|
+
export interface EdgeAnimation {
|
|
24
|
+
type: 'flow' | 'particle' | 'pulse' | 'glow';
|
|
25
|
+
duration: number;
|
|
26
|
+
direction?: 'forward' | 'backward' | 'bidirectional';
|
|
27
|
+
color?: string;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Map log level to node animation
|
|
32
|
+
*
|
|
33
|
+
* Default behavior for Milestone 1:
|
|
34
|
+
* - debug: subtle pulse (low intensity)
|
|
35
|
+
* - info: standard pulse (medium intensity)
|
|
36
|
+
* - warn: amber pulse (high intensity)
|
|
37
|
+
* - error: red flash + shake
|
|
38
|
+
*/
|
|
39
|
+
export function logLevelToNodeAnimation(level: LogLevel): NodeAnimation {
|
|
40
|
+
switch (level) {
|
|
41
|
+
case 'debug':
|
|
42
|
+
return {
|
|
43
|
+
type: 'pulse',
|
|
44
|
+
duration: 800,
|
|
45
|
+
intensity: 0.3,
|
|
46
|
+
color: '#94a3b8', // slate-400
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
case 'info':
|
|
50
|
+
return {
|
|
51
|
+
type: 'pulse',
|
|
52
|
+
duration: 1000,
|
|
53
|
+
intensity: 0.5,
|
|
54
|
+
color: '#3b82f6', // blue-500
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
case 'warn':
|
|
58
|
+
return {
|
|
59
|
+
type: 'pulse',
|
|
60
|
+
duration: 1200,
|
|
61
|
+
intensity: 1.0,
|
|
62
|
+
color: '#f59e0b', // amber-500
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
case 'error':
|
|
66
|
+
return {
|
|
67
|
+
type: 'flash', // More dramatic animation for errors
|
|
68
|
+
duration: 1500,
|
|
69
|
+
intensity: 1.0,
|
|
70
|
+
color: '#ef4444', // red-500
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Map component action to node animation (Milestone 2)
|
|
77
|
+
*/
|
|
78
|
+
export function actionToNodeAnimation(_action: string, state?: string): NodeAnimation {
|
|
79
|
+
// Default mapping - can be overridden by configuration
|
|
80
|
+
switch (state) {
|
|
81
|
+
case 'acquired':
|
|
82
|
+
case 'active':
|
|
83
|
+
case 'processing':
|
|
84
|
+
return {
|
|
85
|
+
type: 'pulse',
|
|
86
|
+
duration: 1000,
|
|
87
|
+
intensity: 0.8,
|
|
88
|
+
color: '#22c55e', // green-500
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
case 'waiting':
|
|
92
|
+
case 'pending':
|
|
93
|
+
return {
|
|
94
|
+
type: 'pulse',
|
|
95
|
+
duration: 1500,
|
|
96
|
+
intensity: 0.5,
|
|
97
|
+
color: '#eab308', // yellow-500
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
case 'error':
|
|
101
|
+
case 'failed':
|
|
102
|
+
return {
|
|
103
|
+
type: 'shake',
|
|
104
|
+
duration: 600,
|
|
105
|
+
intensity: 1.0,
|
|
106
|
+
color: '#ef4444', // red-500
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
case 'completed':
|
|
110
|
+
case 'success':
|
|
111
|
+
return {
|
|
112
|
+
type: 'flash',
|
|
113
|
+
duration: 800,
|
|
114
|
+
intensity: 0.7,
|
|
115
|
+
color: '#22c55e', // green-500
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
default:
|
|
119
|
+
// Generic action animation
|
|
120
|
+
return {
|
|
121
|
+
type: 'pulse',
|
|
122
|
+
duration: 1000,
|
|
123
|
+
intensity: 0.6,
|
|
124
|
+
color: '#3b82f6', // blue-500
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Get animation config for edge based on action (Milestone 2)
|
|
131
|
+
*/
|
|
132
|
+
export function actionToEdgeAnimation(_action: string, edgeConfig?: EdgeAnimation): EdgeAnimation {
|
|
133
|
+
// Use edge config if provided, otherwise default
|
|
134
|
+
return (
|
|
135
|
+
edgeConfig || {
|
|
136
|
+
type: 'flow',
|
|
137
|
+
duration: 2000,
|
|
138
|
+
direction: 'forward',
|
|
139
|
+
}
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Check if log level should trigger animation
|
|
145
|
+
*/
|
|
146
|
+
export function shouldAnimate(level: LogLevel, minLevel: LogLevel = 'info'): boolean {
|
|
147
|
+
const levels: LogLevel[] = ['debug', 'info', 'warn', 'error'];
|
|
148
|
+
const minIndex = levels.indexOf(minLevel);
|
|
149
|
+
const currentIndex = levels.indexOf(level);
|
|
150
|
+
|
|
151
|
+
return currentIndex >= minIndex;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Calculate animation intensity based on frequency
|
|
156
|
+
* Used to adjust animation intensity when multiple logs occur rapidly
|
|
157
|
+
*/
|
|
158
|
+
export function calculateIntensity(
|
|
159
|
+
baseIntensity: number,
|
|
160
|
+
eventCount: number,
|
|
161
|
+
_timeWindow: number = 1000
|
|
162
|
+
): number {
|
|
163
|
+
// Reduce intensity if too many events in time window
|
|
164
|
+
const scaleFactor = Math.min(1.0, 5.0 / eventCount);
|
|
165
|
+
return Math.max(0.2, baseIntensity * scaleFactor);
|
|
166
|
+
}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import type { ExtendedCanvas } from '@principal-ai/subsystems-core';
|
|
2
|
+
|
|
3
|
+
export interface CanvasBounds {
|
|
4
|
+
minX: number;
|
|
5
|
+
minY: number;
|
|
6
|
+
maxX: number;
|
|
7
|
+
maxY: number;
|
|
8
|
+
width: number;
|
|
9
|
+
height: number;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
const DEFAULT_NODE_WIDTH = 200;
|
|
13
|
+
const DEFAULT_NODE_HEIGHT = 100;
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Calculate the bounding box of all nodes in a canvas.
|
|
17
|
+
* Returns the min/max coordinates and total dimensions.
|
|
18
|
+
*/
|
|
19
|
+
export function getCanvasBounds(canvas: ExtendedCanvas): CanvasBounds {
|
|
20
|
+
if (!canvas.nodes || canvas.nodes.length === 0) {
|
|
21
|
+
return {
|
|
22
|
+
minX: 0,
|
|
23
|
+
minY: 0,
|
|
24
|
+
maxX: DEFAULT_NODE_WIDTH,
|
|
25
|
+
maxY: DEFAULT_NODE_HEIGHT,
|
|
26
|
+
width: DEFAULT_NODE_WIDTH,
|
|
27
|
+
height: DEFAULT_NODE_HEIGHT,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
let minX = Infinity;
|
|
32
|
+
let minY = Infinity;
|
|
33
|
+
let maxX = -Infinity;
|
|
34
|
+
let maxY = -Infinity;
|
|
35
|
+
|
|
36
|
+
for (const node of canvas.nodes) {
|
|
37
|
+
const x = node.x ?? 0;
|
|
38
|
+
const y = node.y ?? 0;
|
|
39
|
+
const width = node.width ?? DEFAULT_NODE_WIDTH;
|
|
40
|
+
const height = node.height ?? DEFAULT_NODE_HEIGHT;
|
|
41
|
+
|
|
42
|
+
minX = Math.min(minX, x);
|
|
43
|
+
minY = Math.min(minY, y);
|
|
44
|
+
maxX = Math.max(maxX, x + width);
|
|
45
|
+
maxY = Math.max(maxY, y + height);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
return {
|
|
49
|
+
minX,
|
|
50
|
+
minY,
|
|
51
|
+
maxX,
|
|
52
|
+
maxY,
|
|
53
|
+
width: maxX - minX,
|
|
54
|
+
height: maxY - minY,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export interface Viewport {
|
|
59
|
+
x: number;
|
|
60
|
+
y: number;
|
|
61
|
+
zoom: number;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Calculate the initial viewport to fit all nodes within a container.
|
|
66
|
+
* This allows setting defaultViewport on ReactFlow to avoid the
|
|
67
|
+
* "zoom in then animate out" effect.
|
|
68
|
+
*
|
|
69
|
+
* @param bounds - The bounding box of all nodes
|
|
70
|
+
* @param containerWidth - Width of the container in pixels
|
|
71
|
+
* @param containerHeight - Height of the container in pixels
|
|
72
|
+
* @param options - Additional options for padding and zoom limits
|
|
73
|
+
* @returns The viewport { x, y, zoom } to pass to ReactFlow's defaultViewport
|
|
74
|
+
*/
|
|
75
|
+
export function calculateInitialViewport(
|
|
76
|
+
bounds: CanvasBounds,
|
|
77
|
+
containerWidth: number,
|
|
78
|
+
containerHeight: number,
|
|
79
|
+
options: {
|
|
80
|
+
padding?: number;
|
|
81
|
+
minZoom?: number;
|
|
82
|
+
maxZoom?: number;
|
|
83
|
+
} = {}
|
|
84
|
+
): Viewport {
|
|
85
|
+
const { padding = 0.2, minZoom = 0.1, maxZoom = 1.5 } = options;
|
|
86
|
+
|
|
87
|
+
// Calculate the zoom level needed to fit the bounds within the container
|
|
88
|
+
// Account for padding by reducing the effective container size
|
|
89
|
+
const effectiveWidth = containerWidth * (1 - padding);
|
|
90
|
+
const effectiveHeight = containerHeight * (1 - padding);
|
|
91
|
+
|
|
92
|
+
const zoomX = effectiveWidth / bounds.width;
|
|
93
|
+
const zoomY = effectiveHeight / bounds.height;
|
|
94
|
+
|
|
95
|
+
// Use the smaller zoom to ensure both dimensions fit
|
|
96
|
+
let zoom = Math.min(zoomX, zoomY);
|
|
97
|
+
|
|
98
|
+
// Clamp to min/max zoom
|
|
99
|
+
zoom = Math.max(minZoom, Math.min(maxZoom, zoom));
|
|
100
|
+
|
|
101
|
+
// Calculate the center of the bounds
|
|
102
|
+
const boundsCenterX = bounds.minX + bounds.width / 2;
|
|
103
|
+
const boundsCenterY = bounds.minY + bounds.height / 2;
|
|
104
|
+
|
|
105
|
+
// Calculate viewport position to center the bounds
|
|
106
|
+
// ReactFlow viewport x,y represent the offset of the canvas origin from the container's top-left
|
|
107
|
+
const x = containerWidth / 2 - boundsCenterX * zoom;
|
|
108
|
+
const y = containerHeight / 2 - boundsCenterY * zoom;
|
|
109
|
+
|
|
110
|
+
return { x, y, zoom };
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Calculate a recommended display size for a canvas cell.
|
|
115
|
+
* Adds padding and enforces minimum dimensions.
|
|
116
|
+
*/
|
|
117
|
+
export function getCanvasDisplaySize(
|
|
118
|
+
canvas: ExtendedCanvas,
|
|
119
|
+
options: {
|
|
120
|
+
padding?: number;
|
|
121
|
+
minWidth?: number;
|
|
122
|
+
minHeight?: number;
|
|
123
|
+
maxWidth?: number;
|
|
124
|
+
maxHeight?: number;
|
|
125
|
+
} = {}
|
|
126
|
+
): { width: number; height: number } {
|
|
127
|
+
const {
|
|
128
|
+
padding = 100,
|
|
129
|
+
minWidth = 300,
|
|
130
|
+
minHeight = 200,
|
|
131
|
+
maxWidth = 1200,
|
|
132
|
+
maxHeight = 800,
|
|
133
|
+
} = options;
|
|
134
|
+
|
|
135
|
+
const bounds = getCanvasBounds(canvas);
|
|
136
|
+
|
|
137
|
+
// Add padding to content dimensions
|
|
138
|
+
const contentWidth = bounds.width + padding * 2;
|
|
139
|
+
const contentHeight = bounds.height + padding * 2;
|
|
140
|
+
|
|
141
|
+
// Clamp to min/max
|
|
142
|
+
const width = Math.min(maxWidth, Math.max(minWidth, contentWidth));
|
|
143
|
+
const height = Math.min(maxHeight, Math.max(minHeight, contentHeight));
|
|
144
|
+
|
|
145
|
+
return { width, height };
|
|
146
|
+
}
|