@64mb/freelens-power 1.1.0 → 1.2.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 (208) hide show
  1. package/README.md +5 -4
  2. package/THIRD_PARTY_LICENSES +1707 -0
  3. package/out/main/ai.js +63 -23
  4. package/out/main/ai.js.map +1 -1
  5. package/out/main/cluster-icons-catalog.js +28 -0
  6. package/out/main/cluster-icons-catalog.js.map +1 -0
  7. package/out/main/cluster-icons.js +125 -0
  8. package/out/main/cluster-icons.js.map +1 -0
  9. package/out/main/common/ai-terminal-context.js +51 -0
  10. package/out/main/common/ai-terminal-context.js.map +1 -0
  11. package/out/main/common/ai.js.map +1 -1
  12. package/out/main/common/cluster-icon-ipc.js +6 -0
  13. package/out/main/common/cluster-icon-ipc.js.map +1 -0
  14. package/out/main/common/cluster-icons.js +121 -0
  15. package/out/main/common/cluster-icons.js.map +1 -0
  16. package/out/main/common/dashboard.js +1 -1
  17. package/out/main/common/dashboard.js.map +1 -1
  18. package/out/main/common/settings-export.js +3 -1
  19. package/out/main/common/settings-export.js.map +1 -1
  20. package/out/main/common/store/cluster-icons-store.js +32 -0
  21. package/out/main/common/store/cluster-icons-store.js.map +1 -0
  22. package/out/main/common/store/monitoring-preferences-store.js +5 -0
  23. package/out/main/common/store/monitoring-preferences-store.js.map +1 -1
  24. package/out/main/diagnostics-menu-order.js +57 -0
  25. package/out/main/diagnostics-menu-order.js.map +1 -0
  26. package/out/main/index.js +9 -1
  27. package/out/main/index.js.map +1 -1
  28. package/out/main/monitoring-history.js +13 -3
  29. package/out/main/monitoring-history.js.map +1 -1
  30. package/out/renderer/_virtual/_global-external_react-dom.js +2 -1
  31. package/out/renderer/_virtual/_global-external_react.js +10 -5
  32. package/out/renderer/_virtual/_rolldown/runtime.js +22 -0
  33. package/out/renderer/ai-terminal-context.js +200 -0
  34. package/out/renderer/ai-terminal-context.js.map +1 -0
  35. package/out/renderer/ai.js +90 -9
  36. package/out/renderer/ai.js.map +1 -1
  37. package/out/renderer/appearance.js +1 -0
  38. package/out/renderer/appearance.js.map +1 -1
  39. package/out/renderer/cluster-icon-colors.js +188 -0
  40. package/out/renderer/cluster-icon-colors.js.map +1 -0
  41. package/out/renderer/cluster-icons.js +304 -0
  42. package/out/renderer/cluster-icons.js.map +1 -0
  43. package/out/renderer/dashboard.js +8 -5
  44. package/out/renderer/dashboard.js.map +1 -1
  45. package/out/renderer/details/secret-certificate-details.js +9 -2
  46. package/out/renderer/details/secret-certificate-details.js.map +1 -1
  47. package/out/renderer/diagnostics.css.js +39 -0
  48. package/out/renderer/diagnostics.css.js.map +1 -0
  49. package/out/renderer/diagnostics.js +796 -343
  50. package/out/renderer/diagnostics.js.map +1 -1
  51. package/out/renderer/index.js +9 -4
  52. package/out/renderer/index.js.map +1 -1
  53. package/out/renderer/monitoring-details-chart.js +42 -0
  54. package/out/renderer/monitoring-details-chart.js.map +1 -0
  55. package/out/renderer/monitoring-history-collection.js +2 -18
  56. package/out/renderer/monitoring-history-collection.js.map +1 -1
  57. package/out/renderer/monitoring-history-view.js +111 -34
  58. package/out/renderer/monitoring-history-view.js.map +1 -1
  59. package/out/renderer/monitoring.js +68 -27
  60. package/out/renderer/monitoring.js.map +1 -1
  61. package/out/renderer/node-monitoring.js +23 -12
  62. package/out/renderer/node-monitoring.js.map +1 -1
  63. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js +10 -0
  64. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js.map +1 -0
  65. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js +8 -0
  66. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js.map +1 -0
  67. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js +9 -0
  68. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js.map +1 -0
  69. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js +9 -0
  70. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js.map +1 -0
  71. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/classCallCheck.js +8 -0
  72. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/classCallCheck.js.map +1 -0
  73. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/createClass.js +15 -0
  74. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/createClass.js.map +1 -0
  75. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/createSuper.js +19 -0
  76. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/createSuper.js.map +1 -0
  77. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/defineProperty.js +14 -0
  78. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/defineProperty.js.map +1 -0
  79. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/extends.js +19 -0
  80. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/extends.js.map +1 -0
  81. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js +15 -0
  82. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js.map +1 -0
  83. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/inherits.js +14 -0
  84. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/inherits.js.map +1 -0
  85. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/isNativeReflectConstruct.js +18 -0
  86. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/isNativeReflectConstruct.js.map +1 -0
  87. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/iterableToArray.js +8 -0
  88. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/iterableToArray.js.map +1 -0
  89. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js +26 -0
  90. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js.map +1 -0
  91. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/nonIterableRest.js +8 -0
  92. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/nonIterableRest.js.map +1 -0
  93. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js +8 -0
  94. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js.map +1 -0
  95. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/objectSpread2.js +27 -0
  96. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/objectSpread2.js.map +1 -0
  97. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js +15 -0
  98. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js.map +1 -0
  99. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js +14 -0
  100. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js.map +1 -0
  101. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js +12 -0
  102. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js.map +1 -0
  103. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js +15 -0
  104. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js.map +1 -0
  105. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/slicedToArray.js +12 -0
  106. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/slicedToArray.js.map +1 -0
  107. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/taggedTemplateLiteral.js +8 -0
  108. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/taggedTemplateLiteral.js.map +1 -0
  109. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/toConsumableArray.js +12 -0
  110. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/toConsumableArray.js.map +1 -0
  111. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/toPrimitive.js +16 -0
  112. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/toPrimitive.js.map +1 -0
  113. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/toPropertyKey.js +11 -0
  114. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/toPropertyKey.js.map +1 -0
  115. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/typeof.js +18 -0
  116. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/typeof.js.map +1 -0
  117. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js +13 -0
  118. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js.map +1 -0
  119. package/out/renderer/node_modules/.pnpm/@emotion_cache@11.14.0/node_modules/@emotion/cache/dist/emotion-cache.browser.esm.js +237 -0
  120. package/out/renderer/node_modules/.pnpm/@emotion_cache@11.14.0/node_modules/@emotion/cache/dist/emotion-cache.browser.esm.js.map +1 -0
  121. package/out/renderer/node_modules/.pnpm/@emotion_hash@0.9.2/node_modules/@emotion/hash/dist/emotion-hash.esm.js +25 -0
  122. package/out/renderer/node_modules/.pnpm/@emotion_hash@0.9.2/node_modules/@emotion/hash/dist/emotion-hash.esm.js.map +1 -0
  123. package/out/renderer/node_modules/.pnpm/@emotion_memoize@0.9.0/node_modules/@emotion/memoize/dist/emotion-memoize.esm.js +12 -0
  124. package/out/renderer/node_modules/.pnpm/@emotion_memoize@0.9.0/node_modules/@emotion/memoize/dist/emotion-memoize.esm.js.map +1 -0
  125. package/out/renderer/node_modules/.pnpm/@emotion_react@11.14.0_@types_react@17.0.93_react@17.0.2/node_modules/@emotion/react/dist/emotion-element-f0de968e.browser.esm.js +58 -0
  126. package/out/renderer/node_modules/.pnpm/@emotion_react@11.14.0_@types_react@17.0.93_react@17.0.2/node_modules/@emotion/react/dist/emotion-element-f0de968e.browser.esm.js.map +1 -0
  127. package/out/renderer/node_modules/.pnpm/@emotion_react@11.14.0_@types_react@17.0.93_react@17.0.2/node_modules/@emotion/react/dist/emotion-react.browser.esm.js +54 -0
  128. package/out/renderer/node_modules/.pnpm/@emotion_react@11.14.0_@types_react@17.0.93_react@17.0.2/node_modules/@emotion/react/dist/emotion-react.browser.esm.js.map +1 -0
  129. package/out/renderer/node_modules/.pnpm/@emotion_serialize@1.3.3/node_modules/@emotion/serialize/dist/emotion-serialize.esm.js +133 -0
  130. package/out/renderer/node_modules/.pnpm/@emotion_serialize@1.3.3/node_modules/@emotion/serialize/dist/emotion-serialize.esm.js.map +1 -0
  131. package/out/renderer/node_modules/.pnpm/@emotion_sheet@1.4.0/node_modules/@emotion/sheet/dist/emotion-sheet.esm.js +65 -0
  132. package/out/renderer/node_modules/.pnpm/@emotion_sheet@1.4.0/node_modules/@emotion/sheet/dist/emotion-sheet.esm.js.map +1 -0
  133. package/out/renderer/node_modules/.pnpm/@emotion_unitless@0.10.0/node_modules/@emotion/unitless/dist/emotion-unitless.esm.js +54 -0
  134. package/out/renderer/node_modules/.pnpm/@emotion_unitless@0.10.0/node_modules/@emotion/unitless/dist/emotion-unitless.esm.js.map +1 -0
  135. package/out/renderer/node_modules/.pnpm/@emotion_use-insertion-effect-with-fallbacks@1.2.0_react@17.0.2/node_modules/@emotion/use-insertion-effect-with-fallbacks/dist/emotion-use-insertion-effect-with-fallbacks.browser.esm.js +12 -0
  136. package/out/renderer/node_modules/.pnpm/@emotion_use-insertion-effect-with-fallbacks@1.2.0_react@17.0.2/node_modules/@emotion/use-insertion-effect-with-fallbacks/dist/emotion-use-insertion-effect-with-fallbacks.browser.esm.js.map +1 -0
  137. package/out/renderer/node_modules/.pnpm/@emotion_utils@1.4.2/node_modules/@emotion/utils/dist/emotion-utils.browser.esm.js +30 -0
  138. package/out/renderer/node_modules/.pnpm/@emotion_utils@1.4.2/node_modules/@emotion/utils/dist/emotion-utils.browser.esm.js.map +1 -0
  139. package/out/renderer/node_modules/.pnpm/@floating-ui_dom@1.7.2/node_modules/@floating-ui/dom/dist/floating-ui.dom.js +211 -0
  140. package/out/renderer/node_modules/.pnpm/@floating-ui_dom@1.7.2/node_modules/@floating-ui/dom/dist/floating-ui.dom.js.map +1 -0
  141. package/out/renderer/node_modules/.pnpm/@floating-ui_utils@0.2.10/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.js +97 -0
  142. package/out/renderer/node_modules/.pnpm/@floating-ui_utils@0.2.10/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.js.map +1 -0
  143. package/out/renderer/node_modules/.pnpm/@floating-ui_utils@0.2.10/node_modules/@floating-ui/utils/dist/floating-ui.utils.js +31 -0
  144. package/out/renderer/node_modules/.pnpm/@floating-ui_utils@0.2.10/node_modules/@floating-ui/utils/dist/floating-ui.utils.js.map +1 -0
  145. package/out/renderer/node_modules/.pnpm/hoist-non-react-statics@3.3.2/node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js +93 -0
  146. package/out/renderer/node_modules/.pnpm/hoist-non-react-statics@3.3.2/node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js.map +1 -0
  147. package/out/renderer/node_modules/.pnpm/memoize-one@6.0.0/node_modules/memoize-one/dist/memoize-one.esm.js +38 -0
  148. package/out/renderer/node_modules/.pnpm/memoize-one@6.0.0/node_modules/memoize-one/dist/memoize-one.esm.js.map +1 -0
  149. package/out/renderer/node_modules/.pnpm/react-is@16.13.1/node_modules/react-is/cjs/react-is.development.js +159 -0
  150. package/out/renderer/node_modules/.pnpm/react-is@16.13.1/node_modules/react-is/cjs/react-is.development.js.map +1 -0
  151. package/out/renderer/node_modules/.pnpm/react-is@16.13.1/node_modules/react-is/cjs/react-is.production.min.js +103 -0
  152. package/out/renderer/node_modules/.pnpm/react-is@16.13.1/node_modules/react-is/cjs/react-is.production.min.js.map +1 -0
  153. package/out/renderer/node_modules/.pnpm/react-is@16.13.1/node_modules/react-is/index.js +18 -0
  154. package/out/renderer/node_modules/.pnpm/react-is@16.13.1/node_modules/react-is/index.js.map +1 -0
  155. package/out/renderer/node_modules/.pnpm/react-select@5.10.2_@types_react@17.0.93_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/react-select/dist/Select-ef7c0426.esm.js +2200 -0
  156. package/out/renderer/node_modules/.pnpm/react-select@5.10.2_@types_react@17.0.93_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/react-select/dist/Select-ef7c0426.esm.js.map +1 -0
  157. package/out/renderer/node_modules/.pnpm/react-select@5.10.2_@types_react@17.0.93_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/react-select/dist/index-641ee5b8.esm.js +992 -0
  158. package/out/renderer/node_modules/.pnpm/react-select@5.10.2_@types_react@17.0.93_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/react-select/dist/index-641ee5b8.esm.js.map +1 -0
  159. package/out/renderer/node_modules/.pnpm/react-select@5.10.2_@types_react@17.0.93_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/react-select/dist/react-select.esm.js +14 -0
  160. package/out/renderer/node_modules/.pnpm/react-select@5.10.2_@types_react@17.0.93_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/react-select/dist/react-select.esm.js.map +1 -0
  161. package/out/renderer/node_modules/.pnpm/react-select@5.10.2_@types_react@17.0.93_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/react-select/dist/useStateManager-7e1e8489.esm.js +56 -0
  162. package/out/renderer/node_modules/.pnpm/react-select@5.10.2_@types_react@17.0.93_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/react-select/dist/useStateManager-7e1e8489.esm.js.map +1 -0
  163. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Enum.js +22 -0
  164. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Enum.js.map +1 -0
  165. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Middleware.js +30 -0
  166. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Middleware.js.map +1 -0
  167. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Parser.js +164 -0
  168. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Parser.js.map +1 -0
  169. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Serializer.js +37 -0
  170. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Serializer.js.map +1 -0
  171. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Tokenizer.js +245 -0
  172. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Tokenizer.js.map +1 -0
  173. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Utility.js +120 -0
  174. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Utility.js.map +1 -0
  175. package/out/renderer/node_modules/.pnpm/use-isomorphic-layout-effect@1.2.1_@types_react@17.0.93_react@17.0.2/node_modules/use-isomorphic-layout-effect/dist/use-isomorphic-layout-effect.browser.esm.js +6 -0
  176. package/out/renderer/node_modules/.pnpm/use-isomorphic-layout-effect@1.2.1_@types_react@17.0.93_react@17.0.2/node_modules/use-isomorphic-layout-effect/dist/use-isomorphic-layout-effect.browser.esm.js.map +1 -0
  177. package/out/renderer/pod-monitoring.js +15 -19
  178. package/out/renderer/pod-monitoring.js.map +1 -1
  179. package/out/renderer/preferences/ai-shortcuts-preferences.js +12 -4
  180. package/out/renderer/preferences/ai-shortcuts-preferences.js.map +1 -1
  181. package/out/renderer/preferences/dashboard-preferences.js +20 -4
  182. package/out/renderer/preferences/dashboard-preferences.js.map +1 -1
  183. package/out/renderer/preferences/monitoring-preferences.js +131 -44
  184. package/out/renderer/preferences/monitoring-preferences.js.map +1 -1
  185. package/out/renderer/preferences/preferences.js +31 -7
  186. package/out/renderer/preferences/preferences.js.map +1 -1
  187. package/out/renderer/read-only.js +2 -2
  188. package/out/renderer/read-only.js.map +1 -1
  189. package/out/renderer/src/common/ai-terminal-context.js +51 -0
  190. package/out/renderer/src/common/ai-terminal-context.js.map +1 -0
  191. package/out/renderer/src/common/ai.js.map +1 -1
  192. package/out/renderer/src/common/cluster-icon-ipc.js +6 -0
  193. package/out/renderer/src/common/cluster-icon-ipc.js.map +1 -0
  194. package/out/renderer/src/common/cluster-icons.js +133 -0
  195. package/out/renderer/src/common/cluster-icons.js.map +1 -0
  196. package/out/renderer/src/common/dashboard.js +1 -1
  197. package/out/renderer/src/common/dashboard.js.map +1 -1
  198. package/out/renderer/src/common/date-time.js +11 -0
  199. package/out/renderer/src/common/date-time.js.map +1 -0
  200. package/out/renderer/src/common/monitoring-history.js +2 -0
  201. package/out/renderer/src/common/monitoring-history.js.map +1 -1
  202. package/out/renderer/src/common/resource-diagnostics.js.map +1 -1
  203. package/out/renderer/src/common/settings-export.js.map +1 -1
  204. package/out/renderer/src/common/store/monitoring-preferences-store.js +5 -0
  205. package/out/renderer/src/common/store/monitoring-preferences-store.js.map +1 -1
  206. package/out/renderer/welcome.js +28 -6
  207. package/out/renderer/welcome.js.map +1 -1
  208. package/package.json +3 -2
