@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.
Files changed (496) hide show
  1. package/README.md +93 -0
  2. package/dist/components/ConfigurationSelector.d.ts +35 -0
  3. package/dist/components/ConfigurationSelector.d.ts.map +1 -0
  4. package/dist/components/ConfigurationSelector.js +63 -0
  5. package/dist/components/ConfigurationSelector.js.map +1 -0
  6. package/dist/components/GraphRenderer.d.ts +295 -0
  7. package/dist/components/GraphRenderer.d.ts.map +1 -0
  8. package/dist/components/GraphRenderer.js +2008 -0
  9. package/dist/components/GraphRenderer.js.map +1 -0
  10. package/dist/components/MultiCanvasRenderer.d.ts +75 -0
  11. package/dist/components/MultiCanvasRenderer.d.ts.map +1 -0
  12. package/dist/components/MultiCanvasRenderer.js +203 -0
  13. package/dist/components/MultiCanvasRenderer.js.map +1 -0
  14. package/dist/components/NodeTooltip.d.ts +24 -0
  15. package/dist/components/NodeTooltip.d.ts.map +1 -0
  16. package/dist/components/NodeTooltip.js +160 -0
  17. package/dist/components/NodeTooltip.js.map +1 -0
  18. package/dist/components/SelectionSidebar.d.ts +18 -0
  19. package/dist/components/SelectionSidebar.d.ts.map +1 -0
  20. package/dist/components/SelectionSidebar.js +190 -0
  21. package/dist/components/SelectionSidebar.js.map +1 -0
  22. package/dist/components/SequenceDiagramRenderer.d.ts +77 -0
  23. package/dist/components/SequenceDiagramRenderer.d.ts.map +1 -0
  24. package/dist/components/SequenceDiagramRenderer.js +604 -0
  25. package/dist/components/SequenceDiagramRenderer.js.map +1 -0
  26. package/dist/components/WorkflowSequenceDiagram.d.ts +63 -0
  27. package/dist/components/WorkflowSequenceDiagram.d.ts.map +1 -0
  28. package/dist/components/WorkflowSequenceDiagram.js +147 -0
  29. package/dist/components/WorkflowSequenceDiagram.js.map +1 -0
  30. package/dist/components/dashboard/DashboardRenderer.d.ts +10 -0
  31. package/dist/components/dashboard/DashboardRenderer.d.ts.map +1 -0
  32. package/dist/components/dashboard/DashboardRenderer.js +179 -0
  33. package/dist/components/dashboard/DashboardRenderer.js.map +1 -0
  34. package/dist/components/dashboard/MetricPanel.d.ts +10 -0
  35. package/dist/components/dashboard/MetricPanel.d.ts.map +1 -0
  36. package/dist/components/dashboard/MetricPanel.js +103 -0
  37. package/dist/components/dashboard/MetricPanel.js.map +1 -0
  38. package/dist/components/dashboard/MockDataProvider.d.ts +30 -0
  39. package/dist/components/dashboard/MockDataProvider.d.ts.map +1 -0
  40. package/dist/components/dashboard/MockDataProvider.js +270 -0
  41. package/dist/components/dashboard/MockDataProvider.js.map +1 -0
  42. package/dist/components/dashboard/components/BarChart.d.ts +10 -0
  43. package/dist/components/dashboard/components/BarChart.d.ts.map +1 -0
  44. package/dist/components/dashboard/components/BarChart.js +167 -0
  45. package/dist/components/dashboard/components/BarChart.js.map +1 -0
  46. package/dist/components/dashboard/components/LineChart.d.ts +10 -0
  47. package/dist/components/dashboard/components/LineChart.d.ts.map +1 -0
  48. package/dist/components/dashboard/components/LineChart.js +141 -0
  49. package/dist/components/dashboard/components/LineChart.js.map +1 -0
  50. package/dist/components/dashboard/components/MetricCard.d.ts +9 -0
  51. package/dist/components/dashboard/components/MetricCard.d.ts.map +1 -0
  52. package/dist/components/dashboard/components/MetricCard.js +163 -0
  53. package/dist/components/dashboard/components/MetricCard.js.map +1 -0
  54. package/dist/components/dashboard/components/SourceLink.d.ts +9 -0
  55. package/dist/components/dashboard/components/SourceLink.d.ts.map +1 -0
  56. package/dist/components/dashboard/components/SourceLink.js +39 -0
  57. package/dist/components/dashboard/components/SourceLink.js.map +1 -0
  58. package/dist/components/dashboard/components/TimeRangeSelector.d.ts +9 -0
  59. package/dist/components/dashboard/components/TimeRangeSelector.d.ts.map +1 -0
  60. package/dist/components/dashboard/components/TimeRangeSelector.js +167 -0
  61. package/dist/components/dashboard/components/TimeRangeSelector.js.map +1 -0
  62. package/dist/components/dashboard/components/index.d.ts +6 -0
  63. package/dist/components/dashboard/components/index.d.ts.map +1 -0
  64. package/dist/components/dashboard/components/index.js +6 -0
  65. package/dist/components/dashboard/components/index.js.map +1 -0
  66. package/dist/components/dashboard/index.d.ts +6 -0
  67. package/dist/components/dashboard/index.d.ts.map +1 -0
  68. package/dist/components/dashboard/index.js +8 -0
  69. package/dist/components/dashboard/index.js.map +1 -0
  70. package/dist/components/dashboard/types.d.ts +74 -0
  71. package/dist/components/dashboard/types.d.ts.map +1 -0
  72. package/dist/components/dashboard/types.js +8 -0
  73. package/dist/components/dashboard/types.js.map +1 -0
  74. package/dist/components/session-events/SessionEventFeed.d.ts +34 -0
  75. package/dist/components/session-events/SessionEventFeed.d.ts.map +1 -0
  76. package/dist/components/session-events/SessionEventFeed.js +1196 -0
  77. package/dist/components/session-events/SessionEventFeed.js.map +1 -0
  78. package/dist/components/session-events/index.d.ts +7 -0
  79. package/dist/components/session-events/index.d.ts.map +1 -0
  80. package/dist/components/session-events/index.js +6 -0
  81. package/dist/components/session-events/index.js.map +1 -0
  82. package/dist/components/state-view/PipelineView.d.ts +14 -0
  83. package/dist/components/state-view/PipelineView.d.ts.map +1 -0
  84. package/dist/components/state-view/PipelineView.js +195 -0
  85. package/dist/components/state-view/PipelineView.js.map +1 -0
  86. package/dist/components/state-view/index.d.ts +14 -0
  87. package/dist/components/state-view/index.d.ts.map +1 -0
  88. package/dist/components/state-view/index.js +12 -0
  89. package/dist/components/state-view/index.js.map +1 -0
  90. package/dist/components/state-view/types.d.ts +188 -0
  91. package/dist/components/state-view/types.d.ts.map +1 -0
  92. package/dist/components/state-view/types.js +10 -0
  93. package/dist/components/state-view/types.js.map +1 -0
  94. package/dist/components/state-view/useStateView.d.ts +32 -0
  95. package/dist/components/state-view/useStateView.d.ts.map +1 -0
  96. package/dist/components/state-view/useStateView.js +129 -0
  97. package/dist/components/state-view/useStateView.js.map +1 -0
  98. package/dist/contexts/GraphEditContext.d.ts +20 -0
  99. package/dist/contexts/GraphEditContext.d.ts.map +1 -0
  100. package/dist/contexts/GraphEditContext.js +8 -0
  101. package/dist/contexts/GraphEditContext.js.map +1 -0
  102. package/dist/contexts/TooltipPortalContext.d.ts +8 -0
  103. package/dist/contexts/TooltipPortalContext.d.ts.map +1 -0
  104. package/dist/contexts/TooltipPortalContext.js +8 -0
  105. package/dist/contexts/TooltipPortalContext.js.map +1 -0
  106. package/dist/edges/CustomEdge.d.ts +24 -0
  107. package/dist/edges/CustomEdge.d.ts.map +1 -0
  108. package/dist/edges/CustomEdge.js +222 -0
  109. package/dist/edges/CustomEdge.js.map +1 -0
  110. package/dist/edges/GenericEdge.d.ts +18 -0
  111. package/dist/edges/GenericEdge.d.ts.map +1 -0
  112. package/dist/edges/GenericEdge.js +10 -0
  113. package/dist/edges/GenericEdge.js.map +1 -0
  114. package/dist/graphify/anchor.d.ts +28 -0
  115. package/dist/graphify/anchor.d.ts.map +1 -0
  116. package/dist/graphify/anchor.js +132 -0
  117. package/dist/graphify/anchor.js.map +1 -0
  118. package/dist/graphify/consolidated.d.ts +210 -0
  119. package/dist/graphify/consolidated.d.ts.map +1 -0
  120. package/dist/graphify/consolidated.js +11 -0
  121. package/dist/graphify/consolidated.js.map +1 -0
  122. package/dist/graphify/ids.d.ts +19 -0
  123. package/dist/graphify/ids.d.ts.map +1 -0
  124. package/dist/graphify/ids.js +46 -0
  125. package/dist/graphify/ids.js.map +1 -0
  126. package/dist/graphify/index.d.ts +18 -0
  127. package/dist/graphify/index.d.ts.map +1 -0
  128. package/dist/graphify/index.js +12 -0
  129. package/dist/graphify/index.js.map +1 -0
  130. package/dist/graphify/kind.d.ts +23 -0
  131. package/dist/graphify/kind.d.ts.map +1 -0
  132. package/dist/graphify/kind.js +77 -0
  133. package/dist/graphify/kind.js.map +1 -0
  134. package/dist/graphify/resolve.d.ts +48 -0
  135. package/dist/graphify/resolve.d.ts.map +1 -0
  136. package/dist/graphify/resolve.js +83 -0
  137. package/dist/graphify/resolve.js.map +1 -0
  138. package/dist/graphify/signature.d.ts +87 -0
  139. package/dist/graphify/signature.d.ts.map +1 -0
  140. package/dist/graphify/signature.js +276 -0
  141. package/dist/graphify/signature.js.map +1 -0
  142. package/dist/graphify/types.d.ts +141 -0
  143. package/dist/graphify/types.d.ts.map +1 -0
  144. package/dist/graphify/types.js +8 -0
  145. package/dist/graphify/types.js.map +1 -0
  146. package/dist/hooks/useElkLayout.d.ts +66 -0
  147. package/dist/hooks/useElkLayout.d.ts.map +1 -0
  148. package/dist/hooks/useElkLayout.js +136 -0
  149. package/dist/hooks/useElkLayout.js.map +1 -0
  150. package/dist/hooks/usePathBasedEvents.d.ts +42 -0
  151. package/dist/hooks/usePathBasedEvents.d.ts.map +1 -0
  152. package/dist/hooks/usePathBasedEvents.js +119 -0
  153. package/dist/hooks/usePathBasedEvents.js.map +1 -0
  154. package/dist/hooks/useSequenceLayout.d.ts +186 -0
  155. package/dist/hooks/useSequenceLayout.d.ts.map +1 -0
  156. package/dist/hooks/useSequenceLayout.js +327 -0
  157. package/dist/hooks/useSequenceLayout.js.map +1 -0
  158. package/dist/hooks/useUndoRedo.d.ts +80 -0
  159. package/dist/hooks/useUndoRedo.d.ts.map +1 -0
  160. package/dist/hooks/useUndoRedo.js +70 -0
  161. package/dist/hooks/useUndoRedo.js.map +1 -0
  162. package/dist/index.d.ts +73 -0
  163. package/dist/index.d.ts.map +1 -0
  164. package/dist/index.js +51 -0
  165. package/dist/index.js.map +1 -0
  166. package/dist/nodes/CustomNode.d.ts +28 -0
  167. package/dist/nodes/CustomNode.d.ts.map +1 -0
  168. package/dist/nodes/CustomNode.js +820 -0
  169. package/dist/nodes/CustomNode.js.map +1 -0
  170. package/dist/nodes/GenericNode.d.ts +20 -0
  171. package/dist/nodes/GenericNode.d.ts.map +1 -0
  172. package/dist/nodes/GenericNode.js +20 -0
  173. package/dist/nodes/GenericNode.js.map +1 -0
  174. package/dist/nodes/otel/OtelBoundaryNode.d.ts +55 -0
  175. package/dist/nodes/otel/OtelBoundaryNode.d.ts.map +1 -0
  176. package/dist/nodes/otel/OtelBoundaryNode.js +81 -0
  177. package/dist/nodes/otel/OtelBoundaryNode.js.map +1 -0
  178. package/dist/nodes/otel/OtelEventNode.d.ts +59 -0
  179. package/dist/nodes/otel/OtelEventNode.d.ts.map +1 -0
  180. package/dist/nodes/otel/OtelEventNode.js +82 -0
  181. package/dist/nodes/otel/OtelEventNode.js.map +1 -0
  182. package/dist/nodes/otel/OtelResourceNode.d.ts +53 -0
  183. package/dist/nodes/otel/OtelResourceNode.d.ts.map +1 -0
  184. package/dist/nodes/otel/OtelResourceNode.js +105 -0
  185. package/dist/nodes/otel/OtelResourceNode.js.map +1 -0
  186. package/dist/nodes/otel/OtelScopeNode.d.ts +53 -0
  187. package/dist/nodes/otel/OtelScopeNode.d.ts.map +1 -0
  188. package/dist/nodes/otel/OtelScopeNode.js +81 -0
  189. package/dist/nodes/otel/OtelScopeNode.js.map +1 -0
  190. package/dist/nodes/otel/OtelSpanConventionNode.d.ts +61 -0
  191. package/dist/nodes/otel/OtelSpanConventionNode.d.ts.map +1 -0
  192. package/dist/nodes/otel/OtelSpanConventionNode.js +131 -0
  193. package/dist/nodes/otel/OtelSpanConventionNode.js.map +1 -0
  194. package/dist/nodes/otel/index.d.ts +17 -0
  195. package/dist/nodes/otel/index.d.ts.map +1 -0
  196. package/dist/nodes/otel/index.js +13 -0
  197. package/dist/nodes/otel/index.js.map +1 -0
  198. package/dist/nodes/otel/shared/NodeBadges.d.ts +10 -0
  199. package/dist/nodes/otel/shared/NodeBadges.d.ts.map +1 -0
  200. package/dist/nodes/otel/shared/NodeBadges.js +178 -0
  201. package/dist/nodes/otel/shared/NodeBadges.js.map +1 -0
  202. package/dist/nodes/otel/shared/NodeContent.d.ts +10 -0
  203. package/dist/nodes/otel/shared/NodeContent.d.ts.map +1 -0
  204. package/dist/nodes/otel/shared/NodeContent.js +96 -0
  205. package/dist/nodes/otel/shared/NodeContent.js.map +1 -0
  206. package/dist/nodes/otel/shared/index.d.ts +8 -0
  207. package/dist/nodes/otel/shared/index.d.ts.map +1 -0
  208. package/dist/nodes/otel/shared/index.js +8 -0
  209. package/dist/nodes/otel/shared/index.js.map +1 -0
  210. package/dist/nodes/otel/shared/types.d.ts +129 -0
  211. package/dist/nodes/otel/shared/types.d.ts.map +1 -0
  212. package/dist/nodes/otel/shared/types.js +5 -0
  213. package/dist/nodes/otel/shared/types.js.map +1 -0
  214. package/dist/nodes/otel/shared/useNodeBehavior.d.ts +42 -0
  215. package/dist/nodes/otel/shared/useNodeBehavior.d.ts.map +1 -0
  216. package/dist/nodes/otel/shared/useNodeBehavior.js +61 -0
  217. package/dist/nodes/otel/shared/useNodeBehavior.js.map +1 -0
  218. package/dist/pierre/PierreFileView.d.ts +17 -0
  219. package/dist/pierre/PierreFileView.d.ts.map +1 -0
  220. package/dist/pierre/PierreFileView.js +46 -0
  221. package/dist/pierre/PierreFileView.js.map +1 -0
  222. package/dist/pierre/PierreSnippetView.d.ts +28 -0
  223. package/dist/pierre/PierreSnippetView.d.ts.map +1 -0
  224. package/dist/pierre/PierreSnippetView.js +105 -0
  225. package/dist/pierre/PierreSnippetView.js.map +1 -0
  226. package/dist/pierre/PierreThroughlineCodeView.d.ts +22 -0
  227. package/dist/pierre/PierreThroughlineCodeView.d.ts.map +1 -0
  228. package/dist/pierre/PierreThroughlineCodeView.js +206 -0
  229. package/dist/pierre/PierreThroughlineCodeView.js.map +1 -0
  230. package/dist/pierre/constructColors.d.ts +24 -0
  231. package/dist/pierre/constructColors.d.ts.map +1 -0
  232. package/dist/pierre/constructColors.js +91 -0
  233. package/dist/pierre/constructColors.js.map +1 -0
  234. package/dist/pierre/index.d.ts +12 -0
  235. package/dist/pierre/index.d.ts.map +1 -0
  236. package/dist/pierre/index.js +7 -0
  237. package/dist/pierre/index.js.map +1 -0
  238. package/dist/pierre/pierreBackground.d.ts +15 -0
  239. package/dist/pierre/pierreBackground.d.ts.map +1 -0
  240. package/dist/pierre/pierreBackground.js +31 -0
  241. package/dist/pierre/pierreBackground.js.map +1 -0
  242. package/dist/pierre/pierreFileLang.d.ts +27 -0
  243. package/dist/pierre/pierreFileLang.d.ts.map +1 -0
  244. package/dist/pierre/pierreFileLang.js +52 -0
  245. package/dist/pierre/pierreFileLang.js.map +1 -0
  246. package/dist/pierre/pierreSyntaxTheme.d.ts +11 -0
  247. package/dist/pierre/pierreSyntaxTheme.d.ts.map +1 -0
  248. package/dist/pierre/pierreSyntaxTheme.js +20 -0
  249. package/dist/pierre/pierreSyntaxTheme.js.map +1 -0
  250. package/dist/pierre/scrollAnchor.d.ts +5 -0
  251. package/dist/pierre/scrollAnchor.d.ts.map +1 -0
  252. package/dist/pierre/scrollAnchor.js +9 -0
  253. package/dist/pierre/scrollAnchor.js.map +1 -0
  254. package/dist/pierre/sliceSnippet.d.ts +10 -0
  255. package/dist/pierre/sliceSnippet.d.ts.map +1 -0
  256. package/dist/pierre/sliceSnippet.js +16 -0
  257. package/dist/pierre/sliceSnippet.js.map +1 -0
  258. package/dist/pierre/syntaxTokens.d.ts +11 -0
  259. package/dist/pierre/syntaxTokens.d.ts.map +1 -0
  260. package/dist/pierre/syntaxTokens.js +51 -0
  261. package/dist/pierre/syntaxTokens.js.map +1 -0
  262. package/dist/stories/Subsystem/ComponentGraph/fixtures.d.ts +8 -0
  263. package/dist/stories/Subsystem/ComponentGraph/fixtures.d.ts.map +1 -0
  264. package/dist/stories/Subsystem/ComponentGraph/fixtures.js +116 -0
  265. package/dist/stories/Subsystem/ComponentGraph/fixtures.js.map +1 -0
  266. package/dist/subsystem/ComponentDeclaration.d.ts +87 -0
  267. package/dist/subsystem/ComponentDeclaration.d.ts.map +1 -0
  268. package/dist/subsystem/ComponentDeclaration.js +374 -0
  269. package/dist/subsystem/ComponentDeclaration.js.map +1 -0
  270. package/dist/subsystem/FileDrawer.d.ts +17 -0
  271. package/dist/subsystem/FileDrawer.d.ts.map +1 -0
  272. package/dist/subsystem/FileDrawer.js +72 -0
  273. package/dist/subsystem/FileDrawer.js.map +1 -0
  274. package/dist/subsystem/GraphLayoutCover.d.ts +20 -0
  275. package/dist/subsystem/GraphLayoutCover.d.ts.map +1 -0
  276. package/dist/subsystem/GraphLayoutCover.js +42 -0
  277. package/dist/subsystem/GraphLayoutCover.js.map +1 -0
  278. package/dist/subsystem/SubsystemComponentGraph.d.ts +96 -0
  279. package/dist/subsystem/SubsystemComponentGraph.d.ts.map +1 -0
  280. package/dist/subsystem/SubsystemComponentGraph.js +1059 -0
  281. package/dist/subsystem/SubsystemComponentGraph.js.map +1 -0
  282. package/dist/subsystem/SubsystemFileTree.d.ts +24 -0
  283. package/dist/subsystem/SubsystemFileTree.d.ts.map +1 -0
  284. package/dist/subsystem/SubsystemFileTree.js +150 -0
  285. package/dist/subsystem/SubsystemFileTree.js.map +1 -0
  286. package/dist/subsystem/declarationRef.d.ts +39 -0
  287. package/dist/subsystem/declarationRef.d.ts.map +1 -0
  288. package/dist/subsystem/declarationRef.js +32 -0
  289. package/dist/subsystem/declarationRef.js.map +1 -0
  290. package/dist/subsystem/formatDeclaration.d.ts +11 -0
  291. package/dist/subsystem/formatDeclaration.d.ts.map +1 -0
  292. package/dist/subsystem/formatDeclaration.js +146 -0
  293. package/dist/subsystem/formatDeclaration.js.map +1 -0
  294. package/dist/subsystem/model.d.ts +353 -0
  295. package/dist/subsystem/model.d.ts.map +1 -0
  296. package/dist/subsystem/model.js +503 -0
  297. package/dist/subsystem/model.js.map +1 -0
  298. package/dist/subsystem/nodes.d.ts +69 -0
  299. package/dist/subsystem/nodes.d.ts.map +1 -0
  300. package/dist/subsystem/nodes.js +289 -0
  301. package/dist/subsystem/nodes.js.map +1 -0
  302. package/dist/subsystem/paths.d.ts +63 -0
  303. package/dist/subsystem/paths.d.ts.map +1 -0
  304. package/dist/subsystem/paths.js +86 -0
  305. package/dist/subsystem/paths.js.map +1 -0
  306. package/dist/subsystem/tokenizeComponent.d.ts +20 -0
  307. package/dist/subsystem/tokenizeComponent.d.ts.map +1 -0
  308. package/dist/subsystem/tokenizeComponent.js +56 -0
  309. package/dist/subsystem/tokenizeComponent.js.map +1 -0
  310. package/dist/subsystem/tokenizeFormatted.d.ts +12 -0
  311. package/dist/subsystem/tokenizeFormatted.d.ts.map +1 -0
  312. package/dist/subsystem/tokenizeFormatted.js +13 -0
  313. package/dist/subsystem/tokenizeFormatted.js.map +1 -0
  314. package/dist/utils/animationMapping.d.ts +53 -0
  315. package/dist/utils/animationMapping.d.ts.map +1 -0
  316. package/dist/utils/animationMapping.js +126 -0
  317. package/dist/utils/animationMapping.js.map +1 -0
  318. package/dist/utils/canvasBounds.d.ts +50 -0
  319. package/dist/utils/canvasBounds.d.ts.map +1 -0
  320. package/dist/utils/canvasBounds.js +88 -0
  321. package/dist/utils/canvasBounds.js.map +1 -0
  322. package/dist/utils/elkLayout.d.ts +137 -0
  323. package/dist/utils/elkLayout.d.ts.map +1 -0
  324. package/dist/utils/elkLayout.js +596 -0
  325. package/dist/utils/elkLayout.js.map +1 -0
  326. package/dist/utils/graphConverter.d.ts +18 -0
  327. package/dist/utils/graphConverter.d.ts.map +1 -0
  328. package/dist/utils/graphConverter.js +114 -0
  329. package/dist/utils/graphConverter.js.map +1 -0
  330. package/dist/utils/iconResolver.d.ts +29 -0
  331. package/dist/utils/iconResolver.d.ts.map +1 -0
  332. package/dist/utils/iconResolver.js +30 -0
  333. package/dist/utils/iconResolver.js.map +1 -0
  334. package/dist/utils/orientationUtils.d.ts +19 -0
  335. package/dist/utils/orientationUtils.d.ts.map +1 -0
  336. package/dist/utils/orientationUtils.js +62 -0
  337. package/dist/utils/orientationUtils.js.map +1 -0
  338. package/package.json +80 -0
  339. package/src/components/ConfigurationSelector.tsx +133 -0
  340. package/src/components/GraphRenderer.tsx +3195 -0
  341. package/src/components/MultiCanvasRenderer.tsx +295 -0
  342. package/src/components/NodeTooltip.tsx +279 -0
  343. package/src/components/PendingChanges.test.tsx +375 -0
  344. package/src/components/SelectionSidebar.tsx +352 -0
  345. package/src/components/SequenceDiagramRenderer.tsx +1156 -0
  346. package/src/components/WorkflowSequenceDiagram.tsx +270 -0
  347. package/src/components/dashboard/DashboardRenderer.tsx +317 -0
  348. package/src/components/dashboard/MetricPanel.tsx +254 -0
  349. package/src/components/dashboard/MockDataProvider.ts +330 -0
  350. package/src/components/dashboard/components/BarChart.tsx +299 -0
  351. package/src/components/dashboard/components/LineChart.tsx +279 -0
  352. package/src/components/dashboard/components/MetricCard.tsx +270 -0
  353. package/src/components/dashboard/components/SourceLink.tsx +63 -0
  354. package/src/components/dashboard/components/TimeRangeSelector.tsx +280 -0
  355. package/src/components/dashboard/components/index.ts +5 -0
  356. package/src/components/dashboard/index.ts +47 -0
  357. package/src/components/dashboard/types.ts +126 -0
  358. package/src/components/session-events/SessionEventFeed.tsx +1797 -0
  359. package/src/components/session-events/index.ts +13 -0
  360. package/src/components/state-view/PipelineView.tsx +347 -0
  361. package/src/components/state-view/index.ts +14 -0
  362. package/src/components/state-view/types.ts +261 -0
  363. package/src/components/state-view/useStateView.ts +205 -0
  364. package/src/contexts/GraphEditContext.tsx +27 -0
  365. package/src/contexts/TooltipPortalContext.ts +8 -0
  366. package/src/edges/CustomEdge.tsx +402 -0
  367. package/src/edges/GenericEdge.tsx +36 -0
  368. package/src/graphify/anchor.test.ts +124 -0
  369. package/src/graphify/anchor.ts +160 -0
  370. package/src/graphify/consolidated.ts +246 -0
  371. package/src/graphify/ids.ts +48 -0
  372. package/src/graphify/index.ts +72 -0
  373. package/src/graphify/kind.test.ts +108 -0
  374. package/src/graphify/kind.ts +120 -0
  375. package/src/graphify/resolve.test.ts +89 -0
  376. package/src/graphify/resolve.ts +115 -0
  377. package/src/graphify/signature.test.ts +278 -0
  378. package/src/graphify/signature.ts +354 -0
  379. package/src/graphify/types.ts +164 -0
  380. package/src/hooks/useElkLayout.test.ts +134 -0
  381. package/src/hooks/useElkLayout.ts +191 -0
  382. package/src/hooks/usePathBasedEvents.ts +192 -0
  383. package/src/hooks/useSequenceLayout.ts +543 -0
  384. package/src/hooks/useUndoRedo.ts +144 -0
  385. package/src/index.ts +341 -0
  386. package/src/nodes/CustomNode.tsx +1231 -0
  387. package/src/nodes/GenericNode.tsx +55 -0
  388. package/src/nodes/otel/OtelBoundaryNode.tsx +224 -0
  389. package/src/nodes/otel/OtelEventNode.tsx +225 -0
  390. package/src/nodes/otel/OtelResourceNode.tsx +251 -0
  391. package/src/nodes/otel/OtelScopeNode.tsx +221 -0
  392. package/src/nodes/otel/OtelSpanConventionNode.tsx +295 -0
  393. package/src/nodes/otel/index.ts +23 -0
  394. package/src/nodes/otel/shared/NodeBadges.tsx +295 -0
  395. package/src/nodes/otel/shared/NodeContent.tsx +204 -0
  396. package/src/nodes/otel/shared/index.ts +8 -0
  397. package/src/nodes/otel/shared/types.ts +138 -0
  398. package/src/nodes/otel/shared/useNodeBehavior.ts +114 -0
  399. package/src/pierre/PierreFileView.tsx +81 -0
  400. package/src/pierre/PierreSnippetView.tsx +184 -0
  401. package/src/pierre/PierreThroughlineCodeView.tsx +304 -0
  402. package/src/pierre/constructColors.test.ts +52 -0
  403. package/src/pierre/constructColors.ts +112 -0
  404. package/src/pierre/index.ts +18 -0
  405. package/src/pierre/pierreBackground.ts +33 -0
  406. package/src/pierre/pierreFileLang.test.ts +26 -0
  407. package/src/pierre/pierreFileLang.ts +55 -0
  408. package/src/pierre/pierreSyntaxTheme.ts +23 -0
  409. package/src/pierre/scrollAnchor.test.ts +13 -0
  410. package/src/pierre/scrollAnchor.ts +11 -0
  411. package/src/pierre/sliceSnippet.test.ts +21 -0
  412. package/src/pierre/sliceSnippet.ts +31 -0
  413. package/src/pierre/syntaxTokens.test.ts +35 -0
  414. package/src/pierre/syntaxTokens.ts +60 -0
  415. package/src/stories/Audit/BoundaryNodes.stories.tsx +385 -0
  416. package/src/stories/Audit/CanvasEdgeTypes.stories.tsx +1448 -0
  417. package/src/stories/Audit/CanvasNodeTypes.stories.tsx +1049 -0
  418. package/src/stories/Audit/ColorPriority.stories.tsx +895 -0
  419. package/src/stories/Audit/DiamondBadges.stories.tsx +629 -0
  420. package/src/stories/Audit/NodeDimensionsTesting.stories.tsx +724 -0
  421. package/src/stories/Audit/NodeFieldsAudit.stories.tsx +996 -0
  422. package/src/stories/Audit/NodeFontSizeTesting.stories.tsx +715 -0
  423. package/src/stories/Audit/NodeShapes.stories.tsx +1208 -0
  424. package/src/stories/Audit/WideNodesTesting.stories.tsx +1045 -0
  425. package/src/stories/Components/DashboardRenderer.stories.tsx +263 -0
  426. package/src/stories/Components/GraphRenderer.stories.tsx +3236 -0
  427. package/src/stories/Components/MultiCanvasRenderer.stories.tsx +370 -0
  428. package/src/stories/Components/SequenceDiagram.stories.tsx +255 -0
  429. package/src/stories/Components/StateView.stories.tsx +417 -0
  430. package/src/stories/Components/TraceViewer.stories.tsx +442 -0
  431. package/src/stories/Components/WorkflowSequenceDiagram.stories.tsx +802 -0
  432. package/src/stories/Features/AnimationWorkshop.stories.tsx +727 -0
  433. package/src/stories/Features/ChangeTypeVisual.stories.tsx +67 -0
  434. package/src/stories/Features/EventDrivenAnimations.stories.tsx +513 -0
  435. package/src/stories/Features/MultiConfig.stories.tsx +539 -0
  436. package/src/stories/Introduction.mdx +34 -0
  437. package/src/stories/Layout/ElkEdgeRouting.stories.tsx +539 -0
  438. package/src/stories/Layout/GraphOrientation.stories.tsx +500 -0
  439. package/src/stories/Layout/MultiDirectionalConnections.stories.tsx +352 -0
  440. package/src/stories/Nodes/NodeDefinitionComparison.stories.tsx +560 -0
  441. package/src/stories/Nodes/NodeNameFallbacks.stories.tsx +491 -0
  442. package/src/stories/Nodes/NumericColors.stories.tsx +440 -0
  443. package/src/stories/OTEL/EventNameDisplay.stories.tsx +694 -0
  444. package/src/stories/OTEL/EventNameFallback.stories.tsx +578 -0
  445. package/src/stories/OTEL/OtelComponents.stories.tsx +422 -0
  446. package/src/stories/OTEL/OtelNodeTypesPrototype.stories.tsx +806 -0
  447. package/src/stories/OTEL/RawEventCards.stories.tsx +57 -0
  448. package/src/stories/OTEL/SpanBadges.stories.tsx +840 -0
  449. package/src/stories/OTEL/ValidationEventsCanvas.stories.tsx +209 -0
  450. package/src/stories/Pierre/CodeView.stories.tsx +219 -0
  451. package/src/stories/RealWorld/BacklogMdCanvases.stories.tsx +721 -0
  452. package/src/stories/RealWorld/FileCitySequence.stories.tsx +516 -0
  453. package/src/stories/RealWorld/RealCanvasFiles.stories.tsx +336 -0
  454. package/src/stories/Subsystem/ComponentDeclarationAudit.stories.tsx +321 -0
  455. package/src/stories/Subsystem/ComponentGraph/Appearance.stories.tsx +365 -0
  456. package/src/stories/Subsystem/ComponentGraph/Basics.stories.tsx +137 -0
  457. package/src/stories/Subsystem/ComponentGraph/Captures.stories.tsx +238 -0
  458. package/src/stories/Subsystem/ComponentGraph/DetailPanel.stories.tsx +315 -0
  459. package/src/stories/Subsystem/ComponentGraph/Flows.stories.tsx +239 -0
  460. package/src/stories/Subsystem/ComponentGraph/FrameworkStereotype.stories.tsx +216 -0
  461. package/src/stories/Subsystem/ComponentGraph/GraphTitle.stories.tsx +70 -0
  462. package/src/stories/Subsystem/ComponentGraph/Processes.stories.tsx +68 -0
  463. package/src/stories/Subsystem/ComponentGraph/Scenarios.stories.tsx +959 -0
  464. package/src/stories/Subsystem/ComponentGraph/Spotlights.stories.tsx +681 -0
  465. package/src/stories/Subsystem/ComponentGraph/fixtures.ts +129 -0
  466. package/src/stories/__traces__/test-run.canvas.json +241 -0
  467. package/src/stories/data/activity-feed-analytics.dashboard.json +300 -0
  468. package/src/stories/data/file-city-images-transformed.otel.canvas.json +295 -0
  469. package/src/stories/data/file-city-workflows.json +269 -0
  470. package/src/stories/data/graph-converter-test-execution.json +443 -0
  471. package/src/stories/data/graph-converter-test.workflow.json +105 -0
  472. package/src/stories/data/graph-converter-validated-execution.json +58 -0
  473. package/src/stories/data/opencode-session-raw-events.json +273396 -0
  474. package/src/subsystem/ComponentDeclaration.tsx +643 -0
  475. package/src/subsystem/FileDrawer.tsx +106 -0
  476. package/src/subsystem/GraphLayoutCover.tsx +69 -0
  477. package/src/subsystem/SubsystemComponentGraph.tsx +1644 -0
  478. package/src/subsystem/SubsystemFileTree.tsx +190 -0
  479. package/src/subsystem/declarationRef.test.ts +33 -0
  480. package/src/subsystem/declarationRef.ts +63 -0
  481. package/src/subsystem/formatDeclaration.ts +174 -0
  482. package/src/subsystem/model.test.ts +244 -0
  483. package/src/subsystem/model.ts +850 -0
  484. package/src/subsystem/nodes.test.ts +56 -0
  485. package/src/subsystem/nodes.tsx +443 -0
  486. package/src/subsystem/paths.test.ts +123 -0
  487. package/src/subsystem/paths.ts +127 -0
  488. package/src/subsystem/tokenizeComponent.ts +70 -0
  489. package/src/subsystem/tokenizeFormatted.ts +19 -0
  490. package/src/utils/animationMapping.ts +166 -0
  491. package/src/utils/canvasBounds.ts +146 -0
  492. package/src/utils/elkLayout.test.ts +240 -0
  493. package/src/utils/elkLayout.ts +779 -0
  494. package/src/utils/graphConverter.ts +148 -0
  495. package/src/utils/iconResolver.tsx +53 -0
  496. 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
+ }