@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 @@
1
+ {"version":3,"file":"ViewDeploymentDetails.esm.js","sources":["../../../../../src/features/environment/InstanceDrawer/tabs/ViewDeploymentDetails.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport { useApi } from '@backstage/frontend-plugin-api';\nimport useAsync from 'react-use/esm/useAsync';\nimport {\n Dialog,\n DialogActions,\n DialogContent,\n DialogHeader,\n} from '@massdriver/ui/Dialog';\nimport Box from '@massdriver/ui/Box';\nimport Typography from '@massdriver/ui/Typography';\nimport Button from '@massdriver/ui/Button';\nimport IconButton from '@massdriver/ui/IconButton';\nimport CopyButton from '@massdriver/ui/CopyButton';\nimport Alert from '@massdriver/ui/Alert';\nimport LoadingIndicator from '@massdriver/ui/LoadingIndicator';\nimport DataList, { col } from '@massdriver/ui/DataList';\nimport stylin from '@massdriver/ui/stylin';\nimport CloseIcon from '@massdriver/ui/icons/CloseIcon';\nimport HistoryIcon from '@massdriver/ui/icons/HistoryIcon';\nimport { massdriverApiRef } from '../../../../api';\nimport InstanceStatusPill from '../../components/InstanceStatusPill';\nimport { composeInstanceStatus } from '../../../../utils/instanceStatuses';\nimport VersionBadge from '../../../../components/VersionBadge';\nimport ComparisonValueCell from '../../CompareEnvironmentsDialog/ComparisonValueCell';\nimport { DEPLOYMENT_QUERY } from '../queries';\nimport {\n formatAbsoluteDateTime,\n formatAttributeValue,\n formatDeploymentStatus,\n formatElapsed,\n deploymentHasLogs,\n formatRelativeTime,\n parseMap,\n parsePlanMessage,\n parseRollbackMessage,\n stripMessageContext,\n truncateDeploymentId,\n} from '../helpers';\nimport type { DeploymentDetail } from '../types';\nimport flattenParams from './flattenParams';\nimport { useOpenLogs } from './DeploymentLogsPanel';\nimport {\n DisabledApprovalCluster,\n DisabledRollbackButton,\n LogsButton,\n} from './DeploymentReadOnlyActions';\n\nconst renderValueCell = (_value: unknown, row: { value: unknown }) => (\n <ComparisonValueCell\n side={{ present: true, value: row.value }}\n isDifferent={false}\n isMissing={false}\n />\n);\n\nconst COLUMNS = [\n col.text('path', 'Path', {\n flex: 2,\n minWidth: 200,\n sortable: true,\n searchable: true,\n }),\n col.custom('value', 'Value', renderValueCell, {\n flex: 3,\n minWidth: 220,\n sortable: false,\n searchable: false,\n }),\n];\n\nconst buildHeading = (\n componentName?: string | null,\n statusLabel?: string,\n): string => {\n const verb =\n statusLabel && statusLabel !== '—' ? statusLabel.toLowerCase() : null;\n if (!componentName && !verb) return 'Deployment';\n if (!verb) return `${componentName} deployment`;\n return componentName ? `${componentName} · ${verb}` : verb;\n};\n\n/**\n * Read-only deployment detail panel. Fetches the full deployment snapshot and\n * renders a summary def-list, attributes, and a flattened params DataList. All\n * mutating actions are disabled (tooltip → Massdriver); \"View logs\" opens the\n * in-app read-only logs overlay (closing this dialog first, since the logs\n * overlay lives inside the drawer beneath this dialog's portal).\n */\nexport const ViewDeploymentDetails = ({\n deploymentId,\n onClose,\n onShowSource,\n}: {\n deploymentId: string | null;\n onClose: () => void;\n onShowSource: (sourceId: string) => void;\n}) => {\n const api = useApi(massdriverApiRef);\n const openLogs = useOpenLogs();\n const open = Boolean(deploymentId);\n\n const { value, loading, error } = useAsync(async () => {\n if (!deploymentId) return null;\n const data = (await api.query(DEPLOYMENT_QUERY, { id: deploymentId })) as {\n deployment: DeploymentDetail | null;\n };\n return data.deployment;\n }, [api, deploymentId]);\n\n const deployment = value;\n const paramRows = useMemo(\n () => flattenParams(deployment?.params),\n [deployment?.params],\n );\n\n const statusLabel = formatDeploymentStatus(\n deployment?.action,\n deployment?.status,\n );\n const componentName = deployment?.instance?.component?.name;\n const elapsed = formatElapsed(deployment?.elapsedTime);\n const occurredIso = deployment?.lastTransitionedAt ?? deployment?.createdAt;\n const time = formatRelativeTime(occurredIso);\n const absoluteDate = formatAbsoluteDateTime(occurredIso);\n const deployedBy = deployment?.deployedBy ?? 'system';\n const heading = buildHeading(componentName, statusLabel);\n\n const planSource =\n deployment?.action === 'PLAN'\n ? parsePlanMessage(deployment?.message)\n : null;\n const rollbackSource = parseRollbackMessage(deployment?.message);\n const displayMessage = stripMessageContext(deployment?.message);\n const isProposed = deployment?.status === 'PROPOSED';\n const isRollbackEligible =\n deployment?.action === 'PROVISION' && deployment?.status === 'COMPLETED';\n const hasLogs = deploymentHasLogs(deployment?.status);\n\n const handleViewLogs = () => {\n if (!deployment) return;\n onClose();\n openLogs(deployment.id);\n };\n\n const attributes = parseMap(deployment?.effectiveAttributes);\n const attributeEntries = attributes ? Object.entries(attributes) : [];\n\n return (\n <Dialog open={open} onClose={onClose} maxWidth=\"md\" fullWidth>\n <DialogHeader\n icon={<HistoryIcon />}\n actions={\n <IconButton onClick={onClose} aria-label=\"Close deployment details\">\n <CloseIcon />\n </IconButton>\n }\n >\n {heading}\n </DialogHeader>\n <Body>\n {loading ? (\n <Centered>\n <LoadingIndicator />\n </Centered>\n ) : error ? (\n <Alert severity=\"error\">{String(error.message ?? error)}</Alert>\n ) : deployment ? (\n <>\n <SummaryCard>\n <SummaryHeader>\n <SummaryHeaderLeft>\n <InstanceStatusPill\n status={composeInstanceStatus(\n deployment.action,\n deployment.status,\n )}\n onClick={hasLogs ? handleViewLogs : undefined}\n />\n {deployment.version ? (\n <VersionBadge version={deployment.version} />\n ) : null}\n </SummaryHeaderLeft>\n {isProposed ? (\n <DisabledApprovalCluster />\n ) : (\n <HeaderActions>\n {isRollbackEligible ? <DisabledRollbackButton /> : null}\n {hasLogs ? <LogsButton onClick={handleViewLogs} /> : null}\n </HeaderActions>\n )}\n </SummaryHeader>\n\n <DefList>\n <DefRow>\n <DefLabel>Status</DefLabel>\n <DefValue>{statusLabel}</DefValue>\n </DefRow>\n <DefRow>\n <DefLabel>Occurred</DefLabel>\n <DefValue>\n {time}\n {absoluteDate ? (\n <DefMuted>{` · ${absoluteDate}`}</DefMuted>\n ) : null}\n </DefValue>\n </DefRow>\n <DefRow>\n <DefLabel>Duration</DefLabel>\n <DefValue>{elapsed ?? '—'}</DefValue>\n </DefRow>\n <DefRow>\n <DefLabel>Deployed by</DefLabel>\n <DefValue>\n <strong>{deployedBy}</strong>\n </DefValue>\n </DefRow>\n <DefRow>\n <DefLabel>Deployment ID</DefLabel>\n <DefValue>\n <Mono>{deployment.id}</Mono>\n <CopyButton\n text={deployment.id}\n ariaLabel=\"Copy deployment ID\"\n />\n </DefValue>\n </DefRow>\n </DefList>\n\n {planSource ? (\n <PlanSourceBlock>\n <PlanSourceLink\n variant=\"text\"\n size=\"small\"\n onClick={() => onShowSource(planSource.sourceId)}\n >\n Planned deployment of{' '}\n {truncateDeploymentId(planSource.sourceId)}\n </PlanSourceLink>\n {displayMessage ? (\n <MessageQuote>\"{displayMessage}\"</MessageQuote>\n ) : null}\n </PlanSourceBlock>\n ) : rollbackSource ? (\n <PlanSourceBlock>\n <PlanSourceLink\n variant=\"text\"\n size=\"small\"\n onClick={() => onShowSource(rollbackSource.sourceId)}\n >\n {isProposed\n ? 'Proposed rollback to deployment'\n : 'Rollback to deployment'}{' '}\n {truncateDeploymentId(rollbackSource.sourceId)}\n {rollbackSource.version\n ? ` (v${rollbackSource.version})`\n : ''}\n </PlanSourceLink>\n {displayMessage ? (\n <MessageQuote>\"{displayMessage}\"</MessageQuote>\n ) : null}\n </PlanSourceBlock>\n ) : displayMessage ? (\n <MessageQuote>\"{displayMessage}\"</MessageQuote>\n ) : null}\n </SummaryCard>\n\n <Section>\n <SectionHeading variant=\"subtitle1\">Attributes</SectionHeading>\n <Card>\n {attributeEntries.length === 0 ? (\n <EmptyNote>No effective attributes.</EmptyNote>\n ) : (\n attributeEntries.map(([key, attrValue]) => (\n <RowLine key={key}>\n <MonoLabel title={key}>{key}</MonoLabel>\n <MonoValue title={formatAttributeValue(attrValue)}>\n {formatAttributeValue(attrValue)}\n </MonoValue>\n </RowLine>\n ))\n )}\n </Card>\n </Section>\n\n <Section>\n <SectionHeading variant=\"subtitle1\">\n Snapshot params\n </SectionHeading>\n <DataList\n rows={paramRows}\n columns={COLUMNS}\n searchable\n searchPlaceholder=\"Search path…\"\n defaultSort={{ field: 'path', direction: 'asc' }}\n defaultPageSize={5}\n variant=\"outlined\"\n size=\"small\"\n emptyMessage=\"No parameters captured for this deployment.\"\n />\n </Section>\n </>\n ) : null}\n </Body>\n <DialogActions>\n <Button variant=\"contained\" onClick={onClose}>\n Close\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n\nexport default ViewDeploymentDetails;\n\nconst Body = stylin(DialogContent)(({ theme }: { theme: any }) => ({\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing(2),\n '& > *': {\n flexShrink: 0,\n },\n}));\n\nconst Centered = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n justifyContent: 'center',\n padding: theme.spacing(6),\n}));\n\nconst SummaryCard = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing(2.5),\n padding: theme.spacing(2.5, 3),\n borderRadius: 1,\n border: `1px solid ${theme.palette.divider}`,\n backgroundColor: theme.palette.background.paper,\n}));\n\nconst SummaryHeader = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n flexWrap: 'wrap',\n gap: theme.spacing(1.5),\n}));\n\nconst SummaryHeaderLeft = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n alignItems: 'center',\n flexWrap: 'wrap',\n gap: theme.spacing(1.5),\n}));\n\nconst HeaderActions = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(1),\n}));\n\nconst DefList = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing(1.25),\n}));\n\nconst DefRow = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'grid',\n gridTemplateColumns: `${theme.spacing(18)} 1fr`,\n alignItems: 'center',\n gap: theme.spacing(2),\n [theme.breakpoints.down('sm')]: {\n gridTemplateColumns: '1fr',\n gap: theme.spacing(0.25),\n },\n}));\n\nconst DefLabel = stylin(Typography)(({ theme }: { theme: any }) => ({\n color: theme.palette.text.secondary,\n fontSize: theme.typography.body2.fontSize,\n textTransform: 'uppercase',\n letterSpacing: '0.04em',\n fontWeight: theme.typography.fontWeightMedium,\n}));\n\nconst DefValue = stylin(Typography)(({ theme }: { theme: any }) => ({\n color: theme.palette.text.primary,\n fontSize: theme.typography.body1.fontSize,\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(0.75),\n minWidth: 0,\n}));\n\nconst DefMuted = stylin('span')(({ theme }: { theme: any }) => ({\n color: theme.palette.text.secondary,\n}));\n\nconst Mono = stylin('span')(({ theme }: { theme: any }) => ({\n fontFamily: theme.typography.fontFamilyMono,\n fontSize: theme.typography.body2.fontSize,\n color: theme.palette.text.primary,\n wordBreak: 'break-all',\n minWidth: 0,\n}));\n\nconst MessageQuote = stylin(Box)(({ theme }: { theme: any }) => ({\n fontStyle: 'italic',\n color: theme.palette.text.secondary,\n borderLeft: `3px solid ${theme.palette.divider}`,\n paddingLeft: theme.spacing(1.5),\n paddingTop: theme.spacing(0.5),\n paddingBottom: theme.spacing(0.5),\n}));\n\nconst PlanSourceBlock = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing(1),\n alignItems: 'flex-start',\n}));\n\nconst PlanSourceLink = stylin(Button)(({ theme }: { theme: any }) => ({\n alignSelf: 'flex-start',\n padding: theme.spacing(0.25, 1),\n marginLeft: theme.spacing(-1),\n}));\n\nconst Section = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing(1),\n}));\n\nconst SectionHeading = stylin(Typography)(({ theme }: { theme: any }) => ({\n fontWeight: theme.typography.fontWeightBold,\n}));\n\nconst Card = stylin(Box)(({ theme }: { theme: any }) => ({\n border: `1px solid ${theme.palette.divider}`,\n borderRadius: 1,\n padding: theme.spacing(1),\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing(0.5),\n overflow: 'hidden',\n}));\n\nconst RowLine = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(1),\n flexWrap: 'wrap',\n minWidth: 0,\n}));\n\nconst MonoLabel = stylin(Typography)(({ theme }: { theme: any }) => ({\n fontSize: theme.typography.pxToRem(11),\n color: theme.palette.text.secondary,\n minWidth: 110,\n fontFamily: theme.typography.fontFamilyMono,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n}));\n\nconst MonoValue = stylin(Typography)(({ theme }: { theme: any }) => ({\n fontSize: theme.typography.pxToRem(12),\n color: theme.palette.text.primary,\n fontFamily: theme.typography.fontFamilyMono,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n flex: 1,\n minWidth: 0,\n}));\n\nconst EmptyNote = stylin(Typography)(({ theme }: { theme: any }) => ({\n fontSize: theme.typography.pxToRem(12),\n color: theme.palette.text.secondary,\n fontStyle: 'italic',\n}));\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ const flattenParams = (params, basePath = "") => {
2
+ if (basePath === "" && params == null) return [];
3
+ if (params === null || typeof params !== "object") {
4
+ return [{ id: basePath || "$", path: basePath || "$", value: params }];
5
+ }
6
+ if (Array.isArray(params)) {
7
+ if (params.length === 0) {
8
+ return [{ id: basePath || "$", path: basePath || "$", value: [] }];
9
+ }
10
+ return params.flatMap(
11
+ (item, index) => flattenParams(item, `${basePath}[${index}]`)
12
+ );
13
+ }
14
+ const record = params;
15
+ const keys = Object.keys(record);
16
+ if (keys.length === 0) {
17
+ return [{ id: basePath || "$", path: basePath || "$", value: {} }];
18
+ }
19
+ return keys.flatMap((key) => flattenParams(record[key], `${basePath}.${key}`));
20
+ };
21
+
22
+ export { flattenParams as default };
23
+ //# sourceMappingURL=flattenParams.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flattenParams.esm.js","sources":["../../../../../src/features/environment/InstanceDrawer/tabs/flattenParams.ts"],"sourcesContent":["// Walks a JSON object/array recursively and yields one row per leaf value.\n// Leaf rows have jq-style paths (e.g. `.database.port`, `.containers[0].image`)\n// — the same convention `compareDeployments` uses for `ParamComparison.path`,\n// keeping the detail panel's display consistent with the diff dialog. Ported\n// verbatim from the web app's ViewDeploymentDetailsDialog/flattenParams.js.\nexport interface ParamRow {\n id: string;\n path: string;\n value: unknown;\n}\n\nconst flattenParams = (params: unknown, basePath = ''): ParamRow[] => {\n if (basePath === '' && params == null) return [];\n if (params === null || typeof params !== 'object') {\n return [{ id: basePath || '$', path: basePath || '$', value: params }];\n }\n if (Array.isArray(params)) {\n if (params.length === 0) {\n return [{ id: basePath || '$', path: basePath || '$', value: [] }];\n }\n return params.flatMap((item, index) =>\n flattenParams(item, `${basePath}[${index}]`),\n );\n }\n const record = params as Record<string, unknown>;\n const keys = Object.keys(record);\n if (keys.length === 0) {\n return [{ id: basePath || '$', path: basePath || '$', value: {} }];\n }\n return keys.flatMap(key => flattenParams(record[key], `${basePath}.${key}`));\n};\n\nexport default flattenParams;\n"],"names":[],"mappings":"AAWA,MAAM,aAAA,GAAgB,CAAC,MAAA,EAAiB,QAAA,GAAW,EAAA,KAAmB;AACpE,EAAA,IAAI,QAAA,KAAa,EAAA,IAAM,MAAA,IAAU,IAAA,SAAa,EAAC;AAC/C,EAAA,IAAI,MAAA,KAAW,IAAA,IAAQ,OAAO,MAAA,KAAW,QAAA,EAAU;AACjD,IAAA,OAAO,CAAC,EAAE,EAAA,EAAI,QAAA,IAAY,GAAA,EAAK,MAAM,QAAA,IAAY,GAAA,EAAK,KAAA,EAAO,MAAA,EAAQ,CAAA;AAAA,EACvE;AACA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AACzB,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,MAAA,OAAO,CAAC,EAAE,EAAA,EAAI,QAAA,IAAY,GAAA,EAAK,IAAA,EAAM,QAAA,IAAY,GAAA,EAAK,KAAA,EAAO,EAAC,EAAG,CAAA;AAAA,IACnE;AACA,IAAA,OAAO,MAAA,CAAO,OAAA;AAAA,MAAQ,CAAC,MAAM,KAAA,KAC3B,aAAA,CAAc,MAAM,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,CAAG;AAAA,KAC7C;AAAA,EACF;AACA,EAAA,MAAM,MAAA,GAAS,MAAA;AACf,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA;AAC/B,EAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,IAAA,OAAO,CAAC,EAAE,EAAA,EAAI,QAAA,IAAY,GAAA,EAAK,IAAA,EAAM,QAAA,IAAY,GAAA,EAAK,KAAA,EAAO,EAAC,EAAG,CAAA;AAAA,EACnE;AACA,EAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,CAAA,GAAA,KAAO,aAAA,CAAc,MAAA,CAAO,GAAG,CAAA,EAAG,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,GAAG,CAAA,CAAE,CAAC,CAAA;AAC7E;;;;"}
@@ -0,0 +1,6 @@
1
+ import { useLiveRelayQuery } from '../realtime/useLiveRelayQuery.esm.js';
2
+
3
+ const useInstanceApiQuery = (query, id) => useLiveRelayQuery(query, id ? { id } : null);
4
+
5
+ export { useInstanceApiQuery };
6
+ //# sourceMappingURL=useInstanceApiQuery.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useInstanceApiQuery.esm.js","sources":["../../../../src/features/environment/InstanceDrawer/useInstanceApiQuery.ts"],"sourcesContent":["import { useLiveRelayQuery } from '../realtime/useLiveRelayQuery';\n\n// Thin relay-query wrapper shared by every drawer tab. Skips when there is no\n// instance id yet (drawer closed / unresolved). Stays live through the\n// environment's realtime revision: revision refetches keep the previous result\n// rendered (no loading flash), while switching instances resets to a fresh\n// loading state — see useLiveRelayQuery.\nexport const useInstanceApiQuery = <T>(query: string, id: string | null) =>\n useLiveRelayQuery<T>(query, id ? { id } : null);\n"],"names":[],"mappings":";;AAOO,MAAM,mBAAA,GAAsB,CAAI,KAAA,EAAe,EAAA,KACpD,iBAAA,CAAqB,OAAO,EAAA,GAAK,EAAE,EAAA,EAAG,GAAI,IAAI;;;;"}
@@ -0,0 +1,55 @@
1
+ import { useState, useRef, useCallback, useEffect } from 'react';
2
+
3
+ const useOverflowMeasure = ({
4
+ itemCount,
5
+ minVisible,
6
+ moreButtonWidth
7
+ }) => {
8
+ const [visibleCount, setVisibleCount] = useState(itemCount);
9
+ const [measured, setMeasured] = useState(false);
10
+ const containerRef = useRef(null);
11
+ const tabWidthsRef = useRef([]);
12
+ const measure = useCallback(() => {
13
+ const container = containerRef.current;
14
+ if (!container) return;
15
+ if (tabWidthsRef.current.length === 0) {
16
+ const tabElements = container.querySelectorAll('[role="tab"]');
17
+ if (tabElements.length === 0) return;
18
+ tabWidthsRef.current = Array.from(tabElements).map(
19
+ (element) => element.getBoundingClientRect().width
20
+ );
21
+ setMeasured(true);
22
+ }
23
+ const widths = tabWidthsRef.current;
24
+ const containerWidth = container.getBoundingClientRect().width;
25
+ let usedWidth = 0;
26
+ let count = 0;
27
+ for (let index = 0; index < widths.length; index++) {
28
+ const remaining = widths.length - count;
29
+ const needsMore = remaining > 1;
30
+ const budget = needsMore ? containerWidth - moreButtonWidth : containerWidth;
31
+ if (usedWidth + widths[index] <= budget) {
32
+ usedWidth += widths[index];
33
+ count++;
34
+ } else {
35
+ break;
36
+ }
37
+ }
38
+ const minFitWidth = widths.slice(0, minVisible).reduce((sum, width) => sum + width, 0);
39
+ const minFitsWithMore = containerWidth - moreButtonWidth >= minFitWidth;
40
+ const floor = minFitsWithMore ? minVisible : count;
41
+ setVisibleCount(Math.max(floor, count));
42
+ }, [minVisible, moreButtonWidth]);
43
+ useEffect(() => {
44
+ const container = containerRef.current;
45
+ if (!container) return void 0;
46
+ const observer = new ResizeObserver(measure);
47
+ observer.observe(container);
48
+ requestAnimationFrame(measure);
49
+ return () => observer.disconnect();
50
+ }, [measure]);
51
+ return { containerRef, visibleCount, measured };
52
+ };
53
+
54
+ export { useOverflowMeasure };
55
+ //# sourceMappingURL=useOverflowMeasure.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useOverflowMeasure.esm.js","sources":["../../../../src/features/environment/InstanceDrawer/useOverflowMeasure.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react';\n\n/**\n * Measures rendered tab widths against the container and returns how many tabs\n * fit before overflowing into a \"more\" menu. Ported from the web app's\n * `features/environments/components/InstanceTabs/useOverflowMeasure.js`.\n */\nexport const useOverflowMeasure = ({\n itemCount,\n minVisible,\n moreButtonWidth,\n}: {\n itemCount: number;\n minVisible: number;\n moreButtonWidth: number;\n}) => {\n const [visibleCount, setVisibleCount] = useState(itemCount);\n const [measured, setMeasured] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n const tabWidthsRef = useRef<number[]>([]);\n\n const measure = useCallback(() => {\n const container = containerRef.current;\n if (!container) return;\n\n if (tabWidthsRef.current.length === 0) {\n const tabElements = container.querySelectorAll('[role=\"tab\"]');\n if (tabElements.length === 0) return;\n tabWidthsRef.current = Array.from(tabElements).map(\n element => element.getBoundingClientRect().width,\n );\n setMeasured(true);\n }\n\n const widths = tabWidthsRef.current;\n const containerWidth = container.getBoundingClientRect().width;\n let usedWidth = 0;\n let count = 0;\n\n for (let index = 0; index < widths.length; index++) {\n const remaining = widths.length - count;\n const needsMore = remaining > 1;\n const budget = needsMore\n ? containerWidth - moreButtonWidth\n : containerWidth;\n\n if (usedWidth + widths[index] <= budget) {\n usedWidth += widths[index];\n count++;\n } else {\n break;\n }\n }\n\n const minFitWidth = widths\n .slice(0, minVisible)\n .reduce((sum, width) => sum + width, 0);\n const minFitsWithMore = containerWidth - moreButtonWidth >= minFitWidth;\n const floor = minFitsWithMore ? minVisible : count;\n\n setVisibleCount(Math.max(floor, count));\n }, [minVisible, moreButtonWidth]);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return undefined;\n\n const observer = new ResizeObserver(measure);\n observer.observe(container);\n requestAnimationFrame(measure);\n\n return () => observer.disconnect();\n }, [measure]);\n\n return { containerRef, visibleCount, measured };\n};\n\nexport default useOverflowMeasure;\n"],"names":[],"mappings":";;AAOO,MAAM,qBAAqB,CAAC;AAAA,EACjC,SAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA,KAIM;AACJ,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,SAAS,SAAS,CAAA;AAC1D,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,SAAS,KAAK,CAAA;AAC9C,EAAA,MAAM,YAAA,GAAe,OAAuB,IAAI,CAAA;AAChD,EAAA,MAAM,YAAA,GAAe,MAAA,CAAiB,EAAE,CAAA;AAExC,EAAA,MAAM,OAAA,GAAU,YAAY,MAAM;AAChC,IAAA,MAAM,YAAY,YAAA,CAAa,OAAA;AAC/B,IAAA,IAAI,CAAC,SAAA,EAAW;AAEhB,IAAA,IAAI,YAAA,CAAa,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG;AACrC,MAAA,MAAM,WAAA,GAAc,SAAA,CAAU,gBAAA,CAAiB,cAAc,CAAA;AAC7D,MAAA,IAAI,WAAA,CAAY,WAAW,CAAA,EAAG;AAC9B,MAAA,YAAA,CAAa,OAAA,GAAU,KAAA,CAAM,IAAA,CAAK,WAAW,CAAA,CAAE,GAAA;AAAA,QAC7C,CAAA,OAAA,KAAW,OAAA,CAAQ,qBAAA,EAAsB,CAAE;AAAA,OAC7C;AACA,MAAA,WAAA,CAAY,IAAI,CAAA;AAAA,IAClB;AAEA,IAAA,MAAM,SAAS,YAAA,CAAa,OAAA;AAC5B,IAAA,MAAM,cAAA,GAAiB,SAAA,CAAU,qBAAA,EAAsB,CAAE,KAAA;AACzD,IAAA,IAAI,SAAA,GAAY,CAAA;AAChB,IAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,IAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,GAAQ,MAAA,CAAO,QAAQ,KAAA,EAAA,EAAS;AAClD,MAAA,MAAM,SAAA,GAAY,OAAO,MAAA,GAAS,KAAA;AAClC,MAAA,MAAM,YAAY,SAAA,GAAY,CAAA;AAC9B,MAAA,MAAM,MAAA,GAAS,SAAA,GACX,cAAA,GAAiB,eAAA,GACjB,cAAA;AAEJ,MAAA,IAAI,SAAA,GAAY,MAAA,CAAO,KAAK,CAAA,IAAK,MAAA,EAAQ;AACvC,QAAA,SAAA,IAAa,OAAO,KAAK,CAAA;AACzB,QAAA,KAAA,EAAA;AAAA,MACF,CAAA,MAAO;AACL,QAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAM,WAAA,GAAc,MAAA,CACjB,KAAA,CAAM,CAAA,EAAG,UAAU,CAAA,CACnB,MAAA,CAAO,CAAC,GAAA,EAAK,KAAA,KAAU,GAAA,GAAM,KAAA,EAAO,CAAC,CAAA;AACxC,IAAA,MAAM,eAAA,GAAkB,iBAAiB,eAAA,IAAmB,WAAA;AAC5D,IAAA,MAAM,KAAA,GAAQ,kBAAkB,UAAA,GAAa,KAAA;AAE7C,IAAA,eAAA,CAAgB,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,KAAK,CAAC,CAAA;AAAA,EACxC,CAAA,EAAG,CAAC,UAAA,EAAY,eAAe,CAAC,CAAA;AAEhC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,YAAY,YAAA,CAAa,OAAA;AAC/B,IAAA,IAAI,CAAC,WAAW,OAAO,MAAA;AAEvB,IAAA,MAAM,QAAA,GAAW,IAAI,cAAA,CAAe,OAAO,CAAA;AAC3C,IAAA,QAAA,CAAS,QAAQ,SAAS,CAAA;AAC1B,IAAA,qBAAA,CAAsB,OAAO,CAAA;AAE7B,IAAA,OAAO,MAAM,SAAS,UAAA,EAAW;AAAA,EACnC,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,OAAO,EAAE,YAAA,EAAc,YAAA,EAAc,QAAA,EAAS;AAChD;;;;"}
@@ -0,0 +1,44 @@
1
+ import { useState, useRef, useCallback, useEffect } from 'react';
2
+
3
+ const useResizableWidth = ({
4
+ defaultWidth = 720,
5
+ minWidth = 575
6
+ } = {}) => {
7
+ const [width, setWidth] = useState(defaultWidth);
8
+ const panelRef = useRef(null);
9
+ const dragging = useRef(false);
10
+ const onMouseMove = useCallback(
11
+ (event) => {
12
+ if (!dragging.current) return;
13
+ const parent = panelRef.current?.parentElement;
14
+ const rect = parent?.getBoundingClientRect();
15
+ const max = rect ? rect.width : window.innerWidth;
16
+ const next = rect ? rect.right - event.clientX : window.innerWidth - event.clientX;
17
+ setWidth(Math.min(max, Math.max(minWidth, next)));
18
+ },
19
+ [minWidth]
20
+ );
21
+ const onMouseUp = useCallback(() => {
22
+ dragging.current = false;
23
+ document.body.style.cursor = "";
24
+ document.body.style.userSelect = "";
25
+ }, []);
26
+ useEffect(() => {
27
+ document.addEventListener("mousemove", onMouseMove);
28
+ document.addEventListener("mouseup", onMouseUp);
29
+ return () => {
30
+ document.removeEventListener("mousemove", onMouseMove);
31
+ document.removeEventListener("mouseup", onMouseUp);
32
+ };
33
+ }, [onMouseMove, onMouseUp]);
34
+ const onResizeStart = useCallback((event) => {
35
+ event.preventDefault();
36
+ dragging.current = true;
37
+ document.body.style.cursor = "col-resize";
38
+ document.body.style.userSelect = "none";
39
+ }, []);
40
+ return { width, panelRef, onResizeStart };
41
+ };
42
+
43
+ export { useResizableWidth };
44
+ //# sourceMappingURL=useResizableWidth.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useResizableWidth.esm.js","sources":["../../../../src/features/environment/InstanceDrawer/useResizableWidth.ts"],"sourcesContent":["import {\n MouseEvent as ReactMouseEvent,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from 'react';\n\n/**\n * Drag-to-resize width for the right-anchored instance panel. Mirrors the\n * `@massdriver/ui/Drawer` `useResizable` behaviour (which we can't use directly\n * because MUI's Drawer doesn't paint inside Backstage). Clamps between\n * `minWidth` and the panel's positioned parent width.\n */\nexport const useResizableWidth = ({\n defaultWidth = 720,\n minWidth = 575,\n}: {\n defaultWidth?: number;\n minWidth?: number;\n} = {}) => {\n const [width, setWidth] = useState(defaultWidth);\n const panelRef = useRef<HTMLDivElement>(null);\n const dragging = useRef(false);\n\n const onMouseMove = useCallback(\n (event: globalThis.MouseEvent) => {\n if (!dragging.current) return;\n const parent = panelRef.current?.parentElement;\n const rect = parent?.getBoundingClientRect();\n const max = rect ? rect.width : window.innerWidth;\n const next = rect\n ? rect.right - event.clientX\n : window.innerWidth - event.clientX;\n setWidth(Math.min(max, Math.max(minWidth, next)));\n },\n [minWidth],\n );\n\n const onMouseUp = useCallback(() => {\n dragging.current = false;\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n }, []);\n\n useEffect(() => {\n document.addEventListener('mousemove', onMouseMove);\n document.addEventListener('mouseup', onMouseUp);\n return () => {\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp);\n };\n }, [onMouseMove, onMouseUp]);\n\n const onResizeStart = useCallback((event: ReactMouseEvent) => {\n event.preventDefault();\n dragging.current = true;\n document.body.style.cursor = 'col-resize';\n document.body.style.userSelect = 'none';\n }, []);\n\n return { width, panelRef, onResizeStart };\n};\n\nexport default useResizableWidth;\n"],"names":[],"mappings":";;AAcO,MAAM,oBAAoB,CAAC;AAAA,EAChC,YAAA,GAAe,GAAA;AAAA,EACf,QAAA,GAAW;AACb,CAAA,GAGI,EAAC,KAAM;AACT,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAS,YAAY,CAAA;AAC/C,EAAA,MAAM,QAAA,GAAW,OAAuB,IAAI,CAAA;AAC5C,EAAA,MAAM,QAAA,GAAW,OAAO,KAAK,CAAA;AAE7B,EAAA,MAAM,WAAA,GAAc,WAAA;AAAA,IAClB,CAAC,KAAA,KAAiC;AAChC,MAAA,IAAI,CAAC,SAAS,OAAA,EAAS;AACvB,MAAA,MAAM,MAAA,GAAS,SAAS,OAAA,EAAS,aAAA;AACjC,MAAA,MAAM,IAAA,GAAO,QAAQ,qBAAA,EAAsB;AAC3C,MAAA,MAAM,GAAA,GAAM,IAAA,GAAO,IAAA,CAAK,KAAA,GAAQ,MAAA,CAAO,UAAA;AACvC,MAAA,MAAM,IAAA,GAAO,OACT,IAAA,CAAK,KAAA,GAAQ,MAAM,OAAA,GACnB,MAAA,CAAO,aAAa,KAAA,CAAM,OAAA;AAC9B,MAAA,QAAA,CAAS,IAAA,CAAK,IAAI,GAAA,EAAK,IAAA,CAAK,IAAI,QAAA,EAAU,IAAI,CAAC,CAAC,CAAA;AAAA,IAClD,CAAA;AAAA,IACA,CAAC,QAAQ;AAAA,GACX;AAEA,EAAA,MAAM,SAAA,GAAY,YAAY,MAAM;AAClC,IAAA,QAAA,CAAS,OAAA,GAAU,KAAA;AACnB,IAAA,QAAA,CAAS,IAAA,CAAK,MAAM,MAAA,GAAS,EAAA;AAC7B,IAAA,QAAA,CAAS,IAAA,CAAK,MAAM,UAAA,GAAa,EAAA;AAAA,EACnC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,WAAW,CAAA;AAClD,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,SAAS,CAAA;AAC9C,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,mBAAA,CAAoB,aAAa,WAAW,CAAA;AACrD,MAAA,QAAA,CAAS,mBAAA,CAAoB,WAAW,SAAS,CAAA;AAAA,IACnD,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,EAAa,SAAS,CAAC,CAAA;AAE3B,EAAA,MAAM,aAAA,GAAgB,WAAA,CAAY,CAAC,KAAA,KAA2B;AAC5D,IAAA,KAAA,CAAM,cAAA,EAAe;AACrB,IAAA,QAAA,CAAS,OAAA,GAAU,IAAA;AACnB,IAAA,QAAA,CAAS,IAAA,CAAK,MAAM,MAAA,GAAS,YAAA;AAC7B,IAAA,QAAA,CAAS,IAAA,CAAK,MAAM,UAAA,GAAa,MAAA;AAAA,EACnC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO,EAAE,KAAA,EAAO,QAAA,EAAU,aAAA,EAAc;AAC1C;;;;"}
@@ -0,0 +1,54 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { InstanceStatusPill as InstanceStatusPill$1 } from '../../../components/InstanceStatusPill.esm.js';
3
+ import { useLiveRelayQuery } from '../realtime/useLiveRelayQuery.esm.js';
4
+ import { deriveInstanceStatus } from '../../../utils/instanceStatuses.esm.js';
5
+
6
+ const LATEST_INSTANCE_DEPLOYMENT_QUERY = `
7
+ query MassdriverLatestInstanceDeployment(
8
+ $organizationId: ID!
9
+ $instanceId: ID!
10
+ ) {
11
+ deployments(
12
+ organizationId: $organizationId
13
+ filter: { instanceId: { eq: $instanceId } }
14
+ sort: { field: CREATED_AT, order: DESC }
15
+ cursor: { limit: 1 }
16
+ ) {
17
+ items {
18
+ id
19
+ action
20
+ status
21
+ }
22
+ }
23
+ }
24
+ `;
25
+ const InstanceStatusPill = ({
26
+ instance,
27
+ status,
28
+ onClick,
29
+ size = "small",
30
+ ...props
31
+ }) => {
32
+ const { value } = useLiveRelayQuery(
33
+ LATEST_INSTANCE_DEPLOYMENT_QUERY,
34
+ instance?.id ? { instanceId: instance.id } : null
35
+ );
36
+ const latestDeployment = value?.deployments?.items?.[0] ?? null;
37
+ const resolvedStatus = instance ? deriveInstanceStatus({
38
+ instanceStatus: instance.status,
39
+ latestDeploymentAction: latestDeployment?.action,
40
+ latestDeploymentStatus: latestDeployment?.status
41
+ }) : status ?? null;
42
+ return /* @__PURE__ */ jsx(
43
+ InstanceStatusPill$1,
44
+ {
45
+ status: resolvedStatus,
46
+ size,
47
+ onClick: onClick ? () => onClick(instance ? latestDeployment : null) : void 0,
48
+ ...props
49
+ }
50
+ );
51
+ };
52
+
53
+ export { InstanceStatusPill as default };
54
+ //# sourceMappingURL=InstanceStatusPill.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InstanceStatusPill.esm.js","sources":["../../../../src/features/environment/components/InstanceStatusPill.tsx"],"sourcesContent":["import { InstanceStatusPill as StatusPillBase } from '../../../components/InstanceStatusPill';\nimport { useLiveRelayQuery } from '../realtime/useLiveRelayQuery';\nimport { deriveInstanceStatus } from '../../../utils/instanceStatuses';\n\n// Latest deployment (any action/status) for an instance — drives the pill's\n// in-flight compound statuses, mirroring the web app's\n// useLatestInstanceDeployment. Being a live relay query, it refetches on every\n// realtime revision bump, so a running provision flips the pill to\n// \"provision running\" and back without a reload.\nconst LATEST_INSTANCE_DEPLOYMENT_QUERY = `\n query MassdriverLatestInstanceDeployment(\n $organizationId: ID!\n $instanceId: ID!\n ) {\n deployments(\n organizationId: $organizationId\n filter: { instanceId: { eq: $instanceId } }\n sort: { field: CREATED_AT, order: DESC }\n cursor: { limit: 1 }\n ) {\n items {\n id\n action\n status\n }\n }\n }\n`;\n\ninterface LatestDeploymentResult {\n deployments: {\n items?: Array<{\n id: string;\n action?: string | null;\n status?: string | null;\n } | null> | null;\n } | null;\n}\n\n/**\n * Instance status chip, ported from the web app's InstanceStatusPill.\n *\n * Two modes, mirroring the web app's container:\n * - `instance={{ id, status }}` — fetches the instance's latest deployment and\n * derives the rendered status (an active deployment shows as a compound like\n * PROVISION_RUNNING; otherwise the stored status). Degrades silently to the\n * bare status while the deployment query is loading or errors.\n * - `status=\"...\"` — renders the given static or compound status as-is. Callers\n * that already hold a deployment's action+status compose it themselves via\n * `composeInstanceStatus` (the web app's per-deployment mode re-queries by\n * id, which is free under Apollo's cache but would be one HTTP request per\n * row through the relay).\n *\n * `onClick` receives the resolved deployment (instance mode's latest\n * deployment; null in status mode — callers there close over their own row).\n * The pill is only clickable while the status is actionable (a deployment in\n * flight or failed), mirroring the web app's click-to-logs affordance.\n */\nexport interface ResolvedDeployment {\n id: string;\n action?: string | null;\n status?: string | null;\n}\n\nconst InstanceStatusPill = ({\n instance,\n status,\n onClick,\n size = 'small',\n ...props\n}: {\n instance?: { id: string; status?: string | null } | null;\n status?: string | null;\n onClick?: (deployment: ResolvedDeployment | null) => void;\n size?: string;\n [key: string]: unknown;\n}) => {\n const { value } = useLiveRelayQuery<LatestDeploymentResult>(\n LATEST_INSTANCE_DEPLOYMENT_QUERY,\n instance?.id ? { instanceId: instance.id } : null,\n );\n const latestDeployment = value?.deployments?.items?.[0] ?? null;\n\n const resolvedStatus = instance\n ? deriveInstanceStatus({\n instanceStatus: instance.status,\n latestDeploymentAction: latestDeployment?.action,\n latestDeploymentStatus: latestDeployment?.status,\n })\n : status ?? null;\n\n // The presentational base (components/InstanceStatusPill) owns the rendering\n // and the actionable-only clickability gate; this wrapper resolves the live\n // status and hands the resolved deployment to the click handler.\n return (\n <StatusPillBase\n status={resolvedStatus}\n size={size}\n onClick={\n onClick ? () => onClick(instance ? latestDeployment : null) : undefined\n }\n {...props}\n />\n );\n};\n\nexport default InstanceStatusPill;\n"],"names":["StatusPillBase"],"mappings":";;;;;AASA,MAAM,gCAAA,GAAmC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAuDzC,MAAM,qBAAqB,CAAC;AAAA,EAC1B,QAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA,GAAO,OAAA;AAAA,EACP,GAAG;AACL,CAAA,KAMM;AACJ,EAAA,MAAM,EAAE,OAAM,GAAI,iBAAA;AAAA,IAChB,gCAAA;AAAA,IACA,UAAU,EAAA,GAAK,EAAE,UAAA,EAAY,QAAA,CAAS,IAAG,GAAI;AAAA,GAC/C;AACA,EAAA,MAAM,gBAAA,GAAmB,KAAA,EAAO,WAAA,EAAa,KAAA,GAAQ,CAAC,CAAA,IAAK,IAAA;AAE3D,EAAA,MAAM,cAAA,GAAiB,WACnB,oBAAA,CAAqB;AAAA,IACnB,gBAAgB,QAAA,CAAS,MAAA;AAAA,IACzB,wBAAwB,gBAAA,EAAkB,MAAA;AAAA,IAC1C,wBAAwB,gBAAA,EAAkB;AAAA,GAC3C,IACD,MAAA,IAAU,IAAA;AAKd,EAAA,uBACE,GAAA;AAAA,IAACA,oBAAA;AAAA,IAAA;AAAA,MACC,MAAA,EAAQ,cAAA;AAAA,MACR,IAAA;AAAA,MACA,SACE,OAAA,GAAU,MAAM,QAAQ,QAAA,GAAW,gBAAA,GAAmB,IAAI,CAAA,GAAI,MAAA;AAAA,MAE/D,GAAG;AAAA;AAAA,GACN;AAEJ;;;;"}
@@ -0,0 +1,143 @@
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
+ import { useMemo, useRef, useEffect } from 'react';
3
+ import { useNodesState, useEdgesState, ReactFlow, Background, ControlButton, MiniMap, Controls } from '@xyflow/react';
4
+ import '@xyflow/react/dist/style.css';
5
+ import Box from '@massdriver/ui/Box';
6
+ import DownloadIcon from '@massdriver/ui/icons/DownloadIcon';
7
+ import stylin from '@massdriver/ui/stylin';
8
+ import DiagramNode from './DiagramNode.esm.js';
9
+ import useDiagramSnapshot from './useDiagramSnapshot.esm.js';
10
+
11
+ const NODE_TYPES = { DiagramNode };
12
+ const FIT_VIEW_OPTIONS = {
13
+ padding: 1,
14
+ minZoom: 0.3,
15
+ maxZoom: 1
16
+ };
17
+ const Diagram = ({
18
+ nodes: initialNodes,
19
+ edges: initialEdges,
20
+ snapshotName = "environment",
21
+ onNodeClick,
22
+ onPaneClick,
23
+ selectedComponentId
24
+ }) => {
25
+ const nodeTypes = useMemo(() => NODE_TYPES, []);
26
+ const [nodes, setNodes, onNodesChange] = useNodesState(initialNodes);
27
+ const [edges, setEdges, onEdgesChange] = useEdgesState(initialEdges);
28
+ const wrapperRef = useRef(null);
29
+ useEffect(() => {
30
+ setNodes(
31
+ initialNodes.map((node) => ({
32
+ ...node,
33
+ data: {
34
+ ...node.data,
35
+ isSelected: Boolean(
36
+ selectedComponentId && node.data?.id === selectedComponentId
37
+ )
38
+ }
39
+ }))
40
+ );
41
+ }, [initialNodes, selectedComponentId, setNodes]);
42
+ useEffect(() => {
43
+ setEdges(initialEdges);
44
+ }, [initialEdges, setEdges]);
45
+ const { onSnapshotClick, isSnapshotting } = useDiagramSnapshot({
46
+ wrapperRef,
47
+ fileNameBase: snapshotName
48
+ });
49
+ const handleNodeClick = (_event, node) => {
50
+ const scopedComponentId = node?.data?.id;
51
+ if (scopedComponentId) onNodeClick?.(scopedComponentId);
52
+ };
53
+ return /* @__PURE__ */ jsx(DiagramWrapper, { ref: wrapperRef, children: /* @__PURE__ */ jsxs(
54
+ ReactFlow,
55
+ {
56
+ nodes,
57
+ edges,
58
+ nodeTypes,
59
+ onNodesChange,
60
+ onEdgesChange,
61
+ onNodeClick: handleNodeClick,
62
+ onPaneClick: onPaneClick ? () => onPaneClick() : void 0,
63
+ nodesDraggable: false,
64
+ nodesConnectable: false,
65
+ elementsSelectable: false,
66
+ multiSelectionKeyCode: null,
67
+ selectionKeyCode: null,
68
+ minZoom: 0.2,
69
+ maxZoom: 2,
70
+ fitView: true,
71
+ fitViewOptions: FIT_VIEW_OPTIONS,
72
+ children: [
73
+ /* @__PURE__ */ jsx(Background, { color: "#aaa", gap: 16 }),
74
+ /* @__PURE__ */ jsx(StyledMiniMap, { pannable: true, zoomable: true }),
75
+ /* @__PURE__ */ jsx(StyledControls, { showInteractive: false, children: /* @__PURE__ */ jsx(
76
+ ControlButton,
77
+ {
78
+ onClick: onSnapshotClick,
79
+ disabled: isSnapshotting,
80
+ title: "Download snapshot",
81
+ "aria-label": "Download diagram snapshot",
82
+ children: /* @__PURE__ */ jsx(DownloadIcon, {})
83
+ }
84
+ ) })
85
+ ]
86
+ }
87
+ ) });
88
+ };
89
+ const DiagramWrapper = stylin(Box)({
90
+ width: "100%",
91
+ height: "100%",
92
+ position: "relative"
93
+ });
94
+ const StyledControls = stylin(Controls)(({ theme }) => ({
95
+ "&.react-flow__controls": {
96
+ boxShadow: theme.custom.shadows.cardSm,
97
+ borderRadius: theme.custom.general.borderRadius,
98
+ border: `1px solid ${theme.palette.divider}`,
99
+ overflow: "hidden",
100
+ ".react-flow__controls-button": {
101
+ backgroundColor: theme.palette.background.paper,
102
+ borderBottom: `1px solid ${theme.palette.divider}`,
103
+ color: theme.palette.text.secondary,
104
+ width: theme.spacing(3.5),
105
+ height: theme.spacing(3.5),
106
+ padding: 0,
107
+ "&:hover": {
108
+ backgroundColor: theme.palette.action.hover
109
+ },
110
+ "&:last-child": {
111
+ borderBottom: "none"
112
+ },
113
+ "&:disabled": {
114
+ opacity: 0.5,
115
+ cursor: "not-allowed"
116
+ },
117
+ svg: {
118
+ fill: theme.palette.text.secondary,
119
+ maxWidth: theme.spacing(1.75),
120
+ maxHeight: theme.spacing(1.75)
121
+ }
122
+ }
123
+ }
124
+ }));
125
+ const StyledMiniMap = stylin(MiniMap)(({ theme }) => ({
126
+ "&.react-flow__minimap": {
127
+ backgroundColor: theme.palette.background.paper,
128
+ boxShadow: theme.custom.shadows.cardSm,
129
+ borderRadius: theme.custom.general.borderRadius,
130
+ border: `1px solid ${theme.palette.divider}`,
131
+ overflow: "hidden",
132
+ ".react-flow__minimap-mask": {
133
+ fill: theme.palette.mode === "dark" ? "rgba(0, 0, 0, 0.5)" : "rgba(240, 240, 240, 0.6)"
134
+ },
135
+ ".react-flow__minimap-node": {
136
+ fill: theme.palette.text.secondary,
137
+ stroke: "none"
138
+ }
139
+ }
140
+ }));
141
+
142
+ export { Diagram as default };
143
+ //# sourceMappingURL=Diagram.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Diagram.esm.js","sources":["../../../../src/features/environment/graph/Diagram.tsx"],"sourcesContent":["import { useEffect, useMemo, useRef } from 'react';\nimport {\n Background,\n Controls,\n ControlButton,\n MiniMap,\n ReactFlow,\n useEdgesState,\n useNodesState,\n type Edge,\n} from '@xyflow/react';\nimport '@xyflow/react/dist/style.css';\nimport Box from '@massdriver/ui/Box';\nimport DownloadIcon from '@massdriver/ui/icons/DownloadIcon';\nimport stylin from '@massdriver/ui/stylin';\nimport DiagramNode from './DiagramNode';\nimport useDiagramSnapshot from './useDiagramSnapshot';\nimport type { DiagramNodeType } from './diagramFactory';\n\nconst NODE_TYPES = { DiagramNode };\n\nconst FIT_VIEW_OPTIONS = {\n padding: 1,\n minZoom: 0.3,\n maxZoom: 1,\n};\n\n/** Read-only React Flow canvas for an environment's instances and links. */\nconst Diagram = ({\n nodes: initialNodes,\n edges: initialEdges,\n snapshotName = 'environment',\n onNodeClick,\n onPaneClick,\n selectedComponentId,\n}: {\n nodes: DiagramNodeType[];\n edges: Edge[];\n snapshotName?: string;\n onNodeClick?: (scopedComponentId: string) => void;\n onPaneClick?: () => void;\n selectedComponentId?: string;\n}) => {\n const nodeTypes = useMemo(() => NODE_TYPES, []);\n const [nodes, setNodes, onNodesChange] = useNodesState(initialNodes);\n const [edges, setEdges, onEdgesChange] = useEdgesState(initialEdges);\n const wrapperRef = useRef<HTMLDivElement>(null);\n\n // Reseed when the fetched blueprint changes, marking the open instance's node\n // selected (the node styles its own border off `data.isSelected`).\n useEffect(() => {\n setNodes(\n initialNodes.map(node => ({\n ...node,\n data: {\n ...node.data,\n isSelected: Boolean(\n selectedComponentId && node.data?.id === selectedComponentId,\n ),\n },\n })),\n );\n }, [initialNodes, selectedComponentId, setNodes]);\n useEffect(() => {\n setEdges(initialEdges);\n }, [initialEdges, setEdges]);\n\n const { onSnapshotClick, isSnapshotting } = useDiagramSnapshot({\n wrapperRef,\n fileNameBase: snapshotName,\n });\n\n const handleNodeClick = (\n _event: unknown,\n node: { data?: { id?: string } },\n ) => {\n const scopedComponentId = node?.data?.id;\n if (scopedComponentId) onNodeClick?.(scopedComponentId);\n };\n\n return (\n <DiagramWrapper ref={wrapperRef}>\n <ReactFlow\n nodes={nodes}\n edges={edges}\n nodeTypes={nodeTypes}\n onNodesChange={onNodesChange}\n onEdgesChange={onEdgesChange}\n onNodeClick={handleNodeClick}\n onPaneClick={onPaneClick ? () => onPaneClick() : undefined}\n nodesDraggable={false}\n nodesConnectable={false}\n elementsSelectable={false}\n multiSelectionKeyCode={null}\n selectionKeyCode={null}\n minZoom={0.2}\n maxZoom={2}\n fitView\n fitViewOptions={FIT_VIEW_OPTIONS}\n >\n <Background color=\"#aaa\" gap={16} />\n <StyledMiniMap pannable zoomable />\n <StyledControls showInteractive={false}>\n <ControlButton\n onClick={onSnapshotClick}\n disabled={isSnapshotting}\n title=\"Download snapshot\"\n aria-label=\"Download diagram snapshot\"\n >\n <DownloadIcon />\n </ControlButton>\n </StyledControls>\n </ReactFlow>\n </DiagramWrapper>\n );\n};\n\nexport default Diagram;\n\nconst DiagramWrapper = stylin(Box)({\n width: '100%',\n height: '100%',\n position: 'relative',\n});\n\nconst StyledControls = stylin(Controls)(({ theme }: { theme: any }) => ({\n '&.react-flow__controls': {\n boxShadow: theme.custom.shadows.cardSm,\n borderRadius: theme.custom.general.borderRadius,\n border: `1px solid ${theme.palette.divider}`,\n overflow: 'hidden',\n\n '.react-flow__controls-button': {\n backgroundColor: theme.palette.background.paper,\n borderBottom: `1px solid ${theme.palette.divider}`,\n color: theme.palette.text.secondary,\n width: theme.spacing(3.5),\n height: theme.spacing(3.5),\n padding: 0,\n\n '&:hover': {\n backgroundColor: theme.palette.action.hover,\n },\n\n '&:last-child': {\n borderBottom: 'none',\n },\n\n '&:disabled': {\n opacity: 0.5,\n cursor: 'not-allowed',\n },\n\n svg: {\n fill: theme.palette.text.secondary,\n maxWidth: theme.spacing(1.75),\n maxHeight: theme.spacing(1.75),\n },\n },\n },\n}));\n\nconst StyledMiniMap = stylin(MiniMap)(({ theme }: { theme: any }) => ({\n '&.react-flow__minimap': {\n backgroundColor: theme.palette.background.paper,\n boxShadow: theme.custom.shadows.cardSm,\n borderRadius: theme.custom.general.borderRadius,\n border: `1px solid ${theme.palette.divider}`,\n overflow: 'hidden',\n\n '.react-flow__minimap-mask': {\n fill:\n theme.palette.mode === 'dark'\n ? 'rgba(0, 0, 0, 0.5)'\n : 'rgba(240, 240, 240, 0.6)',\n },\n\n '.react-flow__minimap-node': {\n fill: theme.palette.text.secondary,\n stroke: 'none',\n },\n },\n}));\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ const NODE_WIDTH = 522;
2
+ const NODE_HEIGHT = 166;
3
+
4
+ export { NODE_HEIGHT, NODE_WIDTH };
5
+ //# sourceMappingURL=DiagramNode.constants.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DiagramNode.constants.esm.js","sources":["../../../../src/features/environment/graph/DiagramNode.constants.ts"],"sourcesContent":["export const NODE_WIDTH = 522;\nexport const NODE_HEIGHT = 166;\n"],"names":[],"mappings":"AAAO,MAAM,UAAA,GAAa;AACnB,MAAM,WAAA,GAAc;;;;"}