@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,190 @@
1
+ /**
2
+ * SubsystemFileTree — sidebar file tree for a subsystem's components, built
3
+ * on @pierre/trees following the panel repo's SessionFileTreePanel pattern:
4
+ * init-once options + latest-value refs, and a suppress flag around
5
+ * programmatic selection so `onSelectionChange` echoes don't re-open files.
6
+ */
7
+
8
+ import { useEffect, useMemo, useRef } from 'react';
9
+ import type { CSSProperties } from 'react';
10
+ import { FileTree, useFileTree } from '@pierre/trees/react';
11
+ import { useTheme } from '@principal-ade/industry-theme';
12
+
13
+ export interface SubsystemFileTreeProps {
14
+ /** Repo-root-relative file paths; duplicates are deduped. */
15
+ files: string[];
16
+ /** File to select/highlight (the drawer-open file). */
17
+ selectedFile?: string | null;
18
+ /** File to transiently highlight while its node is hovered on the graph;
19
+ * falls back to `selectedFile` when null. */
20
+ hoveredFile?: string | null;
21
+ /** Called when a file row is clicked; upstream toggles the drawer. */
22
+ onSelectFile?: (file: string) => void;
23
+ /** Hide the built-in "Files N" header row — used when an upstream repo
24
+ * header already labels the tree. */
25
+ headerless?: boolean;
26
+ }
27
+
28
+ /** Fills its parent height by design — pin it with a sized flex container. */
29
+ export function SubsystemFileTree({ files, selectedFile, hoveredFile, onSelectFile, headerless }: SubsystemFileTreeProps) {
30
+ const { theme } = useTheme();
31
+ const muted = theme.colors.textMuted ?? theme.colors.textSecondary;
32
+ const paths = useMemo(() => Array.from(new Set(files)).sort(), [files]);
33
+
34
+ // Latest-value refs so the stable `onSelectionChange` closure never goes
35
+ // stale — `useFileTree` reads its options once on init.
36
+ const pathSet = useMemo(() => new Set(paths), [paths]);
37
+ const pathSetRef = useRef(pathSet);
38
+ pathSetRef.current = pathSet;
39
+ const onSelectFileRef = useRef(onSelectFile);
40
+ onSelectFileRef.current = onSelectFile;
41
+ const selectedFileRef = useRef<string | null>(selectedFile ?? null);
42
+ selectedFileRef.current = selectedFile ?? null;
43
+ // Suppresses onSelectFile while selection is driven programmatically from
44
+ // the drawer state (`selectedFile`) — no synthetic open/close events.
45
+ const suppressSelectRef = useRef(false);
46
+ const initialPaths = useRef(paths);
47
+
48
+ const { model } = useFileTree({
49
+ paths: initialPaths.current,
50
+ initialExpansion: 'open',
51
+ onSelectionChange: (selected) => {
52
+ if (suppressSelectRef.current) return;
53
+ const raw = selected[selected.length - 1] ?? selected[0];
54
+ if (!raw) return;
55
+ // Directory rows carry a trailing slash; only emit for real files.
56
+ const path = raw.endsWith('/') ? raw.slice(0, -1) : raw;
57
+ if (!pathSetRef.current.has(path)) return;
58
+ // Includes re-clicks on the open row — upstream toggles it closed.
59
+ onSelectFileRef.current?.(path);
60
+ },
61
+ });
62
+
63
+ // Reconcile the tree's native selection with the OPEN file only. Hover is
64
+ // deliberately NOT folded into selection — pierre's model is single-select,
65
+ // so routing hover through select()/deselect() would steal the highlight
66
+ // from the open file. The hovered row gets its own transient marker instead.
67
+ const lastSyncedRef = useRef<string | null>(null);
68
+ useEffect(() => {
69
+ if (lastSyncedRef.current === (selectedFile ?? null)) return;
70
+ const prev = lastSyncedRef.current;
71
+ lastSyncedRef.current = selectedFile ?? null;
72
+ suppressSelectRef.current = true;
73
+ try {
74
+ if (prev) model.getItem(prev)?.deselect();
75
+ if (selectedFile) {
76
+ model.getItem(selectedFile)?.select();
77
+ model.scrollToPath(selectedFile);
78
+ }
79
+ } finally {
80
+ suppressSelectRef.current = false;
81
+ }
82
+ }, [model, selectedFile]);
83
+
84
+ // Transient hover highlight (e.g. hovering a graph node spotlights its
85
+ // file), independent of selection. Pierre renders rows inside a shadow
86
+ // root, so we resolve the row through shadow boundaries and paint an
87
+ // inline background — document-level <style> tags cannot reach it.
88
+ const treeRef = useRef<HTMLDivElement | null>(null);
89
+ const hoveredRowRef = useRef<HTMLElement | null>(null);
90
+ useEffect(() => {
91
+ hoveredRowRef.current?.style.removeProperty('background');
92
+ hoveredRowRef.current = null;
93
+ const target = hoveredFile ?? null;
94
+ if (!target || !pathSetRef.current.has(target)) return;
95
+
96
+ // Depth-first walk across shadow roots — handles nested custom elements.
97
+ const roots: Array<Document | ShadowRoot> = [document];
98
+ while (roots.length > 0) {
99
+ const root = roots.shift()!;
100
+ const row = root.querySelector(`[data-item-path="${CSS.escape(target)}"]`);
101
+ if (row instanceof HTMLElement) {
102
+ row.style.background = 'var(--trees-theme-list-hover-bg, rgba(128, 128, 128, 0.25))';
103
+ hoveredRowRef.current = row;
104
+ return;
105
+ }
106
+ for (const el of Array.from(root.querySelectorAll('*'))) {
107
+ if (el.shadowRoot) roots.push(el.shadowRoot);
108
+ }
109
+ }
110
+ }, [hoveredFile]);
111
+
112
+ // Re-scope the tree in place when the subsystem's file set changes.
113
+ useEffect(() => {
114
+ model.resetPaths(paths);
115
+ }, [model, paths]);
116
+
117
+ // Pierre emits no selection change when the clicked row is already
118
+ // selected — detect re-clicks on the open file's row via focus and let
119
+ // upstream toggle the drawer closed.
120
+ const handleContainerClick = () => {
121
+ const focused = model.getFocusedPath();
122
+ if (!focused) return;
123
+ const path = focused.endsWith('/') ? focused.slice(0, -1) : focused;
124
+ if (path !== selectedFileRef.current) return;
125
+ suppressSelectRef.current = true;
126
+ try {
127
+ onSelectFileRef.current?.(path);
128
+ } finally {
129
+ suppressSelectRef.current = false;
130
+ }
131
+ };
132
+
133
+ return (
134
+ <div
135
+ ref={treeRef}
136
+ onClickCapture={handleContainerClick}
137
+ style={{
138
+ flex: 1,
139
+ minHeight: 0,
140
+ display: 'flex',
141
+ flexDirection: 'column',
142
+ }}
143
+ >
144
+ {!headerless && (
145
+ <div
146
+ style={{
147
+ padding: '10px 16px 4px',
148
+ display: 'flex',
149
+ alignItems: 'baseline',
150
+ gap: 6,
151
+ flexShrink: 0,
152
+ }}
153
+ >
154
+ <span
155
+ style={{
156
+ fontSize: theme.fontSizes[0] * 0.8,
157
+ fontFamily: theme.fonts.monospace,
158
+ textTransform: 'uppercase',
159
+ color: muted,
160
+ fontWeight: 600,
161
+ }}
162
+ >
163
+ Files
164
+ </span>
165
+ <span style={{ fontSize: theme.fontSizes[0] * 0.8, fontFamily: theme.fonts.monospace, color: muted }}>
166
+ {paths.length}
167
+ </span>
168
+ </div>
169
+ )}
170
+ <FileTree
171
+ model={model}
172
+ style={
173
+ {
174
+ flex: 1,
175
+ minHeight: 0,
176
+ '--trees-padding-inline-override': '8px',
177
+ '--trees-bg-override': 'transparent',
178
+ '--trees-fg-override': theme.colors.text,
179
+ '--trees-fg-muted-override': muted,
180
+ '--trees-accent-override': theme.colors.primary,
181
+ '--trees-font-family-override': theme.fonts.monospace,
182
+ '--trees-font-size-override': `${theme.fontSizes[0]}px`,
183
+ '--trees-theme-list-hover-bg': theme.colors.border,
184
+ '--trees-theme-list-active-selection-bg': theme.colors.border,
185
+ } as CSSProperties
186
+ }
187
+ />
188
+ </div>
189
+ );
190
+ }
@@ -0,0 +1,33 @@
1
+ import { describe, expect, test } from 'bun:test';
2
+ import {
3
+ extractDeclarationLine,
4
+ normalizeDeclarationLine,
5
+ parseSourceLocation,
6
+ } from './declarationRef';
7
+
8
+ describe('parseSourceLocation', () => {
9
+ test('parses L-prefixed lines', () => {
10
+ expect(parseSourceLocation('L42')).toBe(42);
11
+ expect(parseSourceLocation(' L1 ')).toBe(1);
12
+ });
13
+
14
+ test('rejects invalid', () => {
15
+ expect(parseSourceLocation('42')).toBeNull();
16
+ expect(parseSourceLocation('')).toBeNull();
17
+ expect(parseSourceLocation(undefined)).toBeNull();
18
+ });
19
+ });
20
+
21
+ describe('normalizeDeclarationLine', () => {
22
+ test('trims trailing whitespace and CR', () => {
23
+ expect(normalizeDeclarationLine('export class Foo {\r')).toBe('export class Foo {');
24
+ expect(normalizeDeclarationLine(' x ')).toBe(' x');
25
+ });
26
+ });
27
+
28
+ describe('extractDeclarationLine', () => {
29
+ test('1-based indexing', () => {
30
+ expect(extractDeclarationLine('a\nb\nc', 2)).toBe('b');
31
+ expect(extractDeclarationLine('a\nb', 3)).toBeNull();
32
+ });
33
+ });
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Declaration anchoring — start-line + single-line content hash.
3
+ *
4
+ * Graphify emits `source_location: "L42"` (declaration start line). We capture
5
+ * that line's normalized text as a fingerprint to detect drift without end-line
6
+ * spans or graphify changes.
7
+ */
8
+
9
+ /** Persisted anchor for a subsystem component's source declaration. */
10
+ export interface SubsystemDeclarationRef {
11
+ /** Repo-root-relative path (matches `component.file`). */
12
+ file: string;
13
+ /** 1-based declaration start line (from graphify `source_location`). */
14
+ startLine: number;
15
+ /** SHA-256 of {@link normalizeDeclarationLine} output, truncated to 32 hex chars. */
16
+ lineHash: string;
17
+ /** Graphify node id when captured from an exact anchor. */
18
+ graphifyNodeId?: string;
19
+ /** ISO timestamp when this ref was recorded. */
20
+ capturedAt: string;
21
+ /** Repo revision at capture time (optional). */
22
+ revision?: {
23
+ headSha: string;
24
+ dirtyHash?: string | null;
25
+ };
26
+ }
27
+
28
+ export type DeclarationFreshness =
29
+ | 'valid'
30
+ | 'stale'
31
+ | 'missing'
32
+ | 'unanchored'
33
+ | 'unchecked';
34
+
35
+ export const DECLARATION_HASH_ALGO = 'v1' as const;
36
+
37
+ /** Parse graphify `source_location` (`"L42"`) → 1-based line number. */
38
+ export function parseSourceLocation(loc: string | undefined | null): number | null {
39
+ if (!loc?.trim()) return null;
40
+ const m = /^L(\d+)$/.exec(loc.trim());
41
+ if (!m) return null;
42
+ const n = Number.parseInt(m[1]!, 10);
43
+ return Number.isFinite(n) && n >= 1 ? n : null;
44
+ }
45
+
46
+ /** Normalize a source line before hashing (algo v1). */
47
+ export function normalizeDeclarationLine(line: string): string {
48
+ return line.replace(/\r$/, '').trimEnd();
49
+ }
50
+
51
+ /** Extract one 1-based line from file content; null when out of range. */
52
+ export function extractDeclarationLine(content: string, lineNumber: number): string | null {
53
+ if (lineNumber < 1) return null;
54
+ const lines = content.split(/\r?\n/);
55
+ if (lineNumber > lines.length) return null;
56
+ return lines[lineNumber - 1] ?? null;
57
+ }
58
+
59
+ /** Options when opening a file in the subsystem graph drawer. */
60
+ export interface SubsystemOpenFileOptions {
61
+ /** Scroll/highlight this 1-based line (declaration start). */
62
+ startLine?: number;
63
+ }
@@ -0,0 +1,174 @@
1
+ /**
2
+ * Generate a TypeScript declaration string from a SubsystemComponent's detail.
3
+ *
4
+ * This is the "source code" that Prettier will format. The output is valid
5
+ * TypeScript (except for `external`, which is handled separately). The string
6
+ * is intentionally simple — no indentation, no line breaks — because Prettier
7
+ * handles all formatting.
8
+ */
9
+
10
+ import type { SubsystemComponent, SubsystemComponentConstruct } from './model';
11
+ import type { GraphifyComponentDetail } from '../graphify';
12
+
13
+ const TYPE_FAMILY_CONSTRUCTS: ReadonlySet<string> = new Set([
14
+ 'interface',
15
+ 'type_alias',
16
+ 'enum',
17
+ ]);
18
+
19
+ export function generateDeclarationString(component: SubsystemComponent): string {
20
+ const detail = component.detail;
21
+ // Type-family constructs own their rendering even when the detail payload
22
+ // is the shared `type` shape — the construct says which keyword is honest.
23
+ const construct = TYPE_FAMILY_CONSTRUCTS.has(component.construct)
24
+ ? component.construct
25
+ : detail?.kind ?? component.construct;
26
+ const rawName = component.symbol || component.name || 'untitled';
27
+ // Strip class/object prefix from dotted symbols (e.g. "SessionReader.normalize" → "normalize").
28
+ const name = rawName.includes('.') ? rawName.split('.').pop()! : rawName;
29
+
30
+ switch (construct) {
31
+ case 'class':
32
+ return generateClass(name, detail);
33
+ case 'function':
34
+ return generateFunction(name, detail);
35
+ case 'method':
36
+ return generateMethod(name, detail);
37
+ case 'interface':
38
+ case 'type_alias':
39
+ case 'enum':
40
+ return generateType(name, component.construct, detail);
41
+ case 'module':
42
+ return generateModule(detail);
43
+ case 'store':
44
+ return generateStore(name, detail);
45
+ case 'external':
46
+ // Not valid TypeScript — caller should handle formatting.
47
+ return `external '${detail?.kind === 'external' ? detail.label : name}'`;
48
+ default:
49
+ return `${construct} ${name}`;
50
+ }
51
+ }
52
+
53
+ // ---------------------------------------------------------------------------
54
+ // Helpers
55
+ // ---------------------------------------------------------------------------
56
+
57
+ /** Format parameters, synthesising names for unnamed positionals. */
58
+ function formatParams(params: { name?: string; type: string }[]): string {
59
+ return params
60
+ .map((p, i) => (p.name ? `${p.name}: ${p.type}` : `arg${i}: ${p.type}`))
61
+ .join(', ');
62
+ }
63
+
64
+ // ---------------------------------------------------------------------------
65
+ // Per-construct generators
66
+ // ---------------------------------------------------------------------------
67
+
68
+ function generateClass(name: string, detail?: GraphifyComponentDetail): string {
69
+ const cls = detail?.kind === 'class' ? detail : undefined;
70
+ const parts: string[] = [`class ${name}`];
71
+
72
+ if (cls?.extends && cls.extends.length > 0) {
73
+ parts.push(`extends ${cls.extends.join(', ')}`);
74
+ }
75
+ if (cls?.implements && cls.implements.length > 0) {
76
+ parts.push(`implements ${cls.implements.join(', ')}`);
77
+ }
78
+
79
+ const members: string[] = [];
80
+
81
+ for (const m of cls?.methods ?? []) {
82
+ const ret = m.returnType ? `: ${m.returnType}` : '';
83
+ members.push(` ${m.name}(${formatParams(m.parameters ?? [])})${ret};`);
84
+ }
85
+
86
+ for (const prop of cls?.properties ?? []) {
87
+ const t = prop.type ? `: ${prop.type}` : '';
88
+ members.push(` ${prop.name}${t};`);
89
+ }
90
+
91
+ if (members.length > 0) {
92
+ parts.push(`{\n${members.join('\n')}\n}`);
93
+ } else {
94
+ parts.push('{}');
95
+ }
96
+
97
+ return parts.join(' ');
98
+ }
99
+
100
+ function generateFunction(name: string, detail?: GraphifyComponentDetail): string {
101
+ const fn = detail?.kind === 'function' ? detail : undefined;
102
+ const params = formatParams(fn?.parameters ?? []);
103
+ const ret = fn?.returnType ? `: ${fn.returnType}` : '';
104
+ return `function ${name}(${params})${ret};`;
105
+ }
106
+
107
+ function generateMethod(name: string, detail?: GraphifyComponentDetail): string {
108
+ const m = detail?.kind === 'method' ? detail : undefined;
109
+ const hostClass = m?.hostClass ?? 'Host';
110
+ const params = formatParams(m?.parameters ?? []);
111
+ const ret = m?.returnType ? `: ${m.returnType}` : '';
112
+ return `class ${hostClass} {\n ${name}(${params})${ret};\n}`;
113
+ }
114
+
115
+ function generateType(
116
+ name: string,
117
+ construct: SubsystemComponentConstruct,
118
+ detail?: GraphifyComponentDetail,
119
+ ): string {
120
+ // The type-family constructs render their declaration keyword honestly —
121
+ // the construct itself says interface / type (alias) / enum / variable.
122
+ const tpe = detail?.kind === 'type' ? detail : undefined;
123
+ const props = (tpe?.properties ?? [])
124
+ .map((p) => ` ${p.name}${p.type ? `: ${p.type}` : ''};`)
125
+ .join('\n');
126
+
127
+ switch (construct) {
128
+ case 'enum':
129
+ return `enum ${name} { ${(tpe?.properties ?? []).map((p) => p.name).join(', ')} }`;
130
+ case 'type_alias':
131
+ return props
132
+ ? `type ${name} = {\n${props}\n};`
133
+ : `type ${name} = unknown;`;
134
+ default:
135
+ if (props) {
136
+ return `interface ${name} {\n${props}\n}`;
137
+ }
138
+ return `interface ${name} {}`;
139
+ }
140
+ }
141
+
142
+ function generateModule(detail?: GraphifyComponentDetail): string {
143
+ const mod = detail?.kind === 'module' ? detail : undefined;
144
+ if (!mod) return 'module {}';
145
+
146
+ const parts: string[] = [];
147
+
148
+ for (const imp of mod.imports ?? []) {
149
+ parts.push(`import '${imp.name}';`);
150
+ }
151
+
152
+ if ((mod.exports ?? []).length > 0) {
153
+ parts.push(`export { ${mod.exports!.join(', ')} };`);
154
+ }
155
+
156
+ return parts.join('\n') || `module {}`;
157
+ }
158
+
159
+ /**
160
+ * A store renders as its retained state — ambient `declare const` lines for
161
+ * the state members, never a class/method stub. The node's name labels the
162
+ * block; the access mechanism lives in separate accessor nodes.
163
+ */
164
+ function generateStore(name: string, detail?: GraphifyComponentDetail): string {
165
+ const store = detail?.kind === 'store' ? detail : undefined;
166
+ const props = (store?.properties ?? [])
167
+ .map((p) => `declare const ${p.name}${p.type ? `: ${p.type}` : ''};`)
168
+ .join('\n');
169
+
170
+ if (!props) {
171
+ return `// store: ${name} — no captured state members`;
172
+ }
173
+ return `// store: ${name}\n${props}`;
174
+ }