@@ -1 +1 @@
1
- {"version":3,"file":"diagnostics.js","names":[],"sources":["../../src/renderer/diagnostics.tsx"],"sourcesContent":["import { Renderer } from \"@freelensapp/extensions\";\nimport { reaction } from \"mobx\";\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n buildConsumerGroups,\n type ConsumerGroup,\n type DiagnosticsObject,\n diagnosePendingPod,\n effectivePodResource,\n normalizeEvents,\n observeResourceChanges,\n type PodUsage,\n type ResourceSummary,\n type TimelineEntry,\n} from \"../common/resource-diagnostics\";\nimport { MonitoringPreferencesStore } from \"../common/store/monitoring-preferences-store\";\nimport { AiIcon } from \"./ai-icon\";\nimport { MetricChart } from \"./monitoring\";\nimport {\n getCollectedPodUsage,\n getMonitoringSnapshot,\n type MonitoringSnapshot,\n retainMonitoringCollector,\n} from \"./monitoring-collector\";\nimport { isHistoryTracked, setHistoryTracked } from \"./monitoring-history-collection\";\nimport { MonitoringHistoryRange, useMonitoringHistory } from \"./monitoring-history-view\";\n\nimport type { HistoryIdentity } from \"../common/monitoring-history\";\nimport type { MonitoringSample } from \"../common/monitoring-math\";\n\ntype Tab = \"Consumers\" | \"Timeline\" | \"Pending\";\nconst hidden = () => document.visibilityState === \"hidden\";\nconst activeId = () => Renderer.Catalog.activeCluster.get()?.metadata.uid;\nconst groupKey = (group: ConsumerGroup) => `${group.namespace}/${group.identity}`;\nfunction resourceText(value: number | undefined, metric: \"cpu\" | \"memory\"): string {\n if (value === undefined) return \"Unavailable\";\n return metric === \"cpu\" ? `${value.toFixed(3)} cores` : `${(value / 1024 ** 2).toFixed(1)} MiB`;\n}\nfunction summaryText(summary: ResourceSummary, metric: \"cpu\" | \"memory\"): string {\n const request = summary.unknownRequestPods\n ? `partial ${resourceText(summary.requests, metric)} known (${summary.unknownRequestPods} pods unknown)`\n : resourceText(summary.requests, metric);\n const ratio =\n summary.usage !== undefined &&\n summary.requests > 0 &&\n !summary.unknownRequestPods &&\n summary.coveredPods === summary.totalPods\n ? `${((summary.usage / summary.requests) * 100).toFixed(0)}% of requests`\n : \"ratio unavailable\";\n return `${resourceText(summary.usage, metric)} (${summary.coveredPods}/${summary.totalPods} pods covered), requests ${request}, ${ratio}`;\n}\nfunction unscheduledText(summary: ResourceSummary, metric: \"cpu\" | \"memory\"): string {\n return `${summary.unknownRequestPods ? \"Partial known: \" : \"\"}${resourceText(summary.unscheduledRequests, metric)}`;\n}\nconst resources: Record<string, string> = {\n Pod: \"/api/v1\",\n Deployment: \"/apis/apps/v1\",\n ReplicaSet: \"/apis/apps/v1\",\n StatefulSet: \"/apis/apps/v1\",\n DaemonSet: \"/apis/apps/v1\",\n Job: \"/apis/batch/v1\",\n CronJob: \"/apis/batch/v1\",\n};\nconst plurals: Record<string, string> = {\n Pod: \"pods\",\n Deployment: \"deployments\",\n ReplicaSet: \"replicasets\",\n StatefulSet: \"statefulsets\",\n DaemonSet: \"daemonsets\",\n Job: \"jobs\",\n CronJob: \"cronjobs\",\n};\nfunction openResource(object: DiagnosticsObject, clusterId: string): void {\n const kind = object.kind ?? \"Pod\";\n if (activeId() !== clusterId || !object.metadata.name || !object.metadata.namespace || !resources[kind]) return;\n const path = `${resources[kind]}/namespaces/${encodeURIComponent(object.metadata.namespace)}/${plurals[kind]}/${encodeURIComponent(object.metadata.name)}`;\n void Promise.resolve(Renderer.Navigation.showDetails(path)).catch(() => {});\n}\nconst projections = new WeakMap<MonitoringSnapshot, ReturnType<typeof projectSnapshot>>();\nfunction projectSnapshot(data: MonitoringSnapshot) {\n const usage = getCollectedPodUsage(data);\n const groups = buildConsumerGroups(data.pods ?? [], data.owners ?? [], usage);\n const objects = new Map<string, DiagnosticsObject>();\n const children = new Map<string, string[]>();\n for (const object of [...(data.owners ?? []), ...(data.pods ?? [])]) {\n const uid = object.metadata.uid;\n if (!uid) continue;\n objects.set(uid, object);\n const refs = object.metadata.ownerReferences ?? [];\n const parent = refs.find((item) => item.controller) ?? (refs.length === 1 ? refs[0] : undefined);\n if (parent) {\n const siblings = children.get(parent.uid) ?? [];\n siblings.push(uid);\n children.set(parent.uid, siblings);\n }\n }\n const related = new Map<string, Set<string>>();\n for (const group of groups) {\n const seen = new Set<string>();\n const stack = [group.identity];\n while (stack.length) {\n const uid = stack.pop()!;\n if (seen.has(uid)) continue;\n const object = objects.get(uid);\n if (object && object.metadata.namespace !== group.namespace) continue;\n seen.add(uid);\n stack.push(...(children.get(uid) ?? []));\n }\n related.set(groupKey(group), seen);\n }\n return { usage, groups, objects, related };\n}\nfunction projection(data: MonitoringSnapshot) {\n let value = projections.get(data);\n if (!value) {\n value = projectSnapshot(data);\n projections.set(data, value);\n }\n return value;\n}\nexport function DiagnosticsPage() {\n const [tab, setTab] = useState<Tab>(\"Consumers\");\n const [snapshot, setSnapshot] = useState<MonitoringSnapshot>();\n const [error, setError] = useState(\"\");\n const [filter, setFilter] = useState(\"\");\n const [historyTarget, setHistoryTarget] = useState(\"\");\n const [groupMode, setGroupMode] = useState(\"workload\");\n const [namespacesOpen, setNamespacesOpen] = useState<string[]>([]);\n const known = useRef(new Map<string, { group: ConsumerGroup; uids: Set<string> }>());\n const [sort, setSort] = useState(\"cpu\");\n const [expanded, setExpanded] = useState<string[]>([]);\n const [selected, setSelected] = useState(\"\");\n const [pendingUid, setPendingUid] = useState(\"\");\n const [reason, setReason] = useState(\"\");\n const [warningOnly, setWarningOnly] = useState(false);\n const [observed, setObserved] = useState<TimelineEntry[]>([]);\n const previous = useRef<MonitoringSnapshot>();\n useEffect(() => {\n const release = retainMonitoringCollector();\n let disposed = false;\n let generation = 0;\n let loading = false;\n const clear = () => {\n generation++;\n previous.current = undefined;\n known.current.clear();\n setSnapshot(undefined);\n setObserved([]);\n setSelected(\"\");\n setPendingUid(\"\");\n setExpanded([]);\n setError(\"\");\n };\n const load = async () => {\n if (loading || disposed || hidden()) return;\n const cluster = activeId();\n if (!cluster) {\n setError(\"Select a connected cluster\");\n return;\n }\n const current = generation;\n loading = true;\n try {\n const next = await getMonitoringSnapshot(true);\n if (disposed || current !== generation || next.clusterId !== activeId() || hidden()) return;\n const prior = previous.current;\n if (prior === next) return;\n if (prior && prior.clusterId === next.clusterId) {\n const entries: TimelineEntry[] = [];\n if (prior.time !== next.time)\n entries.push(\n ...observeResourceChanges(prior.pods ?? [], next.pods ?? [], new Date(next.time).toISOString()),\n );\n if (prior.owners !== next.owners && next.diagnosticsTime)\n entries.push(\n ...observeResourceChanges(\n prior.owners ?? [],\n next.owners ?? [],\n new Date(next.diagnosticsTime).toISOString(),\n ),\n );\n if (entries.length) setObserved((items) => [...entries, ...items].slice(0, 300));\n }\n const projected = projection(next);\n for (const group of projected.groups) {\n const key = groupKey(group);\n const remembered = known.current.get(key)?.uids ?? new Set<string>();\n for (const uid of projected.related.get(key) ?? []) remembered.add(uid);\n while (remembered.size > 500) remembered.delete(remembered.values().next().value!);\n known.current.set(key, { group, uids: remembered });\n }\n while (known.current.size > 100) known.current.delete(known.current.keys().next().value!);\n previous.current = next;\n setSnapshot(next);\n setError(\"\");\n } catch {\n if (!disposed && current === generation) setError(\"Diagnostics unavailable or access denied\");\n } finally {\n loading = false;\n }\n };\n const stop = reaction(activeId, () => {\n clear();\n void load();\n });\n const visibility = () => {\n if (document.visibilityState !== \"hidden\") void load();\n };\n const timer = window.setInterval(() => void load(), 1000);\n document.addEventListener(\"visibilitychange\", visibility);\n void load();\n return () => {\n disposed = true;\n generation++;\n stop();\n release();\n window.clearInterval(timer);\n document.removeEventListener(\"visibilitychange\", visibility);\n };\n }, []);\n const data = snapshot?.clusterId === activeId() ? snapshot : undefined;\n const projected = useMemo(() => (data ? projection(data) : undefined), [data]);\n const groups = projected?.groups ?? [];\n const filtered = useMemo(\n () =>\n groups\n .filter((group) =>\n `${group.namespace} ${group.name} ${group.kind}`.toLowerCase().includes(filter.toLowerCase()),\n )\n .sort((a, b) =>\n sort === \"name\"\n ? groupKey(a).localeCompare(groupKey(b))\n : sort === \"requests\" || sort === \"memoryRequests\"\n ? b[sort === \"requests\" ? \"cpu\" : \"memory\"].requests - a[sort === \"requests\" ? \"cpu\" : \"memory\"].requests\n : (b[sort === \"memory\" ? \"memory\" : \"cpu\"].usage ?? -1) -\n (a[sort === \"memory\" ? \"memory\" : \"cpu\"].usage ?? -1),\n ),\n [groups, filter, sort],\n );\n const applications = [...known.current.values()].map((item) => item.group);\n const application = applications.find((group) => groupKey(group) === selected);\n const uids = new Set(known.current.get(selected)?.uids ?? []);\n const warningIds = new Set(\n (data?.events ?? []).filter((event) => event.type === \"Warning\").map((event) => event.metadata?.uid),\n );\n const timeline = [...normalizeEvents(data?.events ?? []), ...observed]\n .filter(\n (entry) =>\n !!application &&\n !!entry.objectUid &&\n uids.has(entry.objectUid) &&\n (!reason || `${entry.reason} ${entry.message}`.toLowerCase().includes(reason.toLowerCase())) &&\n (!warningOnly || warningIds.has(entry.id)),\n )\n .sort((a, b) => (Date.parse(b.time ?? \"\") || 0) - (Date.parse(a.time ?? \"\") || 0));\n const pending = (data?.pods ?? []).filter((pod) => pod.status?.phase === \"Pending\");\n const selectedPod = pending.find((pod) => pod.metadata.uid === pendingUid);\n const diagnosis = selectedPod\n ? diagnosePendingPod(selectedPod, data?.nodes ?? [], data?.events ?? [], data?.pvcs)\n : undefined;\n return (\n <div className=\"power-diagnostics\" style={{ padding: 20, overflow: \"auto\", height: \"100%\" }}>\n <style>{`.power-diagnostics table{width:100%;border-collapse:collapse}.power-diagnostics th,.power-diagnostics td{text-align:left;padding:9px;border-bottom:1px solid var(--borderColor);vertical-align:top}.power-diagnostics button,.power-diagnostics select,.power-diagnostics input{margin:4px;padding:6px}.power-diagnostics .toolbar{display:flex;align-items:center;flex-wrap:wrap;gap:8px}.power-diagnostics small{display:block;opacity:.75}.power-diagnostics button{cursor:pointer;display:inline-flex;align-items:center;gap:6px;border-radius:4px;border:1px solid var(--borderColor);background:var(--contentColor);color:var(--textColorPrimary);font:inherit}.power-diagnostics button:hover{border-color:var(--primary)}.power-diagnostics button[aria-pressed=true]{color:var(--primary);border-color:var(--primary)}.power-diagnostics button:disabled{opacity:.5;cursor:default}.power-diagnostics select,.power-diagnostics input{border-radius:4px;border:1px solid var(--borderColor);background:var(--contentColor);color:var(--textColorPrimary);font:inherit}.power-diagnostics :is(button,select,input):focus-visible{outline:2px solid var(--primary);outline-offset:2px}.power-diagnostics input[type=checkbox]{accent-color:var(--primary)}.power-diagnostics th{color:var(--textColorSecondary);font-weight:500}.power-diagnostics nav{display:flex;gap:8px;flex-wrap:wrap}`}</style>\n <h2>Resource diagnostics</h2>\n <nav aria-label=\"Diagnostics views\">\n {([\"Consumers\", \"Timeline\", \"Pending\"] as Tab[]).map((name) => (\n <button\n key={name}\n type=\"button\"\n title={`Show ${name.toLowerCase()}`}\n aria-pressed={tab === name}\n onClick={() => setTab(name)}\n >\n <AiIcon\n material={name === \"Consumers\" ? \"account_tree\" : name === \"Timeline\" ? \"timeline\" : \"hourglass_empty\"}\n />\n {name}\n </button>\n ))}\n </nav>\n <p>\n Read-only cluster snapshot\n {data ? ` · ${new Date(data.time).toLocaleTimeString([], { hourCycle: \"h23\" })}` : \" · Loading\"}\n </p>\n {error && <p role=\"status\">{error}</p>}\n {data?.errors.map((message) => (\n <p role=\"status\" key={message}>\n {message}\n </p>\n ))}\n {tab === \"Consumers\" && (\n <>\n <div className=\"toolbar\">\n <label>\n Group by{\" \"}\n <select\n aria-label=\"Group consumers\"\n value={groupMode}\n onChange={(event) => setGroupMode(event.target.value)}\n >\n <option value=\"workload\">Workload</option>\n <option value=\"namespace\">Namespace</option>\n </select>\n </label>\n <input\n aria-label=\"Filter consumers\"\n placeholder=\"Namespace or workload\"\n value={filter}\n onChange={(event) => setFilter(event.target.value)}\n />\n <label>\n Sort{\" \"}\n <select aria-label=\"Sort consumers\" value={sort} onChange={(event) => setSort(event.target.value)}>\n <option value=\"cpu\">CPU usage</option>\n <option value=\"memory\">Memory usage</option>\n <option value=\"requests\">CPU requests</option>\n <option value=\"memoryRequests\">Memory requests</option>\n <option value=\"name\">Namespace / name</option>\n </select>\n </label>\n </div>\n <p>\n Usage coverage is per resource. Missing metrics are unavailable. Unscheduled requests are listed separately.\n </p>\n <table>\n <thead>\n <tr>\n <th>Namespace / consumer</th>\n <th>CPU</th>\n <th>Memory</th>\n <th>Unscheduled requests</th>\n </tr>\n </thead>\n <tbody>\n {(groupMode === \"namespace\" ? [...new Set(filtered.map((group) => group.namespace))] : [\"\"]).map(\n (namespace) => (\n <NamespaceRows\n key={namespace}\n namespace={namespace}\n groups={namespace ? filtered.filter((group) => group.namespace === namespace) : filtered}\n clusterId={data?.clusterId ?? \"\"}\n usage={projected?.usage ?? []}\n viewHistory={setHistoryTarget}\n open={!namespace || namespacesOpen.includes(namespace)}\n toggleNamespace={() =>\n setNamespacesOpen((items) =>\n items.includes(namespace) ? items.filter((item) => item !== namespace) : [...items, namespace],\n )\n }\n expanded={expanded}\n toggleGroup={(key) =>\n setExpanded((items) =>\n items.includes(key) ? items.filter((item) => item !== key) : [...items, key],\n )\n }\n />\n ),\n )}\n </tbody>\n </table>\n {!filtered.length && <p>No consumers available</p>}\n {data && historyTarget && (\n <ApplicationHistory\n key={`${data.clusterId}/${historyTarget}`}\n data={data}\n group={groups.find((group) => groupKey(group) === historyTarget)}\n />\n )}\n </>\n )}\n {tab === \"Timeline\" && (\n <>\n <div className=\"toolbar\">\n <label>\n Application{\" \"}\n <select\n aria-label=\"Timeline application\"\n value={selected}\n onChange={(event) => setSelected(event.target.value)}\n >\n <option value=\"\">Select a workload or standalone pod</option>\n {applications.map((group) => (\n <option key={groupKey(group)} value={groupKey(group)}>\n {group.namespace} / {group.kind} / {group.name}\n </option>\n ))}\n </select>\n </label>\n <input\n aria-label=\"Filter timeline reason\"\n placeholder=\"Reason or message\"\n value={reason}\n onChange={(event) => setReason(event.target.value)}\n />\n <label>\n <input type=\"checkbox\" checked={warningOnly} onChange={(event) => setWarningOnly(event.target.checked)} />\n Warnings only\n </label>\n </div>\n <p>\n Kubernetes events have limited retention. Observed changes begin with this open view, retain at most 300\n entries, and have unknown transition times between snapshots. Related identities observed in this view are\n retained for at most 100 applications and 500 identities per application; older identity coverage can be\n incomplete.\n </p>\n <table>\n <thead>\n <tr>\n <th>Time / certainty</th>\n <th>Reason</th>\n <th>Evidence</th>\n </tr>\n </thead>\n <tbody>\n {timeline.map((entry) => (\n <tr key={entry.id}>\n <td>\n {entry.time ? new Date(entry.time).toLocaleString([], { hourCycle: \"h23\" }) : \"Time unknown\"}\n <small>\n {entry.certainty}, count {entry.count}\n {entry.firstTime\n ? `, first ${new Date(entry.firstTime).toLocaleString([], { hourCycle: \"h23\" })}`\n : \"\"}\n </small>\n </td>\n <td>{entry.reason}</td>\n <td>\n {entry.message}\n {(() => {\n const object = entry.objectUid ? projected?.objects.get(entry.objectUid) : undefined;\n return object && data ? (\n <button\n type=\"button\"\n title=\"Open exact resource details\"\n onClick={() => openResource(object, data.clusterId)}\n >\n <AiIcon material=\"open_in_new\" />\n Open resource\n </button>\n ) : null;\n })()}\n <small>{entry.gap}</small>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n {!timeline.length && (\n <p>\n {application\n ? \"No matching retained events or observed changes\"\n : \"Select an application to inspect its exact resource identities\"}\n </p>\n )}\n </>\n )}\n {tab === \"Pending\" && (\n <>\n <label>\n Pending pod{\" \"}\n <select aria-label=\"Pending pod\" value={pendingUid} onChange={(event) => setPendingUid(event.target.value)}>\n <option value=\"\">Select a pod</option>\n {pending.map((pod) => (\n <option key={pod.metadata.uid} value={pod.metadata.uid}>\n {pod.metadata.namespace} / {pod.metadata.name}\n </option>\n ))}\n </select>\n </label>\n {selectedPod && diagnosis ? (\n <>\n <h3>{diagnosis.state === \"assigned-waiting\" ? \"Assigned and waiting\" : \"Unscheduled\"}</h3>\n <p>\n Requested CPU: {podRequest(selectedPod, \"cpu\")} · Requested memory: {podRequest(selectedPod, \"memory\")}\n </p>\n <p>\n Node selector:{\" \"}\n {Object.entries(selectedPod.spec?.nodeSelector ?? {})\n .map(([key, value]) => `${key}=${value}`)\n .join(\", \") || \"None\"}\n </p>\n <p>\n Tolerations:{\" \"}\n {(selectedPod.spec?.tolerations ?? [])\n .map(\n (item) =>\n `${item.key || \"all keys\"} ${item.operator ?? \"Equal\"}${item.value ? ` ${item.value}` : \"\"} (${item.effect || \"all effects\"})`,\n )\n .join(\", \") || \"None\"}\n </p>\n <p>\n Required node affinity:{\" \"}\n {selectedPod.spec?.affinity?.nodeAffinity?.requiredDuringSchedulingIgnoredDuringExecution\n ? JSON.stringify(\n selectedPod.spec.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution,\n ).slice(0, 2000)\n : \"None\"}\n </p>\n\n <button type=\"button\" title=\"Open pod details\" onClick={() => openResource(selectedPod, data!.clusterId)}>\n <AiIcon material=\"open_in_new\" />\n Open pod\n </button>\n <p>\n {selectedPod.status?.conditions\n ?.map(\n (condition) =>\n `${condition.type}: ${condition.status}${condition.message ? ` (${condition.message})` : \"\"}`,\n )\n .join(\" · \")}\n </p>\n <table>\n <thead>\n <tr>\n <th>Evidence source</th>\n <th>Node</th>\n <th>Finding</th>\n </tr>\n </thead>\n <tbody>\n {diagnosis.evidence.map((entry, index) => (\n <tr key={`${entry.node}/${index}`}>\n <td>{entry.source === \"event\" ? \"Reported Kubernetes event\" : \"Local hard constraint\"}</td>\n <td>{entry.node ?? \"—\"}</td>\n <td>{entry.message}</td>\n </tr>\n ))}\n </tbody>\n </table>\n {!diagnosis.evidence.length && <p>No retained evidence is available for this pod</p>}\n {diagnosis.limitations.map((message) => (\n <p key={message}>{message}</p>\n ))}\n </>\n ) : (\n <p>{pending.length ? \"Select a pending pod\" : \"No pending pods available\"}</p>\n )}\n </>\n )}\n </div>\n );\n}\nfunction ConsumerRows({\n group,\n clusterId,\n expanded,\n toggle,\n usage,\n viewHistory,\n}: {\n group: ConsumerGroup;\n clusterId: string;\n expanded: boolean;\n toggle: () => void;\n usage: PodUsage[];\n viewHistory: (key: string) => void;\n}) {\n return (\n <>\n <tr>\n <td>\n <button\n type=\"button\"\n title={expanded ? \"Collapse pods\" : \"Expand pods\"}\n aria-expanded={expanded}\n onClick={toggle}\n >\n <AiIcon material={expanded ? \"expand_less\" : \"expand_more\"} />\n {group.namespace} / {group.kind} / {group.name}\n </button>\n <small>\n {group.pods.length} pods{group.ownerResolved ? \"\" : \" · Owner chain incomplete\"}\n </small>\n <TrackButton\n identity={{ clusterId, scope: group.kind === \"Pod\" ? \"pod\" : \"workload\", uid: group.identity }}\n />\n <button type=\"button\" title=\"View resource history\" onClick={() => viewHistory(groupKey(group))}>\n <AiIcon material=\"timeline\" />\n View history\n </button>\n </td>\n <td>{summaryText(group.cpu, \"cpu\")}</td>\n <td>{summaryText(group.memory, \"memory\")}</td>\n <td>\n {unscheduledText(group.cpu, \"cpu\")} / {unscheduledText(group.memory, \"memory\")}\n </td>\n </tr>\n {expanded &&\n group.pods.map((pod) => (\n <tr key={pod.metadata.uid}>\n <td>\n <button type=\"button\" title=\"Open pod details\" onClick={() => openResource(pod, clusterId)}>\n <AiIcon material=\"open_in_new\" />\n {pod.metadata.name}\n </button>{\" \"}\n {pod.metadata.uid && <TrackButton identity={{ clusterId, scope: \"pod\", uid: pod.metadata.uid }} />}\n {pod.status?.phase ?? \"Unknown\"} ·{\" \"}\n {pod.spec?.nodeName ? `Assigned to ${pod.spec.nodeName}` : \"Unscheduled\"}\n </td>\n <td>{podSummary(pod, usage, \"cpu\")}</td>\n <td>{podSummary(pod, usage, \"memory\")}</td>\n <td>{pod.spec?.nodeName ? \"—\" : \"Included above\"}</td>\n </tr>\n ))}\n </>\n );\n}\n\nfunction TrackButton({ identity }: { identity: HistoryIdentity }) {\n const preferences = MonitoringPreferencesStore.getInstanceOrCreate<MonitoringPreferencesStore>();\n const [, update] = useState(0);\n useEffect(\n () =>\n reaction(\n () => [preferences.historyEnabled, isHistoryTracked(identity)],\n () => update((value) => value + 1),\n ),\n [identity.clusterId, identity.scope, identity.uid, preferences],\n );\n const tracked = isHistoryTracked(identity);\n return (\n <button\n type=\"button\"\n disabled={!preferences.historyEnabled}\n title={\n preferences.historyEnabled\n ? \"Track numeric resource history locally\"\n : \"Enable local history in extension preferences\"\n }\n aria-pressed={tracked}\n onClick={() => {\n if (activeId() !== identity.clusterId || !preferences.historyEnabled) return;\n setHistoryTracked(identity, !tracked);\n update((value) => value + 1);\n }}\n >\n <AiIcon material={tracked ? \"visibility\" : \"visibility_off\"} />\n {tracked ? \"Stop tracking\" : \"Track history\"}\n </button>\n );\n}\n\nfunction podRequest(pod: DiagnosticsObject, metric: \"cpu\" | \"memory\"): string {\n try {\n return resourceText(effectivePodResource(pod, metric), metric);\n } catch {\n return \"Unavailable\";\n }\n}\nfunction podSummary(pod: DiagnosticsObject, usage: PodUsage[], metric: \"cpu\" | \"memory\"): string {\n let request: number | undefined;\n try {\n request = effectivePodResource(pod, metric);\n } catch {}\n const value = usage.find((item) => item.uid === pod.metadata.uid)?.[metric];\n return `${resourceText(value, metric)}, requests ${resourceText(request, metric)}${value !== undefined && request ? `, ${((value / request) * 100).toFixed(0)}% of requests` : \", ratio unavailable\"}`;\n}\nfunction NamespaceRows({\n namespace,\n groups,\n clusterId,\n usage,\n open,\n toggleNamespace,\n expanded,\n toggleGroup,\n viewHistory,\n}: {\n namespace: string;\n groups: ConsumerGroup[];\n clusterId: string;\n usage: PodUsage[];\n viewHistory: (key: string) => void;\n open: boolean;\n toggleNamespace: () => void;\n expanded: string[];\n toggleGroup: (key: string) => void;\n}) {\n const sum = (metric: \"cpu\" | \"memory\"): ResourceSummary =>\n groups.reduce(\n (total, group) => {\n const next = group[metric];\n return {\n requests: total.requests + next.requests,\n scheduledRequests: total.scheduledRequests + next.scheduledRequests,\n unscheduledRequests: total.unscheduledRequests + next.unscheduledRequests,\n usage:\n total.usage === undefined && next.usage === undefined ? undefined : (total.usage ?? 0) + (next.usage ?? 0),\n coveredPods: total.coveredPods + next.coveredPods,\n totalPods: total.totalPods + next.totalPods,\n unknownRequestPods: total.unknownRequestPods + next.unknownRequestPods,\n };\n },\n {\n requests: 0,\n scheduledRequests: 0,\n unscheduledRequests: 0,\n coveredPods: 0,\n totalPods: 0,\n unknownRequestPods: 0,\n } as ResourceSummary,\n );\n return (\n <>\n {namespace && (\n <tr>\n <td>\n <button type=\"button\" title=\"Expand namespace workloads\" aria-expanded={open} onClick={toggleNamespace}>\n <AiIcon material={open ? \"expand_less\" : \"expand_more\"} />\n {namespace}\n </button>\n <small>{groups.length} consumers</small>\n </td>\n <td>{summaryText(sum(\"cpu\"), \"cpu\")}</td>\n <td>{summaryText(sum(\"memory\"), \"memory\")}</td>\n <td>\n {unscheduledText(sum(\"cpu\"), \"cpu\")} / {unscheduledText(sum(\"memory\"), \"memory\")}\n </td>\n </tr>\n )}\n {open &&\n groups.map((group) => (\n <ConsumerRows\n key={groupKey(group)}\n group={group}\n clusterId={clusterId}\n expanded={expanded.includes(groupKey(group))}\n toggle={() => toggleGroup(groupKey(group))}\n usage={usage}\n viewHistory={viewHistory}\n />\n ))}\n </>\n );\n}\n\nfunction ApplicationHistory({ data, group }: { data: MonitoringSnapshot; group?: ConsumerGroup }) {\n const live = useMemo((): MonitoringSample[] => {\n if (\n !group ||\n group.cpu.coveredPods !== group.cpu.totalPods ||\n group.memory.coveredPods !== group.memory.totalPods ||\n group.cpu.usage === undefined ||\n group.memory.usage === undefined\n )\n return [];\n const names = new Set(group.pods.map((pod) => `${pod.metadata.namespace}/${pod.metadata.name}`));\n const times = (data.podMetrics ?? [])\n .filter((metric) => names.has(`${metric.metadata.namespace}/${metric.metadata.name}`))\n .map((metric) => Date.parse(metric.timestamp));\n if (!times.length || times.some((time) => !Number.isFinite(time))) return [];\n return [\n {\n time: Math.min(...times),\n cpu: group.cpu.usage,\n memory: group.memory.usage,\n resources: {\n cpu: { requests: group.cpu.unknownRequestPods ? undefined : group.cpu.requests },\n memory: { requests: group.memory.unknownRequestPods ? undefined : group.memory.requests },\n },\n },\n ];\n }, [data, group]);\n const history = useMonitoringHistory(\n group\n ? { clusterId: data.clusterId, scope: group.kind === \"Pod\" ? \"pod\" : \"workload\", uid: group.identity }\n : undefined,\n live,\n );\n return (\n <section aria-label=\"Application resource history\">\n <h3>{group?.name ?? \"Unavailable application\"} resource history</h3>\n <MonitoringHistoryRange range={history.range} onChange={history.setRange} />\n <p role=\"status\">{history.status}</p>\n <p>\n {live.length\n ? \"Live usage includes every current pod; source metric timestamps are used\"\n : \"Complete current usage unavailable; missing coverage remains a gap\"}\n </p>\n {([\"cpu\", \"memory\"] as const).map((metric) => (\n <MetricChart\n key={metric}\n metric={metric}\n samples={history.samples}\n scope=\"pod\"\n status={live.length ? \"\" : \"Complete live usage unavailable\"}\n />\n ))}\n </section>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"diagnostics.js","names":[],"sources":["../../src/renderer/diagnostics.tsx"],"sourcesContent":["import { Renderer } from \"@freelensapp/extensions\";\nimport { reaction } from \"mobx\";\nimport { type MouseEvent, useEffect, useMemo, useRef, useState } from \"react\";\nimport { formatDateTime } from \"../common/date-time\";\nimport {\n buildConsumerGroups,\n type ConsumerGroup,\n type DiagnosticsObject,\n diagnosePendingPod,\n effectivePodResource,\n normalizeEvents,\n observeResourceChanges,\n type PodUsage,\n type ResourceSummary,\n type TimelineEntry,\n} from \"../common/resource-diagnostics\";\nimport { AiIcon } from \"./ai-icon\";\nimport { diagnosticsStyles } from \"./diagnostics.css\";\nimport {\n getCollectedPodUsage,\n getMonitoringSnapshot,\n type MonitoringSnapshot,\n retainMonitoringCollector,\n} from \"./monitoring-collector\";\n\nconst viewDescriptions = {\n Consumers: [\n \"What is using cluster resources?\",\n \"Compare workload usage and requests, then expand a workload to inspect its pods.\",\n ],\n Timeline: [\n \"What changed in this workload?\",\n \"Follow related Kubernetes events and changes observed while this view is open.\",\n ],\n Pending: [\n \"Why is this pod waiting?\",\n \"Inspect scheduling evidence and resource requests before opening the pod for investigation.\",\n ],\n};\nfunction DiagnosticsSelect({\n label,\n value,\n onChange,\n options,\n}: {\n label: string;\n value: string;\n onChange: (value: string) => void;\n options: { value: string; label: string }[];\n}) {\n return (\n <span className=\"diagnostics-select\">\n <Renderer.Component.Select\n aria-label={label}\n value={value}\n options={options}\n onChange={(option) => {\n if (option) onChange(option.value);\n }}\n isClearable={false}\n />\n </span>\n );\n}\nfunction ResourceCell({ summary, metric }: { summary: ResourceSummary; metric: \"cpu\" | \"memory\" }) {\n const complete = summary.coveredPods === summary.totalPods && !summary.unknownRequestPods;\n const ratio =\n complete && summary.usage !== undefined && summary.requests > 0\n ? `${((summary.usage / summary.requests) * 100).toFixed(0)}% of requests`\n : undefined;\n return (\n <div className=\"resource-cell\">\n <div className=\"resource-value\">\n <small>Usage</small>\n <strong>{resourceText(summary.usage, metric)}</strong>\n </div>\n <div className=\"resource-request\">\n <small>{summary.unknownRequestPods ? \"Known requests\" : \"Requests\"}</small>\n <span>{resourceText(summary.requests, metric)}</span>\n </div>\n <small\n className=\"resource-coverage\"\n title=\"Coverage is per resource. Missing metrics are unavailable, never zero.\"\n >\n {summary.coveredPods}/{summary.totalPods} pods covered\n {summary.unknownRequestPods ? ` · ${summary.unknownRequestPods} requests unknown` : \"\"}\n {ratio ? ` · ${ratio}` : \"\"}\n </small>\n {complete && summary.usage !== undefined && summary.requests > 0 && summary.usage > summary.requests && (\n <span\n className=\"request-burst\"\n title=\"Usage exceeds configured requests. Requests are reservations, not limits; this alone does not indicate a failure.\"\n >\n <AiIcon material=\"info_outline\" size={12} />\n Above requests\n </span>\n )}\n </div>\n );\n}\nfunction UnscheduledCell({ cpu, memory }: { cpu: ResourceSummary; memory: ResourceSummary }) {\n const partial = cpu.unknownRequestPods || memory.unknownRequestPods;\n if (!partial && !cpu.unscheduledRequests && !memory.unscheduledRequests)\n return (\n <span className=\"unscheduled-empty\" title=\"No unscheduled requests\">\n —\n </span>\n );\n return (\n <div className={`unscheduled-cell${cpu.unscheduledRequests || memory.unscheduledRequests ? \" has-requests\" : \"\"}`}>\n <div>\n <small>CPU</small>\n <span>{unscheduledText(cpu, \"cpu\")}</span>\n </div>\n <div>\n <small>Memory</small>\n <span>{unscheduledText(memory, \"memory\")}</span>\n </div>\n </div>\n );\n}\nexport function consumerStatus(pods: DiagnosticsObject[]): { tone: string; label: string; icon: string } {\n const failureReasons = new Set([\n \"CrashLoopBackOff\",\n \"ImagePullBackOff\",\n \"ErrImagePull\",\n \"CreateContainerConfigError\",\n \"CreateContainerError\",\n \"RunContainerError\",\n \"InvalidImageName\",\n ]);\n for (const pod of pods) {\n type WaitingStatus = { state?: { waiting?: { reason?: string } } };\n const status = pod.status as\n | { containerStatuses?: WaitingStatus[]; initContainerStatuses?: WaitingStatus[] }\n | undefined;\n const statuses = [...(status?.containerStatuses ?? []), ...(status?.initContainerStatuses ?? [])];\n const reason = statuses\n ?.map((status) => status.state?.waiting?.reason)\n .find((value) => value && failureReasons.has(value));\n if (pod.status?.phase === \"Failed\" || reason)\n return { tone: \"error\", label: reason ?? \"Failed\", icon: \"error_outline\" };\n }\n const pendingCount = pods.filter((pod) => pod.status?.phase === \"Pending\").length;\n if (pendingCount) return { tone: \"warning\", label: `${pendingCount} Pending`, icon: \"hourglass_empty\" };\n if (\n pods.some((pod) =>\n pod.status?.conditions?.some((condition) => condition.type === \"Ready\" && condition.status === \"False\"),\n )\n )\n return { tone: \"warning\", label: \"Not ready\", icon: \"warning_amber\" };\n if (\n pods.length &&\n pods.every(\n (pod) =>\n pod.status?.phase === \"Running\" &&\n pod.status.conditions?.some((condition) => condition.type === \"Ready\" && condition.status === \"True\"),\n )\n )\n return { tone: \"healthy\", label: \"Ready\", icon: \"check_circle_outline\" };\n return { tone: \"neutral\", label: \"Readiness unknown\", icon: \"help_outline\" };\n}\nfunction ConsumerStatus({ pods }: { pods: DiagnosticsObject[] }) {\n const status = consumerStatus(pods);\n return (\n <span className={`consumer-status ${status.tone}`}>\n <AiIcon material={status.icon} size={13} />\n {status.label}\n </span>\n );\n}\ntype Tab = \"Consumers\" | \"Timeline\" | \"Pending\";\nconst hidden = () => document.visibilityState === \"hidden\";\nconst activeId = () => Renderer.Catalog.activeCluster.get()?.metadata.uid;\nconst groupKey = (group: ConsumerGroup) => `${group.namespace}/${group.identity}`;\nfunction resourceText(value: number | undefined, metric: \"cpu\" | \"memory\"): string {\n if (value === undefined) return \"Unavailable\";\n return metric === \"cpu\" ? `${value.toFixed(3)} cores` : `${(value / 1024 ** 2).toFixed(1)} MiB`;\n}\nfunction unscheduledText(summary: ResourceSummary, metric: \"cpu\" | \"memory\"): string {\n return `${summary.unknownRequestPods ? \"Partial known: \" : \"\"}${resourceText(summary.unscheduledRequests, metric)}`;\n}\nconst resources: Record<string, string> = {\n Pod: \"/api/v1\",\n Deployment: \"/apis/apps/v1\",\n ReplicaSet: \"/apis/apps/v1\",\n StatefulSet: \"/apis/apps/v1\",\n DaemonSet: \"/apis/apps/v1\",\n Job: \"/apis/batch/v1\",\n CronJob: \"/apis/batch/v1\",\n};\nconst plurals: Record<string, string> = {\n Pod: \"pods\",\n Deployment: \"deployments\",\n ReplicaSet: \"replicasets\",\n StatefulSet: \"statefulsets\",\n DaemonSet: \"daemonsets\",\n Job: \"jobs\",\n CronJob: \"cronjobs\",\n};\nfunction openResource(object: DiagnosticsObject, clusterId: string, event: MouseEvent): void {\n event.stopPropagation();\n const kind = object.kind ?? \"Pod\";\n if (activeId() !== clusterId || !object.metadata.name || !object.metadata.namespace || !resources[kind]) return;\n const path = `${resources[kind]}/namespaces/${encodeURIComponent(object.metadata.namespace)}/${plurals[kind]}/${encodeURIComponent(object.metadata.name)}`;\n void Promise.resolve(Renderer.Navigation.showDetails(path)).catch(() => {});\n}\nconst projections = new WeakMap<MonitoringSnapshot, ReturnType<typeof projectSnapshot>>();\nfunction projectSnapshot(data: MonitoringSnapshot) {\n const usage = getCollectedPodUsage(data);\n const groups = buildConsumerGroups(data.pods ?? [], data.owners ?? [], usage);\n const objects = new Map<string, DiagnosticsObject>();\n const children = new Map<string, string[]>();\n for (const object of [...(data.owners ?? []), ...(data.pods ?? [])]) {\n const uid = object.metadata.uid;\n if (!uid) continue;\n objects.set(uid, object);\n const refs = object.metadata.ownerReferences ?? [];\n const parent = refs.find((item) => item.controller) ?? (refs.length === 1 ? refs[0] : undefined);\n if (parent) {\n const siblings = children.get(parent.uid) ?? [];\n siblings.push(uid);\n children.set(parent.uid, siblings);\n }\n }\n const related = new Map<string, Set<string>>();\n for (const group of groups) {\n const seen = new Set<string>();\n const stack = [group.identity];\n while (stack.length) {\n const uid = stack.pop()!;\n if (seen.has(uid)) continue;\n const object = objects.get(uid);\n if (object && object.metadata.namespace !== group.namespace) continue;\n seen.add(uid);\n stack.push(...(children.get(uid) ?? []));\n }\n related.set(groupKey(group), seen);\n }\n return { usage, groups, objects, related };\n}\nfunction projection(data: MonitoringSnapshot) {\n let value = projections.get(data);\n if (!value) {\n value = projectSnapshot(data);\n projections.set(data, value);\n }\n return value;\n}\nexport function DiagnosticsPage() {\n const [tab, setTab] = useState<Tab>(\"Consumers\");\n const [snapshot, setSnapshot] = useState<MonitoringSnapshot>();\n const [error, setError] = useState(\"\");\n const [filter, setFilter] = useState(\"\");\n const [needsAttention, setNeedsAttention] = useState(true);\n const [groupMode, setGroupMode] = useState(\"workload\");\n const [namespacesOpen, setNamespacesOpen] = useState<string[]>([]);\n const known = useRef(new Map<string, { group: ConsumerGroup; uids: Set<string> }>());\n const [sort, setSort] = useState(\"cpu\");\n const [expanded, setExpanded] = useState<string[]>([]);\n const [selected, setSelected] = useState(\"\");\n const [pendingUid, setPendingUid] = useState(\"\");\n const [reason, setReason] = useState(\"\");\n const [warningOnly, setWarningOnly] = useState(true);\n const [observed, setObserved] = useState<TimelineEntry[]>([]);\n const previous = useRef<MonitoringSnapshot>();\n useEffect(() => {\n const release = retainMonitoringCollector();\n let disposed = false;\n let generation = 0;\n let loading = false;\n const clear = () => {\n generation++;\n previous.current = undefined;\n known.current.clear();\n setSnapshot(undefined);\n setObserved([]);\n setSelected(\"\");\n setPendingUid(\"\");\n setExpanded([]);\n setError(\"\");\n };\n const load = async () => {\n if (loading || disposed || hidden()) return;\n const cluster = activeId();\n if (!cluster) {\n setError(\"Select a connected cluster\");\n return;\n }\n const current = generation;\n loading = true;\n try {\n const next = await getMonitoringSnapshot(true);\n if (disposed || current !== generation || next.clusterId !== activeId() || hidden()) return;\n const prior = previous.current;\n if (prior === next) return;\n if (prior && prior.clusterId === next.clusterId) {\n const entries: TimelineEntry[] = [];\n if (prior.time !== next.time)\n entries.push(\n ...observeResourceChanges(prior.pods ?? [], next.pods ?? [], new Date(next.time).toISOString()),\n );\n if (prior.owners !== next.owners && next.diagnosticsTime)\n entries.push(\n ...observeResourceChanges(\n prior.owners ?? [],\n next.owners ?? [],\n new Date(next.diagnosticsTime).toISOString(),\n ),\n );\n if (entries.length) setObserved((items) => [...entries, ...items].slice(0, 300));\n }\n const projected = projection(next);\n for (const group of projected.groups) {\n const key = groupKey(group);\n const remembered = known.current.get(key)?.uids ?? new Set<string>();\n for (const uid of projected.related.get(key) ?? []) remembered.add(uid);\n while (remembered.size > 500) remembered.delete(remembered.values().next().value!);\n known.current.set(key, { group, uids: remembered });\n }\n while (known.current.size > 100) known.current.delete(known.current.keys().next().value!);\n previous.current = next;\n setSnapshot(next);\n setError(\"\");\n } catch {\n if (!disposed && current === generation) setError(\"Diagnostics unavailable or access denied\");\n } finally {\n loading = false;\n }\n };\n const stop = reaction(activeId, () => {\n clear();\n void load();\n });\n const visibility = () => {\n if (document.visibilityState !== \"hidden\") void load();\n };\n const timer = window.setInterval(() => void load(), 1000);\n document.addEventListener(\"visibilitychange\", visibility);\n void load();\n return () => {\n disposed = true;\n generation++;\n stop();\n release();\n window.clearInterval(timer);\n document.removeEventListener(\"visibilitychange\", visibility);\n };\n }, []);\n const data = snapshot?.clusterId === activeId() ? snapshot : undefined;\n const projected = useMemo(() => (data ? projection(data) : undefined), [data]);\n const groups = projected?.groups ?? [];\n const filtered = useMemo(\n () =>\n groups\n .filter((group) =>\n `${group.namespace} ${group.name} ${group.kind}`.toLowerCase().includes(filter.toLowerCase()),\n )\n .filter((group) => !needsAttention || [\"error\", \"warning\"].includes(consumerStatus(group.pods).tone))\n .sort((a, b) =>\n sort === \"name\"\n ? a.namespace.localeCompare(b.namespace) ||\n a.name.localeCompare(b.name) ||\n a.kind.localeCompare(b.kind) ||\n a.identity.localeCompare(b.identity)\n : sort === \"requests\" || sort === \"memoryRequests\"\n ? b[sort === \"requests\" ? \"cpu\" : \"memory\"].requests - a[sort === \"requests\" ? \"cpu\" : \"memory\"].requests\n : (b[sort === \"memory\" ? \"memory\" : \"cpu\"].usage ?? -1) -\n (a[sort === \"memory\" ? \"memory\" : \"cpu\"].usage ?? -1),\n ),\n [groups, filter, sort, needsAttention],\n );\n const warningUids = new Set(\n (data?.events ?? [])\n .filter((event) => event.type === \"Warning\")\n .map((event) => event.involvedObject?.uid ?? event.regarding?.uid)\n .filter((uid): uid is string => !!uid),\n );\n const applications = [...known.current.values()]\n .filter((item) => !warningOnly || [...item.uids].some((uid) => warningUids.has(uid)))\n .map((item) => item.group);\n const selectionAvailable = applications.some((group) => groupKey(group) === selected);\n useEffect(() => {\n if (selected && !selectionAvailable) setSelected(\"\");\n }, [selected, selectionAvailable]);\n const application = applications.find((group) => groupKey(group) === selected);\n const uids = new Set(known.current.get(selected)?.uids ?? []);\n const normalizedEvents = normalizeEvents(data?.events ?? []);\n const warningIds = new Set(\n normalizedEvents.filter((_entry, index) => data?.events?.[index]?.type === \"Warning\").map((entry) => entry.id),\n );\n const eventReferences = new Map(\n normalizedEvents.map((entry, index) => {\n const event = data?.events?.[index];\n return [entry.id, event?.involvedObject ?? event?.regarding] as const;\n }),\n );\n const timeline = [...normalizedEvents, ...observed]\n .filter(\n (entry) =>\n (!application || (!!entry.objectUid && uids.has(entry.objectUid))) &&\n (!reason || `${entry.reason} ${entry.message}`.toLowerCase().includes(reason.toLowerCase())) &&\n (!warningOnly || warningIds.has(entry.id)),\n )\n .sort((a, b) => (Date.parse(b.time ?? \"\") || 0) - (Date.parse(a.time ?? \"\") || 0));\n const pending = (data?.pods ?? []).filter((pod) => pod.status?.phase === \"Pending\");\n const PendingCard = pending.length && data?.pods ? \"button\" : \"div\";\n const selectedPod = pending.find((pod) => pod.metadata.uid === pendingUid);\n const diagnosis = selectedPod\n ? diagnosePendingPod(selectedPod, data?.nodes ?? [], data?.events ?? [], data?.pvcs)\n : undefined;\n return (\n <div className=\"power-diagnostics\" style={{ padding: 24, overflow: \"auto\", height: \"100%\", minWidth: 0 }}>\n <style>{diagnosticsStyles}</style>\n <header className=\"diagnostics-header\">\n <h2>Resource diagnostics</h2>\n <span className=\"snapshot-meta\">Read-only snapshot{data ? ` · ${formatDateTime(data.time)}` : \"\"}</span>\n </header>\n <nav aria-label=\"Diagnostics views\">\n {([\"Consumers\", \"Timeline\", \"Pending\"] as Tab[]).map((name) => (\n <button\n key={name}\n type=\"button\"\n title={`Show ${name.toLowerCase()}`}\n aria-pressed={tab === name}\n onClick={() => setTab(name)}\n >\n <AiIcon\n material={name === \"Consumers\" ? \"account_tree\" : name === \"Timeline\" ? \"timeline\" : \"hourglass_empty\"}\n />\n {name}\n {name === \"Pending\" && data?.pods ? ` (${pending.length})` : \"\"}\n </button>\n ))}\n </nav>\n {error && (\n <p className=\"diagnostics-notice\" role=\"status\">\n {error}. Check the cluster connection and your access permissions.\n </p>\n )}\n {data?.errors.map((message) => (\n <p className=\"diagnostics-notice\" role=\"status\" key={message}>\n {message}\n </p>\n ))}\n <section className=\"view-intro\">\n <h3>{viewDescriptions[tab][0]}</h3>\n <p>{viewDescriptions[tab][1]}</p>\n </section>\n {data && tab === \"Consumers\" && (\n <div className=\"diagnostics-summary\" aria-label=\"Snapshot summary\">\n <div className=\"summary-card workloads\">\n <span className=\"summary-icon\">\n <AiIcon material=\"account_tree\" size={22} />\n </span>\n <div>\n <strong>{data.pods ? groups.length : \"Unavailable\"}</strong>\n <span>Workloads and standalone pods</span>\n </div>\n </div>\n <div className=\"summary-card pods\">\n <span className=\"summary-icon\">\n <AiIcon material=\"view_in_ar\" size={22} />\n </span>\n <div>\n <strong>{data.pods?.length ?? \"Unavailable\"}</strong>\n <span>Pods in snapshot</span>\n </div>\n </div>\n <PendingCard\n className={`summary-card pending${!data.pods ? \" unavailable\" : pending.length ? \" attention\" : \"\"}`}\n {...(pending.length\n ? {\n type: \"button\" as const,\n title: \"Inspect pending pods\",\n \"aria-label\": \"Inspect pending pods\",\n onClick: () => {\n setPendingUid(pending[0]?.metadata.uid ?? \"\");\n setTab(\"Pending\");\n },\n }\n : {})}\n >\n <span className=\"summary-icon\">\n <AiIcon material=\"hourglass_empty\" size={22} />\n </span>\n <div>\n <strong>{data.pods ? pending.length : \"Unavailable\"}</strong>\n <span>Pending pods</span>\n </div>\n </PendingCard>\n </div>\n )}\n {!data && !error && (\n <p className=\"diagnostics-empty\" role=\"status\">\n Loading resource diagnostics…\n </p>\n )}\n {tab === \"Consumers\" && data && (\n <>\n <div className=\"toolbar consumers-toolbar\">\n <label>\n Group by{\" \"}\n <DiagnosticsSelect\n label=\"Group consumers\"\n value={groupMode}\n onChange={setGroupMode}\n options={[\n { value: \"workload\", label: \"Workload\" },\n { value: \"namespace\", label: \"Namespace\" },\n ]}\n />\n </label>\n <label className=\"search-field\">\n Search consumers\n <span className=\"diagnostics-input\">\n <Renderer.Component.Input\n aria-label=\"Filter consumers\"\n placeholder=\"Namespace or workload\"\n value={filter}\n onChange={setFilter}\n />\n </span>\n </label>\n <label>\n Sort{\" \"}\n <DiagnosticsSelect\n label=\"Sort consumers\"\n value={sort}\n onChange={setSort}\n options={[\n { value: \"cpu\", label: \"CPU usage\" },\n { value: \"memory\", label: \"Memory usage\" },\n { value: \"requests\", label: \"CPU requests\" },\n { value: \"memoryRequests\", label: \"Memory requests\" },\n { value: \"name\", label: \"Namespace / name\" },\n ]}\n />\n </label>\n <div className=\"warning-filter\">\n <Renderer.Component.Checkbox\n label=\"Needs attention\"\n value={needsAttention}\n onChange={setNeedsAttention}\n />\n </div>\n </div>\n <details className=\"diagnostics-explainer\">\n <summary>How to read usage and requests</summary>\n <p>\n Usage is measured consumption. Requests are configured resource reservations. Coverage is reported\n separately for CPU and memory; missing metrics are unavailable, never zero. Requests from unscheduled pods\n appear separately.\n </p>\n </details>\n <div className=\"diagnostics-table\">\n <table className=\"consumers-table\">\n <colgroup>\n <col className=\"consumer-column\" />\n <col className=\"metric-column\" />\n <col className=\"metric-column\" />\n <col className=\"unscheduled-column\" />\n </colgroup>\n <thead>\n <tr>\n <th>Namespace / consumer</th>\n <th className=\"numeric\">CPU usage / requests</th>\n <th className=\"numeric\">Memory usage / requests</th>\n <th>Unscheduled requests</th>\n </tr>\n </thead>\n <tbody>\n {(groupMode === \"namespace\" ? [...new Set(filtered.map((group) => group.namespace))] : [\"\"]).map(\n (namespace) => (\n <NamespaceRows\n key={namespace}\n namespace={namespace}\n groups={namespace ? filtered.filter((group) => group.namespace === namespace) : filtered}\n clusterId={data?.clusterId ?? \"\"}\n usage={projected?.usage ?? []}\n open={!namespace || namespacesOpen.includes(namespace)}\n toggleNamespace={() =>\n setNamespacesOpen((items) =>\n items.includes(namespace)\n ? items.filter((item) => item !== namespace)\n : [...items, namespace],\n )\n }\n expanded={expanded}\n toggleGroup={(key) =>\n setExpanded((items) =>\n items.includes(key) ? items.filter((item) => item !== key) : [...items, key],\n )\n }\n />\n ),\n )}\n </tbody>\n </table>\n </div>\n {!filtered.length &&\n (!data.pods ? (\n <p className=\"diagnostics-empty\">Pod inventory unavailable</p>\n ) : filter ? (\n <p className=\"diagnostics-empty\">No consumers match this filter</p>\n ) : needsAttention && groups.length ? (\n <div\n className={`diagnostics-empty attention-empty ${groups.every((group) => consumerStatus(group.pods).tone === \"healthy\") ? \"all-ready\" : \"readiness-unconfirmed\"}`}\n >\n <AiIcon\n material={\n groups.every((group) => consumerStatus(group.pods).tone === \"healthy\")\n ? \"check_circle_outline\"\n : \"info_outline\"\n }\n size={22}\n />\n <strong>\n {groups.every((group) => consumerStatus(group.pods).tone === \"healthy\")\n ? \"All consumers are ready\"\n : \"No known issues\"}\n </strong>\n <small>\n {groups.every((group) => consumerStatus(group.pods).tone === \"healthy\")\n ? \"No pending pods or known failures in this snapshot.\"\n : \"Unconfirmed readiness is not treated as a failure. Show all consumers to inspect them.\"}\n </small>\n <button type=\"button\" onClick={() => setNeedsAttention(false)}>\n Show all consumers\n </button>\n </div>\n ) : (\n <p className=\"diagnostics-empty\">No consumers available</p>\n ))}\n </>\n )}\n {tab === \"Timeline\" && data && (\n <>\n <div className=\"toolbar timeline-toolbar\">\n <label>\n Application{\" \"}\n <DiagnosticsSelect\n label=\"Timeline application\"\n value={selectionAvailable ? selected : \"\"}\n onChange={setSelected}\n options={[\n { value: \"\", label: \"All applications\" },\n ...applications.map((group) => ({\n value: groupKey(group),\n label: `${group.namespace} / ${group.kind} / ${group.name}`,\n })),\n ]}\n />\n </label>\n <label className=\"search-field\">\n Search events\n <span className=\"diagnostics-input\">\n <Renderer.Component.Input\n aria-label=\"Filter timeline reason\"\n placeholder=\"Reason or message\"\n value={reason}\n onChange={setReason}\n />\n </span>\n </label>\n <div className=\"warning-filter\">\n <Renderer.Component.Checkbox label=\"Warnings only\" value={warningOnly} onChange={setWarningOnly} />\n </div>\n </div>\n <details className=\"diagnostics-explainer\">\n <summary>Timeline coverage and timing</summary>\n <p>\n Kubernetes events have limited retention. Observed changes begin with this open view, retain at most 300\n entries, and have unknown transition times between snapshots. Related identities observed in this view are\n retained for at most 100 applications and 500 identities per application; older identity coverage can be\n incomplete.\n </p>\n </details>\n <div className=\"timeline-legend\" aria-label=\"Event types\">\n {[\"Warning\", \"Rollout\", \"Restart\", \"Readiness\", \"Kubernetes event\", \"Observed change\"].map((label) => (\n <span key={label} className={`timeline-type ${eventCategory(label)}`}>\n {label}\n </span>\n ))}\n </div>\n <ol className=\"diagnostics-timeline\" aria-label=\"Workload event timeline\">\n {timeline.map((entry) => {\n const kind = eventCategory(entry.reason);\n const category = warningIds.has(entry.id)\n ? \"warning\"\n : kind === \"event\" && entry.certainty === \"observed\"\n ? \"observed\"\n : kind;\n const label =\n category === \"warning\"\n ? \"Warning\"\n : category === \"rollout\"\n ? \"Rollout\"\n : category === \"restart\"\n ? \"Restart\"\n : category === \"readiness\"\n ? \"Readiness\"\n : entry.certainty === \"observed\"\n ? \"Observed change\"\n : \"Kubernetes event\";\n const object = entry.objectUid ? projected?.objects.get(entry.objectUid) : undefined;\n const reference = eventReferences.get(entry.id);\n const referenceKind = object?.kind ?? reference?.kind;\n const metadata = object?.metadata ?? reference;\n return (\n <li key={entry.id} className={`timeline-entry ${category}`}>\n <div className=\"timeline-time\">\n {entry.time ? <time dateTime={entry.time}>{formatDateTime(entry.time)}</time> : \"Time unknown\"}\n <small>{entry.certainty === \"observed\" ? \"Observed at snapshot\" : \"Kubernetes event time\"}</small>\n </div>\n <div className=\"timeline-content\">\n {object && data && (\n <button\n type=\"button\"\n className=\"timeline-resource-action\"\n aria-label=\"Open resource\"\n title={`Open ${object.kind ?? \"Pod\"} ${object.metadata.namespace} / ${object.metadata.name}`}\n onClick={(event) => openResource(object, data.clusterId, event)}\n >\n <AiIcon material=\"open_in_new\" />\n </button>\n )}\n <div className=\"timeline-card-heading\">\n {\" \"}\n <span className={`timeline-type ${category}`}>{label}</span>\n <h4>{entry.reason}</h4>\n <small className=\"timeline-resource-identity\">\n <AiIcon material={referenceKind === \"Pod\" ? \"view_in_ar\" : \"account_tree\"} size={12} />\n {metadata?.name\n ? `${metadata.namespace ?? \"Namespace unknown\"} / ${referenceKind ?? \"Resource\"} / ${metadata.name}`\n : \"Resource identity unavailable\"}\n </small>\n </div>\n <p>{entry.message}</p>\n <small>\n {entry.certainty === \"reported\"\n ? \"Reported\"\n : entry.certainty === \"observed\"\n ? \"Observed\"\n : \"Unknown\"}{\" \"}\n · Count {entry.count}\n {entry.firstTime ? ` · First ${formatDateTime(entry.firstTime)}` : \"\"}\n </small>\n {entry.gap && <small>{entry.gap}</small>}\n </div>\n </li>\n );\n })}\n </ol>\n {!timeline.length && (\n <div className=\"diagnostics-empty\">\n <p>\n {warningOnly\n ? \"No retained warning events match these filters\"\n : \"No retained events or observed changes match these filters\"}\n </p>\n {warningOnly && (\n <button type=\"button\" onClick={() => setWarningOnly(false)}>\n Show all events\n </button>\n )}\n </div>\n )}\n </>\n )}\n {tab === \"Pending\" && data && (\n <>\n <label>\n Pending pod{\" \"}\n <DiagnosticsSelect\n label=\"Pending pod\"\n value={pendingUid}\n onChange={setPendingUid}\n options={[\n { value: \"\", label: \"Select a pod\" },\n ...pending.map((pod) => ({\n value: pod.metadata.uid ?? \"\",\n label: `${pod.metadata.namespace} / ${pod.metadata.name}`,\n })),\n ]}\n />\n </label>\n {selectedPod && diagnosis ? (\n <>\n <div className={`pending-heading ${consumerStatus([selectedPod]).tone}`}>\n <div className=\"pending-title-row\">\n <div>\n <strong>\n {selectedPod.metadata.namespace} / {selectedPod.metadata.name}\n </strong>\n <div className=\"pending-state-row\">\n <h3>{diagnosis.state === \"assigned-waiting\" ? \"Assigned and waiting\" : \"Unscheduled\"}</h3>\n {consumerStatus([selectedPod]).tone === \"error\" && <ConsumerStatus pods={[selectedPod]} />}\n </div>\n </div>\n <button\n className=\"pending-open-action\"\n type=\"button\"\n title=\"Open pod details\"\n onClick={(event) => openResource(selectedPod, data!.clusterId, event)}\n >\n <AiIcon material=\"open_in_new\" size={15} />\n Open pod\n </button>\n </div>\n <p>\n {diagnosis.state === \"assigned-waiting\"\n ? \"A node is assigned. Check pod conditions and events for startup or storage issues.\"\n : \"No node is assigned. Start with scheduler events, then inspect constraints.\"}\n </p>\n <div className=\"pending-request-badges\">\n <span>\n <AiIcon material=\"memory\" size={14} />\n CPU request <strong>{podRequest(selectedPod, \"cpu\")}</strong>\n </span>\n <span>\n <AiIcon material=\"storage\" size={14} />\n Memory request <strong>{podRequest(selectedPod, \"memory\")}</strong>\n </span>\n </div>\n </div>\n <details className=\"diagnostics-explainer\">\n <summary>Scheduling constraints and pod conditions</summary>\n <p>\n Node selector:{\" \"}\n {Object.entries(selectedPod.spec?.nodeSelector ?? {})\n .map(([key, value]) => `${key}=${value}`)\n .join(\", \") || \"None\"}\n </p>\n <p>\n Tolerations:{\" \"}\n {(selectedPod.spec?.tolerations ?? [])\n .map(\n (item) =>\n `${item.key || \"all keys\"} ${item.operator ?? \"Equal\"}${item.value ? ` ${item.value}` : \"\"} (${item.effect || \"all effects\"})`,\n )\n .join(\", \") || \"None\"}\n </p>\n <p>\n Required node affinity:{\" \"}\n {selectedPod.spec?.affinity?.nodeAffinity?.requiredDuringSchedulingIgnoredDuringExecution\n ? JSON.stringify(\n selectedPod.spec.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution,\n ).slice(0, 2000)\n : \"None\"}\n </p>\n\n <p>\n {selectedPod.status?.conditions\n ?.map(\n (condition) =>\n `${condition.type}: ${condition.status}${condition.message ? ` (${condition.message})` : \"\"}`,\n )\n .join(\" · \")}\n </p>\n </details>\n <h3>Scheduling evidence</h3>\n <div className=\"diagnostics-table\">\n <table className=\"evidence-table\">\n <colgroup>\n <col className=\"evidence-source\" />\n <col className=\"evidence-node\" />\n <col className=\"evidence-finding\" />\n </colgroup>\n <thead>\n <tr>\n <th>Evidence source</th>\n <th>Node</th>\n <th>Finding</th>\n </tr>\n </thead>\n <tbody>\n {diagnosis.evidence.map((entry, index) => (\n <tr key={`${entry.node}/${index}`}>\n <td>\n <span className={`evidence-badge ${entry.source === \"event\" ? \"reported\" : \"inferred\"}`}>\n <AiIcon material={entry.source === \"event\" ? \"receipt_long\" : \"rule\"} size={13} />\n {entry.source === \"event\" ? \"Reported\" : \"Inferred\"}\n </span>\n <small>\n {entry.source === \"event\" ? \"Reported Kubernetes event\" : \"Local hard constraint\"}\n </small>\n </td>\n <td>{entry.node ?? \"—\"}</td>\n <td>{entry.message}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n {!diagnosis.evidence.length && <p>No retained evidence is available for this pod</p>}\n <details className=\"diagnostics-explainer\">\n <summary>What this diagnosis can establish</summary>\n {diagnosis.limitations.map((message) => (\n <p key={message}>{message}</p>\n ))}\n </details>\n </>\n ) : (\n <p className=\"diagnostics-empty\">\n {!data.pods\n ? \"Pod inventory unavailable. Check cluster access before investigating pending pods.\"\n : pending.length\n ? \"Select a pending pod to see scheduling evidence and requests\"\n : \"No pending pods in this snapshot\"}\n </p>\n )}\n </>\n )}\n </div>\n );\n}\nfunction ConsumerRows({\n group,\n clusterId,\n expanded,\n toggle,\n usage,\n depth,\n}: {\n group: ConsumerGroup;\n depth: number;\n clusterId: string;\n expanded: boolean;\n toggle: () => void;\n usage: PodUsage[];\n}) {\n return (\n <>\n <tr\n className={`consumer-workload-row consumer-depth-${depth} consumer-tone-${consumerStatus(group.pods).tone}`}\n data-row-depth={depth}\n >\n <td>\n <div className=\"consumer-identity-row\">\n <div className=\"consumer-identity-main\">\n <div className=\"consumer-title-line\">\n {group.ownerResolved && resources[group.kind] && group.name !== \"Unknown\" ? (\n <button\n className=\"consumer-resource-link\"\n type=\"button\"\n title={`Open ${group.kind} ${group.namespace} / ${group.name}`}\n onClick={(event) =>\n openResource(\n {\n kind: group.kind,\n metadata: { uid: group.identity, namespace: group.namespace, name: group.name },\n },\n clusterId,\n event,\n )\n }\n >\n {group.name}\n <AiIcon material=\"open_in_new\" size={13} />\n </button>\n ) : (\n <span className=\"consumer-identity-label\">{group.name}</span>\n )}\n <ConsumerStatus pods={group.pods} />\n </div>\n <small className=\"consumer-subtitle\">\n <AiIcon material=\"folder_open\" size={12} />\n {group.namespace}\n <span>·</span>\n <AiIcon material={group.kind === \"Pod\" ? \"view_in_ar\" : \"account_tree\"} size={12} />\n {group.kind}\n <span>·</span>\n {group.pods.length} pods{group.ownerResolved ? \"\" : \" · Owner chain incomplete\"}\n </small>\n </div>\n <div className=\"consumer-row-actions\">\n <span className=\"consumer-expand-slot\">\n <button\n className=\"consumer-expand\"\n type=\"button\"\n title={expanded ? \"Collapse pods\" : \"Expand pods\"}\n aria-label={`${expanded ? \"Collapse\" : \"Expand\"} pods for ${group.name}`}\n aria-expanded={expanded}\n onClick={toggle}\n >\n <AiIcon material={expanded ? \"expand_less\" : \"expand_more\"} />\n </button>\n </span>\n </div>\n </div>\n </td>\n <td className=\"numeric\">\n <ResourceCell summary={group.cpu} metric=\"cpu\" />\n </td>\n <td className=\"numeric\">\n <ResourceCell summary={group.memory} metric=\"memory\" />\n </td>\n <td className=\"numeric\">\n <UnscheduledCell cpu={group.cpu} memory={group.memory} />\n </td>\n </tr>\n {expanded &&\n group.pods.map((pod) => (\n <tr\n key={pod.metadata.uid}\n className={`consumer-pod-row consumer-depth-${depth + 1} consumer-tone-${consumerStatus([pod]).tone}`}\n data-row-depth={depth + 1}\n >\n <td>\n <div className=\"consumer-identity-row\">\n <div className=\"consumer-identity-main\">\n <div className=\"consumer-title-line\">\n <button\n className=\"consumer-resource-link\"\n type=\"button\"\n title=\"Open pod details\"\n onClick={(event) => openResource(pod, clusterId, event)}\n >\n <AiIcon material=\"view_in_ar\" size={14} />\n {pod.metadata.name}\n <AiIcon material=\"open_in_new\" size={12} />\n </button>\n <ConsumerStatus pods={[pod]} />\n </div>\n <small className=\"consumer-subtitle\">\n {pod.status?.phase ?? \"Unknown\"}\n <span>·</span>\n {pod.spec?.nodeName ? `Node ${pod.spec.nodeName}` : \"No node assigned\"}\n </small>\n </div>\n </div>\n </td>\n <td className=\"numeric\">\n <ResourceCell summary={podResourceGroup(pod, usage).cpu} metric=\"cpu\" />\n </td>\n <td className=\"numeric\">\n <ResourceCell summary={podResourceGroup(pod, usage).memory} metric=\"memory\" />\n </td>\n <td className=\"numeric\">\n <span\n className=\"unscheduled-empty\"\n title={\n pod.spec?.nodeName\n ? \"No unscheduled requests\"\n : \"Unscheduled requests are included in the workload total\"\n }\n >\n {pod.spec?.nodeName ? \"—\" : \"Included above\"}\n </span>\n </td>\n </tr>\n ))}\n </>\n );\n}\n\nfunction podRequest(pod: DiagnosticsObject, metric: \"cpu\" | \"memory\"): string {\n try {\n return resourceText(effectivePodResource(pod, metric), metric);\n } catch {\n return \"Unavailable\";\n }\n}\nfunction NamespaceRows({\n namespace,\n groups,\n clusterId,\n usage,\n open,\n toggleNamespace,\n expanded,\n toggleGroup,\n}: {\n namespace: string;\n groups: ConsumerGroup[];\n clusterId: string;\n usage: PodUsage[];\n open: boolean;\n toggleNamespace: () => void;\n expanded: string[];\n toggleGroup: (key: string) => void;\n}) {\n const sum = (metric: \"cpu\" | \"memory\"): ResourceSummary =>\n groups.reduce(\n (total, group) => {\n const next = group[metric];\n return {\n requests: total.requests + next.requests,\n scheduledRequests: total.scheduledRequests + next.scheduledRequests,\n unscheduledRequests: total.unscheduledRequests + next.unscheduledRequests,\n usage:\n total.usage === undefined && next.usage === undefined ? undefined : (total.usage ?? 0) + (next.usage ?? 0),\n coveredPods: total.coveredPods + next.coveredPods,\n totalPods: total.totalPods + next.totalPods,\n unknownRequestPods: total.unknownRequestPods + next.unknownRequestPods,\n };\n },\n {\n requests: 0,\n scheduledRequests: 0,\n unscheduledRequests: 0,\n coveredPods: 0,\n totalPods: 0,\n unknownRequestPods: 0,\n } as ResourceSummary,\n );\n return (\n <>\n {namespace && (\n <tr\n className={`consumer-namespace-row consumer-depth-0 consumer-tone-${consumerStatus(groups.flatMap((group) => group.pods)).tone}`}\n data-row-depth={0}\n >\n <td>\n <div className=\"consumer-identity-row\">\n <div className=\"consumer-identity-main\">\n <div className=\"consumer-title-line\">\n <span className=\"namespace-identity\">\n <AiIcon material=\"folder_open\" size={17} />\n <span className=\"consumer-identity-label\">{namespace}</span>\n </span>\n <ConsumerStatus pods={groups.flatMap((group) => group.pods)} />\n </div>\n <small\n className=\"consumer-subtitle\"\n title=\"Resource totals include only consumers shown by the current filters\"\n >\n {groups.length} shown consumers<span>·</span>\n {groups.reduce((total, group) => total + group.pods.length, 0)} pods\n </small>\n </div>\n <span className=\"consumer-expand-slot\">\n <button\n className=\"consumer-expand\"\n type=\"button\"\n title={open ? \"Collapse namespace workloads\" : \"Expand namespace workloads\"}\n aria-label={`${open ? \"Collapse\" : \"Expand\"} workloads in ${namespace}`}\n aria-expanded={open}\n onClick={toggleNamespace}\n >\n <AiIcon material={open ? \"expand_less\" : \"expand_more\"} />\n </button>\n </span>\n </div>\n </td>\n <td className=\"numeric\">\n <ResourceCell summary={sum(\"cpu\")} metric=\"cpu\" />\n </td>\n <td className=\"numeric\">\n <ResourceCell summary={sum(\"memory\")} metric=\"memory\" />\n </td>\n <td className=\"numeric\">\n <UnscheduledCell cpu={sum(\"cpu\")} memory={sum(\"memory\")} />\n </td>\n </tr>\n )}\n {open &&\n groups.map((group) => (\n <ConsumerRows\n key={groupKey(group)}\n group={group}\n depth={namespace ? 1 : 0}\n clusterId={clusterId}\n expanded={expanded.includes(groupKey(group))}\n toggle={() => toggleGroup(groupKey(group))}\n usage={usage}\n />\n ))}\n </>\n );\n}\n\nfunction podResourceGroup(pod: DiagnosticsObject, usage: PodUsage[]): ConsumerGroup {\n return buildConsumerGroups(\n [{ ...pod, kind: \"Pod\", metadata: { ...pod.metadata, ownerReferences: [] } }],\n [],\n usage,\n )[0]!;\n}\nfunction eventCategory(reason: string): string {\n if (reason === \"Observed change\") return \"observed\";\n if (reason === \"Warning\") return \"warning\";\n if ([\"Rollout\", \"RolloutObserved\"].includes(reason)) return \"rollout\";\n if (reason === \"Restart\" || reason.startsWith(\"Restarts/\")) return \"restart\";\n if (reason === \"Readiness\" || reason.startsWith(\"Readiness/\")) return \"readiness\";\n return \"event\";\n}\n"],"mappings":";;;;;;;;;;AAyBA,IAAM,mBAAmB;CACvB,WAAW,CACT,oCACA,kFACF;CACA,UAAU,CACR,kCACA,gFACF;CACA,SAAS,CACP,4BACA,6FACF;AACF;AACA,SAAS,kBAAkB,EACzB,OACA,OACA,UACA,WAMC;CACD,OACE,oCAAA,IAAC,QAAD;EAAM,WAAU;YACd,oCAAA,IAAC,mBAAA,SAAS,UAAU,QAApB;GACE,cAAY;GACL;GACE;GACT,WAAW,WAAW;IACpB,IAAI,QAAQ,SAAS,OAAO,KAAK;GACnC;GACA,aAAa;EACd,CAAA;CACG,CAAA;AAEV;AACA,SAAS,aAAa,EAAE,SAAS,UAAkE;CACjG,MAAM,WAAW,QAAQ,gBAAgB,QAAQ,aAAa,CAAC,QAAQ;CACvE,MAAM,QACJ,YAAY,QAAQ,UAAU,KAAA,KAAa,QAAQ,WAAW,IAC1D,IAAK,QAAQ,QAAQ,QAAQ,WAAY,IAAA,CAAK,QAAQ,CAAC,EAAE,iBACzD,KAAA;CACN,OACE,oCAAA,KAAC,OAAD;EAAK,WAAU;YAAf;GACE,oCAAA,KAAC,OAAD;IAAK,WAAU;cAAf,CACE,oCAAA,IAAC,SAAD,EAAA,UAAO,QAAY,CAAA,GACnB,oCAAA,IAAC,UAAD,EAAA,UAAS,aAAa,QAAQ,OAAO,MAAM,EAAU,CAAA,CAClD;;GACL,oCAAA,KAAC,OAAD;IAAK,WAAU;cAAf,CACE,oCAAA,IAAC,SAAD,EAAA,UAAQ,QAAQ,qBAAqB,mBAAmB,WAAkB,CAAA,GAC1E,oCAAA,IAAC,QAAD,EAAA,UAAO,aAAa,QAAQ,UAAU,MAAM,EAAQ,CAAA,CACjD;;GACL,oCAAA,KAAC,SAAD;IACE,WAAU;IACV,OAAM;cAFR;KAIG,QAAQ;KAAY;KAAE,QAAQ;KAAU;KACxC,QAAQ,qBAAqB,MAAM,QAAQ,mBAAmB,qBAAqB;KACnF,QAAQ,MAAM,UAAU;IACpB;;GACN,YAAY,QAAQ,UAAU,KAAA,KAAa,QAAQ,WAAW,KAAK,QAAQ,QAAQ,QAAQ,YAC1F,oCAAA,KAAC,QAAD;IACE,WAAU;IACV,OAAM;cAFR,CAIE,oCAAA,IAAC,gBAAA,QAAD;KAAQ,UAAS;KAAe,MAAM;IAAK,CAAA,GAAC,gBAExC;;EAEL;;AAET;AACA,SAAS,gBAAgB,EAAE,KAAK,UAA6D;CAE3F,IAAI,EADY,IAAI,sBAAsB,OAAO,uBACjC,CAAC,IAAI,uBAAuB,CAAC,OAAO,qBAClD,OACE,oCAAA,IAAC,QAAD;EAAM,WAAU;EAAoB,OAAM;YAA0B;CAE9D,CAAA;CAEV,OACE,oCAAA,KAAC,OAAD;EAAK,WAAW,mBAAmB,IAAI,uBAAuB,OAAO,sBAAsB,kBAAkB;YAA7G,CACE,oCAAA,KAAC,OAAD,EAAA,UAAA,CACE,oCAAA,IAAC,SAAD,EAAA,UAAO,MAAU,CAAA,GACjB,oCAAA,IAAC,QAAD,EAAA,UAAO,gBAAgB,KAAK,KAAK,EAAQ,CAAA,CACtC,EAAA,CAAA,GACL,oCAAA,KAAC,OAAD,EAAA,UAAA,CACE,oCAAA,IAAC,SAAD,EAAA,UAAO,SAAa,CAAA,GACpB,oCAAA,IAAC,QAAD,EAAA,UAAO,gBAAgB,QAAQ,QAAQ,EAAQ,CAAA,CAC5C,EAAA,CAAA,CACF;;AAET;AACA,SAAgB,eAAe,MAA0E;CACvG,MAAM,iCAAiB,IAAI,IAAI;EAC7B;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC;CACD,KAAK,MAAM,OAAO,MAAM;EAEtB,MAAM,SAAS,IAAI;EAInB,MAAM,SAAS,CADG,GAAI,QAAQ,qBAAqB,CAAC,GAAI,GAAI,QAAQ,yBAAyB,CAAC,CAC/E,CAAA,CACX,KAAK,WAAW,OAAO,OAAO,SAAS,MAAM,CAAC,CAC/C,MAAM,UAAU,SAAS,eAAe,IAAI,KAAK,CAAC;EACrD,IAAI,IAAI,QAAQ,UAAU,YAAY,QACpC,OAAO;GAAE,MAAM;GAAS,OAAO,UAAU;GAAU,MAAM;EAAgB;CAC7E;CACA,MAAM,eAAe,KAAK,QAAQ,QAAQ,IAAI,QAAQ,UAAU,SAAS,CAAC,CAAC;CAC3E,IAAI,cAAc,OAAO;EAAE,MAAM;EAAW,OAAO,GAAG,aAAa;EAAW,MAAM;CAAkB;CACtG,IACE,KAAK,MAAM,QACT,IAAI,QAAQ,YAAY,MAAM,cAAc,UAAU,SAAS,WAAW,UAAU,WAAW,OAAO,CACxG,GAEA,OAAO;EAAE,MAAM;EAAW,OAAO;EAAa,MAAM;CAAgB;CACtE,IACE,KAAK,UACL,KAAK,OACF,QACC,IAAI,QAAQ,UAAU,aACtB,IAAI,OAAO,YAAY,MAAM,cAAc,UAAU,SAAS,WAAW,UAAU,WAAW,MAAM,CACxG,GAEA,OAAO;EAAE,MAAM;EAAW,OAAO;EAAS,MAAM;CAAuB;CACzE,OAAO;EAAE,MAAM;EAAW,OAAO;EAAqB,MAAM;CAAe;AAC7E;AACA,SAAS,eAAe,EAAE,QAAuC;CAC/D,MAAM,SAAS,eAAe,IAAI;CAClC,OACE,oCAAA,KAAC,QAAD;EAAM,WAAW,mBAAmB,OAAO;YAA3C,CACE,oCAAA,IAAC,gBAAA,QAAD;GAAQ,UAAU,OAAO;GAAM,MAAM;EAAK,CAAA,GACzC,OAAO,KACJ;;AAEV;AAEA,IAAM,eAAe,SAAS,oBAAoB;AAClD,IAAM,iBAAiB,mBAAA,SAAS,QAAQ,cAAc,IAAI,CAAC,EAAE,SAAS;AACtE,IAAM,YAAY,UAAyB,GAAG,MAAM,UAAU,GAAG,MAAM;AACvE,SAAS,aAAa,OAA2B,QAAkC;CACjF,IAAI,UAAU,KAAA,GAAW,OAAO;CAChC,OAAO,WAAW,QAAQ,GAAG,MAAM,QAAQ,CAAC,EAAE,UAAU,IAAI,QAAQ,QAAQ,EAAA,CAAG,QAAQ,CAAC,EAAE;AAC5F;AACA,SAAS,gBAAgB,SAA0B,QAAkC;CACnF,OAAO,GAAG,QAAQ,qBAAqB,oBAAoB,KAAK,aAAa,QAAQ,qBAAqB,MAAM;AAClH;AACA,IAAM,YAAoC;CACxC,KAAK;CACL,YAAY;CACZ,YAAY;CACZ,aAAa;CACb,WAAW;CACX,KAAK;CACL,SAAS;AACX;AACA,IAAM,UAAkC;CACtC,KAAK;CACL,YAAY;CACZ,YAAY;CACZ,aAAa;CACb,WAAW;CACX,KAAK;CACL,SAAS;AACX;AACA,SAAS,aAAa,QAA2B,WAAmB,OAAyB;CAC3F,MAAM,gBAAgB;CACtB,MAAM,OAAO,OAAO,QAAQ;CAC5B,IAAI,SAAS,MAAM,aAAa,CAAC,OAAO,SAAS,QAAQ,CAAC,OAAO,SAAS,aAAa,CAAC,UAAU,OAAO;CACzG,MAAM,OAAO,GAAG,UAAU,MAAM,cAAc,mBAAmB,OAAO,SAAS,SAAS,EAAE,GAAG,QAAQ,MAAM,GAAG,mBAAmB,OAAO,SAAS,IAAI;CACvJ,QAAa,QAAQ,mBAAA,SAAS,WAAW,YAAY,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;AAC5E;AACA,IAAM,8BAAc,IAAI,QAAgE;AACxF,SAAS,gBAAgB,MAA0B;CACjD,MAAM,QAAQ,6BAAA,qBAAqB,IAAI;CACvC,MAAM,SAAS,6BAAA,oBAAoB,KAAK,QAAQ,CAAC,GAAG,KAAK,UAAU,CAAC,GAAG,KAAK;CAC5E,MAAM,0BAAU,IAAI,IAA+B;CACnD,MAAM,2BAAW,IAAI,IAAsB;CAC3C,KAAK,MAAM,UAAU,CAAC,GAAI,KAAK,UAAU,CAAC,GAAI,GAAI,KAAK,QAAQ,CAAC,CAAE,GAAG;EACnE,MAAM,MAAM,OAAO,SAAS;EAC5B,IAAI,CAAC,KAAK;EACV,QAAQ,IAAI,KAAK,MAAM;EACvB,MAAM,OAAO,OAAO,SAAS,mBAAmB,CAAC;EACjD,MAAM,SAAS,KAAK,MAAM,SAAS,KAAK,UAAU,MAAM,KAAK,WAAW,IAAI,KAAK,KAAK,KAAA;EACtF,IAAI,QAAQ;GACV,MAAM,WAAW,SAAS,IAAI,OAAO,GAAG,KAAK,CAAC;GAC9C,SAAS,KAAK,GAAG;GACjB,SAAS,IAAI,OAAO,KAAK,QAAQ;EACnC;CACF;CACA,MAAM,0BAAU,IAAI,IAAyB;CAC7C,KAAK,MAAM,SAAS,QAAQ;EAC1B,MAAM,uBAAO,IAAI,IAAY;EAC7B,MAAM,QAAQ,CAAC,MAAM,QAAQ;EAC7B,OAAO,MAAM,QAAQ;GACnB,MAAM,MAAM,MAAM,IAAI;GACtB,IAAI,KAAK,IAAI,GAAG,GAAG;GACnB,MAAM,SAAS,QAAQ,IAAI,GAAG;GAC9B,IAAI,UAAU,OAAO,SAAS,cAAc,MAAM,WAAW;GAC7D,KAAK,IAAI,GAAG;GACZ,MAAM,KAAK,GAAI,SAAS,IAAI,GAAG,KAAK,CAAC,CAAE;EACzC;EACA,QAAQ,IAAI,SAAS,KAAK,GAAG,IAAI;CACnC;CACA,OAAO;EAAE;EAAO;EAAQ;EAAS;CAAQ;AAC3C;AACA,SAAS,WAAW,MAA0B;CAC5C,IAAI,QAAQ,YAAY,IAAI,IAAI;CAChC,IAAI,CAAC,OAAO;EACV,QAAQ,gBAAgB,IAAI;EAC5B,YAAY,IAAI,MAAM,KAAK;CAC7B;CACA,OAAO;AACT;AACA,SAAgB,kBAAkB;CAChC,MAAM,CAAC,KAAK,UAAU,+BAAA,SAAc,WAAW;CAC/C,MAAM,CAAC,UAAU,eAAe,+BAAA,SAA6B;CAC7D,MAAM,CAAC,OAAO,YAAY,+BAAA,SAAS,EAAE;CACrC,MAAM,CAAC,QAAQ,aAAa,+BAAA,SAAS,EAAE;CACvC,MAAM,CAAC,gBAAgB,qBAAqB,+BAAA,SAAS,IAAI;CACzD,MAAM,CAAC,WAAW,gBAAgB,+BAAA,SAAS,UAAU;CACrD,MAAM,CAAC,gBAAgB,qBAAqB,+BAAA,SAAmB,CAAC,CAAC;CACjE,MAAM,QAAQ,+BAAA,uBAAO,IAAI,IAAyD,CAAC;CACnF,MAAM,CAAC,MAAM,WAAW,+BAAA,SAAS,KAAK;CACtC,MAAM,CAAC,UAAU,eAAe,+BAAA,SAAmB,CAAC,CAAC;CACrD,MAAM,CAAC,UAAU,eAAe,+BAAA,SAAS,EAAE;CAC3C,MAAM,CAAC,YAAY,iBAAiB,+BAAA,SAAS,EAAE;CAC/C,MAAM,CAAC,QAAQ,aAAa,+BAAA,SAAS,EAAE;CACvC,MAAM,CAAC,aAAa,kBAAkB,+BAAA,SAAS,IAAI;CACnD,MAAM,CAAC,UAAU,eAAe,+BAAA,SAA0B,CAAC,CAAC;CAC5D,MAAM,WAAW,+BAAA,OAA2B;CAC5C,+BAAA,gBAAgB;EACd,MAAM,UAAU,6BAAA,0BAA0B;EAC1C,IAAI,WAAW;EACf,IAAI,aAAa;EACjB,IAAI,UAAU;EACd,MAAM,cAAc;GAClB;GACA,SAAS,UAAU,KAAA;GACnB,MAAM,QAAQ,MAAM;GACpB,YAAY,KAAA,CAAS;GACrB,YAAY,CAAC,CAAC;GACd,YAAY,EAAE;GACd,cAAc,EAAE;GAChB,YAAY,CAAC,CAAC;GACd,SAAS,EAAE;EACb;EACA,MAAM,OAAO,YAAY;GACvB,IAAI,WAAW,YAAY,OAAO,GAAG;GAErC,IAAI,CADY,SACX,GAAS;IACZ,SAAS,4BAA4B;IACrC;GACF;GACA,MAAM,UAAU;GAChB,UAAU;GACV,IAAI;IACF,MAAM,OAAO,MAAM,6BAAA,sBAAsB,IAAI;IAC7C,IAAI,YAAY,YAAY,cAAc,KAAK,cAAc,SAAS,KAAK,OAAO,GAAG;IACrF,MAAM,QAAQ,SAAS;IACvB,IAAI,UAAU,MAAM;IACpB,IAAI,SAAS,MAAM,cAAc,KAAK,WAAW;KAC/C,MAAM,UAA2B,CAAC;KAClC,IAAI,MAAM,SAAS,KAAK,MACtB,QAAQ,KACN,GAAG,6BAAA,uBAAuB,MAAM,QAAQ,CAAC,GAAG,KAAK,QAAQ,CAAC,GAAG,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC,YAAY,CAAC,CAChG;KACF,IAAI,MAAM,WAAW,KAAK,UAAU,KAAK,iBACvC,QAAQ,KACN,GAAG,6BAAA,uBACD,MAAM,UAAU,CAAC,GACjB,KAAK,UAAU,CAAC,GAChB,IAAI,KAAK,KAAK,eAAe,CAAC,CAAC,YAAY,CAC7C,CACF;KACF,IAAI,QAAQ,QAAQ,aAAa,UAAU,CAAC,GAAG,SAAS,GAAG,KAAK,CAAC,CAAC,MAAM,GAAG,GAAG,CAAC;IACjF;IACA,MAAM,YAAY,WAAW,IAAI;IACjC,KAAK,MAAM,SAAS,UAAU,QAAQ;KACpC,MAAM,MAAM,SAAS,KAAK;KAC1B,MAAM,aAAa,MAAM,QAAQ,IAAI,GAAG,CAAC,EAAE,wBAAQ,IAAI,IAAY;KACnE,KAAK,MAAM,OAAO,UAAU,QAAQ,IAAI,GAAG,KAAK,CAAC,GAAG,WAAW,IAAI,GAAG;KACtE,OAAO,WAAW,OAAO,KAAK,WAAW,OAAO,WAAW,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,KAAM;KACjF,MAAM,QAAQ,IAAI,KAAK;MAAE;MAAO,MAAM;KAAW,CAAC;IACpD;IACA,OAAO,MAAM,QAAQ,OAAO,KAAK,MAAM,QAAQ,OAAO,MAAM,QAAQ,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,KAAM;IACxF,SAAS,UAAU;IACnB,YAAY,IAAI;IAChB,SAAS,EAAE;GACb,QAAQ;IACN,IAAI,CAAC,YAAY,YAAY,YAAY,SAAS,0CAA0C;GAC9F,UAAU;IACR,UAAU;GACZ;EACF;EACA,MAAM,OAAO,8BAAA,SAAS,gBAAgB;GACpC,MAAM;GACN,KAAU;EACZ,CAAC;EACD,MAAM,mBAAmB;GACvB,IAAI,SAAS,oBAAoB,UAAU,KAAU;EACvD;EACA,MAAM,QAAQ,OAAO,kBAAkB,KAAK,KAAK,GAAG,GAAI;EACxD,SAAS,iBAAiB,oBAAoB,UAAU;EACxD,KAAU;EACV,aAAa;GACX,WAAW;GACX;GACA,KAAK;GACL,QAAQ;GACR,OAAO,cAAc,KAAK;GAC1B,SAAS,oBAAoB,oBAAoB,UAAU;EAC7D;CACF,GAAG,CAAC,CAAC;CACL,MAAM,OAAO,UAAU,cAAc,SAAS,IAAI,WAAW,KAAA;CAC7D,MAAM,YAAY,+BAAA,cAAe,OAAO,WAAW,IAAI,IAAI,KAAA,GAAY,CAAC,IAAI,CAAC;CAC7E,MAAM,SAAS,WAAW,UAAU,CAAC;CACrC,MAAM,WAAW,+BAAA,cAEb,OACG,QAAQ,UACP,GAAG,MAAM,UAAU,GAAG,MAAM,KAAK,GAAG,MAAM,OAAO,YAAY,CAAC,CAAC,SAAS,OAAO,YAAY,CAAC,CAC9F,CAAC,CACA,QAAQ,UAAU,CAAC,kBAAkB,CAAC,SAAS,SAAS,CAAC,CAAC,SAAS,eAAe,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CACpG,MAAM,GAAG,MACR,SAAS,SACL,EAAE,UAAU,cAAc,EAAE,SAAS,KACrC,EAAE,KAAK,cAAc,EAAE,IAAI,KAC3B,EAAE,KAAK,cAAc,EAAE,IAAI,KAC3B,EAAE,SAAS,cAAc,EAAE,QAAQ,IACnC,SAAS,cAAc,SAAS,mBAC9B,EAAE,SAAS,aAAa,QAAQ,SAAS,CAAC,WAAW,EAAE,SAAS,aAAa,QAAQ,SAAS,CAAC,YAC9F,EAAE,SAAS,WAAW,WAAW,MAAM,CAAC,SAAS,OACjD,EAAE,SAAS,WAAW,WAAW,MAAM,CAAC,SAAS,GAC1D,GACJ;EAAC;EAAQ;EAAQ;EAAM;CAAc,CACvC;CACA,MAAM,cAAc,IAAI,KACrB,MAAM,UAAU,CAAC,EAAA,CACf,QAAQ,UAAU,MAAM,SAAS,SAAS,CAAC,CAC3C,KAAK,UAAU,MAAM,gBAAgB,OAAO,MAAM,WAAW,GAAG,CAAC,CACjE,QAAQ,QAAuB,CAAC,CAAC,GAAG,CACzC;CACA,MAAM,eAAe,CAAC,GAAG,MAAM,QAAQ,OAAO,CAAC,CAAC,CAC7C,QAAQ,SAAS,CAAC,eAAe,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC,MAAM,QAAQ,YAAY,IAAI,GAAG,CAAC,CAAC,CAAC,CACpF,KAAK,SAAS,KAAK,KAAK;CAC3B,MAAM,qBAAqB,aAAa,MAAM,UAAU,SAAS,KAAK,MAAM,QAAQ;CACpF,+BAAA,gBAAgB;EACd,IAAI,YAAY,CAAC,oBAAoB,YAAY,EAAE;CACrD,GAAG,CAAC,UAAU,kBAAkB,CAAC;CACjC,MAAM,cAAc,aAAa,MAAM,UAAU,SAAS,KAAK,MAAM,QAAQ;CAC7E,MAAM,OAAO,IAAI,IAAI,MAAM,QAAQ,IAAI,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC;CAC5D,MAAM,mBAAmB,6BAAA,gBAAgB,MAAM,UAAU,CAAC,CAAC;CAC3D,MAAM,aAAa,IAAI,IACrB,iBAAiB,QAAQ,QAAQ,UAAU,MAAM,SAAS,MAAM,EAAE,SAAS,SAAS,CAAC,CAAC,KAAK,UAAU,MAAM,EAAE,CAC/G;CACA,MAAM,kBAAkB,IAAI,IAC1B,iBAAiB,KAAK,OAAO,UAAU;EACrC,MAAM,QAAQ,MAAM,SAAS;EAC7B,OAAO,CAAC,MAAM,IAAI,OAAO,kBAAkB,OAAO,SAAS;CAC7D,CAAC,CACH;CACA,MAAM,WAAW,CAAC,GAAG,kBAAkB,GAAG,QAAQ,CAAC,CAChD,QACE,WACE,CAAC,eAAgB,CAAC,CAAC,MAAM,aAAa,KAAK,IAAI,MAAM,SAAS,OAC9D,CAAC,UAAU,GAAG,MAAM,OAAO,GAAG,MAAM,UAAU,YAAY,CAAC,CAAC,SAAS,OAAO,YAAY,CAAC,OACzF,CAAC,eAAe,WAAW,IAAI,MAAM,EAAE,EAC5C,CAAC,CACA,MAAM,GAAG,OAAO,KAAK,MAAM,EAAE,QAAQ,EAAE,KAAK,MAAM,KAAK,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE;CACnF,MAAM,WAAW,MAAM,QAAQ,CAAC,EAAA,CAAG,QAAQ,QAAQ,IAAI,QAAQ,UAAU,SAAS;CAClF,MAAM,cAAc,QAAQ,UAAU,MAAM,OAAO,WAAW;CAC9D,MAAM,cAAc,QAAQ,MAAM,QAAQ,IAAI,SAAS,QAAQ,UAAU;CACzE,MAAM,YAAY,cACd,6BAAA,mBAAmB,aAAa,MAAM,SAAS,CAAC,GAAG,MAAM,UAAU,CAAC,GAAG,MAAM,IAAI,IACjF,KAAA;CACJ,OACE,oCAAA,KAAC,OAAD;EAAK,WAAU;EAAoB,OAAO;GAAE,SAAS;GAAI,UAAU;GAAQ,QAAQ;GAAQ,UAAU;EAAE;YAAvG;GACE,oCAAA,IAAC,SAAD,EAAA,UAAQ,wBAAA,kBAAyB,CAAA;GACjC,oCAAA,KAAC,UAAD;IAAQ,WAAU;cAAlB,CACE,oCAAA,IAAC,MAAD,EAAA,UAAI,uBAAwB,CAAA,GAC5B,oCAAA,KAAC,QAAD;KAAM,WAAU;eAAhB,CAAgC,sBAAmB,OAAO,MAAM,kBAAA,eAAe,KAAK,IAAI,MAAM,EAAS;MACjG;;GACR,oCAAA,IAAC,OAAD;IAAK,cAAW;cACZ;KAAC;KAAa;KAAY;IAAS,CAAC,CAAW,KAAK,SACpD,oCAAA,KAAC,UAAD;KAEE,MAAK;KACL,OAAO,QAAQ,KAAK,YAAY;KAChC,gBAAc,QAAQ;KACtB,eAAe,OAAO,IAAI;eAL5B;MAOE,oCAAA,IAAC,gBAAA,QAAD,EACE,UAAU,SAAS,cAAc,iBAAiB,SAAS,aAAa,aAAa,kBACtF,CAAA;MACA;MACA,SAAS,aAAa,MAAM,OAAO,KAAK,QAAQ,OAAO,KAAK;KACvD;OAXD,IAWC,CACT;GACE,CAAA;GACJ,SACC,oCAAA,KAAC,KAAD;IAAG,WAAU;IAAqB,MAAK;cAAvC,CACG,OAAM,6DACN;;GAEJ,MAAM,OAAO,KAAK,YACjB,oCAAA,IAAC,KAAD;IAAG,WAAU;IAAqB,MAAK;cACpC;GACA,GAFkD,OAElD,CACJ;GACD,oCAAA,KAAC,WAAD;IAAS,WAAU;cAAnB,CACE,oCAAA,IAAC,MAAD,EAAA,UAAK,iBAAiB,IAAI,CAAC,GAAO,CAAA,GAClC,oCAAA,IAAC,KAAD,EAAA,UAAI,iBAAiB,IAAI,CAAC,GAAM,CAAA,CACzB;;GACR,QAAQ,QAAQ,eACf,oCAAA,KAAC,OAAD;IAAK,WAAU;IAAsB,cAAW;cAAhD;KACE,oCAAA,KAAC,OAAD;MAAK,WAAU;gBAAf,CACE,oCAAA,IAAC,QAAD;OAAM,WAAU;iBACd,oCAAA,IAAC,gBAAA,QAAD;QAAQ,UAAS;QAAe,MAAM;OAAK,CAAA;MACvC,CAAA,GACN,oCAAA,KAAC,OAAD,EAAA,UAAA,CACE,oCAAA,IAAC,UAAD,EAAA,UAAS,KAAK,OAAO,OAAO,SAAS,cAAsB,CAAA,GAC3D,oCAAA,IAAC,QAAD,EAAA,UAAM,gCAAmC,CAAA,CACtC,EAAA,CAAA,CACF;;KACL,oCAAA,KAAC,OAAD;MAAK,WAAU;gBAAf,CACE,oCAAA,IAAC,QAAD;OAAM,WAAU;iBACd,oCAAA,IAAC,gBAAA,QAAD;QAAQ,UAAS;QAAa,MAAM;OAAK,CAAA;MACrC,CAAA,GACN,oCAAA,KAAC,OAAD,EAAA,UAAA,CACE,oCAAA,IAAC,UAAD,EAAA,UAAS,KAAK,MAAM,UAAU,cAAsB,CAAA,GACpD,oCAAA,IAAC,QAAD,EAAA,UAAM,mBAAsB,CAAA,CACzB,EAAA,CAAA,CACF;;KACL,oCAAA,KAAC,aAAD;MACE,WAAW,uBAAuB,CAAC,KAAK,OAAO,iBAAiB,QAAQ,SAAS,eAAe;MAChG,GAAK,QAAQ,SACT;OACE,MAAM;OACN,OAAO;OACP,cAAc;OACd,eAAe;QACb,cAAc,QAAQ,EAAE,EAAE,SAAS,OAAO,EAAE;QAC5C,OAAO,SAAS;OAClB;MACF,IACA,CAAC;gBAZP,CAcE,oCAAA,IAAC,QAAD;OAAM,WAAU;iBACd,oCAAA,IAAC,gBAAA,QAAD;QAAQ,UAAS;QAAkB,MAAM;OAAK,CAAA;MAC1C,CAAA,GACN,oCAAA,KAAC,OAAD,EAAA,UAAA,CACE,oCAAA,IAAC,UAAD,EAAA,UAAS,KAAK,OAAO,QAAQ,SAAS,cAAsB,CAAA,GAC5D,oCAAA,IAAC,QAAD,EAAA,UAAM,eAAkB,CAAA,CACrB,EAAA,CAAA,CACM;;IACV;;GAEN,CAAC,QAAQ,CAAC,SACT,oCAAA,IAAC,KAAD;IAAG,WAAU;IAAoB,MAAK;cAAS;GAE5C,CAAA;GAEJ,QAAQ,eAAe,QACtB,oCAAA,KAAA,oBAAA,UAAA,EAAA,UAAA;IACE,oCAAA,KAAC,OAAD;KAAK,WAAU;eAAf;MACE,oCAAA,KAAC,SAAD,EAAA,UAAA;OAAO;OACI;OACT,oCAAA,IAAC,mBAAD;QACE,OAAM;QACN,OAAO;QACP,UAAU;QACV,SAAS,CACP;SAAE,OAAO;SAAY,OAAO;QAAW,GACvC;SAAE,OAAO;SAAa,OAAO;QAAY,CAC3C;OACD,CAAA;MACI,EAAA,CAAA;MACP,oCAAA,KAAC,SAAD;OAAO,WAAU;iBAAjB,CAAgC,oBAE9B,oCAAA,IAAC,QAAD;QAAM,WAAU;kBACd,oCAAA,IAAC,mBAAA,SAAS,UAAU,OAApB;SACE,cAAW;SACX,aAAY;SACZ,OAAO;SACP,UAAU;QACX,CAAA;OACG,CAAA,CACD;;MACP,oCAAA,KAAC,SAAD,EAAA,UAAA;OAAO;OACA;OACL,oCAAA,IAAC,mBAAD;QACE,OAAM;QACN,OAAO;QACP,UAAU;QACV,SAAS;SACP;UAAE,OAAO;UAAO,OAAO;SAAY;SACnC;UAAE,OAAO;UAAU,OAAO;SAAe;SACzC;UAAE,OAAO;UAAY,OAAO;SAAe;SAC3C;UAAE,OAAO;UAAkB,OAAO;SAAkB;SACpD;UAAE,OAAO;UAAQ,OAAO;SAAmB;QAC7C;OACD,CAAA;MACI,EAAA,CAAA;MACP,oCAAA,IAAC,OAAD;OAAK,WAAU;iBACb,oCAAA,IAAC,mBAAA,SAAS,UAAU,UAApB;QACE,OAAM;QACN,OAAO;QACP,UAAU;OACX,CAAA;MACE,CAAA;KACF;;IACL,oCAAA,KAAC,WAAD;KAAS,WAAU;eAAnB,CACE,oCAAA,IAAC,WAAD,EAAA,UAAS,iCAAuC,CAAA,GAChD,oCAAA,IAAC,KAAD,EAAA,UAAG,mOAIA,CAAA,CACI;;IACT,oCAAA,IAAC,OAAD;KAAK,WAAU;eACb,oCAAA,KAAC,SAAD;MAAO,WAAU;gBAAjB;OACE,oCAAA,KAAC,YAAD,EAAA,UAAA;QACE,oCAAA,IAAC,OAAD,EAAK,WAAU,kBAAmB,CAAA;QAClC,oCAAA,IAAC,OAAD,EAAK,WAAU,gBAAiB,CAAA;QAChC,oCAAA,IAAC,OAAD,EAAK,WAAU,gBAAiB,CAAA;QAChC,oCAAA,IAAC,OAAD,EAAK,WAAU,qBAAsB,CAAA;OAC7B,EAAA,CAAA;OACV,oCAAA,IAAC,SAAD,EAAA,UACE,oCAAA,KAAC,MAAD,EAAA,UAAA;QACE,oCAAA,IAAC,MAAD,EAAA,UAAI,uBAAwB,CAAA;QAC5B,oCAAA,IAAC,MAAD;SAAI,WAAU;mBAAU;QAAwB,CAAA;QAChD,oCAAA,IAAC,MAAD;SAAI,WAAU;mBAAU;QAA2B,CAAA;QACnD,oCAAA,IAAC,MAAD,EAAA,UAAI,uBAAwB,CAAA;OAC1B,EAAA,CAAA,EACC,CAAA;OACP,oCAAA,IAAC,SAAD,EAAA,WACI,cAAc,cAAc,CAAC,GAAG,IAAI,IAAI,SAAS,KAAK,UAAU,MAAM,SAAS,CAAC,CAAC,IAAI,CAAC,EAAE,EAAA,CAAG,KAC1F,cACC,oCAAA,IAAC,eAAD;QAEa;QACX,QAAQ,YAAY,SAAS,QAAQ,UAAU,MAAM,cAAc,SAAS,IAAI;QAChF,WAAW,MAAM,aAAa;QAC9B,OAAO,WAAW,SAAS,CAAC;QAC5B,MAAM,CAAC,aAAa,eAAe,SAAS,SAAS;QACrD,uBACE,mBAAmB,UACjB,MAAM,SAAS,SAAS,IACpB,MAAM,QAAQ,SAAS,SAAS,SAAS,IACzC,CAAC,GAAG,OAAO,SAAS,CAC1B;QAEQ;QACV,cAAc,QACZ,aAAa,UACX,MAAM,SAAS,GAAG,IAAI,MAAM,QAAQ,SAAS,SAAS,GAAG,IAAI,CAAC,GAAG,OAAO,GAAG,CAC7E;OAEH,GAnBM,SAmBN,CAEL,EACK,CAAA;MACF;;IACJ,CAAA;IACJ,CAAC,SAAS,WACR,CAAC,KAAK,OACL,oCAAA,IAAC,KAAD;KAAG,WAAU;eAAoB;IAA4B,CAAA,IAC3D,SACF,oCAAA,IAAC,KAAD;KAAG,WAAU;eAAoB;IAAiC,CAAA,IAChE,kBAAkB,OAAO,SAC3B,oCAAA,KAAC,OAAD;KACE,WAAW,qCAAqC,OAAO,OAAO,UAAU,eAAe,MAAM,IAAI,CAAC,CAAC,SAAS,SAAS,IAAI,cAAc;eADzI;MAGE,oCAAA,IAAC,gBAAA,QAAD;OACE,UACE,OAAO,OAAO,UAAU,eAAe,MAAM,IAAI,CAAC,CAAC,SAAS,SAAS,IACjE,yBACA;OAEN,MAAM;MACP,CAAA;MACD,oCAAA,IAAC,UAAD,EAAA,UACG,OAAO,OAAO,UAAU,eAAe,MAAM,IAAI,CAAC,CAAC,SAAS,SAAS,IAClE,4BACA,kBACE,CAAA;MACR,oCAAA,IAAC,SAAD,EAAA,UACG,OAAO,OAAO,UAAU,eAAe,MAAM,IAAI,CAAC,CAAC,SAAS,SAAS,IAClE,wDACA,yFACC,CAAA;MACP,oCAAA,IAAC,UAAD;OAAQ,MAAK;OAAS,eAAe,kBAAkB,KAAK;iBAAG;MAEvD,CAAA;KACL;SAEL,oCAAA,IAAC,KAAD;KAAG,WAAU;eAAoB;IAAyB,CAAA;GAE9D,EAAA,CAAA;GAEH,QAAQ,cAAc,QACrB,oCAAA,KAAA,oBAAA,UAAA,EAAA,UAAA;IACE,oCAAA,KAAC,OAAD;KAAK,WAAU;eAAf;MACE,oCAAA,KAAC,SAAD,EAAA,UAAA;OAAO;OACO;OACZ,oCAAA,IAAC,mBAAD;QACE,OAAM;QACN,OAAO,qBAAqB,WAAW;QACvC,UAAU;QACV,SAAS,CACP;SAAE,OAAO;SAAI,OAAO;QAAmB,GACvC,GAAG,aAAa,KAAK,WAAW;SAC9B,OAAO,SAAS,KAAK;SACrB,OAAO,GAAG,MAAM,UAAU,KAAK,MAAM,KAAK,KAAK,MAAM;QACvD,EAAE,CACJ;OACD,CAAA;MACI,EAAA,CAAA;MACP,oCAAA,KAAC,SAAD;OAAO,WAAU;iBAAjB,CAAgC,iBAE9B,oCAAA,IAAC,QAAD;QAAM,WAAU;kBACd,oCAAA,IAAC,mBAAA,SAAS,UAAU,OAApB;SACE,cAAW;SACX,aAAY;SACZ,OAAO;SACP,UAAU;QACX,CAAA;OACG,CAAA,CACD;;MACP,oCAAA,IAAC,OAAD;OAAK,WAAU;iBACb,oCAAA,IAAC,mBAAA,SAAS,UAAU,UAApB;QAA6B,OAAM;QAAgB,OAAO;QAAa,UAAU;OAAiB,CAAA;MAC/F,CAAA;KACF;;IACL,oCAAA,KAAC,WAAD;KAAS,WAAU;eAAnB,CACE,oCAAA,IAAC,WAAD,EAAA,UAAS,+BAAqC,CAAA,GAC9C,oCAAA,IAAC,KAAD,EAAA,UAAG,2UAKA,CAAA,CACI;;IACT,oCAAA,IAAC,OAAD;KAAK,WAAU;KAAkB,cAAW;eACzC;MAAC;MAAW;MAAW;MAAW;MAAa;MAAoB;KAAiB,CAAC,CAAC,KAAK,UAC1F,oCAAA,IAAC,QAAD;MAAkB,WAAW,iBAAiB,cAAc,KAAK;gBAC9D;KACG,GAFK,KAEL,CACP;IACE,CAAA;IACL,oCAAA,IAAC,MAAD;KAAI,WAAU;KAAuB,cAAW;eAC7C,SAAS,KAAK,UAAU;MACvB,MAAM,OAAO,cAAc,MAAM,MAAM;MACvC,MAAM,WAAW,WAAW,IAAI,MAAM,EAAE,IACpC,YACA,SAAS,WAAW,MAAM,cAAc,aACtC,aACA;MACN,MAAM,QACJ,aAAa,YACT,YACA,aAAa,YACX,YACA,aAAa,YACX,YACA,aAAa,cACX,cACA,MAAM,cAAc,aAClB,oBACA;MACd,MAAM,SAAS,MAAM,YAAY,WAAW,QAAQ,IAAI,MAAM,SAAS,IAAI,KAAA;MAC3E,MAAM,YAAY,gBAAgB,IAAI,MAAM,EAAE;MAC9C,MAAM,gBAAgB,QAAQ,QAAQ,WAAW;MACjD,MAAM,WAAW,QAAQ,YAAY;MACrC,OACE,oCAAA,KAAC,MAAD;OAAmB,WAAW,kBAAkB;iBAAhD,CACE,oCAAA,KAAC,OAAD;QAAK,WAAU;kBAAf,CACG,MAAM,OAAO,oCAAA,IAAC,QAAD;SAAM,UAAU,MAAM;mBAAO,kBAAA,eAAe,MAAM,IAAI;QAAQ,CAAA,IAAI,gBAChF,oCAAA,IAAC,SAAD,EAAA,UAAQ,MAAM,cAAc,aAAa,yBAAyB,wBAA+B,CAAA,CAC9F;WACL,oCAAA,KAAC,OAAD;QAAK,WAAU;kBAAf;SACG,UAAU,QACT,oCAAA,IAAC,UAAD;UACE,MAAK;UACL,WAAU;UACV,cAAW;UACX,OAAO,QAAQ,OAAO,QAAQ,MAAM,GAAG,OAAO,SAAS,UAAU,KAAK,OAAO,SAAS;UACtF,UAAU,UAAU,aAAa,QAAQ,KAAK,WAAW,KAAK;oBAE9D,oCAAA,IAAC,gBAAA,QAAD,EAAQ,UAAS,cAAe,CAAA;SAC1B,CAAA;SAEV,oCAAA,KAAC,OAAD;UAAK,WAAU;oBAAf;WACG;WACD,oCAAA,IAAC,QAAD;YAAM,WAAW,iBAAiB;sBAAa;WAAY,CAAA;WAC3D,oCAAA,IAAC,MAAD,EAAA,UAAK,MAAM,OAAW,CAAA;WACtB,oCAAA,KAAC,SAAD;YAAO,WAAU;sBAAjB,CACE,oCAAA,IAAC,gBAAA,QAAD;aAAQ,UAAU,kBAAkB,QAAQ,eAAe;aAAgB,MAAM;YAAK,CAAA,GACrF,UAAU,OACP,GAAG,SAAS,aAAa,oBAAoB,KAAK,iBAAiB,WAAW,KAAK,SAAS,SAC5F,+BACC;;UACJ;;SACL,oCAAA,IAAC,KAAD,EAAA,UAAI,MAAM,QAAW,CAAA;SACrB,oCAAA,KAAC,SAAD,EAAA,UAAA;UACG,MAAM,cAAc,aACjB,aACA,MAAM,cAAc,aAClB,aACA;UAAW;UAAI;UACZ,MAAM;UACd,MAAM,YAAY,YAAY,kBAAA,eAAe,MAAM,SAAS,MAAM;SAC9D,EAAA,CAAA;SACN,MAAM,OAAO,oCAAA,IAAC,SAAD,EAAA,UAAQ,MAAM,IAAW,CAAA;QACpC;SACH;SAxCK,MAAM,EAwCX;KAER,CAAC;IACC,CAAA;IACH,CAAC,SAAS,UACT,oCAAA,KAAC,OAAD;KAAK,WAAU;eAAf,CACE,oCAAA,IAAC,KAAD,EAAA,UACG,cACG,mDACA,6DACH,CAAA,GACF,eACC,oCAAA,IAAC,UAAD;MAAQ,MAAK;MAAS,eAAe,eAAe,KAAK;gBAAG;KAEpD,CAAA,CAEP;;GAEP,EAAA,CAAA;GAEH,QAAQ,aAAa,QACpB,oCAAA,KAAA,oBAAA,UAAA,EAAA,UAAA,CACE,oCAAA,KAAC,SAAD,EAAA,UAAA;IAAO;IACO;IACZ,oCAAA,IAAC,mBAAD;KACE,OAAM;KACN,OAAO;KACP,UAAU;KACV,SAAS,CACP;MAAE,OAAO;MAAI,OAAO;KAAe,GACnC,GAAG,QAAQ,KAAK,SAAS;MACvB,OAAO,IAAI,SAAS,OAAO;MAC3B,OAAO,GAAG,IAAI,SAAS,UAAU,KAAK,IAAI,SAAS;KACrD,EAAE,CACJ;IACD,CAAA;GACI,EAAA,CAAA,GACN,eAAe,YACd,oCAAA,KAAA,oBAAA,UAAA,EAAA,UAAA;IACE,oCAAA,KAAC,OAAD;KAAK,WAAW,mBAAmB,eAAe,CAAC,WAAW,CAAC,CAAC,CAAC;eAAjE;MACE,oCAAA,KAAC,OAAD;OAAK,WAAU;iBAAf,CACE,oCAAA,KAAC,OAAD,EAAA,UAAA,CACE,oCAAA,KAAC,UAAD,EAAA,UAAA;QACG,YAAY,SAAS;QAAU;QAAI,YAAY,SAAS;OACnD,EAAA,CAAA,GACR,oCAAA,KAAC,OAAD;QAAK,WAAU;kBAAf,CACE,oCAAA,IAAC,MAAD,EAAA,UAAK,UAAU,UAAU,qBAAqB,yBAAyB,cAAkB,CAAA,GACxF,eAAe,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,WAAW,oCAAA,IAAC,gBAAD,EAAgB,MAAM,CAAC,WAAW,EAAI,CAAA,CACtF;SACF,EAAA,CAAA,GACL,oCAAA,KAAC,UAAD;QACE,WAAU;QACV,MAAK;QACL,OAAM;QACN,UAAU,UAAU,aAAa,aAAa,KAAM,WAAW,KAAK;kBAJtE,CAME,oCAAA,IAAC,gBAAA,QAAD;SAAQ,UAAS;SAAc,MAAM;QAAK,CAAA,GAAC,UAErC;SACL;;MACL,oCAAA,IAAC,KAAD,EAAA,UACG,UAAU,UAAU,qBACjB,uFACA,8EACH,CAAA;MACH,oCAAA,KAAC,OAAD;OAAK,WAAU;iBAAf,CACE,oCAAA,KAAC,QAAD,EAAA,UAAA;QACE,oCAAA,IAAC,gBAAA,QAAD;SAAQ,UAAS;SAAS,MAAM;QAAK,CAAA;QAAC;QAC1B,oCAAA,IAAC,UAAD,EAAA,UAAS,WAAW,aAAa,KAAK,EAAU,CAAA;OACxD,EAAA,CAAA,GACN,oCAAA,KAAC,QAAD,EAAA,UAAA;QACE,oCAAA,IAAC,gBAAA,QAAD;SAAQ,UAAS;SAAU,MAAM;QAAK,CAAA;QAAC;QACxB,oCAAA,IAAC,UAAD,EAAA,UAAS,WAAW,aAAa,QAAQ,EAAU,CAAA;OAC9D,EAAA,CAAA,CACH;;KACF;;IACL,oCAAA,KAAC,WAAD;KAAS,WAAU;eAAnB;MACE,oCAAA,IAAC,WAAD,EAAA,UAAS,4CAAkD,CAAA;MAC3D,oCAAA,KAAC,KAAD,EAAA,UAAA;OAAG;OACc;OACd,OAAO,QAAQ,YAAY,MAAM,gBAAgB,CAAC,CAAC,CAAC,CAClD,KAAK,CAAC,KAAK,WAAW,GAAG,IAAI,GAAG,OAAO,CAAC,CACxC,KAAK,IAAI,KAAK;MAChB,EAAA,CAAA;MACH,oCAAA,KAAC,KAAD,EAAA,UAAA;OAAG;OACY;QACX,YAAY,MAAM,eAAe,CAAC,EAAA,CACjC,KACE,SACC,GAAG,KAAK,OAAO,WAAW,GAAG,KAAK,YAAY,UAAU,KAAK,QAAQ,IAAI,KAAK,UAAU,GAAG,IAAI,KAAK,UAAU,cAAc,EAChI,CAAC,CACA,KAAK,IAAI,KAAK;MAChB,EAAA,CAAA;MACH,oCAAA,KAAC,KAAD,EAAA,UAAA;OAAG;OACuB;OACvB,YAAY,MAAM,UAAU,cAAc,iDACvC,KAAK,UACH,YAAY,KAAK,SAAS,aAAa,8CACzC,CAAC,CAAC,MAAM,GAAG,GAAI,IACf;MACH,EAAA,CAAA;MAEH,oCAAA,IAAC,KAAD,EAAA,UACG,YAAY,QAAQ,YACjB,KACC,cACC,GAAG,UAAU,KAAK,IAAI,UAAU,SAAS,UAAU,UAAU,KAAK,UAAU,QAAQ,KAAK,IAC7F,CAAC,CACA,KAAK,KAAK,EACZ,CAAA;KACI;;IACT,oCAAA,IAAC,MAAD,EAAA,UAAI,sBAAuB,CAAA;IAC3B,oCAAA,IAAC,OAAD;KAAK,WAAU;eACb,oCAAA,KAAC,SAAD;MAAO,WAAU;gBAAjB;OACE,oCAAA,KAAC,YAAD,EAAA,UAAA;QACE,oCAAA,IAAC,OAAD,EAAK,WAAU,kBAAmB,CAAA;QAClC,oCAAA,IAAC,OAAD,EAAK,WAAU,gBAAiB,CAAA;QAChC,oCAAA,IAAC,OAAD,EAAK,WAAU,mBAAoB,CAAA;OAC3B,EAAA,CAAA;OACV,oCAAA,IAAC,SAAD,EAAA,UACE,oCAAA,KAAC,MAAD,EAAA,UAAA;QACE,oCAAA,IAAC,MAAD,EAAA,UAAI,kBAAmB,CAAA;QACvB,oCAAA,IAAC,MAAD,EAAA,UAAI,OAAQ,CAAA;QACZ,oCAAA,IAAC,MAAD,EAAA,UAAI,UAAW,CAAA;OACb,EAAA,CAAA,EACC,CAAA;OACP,oCAAA,IAAC,SAAD,EAAA,UACG,UAAU,SAAS,KAAK,OAAO,UAC9B,oCAAA,KAAC,MAAD,EAAA,UAAA;QACE,oCAAA,KAAC,MAAD,EAAA,UAAA,CACE,oCAAA,KAAC,QAAD;SAAM,WAAW,kBAAkB,MAAM,WAAW,UAAU,aAAa;mBAA3E,CACE,oCAAA,IAAC,gBAAA,QAAD;UAAQ,UAAU,MAAM,WAAW,UAAU,iBAAiB;UAAQ,MAAM;SAAK,CAAA,GAChF,MAAM,WAAW,UAAU,aAAa,UACrC;YACN,oCAAA,IAAC,SAAD,EAAA,UACG,MAAM,WAAW,UAAU,8BAA8B,wBACrD,CAAA,CACL,EAAA,CAAA;QACJ,oCAAA,IAAC,MAAD,EAAA,UAAK,MAAM,QAAQ,IAAQ,CAAA;QAC3B,oCAAA,IAAC,MAAD,EAAA,UAAK,MAAM,QAAY,CAAA;OACrB,EAAA,GAZK,GAAG,MAAM,KAAK,GAAG,OAYtB,CACL,EACI,CAAA;MACF;;IACJ,CAAA;IACJ,CAAC,UAAU,SAAS,UAAU,oCAAA,IAAC,KAAD,EAAA,UAAG,iDAAiD,CAAA;IACnF,oCAAA,KAAC,WAAD;KAAS,WAAU;eAAnB,CACE,oCAAA,IAAC,WAAD,EAAA,UAAS,oCAA0C,CAAA,GAClD,UAAU,YAAY,KAAK,YAC1B,oCAAA,IAAC,KAAD,EAAA,UAAkB,QAAW,GAArB,OAAqB,CAC9B,CACM;;GACT,EAAA,CAAA,IAEF,oCAAA,IAAC,KAAD;IAAG,WAAU;cACV,CAAC,KAAK,OACH,uFACA,QAAQ,SACN,iEACA;GACL,CAAA,CAEL,EAAA,CAAA;EAED;;AAET;AACA,SAAS,aAAa,EACpB,OACA,WACA,UACA,QACA,OACA,SAQC;CACD,OACE,oCAAA,KAAA,oBAAA,UAAA,EAAA,UAAA,CACE,oCAAA,KAAC,MAAD;EACE,WAAW,wCAAwC,MAAM,iBAAiB,eAAe,MAAM,IAAI,CAAC,CAAC;EACrG,kBAAgB;YAFlB;GAIE,oCAAA,IAAC,MAAD,EAAA,UACE,oCAAA,KAAC,OAAD;IAAK,WAAU;cAAf,CACE,oCAAA,KAAC,OAAD;KAAK,WAAU;eAAf,CACE,oCAAA,KAAC,OAAD;MAAK,WAAU;gBAAf,CACG,MAAM,iBAAiB,UAAU,MAAM,SAAS,MAAM,SAAS,YAC9D,oCAAA,KAAC,UAAD;OACE,WAAU;OACV,MAAK;OACL,OAAO,QAAQ,MAAM,KAAK,GAAG,MAAM,UAAU,KAAK,MAAM;OACxD,UAAU,UACR,aACE;QACE,MAAM,MAAM;QACZ,UAAU;SAAE,KAAK,MAAM;SAAU,WAAW,MAAM;SAAW,MAAM,MAAM;QAAK;OAChF,GACA,WACA,KACF;iBAZJ,CAeG,MAAM,MACP,oCAAA,IAAC,gBAAA,QAAD;QAAQ,UAAS;QAAc,MAAM;OAAK,CAAA,CACpC;WAER,oCAAA,IAAC,QAAD;OAAM,WAAU;iBAA2B,MAAM;MAAW,CAAA,GAE9D,oCAAA,IAAC,gBAAD,EAAgB,MAAM,MAAM,KAAO,CAAA,CAChC;SACL,oCAAA,KAAC,SAAD;MAAO,WAAU;gBAAjB;OACE,oCAAA,IAAC,gBAAA,QAAD;QAAQ,UAAS;QAAc,MAAM;OAAK,CAAA;OACzC,MAAM;OACP,oCAAA,IAAC,QAAD,EAAA,UAAM,IAAO,CAAA;OACb,oCAAA,IAAC,gBAAA,QAAD;QAAQ,UAAU,MAAM,SAAS,QAAQ,eAAe;QAAgB,MAAM;OAAK,CAAA;OAClF,MAAM;OACP,oCAAA,IAAC,QAAD,EAAA,UAAM,IAAO,CAAA;OACZ,MAAM,KAAK;OAAO;OAAM,MAAM,gBAAgB,KAAK;MAC/C;OACJ;QACL,oCAAA,IAAC,OAAD;KAAK,WAAU;eACb,oCAAA,IAAC,QAAD;MAAM,WAAU;gBACd,oCAAA,IAAC,UAAD;OACE,WAAU;OACV,MAAK;OACL,OAAO,WAAW,kBAAkB;OACpC,cAAY,GAAG,WAAW,aAAa,SAAS,YAAY,MAAM;OAClE,iBAAe;OACf,SAAS;iBAET,oCAAA,IAAC,gBAAA,QAAD,EAAQ,UAAU,WAAW,gBAAgB,cAAgB,CAAA;MACvD,CAAA;KACJ,CAAA;IACH,CAAA,CACF;MACH,CAAA;GACJ,oCAAA,IAAC,MAAD;IAAI,WAAU;cACZ,oCAAA,IAAC,cAAD;KAAc,SAAS,MAAM;KAAK,QAAO;IAAO,CAAA;GAC9C,CAAA;GACJ,oCAAA,IAAC,MAAD;IAAI,WAAU;cACZ,oCAAA,IAAC,cAAD;KAAc,SAAS,MAAM;KAAQ,QAAO;IAAU,CAAA;GACpD,CAAA;GACJ,oCAAA,IAAC,MAAD;IAAI,WAAU;cACZ,oCAAA,IAAC,iBAAD;KAAiB,KAAK,MAAM;KAAK,QAAQ,MAAM;IAAS,CAAA;GACtD,CAAA;EACF;KACH,YACC,MAAM,KAAK,KAAK,QACd,oCAAA,KAAC,MAAD;EAEE,WAAW,mCAAmC,QAAQ,EAAE,iBAAiB,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC;EAC/F,kBAAgB,QAAQ;YAH1B;GAKE,oCAAA,IAAC,MAAD,EAAA,UACE,oCAAA,IAAC,OAAD;IAAK,WAAU;cACb,oCAAA,KAAC,OAAD;KAAK,WAAU;eAAf,CACE,oCAAA,KAAC,OAAD;MAAK,WAAU;gBAAf,CACE,oCAAA,KAAC,UAAD;OACE,WAAU;OACV,MAAK;OACL,OAAM;OACN,UAAU,UAAU,aAAa,KAAK,WAAW,KAAK;iBAJxD;QAME,oCAAA,IAAC,gBAAA,QAAD;SAAQ,UAAS;SAAa,MAAM;QAAK,CAAA;QACxC,IAAI,SAAS;QACd,oCAAA,IAAC,gBAAA,QAAD;SAAQ,UAAS;SAAc,MAAM;QAAK,CAAA;OACpC;UACR,oCAAA,IAAC,gBAAD,EAAgB,MAAM,CAAC,GAAG,EAAI,CAAA,CAC3B;SACL,oCAAA,KAAC,SAAD;MAAO,WAAU;gBAAjB;OACG,IAAI,QAAQ,SAAS;OACtB,oCAAA,IAAC,QAAD,EAAA,UAAM,IAAO,CAAA;OACZ,IAAI,MAAM,WAAW,QAAQ,IAAI,KAAK,aAAa;MAC/C;OACJ;;GACF,CAAA,EACH,CAAA;GACJ,oCAAA,IAAC,MAAD;IAAI,WAAU;cACZ,oCAAA,IAAC,cAAD;KAAc,SAAS,iBAAiB,KAAK,KAAK,CAAC,CAAC;KAAK,QAAO;IAAO,CAAA;GACrE,CAAA;GACJ,oCAAA,IAAC,MAAD;IAAI,WAAU;cACZ,oCAAA,IAAC,cAAD;KAAc,SAAS,iBAAiB,KAAK,KAAK,CAAC,CAAC;KAAQ,QAAO;IAAU,CAAA;GAC3E,CAAA;GACJ,oCAAA,IAAC,MAAD;IAAI,WAAU;cACZ,oCAAA,IAAC,QAAD;KACE,WAAU;KACV,OACE,IAAI,MAAM,WACN,4BACA;eAGL,IAAI,MAAM,WAAW,MAAM;IACxB,CAAA;GACJ,CAAA;EACF;IA9CG,IAAI,SAAS,GA8ChB,CACL,CACH,EAAA,CAAA;AAEN;AAEA,SAAS,WAAW,KAAwB,QAAkC;CAC5E,IAAI;EACF,OAAO,aAAa,6BAAA,qBAAqB,KAAK,MAAM,GAAG,MAAM;CAC/D,QAAQ;EACN,OAAO;CACT;AACF;AACA,SAAS,cAAc,EACrB,WACA,QACA,WACA,OACA,MACA,iBACA,UACA,eAUC;CACD,MAAM,OAAO,WACX,OAAO,QACJ,OAAO,UAAU;EAChB,MAAM,OAAO,MAAM;EACnB,OAAO;GACL,UAAU,MAAM,WAAW,KAAK;GAChC,mBAAmB,MAAM,oBAAoB,KAAK;GAClD,qBAAqB,MAAM,sBAAsB,KAAK;GACtD,OACE,MAAM,UAAU,KAAA,KAAa,KAAK,UAAU,KAAA,IAAY,KAAA,KAAa,MAAM,SAAS,MAAM,KAAK,SAAS;GAC1G,aAAa,MAAM,cAAc,KAAK;GACtC,WAAW,MAAM,YAAY,KAAK;GAClC,oBAAoB,MAAM,qBAAqB,KAAK;EACtD;CACF,GACA;EACE,UAAU;EACV,mBAAmB;EACnB,qBAAqB;EACrB,aAAa;EACb,WAAW;EACX,oBAAoB;CACtB,CACF;CACF,OACE,oCAAA,KAAA,oBAAA,UAAA,EAAA,UAAA,CACG,aACC,oCAAA,KAAC,MAAD;EACE,WAAW,yDAAyD,eAAe,OAAO,SAAS,UAAU,MAAM,IAAI,CAAC,CAAC,CAAC;EAC1H,kBAAgB;YAFlB;GAIE,oCAAA,IAAC,MAAD,EAAA,UACE,oCAAA,KAAC,OAAD;IAAK,WAAU;cAAf,CACE,oCAAA,KAAC,OAAD;KAAK,WAAU;eAAf,CACE,oCAAA,KAAC,OAAD;MAAK,WAAU;gBAAf,CACE,oCAAA,KAAC,QAAD;OAAM,WAAU;iBAAhB,CACE,oCAAA,IAAC,gBAAA,QAAD;QAAQ,UAAS;QAAc,MAAM;OAAK,CAAA,GAC1C,oCAAA,IAAC,QAAD;QAAM,WAAU;kBAA2B;OAAgB,CAAA,CACvD;UACN,oCAAA,IAAC,gBAAD,EAAgB,MAAM,OAAO,SAAS,UAAU,MAAM,IAAI,EAAI,CAAA,CAC3D;SACL,oCAAA,KAAC,SAAD;MACE,WAAU;MACV,OAAM;gBAFR;OAIG,OAAO;OAAO;OAAgB,oCAAA,IAAC,QAAD,EAAA,UAAM,IAAO,CAAA;OAC3C,OAAO,QAAQ,OAAO,UAAU,QAAQ,MAAM,KAAK,QAAQ,CAAC;OAAE;MAC1D;OACJ;QACL,oCAAA,IAAC,QAAD;KAAM,WAAU;eACd,oCAAA,IAAC,UAAD;MACE,WAAU;MACV,MAAK;MACL,OAAO,OAAO,iCAAiC;MAC/C,cAAY,GAAG,OAAO,aAAa,SAAS,gBAAgB;MAC5D,iBAAe;MACf,SAAS;gBAET,oCAAA,IAAC,gBAAA,QAAD,EAAQ,UAAU,OAAO,gBAAgB,cAAgB,CAAA;KACnD,CAAA;IACJ,CAAA,CACH;MACH,CAAA;GACJ,oCAAA,IAAC,MAAD;IAAI,WAAU;cACZ,oCAAA,IAAC,cAAD;KAAc,SAAS,IAAI,KAAK;KAAG,QAAO;IAAO,CAAA;GAC/C,CAAA;GACJ,oCAAA,IAAC,MAAD;IAAI,WAAU;cACZ,oCAAA,IAAC,cAAD;KAAc,SAAS,IAAI,QAAQ;KAAG,QAAO;IAAU,CAAA;GACrD,CAAA;GACJ,oCAAA,IAAC,MAAD;IAAI,WAAU;cACZ,oCAAA,IAAC,iBAAD;KAAiB,KAAK,IAAI,KAAK;KAAG,QAAQ,IAAI,QAAQ;IAAI,CAAA;GACxD,CAAA;EACF;KAEL,QACC,OAAO,KAAK,UACV,oCAAA,IAAC,cAAD;EAES;EACP,OAAO,YAAY,IAAI;EACZ;EACX,UAAU,SAAS,SAAS,SAAS,KAAK,CAAC;EAC3C,cAAc,YAAY,SAAS,KAAK,CAAC;EAClC;CACR,GAPM,SAAS,KAAK,CAOpB,CACF,CACH,EAAA,CAAA;AAEN;AAEA,SAAS,iBAAiB,KAAwB,OAAkC;CAClF,OAAO,6BAAA,oBACL,CAAC;EAAE,GAAG;EAAK,MAAM;EAAO,UAAU;GAAE,GAAG,IAAI;GAAU,iBAAiB,CAAC;EAAE;CAAE,CAAC,GAC5E,CAAC,GACD,KACF,CAAC,CAAC;AACJ;AACA,SAAS,cAAc,QAAwB;CAC7C,IAAI,WAAW,mBAAmB,OAAO;CACzC,IAAI,WAAW,WAAW,OAAO;CACjC,IAAI,CAAC,WAAW,iBAAiB,CAAC,CAAC,SAAS,MAAM,GAAG,OAAO;CAC5D,IAAI,WAAW,aAAa,OAAO,WAAW,WAAW,GAAG,OAAO;CACnE,IAAI,WAAW,eAAe,OAAO,WAAW,YAAY,GAAG,OAAO;CACtE,OAAO;AACT"}
@@ -18,13 +18,14 @@ const require_jsx_runtime = require("./_virtual/_global-external_react/jsx-runti
18
18
  const require_ai = require("./ai.js");
19
19
  const require_appearance = require("./appearance.js");
20
20
  const require_button_styles = require("./button-styles.js");
21
+ const require_cluster_icons = require("./cluster-icons.js");
21
22
  const require_dashboard = require("./dashboard.js");
22
23
  const require_secret_certificate_details = require("./details/secret-certificate-details.js");
23
24
  const require_monitoring_collector = require("./monitoring-collector.js");
24
- const require_monitoring = require("./monitoring.js");
25
- const require_monitoring_history_collection = require("./monitoring-history-collection.js");
26
25
  const require_diagnostics = require("./diagnostics.js");
27
26
  const require_secure_node_shell_menu = require("./menus/secure-node-shell-menu.js");
27
+ const require_monitoring = require("./monitoring.js");
28
+ const require_monitoring_history_collection = require("./monitoring-history-collection.js");
28
29
  const require_node_monitoring = require("./node-monitoring.js");
29
30
  const require_pod_monitoring = require("./pod-monitoring.js");
30
31
  const require_preferences = require("./preferences/preferences.js");
@@ -97,6 +98,9 @@ var FreelensPowerRenderer = class extends require_extensions.Renderer.LensExtens
97
98
  }
