@massdriver/backstage-plugin 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (346) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +196 -0
  3. package/dist/MassdriverRouter.esm.js +78 -0
  4. package/dist/MassdriverRouter.esm.js.map +1 -0
  5. package/dist/api.esm.js +119 -0
  6. package/dist/api.esm.js.map +1 -0
  7. package/dist/assets/massdriver-logo-dark.svg +55 -0
  8. package/dist/assets/massdriver-logo-light.svg +50 -0
  9. package/dist/components/AttributesColumn.esm.js +95 -0
  10. package/dist/components/AttributesColumn.esm.js.map +1 -0
  11. package/dist/components/AttributesSummaryCell.esm.js +103 -0
  12. package/dist/components/AttributesSummaryCell.esm.js.map +1 -0
  13. package/dist/components/AuthedIcon.esm.js +26 -0
  14. package/dist/components/AuthedIcon.esm.js.map +1 -0
  15. package/dist/components/ConditionsCell.esm.js +48 -0
  16. package/dist/components/ConditionsCell.esm.js.map +1 -0
  17. package/dist/components/DisabledAction.esm.js +30 -0
  18. package/dist/components/DisabledAction.esm.js.map +1 -0
  19. package/dist/components/EntityMassdriverContent/EntityMassdriverContent.esm.js +80 -0
  20. package/dist/components/EntityMassdriverContent/EntityMassdriverContent.esm.js.map +1 -0
  21. package/dist/components/EntityMassdriverContent/index.esm.js +6 -0
  22. package/dist/components/EntityMassdriverContent/index.esm.js.map +1 -0
  23. package/dist/components/EntityMassdriverOverviewCard/EntityMassdriverOverviewCard.esm.js +75 -0
  24. package/dist/components/EntityMassdriverOverviewCard/EntityMassdriverOverviewCard.esm.js.map +1 -0
  25. package/dist/components/EntityMassdriverOverviewCard/index.esm.js +6 -0
  26. package/dist/components/EntityMassdriverOverviewCard/index.esm.js.map +1 -0
  27. package/dist/components/ForkPill.esm.js +84 -0
  28. package/dist/components/ForkPill.esm.js.map +1 -0
  29. package/dist/components/InstanceStatusIndicator.esm.js +21 -0
  30. package/dist/components/InstanceStatusIndicator.esm.js.map +1 -0
  31. package/dist/components/InstanceStatusPill.esm.js +67 -0
  32. package/dist/components/InstanceStatusPill.esm.js.map +1 -0
  33. package/dist/components/MassdriverIcon.esm.js +13 -0
  34. package/dist/components/MassdriverIcon.esm.js.map +1 -0
  35. package/dist/components/MassdriverSidebarItem.esm.js +45 -0
  36. package/dist/components/MassdriverSidebarItem.esm.js.map +1 -0
  37. package/dist/components/NotFound.esm.js +44 -0
  38. package/dist/components/NotFound.esm.js.map +1 -0
  39. package/dist/components/OpenInMassdriverButton.esm.js +24 -0
  40. package/dist/components/OpenInMassdriverButton.esm.js.map +1 -0
  41. package/dist/components/PageLayout.esm.js +88 -0
  42. package/dist/components/PageLayout.esm.js.map +1 -0
  43. package/dist/components/RouterLinkAdapter.esm.js +12 -0
  44. package/dist/components/RouterLinkAdapter.esm.js.map +1 -0
  45. package/dist/components/VersionBadge.esm.js +57 -0
  46. package/dist/components/VersionBadge.esm.js.map +1 -0
  47. package/dist/components/grantColumns.esm.js +56 -0
  48. package/dist/components/grantColumns.esm.js.map +1 -0
  49. package/dist/components/icons/BundleIcon.esm.js +7 -0
  50. package/dist/components/icons/BundleIcon.esm.js.map +1 -0
  51. package/dist/components/icons/FolderOutlinedIcon.esm.js +7 -0
  52. package/dist/components/icons/FolderOutlinedIcon.esm.js.map +1 -0
  53. package/dist/components/icons/TokenIcon.esm.js +7 -0
  54. package/dist/components/icons/TokenIcon.esm.js.map +1 -0
  55. package/dist/entity.esm.js +23 -0
  56. package/dist/entity.esm.js.map +1 -0
  57. package/dist/features/environment/CompareDeploymentsDialog/CompareDeploymentsDialog.esm.js +115 -0
  58. package/dist/features/environment/CompareDeploymentsDialog/CompareDeploymentsDialog.esm.js.map +1 -0
  59. package/dist/features/environment/CompareDeploymentsDialog/ResultsStep.esm.js +165 -0
  60. package/dist/features/environment/CompareDeploymentsDialog/ResultsStep.esm.js.map +1 -0
  61. package/dist/features/environment/CompareDeploymentsDialog/SelectStep.esm.js +216 -0
  62. package/dist/features/environment/CompareDeploymentsDialog/SelectStep.esm.js.map +1 -0
  63. package/dist/features/environment/CompareDeploymentsDialog/compareColumns.esm.js +86 -0
  64. package/dist/features/environment/CompareDeploymentsDialog/compareColumns.esm.js.map +1 -0
  65. package/dist/features/environment/CompareDeploymentsDialog/flattenDeploymentComparison.esm.js +57 -0
  66. package/dist/features/environment/CompareDeploymentsDialog/flattenDeploymentComparison.esm.js.map +1 -0
  67. package/dist/features/environment/CompareDeploymentsDialog/queries.esm.js +53 -0
  68. package/dist/features/environment/CompareDeploymentsDialog/queries.esm.js.map +1 -0
  69. package/dist/features/environment/CompareEnvironmentsDialog/CompareEnvironmentsDialog.esm.js +94 -0
  70. package/dist/features/environment/CompareEnvironmentsDialog/CompareEnvironmentsDialog.esm.js.map +1 -0
  71. package/dist/features/environment/CompareEnvironmentsDialog/ComparisonValueCell.esm.js +67 -0
  72. package/dist/features/environment/CompareEnvironmentsDialog/ComparisonValueCell.esm.js.map +1 -0
  73. package/dist/features/environment/CompareEnvironmentsDialog/ResultsStep.esm.js +202 -0
  74. package/dist/features/environment/CompareEnvironmentsDialog/ResultsStep.esm.js.map +1 -0
  75. package/dist/features/environment/CompareEnvironmentsDialog/SelectStep.esm.js +183 -0
  76. package/dist/features/environment/CompareEnvironmentsDialog/SelectStep.esm.js.map +1 -0
  77. package/dist/features/environment/CompareEnvironmentsDialog/compareColumns.esm.js +73 -0
  78. package/dist/features/environment/CompareEnvironmentsDialog/compareColumns.esm.js.map +1 -0
  79. package/dist/features/environment/CompareEnvironmentsDialog/flattenComparison.esm.js +70 -0
  80. package/dist/features/environment/CompareEnvironmentsDialog/flattenComparison.esm.js.map +1 -0
  81. package/dist/features/environment/CompareEnvironmentsDialog/queries.esm.js +32 -0
  82. package/dist/features/environment/CompareEnvironmentsDialog/queries.esm.js.map +1 -0
  83. package/dist/features/environment/EnvironmentGraphPage.esm.js +131 -0
  84. package/dist/features/environment/EnvironmentGraphPage.esm.js.map +1 -0
  85. package/dist/features/environment/GraphHeader/EnvironmentDefaults.esm.js +252 -0
  86. package/dist/features/environment/GraphHeader/EnvironmentDefaults.esm.js.map +1 -0
  87. package/dist/features/environment/GraphHeader/GraphHeader.esm.js +247 -0
  88. package/dist/features/environment/GraphHeader/GraphHeader.esm.js.map +1 -0
  89. package/dist/features/environment/GraphHeader/HeaderActions.esm.js +127 -0
  90. package/dist/features/environment/GraphHeader/HeaderActions.esm.js.map +1 -0
  91. package/dist/features/environment/GraphHeader/Switcher.esm.js +75 -0
  92. package/dist/features/environment/GraphHeader/Switcher.esm.js.map +1 -0
  93. package/dist/features/environment/GraphHeader/queries.esm.js +60 -0
  94. package/dist/features/environment/GraphHeader/queries.esm.js.map +1 -0
  95. package/dist/features/environment/InstanceDrawer/AlarmCard.esm.js +151 -0
  96. package/dist/features/environment/InstanceDrawer/AlarmCard.esm.js.map +1 -0
  97. package/dist/features/environment/InstanceDrawer/InstanceDrawer.esm.js +165 -0
  98. package/dist/features/environment/InstanceDrawer/InstanceDrawer.esm.js.map +1 -0
  99. package/dist/features/environment/InstanceDrawer/InstanceDrawerHeader.esm.js +241 -0
  100. package/dist/features/environment/InstanceDrawer/InstanceDrawerHeader.esm.js.map +1 -0
  101. package/dist/features/environment/InstanceDrawer/InstanceTabs.esm.js +119 -0
  102. package/dist/features/environment/InstanceDrawer/InstanceTabs.esm.js.map +1 -0
  103. package/dist/features/environment/InstanceDrawer/TabState.esm.js +30 -0
  104. package/dist/features/environment/InstanceDrawer/TabState.esm.js.map +1 -0
  105. package/dist/features/environment/InstanceDrawer/formsDataSource.esm.js +25 -0
  106. package/dist/features/environment/InstanceDrawer/formsDataSource.esm.js.map +1 -0
  107. package/dist/features/environment/InstanceDrawer/helpers.esm.js +282 -0
  108. package/dist/features/environment/InstanceDrawer/helpers.esm.js.map +1 -0
  109. package/dist/features/environment/InstanceDrawer/queries.esm.js +281 -0
  110. package/dist/features/environment/InstanceDrawer/queries.esm.js.map +1 -0
  111. package/dist/features/environment/InstanceDrawer/tabs/ConfigTab.esm.js +170 -0
  112. package/dist/features/environment/InstanceDrawer/tabs/ConfigTab.esm.js.map +1 -0
  113. package/dist/features/environment/InstanceDrawer/tabs/DependenciesTab.esm.js +413 -0
  114. package/dist/features/environment/InstanceDrawer/tabs/DependenciesTab.esm.js.map +1 -0
  115. package/dist/features/environment/InstanceDrawer/tabs/DeploymentLogsPanel.esm.js +191 -0
  116. package/dist/features/environment/InstanceDrawer/tabs/DeploymentLogsPanel.esm.js.map +1 -0
  117. package/dist/features/environment/InstanceDrawer/tabs/DeploymentReadOnlyActions.esm.js +63 -0
  118. package/dist/features/environment/InstanceDrawer/tabs/DeploymentReadOnlyActions.esm.js.map +1 -0
  119. package/dist/features/environment/InstanceDrawer/tabs/GuideTab.esm.js +48 -0
  120. package/dist/features/environment/InstanceDrawer/tabs/GuideTab.esm.js.map +1 -0
  121. package/dist/features/environment/InstanceDrawer/tabs/HistoryTab.esm.js +446 -0
  122. package/dist/features/environment/InstanceDrawer/tabs/HistoryTab.esm.js.map +1 -0
  123. package/dist/features/environment/InstanceDrawer/tabs/MonitorTab.esm.js +146 -0
  124. package/dist/features/environment/InstanceDrawer/tabs/MonitorTab.esm.js.map +1 -0
  125. package/dist/features/environment/InstanceDrawer/tabs/OverviewTab.esm.js +572 -0
  126. package/dist/features/environment/InstanceDrawer/tabs/OverviewTab.esm.js.map +1 -0
  127. package/dist/features/environment/InstanceDrawer/tabs/ResourcesTab.esm.js +471 -0
  128. package/dist/features/environment/InstanceDrawer/tabs/ResourcesTab.esm.js.map +1 -0
  129. package/dist/features/environment/InstanceDrawer/tabs/SecretsTab.esm.js +109 -0
  130. package/dist/features/environment/InstanceDrawer/tabs/SecretsTab.esm.js.map +1 -0
  131. package/dist/features/environment/InstanceDrawer/tabs/ViewDeploymentDetails.esm.js +384 -0
  132. package/dist/features/environment/InstanceDrawer/tabs/ViewDeploymentDetails.esm.js.map +1 -0
  133. package/dist/features/environment/InstanceDrawer/tabs/flattenParams.esm.js +23 -0
  134. package/dist/features/environment/InstanceDrawer/tabs/flattenParams.esm.js.map +1 -0
  135. package/dist/features/environment/InstanceDrawer/useInstanceApiQuery.esm.js +6 -0
  136. package/dist/features/environment/InstanceDrawer/useInstanceApiQuery.esm.js.map +1 -0
  137. package/dist/features/environment/InstanceDrawer/useOverflowMeasure.esm.js +55 -0
  138. package/dist/features/environment/InstanceDrawer/useOverflowMeasure.esm.js.map +1 -0
  139. package/dist/features/environment/InstanceDrawer/useResizableWidth.esm.js +44 -0
  140. package/dist/features/environment/InstanceDrawer/useResizableWidth.esm.js.map +1 -0
  141. package/dist/features/environment/components/InstanceStatusPill.esm.js +54 -0
  142. package/dist/features/environment/components/InstanceStatusPill.esm.js.map +1 -0
  143. package/dist/features/environment/graph/Diagram.esm.js +143 -0
  144. package/dist/features/environment/graph/Diagram.esm.js.map +1 -0
  145. package/dist/features/environment/graph/DiagramNode.constants.esm.js +5 -0
  146. package/dist/features/environment/graph/DiagramNode.constants.esm.js.map +1 -0
  147. package/dist/features/environment/graph/DiagramNode.esm.js +221 -0
  148. package/dist/features/environment/graph/DiagramNode.esm.js.map +1 -0
  149. package/dist/features/environment/graph/NodeMeta.esm.js +182 -0
  150. package/dist/features/environment/graph/NodeMeta.esm.js.map +1 -0
  151. package/dist/features/environment/graph/NodeVersionBadges.esm.js +150 -0
  152. package/dist/features/environment/graph/NodeVersionBadges.esm.js.map +1 -0
  153. package/dist/features/environment/graph/diagramFactory.esm.js +151 -0
  154. package/dist/features/environment/graph/diagramFactory.esm.js.map +1 -0
  155. package/dist/features/environment/graph/handles/ExpandableHandleWrapper.esm.js +174 -0
  156. package/dist/features/environment/graph/handles/ExpandableHandleWrapper.esm.js.map +1 -0
  157. package/dist/features/environment/graph/handles/NodeHandle.esm.js +45 -0
  158. package/dist/features/environment/graph/handles/NodeHandle.esm.js.map +1 -0
  159. package/dist/features/environment/graph/handles/NodeHandleTooltip.esm.js +134 -0
  160. package/dist/features/environment/graph/handles/NodeHandleTooltip.esm.js.map +1 -0
  161. package/dist/features/environment/graph/handles/handleTypes.esm.js +170 -0
  162. package/dist/features/environment/graph/handles/handleTypes.esm.js.map +1 -0
  163. package/dist/features/environment/graph/handles/useAnimationFrameSync.esm.js +19 -0
  164. package/dist/features/environment/graph/handles/useAnimationFrameSync.esm.js.map +1 -0
  165. package/dist/features/environment/graph/handles/useRadialPositions.esm.js +37 -0
  166. package/dist/features/environment/graph/handles/useRadialPositions.esm.js.map +1 -0
  167. package/dist/features/environment/graph/handles/useTransitionLifecycle.esm.js +19 -0
  168. package/dist/features/environment/graph/handles/useTransitionLifecycle.esm.js.map +1 -0
  169. package/dist/features/environment/graph/hasUndeployedPlan.esm.js +43 -0
  170. package/dist/features/environment/graph/hasUndeployedPlan.esm.js.map +1 -0
  171. package/dist/features/environment/graph/queries.esm.js +103 -0
  172. package/dist/features/environment/graph/queries.esm.js.map +1 -0
  173. package/dist/features/environment/graph/useDiagramSnapshot.esm.js +43 -0
  174. package/dist/features/environment/graph/useDiagramSnapshot.esm.js.map +1 -0
  175. package/dist/features/environment/realtime/RealtimeProvider.esm.js +43 -0
  176. package/dist/features/environment/realtime/RealtimeProvider.esm.js.map +1 -0
  177. package/dist/features/environment/realtime/queries.esm.js +76 -0
  178. package/dist/features/environment/realtime/queries.esm.js.map +1 -0
  179. package/dist/features/environment/realtime/useLiveRelayQuery.esm.js +36 -0
  180. package/dist/features/environment/realtime/useLiveRelayQuery.esm.js.map +1 -0
  181. package/dist/features/project/ProjectDetailsPage.esm.js +101 -0
  182. package/dist/features/project/ProjectDetailsPage.esm.js.map +1 -0
  183. package/dist/features/project/tabs/ComponentsTab.esm.js +149 -0
  184. package/dist/features/project/tabs/ComponentsTab.esm.js.map +1 -0
  185. package/dist/features/project/tabs/EnvStatus.esm.js +149 -0
  186. package/dist/features/project/tabs/EnvStatus.esm.js.map +1 -0
  187. package/dist/features/project/tabs/EnvironmentsTab.esm.js +199 -0
  188. package/dist/features/project/tabs/EnvironmentsTab.esm.js.map +1 -0
  189. package/dist/features/project/tabs/OverviewTab.esm.js +420 -0
  190. package/dist/features/project/tabs/OverviewTab.esm.js.map +1 -0
  191. package/dist/features/projects/ProjectsListPage.esm.js +50 -0
  192. package/dist/features/projects/ProjectsListPage.esm.js.map +1 -0
  193. package/dist/features/projects/ProjectsListPageLazy.esm.js +12 -0
  194. package/dist/features/projects/ProjectsListPageLazy.esm.js.map +1 -0
  195. package/dist/features/projects/projectColumns.esm.js +38 -0
  196. package/dist/features/projects/projectColumns.esm.js.map +1 -0
  197. package/dist/features/projects/useProjects.esm.js +48 -0
  198. package/dist/features/projects/useProjects.esm.js.map +1 -0
  199. package/dist/features/repo/DeploymentLogsDrawer.esm.js +213 -0
  200. package/dist/features/repo/DeploymentLogsDrawer.esm.js.map +1 -0
  201. package/dist/features/repo/DeploymentLogsDrawer.loading.esm.js +43 -0
  202. package/dist/features/repo/DeploymentLogsDrawer.loading.esm.js.map +1 -0
  203. package/dist/features/repo/FileTree.esm.js +179 -0
  204. package/dist/features/repo/FileTree.esm.js.map +1 -0
  205. package/dist/features/repo/FileViewer.esm.js +115 -0
  206. package/dist/features/repo/FileViewer.esm.js.map +1 -0
  207. package/dist/features/repo/FileViewer.helpers.esm.js +54 -0
  208. package/dist/features/repo/FileViewer.helpers.esm.js.map +1 -0
  209. package/dist/features/repo/RepoDetailsPage.esm.js +127 -0
  210. package/dist/features/repo/RepoDetailsPage.esm.js.map +1 -0
  211. package/dist/features/repo/RepoEmptyState.esm.js +58 -0
  212. package/dist/features/repo/RepoEmptyState.esm.js.map +1 -0
  213. package/dist/features/repo/RepoNoVersionsState.esm.js +29 -0
  214. package/dist/features/repo/RepoNoVersionsState.esm.js.map +1 -0
  215. package/dist/features/repo/RepoTabHeader.esm.js +30 -0
  216. package/dist/features/repo/RepoTabHeader.esm.js.map +1 -0
  217. package/dist/features/repo/RepoTabLayout.esm.js +18 -0
  218. package/dist/features/repo/RepoTabLayout.esm.js.map +1 -0
  219. package/dist/features/repo/RepoVersionSelect.esm.js +176 -0
  220. package/dist/features/repo/RepoVersionSelect.esm.js.map +1 -0
  221. package/dist/features/repo/ViewDeploymentDetailsDialog.esm.js +427 -0
  222. package/dist/features/repo/ViewDeploymentDetailsDialog.esm.js.map +1 -0
  223. package/dist/features/repo/deploymentHelpers.esm.js +74 -0
  224. package/dist/features/repo/deploymentHelpers.esm.js.map +1 -0
  225. package/dist/features/repo/fileTreeHelpers.esm.js +45 -0
  226. package/dist/features/repo/fileTreeHelpers.esm.js.map +1 -0
  227. package/dist/features/repo/flattenParams.esm.js +23 -0
  228. package/dist/features/repo/flattenParams.esm.js.map +1 -0
  229. package/dist/features/repo/queries.esm.js +239 -0
  230. package/dist/features/repo/queries.esm.js.map +1 -0
  231. package/dist/features/repo/repoFilter.esm.js +9 -0
  232. package/dist/features/repo/repoFilter.esm.js.map +1 -0
  233. package/dist/features/repo/repoTabs.esm.js +22 -0
  234. package/dist/features/repo/repoTabs.esm.js.map +1 -0
  235. package/dist/features/repo/resolveVersion.esm.js +22 -0
  236. package/dist/features/repo/resolveVersion.esm.js.map +1 -0
  237. package/dist/features/repo/tabs/DeploymentRow.esm.js +201 -0
  238. package/dist/features/repo/tabs/DeploymentRow.esm.js.map +1 -0
  239. package/dist/features/repo/tabs/DeploymentsTab.esm.js +188 -0
  240. package/dist/features/repo/tabs/DeploymentsTab.esm.js.map +1 -0
  241. package/dist/features/repo/tabs/DeploymentsTab.helpers.esm.js +46 -0
  242. package/dist/features/repo/tabs/DeploymentsTab.helpers.esm.js.map +1 -0
  243. package/dist/features/repo/tabs/DeploymentsTab.loading.esm.js +37 -0
  244. package/dist/features/repo/tabs/DeploymentsTab.loading.esm.js.map +1 -0
  245. package/dist/features/repo/tabs/FilesTab.esm.js +142 -0
  246. package/dist/features/repo/tabs/FilesTab.esm.js.map +1 -0
  247. package/dist/features/repo/tabs/InstanceRow.esm.js +121 -0
  248. package/dist/features/repo/tabs/InstanceRow.esm.js.map +1 -0
  249. package/dist/features/repo/tabs/InstancesTab.esm.js +147 -0
  250. package/dist/features/repo/tabs/InstancesTab.esm.js.map +1 -0
  251. package/dist/features/repo/tabs/InstancesTab.helpers.esm.js +44 -0
  252. package/dist/features/repo/tabs/InstancesTab.helpers.esm.js.map +1 -0
  253. package/dist/features/repo/tabs/InstancesTab.loading.esm.js +33 -0
  254. package/dist/features/repo/tabs/InstancesTab.loading.esm.js.map +1 -0
  255. package/dist/features/repo/tabs/OverviewTab.esm.js +77 -0
  256. package/dist/features/repo/tabs/OverviewTab.esm.js.map +1 -0
  257. package/dist/features/repo/tabs/PermissionsTab.esm.js +56 -0
  258. package/dist/features/repo/tabs/PermissionsTab.esm.js.map +1 -0
  259. package/dist/features/repo/tabs/VersionsTab.esm.js +152 -0
  260. package/dist/features/repo/tabs/VersionsTab.esm.js.map +1 -0
  261. package/dist/features/repo/useInfiniteRelayList.esm.js +92 -0
  262. package/dist/features/repo/useInfiniteRelayList.esm.js.map +1 -0
  263. package/dist/features/repo/useInfiniteScroll.esm.js +21 -0
  264. package/dist/features/repo/useInfiniteScroll.esm.js.map +1 -0
  265. package/dist/features/repos/ReposListPage.esm.js +53 -0
  266. package/dist/features/repos/ReposListPage.esm.js.map +1 -0
  267. package/dist/features/repos/queries.esm.js +40 -0
  268. package/dist/features/repos/queries.esm.js.map +1 -0
  269. package/dist/features/repos/repoColumns.esm.js +121 -0
  270. package/dist/features/repos/repoColumns.esm.js.map +1 -0
  271. package/dist/features/repos/useRepos.esm.js +22 -0
  272. package/dist/features/repos/useRepos.esm.js.map +1 -0
  273. package/dist/features/resource/OriginChip.esm.js +42 -0
  274. package/dist/features/resource/OriginChip.esm.js.map +1 -0
  275. package/dist/features/resource/ResourceDetailsPage.esm.js +167 -0
  276. package/dist/features/resource/ResourceDetailsPage.esm.js.map +1 -0
  277. package/dist/features/resource/queries.esm.js +141 -0
  278. package/dist/features/resource/queries.esm.js.map +1 -0
  279. package/dist/features/resource/tabs/GeneralTab.esm.js +247 -0
  280. package/dist/features/resource/tabs/GeneralTab.esm.js.map +1 -0
  281. package/dist/features/resource/tabs/GeneralTab.loading.esm.js +76 -0
  282. package/dist/features/resource/tabs/GeneralTab.loading.esm.js.map +1 -0
  283. package/dist/features/resource/tabs/PermissionsTab.esm.js +57 -0
  284. package/dist/features/resource/tabs/PermissionsTab.esm.js.map +1 -0
  285. package/dist/features/resource/tabs/SettingsTabLayout.esm.js +18 -0
  286. package/dist/features/resource/tabs/SettingsTabLayout.esm.js.map +1 -0
  287. package/dist/features/resource/tabs/TabHeader.esm.js +30 -0
  288. package/dist/features/resource/tabs/TabHeader.esm.js.map +1 -0
  289. package/dist/features/resource/tabs/UsagePanel.esm.js +35 -0
  290. package/dist/features/resource/tabs/UsagePanel.esm.js.map +1 -0
  291. package/dist/features/resource/tabs/UsageTab.esm.js +91 -0
  292. package/dist/features/resource/tabs/UsageTab.esm.js.map +1 -0
  293. package/dist/features/resource/tabs/UsageTab.helpers.esm.js +168 -0
  294. package/dist/features/resource/tabs/UsageTab.helpers.esm.js.map +1 -0
  295. package/dist/features/resources/ResourcesEmptyState.esm.js +148 -0
  296. package/dist/features/resources/ResourcesEmptyState.esm.js.map +1 -0
  297. package/dist/features/resources/ResourcesListPage.esm.js +115 -0
  298. package/dist/features/resources/ResourcesListPage.esm.js.map +1 -0
  299. package/dist/features/resources/queries.esm.js +50 -0
  300. package/dist/features/resources/queries.esm.js.map +1 -0
  301. package/dist/features/resources/resourceColumns.esm.js +158 -0
  302. package/dist/features/resources/resourceColumns.esm.js.map +1 -0
  303. package/dist/features/resources/resourceConstants.esm.js +7 -0
  304. package/dist/features/resources/resourceConstants.esm.js.map +1 -0
  305. package/dist/features/resources/toResourceRow.esm.js +29 -0
  306. package/dist/features/resources/toResourceRow.esm.js.map +1 -0
  307. package/dist/hooks/useAuthedSvg.esm.js +34 -0
  308. package/dist/hooks/useAuthedSvg.esm.js.map +1 -0
  309. package/dist/hooks/useCursorPagination.esm.js +40 -0
  310. package/dist/hooks/useCursorPagination.esm.js.map +1 -0
  311. package/dist/hooks/useMassdriverSubscription.esm.js +61 -0
  312. package/dist/hooks/useMassdriverSubscription.esm.js.map +1 -0
  313. package/dist/hooks/usePaginatedRelayQuery.esm.js +68 -0
  314. package/dist/hooks/usePaginatedRelayQuery.esm.js.map +1 -0
  315. package/dist/index.d.ts +256 -0
  316. package/dist/index.esm.js +8 -0
  317. package/dist/index.esm.js.map +1 -0
  318. package/dist/internalRoutes.esm.js +29 -0
  319. package/dist/internalRoutes.esm.js.map +1 -0
  320. package/dist/plugin.esm.js +57 -0
  321. package/dist/plugin.esm.js.map +1 -0
  322. package/dist/queries.esm.js +54 -0
  323. package/dist/queries.esm.js.map +1 -0
  324. package/dist/routes.esm.js +6 -0
  325. package/dist/routes.esm.js.map +1 -0
  326. package/dist/shell/MassdriverHeader.esm.js +37 -0
  327. package/dist/shell/MassdriverHeader.esm.js.map +1 -0
  328. package/dist/shell/MassdriverShell.esm.js +30 -0
  329. package/dist/shell/MassdriverShell.esm.js.map +1 -0
  330. package/dist/theme/MassdriverThemeScope.esm.js +30 -0
  331. package/dist/theme/MassdriverThemeScope.esm.js.map +1 -0
  332. package/dist/theme/ThemeModeContext.esm.js +35 -0
  333. package/dist/theme/ThemeModeContext.esm.js.map +1 -0
  334. package/dist/theme/muiClassNameAudit.esm.js +11 -0
  335. package/dist/theme/muiClassNameAudit.esm.js.map +1 -0
  336. package/dist/useInstances.esm.js +39 -0
  337. package/dist/useInstances.esm.js.map +1 -0
  338. package/dist/utils/attributes.esm.js +28 -0
  339. package/dist/utils/attributes.esm.js.map +1 -0
  340. package/dist/utils/conditions.esm.js +20 -0
  341. package/dist/utils/conditions.esm.js.map +1 -0
  342. package/dist/utils/formatRelativeTime.esm.js +40 -0
  343. package/dist/utils/formatRelativeTime.esm.js.map +1 -0
  344. package/dist/utils/instanceStatuses.esm.js +74 -0
  345. package/dist/utils/instanceStatuses.esm.js.map +1 -0
  346. package/package.json +92 -0
