@64mb/freelens-power 1.0.3 → 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.
- package/README.md +9 -4
- package/THIRD_PARTY_LICENSES +1707 -0
- package/out/main/ai.js +63 -23
- package/out/main/ai.js.map +1 -1
- package/out/main/cluster-icons-catalog.js +28 -0
- package/out/main/cluster-icons-catalog.js.map +1 -0
- package/out/main/cluster-icons.js +125 -0
- package/out/main/cluster-icons.js.map +1 -0
- package/out/main/common/ai-terminal-context.js +51 -0
- package/out/main/common/ai-terminal-context.js.map +1 -0
- package/out/main/common/ai.js.map +1 -1
- package/out/main/common/cluster-icon-ipc.js +6 -0
- package/out/main/common/cluster-icon-ipc.js.map +1 -0
- package/out/main/common/cluster-icons.js +121 -0
- package/out/main/common/cluster-icons.js.map +1 -0
- package/out/main/common/dashboard.js +1 -1
- package/out/main/common/dashboard.js.map +1 -1
- package/out/main/common/monitoring-history.js +52 -0
- package/out/main/common/monitoring-history.js.map +1 -0
- package/out/main/common/settings-export.js +3 -1
- package/out/main/common/settings-export.js.map +1 -1
- package/out/main/common/store/cluster-icons-store.js +32 -0
- package/out/main/common/store/cluster-icons-store.js.map +1 -0
- package/out/main/common/store/monitoring-preferences-store.js +30 -2
- package/out/main/common/store/monitoring-preferences-store.js.map +1 -1
- package/out/main/dashboard-views.js +132 -28
- package/out/main/dashboard-views.js.map +1 -1
- package/out/main/diagnostics-menu-order.js +57 -0
- package/out/main/diagnostics-menu-order.js.map +1 -0
- package/out/main/index.js +11 -1
- package/out/main/index.js.map +1 -1
- package/out/main/monitoring-history-database.js +103 -0
- package/out/main/monitoring-history-database.js.map +1 -0
- package/out/main/monitoring-history-worker.js +61 -0
- package/out/main/monitoring-history-worker.js.map +1 -0
- package/out/main/monitoring-history.js +110 -0
- package/out/main/monitoring-history.js.map +1 -0
- package/out/renderer/_virtual/_global-external_mobx.js +2 -1
- package/out/renderer/_virtual/_global-external_react-dom.js +2 -1
- package/out/renderer/_virtual/_global-external_react.js +10 -5
- package/out/renderer/_virtual/_rolldown/runtime.js +22 -0
- package/out/renderer/ai-terminal-context.js +200 -0
- package/out/renderer/ai-terminal-context.js.map +1 -0
- package/out/renderer/ai.js +90 -9
- package/out/renderer/ai.js.map +1 -1
- package/out/renderer/appearance.js +1 -0
- package/out/renderer/appearance.js.map +1 -1
- package/out/renderer/cluster-icon-colors.js +188 -0
- package/out/renderer/cluster-icon-colors.js.map +1 -0
- package/out/renderer/cluster-icons.js +304 -0
- package/out/renderer/cluster-icons.js.map +1 -0
- package/out/renderer/dashboard.js +8 -5
- package/out/renderer/dashboard.js.map +1 -1
- package/out/renderer/details/secret-certificate-details.js +9 -2
- package/out/renderer/details/secret-certificate-details.js.map +1 -1
- package/out/renderer/diagnostics.css.js +39 -0
- package/out/renderer/diagnostics.css.js.map +1 -0
- package/out/renderer/diagnostics.js +1100 -0
- package/out/renderer/diagnostics.js.map +1 -0
- package/out/renderer/index.js +32 -0
- package/out/renderer/index.js.map +1 -1
- package/out/renderer/monitoring-collector.js +202 -0
- package/out/renderer/monitoring-collector.js.map +1 -0
- package/out/renderer/monitoring-details-chart.js +42 -0
- package/out/renderer/monitoring-details-chart.js.map +1 -0
- package/out/renderer/monitoring-history-collection.js +168 -0
- package/out/renderer/monitoring-history-collection.js.map +1 -0
- package/out/renderer/monitoring-history-view.js +227 -0
- package/out/renderer/monitoring-history-view.js.map +1 -0
- package/out/renderer/monitoring-history.js +19 -0
- package/out/renderer/monitoring-history.js.map +1 -0
- package/out/renderer/monitoring.js +153 -139
- package/out/renderer/monitoring.js.map +1 -1
- package/out/renderer/node-monitoring.js +127 -0
- package/out/renderer/node-monitoring.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js +10 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js +8 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js +9 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js +9 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/classCallCheck.js +8 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/classCallCheck.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/createClass.js +15 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/createClass.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/createSuper.js +19 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/createSuper.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/defineProperty.js +14 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/defineProperty.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/extends.js +19 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/extends.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js +15 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/inherits.js +14 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/inherits.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/isNativeReflectConstruct.js +18 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/isNativeReflectConstruct.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/iterableToArray.js +8 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/iterableToArray.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js +26 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/nonIterableRest.js +8 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/nonIterableRest.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js +8 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/objectSpread2.js +27 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/objectSpread2.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js +15 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js +14 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js +12 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js +15 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/slicedToArray.js +12 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/slicedToArray.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/taggedTemplateLiteral.js +8 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/taggedTemplateLiteral.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/toConsumableArray.js +12 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/toConsumableArray.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/toPrimitive.js +16 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/toPrimitive.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/toPropertyKey.js +11 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/toPropertyKey.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/typeof.js +18 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/typeof.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js +13 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/@emotion_cache@11.14.0/node_modules/@emotion/cache/dist/emotion-cache.browser.esm.js +237 -0
- package/out/renderer/node_modules/.pnpm/@emotion_cache@11.14.0/node_modules/@emotion/cache/dist/emotion-cache.browser.esm.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/@emotion_hash@0.9.2/node_modules/@emotion/hash/dist/emotion-hash.esm.js +25 -0
- package/out/renderer/node_modules/.pnpm/@emotion_hash@0.9.2/node_modules/@emotion/hash/dist/emotion-hash.esm.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/@emotion_memoize@0.9.0/node_modules/@emotion/memoize/dist/emotion-memoize.esm.js +12 -0
- package/out/renderer/node_modules/.pnpm/@emotion_memoize@0.9.0/node_modules/@emotion/memoize/dist/emotion-memoize.esm.js.map +1 -0
- 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
- 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
- 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
- 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
- package/out/renderer/node_modules/.pnpm/@emotion_serialize@1.3.3/node_modules/@emotion/serialize/dist/emotion-serialize.esm.js +133 -0
- package/out/renderer/node_modules/.pnpm/@emotion_serialize@1.3.3/node_modules/@emotion/serialize/dist/emotion-serialize.esm.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/@emotion_sheet@1.4.0/node_modules/@emotion/sheet/dist/emotion-sheet.esm.js +65 -0
- package/out/renderer/node_modules/.pnpm/@emotion_sheet@1.4.0/node_modules/@emotion/sheet/dist/emotion-sheet.esm.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/@emotion_unitless@0.10.0/node_modules/@emotion/unitless/dist/emotion-unitless.esm.js +54 -0
- package/out/renderer/node_modules/.pnpm/@emotion_unitless@0.10.0/node_modules/@emotion/unitless/dist/emotion-unitless.esm.js.map +1 -0
- 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
- 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
- package/out/renderer/node_modules/.pnpm/@emotion_utils@1.4.2/node_modules/@emotion/utils/dist/emotion-utils.browser.esm.js +30 -0
- package/out/renderer/node_modules/.pnpm/@emotion_utils@1.4.2/node_modules/@emotion/utils/dist/emotion-utils.browser.esm.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/@floating-ui_dom@1.7.2/node_modules/@floating-ui/dom/dist/floating-ui.dom.js +211 -0
- 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
- 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
- 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
- package/out/renderer/node_modules/.pnpm/@floating-ui_utils@0.2.10/node_modules/@floating-ui/utils/dist/floating-ui.utils.js +31 -0
- 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
- 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
- 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
- package/out/renderer/node_modules/.pnpm/memoize-one@6.0.0/node_modules/memoize-one/dist/memoize-one.esm.js +38 -0
- package/out/renderer/node_modules/.pnpm/memoize-one@6.0.0/node_modules/memoize-one/dist/memoize-one.esm.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/react-is@16.13.1/node_modules/react-is/cjs/react-is.development.js +159 -0
- package/out/renderer/node_modules/.pnpm/react-is@16.13.1/node_modules/react-is/cjs/react-is.development.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/react-is@16.13.1/node_modules/react-is/cjs/react-is.production.min.js +103 -0
- package/out/renderer/node_modules/.pnpm/react-is@16.13.1/node_modules/react-is/cjs/react-is.production.min.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/react-is@16.13.1/node_modules/react-is/index.js +18 -0
- package/out/renderer/node_modules/.pnpm/react-is@16.13.1/node_modules/react-is/index.js.map +1 -0
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Enum.js +22 -0
- package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Enum.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Middleware.js +30 -0
- package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Middleware.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Parser.js +164 -0
- package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Parser.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Serializer.js +37 -0
- package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Serializer.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Tokenizer.js +245 -0
- package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Tokenizer.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Utility.js +120 -0
- package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Utility.js.map +1 -0
- 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
- 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
- package/out/renderer/pod-monitoring.js +38 -11
- package/out/renderer/pod-monitoring.js.map +1 -1
- package/out/renderer/preferences/ai-shortcuts-preferences.js +12 -4
- package/out/renderer/preferences/ai-shortcuts-preferences.js.map +1 -1
- package/out/renderer/preferences/dashboard-preferences.js +20 -4
- package/out/renderer/preferences/dashboard-preferences.js.map +1 -1
- package/out/renderer/preferences/monitoring-preferences.js +141 -9
- package/out/renderer/preferences/monitoring-preferences.js.map +1 -1
- package/out/renderer/preferences/preferences.js +31 -7
- package/out/renderer/preferences/preferences.js.map +1 -1
- package/out/renderer/read-only.js +2 -2
- package/out/renderer/read-only.js.map +1 -1
- package/out/renderer/src/common/ai-terminal-context.js +51 -0
- package/out/renderer/src/common/ai-terminal-context.js.map +1 -0
- package/out/renderer/src/common/ai.js.map +1 -1
- package/out/renderer/src/common/cluster-icon-ipc.js +6 -0
- package/out/renderer/src/common/cluster-icon-ipc.js.map +1 -0
- package/out/renderer/src/common/cluster-icons.js +133 -0
- package/out/renderer/src/common/cluster-icons.js.map +1 -0
- package/out/renderer/src/common/dashboard.js +1 -1
- package/out/renderer/src/common/dashboard.js.map +1 -1
- package/out/renderer/src/common/date-time.js +11 -0
- package/out/renderer/src/common/date-time.js.map +1 -0
- package/out/renderer/src/common/monitoring-history.js +17 -0
- package/out/renderer/src/common/monitoring-history.js.map +1 -0
- package/out/renderer/src/common/monitoring-math.js +98 -0
- package/out/renderer/src/common/monitoring-math.js.map +1 -0
- package/out/renderer/src/common/resource-diagnostics.js +227 -0
- package/out/renderer/src/common/resource-diagnostics.js.map +1 -0
- package/out/renderer/src/common/settings-export.js.map +1 -1
- package/out/renderer/src/common/store/monitoring-preferences-store.js +30 -2
- package/out/renderer/src/common/store/monitoring-preferences-store.js.map +1 -1
- package/out/renderer/welcome.js +31 -7
- package/out/renderer/welcome.js.map +1 -1
- package/package.json +3 -2
|
@@ -0,0 +1 @@
|
|
|
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":"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"}
|
package/out/renderer/index.js
CHANGED
|
@@ -18,10 +18,15 @@ 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");
|
|
24
|
+
const require_monitoring_collector = require("./monitoring-collector.js");
|
|
25
|
+
const require_diagnostics = require("./diagnostics.js");
|
|
23
26
|
const require_secure_node_shell_menu = require("./menus/secure-node-shell-menu.js");
|
|
24
27
|
const require_monitoring = require("./monitoring.js");
|
|
28
|
+
const require_monitoring_history_collection = require("./monitoring-history-collection.js");
|
|
29
|
+
const require_node_monitoring = require("./node-monitoring.js");
|
|
25
30
|
const require_pod_monitoring = require("./pod-monitoring.js");
|
|
26
31
|
const require_preferences = require("./preferences/preferences.js");
|
|
27
32
|
const require_read_only = require("./read-only.js");
|
|
@@ -60,6 +65,8 @@ var FreelensPowerRenderer = class extends require_extensions.Renderer.LensExtens
|
|
|
60
65
|
disposers = [];
|
|
61
66
|
if (enabled) for (const start of [
|
|
62
67
|
require_read_only.startReadOnlyMode,
|
|
68
|
+
require_monitoring_collector.startMonitoringCollector,
|
|
69
|
+
require_monitoring_history_collection.startMonitoringHistoryCollection,
|
|
63
70
|
require_monitoring.startMonitoring,
|
|
64
71
|
require_pod_monitoring.startPodMonitoring,
|
|
65
72
|
require_button_styles.startPowerButtonStyles,
|
|
@@ -91,9 +98,26 @@ var FreelensPowerRenderer = class extends require_extensions.Renderer.LensExtens
|
|
|
91
98
|
}
|
|
92
99
|
}];
|
|
93
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
|
+
}, {
|
|
94
104
|
id: "dashboard",
|
|
95
105
|
components: { Page: () => /* @__PURE__ */ require_jsx_runtime.jsx(PowerEnabled, { children: /* @__PURE__ */ require_jsx_runtime.jsx(require_dashboard.DashboardPage, { onOpenPreferences: () => this.navigateToPreferences() }) }) }
|
|
96
106
|
}];
|
|
107
|
+
clusterPages = [{
|
|
108
|
+
id: "diagnostics",
|
|
109
|
+
components: { Page: () => /* @__PURE__ */ require_jsx_runtime.jsx(PowerEnabled, { children: /* @__PURE__ */ require_jsx_runtime.jsx(require_diagnostics.DiagnosticsPage, {}) }) }
|
|
110
|
+
}];
|
|
111
|
+
clusterPageMenus = [{
|
|
112
|
+
visible: require__global_external_mobx.computed(() => require_power_preferences_store.PowerPreferencesStore.getInstanceOrCreate().enabled && require_monitoring_preferences_store.MonitoringPreferencesStore.getInstanceOrCreate().diagnosticsVisible),
|
|
113
|
+
target: { pageId: "diagnostics" },
|
|
114
|
+
title: "Diagnostics",
|
|
115
|
+
orderNumber: 5,
|
|
116
|
+
components: { Icon: () => /* @__PURE__ */ require_jsx_runtime.jsx(require_extensions.Renderer.Component.Icon, {
|
|
117
|
+
material: "insights",
|
|
118
|
+
tooltip: "Resource diagnostics"
|
|
119
|
+
}) }
|
|
120
|
+
}];
|
|
97
121
|
topBarItems = [{ components: { Item: () => /* @__PURE__ */ require_jsx_runtime.jsx(PowerEnabled, { children: /* @__PURE__ */ require_jsx_runtime.jsx(require_extensions.Renderer.Component.Icon, {
|
|
98
122
|
material: "battery_charging_full",
|
|
99
123
|
className: "freelens-power-settings-icon",
|
|
@@ -101,6 +125,14 @@ var FreelensPowerRenderer = class extends require_extensions.Renderer.LensExtens
|
|
|
101
125
|
onClick: () => this.navigateToPreferences()
|
|
102
126
|
}) }) } }];
|
|
103
127
|
kubeObjectDetailItems = [{
|
|
128
|
+
kind: "Node",
|
|
129
|
+
apiVersions: ["v1"],
|
|
130
|
+
priority: 310,
|
|
131
|
+
components: { Details: (props) => /* @__PURE__ */ require_jsx_runtime.jsx(PowerEnabled, { children: /* @__PURE__ */ require_jsx_runtime.jsx(require_node_monitoring.NodeMonitoringDetails, {
|
|
132
|
+
...props,
|
|
133
|
+
object: props.object
|
|
134
|
+
}) }) }
|
|
135
|
+
}, {
|
|
104
136
|
kind: "Secret",
|
|
105
137
|
apiVersions: ["v1"],
|
|
106
138
|
priority: 10,
|
|
@@ -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 { 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 { SecureNodeShellMenu } from \"./menus/secure-node-shell-menu\";\nimport { startMonitoring } from \"./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 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 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: \"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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCA,IAAM,eAAe,oCAAA,UAAU,EAAE,eAC/B,gCAAA,sBAAsB,oBAA2C,CAAC,CAAC,UAAU,oCAAA,IAAA,oBAAA,UAAA,EAAG,SAAW,CAAA,IAAI,IACjG;AAEA,IAAqB,wBAArB,cAAmD,mBAAA,SAAS,cAAc;CACxE,IAAI,OAAO;EACT,OAAO,uBAAA;CACT;CACA,IAAI,uBAAuB;EACzB,OAAO,uBAAA;CACT;CACA,IAAI,YAAY;EACd,OAAO,KAAK,SAAS,aAAA;CACvB;CAEA;CAEA,aAAa;EACX,MAAM,QAAQ,gCAAA,sBAAsB,oBAA2C;EAC/E,MAAM,cAAc,IAAI;EACxB,6BAAA,mBAAmB,oBAAoB,CAAC,CAAC,cAAc,IAAI;EAC3D,2BAAA,iBAAiB,oBAAoB,CAAC,CAAC,cAAc,IAAI;EACzD,oCAAA,yBAAyB,oBAAoB,CAAC,CAAC,cAAc,IAAI;EACjE,qCAAA,0BAA0B,oBAAoB,CAAC,CAAC,cAAc,IAAI;EAClE,qCAAA,2BAA2B,oBAAoB,CAAC,CAAC,cAAc,IAAI;EACnE,qCAAA,2BAA2B,oBAAoB,CAAC,CAAC,cAAc,IAAI;EACnE,oCAAA,0BAA0B,oBAAoB,CAAC,CAAC,cAAc,IAAI;EAClE,KAAK,eAAe;EACpB,IAAI,YAA4B,CAAC;EACjC,MAAM,OAAO,8BAAA,eACL,MAAM,UACX,YAAY;GACX,KAAK,MAAM,WAAW,WAAW,QAAQ;GACzC,YAAY,CAAC;GACb,IAAI,SACF,KAAK,MAAM,SAAS;IAClB,kBAAA;IACA,6BAAA;IACA,sCAAA;IACA,mBAAA;IACA,uBAAA;IACA,sBAAA;IACA,mBAAA;IACA,gBAAA;IACA,WAAA;GACF,GACE,IAAI;IACF,UAAU,KAAK,MAAM,CAAC;GACxB,QAAQ;IACN,mBAAA,OAAO,OAAO,KAAK,4CAA4C,EAAE,SAAS,MAAM,KAAK,CAAC;GACxF;EAGN,GACA,EAAE,iBAAiB,KAAK,CAC1B;EACA,KAAK,qBAAqB;GACxB,KAAK;GACL,KAAK,MAAM,WAAW,WAAW,QAAQ;GACzC,YAAY,CAAC;EACf;CACF;CAEA,eAAe;EACb,KAAK,eAAe;EACpB,KAAK,eAAe,KAAA;CACtB;CAEA,iBAAiB,CACf;EACE,IAAI;EACJ,OAAO;EACP,YAAY;GAAE,OAAO,oBAAA;GAAkB,YAAY;EAAK;CAC1D,CACF;CAEA,cAAc,CACZ;EACE,IAAI;EACJ,YAAY,EACV,YACE,oCAAA,IAAC,cAAD,EAAA,UACE,oCAAA,IAAC,sBAAA,kBAAD,CAAmB,CAAA,EACP,CAAA,EAElB;CACF,GACA;EACE,IAAI;EACJ,YAAY,EACV,YACE,oCAAA,IAAC,cAAD,EAAA,UACE,oCAAA,IAAC,kBAAA,eAAD,EAAe,yBAAyB,KAAK,sBAAsB,EAAI,CAAA,EAC3D,CAAA,EAElB;CACF,CACF;CAEA,eAAe,CACb;EACE,IAAI;EACJ,YAAY,EACV,YACE,oCAAA,IAAC,cAAD,EAAA,UACE,oCAAA,IAAC,oBAAA,iBAAD,CAAkB,CAAA,EACN,CAAA,EAElB;CACF,CACF;CAEA,mBAAmB,CACjB;EACE,SAAS,8BAAA,eAEL,gCAAA,sBAAsB,oBAA2C,CAAC,CAAC,WACnE,qCAAA,2BAA2B,oBAAgD,CAAC,CAAC,kBACjF;EACA,QAAQ,EAAE,QAAQ,cAAc;EAChC,OAAO;EACP,aAAa;EACb,YAAY,EAAE,YAAY,oCAAA,IAAC,mBAAA,SAAS,UAAU,MAApB;GAAyB,UAAS;GAAW,SAAQ;EAAwB,CAAA,EAAE;CAC3G,CACF;CAEA,cAAc,CACZ,EACE,YAAY,EACV,YACE,oCAAA,IAAC,cAAD,EAAA,UACE,oCAAA,IAAC,mBAAA,SAAS,UAAU,MAApB;EACE,UAAS;EACT,WAAU;EACV,SAAQ;EACR,eAAe,KAAK,sBAAsB;CAC3C,CAAA,EACW,CAAA,EAElB,EACF,CACF;CAEA,wBAAyE,CACvE;EACE,MAAM;EACN,aAAa,CAAC,IAAI;EAElB,UAAU;EACV,YAAY,EACV,UAAU,UACR,oCAAA,IAAC,cAAD,EAAA,UACE,oCAAA,IAAC,wBAAA,uBAAD;GAAuB,GAAI;GAAO,QAAQ,MAAM;EAAiC,CAAA,EACrE,CAAA,EAElB;CACF,GACA;EACE,MAAM;EACN,aAAa,CAAC,IAAI;EAClB,UAAU;EACV,YAAY,EACV,UAAU,UACR,oCAAA,IAAC,cAAD,EAAA,UACE,oCAAA,IAAC,mCAAA,0BAAD;GAA0B,GAAI;GAAO,QAAQ,MAAM;EAAmC,CAAA,EAC1E,CAAA,EAElB;CACF,CACF;CAEA,sBAAsB,CACpB;EACE,MAAM;EACN,aAAa,CAAC,IAAI;EAClB,YAAY,EACV,WAAW,UACT,oCAAA,IAAC,cAAD,EAAA,UACE,oCAAA,IAAC,+BAAA,qBAAD,EAAqB,GAAI,MAAQ,CAAA,EACrB,CAAA,EAElB;CACF,CACF;AACF"}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
const require_extensions = require("./_virtual/_global-external_@freelensapp/extensions.js");
|
|
2
|
+
const require__global_external_mobx = require("./_virtual/_global-external_mobx.js");
|
|
3
|
+
const require_monitoring_preferences_store = require("./src/common/store/monitoring-preferences-store.js");
|
|
4
|
+
const require_monitoring_math = require("./src/common/monitoring-math.js");
|
|
5
|
+
//#region src/renderer/monitoring-collector.ts
|
|
6
|
+
var snapshot;
|
|
7
|
+
var pending;
|
|
8
|
+
var extraPending;
|
|
9
|
+
var extraTime = 0;
|
|
10
|
+
var epoch = 0;
|
|
11
|
+
var collectingCluster;
|
|
12
|
+
var retained = 0;
|
|
13
|
+
var listeners = /* @__PURE__ */ new Set();
|
|
14
|
+
function resetMonitoringCollector() {
|
|
15
|
+
epoch++;
|
|
16
|
+
snapshot = void 0;
|
|
17
|
+
pending = void 0;
|
|
18
|
+
extraPending = void 0;
|
|
19
|
+
extraTime = 0;
|
|
20
|
+
collectingCluster = void 0;
|
|
21
|
+
}
|
|
22
|
+
function retainMonitoringCollector() {
|
|
23
|
+
retained++;
|
|
24
|
+
let released = false;
|
|
25
|
+
return () => {
|
|
26
|
+
if (released) return;
|
|
27
|
+
released = true;
|
|
28
|
+
if (--retained === 0) resetMonitoringCollector();
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
function onMonitoringSnapshot(listener) {
|
|
32
|
+
listeners.add(listener);
|
|
33
|
+
return () => listeners.delete(listener);
|
|
34
|
+
}
|
|
35
|
+
async function getMonitoringSnapshot(diagnostics = false) {
|
|
36
|
+
const clusterId = require_extensions.Renderer.Catalog.activeCluster.get()?.metadata.uid;
|
|
37
|
+
if (!clusterId) throw new Error("Select a connected cluster");
|
|
38
|
+
if ((snapshot?.clusterId ?? collectingCluster) && (snapshot?.clusterId ?? collectingCluster) !== clusterId) resetMonitoringCollector();
|
|
39
|
+
collectingCluster = clusterId;
|
|
40
|
+
if (!snapshot || Date.now() - snapshot.time >= 3e4) {
|
|
41
|
+
if (!pending) {
|
|
42
|
+
const current = epoch;
|
|
43
|
+
pending = (async () => {
|
|
44
|
+
const results = await Promise.allSettled([
|
|
45
|
+
Promise.resolve().then(() => require_extensions.Renderer.K8sApi.nodesMetricsApi.list()),
|
|
46
|
+
Promise.resolve().then(() => require_extensions.Renderer.K8sApi.nodesApi.list()),
|
|
47
|
+
Promise.resolve().then(() => require_extensions.Renderer.K8sApi.podsApi.list()),
|
|
48
|
+
Promise.resolve().then(() => require_extensions.Renderer.K8sApi.podsMetricsApi.list())
|
|
49
|
+
]);
|
|
50
|
+
if (current !== epoch || require_extensions.Renderer.Catalog.activeCluster.get()?.metadata.uid !== clusterId) throw new Error("Cluster changed during collection");
|
|
51
|
+
const [metrics, nodes, pods, podMetrics] = results;
|
|
52
|
+
const next = {
|
|
53
|
+
owners: snapshot?.owners,
|
|
54
|
+
events: snapshot?.events,
|
|
55
|
+
pvcs: snapshot?.pvcs,
|
|
56
|
+
diagnosticsTime: snapshot?.diagnosticsTime,
|
|
57
|
+
clusterId,
|
|
58
|
+
time: Date.now(),
|
|
59
|
+
nodeMetrics: metrics.status === "fulfilled" ? metrics.value ?? void 0 : void 0,
|
|
60
|
+
nodes: nodes.status === "fulfilled" ? nodes.value ?? void 0 : void 0,
|
|
61
|
+
pods: pods.status === "fulfilled" ? pods.value ?? void 0 : void 0,
|
|
62
|
+
podMetrics: podMetrics.status === "fulfilled" ? podMetrics.value ?? void 0 : void 0,
|
|
63
|
+
errors: results.flatMap((result, i) => result.status === "rejected" || result.value === null ? [`${[
|
|
64
|
+
"Node metrics",
|
|
65
|
+
"Nodes",
|
|
66
|
+
"Pods",
|
|
67
|
+
"Pod metrics"
|
|
68
|
+
][i]} unavailable or access denied`] : [])
|
|
69
|
+
};
|
|
70
|
+
snapshot = next;
|
|
71
|
+
for (const listener of listeners) listener(next);
|
|
72
|
+
return next;
|
|
73
|
+
})().finally(() => {
|
|
74
|
+
if (current === epoch) pending = void 0;
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
await pending;
|
|
78
|
+
}
|
|
79
|
+
if (!snapshot || snapshot.clusterId !== clusterId) throw new Error("Cluster changed during collection");
|
|
80
|
+
if (diagnostics && (!extraTime || Date.now() - extraTime >= 3e4)) {
|
|
81
|
+
if (!extraPending) {
|
|
82
|
+
const current = epoch;
|
|
83
|
+
const base = snapshot;
|
|
84
|
+
extraPending = (async () => {
|
|
85
|
+
const apis = [
|
|
86
|
+
require_extensions.Renderer.K8sApi.replicaSetApi,
|
|
87
|
+
require_extensions.Renderer.K8sApi.deploymentApi,
|
|
88
|
+
require_extensions.Renderer.K8sApi.statefulSetApi,
|
|
89
|
+
require_extensions.Renderer.K8sApi.daemonSetApi,
|
|
90
|
+
require_extensions.Renderer.K8sApi.jobApi,
|
|
91
|
+
require_extensions.Renderer.K8sApi.cronJobApi
|
|
92
|
+
];
|
|
93
|
+
const results = await Promise.allSettled([
|
|
94
|
+
...apis.map((api) => Promise.resolve().then(() => api.list())),
|
|
95
|
+
Promise.resolve().then(() => require_extensions.Renderer.K8sApi.eventApi.list()),
|
|
96
|
+
Promise.resolve().then(() => require_extensions.Renderer.K8sApi.pvcApi.list())
|
|
97
|
+
]);
|
|
98
|
+
if (current !== epoch || require_extensions.Renderer.Catalog.activeCluster.get()?.metadata.uid !== clusterId) throw new Error("Cluster changed during collection");
|
|
99
|
+
const owners = results.slice(0, apis.length).flatMap((result) => result.status === "fulfilled" ? result.value ?? [] : []);
|
|
100
|
+
const events = results[apis.length];
|
|
101
|
+
const pvcs = results[apis.length + 1];
|
|
102
|
+
snapshot = {
|
|
103
|
+
...snapshot ?? base,
|
|
104
|
+
diagnosticsTime: Date.now(),
|
|
105
|
+
owners,
|
|
106
|
+
events: events.status === "fulfilled" ? events.value : void 0,
|
|
107
|
+
pvcs: pvcs.status === "fulfilled" ? pvcs.value : void 0,
|
|
108
|
+
errors: [...(snapshot ?? base).errors, ...results.flatMap((result, index) => result.status === "rejected" ? [`${[
|
|
109
|
+
"ReplicaSets",
|
|
110
|
+
"Deployments",
|
|
111
|
+
"StatefulSets",
|
|
112
|
+
"DaemonSets",
|
|
113
|
+
"Jobs",
|
|
114
|
+
"CronJobs",
|
|
115
|
+
"Events",
|
|
116
|
+
"PVCs"
|
|
117
|
+
][index]} unavailable or access denied`] : [])]
|
|
118
|
+
};
|
|
119
|
+
extraTime = Date.now();
|
|
120
|
+
for (const listener of listeners) listener(snapshot);
|
|
121
|
+
return snapshot;
|
|
122
|
+
})().finally(() => {
|
|
123
|
+
if (current === epoch) extraPending = void 0;
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
await extraPending;
|
|
127
|
+
}
|
|
128
|
+
if (!snapshot || require_extensions.Renderer.Catalog.activeCluster.get()?.metadata.uid !== clusterId) throw new Error("Cluster changed during collection");
|
|
129
|
+
return snapshot;
|
|
130
|
+
}
|
|
131
|
+
function getNodeSample(data, name, uid) {
|
|
132
|
+
const node = data.nodes?.find((item) => item.metadata.name === name && (!uid || item.metadata.uid === uid));
|
|
133
|
+
const metric = data.nodeMetrics?.filter((item) => item.metadata.name === name);
|
|
134
|
+
if (!node || metric?.length !== 1) return;
|
|
135
|
+
if (metric[0].metadata.uid && node.metadata.uid && metric[0].metadata.uid !== node.metadata.uid) return;
|
|
136
|
+
const sample = require_monitoring_math.aggregateMetrics(metric);
|
|
137
|
+
sample.time = Date.parse(metric[0].timestamp);
|
|
138
|
+
const created = Date.parse(node.metadata.creationTimestamp ?? "");
|
|
139
|
+
if (Number.isFinite(created) && sample.time < created) return;
|
|
140
|
+
try {
|
|
141
|
+
sample.resources = require_monitoring_math.aggregateResources([node], data.pods);
|
|
142
|
+
} catch {
|
|
143
|
+
sample.resourceStatus = "Resource totals unavailable: incomplete node/pod data";
|
|
144
|
+
}
|
|
145
|
+
if (!data.pods) sample.resourceStatus = "Pod inventory unavailable; requests unavailable";
|
|
146
|
+
return sample;
|
|
147
|
+
}
|
|
148
|
+
function getCollectedPodUsage(data) {
|
|
149
|
+
const index = /* @__PURE__ */ new Map();
|
|
150
|
+
for (const metric of data.podMetrics ?? []) {
|
|
151
|
+
const key = `${metric.metadata.namespace}/${metric.metadata.name}`;
|
|
152
|
+
index.set(key, index.has(key) ? void 0 : metric);
|
|
153
|
+
}
|
|
154
|
+
return (data.pods ?? []).flatMap((pod) => {
|
|
155
|
+
if (!pod.metadata.uid) return [];
|
|
156
|
+
const metric = index.get(`${pod.metadata.namespace}/${pod.metadata.name}`);
|
|
157
|
+
if (!metric) return [];
|
|
158
|
+
if (metric.metadata.uid && metric.metadata.uid !== pod.metadata.uid) return [];
|
|
159
|
+
const time = Date.parse(metric.timestamp);
|
|
160
|
+
const created = Date.parse(pod.metadata.creationTimestamp ?? "");
|
|
161
|
+
if (!Number.isFinite(time) || time < Date.now() - 12e4 || time > Date.now() + 3e4 || Number.isFinite(created) && time < created) return [];
|
|
162
|
+
try {
|
|
163
|
+
if (!metric.containers.length || new Set(metric.containers.map((container) => container.name)).size !== metric.containers.length) return [];
|
|
164
|
+
const sample = require_monitoring_math.aggregateMetrics(metric.containers.map((container) => ({
|
|
165
|
+
...container,
|
|
166
|
+
timestamp: metric.timestamp
|
|
167
|
+
})));
|
|
168
|
+
return [{
|
|
169
|
+
uid: pod.metadata.uid,
|
|
170
|
+
cpu: sample.cpu,
|
|
171
|
+
memory: sample.memory
|
|
172
|
+
}];
|
|
173
|
+
} catch {
|
|
174
|
+
return [];
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
function startMonitoringCollector() {
|
|
179
|
+
const retain = retainMonitoringCollector();
|
|
180
|
+
const preferences = require_monitoring_preferences_store.MonitoringPreferencesStore.getInstanceOrCreate();
|
|
181
|
+
const stop = require__global_external_mobx.reaction(() => preferences.enabled, () => resetMonitoringCollector());
|
|
182
|
+
const collect = () => {
|
|
183
|
+
if (preferences.enabled && document.visibilityState !== "hidden" && require_extensions.Renderer.Catalog.activeCluster.get()) getMonitoringSnapshot(preferences.historyEnabled && preferences.trackedHistory.some((item) => item.scope === "workload")).catch(() => {});
|
|
184
|
+
};
|
|
185
|
+
const timer = window.setInterval(collect, 1e3);
|
|
186
|
+
collect();
|
|
187
|
+
return () => {
|
|
188
|
+
window.clearInterval(timer);
|
|
189
|
+
stop();
|
|
190
|
+
retain();
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
//#endregion
|
|
194
|
+
exports.getCollectedPodUsage = getCollectedPodUsage;
|
|
195
|
+
exports.getMonitoringSnapshot = getMonitoringSnapshot;
|
|
196
|
+
exports.getNodeSample = getNodeSample;
|
|
197
|
+
exports.onMonitoringSnapshot = onMonitoringSnapshot;
|
|
198
|
+
exports.resetMonitoringCollector = resetMonitoringCollector;
|
|
199
|
+
exports.retainMonitoringCollector = retainMonitoringCollector;
|
|
200
|
+
exports.startMonitoringCollector = startMonitoringCollector;
|
|
201
|
+
|
|
202
|
+
//# sourceMappingURL=monitoring-collector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"monitoring-collector.js","names":[],"sources":["../../src/renderer/monitoring-collector.ts"],"sourcesContent":["import { Renderer } from \"@freelensapp/extensions\";\nimport { reaction } from \"mobx\";\nimport {\n aggregateMetrics,\n aggregateResources,\n MONITORING_INTERVAL,\n type MonitoringSample,\n} from \"../common/monitoring-math\";\nimport { MonitoringPreferencesStore } from \"../common/store/monitoring-preferences-store\";\n\nimport type { DiagnosticsEvent, DiagnosticsObject, PodUsage } from \"../common/resource-diagnostics\";\n\ntype NodeMetric = NonNullable<Awaited<ReturnType<typeof Renderer.K8sApi.nodesMetricsApi.list>>>[number];\ntype PodMetric = NonNullable<Awaited<ReturnType<typeof Renderer.K8sApi.podsMetricsApi.list>>>[number];\nexport interface MonitoringSnapshot {\n clusterId: string;\n time: number;\n diagnosticsTime?: number;\n nodes?: Renderer.K8sApi.Node[];\n pods?: Renderer.K8sApi.Pod[];\n nodeMetrics?: NodeMetric[];\n podMetrics?: PodMetric[];\n owners?: DiagnosticsObject[];\n events?: DiagnosticsEvent[];\n pvcs?: DiagnosticsObject[];\n errors: string[];\n}\n\nlet snapshot: MonitoringSnapshot | undefined;\nlet pending: Promise<MonitoringSnapshot> | undefined;\nlet extraPending: Promise<MonitoringSnapshot> | undefined;\nlet extraTime = 0;\nlet epoch = 0;\nlet collectingCluster: string | undefined;\nlet retained = 0;\nconst listeners = new Set<(snapshot: MonitoringSnapshot) => void>();\n\nexport function resetMonitoringCollector(): void {\n epoch++;\n snapshot = undefined;\n pending = undefined;\n extraPending = undefined;\n extraTime = 0;\n collectingCluster = undefined;\n}\n\nexport function retainMonitoringCollector(): () => void {\n retained++;\n let released = false;\n return () => {\n if (released) return;\n released = true;\n if (--retained === 0) resetMonitoringCollector();\n };\n}\n\nexport function onMonitoringSnapshot(listener: (snapshot: MonitoringSnapshot) => void): () => void {\n listeners.add(listener);\n return () => listeners.delete(listener);\n}\n\n// one snapshot is shared by all views in this cluster renderer\nexport async function getMonitoringSnapshot(diagnostics = false): Promise<MonitoringSnapshot> {\n const clusterId = Renderer.Catalog.activeCluster.get()?.metadata.uid;\n if (!clusterId) throw new Error(\"Select a connected cluster\");\n if ((snapshot?.clusterId ?? collectingCluster) && (snapshot?.clusterId ?? collectingCluster) !== clusterId)\n resetMonitoringCollector();\n collectingCluster = clusterId;\n if (!snapshot || Date.now() - snapshot.time >= MONITORING_INTERVAL) {\n if (!pending) {\n const current = epoch;\n pending = (async () => {\n const results = await Promise.allSettled([\n Promise.resolve().then(() => Renderer.K8sApi.nodesMetricsApi.list()),\n Promise.resolve().then(() => Renderer.K8sApi.nodesApi.list()),\n Promise.resolve().then(() => Renderer.K8sApi.podsApi.list()),\n Promise.resolve().then(() => Renderer.K8sApi.podsMetricsApi.list()),\n ]);\n if (current !== epoch || Renderer.Catalog.activeCluster.get()?.metadata.uid !== clusterId)\n throw new Error(\"Cluster changed during collection\");\n const [metrics, nodes, pods, podMetrics] = results;\n const next: MonitoringSnapshot = {\n owners: snapshot?.owners,\n events: snapshot?.events,\n pvcs: snapshot?.pvcs,\n diagnosticsTime: snapshot?.diagnosticsTime,\n clusterId,\n time: Date.now(),\n nodeMetrics: metrics.status === \"fulfilled\" ? (metrics.value ?? undefined) : undefined,\n nodes: nodes.status === \"fulfilled\" ? (nodes.value ?? undefined) : undefined,\n pods: pods.status === \"fulfilled\" ? (pods.value ?? undefined) : undefined,\n podMetrics: podMetrics.status === \"fulfilled\" ? (podMetrics.value ?? undefined) : undefined,\n errors: results.flatMap((result, i) =>\n result.status === \"rejected\" || result.value === null\n ? [`${[\"Node metrics\", \"Nodes\", \"Pods\", \"Pod metrics\"][i]} unavailable or access denied`]\n : [],\n ),\n };\n snapshot = next;\n for (const listener of listeners) listener(next);\n return next;\n })().finally(() => {\n if (current === epoch) pending = undefined;\n });\n }\n await pending;\n }\n if (!snapshot || snapshot.clusterId !== clusterId) throw new Error(\"Cluster changed during collection\");\n if (diagnostics && (!extraTime || Date.now() - extraTime >= MONITORING_INTERVAL)) {\n if (!extraPending) {\n const current = epoch;\n const base = snapshot;\n extraPending = (async () => {\n const apis = [\n Renderer.K8sApi.replicaSetApi,\n Renderer.K8sApi.deploymentApi,\n Renderer.K8sApi.statefulSetApi,\n Renderer.K8sApi.daemonSetApi,\n Renderer.K8sApi.jobApi,\n Renderer.K8sApi.cronJobApi,\n ];\n const results = await Promise.allSettled([\n ...apis.map((api) =>\n Promise.resolve().then<DiagnosticsObject[] | null>(() => api.list() as Promise<DiagnosticsObject[] | null>),\n ),\n Promise.resolve().then(() => Renderer.K8sApi.eventApi.list()),\n Promise.resolve().then(() => Renderer.K8sApi.pvcApi.list()),\n ]);\n if (current !== epoch || Renderer.Catalog.activeCluster.get()?.metadata.uid !== clusterId)\n throw new Error(\"Cluster changed during collection\");\n const owners = results\n .slice(0, apis.length)\n .flatMap((result) =>\n result.status === \"fulfilled\" ? ((result.value ?? []) as DiagnosticsObject[]) : [],\n ) as DiagnosticsObject[];\n const events = results[apis.length];\n const pvcs = results[apis.length + 1];\n snapshot = {\n ...(snapshot ?? base),\n diagnosticsTime: Date.now(),\n owners,\n events: events.status === \"fulfilled\" ? (events.value as DiagnosticsEvent[]) : undefined,\n pvcs: pvcs.status === \"fulfilled\" ? (pvcs.value as DiagnosticsObject[]) : undefined,\n errors: [\n ...(snapshot ?? base).errors,\n ...results.flatMap((result, index) =>\n result.status === \"rejected\"\n ? [\n `${[\"ReplicaSets\", \"Deployments\", \"StatefulSets\", \"DaemonSets\", \"Jobs\", \"CronJobs\", \"Events\", \"PVCs\"][index]} unavailable or access denied`,\n ]\n : [],\n ),\n ],\n };\n extraTime = Date.now();\n for (const listener of listeners) listener(snapshot);\n return snapshot;\n })().finally(() => {\n if (current === epoch) extraPending = undefined;\n });\n }\n await extraPending;\n }\n if (!snapshot || Renderer.Catalog.activeCluster.get()?.metadata.uid !== clusterId)\n throw new Error(\"Cluster changed during collection\");\n return snapshot;\n}\n\nexport function getNodeSample(data: MonitoringSnapshot, name: string, uid?: string): MonitoringSample | undefined {\n const node = data.nodes?.find((item) => item.metadata.name === name && (!uid || item.metadata.uid === uid));\n const metric = data.nodeMetrics?.filter((item) => item.metadata.name === name);\n if (!node || metric?.length !== 1) return;\n if (metric[0].metadata.uid && node.metadata.uid && metric[0].metadata.uid !== node.metadata.uid) return;\n const sample = aggregateMetrics(metric);\n sample.time = Date.parse(metric[0].timestamp);\n const created = Date.parse(node.metadata.creationTimestamp ?? \"\");\n if (Number.isFinite(created) && sample.time < created) return;\n try {\n sample.resources = aggregateResources([node], data.pods);\n } catch {\n sample.resourceStatus = \"Resource totals unavailable: incomplete node/pod data\";\n }\n if (!data.pods) sample.resourceStatus = \"Pod inventory unavailable; requests unavailable\";\n return sample;\n}\n\nexport function getCollectedPodUsage(data: MonitoringSnapshot): PodUsage[] {\n const index = new Map<string, PodMetric | undefined>();\n for (const metric of data.podMetrics ?? []) {\n const key = `${metric.metadata.namespace}/${metric.metadata.name}`;\n index.set(key, index.has(key) ? undefined : metric);\n }\n return (data.pods ?? []).flatMap((pod) => {\n if (!pod.metadata.uid) return [];\n const metric = index.get(`${pod.metadata.namespace}/${pod.metadata.name}`);\n if (!metric) return [];\n if (metric.metadata.uid && metric.metadata.uid !== pod.metadata.uid) return [];\n const time = Date.parse(metric.timestamp);\n const created = Date.parse(pod.metadata.creationTimestamp ?? \"\");\n if (\n !Number.isFinite(time) ||\n time < Date.now() - 120_000 ||\n time > Date.now() + 30_000 ||\n (Number.isFinite(created) && time < created)\n )\n return [];\n try {\n if (\n !metric.containers.length ||\n new Set(metric.containers.map((container) => container.name)).size !== metric.containers.length\n )\n return [];\n const sample = aggregateMetrics(\n metric.containers.map((container) => ({ ...container, timestamp: metric.timestamp })),\n );\n return [{ uid: pod.metadata.uid, cpu: sample.cpu, memory: sample.memory }];\n } catch {\n return [];\n }\n });\n}\n\nexport function startMonitoringCollector(): () => void {\n const retain = retainMonitoringCollector();\n const preferences = MonitoringPreferencesStore.getInstanceOrCreate<MonitoringPreferencesStore>();\n const stop = reaction(\n () => preferences.enabled,\n () => resetMonitoringCollector(),\n );\n const collect = () => {\n if (preferences.enabled && document.visibilityState !== \"hidden\" && Renderer.Catalog.activeCluster.get())\n void getMonitoringSnapshot(\n preferences.historyEnabled && preferences.trackedHistory.some((item) => item.scope === \"workload\"),\n ).catch(() => {});\n };\n const timer = window.setInterval(collect, 1000);\n collect();\n return () => {\n window.clearInterval(timer);\n stop();\n retain();\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"}
|