98
99
  }];
99
100
  globalPages = [{
101
+ id: "cluster-icons",
102
+ components: { Page: () => /* @__PURE__ */ require_jsx_runtime.jsx(PowerEnabled, { children: /* @__PURE__ */ require_jsx_runtime.jsx(require_cluster_icons.ClusterIconsPage, {}) }) }
103
+ }, {
100
104
  id: "dashboard",
101
105
  components: { Page: () => /* @__PURE__ */ require_jsx_runtime.jsx(PowerEnabled, { children: /* @__PURE__ */ require_jsx_runtime.jsx(require_dashboard.DashboardPage, { onOpenPreferences: () => this.navigateToPreferences() }) }) }
102
106
  }];
@@ -105,9 +109,10 @@ var FreelensPowerRenderer = class extends require_extensions.Renderer.LensExtens
105
109
  components: { Page: () => /* @__PURE__ */ require_jsx_runtime.jsx(PowerEnabled, { children: /* @__PURE__ */ require_jsx_runtime.jsx(require_diagnostics.DiagnosticsPage, {}) }) }
106
110
  }];
107
111
  clusterPageMenus = [{
108
- visible: require__global_external_mobx.computed(() => require_power_preferences_store.PowerPreferencesStore.getInstanceOrCreate().enabled),
112
+ visible: require__global_external_mobx.computed(() => require_power_preferences_store.PowerPreferencesStore.getInstanceOrCreate().enabled && require_monitoring_preferences_store.MonitoringPreferencesStore.getInstanceOrCreate().diagnosticsVisible),
109
113
  target: { pageId: "diagnostics" },
110
114
  title: "Diagnostics",
115
+ orderNumber: 5,
111
116
  components: { Icon: () => /* @__PURE__ */ require_jsx_runtime.jsx(require_extensions.Renderer.Component.Icon, {
112
117
  material: "insights",
113
118
  tooltip: "Resource diagnostics"
@@ -122,7 +127,7 @@ var FreelensPowerRenderer = class extends require_extensions.Renderer.LensExtens
122
127
  kubeObjectDetailItems = [{
123
128
  kind: "Node",
124
129
  apiVersions: ["v1"],
125
- priority: 10,
130
+ priority: 310,
126
131
  components: { Details: (props) => /* @__PURE__ */ require_jsx_runtime.jsx(PowerEnabled, { children: /* @__PURE__ */ require_jsx_runtime.jsx(require_node_monitoring.NodeMonitoringDetails, {
127
132
  ...props,
128
133
  object: props.object
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/renderer/index.tsx"],"sourcesContent":["/**\n * Copyright (c) Freelens Authors. All rights reserved.\n * Licensed under MIT License. See THIRD_PARTY_LICENSES for more information.\n */\n\nimport { Common, Renderer } from \"@freelensapp/extensions\";\nimport { computed, reaction } from \"mobx\";\nimport { observer } from \"mobx-react\";\nimport { EXTENSION_DISPLAY_NAME, EXTENSION_ID } from \"../common/extension-info\";\nimport { AiPreferencesStore } from \"../common/store/ai-preferences-store\";\nimport { AiShortcutsStore } from \"../common/store/ai-shortcuts-store\";\nimport { AppearancePreferencesStore } from \"../common/store/appearance-preferences-store\";\nimport { DashboardPreferencesStore } from \"../common/store/dashboard-preferences-store\";\nimport { MonitoringPreferencesStore } from \"../common/store/monitoring-preferences-store\";\nimport { NodeShellPreferencesStore } from \"../common/store/node-shell-preferences-store\";\nimport { PowerPreferencesStore } from \"../common/store/power-preferences-store\";\nimport { ReadOnlyPreferencesStore } from \"../common/store/read-only-preferences-store\";\nimport { startAiChat } from \"./ai\";\nimport { startAppearanceOverride } from \"./appearance\";\nimport { startPowerButtonStyles } from \"./button-styles\";\nimport { DashboardPage } from \"./dashboard\";\nimport { SecretCertificateDetails } from \"./details/secret-certificate-details\";\nimport { DiagnosticsPage } from \"./diagnostics\";\nimport { SecureNodeShellMenu } from \"./menus/secure-node-shell-menu\";\nimport { startMonitoring } from \"./monitoring\";\nimport { startMonitoringCollector } from \"./monitoring-collector\";\nimport { startMonitoringHistoryCollection } from \"./monitoring-history-collection\";\nimport { NodeMonitoringDetails } from \"./node-monitoring\";\nimport { startPodMonitoring } from \"./pod-monitoring\";\nimport { PowerPreferences } from \"./preferences/preferences\";\nimport { startReadOnlyMode } from \"./read-only\";\nimport { startWelcomeOverride } from \"./welcome\";\n\nimport type { ReactNode } from \"react\";\n\nconst PowerEnabled = observer(({ children }: { children: ReactNode }) =>\n PowerPreferencesStore.getInstanceOrCreate<PowerPreferencesStore>().enabled ? <>{children}</> : null,\n);\n\nexport default class FreelensPowerRenderer extends Renderer.LensExtension {\n get name() {\n return EXTENSION_DISPLAY_NAME;\n }\n get sanitizedExtensionId() {\n return EXTENSION_ID;\n }\n get storeName() {\n return this.manifest.storeName || EXTENSION_ID;\n }\n\n private stopFeatures?: () => void;\n\n onActivate() {\n const power = PowerPreferencesStore.getInstanceOrCreate<PowerPreferencesStore>();\n power.loadExtension(this);\n AiPreferencesStore.getInstanceOrCreate().loadExtension(this);\n AiShortcutsStore.getInstanceOrCreate().loadExtension(this);\n ReadOnlyPreferencesStore.getInstanceOrCreate().loadExtension(this);\n NodeShellPreferencesStore.getInstanceOrCreate().loadExtension(this);\n MonitoringPreferencesStore.getInstanceOrCreate().loadExtension(this);\n AppearancePreferencesStore.getInstanceOrCreate().loadExtension(this);\n DashboardPreferencesStore.getInstanceOrCreate().loadExtension(this);\n this.stopFeatures?.();\n let disposers: (() => void)[] = [];\n const stop = reaction(\n () => power.enabled,\n (enabled) => {\n for (const dispose of disposers) dispose();\n disposers = [];\n if (enabled) {\n for (const start of [\n startReadOnlyMode,\n startMonitoringCollector,\n startMonitoringHistoryCollection,\n startMonitoring,\n startPodMonitoring,\n startPowerButtonStyles,\n startAppearanceOverride,\n startWelcomeOverride,\n startAiChat,\n ]) {\n try {\n disposers.push(start());\n } catch {\n Common.logger.warn(\"[Freelens Power] feature could not start\", { feature: start.name });\n }\n }\n }\n },\n { fireImmediately: true },\n );\n this.stopFeatures = () => {\n stop();\n for (const dispose of disposers) dispose();\n disposers = [];\n };\n }\n\n onDeactivate() {\n this.stopFeatures?.();\n this.stopFeatures = undefined;\n }\n\n appPreferences = [\n {\n id: \"freelens-power-settings\",\n title: \"\",\n components: { Input: PowerPreferences, Hint: () => null },\n },\n ];\n\n globalPages = [\n {\n id: \"dashboard\",\n components: {\n Page: () => (\n <PowerEnabled>\n <DashboardPage onOpenPreferences={() => this.navigateToPreferences()} />\n </PowerEnabled>\n ),\n },\n },\n ];\n\n clusterPages = [\n {\n id: \"diagnostics\",\n components: {\n Page: () => (\n <PowerEnabled>\n <DiagnosticsPage />\n </PowerEnabled>\n ),\n },\n },\n ];\n\n clusterPageMenus = [\n {\n visible: computed(() => PowerPreferencesStore.getInstanceOrCreate<PowerPreferencesStore>().enabled),\n target: { pageId: \"diagnostics\" },\n title: \"Diagnostics\",\n components: { Icon: () => <Renderer.Component.Icon material=\"insights\" tooltip=\"Resource diagnostics\" /> },\n },\n ];\n\n topBarItems = [\n {\n components: {\n Item: () => (\n <PowerEnabled>\n <Renderer.Component.Icon\n material=\"battery_charging_full\"\n className=\"freelens-power-settings-icon\"\n tooltip=\"Freelens Power settings\"\n onClick={() => this.navigateToPreferences()}\n />\n </PowerEnabled>\n ),\n },\n },\n ];\n\n kubeObjectDetailItems: Renderer.LensExtension[\"kubeObjectDetailItems\"] = [\n {\n kind: \"Node\",\n apiVersions: [\"v1\"],\n priority: 10,\n components: {\n Details: (props) => (\n <PowerEnabled>\n <NodeMonitoringDetails {...props} object={props.object as Renderer.K8sApi.Node} />\n </PowerEnabled>\n ),\n },\n },\n {\n kind: \"Secret\",\n apiVersions: [\"v1\"],\n priority: 10,\n components: {\n Details: (props) => (\n <PowerEnabled>\n <SecretCertificateDetails {...props} object={props.object as Renderer.K8sApi.Secret} />\n </PowerEnabled>\n ),\n },\n },\n ];\n\n kubeObjectMenuItems = [\n {\n kind: \"Node\",\n apiVersions: [\"v1\"],\n components: {\n MenuItem: (props: Renderer.Component.KubeObjectMenuProps<Renderer.K8sApi.Node>) => (\n <PowerEnabled>\n <SecureNodeShellMenu {...props} />\n </PowerEnabled>\n ),\n },\n },\n ];\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/renderer/index.tsx"],"sourcesContent":["/**\n * Copyright (c) Freelens Authors. All rights reserved.\n * Licensed under MIT License. See THIRD_PARTY_LICENSES for more information.\n */\n\nimport { Common, Renderer } from \"@freelensapp/extensions\";\nimport { computed, reaction } from \"mobx\";\nimport { observer } from \"mobx-react\";\nimport { EXTENSION_DISPLAY_NAME, EXTENSION_ID } from \"../common/extension-info\";\nimport { AiPreferencesStore } from \"../common/store/ai-preferences-store\";\nimport { AiShortcutsStore } from \"../common/store/ai-shortcuts-store\";\nimport { AppearancePreferencesStore } from \"../common/store/appearance-preferences-store\";\nimport { DashboardPreferencesStore } from \"../common/store/dashboard-preferences-store\";\nimport { MonitoringPreferencesStore } from \"../common/store/monitoring-preferences-store\";\nimport { NodeShellPreferencesStore } from \"../common/store/node-shell-preferences-store\";\nimport { PowerPreferencesStore } from \"../common/store/power-preferences-store\";\nimport { ReadOnlyPreferencesStore } from \"../common/store/read-only-preferences-store\";\nimport { startAiChat } from \"./ai\";\nimport { startAppearanceOverride } from \"./appearance\";\nimport { startPowerButtonStyles } from \"./button-styles\";\nimport { ClusterIconsPage } from \"./cluster-icons\";\nimport { DashboardPage } from \"./dashboard\";\nimport { SecretCertificateDetails } from \"./details/secret-certificate-details\";\nimport { DiagnosticsPage } from \"./diagnostics\";\nimport { SecureNodeShellMenu } from \"./menus/secure-node-shell-menu\";\nimport { startMonitoring } from \"./monitoring\";\nimport { startMonitoringCollector } from \"./monitoring-collector\";\nimport { startMonitoringHistoryCollection } from \"./monitoring-history-collection\";\nimport { NodeMonitoringDetails } from \"./node-monitoring\";\nimport { startPodMonitoring } from \"./pod-monitoring\";\nimport { PowerPreferences } from \"./preferences/preferences\";\nimport { startReadOnlyMode } from \"./read-only\";\nimport { startWelcomeOverride } from \"./welcome\";\n\nimport type { ReactNode } from \"react\";\n\nconst PowerEnabled = observer(({ children }: { children: ReactNode }) =>\n PowerPreferencesStore.getInstanceOrCreate<PowerPreferencesStore>().enabled ? <>{children}</> : null,\n);\n\nexport default class FreelensPowerRenderer extends Renderer.LensExtension {\n get name() {\n return EXTENSION_DISPLAY_NAME;\n }\n get sanitizedExtensionId() {\n return EXTENSION_ID;\n }\n get storeName() {\n return this.manifest.storeName || EXTENSION_ID;\n }\n\n private stopFeatures?: () => void;\n\n onActivate() {\n const power = PowerPreferencesStore.getInstanceOrCreate<PowerPreferencesStore>();\n power.loadExtension(this);\n AiPreferencesStore.getInstanceOrCreate().loadExtension(this);\n AiShortcutsStore.getInstanceOrCreate().loadExtension(this);\n ReadOnlyPreferencesStore.getInstanceOrCreate().loadExtension(this);\n NodeShellPreferencesStore.getInstanceOrCreate().loadExtension(this);\n MonitoringPreferencesStore.getInstanceOrCreate().loadExtension(this);\n AppearancePreferencesStore.getInstanceOrCreate().loadExtension(this);\n DashboardPreferencesStore.getInstanceOrCreate().loadExtension(this);\n this.stopFeatures?.();\n let disposers: (() => void)[] = [];\n const stop = reaction(\n () => power.enabled,\n (enabled) => {\n for (const dispose of disposers) dispose();\n disposers = [];\n if (enabled) {\n for (const start of [\n startReadOnlyMode,\n startMonitoringCollector,\n startMonitoringHistoryCollection,\n startMonitoring,\n startPodMonitoring,\n startPowerButtonStyles,\n startAppearanceOverride,\n startWelcomeOverride,\n startAiChat,\n ]) {\n try {\n disposers.push(start());\n } catch {\n Common.logger.warn(\"[Freelens Power] feature could not start\", { feature: start.name });\n }\n }\n }\n },\n { fireImmediately: true },\n );\n this.stopFeatures = () => {\n stop();\n for (const dispose of disposers) dispose();\n disposers = [];\n };\n }\n\n onDeactivate() {\n this.stopFeatures?.();\n this.stopFeatures = undefined;\n }\n\n appPreferences = [\n {\n id: \"freelens-power-settings\",\n title: \"\",\n components: { Input: PowerPreferences, Hint: () => null },\n },\n ];\n\n globalPages = [\n {\n id: \"cluster-icons\",\n components: {\n Page: () => (\n <PowerEnabled>\n <ClusterIconsPage />\n </PowerEnabled>\n ),\n },\n },\n {\n id: \"dashboard\",\n components: {\n Page: () => (\n <PowerEnabled>\n <DashboardPage onOpenPreferences={() => this.navigateToPreferences()} />\n </PowerEnabled>\n ),\n },\n },\n ];\n\n clusterPages = [\n {\n id: \"diagnostics\",\n components: {\n Page: () => (\n <PowerEnabled>\n <DiagnosticsPage />\n </PowerEnabled>\n ),\n },\n },\n ];\n\n clusterPageMenus = [\n {\n visible: computed(\n () =>\n PowerPreferencesStore.getInstanceOrCreate<PowerPreferencesStore>().enabled &&\n MonitoringPreferencesStore.getInstanceOrCreate<MonitoringPreferencesStore>().diagnosticsVisible,\n ),\n target: { pageId: \"diagnostics\" },\n title: \"Diagnostics\",\n orderNumber: 5,\n components: { Icon: () => <Renderer.Component.Icon material=\"insights\" tooltip=\"Resource diagnostics\" /> },\n },\n ];\n\n topBarItems = [\n {\n components: {\n Item: () => (\n <PowerEnabled>\n <Renderer.Component.Icon\n material=\"battery_charging_full\"\n className=\"freelens-power-settings-icon\"\n tooltip=\"Freelens Power settings\"\n onClick={() => this.navigateToPreferences()}\n />\n </PowerEnabled>\n ),\n },\n },\n ];\n\n kubeObjectDetailItems: Renderer.LensExtension[\"kubeObjectDetailItems\"] = [\n {\n kind: \"Node\",\n apiVersions: [\"v1\"],\n // host order is [300 - priority], before native metrics at [-1]\n priority: 310,\n components: {\n Details: (props) => (\n <PowerEnabled>\n <NodeMonitoringDetails {...props} object={props.object as Renderer.K8sApi.Node} />\n </PowerEnabled>\n ),\n },\n },\n {\n kind: \"Secret\",\n apiVersions: [\"v1\"],\n priority: 10,\n components: {\n Details: (props) => (\n <PowerEnabled>\n <SecretCertificateDetails {...props} object={props.object as Renderer.K8sApi.Secret} />\n </PowerEnabled>\n ),\n },\n },\n ];\n\n kubeObjectMenuItems = [\n {\n kind: \"Node\",\n apiVersions: [\"v1\"],\n components: {\n MenuItem: (props: Renderer.Component.KubeObjectMenuProps<Renderer.K8sApi.Node>) => (\n <PowerEnabled>\n <SecureNodeShellMenu {...props} />\n </PowerEnabled>\n ),\n },\n },\n ];\n}\n"],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ const require_jsx_runtime = require("./_virtual/_global-external_react/jsx-runtime.js");
2
+ const require_monitoring_history_view = require("./monitoring-history-view.js");
3
+ const require_monitoring = require("./monitoring.js");
4
+ //#region src/renderer/monitoring-details-chart.tsx
5
+ function MonitoringDetailsChart({ metric, samples, status, historyStatus, range, onRangeChange, native = false, scope }) {
6
+ return /* @__PURE__ */ require_jsx_runtime.jsxs("div", {
7
+ className: "power-details-metric-chart",
8
+ children: [
9
+ /* @__PURE__ */ require_jsx_runtime.jsx("style", { children: `
10
+ .power-details-metric-chart .power-monitoring-period-action { position:absolute;top:19px;right:16px;left:auto }
11
+ .power-details-metric-chart [data-monitoring-heading] { overflow-wrap:anywhere }
12
+ ` }),
13
+ /* @__PURE__ */ require_jsx_runtime.jsx(require_monitoring.MetricChart, {
14
+ metric,
15
+ samples,
16
+ status,
17
+ scope,
18
+ headerAction: /* @__PURE__ */ require_jsx_runtime.jsx(require_monitoring_history_view.MonitoringHistoryRange, {
19
+ compact: true,
20
+ native,
21
+ range,
22
+ onChange: onRangeChange
23
+ })
24
+ }),
25
+ historyStatus && /* @__PURE__ */ require_jsx_runtime.jsx("small", {
26
+ role: "status",
27
+ style: {
28
+ display: "block",
29
+ padding: "0 16px 8px",
30
+ color: "var(--textColorSecondary)",
31
+ fontSize: 11,
32
+ lineHeight: 1.4
33
+ },
34
+ children: historyStatus
35
+ })
36
+ ]
37
+ });
38
+ }
39
+ //#endregion
40
+ exports.MonitoringDetailsChart = MonitoringDetailsChart;
41
+
42
+ //# sourceMappingURL=monitoring-details-chart.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"monitoring-details-chart.js","names":[],"sources":["../../src/renderer/monitoring-details-chart.tsx"],"sourcesContent":["import { MetricChart } from \"./monitoring\";\nimport { type HistoryRange, MonitoringHistoryRange } from \"./monitoring-history-view\";\n\nimport type { MonitoringSample } from \"../common/monitoring-math\";\n\nexport function MonitoringDetailsChart({\n metric,\n samples,\n status,\n historyStatus,\n range,\n onRangeChange,\n native = false,\n scope,\n}: {\n metric: \"cpu\" | \"memory\";\n samples: MonitoringSample[];\n status: string;\n historyStatus: string;\n range: HistoryRange;\n onRangeChange(value: HistoryRange): void;\n native?: boolean;\n scope?: \"node\" | \"pod\";\n}) {\n return (\n <div className=\"power-details-metric-chart\">\n <style>{`\n .power-details-metric-chart .power-monitoring-period-action { position:absolute;top:19px;right:16px;left:auto }\n .power-details-metric-chart [data-monitoring-heading] { overflow-wrap:anywhere }\n `}</style>\n <MetricChart\n metric={metric}\n samples={samples}\n status={status}\n scope={scope}\n headerAction={<MonitoringHistoryRange compact native={native} range={range} onChange={onRangeChange} />}\n />\n {historyStatus && (\n <small\n role=\"status\"\n style={{\n display: \"block\",\n padding: \"0 16px 8px\",\n color: \"var(--textColorSecondary)\",\n fontSize: 11,\n lineHeight: 1.4,\n }}\n >\n {historyStatus}\n </small>\n )}\n </div>\n );\n}\n"],"mappings":";;;;AAKA,SAAgB,uBAAuB,EACrC,QACA,SACA,QACA,eACA,OACA,eACA,SAAS,OACT,SAUC;CACD,OACE,oCAAA,KAAC,OAAD;EAAK,WAAU;YAAf;GACE,oCAAA,IAAC,SAAD,EAAA,UAAQ;;;MAGD,CAAA;GACP,oCAAA,IAAC,mBAAA,aAAD;IACU;IACC;IACD;IACD;IACP,cAAc,oCAAA,IAAC,gCAAA,wBAAD;KAAwB,SAAA;KAAgB;KAAe;KAAO,UAAU;IAAgB,CAAA;GACvG,CAAA;GACA,iBACC,oCAAA,IAAC,SAAD;IACE,MAAK;IACL,OAAO;KACL,SAAS;KACT,SAAS;KACT,OAAO;KACP,UAAU;KACV,YAAY;IACd;cAEC;GACI,CAAA;EAEN;;AAET"}
@@ -1,24 +1,10 @@
1
1
  const require_extensions = require("./_virtual/_global-external_@freelensapp/extensions.js");
2
- const require_monitoring_history = require("./src/common/monitoring-history.js");
3
2
  const require_monitoring_preferences_store = require("./src/common/store/monitoring-preferences-store.js");
4
3
  const require_monitoring_math = require("./src/common/monitoring-math.js");
5
4
  const require_resource_diagnostics = require("./src/common/resource-diagnostics.js");
6
5
  const require_monitoring_collector = require("./monitoring-collector.js");
7
- const require_monitoring_history$1 = require("./monitoring-history.js");
6
+ const require_monitoring_history = require("./monitoring-history.js");
8
7
  //#region src/renderer/monitoring-history-collection.ts
9
- function isHistoryTracked(identity) {
10
- return require_monitoring_preferences_store.MonitoringPreferencesStore.getInstanceOrCreate().trackedHistory.some((item) => item.clusterId === identity.clusterId && item.scope === identity.scope && item.uid === identity.uid);
11
- }
12
- function setHistoryTracked(identity, tracked) {
13
- if (!require_monitoring_history.validHistoryIdentity(identity)) return;
14
- const preferences = require_monitoring_preferences_store.MonitoringPreferencesStore.getInstanceOrCreate();
15
- const rest = preferences.trackedHistory.filter((item) => !(item.clusterId === identity.clusterId && item.scope === identity.scope && item.uid === identity.uid));
16
- preferences.trackedHistory = tracked ? [...rest, {
17
- clusterId: identity.clusterId,
18
- scope: identity.scope,
19
- uid: identity.uid
20
- }].slice(-100) : rest;
21
- }
22
8
  function numeric(sample) {
23
9
  const values = {
24
10
  cpu: sample.cpu,
@@ -150,7 +136,7 @@ function startMonitoringHistoryCollection() {
150
136
  if (!permitted(data)) break;
151
137
  const batch = samples.slice(i, i + 512);
152
138
  try {
153
- if (!await require_monitoring_history$1.monitoringHistory.append(batch) || stopped) continue;
139
+ if (!await require_monitoring_history.monitoringHistory.append(batch) || stopped) continue;
154
140
  for (const sample of batch) {
155
141
  const key = `${sample.clusterId}/${sample.scope}/${sample.uid}`;
156
142
  seen.set(key, Math.max(seen.get(key) ?? 0, sample.time));
@@ -177,8 +163,6 @@ function startMonitoringHistoryCollection() {
177
163
  }
178
164
  //#endregion
179
165
  exports.historySnapshotSamples = historySnapshotSamples;
180
- exports.isHistoryTracked = isHistoryTracked;
181
- exports.setHistoryTracked = setHistoryTracked;
182
166
  exports.startMonitoringHistoryCollection = startMonitoringHistoryCollection;
183
167
 
184
168
  //# sourceMappingURL=monitoring-history-collection.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"monitoring-history-collection.js","names":[],"sources":["../../src/renderer/monitoring-history-collection.ts"],"sourcesContent":["import { Renderer } from \"@freelensapp/extensions\";\nimport { type HistoryIdentity, type HistorySample, validHistoryIdentity } from \"../common/monitoring-history\";\nimport { aggregateMetrics, aggregateResources, type MonitoringSample } from \"../common/monitoring-math\";\nimport { buildConsumerGroups, effectivePodResource } from \"../common/resource-diagnostics\";\nimport { MonitoringPreferencesStore } from \"../common/store/monitoring-preferences-store\";\nimport {\n getCollectedPodUsage,\n getNodeSample,\n type MonitoringSnapshot,\n onMonitoringSnapshot,\n} from \"./monitoring-collector\";\nimport { monitoringHistory } from \"./monitoring-history\";\nexport function isHistoryTracked(identity: HistoryIdentity): boolean {\n return MonitoringPreferencesStore.getInstanceOrCreate<MonitoringPreferencesStore>().trackedHistory.some(\n (item) => item.clusterId === identity.clusterId && item.scope === identity.scope && item.uid === identity.uid,\n );\n}\nexport function setHistoryTracked(identity: HistoryIdentity, tracked: boolean): void {\n if (!validHistoryIdentity(identity)) return;\n const preferences = MonitoringPreferencesStore.getInstanceOrCreate<MonitoringPreferencesStore>();\n const rest = preferences.trackedHistory.filter(\n (item) => !(item.clusterId === identity.clusterId && item.scope === identity.scope && item.uid === identity.uid),\n );\n preferences.trackedHistory = tracked\n ? [...rest, { clusterId: identity.clusterId, scope: identity.scope, uid: identity.uid }].slice(-100)\n : rest;\n}\nfunction numeric(sample: MonitoringSample): HistorySample[\"values\"] {\n const values: HistorySample[\"values\"] = { cpu: sample.cpu, memory: sample.memory };\n for (const metric of [\"cpu\", \"memory\"] as const)\n for (const field of [\"requests\", \"limits\", \"capacity\", \"allocatable\"] as const) {\n const value = sample.resources?.[metric]?.[field];\n if (value !== undefined && Number.isFinite(value))\n values[`${metric}${field[0].toUpperCase()}${field.slice(1)}` as keyof typeof values] = value;\n }\n return values;\n}\nexport function historySnapshotSamples(data: MonitoringSnapshot, tracked: HistoryIdentity[]): HistorySample[] {\n const result: HistorySample[] = [];\n const add = (scope: HistoryIdentity[\"scope\"], uid: string, sample: MonitoringSample) =>\n result.push({ clusterId: data.clusterId, scope, uid, time: sample.time, values: numeric(sample) });\n if (data.nodeMetrics?.length) {\n try {\n const sample = aggregateMetrics(data.nodeMetrics);\n sample.time = Math.min(...data.nodeMetrics.map((metric) => Date.parse(metric.timestamp)));\n if (data.nodes?.length) {\n try {\n sample.resources = aggregateResources(data.nodes, data.pods);\n } catch {\n // usage remains valid when capacity or request data is incomplete\n }\n }\n add(\"cluster\", data.clusterId, sample);\n } catch {\n /* invalid or stale metrics leave a gap */\n }\n }\n const nodeMetricsByName = new Map<string, NonNullable<MonitoringSnapshot[\"nodeMetrics\"]>>();\n for (const metric of data.nodeMetrics ?? []) {\n if (!metric.metadata?.name) continue;\n const metrics = nodeMetricsByName.get(metric.metadata.name) ?? [];\n metrics.push(metric);\n nodeMetricsByName.set(metric.metadata.name, metrics);\n }\n const podsByNode = new Map<string, NonNullable<MonitoringSnapshot[\"pods\"]>>();\n for (const pod of data.pods ?? []) {\n const name = pod.spec.nodeName;\n if (!name) continue;\n const pods = podsByNode.get(name) ?? [];\n pods.push(pod);\n podsByNode.set(name, pods);\n }\n for (const node of data.nodes ?? []) {\n if (!node.metadata.uid) continue;\n try {\n const sample = getNodeSample(\n {\n ...data,\n nodes: [node],\n nodeMetrics: nodeMetricsByName.get(node.metadata.name),\n pods: data.pods ? (podsByNode.get(node.metadata.name) ?? []) : undefined,\n },\n node.metadata.name,\n node.metadata.uid,\n );\n if (sample) add(\"node\", node.metadata.uid, sample);\n } catch {\n /* invalid or stale metrics leave a gap */\n }\n }\n const usage = getCollectedPodUsage(data);\n const targets = tracked.filter((item) => item.clusterId === data.clusterId);\n const podsByUid = new Map((data.pods ?? []).map((pod) => [pod.metadata.uid, pod]));\n const usageByUid = new Map(usage.map((item) => [item.uid, item]));\n const metricsByName = new Map(\n (data.podMetrics ?? []).map((metric) => [`${metric.metadata.namespace ?? \"\"}/${metric.metadata.name}`, metric]),\n );\n const workloadTargets = new Set(targets.filter((item) => item.scope === \"workload\").map((item) => item.uid));\n for (const target of targets.filter((item) => item.scope === \"pod\")) {\n const pod = podsByUid.get(target.uid);\n const metric = usageByUid.get(target.uid);\n const raw = pod ? metricsByName.get(`${pod.metadata.namespace ?? \"\"}/${pod.metadata.name}`) : undefined;\n if (!pod || !metric || metric.cpu === undefined || metric.memory === undefined || !raw) continue;\n const sample: MonitoringSample = { time: Date.parse(raw.timestamp), cpu: metric.cpu, memory: metric.memory };\n try {\n sample.resources = {\n cpu: { requests: effectivePodResource(pod, \"cpu\"), limits: effectivePodResource(pod, \"cpu\", \"limits\") },\n memory: {\n requests: effectivePodResource(pod, \"memory\"),\n limits: effectivePodResource(pod, \"memory\", \"limits\"),\n },\n };\n } catch {\n /* usage remains available without resource totals */\n }\n add(\"pod\", target.uid, sample);\n }\n for (const group of workloadTargets.size ? buildConsumerGroups(data.pods ?? [], data.owners ?? [], usage) : []) {\n if (\n !group.ownerResolved ||\n !workloadTargets.has(group.identity) ||\n group.cpu.coveredPods !== group.cpu.totalPods ||\n group.memory.coveredPods !== group.memory.totalPods ||\n group.cpu.usage === undefined ||\n group.memory.usage === undefined\n )\n continue;\n const times = group.pods.flatMap((pod) => {\n const metric = metricsByName.get(`${pod.metadata.namespace ?? \"\"}/${pod.metadata.name}`);\n return metric ? [Date.parse(metric.timestamp)] : [];\n });\n if (!times.length) continue;\n add(\"workload\", group.identity, {\n time: Math.min(...times),\n cpu: group.cpu.usage,\n memory: group.memory.usage,\n resources: {\n cpu: { requests: group.cpu.unknownRequestPods ? undefined : group.cpu.requests },\n memory: { requests: group.memory.unknownRequestPods ? undefined : group.memory.requests },\n },\n });\n }\n return result;\n}\nexport function startMonitoringHistoryCollection(): () => void {\n const seen = new Map<string, number>();\n let stopped = false;\n let writing = false;\n let queued: MonitoringSnapshot | undefined;\n const permitted = (data: MonitoringSnapshot) => {\n const preferences = MonitoringPreferencesStore.getInstanceOrCreate<MonitoringPreferencesStore>();\n return (\n !stopped &&\n preferences.enabled &&\n preferences.historyEnabled &&\n document.visibilityState !== \"hidden\" &&\n Renderer.Catalog.activeCluster.get()?.metadata.uid === data.clusterId\n );\n };\n const flush = async () => {\n if (writing) return;\n writing = true;\n try {\n while (queued && !stopped) {\n const data = queued;\n queued = undefined;\n if (!permitted(data)) continue;\n const preferences = MonitoringPreferencesStore.getInstanceOrCreate<MonitoringPreferencesStore>();\n const samples = historySnapshotSamples(data, preferences.trackedHistory).filter(\n (sample) => (seen.get(`${sample.clusterId}/${sample.scope}/${sample.uid}`) ?? 0) < sample.time,\n );\n for (let i = 0; i < samples.length; i += 512) {\n if (!permitted(data)) break;\n const batch = samples.slice(i, i + 512);\n try {\n if (!(await monitoringHistory.append(batch)) || stopped) continue;\n for (const sample of batch) {\n const key = `${sample.clusterId}/${sample.scope}/${sample.uid}`;\n seen.set(key, Math.max(seen.get(key) ?? 0, sample.time));\n }\n while (seen.size > 10_000) seen.delete(seen.keys().next().value!);\n } catch {\n // failed batches remain eligible for the next snapshot\n }\n }\n }\n } finally {\n writing = false;\n }\n };\n const unsubscribe = onMonitoringSnapshot((data) => {\n if (!permitted(data)) return;\n // retain only the newest pending snapshot while writes are in flight\n queued = data;\n void flush();\n });\n return () => {\n stopped = true;\n queued = undefined;\n unsubscribe();\n seen.clear();\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"monitoring-history-collection.js","names":[],"sources":["../../src/renderer/monitoring-history-collection.ts"],"sourcesContent":["import { Renderer } from \"@freelensapp/extensions\";\nimport { type HistoryIdentity, type HistorySample, validHistoryIdentity } from \"../common/monitoring-history\";\nimport { aggregateMetrics, aggregateResources, type MonitoringSample } from \"../common/monitoring-math\";\nimport { buildConsumerGroups, effectivePodResource } from \"../common/resource-diagnostics\";\nimport { MonitoringPreferencesStore } from \"../common/store/monitoring-preferences-store\";\nimport {\n getCollectedPodUsage,\n getNodeSample,\n type MonitoringSnapshot,\n onMonitoringSnapshot,\n} from \"./monitoring-collector\";\nimport { monitoringHistory } from \"./monitoring-history\";\nexport function isHistoryTracked(identity: HistoryIdentity): boolean {\n return MonitoringPreferencesStore.getInstanceOrCreate<MonitoringPreferencesStore>().trackedHistory.some(\n (item) => item.clusterId === identity.clusterId && item.scope === identity.scope && item.uid === identity.uid,\n );\n}\nexport function setHistoryTracked(identity: HistoryIdentity, tracked: boolean): void {\n if (!validHistoryIdentity(identity)) return;\n const preferences = MonitoringPreferencesStore.getInstanceOrCreate<MonitoringPreferencesStore>();\n const rest = preferences.trackedHistory.filter(\n (item) => !(item.clusterId === identity.clusterId && item.scope === identity.scope && item.uid === identity.uid),\n );\n preferences.trackedHistory = tracked\n ? [...rest, { clusterId: identity.clusterId, scope: identity.scope, uid: identity.uid }].slice(-100)\n : rest;\n}\nfunction numeric(sample: MonitoringSample): HistorySample[\"values\"] {\n const values: HistorySample[\"values\"] = { cpu: sample.cpu, memory: sample.memory };\n for (const metric of [\"cpu\", \"memory\"] as const)\n for (const field of [\"requests\", \"limits\", \"capacity\", \"allocatable\"] as const) {\n const value = sample.resources?.[metric]?.[field];\n if (value !== undefined && Number.isFinite(value))\n values[`${metric}${field[0].toUpperCase()}${field.slice(1)}` as keyof typeof values] = value;\n }\n return values;\n}\nexport function historySnapshotSamples(data: MonitoringSnapshot, tracked: HistoryIdentity[]): HistorySample[] {\n const result: HistorySample[] = [];\n const add = (scope: HistoryIdentity[\"scope\"], uid: string, sample: MonitoringSample) =>\n result.push({ clusterId: data.clusterId, scope, uid, time: sample.time, values: numeric(sample) });\n if (data.nodeMetrics?.length) {\n try {\n const sample = aggregateMetrics(data.nodeMetrics);\n sample.time = Math.min(...data.nodeMetrics.map((metric) => Date.parse(metric.timestamp)));\n if (data.nodes?.length) {\n try {\n sample.resources = aggregateResources(data.nodes, data.pods);\n } catch {\n // usage remains valid when capacity or request data is incomplete\n }\n }\n add(\"cluster\", data.clusterId, sample);\n } catch {\n /* invalid or stale metrics leave a gap */\n }\n }\n const nodeMetricsByName = new Map<string, NonNullable<MonitoringSnapshot[\"nodeMetrics\"]>>();\n for (const metric of data.nodeMetrics ?? []) {\n if (!metric.metadata?.name) continue;\n const metrics = nodeMetricsByName.get(metric.metadata.name) ?? [];\n metrics.push(metric);\n nodeMetricsByName.set(metric.metadata.name, metrics);\n }\n const podsByNode = new Map<string, NonNullable<MonitoringSnapshot[\"pods\"]>>();\n for (const pod of data.pods ?? []) {\n const name = pod.spec.nodeName;\n if (!name) continue;\n const pods = podsByNode.get(name) ?? [];\n pods.push(pod);\n podsByNode.set(name, pods);\n }\n for (const node of data.nodes ?? []) {\n if (!node.metadata.uid) continue;\n try {\n const sample = getNodeSample(\n {\n ...data,\n nodes: [node],\n nodeMetrics: nodeMetricsByName.get(node.metadata.name),\n pods: data.pods ? (podsByNode.get(node.metadata.name) ?? []) : undefined,\n },\n node.metadata.name,\n node.metadata.uid,\n );\n if (sample) add(\"node\", node.metadata.uid, sample);\n } catch {\n /* invalid or stale metrics leave a gap */\n }\n }\n const usage = getCollectedPodUsage(data);\n const targets = tracked.filter((item) => item.clusterId === data.clusterId);\n const podsByUid = new Map((data.pods ?? []).map((pod) => [pod.metadata.uid, pod]));\n const usageByUid = new Map(usage.map((item) => [item.uid, item]));\n const metricsByName = new Map(\n (data.podMetrics ?? []).map((metric) => [`${metric.metadata.namespace ?? \"\"}/${metric.metadata.name}`, metric]),\n );\n const workloadTargets = new Set(targets.filter((item) => item.scope === \"workload\").map((item) => item.uid));\n for (const target of targets.filter((item) => item.scope === \"pod\")) {\n const pod = podsByUid.get(target.uid);\n const metric = usageByUid.get(target.uid);\n const raw = pod ? metricsByName.get(`${pod.metadata.namespace ?? \"\"}/${pod.metadata.name}`) : undefined;\n if (!pod || !metric || metric.cpu === undefined || metric.memory === undefined || !raw) continue;\n const sample: MonitoringSample = { time: Date.parse(raw.timestamp), cpu: metric.cpu, memory: metric.memory };\n try {\n sample.resources = {\n cpu: { requests: effectivePodResource(pod, \"cpu\"), limits: effectivePodResource(pod, \"cpu\", \"limits\") },\n memory: {\n requests: effectivePodResource(pod, \"memory\"),\n limits: effectivePodResource(pod, \"memory\", \"limits\"),\n },\n };\n } catch {\n /* usage remains available without resource totals */\n }\n add(\"pod\", target.uid, sample);\n }\n for (const group of workloadTargets.size ? buildConsumerGroups(data.pods ?? [], data.owners ?? [], usage) : []) {\n if (\n !group.ownerResolved ||\n !workloadTargets.has(group.identity) ||\n group.cpu.coveredPods !== group.cpu.totalPods ||\n group.memory.coveredPods !== group.memory.totalPods ||\n group.cpu.usage === undefined ||\n group.memory.usage === undefined\n )\n continue;\n const times = group.pods.flatMap((pod) => {\n const metric = metricsByName.get(`${pod.metadata.namespace ?? \"\"}/${pod.metadata.name}`);\n return metric ? [Date.parse(metric.timestamp)] : [];\n });\n if (!times.length) continue;\n add(\"workload\", group.identity, {\n time: Math.min(...times),\n cpu: group.cpu.usage,\n memory: group.memory.usage,\n resources: {\n cpu: { requests: group.cpu.unknownRequestPods ? undefined : group.cpu.requests },\n memory: { requests: group.memory.unknownRequestPods ? undefined : group.memory.requests },\n },\n });\n }\n return result;\n}\nexport function startMonitoringHistoryCollection(): () => void {\n const seen = new Map<string, number>();\n let stopped = false;\n let writing = false;\n let queued: MonitoringSnapshot | undefined;\n const permitted = (data: MonitoringSnapshot) => {\n const preferences = MonitoringPreferencesStore.getInstanceOrCreate<MonitoringPreferencesStore>();\n return (\n !stopped &&\n preferences.enabled &&\n preferences.historyEnabled &&\n document.visibilityState !== \"hidden\" &&\n Renderer.Catalog.activeCluster.get()?.metadata.uid === data.clusterId\n );\n };\n const flush = async () => {\n if (writing) return;\n writing = true;\n try {\n while (queued && !stopped) {\n const data = queued;\n queued = undefined;\n if (!permitted(data)) continue;\n const preferences = MonitoringPreferencesStore.getInstanceOrCreate<MonitoringPreferencesStore>();\n const samples = historySnapshotSamples(data, preferences.trackedHistory).filter(\n (sample) => (seen.get(`${sample.clusterId}/${sample.scope}/${sample.uid}`) ?? 0) < sample.time,\n );\n for (let i = 0; i < samples.length; i += 512) {\n if (!permitted(data)) break;\n const batch = samples.slice(i, i + 512);\n try {\n if (!(await monitoringHistory.append(batch)) || stopped) continue;\n for (const sample of batch) {\n const key = `${sample.clusterId}/${sample.scope}/${sample.uid}`;\n seen.set(key, Math.max(seen.get(key) ?? 0, sample.time));\n }\n while (seen.size > 10_000) seen.delete(seen.keys().next().value!);\n } catch {\n // failed batches remain eligible for the next snapshot\n }\n }\n }\n } finally {\n writing = false;\n }\n };\n const unsubscribe = onMonitoringSnapshot((data) => {\n if (!permitted(data)) return;\n // retain only the newest pending snapshot while writes are in flight\n queued = data;\n void flush();\n });\n return () => {\n stopped = true;\n queued = undefined;\n unsubscribe();\n seen.clear();\n };\n}\n"],"mappings":"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"}