@@ -0,0 +1,170 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { forwardRef } from 'react';
3
+ import { Handle } from '@xyflow/react';
4
+ import Box from '@massdriver/ui/Box';
5
+ import BluetoothIcon from '@massdriver/ui/icons/BluetoothIcon';
6
+ import stylin from '@massdriver/ui/stylin';
7
+
8
+ const HANDLE_TYPE = {
9
+ DEFAULT: "default",
10
+ REQUIRED: "required",
11
+ ERROR: "error",
12
+ REMOTE_REFERENCE: "remote-reference"
13
+ };
14
+ const DefaultHandle = forwardRef(
15
+ ({ hasConnection: _hasConnection, ...props }, ref) => /* @__PURE__ */ jsx(DefaultStyledHandle, { ...props, ref })
16
+ );
17
+ const DefaultStyledHandle = stylin(Handle, [
18
+ "xPos",
19
+ "yPos",
20
+ "isValidConnectionTarget"
21
+ ])(
22
+ ({
23
+ theme,
24
+ xPos,
25
+ yPos,
26
+ position,
27
+ isValidConnectionTarget
28
+ }) => ({
29
+ "&.react-flow__handle": {
30
+ width: "16px",
31
+ height: "16px",
32
+ top: `${yPos || 0}px`,
33
+ [position]: `${xPos || 0}px`,
34
+ borderRadius: "50%",
35
+ zIndex: 10,
36
+ background: isValidConnectionTarget ? theme.palette.success.main : theme.palette.background.paper,
37
+ border: `1px solid ${isValidConnectionTarget ? theme.palette.success.main : theme.palette.grey[600]}`,
38
+ "&.connectable": { cursor: "pointer" },
39
+ "&:hover": {
40
+ backgroundColor: isValidConnectionTarget ? theme.palette.success.main : theme.palette.grey[600]
41
+ }
42
+ }
43
+ })
44
+ );
45
+ const ErrorHandle = forwardRef(
46
+ ({ hasConnection: _hasConnection, ...props }, ref) => /* @__PURE__ */ jsx(ErrorStyledHandle, { ...props, ref, isConnectable: false })
47
+ );
48
+ const ErrorStyledHandle = stylin(Handle, ["xPos", "yPos"])(
49
+ ({
50
+ theme,
51
+ xPos,
52
+ yPos,
53
+ position
54
+ }) => ({
55
+ "&.react-flow__handle": {
56
+ width: "16px",
57
+ height: "16px",
58
+ top: `${yPos || 0}px`,
59
+ [position]: `${xPos || 0}px`,
60
+ borderRadius: "50%",
61
+ zIndex: 10,
62
+ background: theme.palette.error.main,
63
+ border: `1px solid ${theme.palette.error.main}`,
64
+ cursor: "not-allowed"
65
+ }
66
+ })
67
+ );
68
+ const REQUIRED_DOT_CLASS = "required-handle-dot";
69
+ const RequiredHandle = forwardRef(
70
+ ({ hasConnection, ...props }, ref) => /* @__PURE__ */ jsx(RequiredStyledHandle, { hasConnection, ...props, ref, children: /* @__PURE__ */ jsx(Dot, { className: REQUIRED_DOT_CLASS, hasConnection }) })
71
+ );
72
+ const RequiredStyledHandle = stylin(Handle, [
73
+ "hasConnection",
74
+ "xPos",
75
+ "yPos",
76
+ "isValidConnectionTarget"
77
+ ])(
78
+ ({
79
+ theme,
80
+ hasConnection,
81
+ xPos,
82
+ yPos,
83
+ position,
84
+ isValidConnectionTarget
85
+ }) => ({
86
+ "&.react-flow__handle": {
87
+ width: "16px",
88
+ height: "16px",
89
+ top: `${yPos || 0}px`,
90
+ [position]: `${xPos || 0}px`,
91
+ borderRadius: "50%",
92
+ zIndex: 10,
93
+ display: "flex",
94
+ alignItems: "center",
95
+ justifyContent: "center",
96
+ background: isValidConnectionTarget ? theme.palette.success.main : theme.palette.background.paper,
97
+ border: `1px solid ${isValidConnectionTarget ? theme.palette.success.main : hasConnection ? theme.palette.grey[600] : theme.palette.error.main}`,
98
+ "&.connectable": { cursor: "pointer" },
99
+ "&:hover": {
100
+ backgroundColor: isValidConnectionTarget ? theme.palette.success.main : theme.palette.grey[600],
101
+ borderColor: isValidConnectionTarget ? theme.palette.success.main : theme.palette.grey[600],
102
+ [`.${REQUIRED_DOT_CLASS}`]: {
103
+ visibility: "hidden"
104
+ }
105
+ }
106
+ }
107
+ })
108
+ );
109
+ const Dot = stylin(Box, ["hasConnection"])(
110
+ ({ theme, hasConnection }) => ({
111
+ width: "4px",
112
+ height: "4px",
113
+ borderRadius: "50%",
114
+ pointerEvents: "none",
115
+ backgroundColor: hasConnection ? theme.palette.grey[600] : theme.palette.error.main
116
+ })
117
+ );
118
+ const REMOTE_ICON_CLASS = "remote-reference-handle-icon";
119
+ const RemoteReferenceHandle = forwardRef(
120
+ ({ hasConnection, ...props }, ref) => /* @__PURE__ */ jsx(RemoteStyledHandle, { hasConnection, ...props, ref, children: /* @__PURE__ */ jsx(RemoteIcon, { className: REMOTE_ICON_CLASS }) })
121
+ );
122
+ const RemoteStyledHandle = stylin(Handle, [
123
+ "hasConnection",
124
+ "xPos",
125
+ "yPos",
126
+ "isValidConnectionTarget"
127
+ ])(
128
+ ({
129
+ theme,
130
+ xPos,
131
+ yPos,
132
+ position,
133
+ isValidConnectionTarget
134
+ }) => ({
135
+ "&.react-flow__handle": {
136
+ width: "16px",
137
+ height: "16px",
138
+ top: `${yPos || 0}px`,
139
+ [position]: `${xPos || 0}px`,
140
+ borderRadius: "50%",
141
+ zIndex: 10,
142
+ display: "flex",
143
+ alignItems: "center",
144
+ justifyContent: "center",
145
+ background: isValidConnectionTarget ? theme.palette.success.main : theme.palette.background.paper,
146
+ border: `1px solid ${theme.palette.success.main}`,
147
+ "&.connectable": { cursor: "pointer" },
148
+ "&:hover": {
149
+ backgroundColor: theme.palette.success.main,
150
+ borderColor: theme.palette.success.main,
151
+ [`.${REMOTE_ICON_CLASS}`]: { visibility: "hidden" }
152
+ }
153
+ }
154
+ })
155
+ );
156
+ const RemoteIcon = stylin(BluetoothIcon)(({ theme }) => ({
157
+ width: "8px",
158
+ height: "8px",
159
+ pointerEvents: "none",
160
+ color: theme.palette.success.main
161
+ }));
162
+ const HANDLE_TYPES = {
163
+ [HANDLE_TYPE.DEFAULT]: DefaultHandle,
164
+ [HANDLE_TYPE.REQUIRED]: RequiredHandle,
165
+ [HANDLE_TYPE.ERROR]: ErrorHandle,
166
+ [HANDLE_TYPE.REMOTE_REFERENCE]: RemoteReferenceHandle
167
+ };
168
+
169
+ export { HANDLE_TYPE, HANDLE_TYPES };
170
+ //# sourceMappingURL=handleTypes.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handleTypes.esm.js","sources":["../../../../../src/features/environment/graph/handles/handleTypes.tsx"],"sourcesContent":["import { forwardRef } from 'react';\nimport { Handle } from '@xyflow/react';\nimport Box from '@massdriver/ui/Box';\nimport BluetoothIcon from '@massdriver/ui/icons/BluetoothIcon';\nimport stylin from '@massdriver/ui/stylin';\n\n// Read-only ports of apps/web/.../NodeHandle/handle-types/*. The connect-state\n// styling (`isValidConnectionTarget`) is kept for visual parity even though\n// connections cannot be started in the read-only graph.\n\nexport const HANDLE_TYPE = {\n DEFAULT: 'default',\n REQUIRED: 'required',\n ERROR: 'error',\n REMOTE_REFERENCE: 'remote-reference',\n} as const;\n\nconst DefaultHandle = forwardRef<any, any>(\n ({ hasConnection: _hasConnection, ...props }, ref) => (\n <DefaultStyledHandle {...props} ref={ref} />\n ),\n);\n\nconst DefaultStyledHandle = stylin(Handle, [\n 'xPos',\n 'yPos',\n 'isValidConnectionTarget',\n])(\n ({\n theme,\n xPos,\n yPos,\n position,\n isValidConnectionTarget,\n }: {\n theme: any;\n xPos?: number;\n yPos?: number;\n position: string;\n isValidConnectionTarget?: boolean;\n }) => ({\n '&.react-flow__handle': {\n width: '16px',\n height: '16px',\n top: `${yPos || 0}px`,\n [position]: `${xPos || 0}px`,\n borderRadius: '50%',\n zIndex: 10,\n background: isValidConnectionTarget\n ? theme.palette.success.main\n : theme.palette.background.paper,\n border: `1px solid ${\n isValidConnectionTarget\n ? theme.palette.success.main\n : theme.palette.grey[600]\n }`,\n '&.connectable': { cursor: 'pointer' },\n '&:hover': {\n backgroundColor: isValidConnectionTarget\n ? theme.palette.success.main\n : theme.palette.grey[600],\n },\n },\n }),\n);\n\nconst ErrorHandle = forwardRef<any, any>(\n ({ hasConnection: _hasConnection, ...props }, ref) => (\n <ErrorStyledHandle {...props} ref={ref} isConnectable={false} />\n ),\n);\n\nconst ErrorStyledHandle = stylin(Handle, ['xPos', 'yPos'])(\n ({\n theme,\n xPos,\n yPos,\n position,\n }: {\n theme: any;\n xPos?: number;\n yPos?: number;\n position: string;\n }) => ({\n '&.react-flow__handle': {\n width: '16px',\n height: '16px',\n top: `${yPos || 0}px`,\n [position]: `${xPos || 0}px`,\n borderRadius: '50%',\n zIndex: 10,\n background: theme.palette.error.main,\n border: `1px solid ${theme.palette.error.main}`,\n cursor: 'not-allowed',\n },\n }),\n);\n\nconst REQUIRED_DOT_CLASS = 'required-handle-dot';\n\nconst RequiredHandle = forwardRef<any, any>(\n ({ hasConnection, ...props }, ref) => (\n <RequiredStyledHandle hasConnection={hasConnection} {...props} ref={ref}>\n <Dot className={REQUIRED_DOT_CLASS} hasConnection={hasConnection} />\n </RequiredStyledHandle>\n ),\n);\n\nconst RequiredStyledHandle = stylin(Handle, [\n 'hasConnection',\n 'xPos',\n 'yPos',\n 'isValidConnectionTarget',\n])(\n ({\n theme,\n hasConnection,\n xPos,\n yPos,\n position,\n isValidConnectionTarget,\n }: {\n theme: any;\n hasConnection?: boolean;\n xPos?: number;\n yPos?: number;\n position: string;\n isValidConnectionTarget?: boolean;\n }) => ({\n '&.react-flow__handle': {\n width: '16px',\n height: '16px',\n top: `${yPos || 0}px`,\n [position]: `${xPos || 0}px`,\n borderRadius: '50%',\n zIndex: 10,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n background: isValidConnectionTarget\n ? theme.palette.success.main\n : theme.palette.background.paper,\n border: `1px solid ${\n isValidConnectionTarget\n ? theme.palette.success.main\n : hasConnection\n ? theme.palette.grey[600]\n : theme.palette.error.main\n }`,\n '&.connectable': { cursor: 'pointer' },\n '&:hover': {\n backgroundColor: isValidConnectionTarget\n ? theme.palette.success.main\n : theme.palette.grey[600],\n borderColor: isValidConnectionTarget\n ? theme.palette.success.main\n : theme.palette.grey[600],\n [`.${REQUIRED_DOT_CLASS}`]: {\n visibility: 'hidden',\n },\n },\n },\n }),\n);\n\nconst Dot = stylin(Box, ['hasConnection'])(\n ({ theme, hasConnection }: { theme: any; hasConnection?: boolean }) => ({\n width: '4px',\n height: '4px',\n borderRadius: '50%',\n pointerEvents: 'none',\n backgroundColor: hasConnection\n ? theme.palette.grey[600]\n : theme.palette.error.main,\n }),\n);\n\nconst REMOTE_ICON_CLASS = 'remote-reference-handle-icon';\n\nconst RemoteReferenceHandle = forwardRef<any, any>(\n ({ hasConnection, ...props }, ref) => (\n <RemoteStyledHandle hasConnection={hasConnection} {...props} ref={ref}>\n <RemoteIcon className={REMOTE_ICON_CLASS} />\n </RemoteStyledHandle>\n ),\n);\n\nconst RemoteStyledHandle = stylin(Handle, [\n 'hasConnection',\n 'xPos',\n 'yPos',\n 'isValidConnectionTarget',\n])(\n ({\n theme,\n xPos,\n yPos,\n position,\n isValidConnectionTarget,\n }: {\n theme: any;\n xPos?: number;\n yPos?: number;\n position: string;\n isValidConnectionTarget?: boolean;\n }) => ({\n '&.react-flow__handle': {\n width: '16px',\n height: '16px',\n top: `${yPos || 0}px`,\n [position]: `${xPos || 0}px`,\n borderRadius: '50%',\n zIndex: 10,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n background: isValidConnectionTarget\n ? theme.palette.success.main\n : theme.palette.background.paper,\n border: `1px solid ${theme.palette.success.main}`,\n '&.connectable': { cursor: 'pointer' },\n '&:hover': {\n backgroundColor: theme.palette.success.main,\n borderColor: theme.palette.success.main,\n [`.${REMOTE_ICON_CLASS}`]: { visibility: 'hidden' },\n },\n },\n }),\n);\n\nconst RemoteIcon = stylin(BluetoothIcon)(({ theme }: { theme: any }) => ({\n width: '8px',\n height: '8px',\n pointerEvents: 'none',\n color: theme.palette.success.main,\n}));\n\nexport const HANDLE_TYPES: Record<string, any> = {\n [HANDLE_TYPE.DEFAULT]: DefaultHandle,\n [HANDLE_TYPE.REQUIRED]: RequiredHandle,\n [HANDLE_TYPE.ERROR]: ErrorHandle,\n [HANDLE_TYPE.REMOTE_REFERENCE]: RemoteReferenceHandle,\n};\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { useEffect } from 'react';
2
+ import { useUpdateNodeInternals } from '@xyflow/react';
3
+
4
+ const useAnimationFrameSync = (nodeId, isActive) => {
5
+ const updateNodeInternals = useUpdateNodeInternals();
6
+ useEffect(() => {
7
+ if (!isActive || !nodeId) return void 0;
8
+ let frame;
9
+ const tick = () => {
10
+ updateNodeInternals(nodeId);
11
+ frame = window.requestAnimationFrame(tick);
12
+ };
13
+ frame = window.requestAnimationFrame(tick);
14
+ return () => window.cancelAnimationFrame(frame);
15
+ }, [nodeId, isActive, updateNodeInternals]);
16
+ };
17
+
18
+ export { useAnimationFrameSync as default };
19
+ //# sourceMappingURL=useAnimationFrameSync.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAnimationFrameSync.esm.js","sources":["../../../../../src/features/environment/graph/handles/useAnimationFrameSync.ts"],"sourcesContent":["import { useEffect } from 'react';\nimport { useUpdateNodeInternals } from '@xyflow/react';\n\nconst useAnimationFrameSync = (nodeId: string, isActive: boolean) => {\n const updateNodeInternals = useUpdateNodeInternals();\n\n useEffect(() => {\n if (!isActive || !nodeId) return undefined;\n let frame: number;\n const tick = () => {\n updateNodeInternals(nodeId);\n frame = window.requestAnimationFrame(tick);\n };\n frame = window.requestAnimationFrame(tick);\n return () => window.cancelAnimationFrame(frame);\n }, [nodeId, isActive, updateNodeInternals]);\n};\n\nexport default useAnimationFrameSync;\n"],"names":[],"mappings":";;;AAGA,MAAM,qBAAA,GAAwB,CAAC,MAAA,EAAgB,QAAA,KAAsB;AACnE,EAAA,MAAM,sBAAsB,sBAAA,EAAuB;AAEnD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,QAAA,IAAY,CAAC,MAAA,EAAQ,OAAO,MAAA;AACjC,IAAA,IAAI,KAAA;AACJ,IAAA,MAAM,OAAO,MAAM;AACjB,MAAA,mBAAA,CAAoB,MAAM,CAAA;AAC1B,MAAA,KAAA,GAAQ,MAAA,CAAO,sBAAsB,IAAI,CAAA;AAAA,IAC3C,CAAA;AACA,IAAA,KAAA,GAAQ,MAAA,CAAO,sBAAsB,IAAI,CAAA;AACzC,IAAA,OAAO,MAAM,MAAA,CAAO,oBAAA,CAAqB,KAAK,CAAA;AAAA,EAChD,CAAA,EAAG,CAAC,MAAA,EAAQ,QAAA,EAAU,mBAAmB,CAAC,CAAA;AAC5C;;;;"}
@@ -0,0 +1,37 @@
1
+ import { useMemo } from 'react';
2
+
3
+ const toRadians = (angle) => angle * (Math.PI / 180);
4
+ const calcPositions = ({
5
+ startAngle,
6
+ endAngle,
7
+ radius,
8
+ numItems,
9
+ originX = 0,
10
+ originY = 0
11
+ }) => {
12
+ if (numItems <= 1) return [];
13
+ const angleStep = (endAngle - startAngle) / (numItems - 1);
14
+ return Array.from({ length: numItems }, (_unused, index) => {
15
+ const angle = startAngle + angleStep * index;
16
+ const x = radius * Math.cos(toRadians(angle));
17
+ const y = radius * Math.sin(toRadians(angle));
18
+ return {
19
+ xPos: originX - Number(x.toFixed(2)),
20
+ yPos: originY - Number(y.toFixed(2))
21
+ };
22
+ });
23
+ };
24
+ const useRadialPositions = ({ startAngle, endAngle, radius, numItems, originX, originY }, { skip } = {}) => useMemo(
25
+ () => skip ? void 0 : calcPositions({
26
+ startAngle,
27
+ endAngle,
28
+ radius,
29
+ numItems,
30
+ originX,
31
+ originY
32
+ }),
33
+ [skip, startAngle, endAngle, radius, numItems, originX, originY]
34
+ );
35
+
36
+ export { useRadialPositions as default };
37
+ //# sourceMappingURL=useRadialPositions.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useRadialPositions.esm.js","sources":["../../../../../src/features/environment/graph/handles/useRadialPositions.ts"],"sourcesContent":["import { useMemo } from 'react';\n\nconst toRadians = (angle: number) => angle * (Math.PI / 180);\n\ninterface RadialArgs {\n startAngle: number;\n endAngle: number;\n radius: number;\n numItems: number;\n originX?: number;\n originY?: number;\n}\n\nexport interface RadialPosition {\n xPos: number;\n yPos: number;\n}\n\nconst calcPositions = ({\n startAngle,\n endAngle,\n radius,\n numItems,\n originX = 0,\n originY = 0,\n}: RadialArgs): RadialPosition[] => {\n if (numItems <= 1) return [];\n const angleStep = (endAngle - startAngle) / (numItems - 1);\n return Array.from({ length: numItems }, (_unused, index) => {\n const angle = startAngle + angleStep * index;\n const x = radius * Math.cos(toRadians(angle));\n const y = radius * Math.sin(toRadians(angle));\n return {\n xPos: originX - Number(x.toFixed(2)),\n yPos: originY - Number(y.toFixed(2)),\n };\n });\n};\n\nconst useRadialPositions = (\n { startAngle, endAngle, radius, numItems, originX, originY }: RadialArgs,\n { skip }: { skip?: boolean } = {},\n): RadialPosition[] | undefined =>\n useMemo(\n () =>\n skip\n ? undefined\n : calcPositions({\n startAngle,\n endAngle,\n radius,\n numItems,\n originX,\n originY,\n }),\n [skip, startAngle, endAngle, radius, numItems, originX, originY],\n );\n\nexport default useRadialPositions;\n"],"names":[],"mappings":";;AAEA,MAAM,SAAA,GAAY,CAAC,KAAA,KAAkB,KAAA,IAAS,KAAK,EAAA,GAAK,GAAA,CAAA;AAgBxD,MAAM,gBAAgB,CAAC;AAAA,EACrB,UAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA,GAAU,CAAA;AAAA,EACV,OAAA,GAAU;AACZ,CAAA,KAAoC;AAClC,EAAA,IAAI,QAAA,IAAY,CAAA,EAAG,OAAO,EAAC;AAC3B,EAAA,MAAM,SAAA,GAAA,CAAa,QAAA,GAAW,UAAA,KAAe,QAAA,GAAW,CAAA,CAAA;AACxD,EAAA,OAAO,KAAA,CAAM,KAAK,EAAE,MAAA,EAAQ,UAAS,EAAG,CAAC,SAAS,KAAA,KAAU;AAC1D,IAAA,MAAM,KAAA,GAAQ,aAAa,SAAA,GAAY,KAAA;AACvC,IAAA,MAAM,IAAI,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,SAAA,CAAU,KAAK,CAAC,CAAA;AAC5C,IAAA,MAAM,IAAI,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,SAAA,CAAU,KAAK,CAAC,CAAA;AAC5C,IAAA,OAAO;AAAA,MACL,MAAM,OAAA,GAAU,MAAA,CAAO,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,MACnC,MAAM,OAAA,GAAU,MAAA,CAAO,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC;AAAA,KACrC;AAAA,EACF,CAAC,CAAA;AACH,CAAA;AAEA,MAAM,kBAAA,GAAqB,CACzB,EAAE,UAAA,EAAY,UAAU,MAAA,EAAQ,QAAA,EAAU,OAAA,EAAS,OAAA,EAAQ,EAC3D,EAAE,IAAA,EAAK,GAAwB,EAAC,KAEhC,OAAA;AAAA,EACE,MACE,IAAA,GACI,MAAA,GACA,aAAA,CAAc;AAAA,IACZ,UAAA;AAAA,IACA,QAAA;AAAA,IACA,MAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACD,CAAA;AAAA,EACP,CAAC,IAAA,EAAM,UAAA,EAAY,UAAU,MAAA,EAAQ,QAAA,EAAU,SAAS,OAAO;AACjE;;;;"}
@@ -0,0 +1,19 @@
1
+ import { useRef, useEffect } from 'react';
2
+
3
+ const useTransitionLifecycle = (onStart, onCancel) => {
4
+ const ref = useRef(null);
5
+ useEffect(() => {
6
+ const node = ref.current;
7
+ if (!node) return void 0;
8
+ node.addEventListener("transitionstart", onStart);
9
+ node.addEventListener("transitioncancel", onCancel);
10
+ return () => {
11
+ node.removeEventListener("transitionstart", onStart);
12
+ node.removeEventListener("transitioncancel", onCancel);
13
+ };
14
+ }, [onStart, onCancel]);
15
+ return ref;
16
+ };
17
+
18
+ export { useTransitionLifecycle as default };
19
+ //# sourceMappingURL=useTransitionLifecycle.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTransitionLifecycle.esm.js","sources":["../../../../../src/features/environment/graph/handles/useTransitionLifecycle.ts"],"sourcesContent":["import { useEffect, useRef } from 'react';\n\nconst useTransitionLifecycle = (\n onStart: (event: TransitionEvent) => void,\n onCancel: (event: TransitionEvent) => void,\n) => {\n const ref = useRef<HTMLElement | null>(null);\n useEffect(() => {\n const node = ref.current;\n if (!node) return undefined;\n node.addEventListener('transitionstart', onStart as EventListener);\n node.addEventListener('transitioncancel', onCancel as EventListener);\n return () => {\n node.removeEventListener('transitionstart', onStart as EventListener);\n node.removeEventListener('transitioncancel', onCancel as EventListener);\n };\n }, [onStart, onCancel]);\n return ref;\n};\n\nexport default useTransitionLifecycle;\n"],"names":[],"mappings":";;AAEA,MAAM,sBAAA,GAAyB,CAC7B,OAAA,EACA,QAAA,KACG;AACH,EAAA,MAAM,GAAA,GAAM,OAA2B,IAAI,CAAA;AAC3C,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,OAAO,GAAA,CAAI,OAAA;AACjB,IAAA,IAAI,CAAC,MAAM,OAAO,MAAA;AAClB,IAAA,IAAA,CAAK,gBAAA,CAAiB,mBAAmB,OAAwB,CAAA;AACjE,IAAA,IAAA,CAAK,gBAAA,CAAiB,oBAAoB,QAAyB,CAAA;AACnE,IAAA,OAAO,MAAM;AACX,MAAA,IAAA,CAAK,mBAAA,CAAoB,mBAAmB,OAAwB,CAAA;AACpE,MAAA,IAAA,CAAK,mBAAA,CAAoB,oBAAoB,QAAyB,CAAA;AAAA,IACxE,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,QAAQ,CAAC,CAAA;AACtB,EAAA,OAAO,GAAA;AACT;;;;"}
@@ -0,0 +1,43 @@
1
+ const parseMap = (value) => {
2
+ if (value == null) return null;
3
+ if (typeof value === "object") return value;
4
+ try {
5
+ return JSON.parse(value);
6
+ } catch {
7
+ return null;
8
+ }
9
+ };
10
+ const stripMdMetadata = (params) => {
11
+ const { md_metadata: _mdMetadata, ...rest } = params;
12
+ return rest;
13
+ };
14
+ const deepEqual = (left, right) => {
15
+ if (left === right) return true;
16
+ if (typeof left !== "object" || typeof right !== "object" || left === null || right === null) {
17
+ return false;
18
+ }
19
+ const leftIsArray = Array.isArray(left);
20
+ const rightIsArray = Array.isArray(right);
21
+ if (leftIsArray !== rightIsArray) return false;
22
+ const leftKeys = Object.keys(left);
23
+ const rightKeys = Object.keys(right);
24
+ if (leftKeys.length !== rightKeys.length) return false;
25
+ return leftKeys.every(
26
+ (key) => Object.prototype.hasOwnProperty.call(right, key) && deepEqual(
27
+ left[key],
28
+ right[key]
29
+ )
30
+ );
31
+ };
32
+ const hasUndeployedPlan = ({
33
+ instanceParams,
34
+ latestProvisionParams
35
+ } = {}) => {
36
+ const current = parseMap(instanceParams);
37
+ const lastProvisioned = parseMap(latestProvisionParams);
38
+ if (!current || !lastProvisioned) return false;
39
+ return !deepEqual(stripMdMetadata(lastProvisioned), stripMdMetadata(current));
40
+ };
41
+
42
+ export { hasUndeployedPlan as default };
43
+ //# sourceMappingURL=hasUndeployedPlan.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hasUndeployedPlan.esm.js","sources":["../../../../src/features/environment/graph/hasUndeployedPlan.ts"],"sourcesContent":["// Ported from apps/web/features/environments/utils/hasUndeployedPlan.js.\n// Compares an instance's current params against the params of its last\n// successful PROVISION deployment; drift means there is an undeployed plan.\n\nconst parseMap = (value: unknown): Record<string, unknown> | null => {\n if (value == null) return null;\n if (typeof value === 'object') return value as Record<string, unknown>;\n try {\n return JSON.parse(value as string);\n } catch {\n return null;\n }\n};\n\nconst stripMdMetadata = (\n params: Record<string, unknown>,\n): Record<string, unknown> => {\n const { md_metadata: _mdMetadata, ...rest } = params;\n return rest;\n};\n\nconst deepEqual = (left: unknown, right: unknown): boolean => {\n if (left === right) return true;\n if (\n typeof left !== 'object' ||\n typeof right !== 'object' ||\n left === null ||\n right === null\n ) {\n return false;\n }\n const leftIsArray = Array.isArray(left);\n const rightIsArray = Array.isArray(right);\n if (leftIsArray !== rightIsArray) return false;\n const leftKeys = Object.keys(left as Record<string, unknown>);\n const rightKeys = Object.keys(right as Record<string, unknown>);\n if (leftKeys.length !== rightKeys.length) return false;\n return leftKeys.every(\n key =>\n Object.prototype.hasOwnProperty.call(right, key) &&\n deepEqual(\n (left as Record<string, unknown>)[key],\n (right as Record<string, unknown>)[key],\n ),\n );\n};\n\nconst hasUndeployedPlan = ({\n instanceParams,\n latestProvisionParams,\n}: {\n instanceParams?: unknown;\n latestProvisionParams?: unknown;\n} = {}): boolean => {\n const current = parseMap(instanceParams);\n const lastProvisioned = parseMap(latestProvisionParams);\n if (!current || !lastProvisioned) return false;\n return !deepEqual(stripMdMetadata(lastProvisioned), stripMdMetadata(current));\n};\n\nexport default hasUndeployedPlan;\n"],"names":[],"mappings":"AAIA,MAAM,QAAA,GAAW,CAAC,KAAA,KAAmD;AACnE,EAAA,IAAI,KAAA,IAAS,MAAM,OAAO,IAAA;AAC1B,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AACtC,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,MAAM,KAAe,CAAA;AAAA,EACnC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF,CAAA;AAEA,MAAM,eAAA,GAAkB,CACtB,MAAA,KAC4B;AAC5B,EAAA,MAAM,EAAE,WAAA,EAAa,WAAA,EAAa,GAAG,MAAK,GAAI,MAAA;AAC9C,EAAA,OAAO,IAAA;AACT,CAAA;AAEA,MAAM,SAAA,GAAY,CAAC,IAAA,EAAe,KAAA,KAA4B;AAC5D,EAAA,IAAI,IAAA,KAAS,OAAO,OAAO,IAAA;AAC3B,EAAA,IACE,OAAO,SAAS,QAAA,IAChB,OAAO,UAAU,QAAA,IACjB,IAAA,KAAS,IAAA,IACT,KAAA,KAAU,IAAA,EACV;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,MAAM,WAAA,GAAc,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA;AACtC,EAAA,MAAM,YAAA,GAAe,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA;AACxC,EAAA,IAAI,WAAA,KAAgB,cAAc,OAAO,KAAA;AACzC,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,IAAA,CAAK,IAA+B,CAAA;AAC5D,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,IAAA,CAAK,KAAgC,CAAA;AAC9D,EAAA,IAAI,QAAA,CAAS,MAAA,KAAW,SAAA,CAAU,MAAA,EAAQ,OAAO,KAAA;AACjD,EAAA,OAAO,QAAA,CAAS,KAAA;AAAA,IACd,SACE,MAAA,CAAO,SAAA,CAAU,eAAe,IAAA,CAAK,KAAA,EAAO,GAAG,CAAA,IAC/C,SAAA;AAAA,MACG,KAAiC,GAAG,CAAA;AAAA,MACpC,MAAkC,GAAG;AAAA;AACxC,GACJ;AACF,CAAA;AAEA,MAAM,oBAAoB,CAAC;AAAA,EACzB,cAAA;AAAA,EACA;AACF,CAAA,GAGI,EAAC,KAAe;AAClB,EAAA,MAAM,OAAA,GAAU,SAAS,cAAc,CAAA;AACvC,EAAA,MAAM,eAAA,GAAkB,SAAS,qBAAqB,CAAA;AACtD,EAAA,IAAI,CAAC,OAAA,IAAW,CAAC,eAAA,EAAiB,OAAO,KAAA;AACzC,EAAA,OAAO,CAAC,SAAA,CAAU,eAAA,CAAgB,eAAe,CAAA,EAAG,eAAA,CAAgB,OAAO,CAAC,CAAA;AAC9E;;;;"}
@@ -0,0 +1,103 @@
1
+ const PROJECT_BLUEPRINT_QUERY = `
2
+ query MassdriverProjectBlueprint($organizationId: ID!, $projectId: ID!) {
3
+ project(organizationId: $organizationId, id: $projectId) {
4
+ id
5
+ components {
6
+ id
7
+ name
8
+ position { x y }
9
+ ociRepo { id name }
10
+ }
11
+ links {
12
+ id
13
+ fromField
14
+ toField
15
+ fromComponent { id }
16
+ toComponent { id }
17
+ }
18
+ }
19
+ }
20
+ `;
21
+ const ENVIRONMENT_BLUEPRINT_QUERY = `
22
+ query MassdriverEnvironmentBlueprint(
23
+ $organizationId: ID!
24
+ $environmentId: ID!
25
+ ) {
26
+ environment(organizationId: $organizationId, id: $environmentId) {
27
+ id
28
+ name
29
+ instances {
30
+ id
31
+ name
32
+ status
33
+ version
34
+ bundle {
35
+ id
36
+ name
37
+ version
38
+ icon
39
+ dependencies {
40
+ name
41
+ required
42
+ resourceType { id connectionOrientation }
43
+ }
44
+ resources {
45
+ name
46
+ required
47
+ resourceType { id connectionOrientation }
48
+ }
49
+ }
50
+ }
51
+ connections {
52
+ id
53
+ fromField
54
+ toField
55
+ fromInstance { id }
56
+ toInstance { id }
57
+ link { id }
58
+ }
59
+ }
60
+ }
61
+ `;
62
+ const NODE_META_QUERY = `
63
+ query MassdriverNodeInstanceMeta($organizationId: ID!, $id: ID!) {
64
+ instance(organizationId: $organizationId, id: $id) {
65
+ id
66
+ updatedAt
67
+ resolvedVersion
68
+ deployedVersion
69
+ availableUpgrade
70
+ params
71
+ cost {
72
+ lastDay { amount currency }
73
+ lastMonth { amount currency }
74
+ dailyAverage { amount currency }
75
+ monthlyAverage { amount currency }
76
+ }
77
+ alarms(cursor: { limit: 50 }) {
78
+ items {
79
+ id
80
+ currentState { status }
81
+ }
82
+ }
83
+ }
84
+ latestProvision: deployments(
85
+ organizationId: $organizationId
86
+ filter: {
87
+ instanceId: { eq: $id }
88
+ action: { eq: PROVISION }
89
+ status: { eq: COMPLETED }
90
+ }
91
+ sort: { field: CREATED_AT, order: DESC }
92
+ cursor: { limit: 1 }
93
+ ) {
94
+ items {
95
+ id
96
+ params
97
+ }
98
+ }
99
+ }
100
+ `;
101
+
102
+ export { ENVIRONMENT_BLUEPRINT_QUERY, NODE_META_QUERY, PROJECT_BLUEPRINT_QUERY };
103
+ //# sourceMappingURL=queries.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queries.esm.js","sources":["../../../../src/features/environment/graph/queries.ts"],"sourcesContent":["import type { Component, Connection, Instance, Link } from './diagramFactory';\n\n// Blueprint of a project's components + links (the graph's static topology).\nexport const PROJECT_BLUEPRINT_QUERY = `\n query MassdriverProjectBlueprint($organizationId: ID!, $projectId: ID!) {\n project(organizationId: $organizationId, id: $projectId) {\n id\n components {\n id\n name\n position { x y }\n ociRepo { id name }\n }\n links {\n id\n fromField\n toField\n fromComponent { id }\n toComponent { id }\n }\n }\n }\n`;\n\nexport interface ProjectBlueprintResult {\n project: {\n id: string;\n components?: Component[] | null;\n links?: Link[] | null;\n } | null;\n}\n\n// Deployed instances + live connections in an environment.\nexport const ENVIRONMENT_BLUEPRINT_QUERY = `\n query MassdriverEnvironmentBlueprint(\n $organizationId: ID!\n $environmentId: ID!\n ) {\n environment(organizationId: $organizationId, id: $environmentId) {\n id\n name\n instances {\n id\n name\n status\n version\n bundle {\n id\n name\n version\n icon\n dependencies {\n name\n required\n resourceType { id connectionOrientation }\n }\n resources {\n name\n required\n resourceType { id connectionOrientation }\n }\n }\n }\n connections {\n id\n fromField\n toField\n fromInstance { id }\n toInstance { id }\n link { id }\n }\n }\n }\n`;\n\nexport interface EnvironmentBlueprintResult {\n environment: {\n id: string;\n name?: string | null;\n instances?: Instance[] | null;\n connections?: Connection[] | null;\n } | null;\n}\n\n// Per-node metadata (cost, alarms, versions, last-edited, undeployed plan).\nexport const NODE_META_QUERY = `\n query MassdriverNodeInstanceMeta($organizationId: ID!, $id: ID!) {\n instance(organizationId: $organizationId, id: $id) {\n id\n updatedAt\n resolvedVersion\n deployedVersion\n availableUpgrade\n params\n cost {\n lastDay { amount currency }\n lastMonth { amount currency }\n dailyAverage { amount currency }\n monthlyAverage { amount currency }\n }\n alarms(cursor: { limit: 50 }) {\n items {\n id\n currentState { status }\n }\n }\n }\n latestProvision: deployments(\n organizationId: $organizationId\n filter: {\n instanceId: { eq: $id }\n action: { eq: PROVISION }\n status: { eq: COMPLETED }\n }\n sort: { field: CREATED_AT, order: DESC }\n cursor: { limit: 1 }\n ) {\n items {\n id\n params\n }\n }\n }\n`;\n\nexport interface Money {\n amount?: number | null;\n currency?: string | null;\n}\n\nexport interface NodeCost {\n lastDay?: Money | null;\n lastMonth?: Money | null;\n dailyAverage?: Money | null;\n monthlyAverage?: Money | null;\n}\n\nexport interface AlarmItem {\n id: string;\n currentState?: { status?: string | null } | null;\n}\n\nexport interface NodeMetaResult {\n instance: {\n id: string;\n updatedAt?: string | null;\n resolvedVersion?: string | null;\n deployedVersion?: string | null;\n availableUpgrade?: string | null;\n params?: unknown;\n cost?: NodeCost | null;\n alarms?: { items?: (AlarmItem | null)[] | null } | null;\n } | null;\n latestProvision?: {\n items?: Array<{ id: string; params?: unknown } | null> | null;\n } | null;\n}\n"],"names":[],"mappings":"AAGO,MAAM,uBAAA,GAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA8BhC,MAAM,2BAAA,GAA8B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoDpC,MAAM,eAAA,GAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;"}
@@ -0,0 +1,43 @@
1
+ import { useState, useCallback } from 'react';
2
+ import { toPng } from 'html-to-image';
3
+
4
+ const EXCLUDED_CLASSES = [
5
+ "react-flow__controls",
6
+ "react-flow__minimap",
7
+ "react-flow__panel"
8
+ ];
9
+ const excludeChrome = (node) => !EXCLUDED_CLASSES.some((name) => node?.classList?.contains(name));
10
+ const useDiagramSnapshot = ({
11
+ wrapperRef,
12
+ fileNameBase
13
+ }) => {
14
+ const [isSnapshotting, setIsSnapshotting] = useState(false);
15
+ const onSnapshotClick = useCallback(async () => {
16
+ const wrapper = wrapperRef?.current;
17
+ if (!wrapper) return;
18
+ setIsSnapshotting(true);
19
+ try {
20
+ const dataUrl = await toPng(wrapper, {
21
+ cacheBust: true,
22
+ backgroundColor: "#ffffff",
23
+ filter: excludeChrome
24
+ });
25
+ const link = document.createElement("a");
26
+ link.setAttribute(
27
+ "download",
28
+ `${fileNameBase}-diagram-snapshot-${(/* @__PURE__ */ new Date()).toISOString()}.png`
29
+ );
30
+ link.setAttribute("href", dataUrl);
31
+ link.click();
32
+ link.remove();
33
+ } catch (error) {
34
+ console.error("Unable to download diagram snapshot.", error);
35
+ } finally {
36
+ setIsSnapshotting(false);
37
+ }
38
+ }, [wrapperRef, fileNameBase]);
39
+ return { onSnapshotClick, isSnapshotting };
40
+ };
41
+
42
+ export { useDiagramSnapshot as default, useDiagramSnapshot };
43
+ //# sourceMappingURL=useDiagramSnapshot.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useDiagramSnapshot.esm.js","sources":["../../../../src/features/environment/graph/useDiagramSnapshot.ts"],"sourcesContent":["import { useCallback, useState, type RefObject } from 'react';\nimport { toPng } from 'html-to-image';\n\n// React Flow chrome we don't want baked into the exported image.\nconst EXCLUDED_CLASSES = [\n 'react-flow__controls',\n 'react-flow__minimap',\n 'react-flow__panel',\n];\n\nconst excludeChrome = (node: HTMLElement) =>\n !EXCLUDED_CLASSES.some(name => node?.classList?.contains(name));\n\n/**\n * Captures the diagram wrapper to a PNG and triggers a download. Ported from the\n * web app's `useDiagramSnapshot`; errors are logged rather than surfaced through\n * a snackbar (the plugin has no notice system).\n */\nexport const useDiagramSnapshot = ({\n wrapperRef,\n fileNameBase,\n}: {\n wrapperRef: RefObject<HTMLElement>;\n fileNameBase: string;\n}) => {\n const [isSnapshotting, setIsSnapshotting] = useState(false);\n\n const onSnapshotClick = useCallback(async () => {\n const wrapper = wrapperRef?.current;\n if (!wrapper) return;\n\n setIsSnapshotting(true);\n try {\n const dataUrl = await toPng(wrapper, {\n cacheBust: true,\n backgroundColor: '#ffffff',\n filter: excludeChrome,\n });\n\n const link = document.createElement('a');\n link.setAttribute(\n 'download',\n `${fileNameBase}-diagram-snapshot-${new Date().toISOString()}.png`,\n );\n link.setAttribute('href', dataUrl);\n link.click();\n link.remove();\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error('Unable to download diagram snapshot.', error);\n } finally {\n setIsSnapshotting(false);\n }\n }, [wrapperRef, fileNameBase]);\n\n return { onSnapshotClick, isSnapshotting };\n};\n\nexport default useDiagramSnapshot;\n"],"names":[],"mappings":";;;AAIA,MAAM,gBAAA,GAAmB;AAAA,EACvB,sBAAA;AAAA,EACA,qBAAA;AAAA,EACA;AACF,CAAA;AAEA,MAAM,aAAA,GAAgB,CAAC,IAAA,KACrB,CAAC,gBAAA,CAAiB,IAAA,CAAK,CAAA,IAAA,KAAQ,IAAA,EAAM,SAAA,EAAW,QAAA,CAAS,IAAI,CAAC,CAAA;AAOzD,MAAM,qBAAqB,CAAC;AAAA,EACjC,UAAA;AAAA,EACA;AACF,CAAA,KAGM;AACJ,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAI,SAAS,KAAK,CAAA;AAE1D,EAAA,MAAM,eAAA,GAAkB,YAAY,YAAY;AAC9C,IAAA,MAAM,UAAU,UAAA,EAAY,OAAA;AAC5B,IAAA,IAAI,CAAC,OAAA,EAAS;AAEd,IAAA,iBAAA,CAAkB,IAAI,CAAA;AACtB,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,MAAM,KAAA,CAAM,OAAA,EAAS;AAAA,QACnC,SAAA,EAAW,IAAA;AAAA,QACX,eAAA,EAAiB,SAAA;AAAA,QACjB,MAAA,EAAQ;AAAA,OACT,CAAA;AAED,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACvC,MAAA,IAAA,CAAK,YAAA;AAAA,QACH,UAAA;AAAA,QACA,GAAG,YAAY,CAAA,kBAAA,EAAA,qBAAyB,IAAA,EAAK,EAAE,aAAa,CAAA,IAAA;AAAA,OAC9D;AACA,MAAA,IAAA,CAAK,YAAA,CAAa,QAAQ,OAAO,CAAA;AACjC,MAAA,IAAA,CAAK,KAAA,EAAM;AACX,MAAA,IAAA,CAAK,MAAA,EAAO;AAAA,IACd,SAAS,KAAA,EAAO;AAEd,MAAA,OAAA,CAAQ,KAAA,CAAM,wCAAwC,KAAK,CAAA;AAAA,IAC7D,CAAA,SAAE;AACA,MAAA,iBAAA,CAAkB,KAAK,CAAA;AAAA,IACzB;AAAA,EACF,CAAA,EAAG,CAAC,UAAA,EAAY,YAAY,CAAC,CAAA;AAE7B,EAAA,OAAO,EAAE,iBAAiB,cAAA,EAAe;AAC3C;;;;"}
@@ -0,0 +1,43 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { useState, useRef, useEffect, createContext, useContext } from 'react';
3
+ import useMassdriverSubscription from '../../../hooks/useMassdriverSubscription.esm.js';
4
+ import { ENVIRONMENT_EVENTS_SUBSCRIPTION, PROJECT_EVENTS_SUBSCRIPTION } from './queries.esm.js';
5
+
6
+ const RealtimeRevisionContext = createContext(0);
7
+ const useRealtimeRevision = () => useContext(RealtimeRevisionContext);
8
+ const COALESCE_MS = 250;
9
+ const RealtimeProvider = ({
10
+ projectId,
11
+ environmentId,
12
+ children
13
+ }) => {
14
+ const [revision, setRevision] = useState(0);
15
+ const timerRef = useRef(void 0);
16
+ const bumpRevision = () => {
17
+ if (timerRef.current) return;
18
+ timerRef.current = setTimeout(() => {
19
+ timerRef.current = void 0;
20
+ setRevision((current) => current + 1);
21
+ }, COALESCE_MS);
22
+ };
23
+ useMassdriverSubscription(
24
+ ENVIRONMENT_EVENTS_SUBSCRIPTION,
25
+ { environmentId },
26
+ { skip: !environmentId, onData: bumpRevision }
27
+ );
28
+ useMassdriverSubscription(
29
+ PROJECT_EVENTS_SUBSCRIPTION,
30
+ { projectId },
31
+ { skip: !projectId, onData: bumpRevision }
32
+ );
33
+ useEffect(
34
+ () => () => {
35
+ if (timerRef.current) clearTimeout(timerRef.current);
36
+ },
37
+ []
38
+ );
39
+ return /* @__PURE__ */ jsx(RealtimeRevisionContext.Provider, { value: revision, children });
40
+ };
41
+
42
+ export { RealtimeProvider, useRealtimeRevision };
43
+ //# sourceMappingURL=RealtimeProvider.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RealtimeProvider.esm.js","sources":["../../../../src/features/environment/realtime/RealtimeProvider.tsx"],"sourcesContent":["import {\n createContext,\n useContext,\n useEffect,\n useRef,\n useState,\n type ReactNode,\n} from 'react';\nimport { useMassdriverSubscription } from '../../../hooks/useMassdriverSubscription';\nimport {\n ENVIRONMENT_EVENTS_SUBSCRIPTION,\n PROJECT_EVENTS_SUBSCRIPTION,\n} from './queries';\n\n// A monotonically-increasing revision that bumps whenever the environment emits\n// an event. Data hooks (graph snapshot, drawer tabs) include it in their\n// `useAsync` deps to refetch on change — the plugin has no Apollo cache to merge\n// live payloads into, so \"refetch on event\" is how the read-only views stay\n// live. Default 0 outside a provider (hooks simply never refetch from realtime).\nconst RealtimeRevisionContext = createContext(0);\n\n/** Latest realtime revision for the surrounding environment. */\nexport const useRealtimeRevision = (): number =>\n useContext(RealtimeRevisionContext);\n\n// Coalesce bursts of events (a deployment can emit many in a tick) into a single\n// refetch on the trailing edge.\nconst COALESCE_MS = 250;\n\n/**\n * Mounts the environment-events and project-events subscriptions and exposes a\n * debounced revision to descendants. Wrap the environment graph page so the\n * graph and instance drawer refetch when the environment changes in the web\n * app. Both scopes are required: instances/deployments/connections/alarms are\n * environment events, but the blueprint half of the graph — components, their\n * positions, and links — only emits project events.\n */\nexport const RealtimeProvider = ({\n projectId,\n environmentId,\n children,\n}: {\n projectId: string;\n environmentId: string;\n children: ReactNode;\n}) => {\n const [revision, setRevision] = useState(0);\n const timerRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n\n // Shared across both subscriptions so a burst spanning scopes (a deploy\n // emits project and environment events) still coalesces into one refetch.\n const bumpRevision = () => {\n if (timerRef.current) return;\n timerRef.current = setTimeout(() => {\n timerRef.current = undefined;\n setRevision(current => current + 1);\n }, COALESCE_MS);\n };\n\n useMassdriverSubscription(\n ENVIRONMENT_EVENTS_SUBSCRIPTION,\n { environmentId },\n { skip: !environmentId, onData: bumpRevision },\n );\n\n useMassdriverSubscription(\n PROJECT_EVENTS_SUBSCRIPTION,\n { projectId },\n { skip: !projectId, onData: bumpRevision },\n );\n\n useEffect(\n () => () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n },\n [],\n );\n\n return (\n <RealtimeRevisionContext.Provider value={revision}>\n {children}\n </RealtimeRevisionContext.Provider>\n );\n};\n\nexport default RealtimeProvider;\n"],"names":[],"mappings":";;;;;AAmBA,MAAM,uBAAA,GAA0B,cAAc,CAAC,CAAA;AAGxC,MAAM,mBAAA,GAAsB,MACjC,UAAA,CAAW,uBAAuB;AAIpC,MAAM,WAAA,GAAc,GAAA;AAUb,MAAM,mBAAmB,CAAC;AAAA,EAC/B,SAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAA,KAIM;AACJ,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,SAAS,CAAC,CAAA;AAC1C,EAAA,MAAM,QAAA,GAAW,OAAkD,MAAS,CAAA;AAI5E,EAAA,MAAM,eAAe,MAAM;AACzB,IAAA,IAAI,SAAS,OAAA,EAAS;AACtB,IAAA,QAAA,CAAS,OAAA,GAAU,WAAW,MAAM;AAClC,MAAA,QAAA,CAAS,OAAA,GAAU,MAAA;AACnB,MAAA,WAAA,CAAY,CAAA,OAAA,KAAW,UAAU,CAAC,CAAA;AAAA,IACpC,GAAG,WAAW,CAAA;AAAA,EAChB,CAAA;AAEA,EAAA,yBAAA;AAAA,IACE,+BAAA;AAAA,IACA,EAAE,aAAA,EAAc;AAAA,IAChB,EAAE,IAAA,EAAM,CAAC,aAAA,EAAe,QAAQ,YAAA;AAAa,GAC/C;AAEA,EAAA,yBAAA;AAAA,IACE,2BAAA;AAAA,IACA,EAAE,SAAA,EAAU;AAAA,IACZ,EAAE,IAAA,EAAM,CAAC,SAAA,EAAW,QAAQ,YAAA;AAAa,GAC3C;AAEA,EAAA,SAAA;AAAA,IACE,MAAM,MAAM;AACV,MAAA,IAAI,QAAA,CAAS,OAAA,EAAS,YAAA,CAAa,QAAA,CAAS,OAAO,CAAA;AAAA,IACrD,CAAA;AAAA,IACA;AAAC,GACH;AAEA,EAAA,2BACG,uBAAA,CAAwB,QAAA,EAAxB,EAAiC,KAAA,EAAO,UACtC,QAAA,EACH,CAAA;AAEJ;;;;"}
@@ -0,0 +1,76 @@
1
+ const ENVIRONMENT_EVENTS_SUBSCRIPTION = `
2
+ subscription MassdriverEnvironmentEvents(
3
+ $organizationId: ID!
4
+ $environmentId: ID!
5
+ ) {
6
+ environmentEvents(
7
+ organizationId: $organizationId
8
+ environmentId: $environmentId
9
+ ) {
10
+ ... on Event {
11
+ action
12
+ timestamp
13
+ }
14
+ ... on InstanceEvent {
15
+ instance { id status version }
16
+ }
17
+ ... on DeploymentEvent {
18
+ deployment { id status }
19
+ }
20
+ ... on ConnectionEvent {
21
+ connection { id }
22
+ }
23
+ ... on AlarmEvent {
24
+ alarm { id currentState { id status } }
25
+ }
26
+ ... on EnvironmentDefaultEvent {
27
+ environmentDefault { id }
28
+ }
29
+ }
30
+ }
31
+ `;
32
+ const PROJECT_EVENTS_SUBSCRIPTION = `
33
+ subscription MassdriverProjectEvents(
34
+ $organizationId: ID!
35
+ $projectId: ID!
36
+ ) {
37
+ projectEvents(
38
+ organizationId: $organizationId
39
+ projectId: $projectId
40
+ ) {
41
+ ... on Event {
42
+ action
43
+ timestamp
44
+ }
45
+ ... on ProjectEvent {
46
+ project { id }
47
+ }
48
+ ... on EnvironmentEvent {
49
+ environment { id }
50
+ }
51
+ ... on ComponentEvent {
52
+ component { id position { x y } }
53
+ }
54
+ ... on LinkEvent {
55
+ link { id }
56
+ }
57
+ }
58
+ }
59
+ `;
60
+ const DEPLOYMENT_LOGS_SUBSCRIPTION = `
61
+ subscription MassdriverDeploymentLogs(
62
+ $organizationId: ID!
63
+ $deploymentId: ID!
64
+ ) {
65
+ deploymentLogs(
66
+ organizationId: $organizationId
67
+ deploymentId: $deploymentId
68
+ ) {
69
+ timestamp
70
+ message
71
+ }
72
+ }
73
+ `;
74
+
75
+ export { DEPLOYMENT_LOGS_SUBSCRIPTION, ENVIRONMENT_EVENTS_SUBSCRIPTION, PROJECT_EVENTS_SUBSCRIPTION };
76
+ //# sourceMappingURL=queries.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queries.esm.js","sources":["../../../../src/features/environment/realtime/queries.ts"],"sourcesContent":["// Subscription documents for the environment graph's live updates. Proxied\n// through the backend SSE relay, which injects `organizationId` (callers pass\n// only the remaining variables). Every normalizable selection includes `id`.\n\n// Fires whenever anything in the environment changes — an instance's status or\n// version, a deployment's lifecycle, a connection, an alarm's firing state, or\n// an environment default. The drawer/graph don't keep an Apollo cache, so the\n// payload is only used to trigger a refetch; we still select id-bearing fields\n// so the document is valid and future consumers can read from it.\nexport const ENVIRONMENT_EVENTS_SUBSCRIPTION = `\n subscription MassdriverEnvironmentEvents(\n $organizationId: ID!\n $environmentId: ID!\n ) {\n environmentEvents(\n organizationId: $organizationId\n environmentId: $environmentId\n ) {\n ... on Event {\n action\n timestamp\n }\n ... on InstanceEvent {\n instance { id status version }\n }\n ... on DeploymentEvent {\n deployment { id status }\n }\n ... on ConnectionEvent {\n connection { id }\n }\n ... on AlarmEvent {\n alarm { id currentState { id status } }\n }\n ... on EnvironmentDefaultEvent {\n environmentDefault { id }\n }\n }\n }\n`;\n\n// Blueprint-side changes — component adds/removes/moves (position), links, and\n// environment metadata — are project-scoped and flow through `projectEvents`,\n// NOT `environmentEvents`. Without this the graph never refetches when someone\n// rearranges or rewires the design in the web app. Same refetch-only contract\n// as above: the payload just bumps the revision.\nexport const PROJECT_EVENTS_SUBSCRIPTION = `\n subscription MassdriverProjectEvents(\n $organizationId: ID!\n $projectId: ID!\n ) {\n projectEvents(\n organizationId: $organizationId\n projectId: $projectId\n ) {\n ... on Event {\n action\n timestamp\n }\n ... on ProjectEvent {\n project { id }\n }\n ... on EnvironmentEvent {\n environment { id }\n }\n ... on ComponentEvent {\n component { id position { x y } }\n }\n ... on LinkEvent {\n link { id }\n }\n }\n }\n`;\n\n// Streams one batch of appended log lines per worker flush for a single\n// deployment. Unlike the query backfill, it sends only the new lines.\nexport const DEPLOYMENT_LOGS_SUBSCRIPTION = `\n subscription MassdriverDeploymentLogs(\n $organizationId: ID!\n $deploymentId: ID!\n ) {\n deploymentLogs(\n organizationId: $organizationId\n deploymentId: $deploymentId\n ) {\n timestamp\n message\n }\n }\n`;\n"],"names":[],"mappings":"AASO,MAAM,+BAAA,GAAkC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqCxC,MAAM,2BAAA,GAA8B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA+BpC,MAAM,4BAAA,GAA+B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;"}