@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,168 @@
|
|
|
1
|
+
const require_extensions = require("./_virtual/_global-external_@freelensapp/extensions.js");
|
|
2
|
+
const require_monitoring_preferences_store = require("./src/common/store/monitoring-preferences-store.js");
|
|
3
|
+
const require_monitoring_math = require("./src/common/monitoring-math.js");
|
|
4
|
+
const require_resource_diagnostics = require("./src/common/resource-diagnostics.js");
|
|
5
|
+
const require_monitoring_collector = require("./monitoring-collector.js");
|
|
6
|
+
const require_monitoring_history = require("./monitoring-history.js");
|
|
7
|
+
//#region src/renderer/monitoring-history-collection.ts
|
|
8
|
+
function numeric(sample) {
|
|
9
|
+
const values = {
|
|
10
|
+
cpu: sample.cpu,
|
|
11
|
+
memory: sample.memory
|
|
12
|
+
};
|
|
13
|
+
for (const metric of ["cpu", "memory"]) for (const field of [
|
|
14
|
+
"requests",
|
|
15
|
+
"limits",
|
|
16
|
+
"capacity",
|
|
17
|
+
"allocatable"
|
|
18
|
+
]) {
|
|
19
|
+
const value = sample.resources?.[metric]?.[field];
|
|
20
|
+
if (value !== void 0 && Number.isFinite(value)) values[`${metric}${field[0].toUpperCase()}${field.slice(1)}`] = value;
|
|
21
|
+
}
|
|
22
|
+
return values;
|
|
23
|
+
}
|
|
24
|
+
function historySnapshotSamples(data, tracked) {
|
|
25
|
+
const result = [];
|
|
26
|
+
const add = (scope, uid, sample) => result.push({
|
|
27
|
+
clusterId: data.clusterId,
|
|
28
|
+
scope,
|
|
29
|
+
uid,
|
|
30
|
+
time: sample.time,
|
|
31
|
+
values: numeric(sample)
|
|
32
|
+
});
|
|
33
|
+
if (data.nodeMetrics?.length) try {
|
|
34
|
+
const sample = require_monitoring_math.aggregateMetrics(data.nodeMetrics);
|
|
35
|
+
sample.time = Math.min(...data.nodeMetrics.map((metric) => Date.parse(metric.timestamp)));
|
|
36
|
+
if (data.nodes?.length) try {
|
|
37
|
+
sample.resources = require_monitoring_math.aggregateResources(data.nodes, data.pods);
|
|
38
|
+
} catch {}
|
|
39
|
+
add("cluster", data.clusterId, sample);
|
|
40
|
+
} catch {}
|
|
41
|
+
const nodeMetricsByName = /* @__PURE__ */ new Map();
|
|
42
|
+
for (const metric of data.nodeMetrics ?? []) {
|
|
43
|
+
if (!metric.metadata?.name) continue;
|
|
44
|
+
const metrics = nodeMetricsByName.get(metric.metadata.name) ?? [];
|
|
45
|
+
metrics.push(metric);
|
|
46
|
+
nodeMetricsByName.set(metric.metadata.name, metrics);
|
|
47
|
+
}
|
|
48
|
+
const podsByNode = /* @__PURE__ */ new Map();
|
|
49
|
+
for (const pod of data.pods ?? []) {
|
|
50
|
+
const name = pod.spec.nodeName;
|
|
51
|
+
if (!name) continue;
|
|
52
|
+
const pods = podsByNode.get(name) ?? [];
|
|
53
|
+
pods.push(pod);
|
|
54
|
+
podsByNode.set(name, pods);
|
|
55
|
+
}
|
|
56
|
+
for (const node of data.nodes ?? []) {
|
|
57
|
+
if (!node.metadata.uid) continue;
|
|
58
|
+
try {
|
|
59
|
+
const sample = require_monitoring_collector.getNodeSample({
|
|
60
|
+
...data,
|
|
61
|
+
nodes: [node],
|
|
62
|
+
nodeMetrics: nodeMetricsByName.get(node.metadata.name),
|
|
63
|
+
pods: data.pods ? podsByNode.get(node.metadata.name) ?? [] : void 0
|
|
64
|
+
}, node.metadata.name, node.metadata.uid);
|
|
65
|
+
if (sample) add("node", node.metadata.uid, sample);
|
|
66
|
+
} catch {}
|
|
67
|
+
}
|
|
68
|
+
const usage = require_monitoring_collector.getCollectedPodUsage(data);
|
|
69
|
+
const targets = tracked.filter((item) => item.clusterId === data.clusterId);
|
|
70
|
+
const podsByUid = new Map((data.pods ?? []).map((pod) => [pod.metadata.uid, pod]));
|
|
71
|
+
const usageByUid = new Map(usage.map((item) => [item.uid, item]));
|
|
72
|
+
const metricsByName = new Map((data.podMetrics ?? []).map((metric) => [`${metric.metadata.namespace ?? ""}/${metric.metadata.name}`, metric]));
|
|
73
|
+
const workloadTargets = new Set(targets.filter((item) => item.scope === "workload").map((item) => item.uid));
|
|
74
|
+
for (const target of targets.filter((item) => item.scope === "pod")) {
|
|
75
|
+
const pod = podsByUid.get(target.uid);
|
|
76
|
+
const metric = usageByUid.get(target.uid);
|
|
77
|
+
const raw = pod ? metricsByName.get(`${pod.metadata.namespace ?? ""}/${pod.metadata.name}`) : void 0;
|
|
78
|
+
if (!pod || !metric || metric.cpu === void 0 || metric.memory === void 0 || !raw) continue;
|
|
79
|
+
const sample = {
|
|
80
|
+
time: Date.parse(raw.timestamp),
|
|
81
|
+
cpu: metric.cpu,
|
|
82
|
+
memory: metric.memory
|
|
83
|
+
};
|
|
84
|
+
try {
|
|
85
|
+
sample.resources = {
|
|
86
|
+
cpu: {
|
|
87
|
+
requests: require_resource_diagnostics.effectivePodResource(pod, "cpu"),
|
|
88
|
+
limits: require_resource_diagnostics.effectivePodResource(pod, "cpu", "limits")
|
|
89
|
+
},
|
|
90
|
+
memory: {
|
|
91
|
+
requests: require_resource_diagnostics.effectivePodResource(pod, "memory"),
|
|
92
|
+
limits: require_resource_diagnostics.effectivePodResource(pod, "memory", "limits")
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
} catch {}
|
|
96
|
+
add("pod", target.uid, sample);
|
|
97
|
+
}
|
|
98
|
+
for (const group of workloadTargets.size ? require_resource_diagnostics.buildConsumerGroups(data.pods ?? [], data.owners ?? [], usage) : []) {
|
|
99
|
+
if (!group.ownerResolved || !workloadTargets.has(group.identity) || group.cpu.coveredPods !== group.cpu.totalPods || group.memory.coveredPods !== group.memory.totalPods || group.cpu.usage === void 0 || group.memory.usage === void 0) continue;
|
|
100
|
+
const times = group.pods.flatMap((pod) => {
|
|
101
|
+
const metric = metricsByName.get(`${pod.metadata.namespace ?? ""}/${pod.metadata.name}`);
|
|
102
|
+
return metric ? [Date.parse(metric.timestamp)] : [];
|
|
103
|
+
});
|
|
104
|
+
if (!times.length) continue;
|
|
105
|
+
add("workload", group.identity, {
|
|
106
|
+
time: Math.min(...times),
|
|
107
|
+
cpu: group.cpu.usage,
|
|
108
|
+
memory: group.memory.usage,
|
|
109
|
+
resources: {
|
|
110
|
+
cpu: { requests: group.cpu.unknownRequestPods ? void 0 : group.cpu.requests },
|
|
111
|
+
memory: { requests: group.memory.unknownRequestPods ? void 0 : group.memory.requests }
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
return result;
|
|
116
|
+
}
|
|
117
|
+
function startMonitoringHistoryCollection() {
|
|
118
|
+
const seen = /* @__PURE__ */ new Map();
|
|
119
|
+
let stopped = false;
|
|
120
|
+
let writing = false;
|
|
121
|
+
let queued;
|
|
122
|
+
const permitted = (data) => {
|
|
123
|
+
const preferences = require_monitoring_preferences_store.MonitoringPreferencesStore.getInstanceOrCreate();
|
|
124
|
+
return !stopped && preferences.enabled && preferences.historyEnabled && document.visibilityState !== "hidden" && require_extensions.Renderer.Catalog.activeCluster.get()?.metadata.uid === data.clusterId;
|
|
125
|
+
};
|
|
126
|
+
const flush = async () => {
|
|
127
|
+
if (writing) return;
|
|
128
|
+
writing = true;
|
|
129
|
+
try {
|
|
130
|
+
while (queued && !stopped) {
|
|
131
|
+
const data = queued;
|
|
132
|
+
queued = void 0;
|
|
133
|
+
if (!permitted(data)) continue;
|
|
134
|
+
const samples = historySnapshotSamples(data, require_monitoring_preferences_store.MonitoringPreferencesStore.getInstanceOrCreate().trackedHistory).filter((sample) => (seen.get(`${sample.clusterId}/${sample.scope}/${sample.uid}`) ?? 0) < sample.time);
|
|
135
|
+
for (let i = 0; i < samples.length; i += 512) {
|
|
136
|
+
if (!permitted(data)) break;
|
|
137
|
+
const batch = samples.slice(i, i + 512);
|
|
138
|
+
try {
|
|
139
|
+
if (!await require_monitoring_history.monitoringHistory.append(batch) || stopped) continue;
|
|
140
|
+
for (const sample of batch) {
|
|
141
|
+
const key = `${sample.clusterId}/${sample.scope}/${sample.uid}`;
|
|
142
|
+
seen.set(key, Math.max(seen.get(key) ?? 0, sample.time));
|
|
143
|
+
}
|
|
144
|
+
while (seen.size > 1e4) seen.delete(seen.keys().next().value);
|
|
145
|
+
} catch {}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
} finally {
|
|
149
|
+
writing = false;
|
|
150
|
+
}
|
|
151
|
+
};
|
|
152
|
+
const unsubscribe = require_monitoring_collector.onMonitoringSnapshot((data) => {
|
|
153
|
+
if (!permitted(data)) return;
|
|
154
|
+
queued = data;
|
|
155
|
+
flush();
|
|
156
|
+
});
|
|
157
|
+
return () => {
|
|
158
|
+
stopped = true;
|
|
159
|
+
queued = void 0;
|
|
160
|
+
unsubscribe();
|
|
161
|
+
seen.clear();
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
//#endregion
|
|
165
|
+
exports.historySnapshotSamples = historySnapshotSamples;
|
|
166
|
+
exports.startMonitoringHistoryCollection = startMonitoringHistoryCollection;
|
|
167
|
+
|
|
168
|
+
//# sourceMappingURL=monitoring-history-collection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"monitoring-history-collection.js","names":[],"sources":["../../src/renderer/monitoring-history-collection.ts"],"sourcesContent":["import { Renderer } from \"@freelensapp/extensions\";\nimport { type HistoryIdentity, type HistorySample, validHistoryIdentity } from \"../common/monitoring-history\";\nimport { aggregateMetrics, aggregateResources, type MonitoringSample } from \"../common/monitoring-math\";\nimport { buildConsumerGroups, effectivePodResource } from \"../common/resource-diagnostics\";\nimport { MonitoringPreferencesStore } from \"../common/store/monitoring-preferences-store\";\nimport {\n getCollectedPodUsage,\n getNodeSample,\n type MonitoringSnapshot,\n onMonitoringSnapshot,\n} from \"./monitoring-collector\";\nimport { monitoringHistory } from \"./monitoring-history\";\nexport function isHistoryTracked(identity: HistoryIdentity): boolean {\n return MonitoringPreferencesStore.getInstanceOrCreate<MonitoringPreferencesStore>().trackedHistory.some(\n (item) => item.clusterId === identity.clusterId && item.scope === identity.scope && item.uid === identity.uid,\n );\n}\nexport function setHistoryTracked(identity: HistoryIdentity, tracked: boolean): void {\n if (!validHistoryIdentity(identity)) return;\n const preferences = MonitoringPreferencesStore.getInstanceOrCreate<MonitoringPreferencesStore>();\n const rest = preferences.trackedHistory.filter(\n (item) => !(item.clusterId === identity.clusterId && item.scope === identity.scope && item.uid === identity.uid),\n );\n preferences.trackedHistory = tracked\n ? [...rest, { clusterId: identity.clusterId, scope: identity.scope, uid: identity.uid }].slice(-100)\n : rest;\n}\nfunction numeric(sample: MonitoringSample): HistorySample[\"values\"] {\n const values: HistorySample[\"values\"] = { cpu: sample.cpu, memory: sample.memory };\n for (const metric of [\"cpu\", \"memory\"] as const)\n for (const field of [\"requests\", \"limits\", \"capacity\", \"allocatable\"] as const) {\n const value = sample.resources?.[metric]?.[field];\n if (value !== undefined && Number.isFinite(value))\n values[`${metric}${field[0].toUpperCase()}${field.slice(1)}` as keyof typeof values] = value;\n }\n return values;\n}\nexport function historySnapshotSamples(data: MonitoringSnapshot, tracked: HistoryIdentity[]): HistorySample[] {\n const result: HistorySample[] = [];\n const add = (scope: HistoryIdentity[\"scope\"], uid: string, sample: MonitoringSample) =>\n result.push({ clusterId: data.clusterId, scope, uid, time: sample.time, values: numeric(sample) });\n if (data.nodeMetrics?.length) {\n try {\n const sample = aggregateMetrics(data.nodeMetrics);\n sample.time = Math.min(...data.nodeMetrics.map((metric) => Date.parse(metric.timestamp)));\n if (data.nodes?.length) {\n try {\n sample.resources = aggregateResources(data.nodes, data.pods);\n } catch {\n // usage remains valid when capacity or request data is incomplete\n }\n }\n add(\"cluster\", data.clusterId, sample);\n } catch {\n /* invalid or stale metrics leave a gap */\n }\n }\n const nodeMetricsByName = new Map<string, NonNullable<MonitoringSnapshot[\"nodeMetrics\"]>>();\n for (const metric of data.nodeMetrics ?? []) {\n if (!metric.metadata?.name) continue;\n const metrics = nodeMetricsByName.get(metric.metadata.name) ?? [];\n metrics.push(metric);\n nodeMetricsByName.set(metric.metadata.name, metrics);\n }\n const podsByNode = new Map<string, NonNullable<MonitoringSnapshot[\"pods\"]>>();\n for (const pod of data.pods ?? []) {\n const name = pod.spec.nodeName;\n if (!name) continue;\n const pods = podsByNode.get(name) ?? [];\n pods.push(pod);\n podsByNode.set(name, pods);\n }\n for (const node of data.nodes ?? []) {\n if (!node.metadata.uid) continue;\n try {\n const sample = getNodeSample(\n {\n ...data,\n nodes: [node],\n nodeMetrics: nodeMetricsByName.get(node.metadata.name),\n pods: data.pods ? (podsByNode.get(node.metadata.name) ?? []) : undefined,\n },\n node.metadata.name,\n node.metadata.uid,\n );\n if (sample) add(\"node\", node.metadata.uid, sample);\n } catch {\n /* invalid or stale metrics leave a gap */\n }\n }\n const usage = getCollectedPodUsage(data);\n const targets = tracked.filter((item) => item.clusterId === data.clusterId);\n const podsByUid = new Map((data.pods ?? []).map((pod) => [pod.metadata.uid, pod]));\n const usageByUid = new Map(usage.map((item) => [item.uid, item]));\n const metricsByName = new Map(\n (data.podMetrics ?? []).map((metric) => [`${metric.metadata.namespace ?? \"\"}/${metric.metadata.name}`, metric]),\n );\n const workloadTargets = new Set(targets.filter((item) => item.scope === \"workload\").map((item) => item.uid));\n for (const target of targets.filter((item) => item.scope === \"pod\")) {\n const pod = podsByUid.get(target.uid);\n const metric = usageByUid.get(target.uid);\n const raw = pod ? metricsByName.get(`${pod.metadata.namespace ?? \"\"}/${pod.metadata.name}`) : undefined;\n if (!pod || !metric || metric.cpu === undefined || metric.memory === undefined || !raw) continue;\n const sample: MonitoringSample = { time: Date.parse(raw.timestamp), cpu: metric.cpu, memory: metric.memory };\n try {\n sample.resources = {\n cpu: { requests: effectivePodResource(pod, \"cpu\"), limits: effectivePodResource(pod, \"cpu\", \"limits\") },\n memory: {\n requests: effectivePodResource(pod, \"memory\"),\n limits: effectivePodResource(pod, \"memory\", \"limits\"),\n },\n };\n } catch {\n /* usage remains available without resource totals */\n }\n add(\"pod\", target.uid, sample);\n }\n for (const group of workloadTargets.size ? buildConsumerGroups(data.pods ?? [], data.owners ?? [], usage) : []) {\n if (\n !group.ownerResolved ||\n !workloadTargets.has(group.identity) ||\n group.cpu.coveredPods !== group.cpu.totalPods ||\n group.memory.coveredPods !== group.memory.totalPods ||\n group.cpu.usage === undefined ||\n group.memory.usage === undefined\n )\n continue;\n const times = group.pods.flatMap((pod) => {\n const metric = metricsByName.get(`${pod.metadata.namespace ?? \"\"}/${pod.metadata.name}`);\n return metric ? [Date.parse(metric.timestamp)] : [];\n });\n if (!times.length) continue;\n add(\"workload\", group.identity, {\n time: Math.min(...times),\n cpu: group.cpu.usage,\n memory: group.memory.usage,\n resources: {\n cpu: { requests: group.cpu.unknownRequestPods ? undefined : group.cpu.requests },\n memory: { requests: group.memory.unknownRequestPods ? undefined : group.memory.requests },\n },\n });\n }\n return result;\n}\nexport function startMonitoringHistoryCollection(): () => void {\n const seen = new Map<string, number>();\n let stopped = false;\n let writing = false;\n let queued: MonitoringSnapshot | undefined;\n const permitted = (data: MonitoringSnapshot) => {\n const preferences = MonitoringPreferencesStore.getInstanceOrCreate<MonitoringPreferencesStore>();\n return (\n !stopped &&\n preferences.enabled &&\n preferences.historyEnabled &&\n document.visibilityState !== \"hidden\" &&\n Renderer.Catalog.activeCluster.get()?.metadata.uid === data.clusterId\n );\n };\n const flush = async () => {\n if (writing) return;\n writing = true;\n try {\n while (queued && !stopped) {\n const data = queued;\n queued = undefined;\n if (!permitted(data)) continue;\n const preferences = MonitoringPreferencesStore.getInstanceOrCreate<MonitoringPreferencesStore>();\n const samples = historySnapshotSamples(data, preferences.trackedHistory).filter(\n (sample) => (seen.get(`${sample.clusterId}/${sample.scope}/${sample.uid}`) ?? 0) < sample.time,\n );\n for (let i = 0; i < samples.length; i += 512) {\n if (!permitted(data)) break;\n const batch = samples.slice(i, i + 512);\n try {\n if (!(await monitoringHistory.append(batch)) || stopped) continue;\n for (const sample of batch) {\n const key = `${sample.clusterId}/${sample.scope}/${sample.uid}`;\n seen.set(key, Math.max(seen.get(key) ?? 0, sample.time));\n }\n while (seen.size > 10_000) seen.delete(seen.keys().next().value!);\n } catch {\n // failed batches remain eligible for the next snapshot\n }\n }\n }\n } finally {\n writing = false;\n }\n };\n const unsubscribe = onMonitoringSnapshot((data) => {\n if (!permitted(data)) return;\n // retain only the newest pending snapshot while writes are in flight\n queued = data;\n void flush();\n });\n return () => {\n stopped = true;\n queued = undefined;\n unsubscribe();\n seen.clear();\n };\n}\n"],"mappings":";;;;;;;AA2BA,SAAS,QAAQ,QAAmD;CAClE,MAAM,SAAkC;EAAE,KAAK,OAAO;EAAK,QAAQ,OAAO;CAAO;CACjF,KAAK,MAAM,UAAU,CAAC,OAAO,QAAQ,GACnC,KAAK,MAAM,SAAS;EAAC;EAAY;EAAU;EAAY;CAAa,GAAY;EAC9E,MAAM,QAAQ,OAAO,YAAY,OAAO,GAAG;EAC3C,IAAI,UAAU,KAAA,KAAa,OAAO,SAAS,KAAK,GAC9C,OAAO,GAAG,SAAS,MAAM,EAAE,CAAC,YAAY,IAAI,MAAM,MAAM,CAAC,OAA8B;CAC3F;CACF,OAAO;AACT;AACA,SAAgB,uBAAuB,MAA0B,SAA6C;CAC5G,MAAM,SAA0B,CAAC;CACjC,MAAM,OAAO,OAAiC,KAAa,WACzD,OAAO,KAAK;EAAE,WAAW,KAAK;EAAW;EAAO;EAAK,MAAM,OAAO;EAAM,QAAQ,QAAQ,MAAM;CAAE,CAAC;CACnG,IAAI,KAAK,aAAa,QACpB,IAAI;EACF,MAAM,SAAS,wBAAA,iBAAiB,KAAK,WAAW;EAChD,OAAO,OAAO,KAAK,IAAI,GAAG,KAAK,YAAY,KAAK,WAAW,KAAK,MAAM,OAAO,SAAS,CAAC,CAAC;EACxF,IAAI,KAAK,OAAO,QACd,IAAI;GACF,OAAO,YAAY,wBAAA,mBAAmB,KAAK,OAAO,KAAK,IAAI;EAC7D,QAAQ,CAER;EAEF,IAAI,WAAW,KAAK,WAAW,MAAM;CACvC,QAAQ,CAER;CAEF,MAAM,oCAAoB,IAAI,IAA4D;CAC1F,KAAK,MAAM,UAAU,KAAK,eAAe,CAAC,GAAG;EAC3C,IAAI,CAAC,OAAO,UAAU,MAAM;EAC5B,MAAM,UAAU,kBAAkB,IAAI,OAAO,SAAS,IAAI,KAAK,CAAC;EAChE,QAAQ,KAAK,MAAM;EACnB,kBAAkB,IAAI,OAAO,SAAS,MAAM,OAAO;CACrD;CACA,MAAM,6BAAa,IAAI,IAAqD;CAC5E,KAAK,MAAM,OAAO,KAAK,QAAQ,CAAC,GAAG;EACjC,MAAM,OAAO,IAAI,KAAK;EACtB,IAAI,CAAC,MAAM;EACX,MAAM,OAAO,WAAW,IAAI,IAAI,KAAK,CAAC;EACtC,KAAK,KAAK,GAAG;EACb,WAAW,IAAI,MAAM,IAAI;CAC3B;CACA,KAAK,MAAM,QAAQ,KAAK,SAAS,CAAC,GAAG;EACnC,IAAI,CAAC,KAAK,SAAS,KAAK;EACxB,IAAI;GACF,MAAM,SAAS,6BAAA,cACb;IACE,GAAG;IACH,OAAO,CAAC,IAAI;IACZ,aAAa,kBAAkB,IAAI,KAAK,SAAS,IAAI;IACrD,MAAM,KAAK,OAAQ,WAAW,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,IAAK,KAAA;GACjE,GACA,KAAK,SAAS,MACd,KAAK,SAAS,GAChB;GACA,IAAI,QAAQ,IAAI,QAAQ,KAAK,SAAS,KAAK,MAAM;EACnD,QAAQ,CAER;CACF;CACA,MAAM,QAAQ,6BAAA,qBAAqB,IAAI;CACvC,MAAM,UAAU,QAAQ,QAAQ,SAAS,KAAK,cAAc,KAAK,SAAS;CAC1E,MAAM,YAAY,IAAI,KAAK,KAAK,QAAQ,CAAC,EAAA,CAAG,KAAK,QAAQ,CAAC,IAAI,SAAS,KAAK,GAAG,CAAC,CAAC;CACjF,MAAM,aAAa,IAAI,IAAI,MAAM,KAAK,SAAS,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC;CAChE,MAAM,gBAAgB,IAAI,KACvB,KAAK,cAAc,CAAC,EAAA,CAAG,KAAK,WAAW,CAAC,GAAG,OAAO,SAAS,aAAa,GAAG,GAAG,OAAO,SAAS,QAAQ,MAAM,CAAC,CAChH;CACA,MAAM,kBAAkB,IAAI,IAAI,QAAQ,QAAQ,SAAS,KAAK,UAAU,UAAU,CAAC,CAAC,KAAK,SAAS,KAAK,GAAG,CAAC;CAC3G,KAAK,MAAM,UAAU,QAAQ,QAAQ,SAAS,KAAK,UAAU,KAAK,GAAG;EACnE,MAAM,MAAM,UAAU,IAAI,OAAO,GAAG;EACpC,MAAM,SAAS,WAAW,IAAI,OAAO,GAAG;EACxC,MAAM,MAAM,MAAM,cAAc,IAAI,GAAG,IAAI,SAAS,aAAa,GAAG,GAAG,IAAI,SAAS,MAAM,IAAI,KAAA;EAC9F,IAAI,CAAC,OAAO,CAAC,UAAU,OAAO,QAAQ,KAAA,KAAa,OAAO,WAAW,KAAA,KAAa,CAAC,KAAK;EACxF,MAAM,SAA2B;GAAE,MAAM,KAAK,MAAM,IAAI,SAAS;GAAG,KAAK,OAAO;GAAK,QAAQ,OAAO;EAAO;EAC3G,IAAI;GACF,OAAO,YAAY;IACjB,KAAK;KAAE,UAAU,6BAAA,qBAAqB,KAAK,KAAK;KAAG,QAAQ,6BAAA,qBAAqB,KAAK,OAAO,QAAQ;IAAE;IACtG,QAAQ;KACN,UAAU,6BAAA,qBAAqB,KAAK,QAAQ;KAC5C,QAAQ,6BAAA,qBAAqB,KAAK,UAAU,QAAQ;IACtD;GACF;EACF,QAAQ,CAER;EACA,IAAI,OAAO,OAAO,KAAK,MAAM;CAC/B;CACA,KAAK,MAAM,SAAS,gBAAgB,OAAO,6BAAA,oBAAoB,KAAK,QAAQ,CAAC,GAAG,KAAK,UAAU,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG;EAC9G,IACE,CAAC,MAAM,iBACP,CAAC,gBAAgB,IAAI,MAAM,QAAQ,KACnC,MAAM,IAAI,gBAAgB,MAAM,IAAI,aACpC,MAAM,OAAO,gBAAgB,MAAM,OAAO,aAC1C,MAAM,IAAI,UAAU,KAAA,KACpB,MAAM,OAAO,UAAU,KAAA,GAEvB;EACF,MAAM,QAAQ,MAAM,KAAK,SAAS,QAAQ;GACxC,MAAM,SAAS,cAAc,IAAI,GAAG,IAAI,SAAS,aAAa,GAAG,GAAG,IAAI,SAAS,MAAM;GACvF,OAAO,SAAS,CAAC,KAAK,MAAM,OAAO,SAAS,CAAC,IAAI,CAAC;EACpD,CAAC;EACD,IAAI,CAAC,MAAM,QAAQ;EACnB,IAAI,YAAY,MAAM,UAAU;GAC9B,MAAM,KAAK,IAAI,GAAG,KAAK;GACvB,KAAK,MAAM,IAAI;GACf,QAAQ,MAAM,OAAO;GACrB,WAAW;IACT,KAAK,EAAE,UAAU,MAAM,IAAI,qBAAqB,KAAA,IAAY,MAAM,IAAI,SAAS;IAC/E,QAAQ,EAAE,UAAU,MAAM,OAAO,qBAAqB,KAAA,IAAY,MAAM,OAAO,SAAS;GAC1F;EACF,CAAC;CACH;CACA,OAAO;AACT;AACA,SAAgB,mCAA+C;CAC7D,MAAM,uBAAO,IAAI,IAAoB;CACrC,IAAI,UAAU;CACd,IAAI,UAAU;CACd,IAAI;CACJ,MAAM,aAAa,SAA6B;EAC9C,MAAM,cAAc,qCAAA,2BAA2B,oBAAgD;EAC/F,OACE,CAAC,WACD,YAAY,WACZ,YAAY,kBACZ,SAAS,oBAAoB,YAC7B,mBAAA,SAAS,QAAQ,cAAc,IAAI,CAAC,EAAE,SAAS,QAAQ,KAAK;CAEhE;CACA,MAAM,QAAQ,YAAY;EACxB,IAAI,SAAS;EACb,UAAU;EACV,IAAI;GACF,OAAO,UAAU,CAAC,SAAS;IACzB,MAAM,OAAO;IACb,SAAS,KAAA;IACT,IAAI,CAAC,UAAU,IAAI,GAAG;IAEtB,MAAM,UAAU,uBAAuB,MADnB,qCAAA,2BAA2B,oBACF,CAAA,CAAY,cAAc,CAAC,CAAC,QACtE,YAAY,KAAK,IAAI,GAAG,OAAO,UAAU,GAAG,OAAO,MAAM,GAAG,OAAO,KAAK,KAAK,KAAK,OAAO,IAC5F;IACA,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK,KAAK;KAC5C,IAAI,CAAC,UAAU,IAAI,GAAG;KACtB,MAAM,QAAQ,QAAQ,MAAM,GAAG,IAAI,GAAG;KACtC,IAAI;MACF,IAAI,CAAE,MAAM,2BAAA,kBAAkB,OAAO,KAAK,KAAM,SAAS;MACzD,KAAK,MAAM,UAAU,OAAO;OAC1B,MAAM,MAAM,GAAG,OAAO,UAAU,GAAG,OAAO,MAAM,GAAG,OAAO;OAC1D,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,IAAI,GAAG,KAAK,GAAG,OAAO,IAAI,CAAC;MACzD;MACA,OAAO,KAAK,OAAO,KAAQ,KAAK,OAAO,KAAK,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,KAAM;KAClE,QAAQ,CAER;IACF;GACF;EACF,UAAU;GACR,UAAU;EACZ;CACF;CACA,MAAM,cAAc,6BAAA,sBAAsB,SAAS;EACjD,IAAI,CAAC,UAAU,IAAI,GAAG;EAEtB,SAAS;EACT,MAAW;CACb,CAAC;CACD,aAAa;EACX,UAAU;EACV,SAAS,KAAA;EACT,YAAY;EACZ,KAAK,MAAM;CACb;AACF"}
|
|
@@ -0,0 +1,227 @@
|
|
|
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__global_external_react = require("./_virtual/_global-external_react.js");
|
|
5
|
+
const require_jsx_runtime = require("./_virtual/_global-external_react/jsx-runtime.js");
|
|
6
|
+
const require_react_select_esm = require("./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");
|
|
7
|
+
const require_monitoring_history = require("./monitoring-history.js");
|
|
8
|
+
//#region src/renderer/monitoring-history-view.tsx
|
|
9
|
+
var HISTORY_RANGES = {
|
|
10
|
+
"5m": 3e5,
|
|
11
|
+
"30m": 18e5,
|
|
12
|
+
"2h": 72e5,
|
|
13
|
+
"24h": 864e5,
|
|
14
|
+
"7d": 6048e5
|
|
15
|
+
};
|
|
16
|
+
var RANGE_LABELS = {
|
|
17
|
+
"5m": "5 min",
|
|
18
|
+
"30m": "30 min",
|
|
19
|
+
"2h": "2 hours",
|
|
20
|
+
"24h": "24 hours",
|
|
21
|
+
"7d": "7 days"
|
|
22
|
+
};
|
|
23
|
+
function mergeHistorySamples(points, live, from) {
|
|
24
|
+
const buckets = /* @__PURE__ */ new Map();
|
|
25
|
+
for (const point of points) {
|
|
26
|
+
if (point.time < from) continue;
|
|
27
|
+
const sample = buckets.get(point.time) ?? {
|
|
28
|
+
time: point.time,
|
|
29
|
+
cpu: NaN,
|
|
30
|
+
memory: NaN
|
|
31
|
+
};
|
|
32
|
+
if (point.metric === "cpu" || point.metric === "memory") {
|
|
33
|
+
sample[point.metric] = point.avg;
|
|
34
|
+
sample.historical ??= {};
|
|
35
|
+
sample.historical[point.metric] = {
|
|
36
|
+
min: point.min,
|
|
37
|
+
max: point.max,
|
|
38
|
+
count: point.count,
|
|
39
|
+
resolution: point.resolution,
|
|
40
|
+
gap: point.gap
|
|
41
|
+
};
|
|
42
|
+
if (point.gap) sample.breakBefore = true;
|
|
43
|
+
} else if (point.metric !== "restarts") {
|
|
44
|
+
const match = /^(cpu|memory)(Requests|Limits|Capacity|Allocatable)$/.exec(point.metric);
|
|
45
|
+
if (match) {
|
|
46
|
+
sample.resources ??= {
|
|
47
|
+
cpu: {},
|
|
48
|
+
memory: {}
|
|
49
|
+
};
|
|
50
|
+
sample.resources[match[1]][match[2].toLowerCase()] = point.avg;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
if (point.gap) sample.resourceStatus = "Partial historical bucket; missing samples are gaps";
|
|
54
|
+
buckets.set(point.time, sample);
|
|
55
|
+
}
|
|
56
|
+
for (const sample of live) if (sample.time >= from) {
|
|
57
|
+
for (const point of points) if (sample.time >= point.time && sample.time < point.time + point.resolution) buckets.delete(point.time);
|
|
58
|
+
buckets.set(sample.time, sample);
|
|
59
|
+
}
|
|
60
|
+
const samples = [...buckets.values()].filter((sample) => Number.isFinite(sample.cpu) && Number.isFinite(sample.memory)).sort((a, b) => a.time - b.time);
|
|
61
|
+
const resolution = (sample) => Math.max(sample.historical?.cpu?.resolution ?? 3e4, sample.historical?.memory?.resolution ?? 3e4);
|
|
62
|
+
return samples.map((sample, index) => index > 0 && sample.time - samples[index - 1].time > 1.8 * Math.max(resolution(sample), resolution(samples[index - 1])) ? {
|
|
63
|
+
...sample,
|
|
64
|
+
breakBefore: true
|
|
65
|
+
} : sample);
|
|
66
|
+
}
|
|
67
|
+
function useMonitoringHistory(identity, liveSamples) {
|
|
68
|
+
const preferences = require_monitoring_preferences_store.MonitoringPreferencesStore.getInstanceOrCreate();
|
|
69
|
+
const [enabled, setEnabled] = require__global_external_react.useState(preferences.historyEnabled === true);
|
|
70
|
+
require__global_external_react.useEffect(() => require__global_external_mobx.reaction(() => preferences.historyEnabled === true, setEnabled, { fireImmediately: true }), [preferences]);
|
|
71
|
+
const [range, setRange] = require__global_external_react.useState("5m");
|
|
72
|
+
const [points, setPoints] = require__global_external_react.useState([]);
|
|
73
|
+
const [status, setStatus] = require__global_external_react.useState("");
|
|
74
|
+
require__global_external_react.useEffect(() => {
|
|
75
|
+
let current = true;
|
|
76
|
+
setPoints([]);
|
|
77
|
+
setStatus("");
|
|
78
|
+
if (!identity || !enabled) return;
|
|
79
|
+
const query = () => {
|
|
80
|
+
const to = Date.now();
|
|
81
|
+
Promise.resolve().then(() => require_monitoring_history.monitoringHistory.query({
|
|
82
|
+
...identity,
|
|
83
|
+
from: to - HISTORY_RANGES[range] + 1e3,
|
|
84
|
+
to
|
|
85
|
+
})).then((value) => {
|
|
86
|
+
if (current) {
|
|
87
|
+
setPoints(value);
|
|
88
|
+
setStatus(value.length ? "" : "No local history for this range. Collection starts when enabled.");
|
|
89
|
+
}
|
|
90
|
+
}).catch(() => {
|
|
91
|
+
if (current) setStatus("Local history unavailable. Live samples remain visible.");
|
|
92
|
+
});
|
|
93
|
+
};
|
|
94
|
+
query();
|
|
95
|
+
const timer = window.setInterval(query, 3e4);
|
|
96
|
+
return () => {
|
|
97
|
+
current = false;
|
|
98
|
+
window.clearInterval(timer);
|
|
99
|
+
};
|
|
100
|
+
}, [
|
|
101
|
+
identity ? `${identity.clusterId}/${identity.scope}/${identity.uid}` : "",
|
|
102
|
+
range,
|
|
103
|
+
enabled
|
|
104
|
+
]);
|
|
105
|
+
return {
|
|
106
|
+
range,
|
|
107
|
+
setRange,
|
|
108
|
+
samples: mergeHistorySamples(points, liveSamples, Date.now() - HISTORY_RANGES[range]),
|
|
109
|
+
points,
|
|
110
|
+
status
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
function MonitoringHistoryRange({ range, onChange, native = false, status, compact = false }) {
|
|
114
|
+
return /* @__PURE__ */ require_jsx_runtime.jsxs("div", {
|
|
115
|
+
className: compact ? "power-history-compact" : void 0,
|
|
116
|
+
style: {
|
|
117
|
+
display: "flex",
|
|
118
|
+
flexDirection: "column",
|
|
119
|
+
alignItems: "flex-start",
|
|
120
|
+
gap: 8,
|
|
121
|
+
marginBottom: compact ? 0 : 12
|
|
122
|
+
},
|
|
123
|
+
children: [
|
|
124
|
+
/* @__PURE__ */ require_jsx_runtime.jsx("style", { children: `
|
|
125
|
+
.power-history-select.Select { min-width: 0; width: 100%; }
|
|
126
|
+
.power-history-select .Select__control { min-height: 32px; }
|
|
127
|
+
.power-history-select .Select__value-container { padding: 6px 10px; }
|
|
128
|
+
.power-history-compact .Select__control { min-height: 26px; height:26px; font-size:12px; }
|
|
129
|
+
.power-history-compact .Select__value-container { padding:4px 8px; }
|
|
130
|
+
.power-history-compact .Select__indicator { padding:3px; }
|
|
131
|
+
.power-history-compact .Select__indicator svg { width:14px;height:14px; }
|
|
132
|
+
` }),
|
|
133
|
+
/* @__PURE__ */ require_jsx_runtime.jsxs("label", {
|
|
134
|
+
style: {
|
|
135
|
+
display: "inline-flex",
|
|
136
|
+
alignItems: "center",
|
|
137
|
+
gap: 12,
|
|
138
|
+
minHeight: compact ? 26 : 32,
|
|
139
|
+
color: "var(--textColorSecondary)"
|
|
140
|
+
},
|
|
141
|
+
children: [!compact && "Period", /* @__PURE__ */ require_jsx_runtime.jsx("span", {
|
|
142
|
+
style: {
|
|
143
|
+
width: compact ? 88 : 140,
|
|
144
|
+
position: "relative",
|
|
145
|
+
display: "inline-flex",
|
|
146
|
+
alignItems: "center"
|
|
147
|
+
},
|
|
148
|
+
children: native ? /* @__PURE__ */ require_jsx_runtime.jsx(require_extensions.Renderer.Component.Select, {
|
|
149
|
+
className: "power-history-select",
|
|
150
|
+
"aria-label": "History range",
|
|
151
|
+
value: range,
|
|
152
|
+
options: Object.keys(HISTORY_RANGES).map((value) => ({
|
|
153
|
+
value,
|
|
154
|
+
label: RANGE_LABELS[value]
|
|
155
|
+
})),
|
|
156
|
+
onChange: (option) => {
|
|
157
|
+
if (option) onChange(option.value);
|
|
158
|
+
},
|
|
159
|
+
isClearable: false
|
|
160
|
+
}) : /* @__PURE__ */ require_jsx_runtime.jsx(require_react_select_esm.default, {
|
|
161
|
+
"aria-label": "History range",
|
|
162
|
+
className: "Select power-history-select",
|
|
163
|
+
classNamePrefix: "Select",
|
|
164
|
+
unstyled: true,
|
|
165
|
+
isSearchable: false,
|
|
166
|
+
isClearable: false,
|
|
167
|
+
value: {
|
|
168
|
+
value: range,
|
|
169
|
+
label: RANGE_LABELS[range]
|
|
170
|
+
},
|
|
171
|
+
options: Object.keys(HISTORY_RANGES).map((value) => ({
|
|
172
|
+
value,
|
|
173
|
+
label: RANGE_LABELS[value]
|
|
174
|
+
})),
|
|
175
|
+
onChange: (option) => {
|
|
176
|
+
if (option) onChange(option.value);
|
|
177
|
+
},
|
|
178
|
+
onKeyDown: (event) => {
|
|
179
|
+
if (event.key === "Escape") event.stopPropagation();
|
|
180
|
+
},
|
|
181
|
+
menuPortalTarget: document.body,
|
|
182
|
+
menuPlacement: "auto",
|
|
183
|
+
styles: {
|
|
184
|
+
menuPortal: (base) => ({
|
|
185
|
+
...base,
|
|
186
|
+
zIndex: 1e4
|
|
187
|
+
}),
|
|
188
|
+
...compact ? {
|
|
189
|
+
menu: (base) => ({
|
|
190
|
+
...base,
|
|
191
|
+
minWidth: 88,
|
|
192
|
+
width: "100%"
|
|
193
|
+
}),
|
|
194
|
+
menuList: (base) => ({
|
|
195
|
+
...base,
|
|
196
|
+
padding: 4
|
|
197
|
+
}),
|
|
198
|
+
option: (base) => ({
|
|
199
|
+
...base,
|
|
200
|
+
fontSize: 12,
|
|
201
|
+
lineHeight: "16px",
|
|
202
|
+
padding: "4px 8px",
|
|
203
|
+
minHeight: 24
|
|
204
|
+
})
|
|
205
|
+
} : {}
|
|
206
|
+
}
|
|
207
|
+
})
|
|
208
|
+
})]
|
|
209
|
+
}),
|
|
210
|
+
status && /* @__PURE__ */ require_jsx_runtime.jsx("small", {
|
|
211
|
+
role: "status",
|
|
212
|
+
style: {
|
|
213
|
+
color: "var(--textColorSecondary)",
|
|
214
|
+
lineHeight: 1.4
|
|
215
|
+
},
|
|
216
|
+
children: status
|
|
217
|
+
})
|
|
218
|
+
]
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
//#endregion
|
|
222
|
+
exports.HISTORY_RANGES = HISTORY_RANGES;
|
|
223
|
+
exports.MonitoringHistoryRange = MonitoringHistoryRange;
|
|
224
|
+
exports.mergeHistorySamples = mergeHistorySamples;
|
|
225
|
+
exports.useMonitoringHistory = useMonitoringHistory;
|
|
226
|
+
|
|
227
|
+
//# sourceMappingURL=monitoring-history-view.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"monitoring-history-view.js","names":[],"sources":["../../src/renderer/monitoring-history-view.tsx"],"sourcesContent":["import { Renderer } from \"@freelensapp/extensions\";\nimport { reaction } from \"mobx\";\nimport { useEffect, useState } from \"react\";\nimport ReactSelect from \"react-select\";\nimport { MonitoringPreferencesStore } from \"../common/store/monitoring-preferences-store\";\nimport { monitoringHistory } from \"./monitoring-history\";\n\nimport type { HistoryIdentity, HistoryPoint } from \"../common/monitoring-history\";\nimport type { MonitoringSample } from \"../common/monitoring-math\";\nexport const HISTORY_RANGES = {\n \"5m\": 300_000,\n \"30m\": 1_800_000,\n \"2h\": 7_200_000,\n \"24h\": 86_400_000,\n \"7d\": 604_800_000,\n} as const;\nexport type HistoryRange = keyof typeof HISTORY_RANGES;\nconst RANGE_LABELS: Record<HistoryRange, string> = {\n \"5m\": \"5 min\",\n \"30m\": \"30 min\",\n \"2h\": \"2 hours\",\n \"24h\": \"24 hours\",\n \"7d\": \"7 days\",\n};\nexport function mergeHistorySamples(\n points: HistoryPoint[],\n live: MonitoringSample[],\n from: number,\n): MonitoringSample[] {\n const buckets = new Map<number, MonitoringSample>();\n for (const point of points) {\n if (point.time < from) continue;\n const sample = buckets.get(point.time) ?? { time: point.time, cpu: NaN, memory: NaN };\n if (point.metric === \"cpu\" || point.metric === \"memory\") {\n sample[point.metric] = point.avg;\n sample.historical ??= {};\n sample.historical[point.metric] = {\n min: point.min,\n max: point.max,\n count: point.count,\n resolution: point.resolution,\n gap: point.gap,\n };\n if (point.gap) sample.breakBefore = true;\n } else if (point.metric !== \"restarts\") {\n const match = /^(cpu|memory)(Requests|Limits|Capacity|Allocatable)$/.exec(point.metric);\n if (match) {\n sample.resources ??= { cpu: {}, memory: {} };\n sample.resources[match[1] as \"cpu\" | \"memory\"][\n match[2].toLowerCase() as \"requests\" | \"limits\" | \"capacity\" | \"allocatable\"\n ] = point.avg;\n }\n }\n if (point.gap) sample.resourceStatus = \"Partial historical bucket; missing samples are gaps\";\n buckets.set(point.time, sample);\n }\n for (const sample of live)\n if (sample.time >= from) {\n for (const point of points)\n if (sample.time >= point.time && sample.time < point.time + point.resolution) buckets.delete(point.time);\n buckets.set(sample.time, sample);\n }\n const samples = [...buckets.values()]\n .filter((sample) => Number.isFinite(sample.cpu) && Number.isFinite(sample.memory))\n .sort((a, b) => a.time - b.time);\n const resolution = (sample: MonitoringSample) =>\n Math.max(sample.historical?.cpu?.resolution ?? 30_000, sample.historical?.memory?.resolution ?? 30_000);\n return samples.map((sample, index) =>\n index > 0 &&\n sample.time - samples[index - 1].time > 1.8 * Math.max(resolution(sample), resolution(samples[index - 1]))\n ? { ...sample, breakBefore: true }\n : sample,\n );\n}\nexport function useMonitoringHistory(identity: HistoryIdentity | undefined, liveSamples: MonitoringSample[]) {\n const preferences = MonitoringPreferencesStore.getInstanceOrCreate<MonitoringPreferencesStore>();\n const [enabled, setEnabled] = useState(preferences.historyEnabled === true);\n useEffect(\n () => reaction(() => preferences.historyEnabled === true, setEnabled, { fireImmediately: true }),\n [preferences],\n );\n const [range, setRange] = useState<HistoryRange>(\"5m\");\n const [points, setPoints] = useState<HistoryPoint[]>([]);\n const [status, setStatus] = useState(\"\");\n const key = identity ? `${identity.clusterId}/${identity.scope}/${identity.uid}` : \"\";\n useEffect(() => {\n let current = true;\n setPoints([]);\n setStatus(\"\");\n if (!identity || !enabled) return;\n const query = () => {\n const to = Date.now();\n void Promise.resolve()\n .then(() => monitoringHistory.query({ ...identity, from: to - HISTORY_RANGES[range] + 1000, to }))\n .then((value) => {\n if (current) {\n setPoints(value);\n setStatus(value.length ? \"\" : \"No local history for this range. Collection starts when enabled.\");\n }\n })\n .catch(() => {\n if (current) setStatus(\"Local history unavailable. Live samples remain visible.\");\n });\n };\n query();\n const timer = window.setInterval(query, 30_000);\n return () => {\n current = false;\n window.clearInterval(timer);\n };\n }, [key, range, enabled]);\n return {\n range,\n setRange,\n samples: mergeHistorySamples(points, liveSamples, Date.now() - HISTORY_RANGES[range]),\n points,\n status,\n };\n}\nexport function MonitoringHistoryRange({\n range,\n onChange,\n native = false,\n status,\n compact = false,\n}: {\n range: HistoryRange;\n onChange: (value: HistoryRange) => void;\n // host [Select] requires injected context unavailable in detached chart roots\n native?: boolean;\n status?: string;\n compact?: boolean;\n}) {\n return (\n <div\n className={compact ? \"power-history-compact\" : undefined}\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"flex-start\",\n gap: 8,\n marginBottom: compact ? 0 : 12,\n }}\n >\n <style>{`\n .power-history-select.Select { min-width: 0; width: 100%; }\n .power-history-select .Select__control { min-height: 32px; }\n .power-history-select .Select__value-container { padding: 6px 10px; }\n .power-history-compact .Select__control { min-height: 26px; height:26px; font-size:12px; }\n .power-history-compact .Select__value-container { padding:4px 8px; }\n .power-history-compact .Select__indicator { padding:3px; }\n .power-history-compact .Select__indicator svg { width:14px;height:14px; }\n `}</style>\n <label\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 12,\n minHeight: compact ? 26 : 32,\n color: \"var(--textColorSecondary)\",\n }}\n >\n {!compact && \"Period\"}\n <span style={{ width: compact ? 88 : 140, position: \"relative\", display: \"inline-flex\", alignItems: \"center\" }}>\n {native ? (\n <Renderer.Component.Select\n className=\"power-history-select\"\n aria-label=\"History range\"\n value={range}\n options={Object.keys(HISTORY_RANGES).map((value) => ({\n value: value as HistoryRange,\n label: RANGE_LABELS[value as HistoryRange],\n }))}\n onChange={(option) => {\n if (option) onChange(option.value);\n }}\n isClearable={false}\n />\n ) : (\n <ReactSelect\n aria-label=\"History range\"\n className=\"Select power-history-select\"\n classNamePrefix=\"Select\"\n unstyled\n isSearchable={false}\n isClearable={false}\n value={{ value: range, label: RANGE_LABELS[range] }}\n options={Object.keys(HISTORY_RANGES).map((value) => ({\n value: value as HistoryRange,\n label: RANGE_LABELS[value as HistoryRange],\n }))}\n onChange={(option) => {\n if (option) onChange(option.value);\n }}\n onKeyDown={(event) => {\n if (event.key === \"Escape\") event.stopPropagation();\n }}\n menuPortalTarget={document.body}\n menuPlacement=\"auto\"\n styles={{\n menuPortal: (base) => ({ ...base, zIndex: 10000 }),\n ...(compact\n ? {\n menu: (base) => ({ ...base, minWidth: 88, width: \"100%\" }),\n menuList: (base) => ({ ...base, padding: 4 }),\n option: (base) => ({\n ...base,\n fontSize: 12,\n lineHeight: \"16px\",\n padding: \"4px 8px\",\n minHeight: 24,\n }),\n }\n : {}),\n }}\n />\n )}\n </span>\n </label>\n {status && (\n <small role=\"status\" style={{ color: \"var(--textColorSecondary)\", lineHeight: 1.4 }}>\n {status}\n </small>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
const require_monitoring_history = require("./src/common/monitoring-history.js");
|
|
2
|
+
let electron = require("electron");
|
|
3
|
+
//#region src/renderer/monitoring-history.ts
|
|
4
|
+
var monitoringHistory = {
|
|
5
|
+
append: (samples) => electron.ipcRenderer.invoke(require_monitoring_history.MONITORING_HISTORY_CHANNEL, {
|
|
6
|
+
operation: "append",
|
|
7
|
+
samples
|
|
8
|
+
}),
|
|
9
|
+
query: (query) => electron.ipcRenderer.invoke(require_monitoring_history.MONITORING_HISTORY_CHANNEL, {
|
|
10
|
+
operation: "query",
|
|
11
|
+
query
|
|
12
|
+
}),
|
|
13
|
+
status: () => electron.ipcRenderer.invoke(require_monitoring_history.MONITORING_HISTORY_CHANNEL, { operation: "status" }),
|
|
14
|
+
clear: () => electron.ipcRenderer.invoke(require_monitoring_history.MONITORING_HISTORY_CHANNEL, { operation: "clear" })
|
|
15
|
+
};
|
|
16
|
+
//#endregion
|
|
17
|
+
exports.monitoringHistory = monitoringHistory;
|
|
18
|
+
|
|
19
|
+
//# sourceMappingURL=monitoring-history.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"monitoring-history.js","names":[],"sources":["../../src/renderer/monitoring-history.ts"],"sourcesContent":["import { ipcRenderer } from \"electron\";\nimport {\n type HistoryPoint,\n type HistoryQuery,\n type HistorySample,\n type HistoryStatus,\n MONITORING_HISTORY_CHANNEL,\n} from \"../common/monitoring-history\";\nexport const monitoringHistory = {\n append: (samples: HistorySample[]): Promise<boolean> =>\n ipcRenderer.invoke(MONITORING_HISTORY_CHANNEL, { operation: \"append\", samples }),\n query: (query: HistoryQuery): Promise<HistoryPoint[]> =>\n ipcRenderer.invoke(MONITORING_HISTORY_CHANNEL, { operation: \"query\", query }),\n status: (): Promise<HistoryStatus> => ipcRenderer.invoke(MONITORING_HISTORY_CHANNEL, { operation: \"status\" }),\n clear: (): Promise<boolean> => ipcRenderer.invoke(MONITORING_HISTORY_CHANNEL, { operation: \"clear\" }),\n};\n"],"mappings":";;;AAQA,IAAa,oBAAoB;CAC/B,SAAS,YACP,SAAA,YAAY,OAAO,2BAAA,4BAA4B;EAAE,WAAW;EAAU;CAAQ,CAAC;CACjF,QAAQ,UACN,SAAA,YAAY,OAAO,2BAAA,4BAA4B;EAAE,WAAW;EAAS;CAAM,CAAC;CAC9E,cAAsC,SAAA,YAAY,OAAO,2BAAA,4BAA4B,EAAE,WAAW,SAAS,CAAC;CAC5G,aAA+B,SAAA,YAAY,OAAO,2BAAA,4BAA4B,EAAE,WAAW,QAAQ,CAAC;AACtG"}
|