@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.
Files changed (224) hide show
  1. package/README.md +9 -4
  2. package/THIRD_PARTY_LICENSES +1707 -0
  3. package/out/main/ai.js +63 -23
  4. package/out/main/ai.js.map +1 -1
  5. package/out/main/cluster-icons-catalog.js +28 -0
  6. package/out/main/cluster-icons-catalog.js.map +1 -0
  7. package/out/main/cluster-icons.js +125 -0
  8. package/out/main/cluster-icons.js.map +1 -0
  9. package/out/main/common/ai-terminal-context.js +51 -0
  10. package/out/main/common/ai-terminal-context.js.map +1 -0
  11. package/out/main/common/ai.js.map +1 -1
  12. package/out/main/common/cluster-icon-ipc.js +6 -0
  13. package/out/main/common/cluster-icon-ipc.js.map +1 -0
  14. package/out/main/common/cluster-icons.js +121 -0
  15. package/out/main/common/cluster-icons.js.map +1 -0
  16. package/out/main/common/dashboard.js +1 -1
  17. package/out/main/common/dashboard.js.map +1 -1
  18. package/out/main/common/monitoring-history.js +52 -0
  19. package/out/main/common/monitoring-history.js.map +1 -0
  20. package/out/main/common/settings-export.js +3 -1
  21. package/out/main/common/settings-export.js.map +1 -1
  22. package/out/main/common/store/cluster-icons-store.js +32 -0
  23. package/out/main/common/store/cluster-icons-store.js.map +1 -0
  24. package/out/main/common/store/monitoring-preferences-store.js +30 -2
  25. package/out/main/common/store/monitoring-preferences-store.js.map +1 -1
  26. package/out/main/dashboard-views.js +132 -28
  27. package/out/main/dashboard-views.js.map +1 -1
  28. package/out/main/diagnostics-menu-order.js +57 -0
  29. package/out/main/diagnostics-menu-order.js.map +1 -0
  30. package/out/main/index.js +11 -1
  31. package/out/main/index.js.map +1 -1
  32. package/out/main/monitoring-history-database.js +103 -0
  33. package/out/main/monitoring-history-database.js.map +1 -0
  34. package/out/main/monitoring-history-worker.js +61 -0
  35. package/out/main/monitoring-history-worker.js.map +1 -0
  36. package/out/main/monitoring-history.js +110 -0
  37. package/out/main/monitoring-history.js.map +1 -0
  38. package/out/renderer/_virtual/_global-external_mobx.js +2 -1
  39. package/out/renderer/_virtual/_global-external_react-dom.js +2 -1
  40. package/out/renderer/_virtual/_global-external_react.js +10 -5
  41. package/out/renderer/_virtual/_rolldown/runtime.js +22 -0
  42. package/out/renderer/ai-terminal-context.js +200 -0
  43. package/out/renderer/ai-terminal-context.js.map +1 -0
  44. package/out/renderer/ai.js +90 -9
  45. package/out/renderer/ai.js.map +1 -1
  46. package/out/renderer/appearance.js +1 -0
  47. package/out/renderer/appearance.js.map +1 -1
  48. package/out/renderer/cluster-icon-colors.js +188 -0
  49. package/out/renderer/cluster-icon-colors.js.map +1 -0
  50. package/out/renderer/cluster-icons.js +304 -0
  51. package/out/renderer/cluster-icons.js.map +1 -0
  52. package/out/renderer/dashboard.js +8 -5
  53. package/out/renderer/dashboard.js.map +1 -1
  54. package/out/renderer/details/secret-certificate-details.js +9 -2
  55. package/out/renderer/details/secret-certificate-details.js.map +1 -1
  56. package/out/renderer/diagnostics.css.js +39 -0
  57. package/out/renderer/diagnostics.css.js.map +1 -0
  58. package/out/renderer/diagnostics.js +1100 -0
  59. package/out/renderer/diagnostics.js.map +1 -0
  60. package/out/renderer/index.js +32 -0
  61. package/out/renderer/index.js.map +1 -1
  62. package/out/renderer/monitoring-collector.js +202 -0
  63. package/out/renderer/monitoring-collector.js.map +1 -0
  64. package/out/renderer/monitoring-details-chart.js +42 -0
  65. package/out/renderer/monitoring-details-chart.js.map +1 -0
  66. package/out/renderer/monitoring-history-collection.js +168 -0
  67. package/out/renderer/monitoring-history-collection.js.map +1 -0
  68. package/out/renderer/monitoring-history-view.js +227 -0
  69. package/out/renderer/monitoring-history-view.js.map +1 -0
  70. package/out/renderer/monitoring-history.js +19 -0
  71. package/out/renderer/monitoring-history.js.map +1 -0
  72. package/out/renderer/monitoring.js +153 -139
  73. package/out/renderer/monitoring.js.map +1 -1
  74. package/out/renderer/node-monitoring.js +127 -0
  75. package/out/renderer/node-monitoring.js.map +1 -0
  76. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js +10 -0
  77. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js.map +1 -0
  78. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js +8 -0
  79. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js.map +1 -0
  80. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js +9 -0
  81. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js.map +1 -0
  82. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js +9 -0
  83. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js.map +1 -0
  84. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/classCallCheck.js +8 -0
  85. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/classCallCheck.js.map +1 -0
  86. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/createClass.js +15 -0
  87. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/createClass.js.map +1 -0
  88. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/createSuper.js +19 -0
  89. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/createSuper.js.map +1 -0
  90. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/defineProperty.js +14 -0
  91. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/defineProperty.js.map +1 -0
  92. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/extends.js +19 -0
  93. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/extends.js.map +1 -0
  94. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js +15 -0
  95. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js.map +1 -0
  96. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/inherits.js +14 -0
  97. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/inherits.js.map +1 -0
  98. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/isNativeReflectConstruct.js +18 -0
  99. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/isNativeReflectConstruct.js.map +1 -0
  100. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/iterableToArray.js +8 -0
  101. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/iterableToArray.js.map +1 -0
  102. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js +26 -0
  103. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js.map +1 -0
  104. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/nonIterableRest.js +8 -0
  105. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/nonIterableRest.js.map +1 -0
  106. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js +8 -0
  107. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js.map +1 -0
  108. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/objectSpread2.js +27 -0
  109. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/objectSpread2.js.map +1 -0
  110. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js +15 -0
  111. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js.map +1 -0
  112. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js +14 -0
  113. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js.map +1 -0
  114. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js +12 -0
  115. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js.map +1 -0
  116. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js +15 -0
  117. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js.map +1 -0
  118. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/slicedToArray.js +12 -0
  119. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/slicedToArray.js.map +1 -0
  120. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/taggedTemplateLiteral.js +8 -0
  121. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/taggedTemplateLiteral.js.map +1 -0
  122. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/toConsumableArray.js +12 -0
  123. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/toConsumableArray.js.map +1 -0
  124. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/toPrimitive.js +16 -0
  125. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/toPrimitive.js.map +1 -0
  126. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/toPropertyKey.js +11 -0
  127. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/toPropertyKey.js.map +1 -0
  128. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/typeof.js +18 -0
  129. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/typeof.js.map +1 -0
  130. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js +13 -0
  131. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js.map +1 -0
  132. package/out/renderer/node_modules/.pnpm/@emotion_cache@11.14.0/node_modules/@emotion/cache/dist/emotion-cache.browser.esm.js +237 -0
  133. package/out/renderer/node_modules/.pnpm/@emotion_cache@11.14.0/node_modules/@emotion/cache/dist/emotion-cache.browser.esm.js.map +1 -0
  134. package/out/renderer/node_modules/.pnpm/@emotion_hash@0.9.2/node_modules/@emotion/hash/dist/emotion-hash.esm.js +25 -0
  135. package/out/renderer/node_modules/.pnpm/@emotion_hash@0.9.2/node_modules/@emotion/hash/dist/emotion-hash.esm.js.map +1 -0
  136. package/out/renderer/node_modules/.pnpm/@emotion_memoize@0.9.0/node_modules/@emotion/memoize/dist/emotion-memoize.esm.js +12 -0
  137. package/out/renderer/node_modules/.pnpm/@emotion_memoize@0.9.0/node_modules/@emotion/memoize/dist/emotion-memoize.esm.js.map +1 -0
  138. 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
  139. 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
  140. 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
  141. 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
  142. package/out/renderer/node_modules/.pnpm/@emotion_serialize@1.3.3/node_modules/@emotion/serialize/dist/emotion-serialize.esm.js +133 -0
  143. package/out/renderer/node_modules/.pnpm/@emotion_serialize@1.3.3/node_modules/@emotion/serialize/dist/emotion-serialize.esm.js.map +1 -0
  144. package/out/renderer/node_modules/.pnpm/@emotion_sheet@1.4.0/node_modules/@emotion/sheet/dist/emotion-sheet.esm.js +65 -0
  145. package/out/renderer/node_modules/.pnpm/@emotion_sheet@1.4.0/node_modules/@emotion/sheet/dist/emotion-sheet.esm.js.map +1 -0
  146. package/out/renderer/node_modules/.pnpm/@emotion_unitless@0.10.0/node_modules/@emotion/unitless/dist/emotion-unitless.esm.js +54 -0
  147. package/out/renderer/node_modules/.pnpm/@emotion_unitless@0.10.0/node_modules/@emotion/unitless/dist/emotion-unitless.esm.js.map +1 -0
  148. 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
  149. 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
  150. package/out/renderer/node_modules/.pnpm/@emotion_utils@1.4.2/node_modules/@emotion/utils/dist/emotion-utils.browser.esm.js +30 -0
  151. package/out/renderer/node_modules/.pnpm/@emotion_utils@1.4.2/node_modules/@emotion/utils/dist/emotion-utils.browser.esm.js.map +1 -0
  152. package/out/renderer/node_modules/.pnpm/@floating-ui_dom@1.7.2/node_modules/@floating-ui/dom/dist/floating-ui.dom.js +211 -0
  153. 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
  154. 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
  155. 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
  156. package/out/renderer/node_modules/.pnpm/@floating-ui_utils@0.2.10/node_modules/@floating-ui/utils/dist/floating-ui.utils.js +31 -0
  157. 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
  158. 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
  159. 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
  160. package/out/renderer/node_modules/.pnpm/memoize-one@6.0.0/node_modules/memoize-one/dist/memoize-one.esm.js +38 -0
  161. package/out/renderer/node_modules/.pnpm/memoize-one@6.0.0/node_modules/memoize-one/dist/memoize-one.esm.js.map +1 -0
  162. package/out/renderer/node_modules/.pnpm/react-is@16.13.1/node_modules/react-is/cjs/react-is.development.js +159 -0
  163. package/out/renderer/node_modules/.pnpm/react-is@16.13.1/node_modules/react-is/cjs/react-is.development.js.map +1 -0
  164. package/out/renderer/node_modules/.pnpm/react-is@16.13.1/node_modules/react-is/cjs/react-is.production.min.js +103 -0
  165. package/out/renderer/node_modules/.pnpm/react-is@16.13.1/node_modules/react-is/cjs/react-is.production.min.js.map +1 -0
  166. package/out/renderer/node_modules/.pnpm/react-is@16.13.1/node_modules/react-is/index.js +18 -0
  167. package/out/renderer/node_modules/.pnpm/react-is@16.13.1/node_modules/react-is/index.js.map +1 -0
  168. 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
  169. 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
  170. 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
  171. 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
  172. 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
  173. 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
  174. 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
  175. 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
  176. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Enum.js +22 -0
  177. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Enum.js.map +1 -0
  178. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Middleware.js +30 -0
  179. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Middleware.js.map +1 -0
  180. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Parser.js +164 -0
  181. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Parser.js.map +1 -0
  182. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Serializer.js +37 -0
  183. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Serializer.js.map +1 -0
  184. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Tokenizer.js +245 -0
  185. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Tokenizer.js.map +1 -0
  186. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Utility.js +120 -0
  187. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Utility.js.map +1 -0
  188. 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
  189. 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
  190. package/out/renderer/pod-monitoring.js +38 -11
  191. package/out/renderer/pod-monitoring.js.map +1 -1
  192. package/out/renderer/preferences/ai-shortcuts-preferences.js +12 -4
  193. package/out/renderer/preferences/ai-shortcuts-preferences.js.map +1 -1
  194. package/out/renderer/preferences/dashboard-preferences.js +20 -4
  195. package/out/renderer/preferences/dashboard-preferences.js.map +1 -1
  196. package/out/renderer/preferences/monitoring-preferences.js +141 -9
  197. package/out/renderer/preferences/monitoring-preferences.js.map +1 -1
  198. package/out/renderer/preferences/preferences.js +31 -7
  199. package/out/renderer/preferences/preferences.js.map +1 -1
  200. package/out/renderer/read-only.js +2 -2
  201. package/out/renderer/read-only.js.map +1 -1
  202. package/out/renderer/src/common/ai-terminal-context.js +51 -0
  203. package/out/renderer/src/common/ai-terminal-context.js.map +1 -0
  204. package/out/renderer/src/common/ai.js.map +1 -1
  205. package/out/renderer/src/common/cluster-icon-ipc.js +6 -0
  206. package/out/renderer/src/common/cluster-icon-ipc.js.map +1 -0
  207. package/out/renderer/src/common/cluster-icons.js +133 -0
  208. package/out/renderer/src/common/cluster-icons.js.map +1 -0
  209. package/out/renderer/src/common/dashboard.js +1 -1
  210. package/out/renderer/src/common/dashboard.js.map +1 -1
  211. package/out/renderer/src/common/date-time.js +11 -0
  212. package/out/renderer/src/common/date-time.js.map +1 -0
  213. package/out/renderer/src/common/monitoring-history.js +17 -0
  214. package/out/renderer/src/common/monitoring-history.js.map +1 -0
  215. package/out/renderer/src/common/monitoring-math.js +98 -0
  216. package/out/renderer/src/common/monitoring-math.js.map +1 -0
  217. package/out/renderer/src/common/resource-diagnostics.js +227 -0
  218. package/out/renderer/src/common/resource-diagnostics.js.map +1 -0
  219. package/out/renderer/src/common/settings-export.js.map +1 -1
  220. package/out/renderer/src/common/store/monitoring-preferences-store.js +30 -2
  221. package/out/renderer/src/common/store/monitoring-preferences-store.js.map +1 -1
  222. package/out/renderer/welcome.js +31 -7
  223. package/out/renderer/welcome.js.map +1 -1
  224. package/package.json +3 -2
@@ -1 +1 @@
1
- {"version":3,"file":"ai.js","names":[],"sources":["../../../src/common/ai.ts"],"sourcesContent":["import type { AiResourceReference } from \"./ai-extras\";\n\nexport type AiProvider = \"codex\" | \"claude\";\n\nexport interface AiReadActivity {\n method: \"pods\" | \"nodes\" | \"resources\" | \"logs\";\n status: \"ok\" | \"unavailable\";\n}\n\nexport interface AiChatMessage {\n role: \"user\" | \"assistant\";\n text: string;\n}\n\nexport interface AiChatRequest {\n provider?: AiProvider;\n requestId?: string;\n messages: AiChatMessage[];\n context: {\n clusterId?: string;\n screen?: string;\n resource?: { kind?: string; namespace?: string; name?: string };\n };\n systemPrompt?: string;\n reasoningEffort?: string;\n model: string;\n speed: \"default\" | \"fast\";\n}\n\nexport interface AiChatResponse {\n references?: AiResourceReference[];\n provider?: AiProvider;\n text: string;\n reads?: AiReadActivity[];\n}\n\nexport const AI_CHAT_CHANNEL = \"freelens-power:ai-chat\";\n\nexport type AiFailureCode =\n | \"CLI_FAILURE\"\n | \"INVALID_REPLY\"\n | \"READ_LIMIT\"\n | \"TIMEOUT\"\n | \"CANCELLED\"\n | \"INPUT_LIMIT\"\n | \"UNAVAILABLE\"\n | \"UNSAFE_POLICY\";\n\nexport interface AiReadActivityEvent {\n requestId: string;\n method: AiReadActivity[\"method\"];\n status: \"reading\" | \"ok\" | \"unavailable\";\n}\n\nexport const AI_READ_ACTIVITY_CHANNEL = \"freelens-power:ai-read-activity\";\n\nexport function validAiRequestId(value: unknown): value is string {\n return typeof value === \"string\" && /^[a-zA-Z0-9_-]{1,100}$/.test(value);\n}\n"],"mappings":";AAoCA,IAAa,kBAAkB;AAkB/B,IAAa,2BAA2B;AAExC,SAAgB,iBAAiB,OAAiC;CAChE,OAAO,OAAO,UAAU,YAAY,yBAAyB,KAAK,KAAK;AACzE"}
1
+ {"version":3,"file":"ai.js","names":[],"sources":["../../../src/common/ai.ts"],"sourcesContent":["import type { AiResourceReference } from \"./ai-extras\";\n\nexport type AiProvider = \"codex\" | \"claude\";\n\nexport interface AiReadActivity {\n method: \"pods\" | \"nodes\" | \"resources\" | \"logs\";\n status: \"ok\" | \"unavailable\";\n}\n\nexport interface AiChatMessage {\n role: \"user\" | \"assistant\";\n text: string;\n}\n\nexport interface AiChatRequest {\n provider?: AiProvider;\n terminalSnapshot?: import(\"./ai-terminal-context\").AiTerminalSnapshot;\n requestId?: string;\n messages: AiChatMessage[];\n context: {\n clusterId?: string;\n screen?: string;\n resource?: { kind?: string; namespace?: string; name?: string };\n };\n systemPrompt?: string;\n reasoningEffort?: string;\n model: string;\n speed: \"default\" | \"fast\";\n}\n\nexport interface AiChatResponse {\n references?: AiResourceReference[];\n provider?: AiProvider;\n text: string;\n reads?: AiReadActivity[];\n}\n\nexport const AI_CHAT_CHANNEL = \"freelens-power:ai-chat\";\n\nexport type AiFailureCode =\n | \"CLI_FAILURE\"\n | \"INVALID_REPLY\"\n | \"READ_LIMIT\"\n | \"TIMEOUT\"\n | \"CANCELLED\"\n | \"INPUT_LIMIT\"\n | \"UNAVAILABLE\"\n | \"UNSAFE_POLICY\";\n\nexport interface AiReadActivityEvent {\n requestId: string;\n method: AiReadActivity[\"method\"];\n status: \"reading\" | \"ok\" | \"unavailable\";\n}\n\nexport const AI_READ_ACTIVITY_CHANNEL = \"freelens-power:ai-read-activity\";\n\nexport function validAiRequestId(value: unknown): value is string {\n return typeof value === \"string\" && /^[a-zA-Z0-9_-]{1,100}$/.test(value);\n}\n"],"mappings":";AAqCA,IAAa,kBAAkB;AAkB/B,IAAa,2BAA2B;AAExC,SAAgB,iBAAiB,OAAiC;CAChE,OAAO,OAAO,UAAU,YAAY,yBAAyB,KAAK,KAAK;AACzE"}
@@ -0,0 +1,6 @@
1
+ //#region src/common/cluster-icon-ipc.ts
2
+ var CLUSTER_ICONS_CHANNEL = "freelens-power:cluster-icons";
3
+ //#endregion
4
+ exports.CLUSTER_ICONS_CHANNEL = CLUSTER_ICONS_CHANNEL;
5
+
6
+ //# sourceMappingURL=cluster-icon-ipc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cluster-icon-ipc.js","names":[],"sources":["../../../src/common/cluster-icon-ipc.ts"],"sourcesContent":["import type { ClusterIconDesign } from \"./cluster-icons\";\n\nexport const CLUSTER_ICONS_CHANNEL = \"freelens-power:cluster-icons\";\n\nexport interface ClusterIconEntry {\n id: string;\n name: string;\n icon?: string;\n design?: ClusterIconDesign;\n customized: boolean;\n}\n\nexport type ClusterIconRequest = { operation: \"list\" } | { operation: \"apply\"; id: string; design: ClusterIconDesign };\n"],"mappings":";AAEA,IAAa,wBAAwB"}
@@ -0,0 +1,121 @@
1
+ //#region src/common/cluster-icons.ts
2
+ var GLYPHS = Object.freeze([
3
+ Object.freeze({
4
+ id: "window",
5
+ label: "Window",
6
+ body: "<g transform=\"translate(32 11.4) scale(1.168000000) translate(-32 -14)\" stroke-width=\"2.397260274\"><rect x=\"16\" y=\"14\" width=\"32\" height=\"25\" rx=\"4\"/><path d=\"M16 22h32M23 18h.1M28 18h.1M24 28l-4 3 4 3M35 28h7M35 34h5\"/></g>"
7
+ }),
8
+ Object.freeze({
9
+ id: "server",
10
+ label: "Server",
11
+ body: "<g transform=\"translate(32 11.4) scale(1.006896552) translate(-32 -13)\" stroke-width=\"2.780821917\"><rect x=\"17\" y=\"13\" width=\"30\" height=\"12\" rx=\"4\"/><rect x=\"17\" y=\"30\" width=\"30\" height=\"12\" rx=\"4\"/><path d=\"M23 19h.1M23 36h.1M32 19h8M32 36h8\"/></g>"
12
+ }),
13
+ Object.freeze({
14
+ id: "database",
15
+ label: "Database",
16
+ body: "<g transform=\"translate(32 11.4) scale(0.941935484) translate(-32 -11)\" stroke-width=\"2.972602739\"><ellipse cx=\"32\" cy=\"17\" rx=\"15\" ry=\"6\"/><path d=\"M17 17v19c0 8 30 8 30 0V17M17 26c0 8 30 8 30 0\"/></g>"
17
+ }),
18
+ Object.freeze({
19
+ id: "briefcase",
20
+ label: "Briefcase",
21
+ body: "<g transform=\"translate(32 11.4) scale(0.973333333) translate(-32 -13)\" stroke-width=\"2.876712330\"><rect x=\"14\" y=\"20\" width=\"36\" height=\"23\" rx=\"4\"/><path d=\"M25 20v-5a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2v5M14 28c10 7 26 7 36 0\"/><rect x=\"29\" y=\"29\" width=\"6\" height=\"7\" rx=\"1.5\" fill=\"#292d38\"/></g>"
22
+ }),
23
+ Object.freeze({
24
+ id: "sailboat",
25
+ label: "Sailboat",
26
+ body: "<g transform=\"translate(32 11.4) scale(0.834285714) translate(-32 -11)\" stroke-width=\"3.356164385\"><path d=\"M31 11v23H17zM36 18l11 16H36zM13 39h38l-7 7H21z\"/></g>"
27
+ }),
28
+ Object.freeze({
29
+ id: "network",
30
+ label: "Network",
31
+ body: "<g transform=\"translate(32 11.4) scale(0.768421053) translate(-32 -7)\" stroke-width=\"3.643835615\"><circle cx=\"32\" cy=\"26\" r=\"7\"/><path d=\"M32 13v6M32 33v6M19 26h6M39 26h6\"/><circle cx=\"32\" cy=\"10\" r=\"3\"/><circle cx=\"32\" cy=\"42\" r=\"3\"/><circle cx=\"16\" cy=\"26\" r=\"3\"/><circle cx=\"48\" cy=\"26\" r=\"3\"/></g>"
32
+ }),
33
+ Object.freeze({
34
+ id: "box",
35
+ label: "Box",
36
+ body: "<g transform=\"translate(32 11.4) scale(0.834285714) translate(-32 -11)\" stroke-width=\"3.356164385\"><path d=\"M32 11l17 10v17L32 46 15 38V21zM15 21l17 9 17-9M32 30v16\"/></g>"
37
+ }),
38
+ Object.freeze({
39
+ id: "blocks",
40
+ label: "Blocks",
41
+ body: "<rect x=\"17\" y=\"11.4\" width=\"10\" height=\"9\" rx=\"1.6\"/><rect x=\"37\" y=\"11.4\" width=\"10\" height=\"9\" rx=\"1.6\"/><rect x=\"27\" y=\"31.6\" width=\"10\" height=\"9\" rx=\"1.6\"/><path d=\"M22 20.4V26h20v-5.6M32 26v5.6\"/>"
42
+ }),
43
+ Object.freeze({
44
+ id: "git-branch",
45
+ label: "Git branch",
46
+ body: "<g transform=\"translate(32 11.4) scale(0.973333333) translate(-32 -12)\" stroke-width=\"2.876712330\"><circle cx=\"22\" cy=\"16\" r=\"4\"/><circle cx=\"42\" cy=\"16\" r=\"4\"/><circle cx=\"22\" cy=\"38\" r=\"4\"/><path d=\"M22 20v14M42 20c0 10-20 3-20 13\"/></g>"
47
+ }),
48
+ Object.freeze({
49
+ id: "cloud",
50
+ label: "Cloud",
51
+ body: "<path d=\"M22 40.6c-6 0-10-4-10-10 0-5 3-9 8-10 0-5 5-9.2 12-9.2s12 5 12 12c5 0 8 4 8 9 0 5-4 8.2-9 8.2z\"/>"
52
+ }),
53
+ Object.freeze({
54
+ id: "cpu",
55
+ label: "CPU",
56
+ body: "<rect x=\"21\" y=\"15\" width=\"22\" height=\"22\" rx=\"4\"/><rect x=\"27\" y=\"21\" width=\"10\" height=\"10\" rx=\"1\"/><path d=\"M26 11.4V15M32 11.4V15M38 11.4V15M26 37v3.6M32 37v3.6M38 37v3.6M17.4 20H21M17.4 26H21M17.4 32H21M43 20h3.6M43 26h3.6M43 32h3.6\"/>"
57
+ }),
58
+ Object.freeze({
59
+ id: "shield",
60
+ label: "Shield",
61
+ body: "<path d=\"M32 11.4l13 5v10c0 7-6 12-13 14.2C25 38.4 19 33.4 19 26.4v-10zM25 26l5 5 9-10\"/>"
62
+ }),
63
+ Object.freeze({
64
+ id: "globe",
65
+ label: "Globe",
66
+ body: "<circle cx=\"32\" cy=\"26\" r=\"14.6\"/><ellipse cx=\"32\" cy=\"26\" rx=\"6.5\" ry=\"14.6\"/><path d=\"M17.4 26h29.2M20.2 17.5h23.6M20.2 34.5h23.6\"/>"
67
+ }),
68
+ Object.freeze({
69
+ id: "key",
70
+ label: "Key",
71
+ body: "<g transform=\"translate(32 11.4) scale(1.39047619) translate(-12.5 -1)\" stroke-width=\"2.01369863\"><path d=\"M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z\"/><circle cx=\"16.5\" cy=\"7.5\" r=\".5\" stroke-width=\"1\"/></g>"
72
+ }),
73
+ Object.freeze({
74
+ id: "rocket",
75
+ label: "Rocket",
76
+ body: "<g transform=\"translate(32 11.4) scale(1.497435897) translate(-12.25 -2)\" stroke-width=\"1.869863014\"><path d=\"M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09M9 12a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.4 22.4 0 0 1-4 2zM9 12H4s.55-3.03 2-4c1.62-1.08 5 .05 5 .05\"/></g>"
77
+ })
78
+ ]);
79
+ var COLOR = /^#[\da-f]{6}$/i;
80
+ var LABEL = /^[\p{L}\p{N}\p{M}\p{P}\p{S} ]*$/u;
81
+ function normalizeClusterIconDesign(input) {
82
+ if (!input || typeof input !== "object" || Array.isArray(input)) throw new Error("Invalid cluster icon design");
83
+ const value = input;
84
+ if (typeof value.label !== "string" || !LABEL.test(value.label)) throw new Error("Use up to three visible characters for the label");
85
+ const label = value.label.normalize("NFC").trim();
86
+ if (Array.from(label).length > 3) throw new Error("Use up to three visible characters for the label");
87
+ if (typeof value.glyph !== "string" || !GLYPHS.some((glyph) => glyph.id === value.glyph)) throw new Error("Choose an available cluster icon");
88
+ for (const key of [
89
+ "outlineColor",
90
+ "labelColor",
91
+ "iconColor"
92
+ ]) if (typeof value[key] !== "string" || !COLOR.test(value[key])) throw new Error("Use a six-digit hexadecimal color");
93
+ return {
94
+ label,
95
+ glyph: value.glyph,
96
+ outlineColor: value.outlineColor.toLowerCase(),
97
+ labelColor: value.labelColor.toLowerCase(),
98
+ iconColor: value.iconColor.toLowerCase()
99
+ };
100
+ }
101
+ function escapeXml(text) {
102
+ return text.replace(/[&<>"']/g, (character) => ({
103
+ "&": "&amp;",
104
+ "<": "&lt;",
105
+ ">": "&gt;",
106
+ "\"": "&quot;",
107
+ "'": "&apos;"
108
+ })[character]);
109
+ }
110
+ function clusterIconDataUrl(input) {
111
+ const design = normalizeClusterIconDesign(input);
112
+ const glyph = GLYPHS.find((candidate) => candidate.id === design.glyph);
113
+ const svg = `<svg xmlns="http://www.w3.org/2000/svg" width="256" height="256" viewBox="0 0 64 64"><rect x="2" y="2" width="60" height="60" rx="15" fill="#292d38" stroke="${design.outlineColor}" stroke-width="3"/><g fill="none" stroke="${design.iconColor}" stroke-width="2.8" stroke-linecap="round" stroke-linejoin="round">${glyph.body}</g><rect x="15" y="46" width="34" height="12" rx="6" fill="${design.labelColor}"/><text x="32" y="55.2" text-anchor="middle" font-family="Helvetica,Arial,sans-serif" font-size="9.5" font-weight="800" fill="#292d38">${escapeXml(design.label)}</text></svg>`;
114
+ return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg)}`;
115
+ }
116
+ //#endregion
117
+ exports.GLYPHS = GLYPHS;
118
+ exports.clusterIconDataUrl = clusterIconDataUrl;
119
+ exports.normalizeClusterIconDesign = normalizeClusterIconDesign;
120
+
121
+ //# sourceMappingURL=cluster-icons.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cluster-icons.js","names":[],"sources":["../../../src/common/cluster-icons.ts"],"sourcesContent":["export interface ClusterIconDesign {\n label: string;\n outlineColor: string;\n labelColor: string;\n glyph: string;\n iconColor: string;\n}\n\n// glyphs share the reference fitting, with Lucide contours for [key] and [rocket]\nexport const GLYPHS = Object.freeze([\n Object.freeze({\n id: \"window\",\n label: \"Window\",\n body: '<g transform=\"translate(32 11.4) scale(1.168000000) translate(-32 -14)\" stroke-width=\"2.397260274\"><rect x=\"16\" y=\"14\" width=\"32\" height=\"25\" rx=\"4\"/><path d=\"M16 22h32M23 18h.1M28 18h.1M24 28l-4 3 4 3M35 28h7M35 34h5\"/></g>',\n }),\n Object.freeze({\n id: \"server\",\n label: \"Server\",\n body: '<g transform=\"translate(32 11.4) scale(1.006896552) translate(-32 -13)\" stroke-width=\"2.780821917\"><rect x=\"17\" y=\"13\" width=\"30\" height=\"12\" rx=\"4\"/><rect x=\"17\" y=\"30\" width=\"30\" height=\"12\" rx=\"4\"/><path d=\"M23 19h.1M23 36h.1M32 19h8M32 36h8\"/></g>',\n }),\n Object.freeze({\n id: \"database\",\n label: \"Database\",\n body: '<g transform=\"translate(32 11.4) scale(0.941935484) translate(-32 -11)\" stroke-width=\"2.972602739\"><ellipse cx=\"32\" cy=\"17\" rx=\"15\" ry=\"6\"/><path d=\"M17 17v19c0 8 30 8 30 0V17M17 26c0 8 30 8 30 0\"/></g>',\n }),\n Object.freeze({\n id: \"briefcase\",\n label: \"Briefcase\",\n body: '<g transform=\"translate(32 11.4) scale(0.973333333) translate(-32 -13)\" stroke-width=\"2.876712330\"><rect x=\"14\" y=\"20\" width=\"36\" height=\"23\" rx=\"4\"/><path d=\"M25 20v-5a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2v5M14 28c10 7 26 7 36 0\"/><rect x=\"29\" y=\"29\" width=\"6\" height=\"7\" rx=\"1.5\" fill=\"#292d38\"/></g>',\n }),\n Object.freeze({\n id: \"sailboat\",\n label: \"Sailboat\",\n body: '<g transform=\"translate(32 11.4) scale(0.834285714) translate(-32 -11)\" stroke-width=\"3.356164385\"><path d=\"M31 11v23H17zM36 18l11 16H36zM13 39h38l-7 7H21z\"/></g>',\n }),\n Object.freeze({\n id: \"network\",\n label: \"Network\",\n body: '<g transform=\"translate(32 11.4) scale(0.768421053) translate(-32 -7)\" stroke-width=\"3.643835615\"><circle cx=\"32\" cy=\"26\" r=\"7\"/><path d=\"M32 13v6M32 33v6M19 26h6M39 26h6\"/><circle cx=\"32\" cy=\"10\" r=\"3\"/><circle cx=\"32\" cy=\"42\" r=\"3\"/><circle cx=\"16\" cy=\"26\" r=\"3\"/><circle cx=\"48\" cy=\"26\" r=\"3\"/></g>',\n }),\n Object.freeze({\n id: \"box\",\n label: \"Box\",\n body: '<g transform=\"translate(32 11.4) scale(0.834285714) translate(-32 -11)\" stroke-width=\"3.356164385\"><path d=\"M32 11l17 10v17L32 46 15 38V21zM15 21l17 9 17-9M32 30v16\"/></g>',\n }),\n Object.freeze({\n id: \"blocks\",\n label: \"Blocks\",\n body: '<rect x=\"17\" y=\"11.4\" width=\"10\" height=\"9\" rx=\"1.6\"/><rect x=\"37\" y=\"11.4\" width=\"10\" height=\"9\" rx=\"1.6\"/><rect x=\"27\" y=\"31.6\" width=\"10\" height=\"9\" rx=\"1.6\"/><path d=\"M22 20.4V26h20v-5.6M32 26v5.6\"/>',\n }),\n Object.freeze({\n id: \"git-branch\",\n label: \"Git branch\",\n body: '<g transform=\"translate(32 11.4) scale(0.973333333) translate(-32 -12)\" stroke-width=\"2.876712330\"><circle cx=\"22\" cy=\"16\" r=\"4\"/><circle cx=\"42\" cy=\"16\" r=\"4\"/><circle cx=\"22\" cy=\"38\" r=\"4\"/><path d=\"M22 20v14M42 20c0 10-20 3-20 13\"/></g>',\n }),\n Object.freeze({\n id: \"cloud\",\n label: \"Cloud\",\n body: '<path d=\"M22 40.6c-6 0-10-4-10-10 0-5 3-9 8-10 0-5 5-9.2 12-9.2s12 5 12 12c5 0 8 4 8 9 0 5-4 8.2-9 8.2z\"/>',\n }),\n Object.freeze({\n id: \"cpu\",\n label: \"CPU\",\n body: '<rect x=\"21\" y=\"15\" width=\"22\" height=\"22\" rx=\"4\"/><rect x=\"27\" y=\"21\" width=\"10\" height=\"10\" rx=\"1\"/><path d=\"M26 11.4V15M32 11.4V15M38 11.4V15M26 37v3.6M32 37v3.6M38 37v3.6M17.4 20H21M17.4 26H21M17.4 32H21M43 20h3.6M43 26h3.6M43 32h3.6\"/>',\n }),\n Object.freeze({\n id: \"shield\",\n label: \"Shield\",\n body: '<path d=\"M32 11.4l13 5v10c0 7-6 12-13 14.2C25 38.4 19 33.4 19 26.4v-10zM25 26l5 5 9-10\"/>',\n }),\n Object.freeze({\n id: \"globe\",\n label: \"Globe\",\n body: '<circle cx=\"32\" cy=\"26\" r=\"14.6\"/><ellipse cx=\"32\" cy=\"26\" rx=\"6.5\" ry=\"14.6\"/><path d=\"M17.4 26h29.2M20.2 17.5h23.6M20.2 34.5h23.6\"/>',\n }),\n Object.freeze({\n id: \"key\",\n label: \"Key\",\n body: '<g transform=\"translate(32 11.4) scale(1.39047619) translate(-12.5 -1)\" stroke-width=\"2.01369863\"><path d=\"M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z\"/><circle cx=\"16.5\" cy=\"7.5\" r=\".5\" stroke-width=\"1\"/></g>',\n }),\n Object.freeze({\n id: \"rocket\",\n label: \"Rocket\",\n body: '<g transform=\"translate(32 11.4) scale(1.497435897) translate(-12.25 -2)\" stroke-width=\"1.869863014\"><path d=\"M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09M9 12a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.4 22.4 0 0 1-4 2zM9 12H4s.55-3.03 2-4c1.62-1.08 5 .05 5 .05\"/></g>',\n }),\n]);\nconst COLOR = /^#[\\da-f]{6}$/i;\nconst LABEL = /^[\\p{L}\\p{N}\\p{M}\\p{P}\\p{S} ]*$/u;\n\nexport function normalizeClusterIconDesign(input: unknown): ClusterIconDesign {\n if (!input || typeof input !== \"object\" || Array.isArray(input)) {\n throw new Error(\"Invalid cluster icon design\");\n }\n const value = input as Record<string, unknown>;\n if (typeof value.label !== \"string\" || !LABEL.test(value.label)) {\n throw new Error(\"Use up to three visible characters for the label\");\n }\n const label = value.label.normalize(\"NFC\").trim();\n if (Array.from(label).length > 3) {\n throw new Error(\"Use up to three visible characters for the label\");\n }\n if (typeof value.glyph !== \"string\" || !GLYPHS.some((glyph) => glyph.id === value.glyph)) {\n throw new Error(\"Choose an available cluster icon\");\n }\n const colors = [\"outlineColor\", \"labelColor\", \"iconColor\"] as const;\n for (const key of colors) {\n if (typeof value[key] !== \"string\" || !COLOR.test(value[key] as string)) {\n throw new Error(\"Use a six-digit hexadecimal color\");\n }\n }\n return {\n label,\n glyph: value.glyph,\n outlineColor: (value.outlineColor as string).toLowerCase(),\n labelColor: (value.labelColor as string).toLowerCase(),\n iconColor: (value.iconColor as string).toLowerCase(),\n };\n}\n\nexport function defaultClusterIconDesign(name: string): ClusterIconDesign {\n const words = name.normalize(\"NFC\").match(/[\\p{L}\\p{N}][\\p{L}\\p{N}\\p{M}]*/gu) ?? [];\n const abbreviation = words.length > 1 ? words.map((word) => Array.from(word)[0]).join(\"\") : (words[0] ?? \"K8S\");\n return {\n label: Array.from(abbreviation.toUpperCase()).slice(0, 3).join(\"\"),\n outlineColor: \"#b49aff\",\n labelColor: \"#b49aff\",\n glyph: \"network\",\n iconColor: \"#b49aff\",\n };\n}\n\nfunction escapeXml(text: string): string {\n return text.replace(\n /[&<>\"']/g,\n (character) => ({ \"&\": \"&amp;\", \"<\": \"&lt;\", \">\": \"&gt;\", '\"': \"&quot;\", \"'\": \"&apos;\" })[character]!,\n );\n}\n\nexport function clusterIconDataUrl(input: ClusterIconDesign): string {\n const design = normalizeClusterIconDesign(input);\n const glyph = GLYPHS.find((candidate) => candidate.id === design.glyph)!;\n const svg = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"256\" height=\"256\" viewBox=\"0 0 64 64\"><rect x=\"2\" y=\"2\" width=\"60\" height=\"60\" rx=\"15\" fill=\"#292d38\" stroke=\"${design.outlineColor}\" stroke-width=\"3\"/><g fill=\"none\" stroke=\"${design.iconColor}\" stroke-width=\"2.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\">${glyph.body}</g><rect x=\"15\" y=\"46\" width=\"34\" height=\"12\" rx=\"6\" fill=\"${design.labelColor}\"/><text x=\"32\" y=\"55.2\" text-anchor=\"middle\" font-family=\"Helvetica,Arial,sans-serif\" font-size=\"9.5\" font-weight=\"800\" fill=\"#292d38\">${escapeXml(design.label)}</text></svg>`;\n return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg)}`;\n}\n"],"mappings":";AASA,IAAa,SAAS,OAAO,OAAO;CAClC,OAAO,OAAO;EACZ,IAAI;EACJ,OAAO;EACP,MAAM;CACR,CAAC;CACD,OAAO,OAAO;EACZ,IAAI;EACJ,OAAO;EACP,MAAM;CACR,CAAC;CACD,OAAO,OAAO;EACZ,IAAI;EACJ,OAAO;EACP,MAAM;CACR,CAAC;CACD,OAAO,OAAO;EACZ,IAAI;EACJ,OAAO;EACP,MAAM;CACR,CAAC;CACD,OAAO,OAAO;EACZ,IAAI;EACJ,OAAO;EACP,MAAM;CACR,CAAC;CACD,OAAO,OAAO;EACZ,IAAI;EACJ,OAAO;EACP,MAAM;CACR,CAAC;CACD,OAAO,OAAO;EACZ,IAAI;EACJ,OAAO;EACP,MAAM;CACR,CAAC;CACD,OAAO,OAAO;EACZ,IAAI;EACJ,OAAO;EACP,MAAM;CACR,CAAC;CACD,OAAO,OAAO;EACZ,IAAI;EACJ,OAAO;EACP,MAAM;CACR,CAAC;CACD,OAAO,OAAO;EACZ,IAAI;EACJ,OAAO;EACP,MAAM;CACR,CAAC;CACD,OAAO,OAAO;EACZ,IAAI;EACJ,OAAO;EACP,MAAM;CACR,CAAC;CACD,OAAO,OAAO;EACZ,IAAI;EACJ,OAAO;EACP,MAAM;CACR,CAAC;CACD,OAAO,OAAO;EACZ,IAAI;EACJ,OAAO;EACP,MAAM;CACR,CAAC;CACD,OAAO,OAAO;EACZ,IAAI;EACJ,OAAO;EACP,MAAM;CACR,CAAC;CACD,OAAO,OAAO;EACZ,IAAI;EACJ,OAAO;EACP,MAAM;CACR,CAAC;AACH,CAAC;AACD,IAAM,QAAQ;AACd,IAAM,QAAQ;AAEd,SAAgB,2BAA2B,OAAmC;CAC5E,IAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,GAC5D,MAAM,IAAI,MAAM,6BAA6B;CAE/C,MAAM,QAAQ;CACd,IAAI,OAAO,MAAM,UAAU,YAAY,CAAC,MAAM,KAAK,MAAM,KAAK,GAC5D,MAAM,IAAI,MAAM,kDAAkD;CAEpE,MAAM,QAAQ,MAAM,MAAM,UAAU,KAAK,CAAC,CAAC,KAAK;CAChD,IAAI,MAAM,KAAK,KAAK,CAAC,CAAC,SAAS,GAC7B,MAAM,IAAI,MAAM,kDAAkD;CAEpE,IAAI,OAAO,MAAM,UAAU,YAAY,CAAC,OAAO,MAAM,UAAU,MAAM,OAAO,MAAM,KAAK,GACrF,MAAM,IAAI,MAAM,kCAAkC;CAGpD,KAAK,MAAM,OAAO;EADF;EAAgB;EAAc;CAC5B,GAChB,IAAI,OAAO,MAAM,SAAS,YAAY,CAAC,MAAM,KAAK,MAAM,IAAc,GACpE,MAAM,IAAI,MAAM,mCAAmC;CAGvD,OAAO;EACL;EACA,OAAO,MAAM;EACb,cAAe,MAAM,aAAwB,YAAY;EACzD,YAAa,MAAM,WAAsB,YAAY;EACrD,WAAY,MAAM,UAAqB,YAAY;CACrD;AACF;AAcA,SAAS,UAAU,MAAsB;CACvC,OAAO,KAAK,QACV,aACC,eAAe;EAAE,KAAK;EAAS,KAAK;EAAQ,KAAK;EAAQ,MAAK;EAAU,KAAK;CAAS,EAAA,CAAG,UAC5F;AACF;AAEA,SAAgB,mBAAmB,OAAkC;CACnE,MAAM,SAAS,2BAA2B,KAAK;CAC/C,MAAM,QAAQ,OAAO,MAAM,cAAc,UAAU,OAAO,OAAO,KAAK;CACtE,MAAM,MAAM,gKAAgK,OAAO,aAAa,6CAA6C,OAAO,UAAU,sEAAsE,MAAM,KAAK,8DAA8D,OAAO,WAAW,0IAA0I,UAAU,OAAO,KAAK,EAAE;CACjkB,OAAO,oCAAoC,mBAAmB,GAAG;AACnE"}
@@ -25,7 +25,7 @@ function sanitizeDashboardCards(value) {
25
25
  id,
26
26
  title: typeof card.title === "string" && card.title.trim() ? card.title.trim() : new URL(url).hostname,
27
27
  url,
28
- size: card.size === "s" || card.size === "l" ? card.size : "m",
28
+ size: card.size === "xs" || card.size === "s" || card.size === "l" || card.size === "xl" ? card.size : "m",
29
29
  autoRefresh: card.autoRefresh === true,
30
30
  ...require_dashboard_selector.normalizeDashboardSelector(card.selector) ? { selector: require_dashboard_selector.normalizeDashboardSelector(card.selector) } : {}
31
31
  }];
@@ -1 +1 @@
1
- {"version":3,"file":"dashboard.js","names":[],"sources":["../../../src/common/dashboard.ts"],"sourcesContent":["import { normalizeDashboardSelector } from \"./dashboard-selector\";\n\nexport type DashboardCardSize = \"s\" | \"m\" | \"l\";\n\nexport interface DashboardCard {\n id: string;\n title: string;\n url: string;\n size: DashboardCardSize;\n autoRefresh?: boolean;\n selector?: string;\n}\n\nexport function normalizeDashboardUrl(value: string): string | undefined {\n try {\n const url = new URL(value.trim());\n if ((url.protocol !== \"http:\" && url.protocol !== \"https:\") || !url.hostname) return undefined;\n return url.href;\n } catch {\n return undefined;\n }\n}\n\nexport function sanitizeDashboardCards(value: unknown): DashboardCard[] {\n if (!Array.isArray(value)) return [];\n const ids = new Set<string>();\n return value.flatMap((entry: unknown) => {\n if (!entry || typeof entry !== \"object\") return [];\n const card = entry as Partial<DashboardCard>;\n const url = typeof card.url === \"string\" ? normalizeDashboardUrl(card.url) : undefined;\n if (!url) return [];\n const preferredId = typeof card.id === \"string\" ? card.id.trim() : \"\";\n let id = preferredId || `card-${encodeURIComponent(url)}`;\n for (let suffix = 2; ids.has(id); suffix++) id = `${preferredId || `card-${encodeURIComponent(url)}`}-${suffix}`;\n ids.add(id);\n return [\n {\n id,\n title: typeof card.title === \"string\" && card.title.trim() ? card.title.trim() : new URL(url).hostname,\n url,\n size: card.size === \"s\" || card.size === \"l\" ? card.size : \"m\",\n autoRefresh: card.autoRefresh === true,\n ...(normalizeDashboardSelector(card.selector) ? { selector: normalizeDashboardSelector(card.selector) } : {}),\n } satisfies DashboardCard,\n ];\n });\n}\n"],"mappings":";;AAaA,SAAgB,sBAAsB,OAAmC;CACvE,IAAI;EACF,MAAM,MAAM,IAAI,IAAI,MAAM,KAAK,CAAC;EAChC,IAAK,IAAI,aAAa,WAAW,IAAI,aAAa,YAAa,CAAC,IAAI,UAAU,OAAO,KAAA;EACrF,OAAO,IAAI;CACb,QAAQ;EACN;CACF;AACF;AAEA,SAAgB,uBAAuB,OAAiC;CACtE,IAAI,CAAC,MAAM,QAAQ,KAAK,GAAG,OAAO,CAAC;CACnC,MAAM,sBAAM,IAAI,IAAY;CAC5B,OAAO,MAAM,SAAS,UAAmB;EACvC,IAAI,CAAC,SAAS,OAAO,UAAU,UAAU,OAAO,CAAC;EACjD,MAAM,OAAO;EACb,MAAM,MAAM,OAAO,KAAK,QAAQ,WAAW,sBAAsB,KAAK,GAAG,IAAI,KAAA;EAC7E,IAAI,CAAC,KAAK,OAAO,CAAC;EAClB,MAAM,cAAc,OAAO,KAAK,OAAO,WAAW,KAAK,GAAG,KAAK,IAAI;EACnE,IAAI,KAAK,eAAe,QAAQ,mBAAmB,GAAG;EACtD,KAAK,IAAI,SAAS,GAAG,IAAI,IAAI,EAAE,GAAG,UAAU,KAAK,GAAG,eAAe,QAAQ,mBAAmB,GAAG,IAAI,GAAG;EACxG,IAAI,IAAI,EAAE;EACV,OAAO,CACL;GACE;GACA,OAAO,OAAO,KAAK,UAAU,YAAY,KAAK,MAAM,KAAK,IAAI,KAAK,MAAM,KAAK,IAAI,IAAI,IAAI,GAAG,CAAC,CAAC;GAC9F;GACA,MAAM,KAAK,SAAS,OAAO,KAAK,SAAS,MAAM,KAAK,OAAO;GAC3D,aAAa,KAAK,gBAAgB;GAClC,GAAI,2BAAA,2BAA2B,KAAK,QAAQ,IAAI,EAAE,UAAU,2BAAA,2BAA2B,KAAK,QAAQ,EAAE,IAAI,CAAC;EAC7G,CACF;CACF,CAAC;AACH"}
1
+ {"version":3,"file":"dashboard.js","names":[],"sources":["../../../src/common/dashboard.ts"],"sourcesContent":["import { normalizeDashboardSelector } from \"./dashboard-selector\";\n\nexport type DashboardCardSize = \"xs\" | \"s\" | \"m\" | \"l\" | \"xl\";\n\nexport interface DashboardCard {\n id: string;\n title: string;\n url: string;\n size: DashboardCardSize;\n autoRefresh?: boolean;\n selector?: string;\n}\n\nexport function normalizeDashboardUrl(value: string): string | undefined {\n try {\n const url = new URL(value.trim());\n if ((url.protocol !== \"http:\" && url.protocol !== \"https:\") || !url.hostname) return undefined;\n return url.href;\n } catch {\n return undefined;\n }\n}\n\nexport function sanitizeDashboardCards(value: unknown): DashboardCard[] {\n if (!Array.isArray(value)) return [];\n const ids = new Set<string>();\n return value.flatMap((entry: unknown) => {\n if (!entry || typeof entry !== \"object\") return [];\n const card = entry as Partial<DashboardCard>;\n const url = typeof card.url === \"string\" ? normalizeDashboardUrl(card.url) : undefined;\n if (!url) return [];\n const preferredId = typeof card.id === \"string\" ? card.id.trim() : \"\";\n let id = preferredId || `card-${encodeURIComponent(url)}`;\n for (let suffix = 2; ids.has(id); suffix++) id = `${preferredId || `card-${encodeURIComponent(url)}`}-${suffix}`;\n ids.add(id);\n return [\n {\n id,\n title: typeof card.title === \"string\" && card.title.trim() ? card.title.trim() : new URL(url).hostname,\n url,\n size: card.size === \"xs\" || card.size === \"s\" || card.size === \"l\" || card.size === \"xl\" ? card.size : \"m\",\n autoRefresh: card.autoRefresh === true,\n ...(normalizeDashboardSelector(card.selector) ? { selector: normalizeDashboardSelector(card.selector) } : {}),\n } satisfies DashboardCard,\n ];\n });\n}\n"],"mappings":";;AAaA,SAAgB,sBAAsB,OAAmC;CACvE,IAAI;EACF,MAAM,MAAM,IAAI,IAAI,MAAM,KAAK,CAAC;EAChC,IAAK,IAAI,aAAa,WAAW,IAAI,aAAa,YAAa,CAAC,IAAI,UAAU,OAAO,KAAA;EACrF,OAAO,IAAI;CACb,QAAQ;EACN;CACF;AACF;AAEA,SAAgB,uBAAuB,OAAiC;CACtE,IAAI,CAAC,MAAM,QAAQ,KAAK,GAAG,OAAO,CAAC;CACnC,MAAM,sBAAM,IAAI,IAAY;CAC5B,OAAO,MAAM,SAAS,UAAmB;EACvC,IAAI,CAAC,SAAS,OAAO,UAAU,UAAU,OAAO,CAAC;EACjD,MAAM,OAAO;EACb,MAAM,MAAM,OAAO,KAAK,QAAQ,WAAW,sBAAsB,KAAK,GAAG,IAAI,KAAA;EAC7E,IAAI,CAAC,KAAK,OAAO,CAAC;EAClB,MAAM,cAAc,OAAO,KAAK,OAAO,WAAW,KAAK,GAAG,KAAK,IAAI;EACnE,IAAI,KAAK,eAAe,QAAQ,mBAAmB,GAAG;EACtD,KAAK,IAAI,SAAS,GAAG,IAAI,IAAI,EAAE,GAAG,UAAU,KAAK,GAAG,eAAe,QAAQ,mBAAmB,GAAG,IAAI,GAAG;EACxG,IAAI,IAAI,EAAE;EACV,OAAO,CACL;GACE;GACA,OAAO,OAAO,KAAK,UAAU,YAAY,KAAK,MAAM,KAAK,IAAI,KAAK,MAAM,KAAK,IAAI,IAAI,IAAI,GAAG,CAAC,CAAC;GAC9F;GACA,MAAM,KAAK,SAAS,QAAQ,KAAK,SAAS,OAAO,KAAK,SAAS,OAAO,KAAK,SAAS,OAAO,KAAK,OAAO;GACvG,aAAa,KAAK,gBAAgB;GAClC,GAAI,2BAAA,2BAA2B,KAAK,QAAQ,IAAI,EAAE,UAAU,2BAAA,2BAA2B,KAAK,QAAQ,EAAE,IAAI,CAAC;EAC7G,CACF;CACF,CAAC;AACH"}
@@ -0,0 +1,52 @@
1
+ //#region src/common/monitoring-history.ts
2
+ var MONITORING_HISTORY_CHANNEL = "freelens-power:monitoring-history";
3
+ var HISTORY_RETENTION = 10080 * 60 * 1e3;
4
+ var HISTORY_METRICS = [
5
+ "cpu",
6
+ "memory",
7
+ "cpuRequests",
8
+ "memoryRequests",
9
+ "cpuLimits",
10
+ "memoryLimits",
11
+ "cpuCapacity",
12
+ "memoryCapacity",
13
+ "cpuAllocatable",
14
+ "memoryAllocatable",
15
+ "restarts"
16
+ ];
17
+ function validHistoryIdentity(value) {
18
+ return !!value && [value.clusterId, value.uid].every((id) => typeof id === "string" && /^[a-zA-Z0-9_.:-]{1,128}$/.test(id)) && [
19
+ "cluster",
20
+ "node",
21
+ "pod",
22
+ "workload"
23
+ ].includes(value.scope);
24
+ }
25
+ function projectHistorySamples(input, now = Date.now()) {
26
+ if (!Array.isArray(input) || input.length > 512) throw new Error("Invalid history samples");
27
+ return input.map((sample) => {
28
+ if (!validHistoryIdentity(sample) || !Number.isSafeInteger(sample.time) || sample.time < now - 6048e5 || sample.time > now + 3e4 || !sample.values || typeof sample.values !== "object") throw new Error("Invalid history sample");
29
+ const values = {};
30
+ for (const metric of HISTORY_METRICS) {
31
+ const value = sample.values[metric];
32
+ if (value === void 0) continue;
33
+ if (typeof value !== "number" || !Number.isFinite(value) || value < 0 || value > 1e30) throw new Error("Invalid history value");
34
+ values[metric] = value;
35
+ }
36
+ return {
37
+ clusterId: sample.clusterId,
38
+ scope: sample.scope,
39
+ uid: sample.uid,
40
+ time: sample.time,
41
+ values
42
+ };
43
+ });
44
+ }
45
+ //#endregion
46
+ exports.HISTORY_METRICS = HISTORY_METRICS;
47
+ exports.HISTORY_RETENTION = HISTORY_RETENTION;
48
+ exports.MONITORING_HISTORY_CHANNEL = MONITORING_HISTORY_CHANNEL;
49
+ exports.projectHistorySamples = projectHistorySamples;
50
+ exports.validHistoryIdentity = validHistoryIdentity;
51
+
52
+ //# sourceMappingURL=monitoring-history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"monitoring-history.js","names":[],"sources":["../../../src/common/monitoring-history.ts"],"sourcesContent":["export const MONITORING_HISTORY_CHANNEL = \"freelens-power:monitoring-history\";\nexport const HISTORY_RETENTION = 7 * 24 * 60 * 60 * 1000;\nexport const HISTORY_MAX_BYTES = 100 * 1024 * 1024;\nexport type HistoryIdentity = {\n clusterId: string;\n scope: \"cluster\" | \"node\" | \"pod\" | \"workload\";\n uid: string;\n};\nexport const HISTORY_METRICS = [\n \"cpu\",\n \"memory\",\n \"cpuRequests\",\n \"memoryRequests\",\n \"cpuLimits\",\n \"memoryLimits\",\n \"cpuCapacity\",\n \"memoryCapacity\",\n \"cpuAllocatable\",\n \"memoryAllocatable\",\n \"restarts\",\n] as const;\nexport type HistoryMetric = (typeof HISTORY_METRICS)[number];\nexport type HistorySample = HistoryIdentity & { time: number; values: Partial<Record<HistoryMetric, number>> };\nexport type HistoryQuery = HistoryIdentity & { from: number; to: number };\nexport type HistoryPoint = {\n time: number;\n resolution: number;\n metric: HistoryMetric;\n min: number;\n avg: number;\n max: number;\n count: number;\n gap: boolean;\n};\nexport type HistoryStatus = { available: boolean; enabled: boolean; bytes: number; samples: number; error?: string };\nexport type HistoryRequest =\n | { operation: \"status\" | \"clear\" }\n | { operation: \"append\"; samples: HistorySample[] }\n | { operation: \"query\"; query: HistoryQuery };\nexport function validHistoryIdentity(value: HistoryIdentity): boolean {\n return (\n !!value &&\n [value.clusterId, value.uid].every((id) => typeof id === \"string\" && /^[a-zA-Z0-9_.:-]{1,128}$/.test(id)) &&\n [\"cluster\", \"node\", \"pod\", \"workload\"].includes(value.scope)\n );\n}\nexport function projectHistorySamples(input: unknown, now = Date.now()): HistorySample[] {\n if (!Array.isArray(input) || input.length > 512) throw new Error(\"Invalid history samples\");\n return input.map((sample) => {\n if (\n !validHistoryIdentity(sample) ||\n !Number.isSafeInteger(sample.time) ||\n sample.time < now - HISTORY_RETENTION ||\n sample.time > now + 30_000 ||\n !sample.values ||\n typeof sample.values !== \"object\"\n )\n throw new Error(\"Invalid history sample\");\n const values: HistorySample[\"values\"] = {};\n for (const metric of HISTORY_METRICS) {\n const value = sample.values[metric];\n if (value === undefined) continue;\n if (typeof value !== \"number\" || !Number.isFinite(value) || value < 0 || value > 1e30)\n throw new Error(\"Invalid history value\");\n values[metric] = value;\n }\n return { clusterId: sample.clusterId, scope: sample.scope, uid: sample.uid, time: sample.time, values };\n });\n}\n"],"mappings":";AAAA,IAAa,6BAA6B;AAC1C,IAAa,oBAAoB,QAAc,KAAK;AAOpD,IAAa,kBAAkB;CAC7B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAmBA,SAAgB,qBAAqB,OAAiC;CACpE,OACE,CAAC,CAAC,SACF,CAAC,MAAM,WAAW,MAAM,GAAG,CAAC,CAAC,OAAO,OAAO,OAAO,OAAO,YAAY,2BAA2B,KAAK,EAAE,CAAC,KACxG;EAAC;EAAW;EAAQ;EAAO;CAAU,CAAC,CAAC,SAAS,MAAM,KAAK;AAE/D;AACA,SAAgB,sBAAsB,OAAgB,MAAM,KAAK,IAAI,GAAoB;CACvF,IAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,MAAM,SAAS,KAAK,MAAM,IAAI,MAAM,yBAAyB;CAC1F,OAAO,MAAM,KAAK,WAAW;EAC3B,IACE,CAAC,qBAAqB,MAAM,KAC5B,CAAC,OAAO,cAAc,OAAO,IAAI,KACjC,OAAO,OAAO,MAAA,UACd,OAAO,OAAO,MAAM,OACpB,CAAC,OAAO,UACR,OAAO,OAAO,WAAW,UAEzB,MAAM,IAAI,MAAM,wBAAwB;EAC1C,MAAM,SAAkC,CAAC;EACzC,KAAK,MAAM,UAAU,iBAAiB;GACpC,MAAM,QAAQ,OAAO,OAAO;GAC5B,IAAI,UAAU,KAAA,GAAW;GACzB,IAAI,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,KAAK,KAAK,QAAQ,KAAK,QAAQ,MAC/E,MAAM,IAAI,MAAM,uBAAuB;GACzC,OAAO,UAAU;EACnB;EACA,OAAO;GAAE,WAAW,OAAO;GAAW,OAAO,OAAO;GAAO,KAAK,OAAO;GAAK,MAAM,OAAO;GAAM;EAAO;CACxG,CAAC;AACH"}
@@ -18,9 +18,11 @@ function parseSettingsImport(value) {
18
18
  const ids = /* @__PURE__ */ new Set();
19
19
  for (const card of cards) {
20
20
  if (!card || typeof card !== "object" || typeof card.id !== "string" || !card.id.trim() || ids.has(card.id) || typeof card.title !== "string" || !card.title.trim() || typeof card.url !== "string" || ![
21
+ "xs",
21
22
  "s",
22
23
  "m",
23
- "l"
24
+ "l",
25
+ "xl"
24
26
  ].includes(card.size) || card.autoRefresh !== void 0 && typeof card.autoRefresh !== "boolean" || card.selector !== void 0 && (typeof card.selector !== "string" || card.selector.trim() && !require_dashboard_selector.normalizeDashboardSelector(card.selector))) return fail();
25
27
  ids.add(card.id);
26
28
  }
@@ -1 +1 @@
1
- {"version":3,"file":"settings-export.js","names":[],"sources":["../../../src/common/settings-export.ts"],"sourcesContent":["import { sanitizeAiShortcuts } from \"./ai-shortcuts\";\nimport { sanitizeDashboardCards } from \"./dashboard\";\nimport { normalizeDashboardSelector } from \"./dashboard-selector\";\n\nexport const SETTINGS_EXPORT = \"freelens-power:settings:export\";\nexport type SettingsExportResult = \"saved\" | \"canceled\" | \"error\";\nexport const SETTINGS_IMPORT = \"freelens-power:settings:import\";\nexport type SettingsImportResult = \"restored\" | \"canceled\" | \"error\";\nexport const SETTINGS_BACKUP_MAX_BYTES = 1024 * 1024;\n\nexport function parseSettingsImport(value: unknown) {\n const fail = () => {\n throw new Error(\"Invalid settings backup\");\n };\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return fail();\n const backup = value as {\n format?: unknown;\n version?: unknown;\n dashboard?: { cards?: unknown };\n ai?: { shortcuts?: unknown };\n };\n if (backup.format !== \"freelens-power-settings\" || backup.version !== 1) return fail();\n const cards = backup.dashboard?.cards;\n const shortcuts = backup.ai?.shortcuts;\n if (!Array.isArray(cards) || !Array.isArray(shortcuts)) return fail();\n const ids = new Set<string>();\n for (const card of cards) {\n if (\n !card ||\n typeof card !== \"object\" ||\n typeof card.id !== \"string\" ||\n !card.id.trim() ||\n ids.has(card.id) ||\n typeof card.title !== \"string\" ||\n !card.title.trim() ||\n typeof card.url !== \"string\" ||\n ![\"s\", \"m\", \"l\"].includes(card.size) ||\n (card.autoRefresh !== undefined && typeof card.autoRefresh !== \"boolean\") ||\n (card.selector !== undefined &&\n (typeof card.selector !== \"string\" || (card.selector.trim() && !normalizeDashboardSelector(card.selector))))\n )\n return fail();\n ids.add(card.id);\n }\n if (\n sanitizeDashboardCards(cards).length !== cards.length ||\n sanitizeAiShortcuts(shortcuts).length !== shortcuts.length\n )\n return fail();\n return createSettingsExport(cards, shortcuts);\n}\n\nfunction credentialKey(value: string): boolean {\n const key = value.toLowerCase().replace(/[^a-z0-9]/g, \"\");\n return (\n /(?:token|password|passwd|secret|credential|authorization|signature|apikey|session)/.test(key) ||\n [\"auth\", \"key\", \"sig\", \"code\", \"jwt\", \"assertion\", \"ticket\", \"samlresponse\"].includes(key)\n );\n}\n\nfunction exportUrl(value: string): string {\n const url = new URL(value);\n url.username = \"\";\n url.password = \"\";\n for (const key of [...url.searchParams.keys()]) {\n if (credentialKey(key)) url.searchParams.delete(key);\n }\n // preserve SPA routes unless the fragment contains credential parameters\n const fragment = url.hash.slice(1);\n const parameters = new URLSearchParams(fragment.includes(\"?\") ? fragment.slice(fragment.indexOf(\"?\") + 1) : fragment);\n if ([...parameters.keys()].some(credentialKey)) url.hash = \"\";\n return url.href;\n}\n\nexport function createSettingsExport(cards: unknown, shortcuts: unknown) {\n const backup = {\n format: \"freelens-power-settings\",\n version: 1,\n dashboard: {\n cards: sanitizeDashboardCards(cards).map((card, index, all) => {\n const url = exportUrl(card.url);\n let id = card.id;\n if (/^card-https?%3a%2f%2f/i.test(id)) {\n id = `export-card-${index + 1}`;\n while (all.some((entry) => entry.id === id)) id += \"-\";\n }\n return { ...card, url, id };\n }),\n },\n ai: { shortcuts: sanitizeAiShortcuts(shortcuts) },\n };\n if (new TextEncoder().encode(`${JSON.stringify(backup, null, 2)}\\n`).byteLength > SETTINGS_BACKUP_MAX_BYTES)\n throw new Error(\"Settings backup is too large\");\n return backup;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"settings-export.js","names":[],"sources":["../../../src/common/settings-export.ts"],"sourcesContent":["import { sanitizeAiShortcuts } from \"./ai-shortcuts\";\nimport { sanitizeDashboardCards } from \"./dashboard\";\nimport { normalizeDashboardSelector } from \"./dashboard-selector\";\n\nexport const SETTINGS_EXPORT = \"freelens-power:settings:export\";\nexport type SettingsExportResult = \"saved\" | \"canceled\" | \"error\";\nexport const SETTINGS_IMPORT = \"freelens-power:settings:import\";\nexport type SettingsImportResult = \"restored\" | \"canceled\" | \"error\";\nexport const SETTINGS_BACKUP_MAX_BYTES = 1024 * 1024;\n\nexport function parseSettingsImport(value: unknown) {\n const fail = () => {\n throw new Error(\"Invalid settings backup\");\n };\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return fail();\n const backup = value as {\n format?: unknown;\n version?: unknown;\n dashboard?: { cards?: unknown };\n ai?: { shortcuts?: unknown };\n };\n if (backup.format !== \"freelens-power-settings\" || backup.version !== 1) return fail();\n const cards = backup.dashboard?.cards;\n const shortcuts = backup.ai?.shortcuts;\n if (!Array.isArray(cards) || !Array.isArray(shortcuts)) return fail();\n const ids = new Set<string>();\n for (const card of cards) {\n if (\n !card ||\n typeof card !== \"object\" ||\n typeof card.id !== \"string\" ||\n !card.id.trim() ||\n ids.has(card.id) ||\n typeof card.title !== \"string\" ||\n !card.title.trim() ||\n typeof card.url !== \"string\" ||\n ![\"xs\", \"s\", \"m\", \"l\", \"xl\"].includes(card.size) ||\n (card.autoRefresh !== undefined && typeof card.autoRefresh !== \"boolean\") ||\n (card.selector !== undefined &&\n (typeof card.selector !== \"string\" || (card.selector.trim() && !normalizeDashboardSelector(card.selector))))\n )\n return fail();\n ids.add(card.id);\n }\n if (\n sanitizeDashboardCards(cards).length !== cards.length ||\n sanitizeAiShortcuts(shortcuts).length !== shortcuts.length\n )\n return fail();\n return createSettingsExport(cards, shortcuts);\n}\n\nfunction credentialKey(value: string): boolean {\n const key = value.toLowerCase().replace(/[^a-z0-9]/g, \"\");\n return (\n /(?:token|password|passwd|secret|credential|authorization|signature|apikey|session)/.test(key) ||\n [\"auth\", \"key\", \"sig\", \"code\", \"jwt\", \"assertion\", \"ticket\", \"samlresponse\"].includes(key)\n );\n}\n\nfunction exportUrl(value: string): string {\n const url = new URL(value);\n url.username = \"\";\n url.password = \"\";\n for (const key of [...url.searchParams.keys()]) {\n if (credentialKey(key)) url.searchParams.delete(key);\n }\n // preserve SPA routes unless the fragment contains credential parameters\n const fragment = url.hash.slice(1);\n const parameters = new URLSearchParams(fragment.includes(\"?\") ? fragment.slice(fragment.indexOf(\"?\") + 1) : fragment);\n if ([...parameters.keys()].some(credentialKey)) url.hash = \"\";\n return url.href;\n}\n\nexport function createSettingsExport(cards: unknown, shortcuts: unknown) {\n const backup = {\n format: \"freelens-power-settings\",\n version: 1,\n dashboard: {\n cards: sanitizeDashboardCards(cards).map((card, index, all) => {\n const url = exportUrl(card.url);\n let id = card.id;\n if (/^card-https?%3a%2f%2f/i.test(id)) {\n id = `export-card-${index + 1}`;\n while (all.some((entry) => entry.id === id)) id += \"-\";\n }\n return { ...card, url, id };\n }),\n },\n ai: { shortcuts: sanitizeAiShortcuts(shortcuts) },\n };\n if (new TextEncoder().encode(`${JSON.stringify(backup, null, 2)}\\n`).byteLength > SETTINGS_BACKUP_MAX_BYTES)\n throw new Error(\"Settings backup is too large\");\n return backup;\n}\n"],"mappings":";;;;AAIA,IAAa,kBAAkB;AAE/B,IAAa,kBAAkB;AAE/B,IAAa,4BAA4B,OAAO;AAEhD,SAAgB,oBAAoB,OAAgB;CAClD,MAAM,aAAa;EACjB,MAAM,IAAI,MAAM,yBAAyB;CAC3C;CACA,IAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,GAAG,OAAO,KAAK;CAC7E,MAAM,SAAS;CAMf,IAAI,OAAO,WAAW,6BAA6B,OAAO,YAAY,GAAG,OAAO,KAAK;CACrF,MAAM,QAAQ,OAAO,WAAW;CAChC,MAAM,YAAY,OAAO,IAAI;CAC7B,IAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,CAAC,MAAM,QAAQ,SAAS,GAAG,OAAO,KAAK;CACpE,MAAM,sBAAM,IAAI,IAAY;CAC5B,KAAK,MAAM,QAAQ,OAAO;EACxB,IACE,CAAC,QACD,OAAO,SAAS,YAChB,OAAO,KAAK,OAAO,YACnB,CAAC,KAAK,GAAG,KAAK,KACd,IAAI,IAAI,KAAK,EAAE,KACf,OAAO,KAAK,UAAU,YACtB,CAAC,KAAK,MAAM,KAAK,KACjB,OAAO,KAAK,QAAQ,YACpB,CAAC;GAAC;GAAM;GAAK;GAAK;GAAK;EAAI,CAAC,CAAC,SAAS,KAAK,IAAI,KAC9C,KAAK,gBAAgB,KAAA,KAAa,OAAO,KAAK,gBAAgB,aAC9D,KAAK,aAAa,KAAA,MAChB,OAAO,KAAK,aAAa,YAAa,KAAK,SAAS,KAAK,KAAK,CAAC,2BAAA,2BAA2B,KAAK,QAAQ,IAE1G,OAAO,KAAK;EACd,IAAI,IAAI,KAAK,EAAE;CACjB;CACA,IACE,kBAAA,uBAAuB,KAAK,CAAC,CAAC,WAAW,MAAM,UAC/C,qBAAA,oBAAoB,SAAS,CAAC,CAAC,WAAW,UAAU,QAEpD,OAAO,KAAK;CACd,OAAO,qBAAqB,OAAO,SAAS;AAC9C;AAEA,SAAS,cAAc,OAAwB;CAC7C,MAAM,MAAM,MAAM,YAAY,CAAC,CAAC,QAAQ,cAAc,EAAE;CACxD,OACE,qFAAqF,KAAK,GAAG,KAC7F;EAAC;EAAQ;EAAO;EAAO;EAAQ;EAAO;EAAa;EAAU;CAAc,CAAC,CAAC,SAAS,GAAG;AAE7F;AAEA,SAAS,UAAU,OAAuB;CACxC,MAAM,MAAM,IAAI,IAAI,KAAK;CACzB,IAAI,WAAW;CACf,IAAI,WAAW;CACf,KAAK,MAAM,OAAO,CAAC,GAAG,IAAI,aAAa,KAAK,CAAC,GAC3C,IAAI,cAAc,GAAG,GAAG,IAAI,aAAa,OAAO,GAAG;CAGrD,MAAM,WAAW,IAAI,KAAK,MAAM,CAAC;CAEjC,IAAI,CAAC,GAAG,IADe,gBAAgB,SAAS,SAAS,GAAG,IAAI,SAAS,MAAM,SAAS,QAAQ,GAAG,IAAI,CAAC,IAAI,QACpG,CAAA,CAAW,KAAK,CAAC,CAAC,CAAC,KAAK,aAAa,GAAG,IAAI,OAAO;CAC3D,OAAO,IAAI;AACb;AAEA,SAAgB,qBAAqB,OAAgB,WAAoB;CACvE,MAAM,SAAS;EACb,QAAQ;EACR,SAAS;EACT,WAAW,EACT,OAAO,kBAAA,uBAAuB,KAAK,CAAC,CAAC,KAAK,MAAM,OAAO,QAAQ;GAC7D,MAAM,MAAM,UAAU,KAAK,GAAG;GAC9B,IAAI,KAAK,KAAK;GACd,IAAI,yBAAyB,KAAK,EAAE,GAAG;IACrC,KAAK,eAAe,QAAQ;IAC5B,OAAO,IAAI,MAAM,UAAU,MAAM,OAAO,EAAE,GAAG,MAAM;GACrD;GACA,OAAO;IAAE,GAAG;IAAM;IAAK;GAAG;EAC5B,CAAC,EACH;EACA,IAAI,EAAE,WAAW,qBAAA,oBAAoB,SAAS,EAAE;CAClD;CACA,IAAI,IAAI,YAAY,CAAC,CAAC,OAAO,GAAG,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC,aAAA,SACnE,MAAM,IAAI,MAAM,8BAA8B;CAChD,OAAO;AACT"}
@@ -0,0 +1,32 @@
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_cluster_icons = require("../cluster-icons.js");
4
+ //#region src/common/store/cluster-icons-store.ts
5
+ var ClusterIconsStore = class extends require_extensions.Common.Store.ExtensionStore {
6
+ icons = {};
7
+ constructor() {
8
+ super({
9
+ configName: "cluster-icons",
10
+ defaults: { icons: {} },
11
+ syncOptions: { fireImmediately: true }
12
+ });
13
+ require__global_external_mobx.makeObservable(this, { icons: require__global_external_mobx.observable });
14
+ }
15
+ fromStore(data) {
16
+ const entries = [];
17
+ if (data.icons && typeof data.icons === "object" && !Array.isArray(data.icons)) for (const [id, entry] of Object.entries(data.icons)) {
18
+ if (!id || !entry) continue;
19
+ try {
20
+ entries.push([id, { design: require_cluster_icons.normalizeClusterIconDesign(entry.design) }]);
21
+ } catch {}
22
+ }
23
+ this.icons = Object.fromEntries(entries);
24
+ }
25
+ toJSON() {
26
+ return { icons: Object.fromEntries(Object.entries(this.icons).map(([id, value]) => [id, { design: { ...value.design } }])) };
27
+ }
28
+ };
29
+ //#endregion
30
+ exports.ClusterIconsStore = ClusterIconsStore;
31
+
32
+ //# sourceMappingURL=cluster-icons-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cluster-icons-store.js","names":[],"sources":["../../../../src/common/store/cluster-icons-store.ts"],"sourcesContent":["import { Common } from \"@freelensapp/extensions\";\nimport { makeObservable, observable } from \"mobx\";\nimport { type ClusterIconDesign, normalizeClusterIconDesign } from \"../cluster-icons\";\n\nexport interface SavedClusterIcon {\n design: ClusterIconDesign;\n}\n\nexport interface ClusterIconsModel {\n icons: Record<string, SavedClusterIcon>;\n}\n\nexport class ClusterIconsStore extends Common.Store.ExtensionStore<ClusterIconsModel> {\n icons: Record<string, SavedClusterIcon> = {};\n\n constructor() {\n super({ configName: \"cluster-icons\", defaults: { icons: {} }, syncOptions: { fireImmediately: true } });\n makeObservable(this, { icons: observable });\n }\n\n fromStore(data: Partial<ClusterIconsModel>): void {\n const entries: [string, SavedClusterIcon][] = [];\n if (data.icons && typeof data.icons === \"object\" && !Array.isArray(data.icons)) {\n for (const [id, entry] of Object.entries(data.icons)) {\n if (!id || !entry) continue;\n try {\n entries.push([id, { design: normalizeClusterIconDesign(entry.design) }]);\n } catch {\n // ignore invalid saved designs without discarding other clusters\n }\n }\n }\n this.icons = Object.fromEntries(entries);\n }\n\n toJSON(): ClusterIconsModel {\n return {\n icons: Object.fromEntries(Object.entries(this.icons).map(([id, value]) => [id, { design: { ...value.design } }])),\n };\n }\n}\n"],"mappings":";;;;AAYA,IAAa,oBAAb,cAAuC,mBAAA,OAAO,MAAM,eAAkC;CACpF,QAA0C,CAAC;CAE3C,cAAc;EACZ,MAAM;GAAE,YAAY;GAAiB,UAAU,EAAE,OAAO,CAAC,EAAE;GAAG,aAAa,EAAE,iBAAiB,KAAK;EAAE,CAAC;EACtG,8BAAA,eAAe,MAAM,EAAE,OAAO,8BAAA,WAAW,CAAC;CAC5C;CAEA,UAAU,MAAwC;EAChD,MAAM,UAAwC,CAAC;EAC/C,IAAI,KAAK,SAAS,OAAO,KAAK,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,KAAK,GAC3E,KAAK,MAAM,CAAC,IAAI,UAAU,OAAO,QAAQ,KAAK,KAAK,GAAG;GACpD,IAAI,CAAC,MAAM,CAAC,OAAO;GACnB,IAAI;IACF,QAAQ,KAAK,CAAC,IAAI,EAAE,QAAQ,sBAAA,2BAA2B,MAAM,MAAM,EAAE,CAAC,CAAC;GACzE,QAAQ,CAER;EACF;EAEF,KAAK,QAAQ,OAAO,YAAY,OAAO;CACzC;CAEA,SAA4B;EAC1B,OAAO,EACL,OAAO,OAAO,YAAY,OAAO,QAAQ,KAAK,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,WAAW,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,MAAM,OAAO,EAAE,CAAC,CAAC,CAAC,EAClH;CACF;AACF"}
@@ -1,23 +1,51 @@
1
1
  const require_extensions = require("../../_virtual/_global-external_@freelensapp/extensions.js");
2
2
  const require__global_external_mobx = require("../../_virtual/_global-external_mobx.js");
3
+ const require_monitoring_history = require("../monitoring-history.js");
3
4
  //#region src/common/store/monitoring-preferences-store.ts
4
5
  var MonitoringPreferencesStore = class extends require_extensions.Common.Store.ExtensionStore {
5
6
  enabled = false;
7
+ diagnosticsVisible = true;
8
+ historyEnabled = false;
9
+ trackedHistory = [];
6
10
  constructor() {
7
11
  super({
8
12
  configName: "monitoring-preferences",
9
- defaults: { enabled: false }
13
+ defaults: {
14
+ enabled: false,
15
+ diagnosticsVisible: true,
16
+ historyEnabled: false,
17
+ trackedHistory: []
18
+ }
10
19
  });
11
20
  require__global_external_mobx.makeObservable(this, {
12
21
  enabled: require__global_external_mobx.observable,
22
+ diagnosticsVisible: require__global_external_mobx.observable,
23
+ historyEnabled: require__global_external_mobx.observable,
24
+ trackedHistory: require__global_external_mobx.observable,
13
25
  fromStore: require__global_external_mobx.action
14
26
  });
15
27
  }
16
28
  fromStore(data) {
17
29
  this.enabled = data?.enabled === true;
30
+ this.diagnosticsVisible = data?.diagnosticsVisible !== false;
31
+ this.historyEnabled = data?.historyEnabled === true;
32
+ this.trackedHistory = Array.isArray(data?.trackedHistory) ? data.trackedHistory.filter(require_monitoring_history.validHistoryIdentity).slice(0, 100).map(({ clusterId, scope, uid }) => ({
33
+ clusterId,
34
+ scope,
35
+ uid
36
+ })) : [];
18
37
  }
19
38
  toJSON() {
20
- return { enabled: this.enabled };
39
+ return {
40
+ enabled: this.enabled,
41
+ diagnosticsVisible: this.diagnosticsVisible,
42
+ historyEnabled: this.historyEnabled,
43
+ trackedHistory: this.trackedHistory.map(({ clusterId, scope, uid }) => ({
44
+ clusterId,
45
+ scope,
46
+ uid
47
+ }))
48
+ };
21
49
  }
22
50
  };
23
51
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"monitoring-preferences-store.js","names":[],"sources":["../../../../src/common/store/monitoring-preferences-store.ts"],"sourcesContent":["import { Common } from \"@freelensapp/extensions\";\nimport { action, makeObservable, observable } from \"mobx\";\n\nexport class MonitoringPreferencesStore extends Common.Store.ExtensionStore<{ enabled: boolean }> {\n enabled = false;\n\n constructor() {\n super({ configName: \"monitoring-preferences\", defaults: { enabled: false } });\n makeObservable(this, { enabled: observable, fromStore: action });\n }\n\n fromStore(data: { enabled?: boolean }): void {\n this.enabled = data?.enabled === true;\n }\n\n toJSON(): { enabled: boolean } {\n return { enabled: this.enabled };\n }\n}\n"],"mappings":";;;AAGA,IAAa,6BAAb,cAAgD,mBAAA,OAAO,MAAM,eAAqC;CAChG,UAAU;CAEV,cAAc;EACZ,MAAM;GAAE,YAAY;GAA0B,UAAU,EAAE,SAAS,MAAM;EAAE,CAAC;EAC5E,8BAAA,eAAe,MAAM;GAAE,SAAS,8BAAA;GAAY,WAAW,8BAAA;EAAO,CAAC;CACjE;CAEA,UAAU,MAAmC;EAC3C,KAAK,UAAU,MAAM,YAAY;CACnC;CAEA,SAA+B;EAC7B,OAAO,EAAE,SAAS,KAAK,QAAQ;CACjC;AACF"}
1
+ {"version":3,"file":"monitoring-preferences-store.js","names":[],"sources":["../../../../src/common/store/monitoring-preferences-store.ts"],"sourcesContent":["import { Common } from \"@freelensapp/extensions\";\nimport { action, makeObservable, observable } from \"mobx\";\nimport { type HistoryIdentity, validHistoryIdentity } from \"../monitoring-history\";\n\nexport class MonitoringPreferencesStore extends Common.Store.ExtensionStore<{\n enabled: boolean;\n diagnosticsVisible: boolean;\n historyEnabled: boolean;\n trackedHistory: HistoryIdentity[];\n}> {\n enabled = false;\n diagnosticsVisible = true;\n historyEnabled = false;\n trackedHistory: HistoryIdentity[] = [];\n\n constructor() {\n super({\n configName: \"monitoring-preferences\",\n defaults: { enabled: false, diagnosticsVisible: true, historyEnabled: false, trackedHistory: [] },\n });\n makeObservable(this, {\n enabled: observable,\n diagnosticsVisible: observable,\n historyEnabled: observable,\n trackedHistory: observable,\n fromStore: action,\n });\n }\n\n fromStore(data: {\n enabled?: boolean;\n diagnosticsVisible?: boolean;\n historyEnabled?: boolean;\n trackedHistory?: HistoryIdentity[];\n }): void {\n this.enabled = data?.enabled === true;\n this.diagnosticsVisible = data?.diagnosticsVisible !== false;\n this.historyEnabled = data?.historyEnabled === true;\n this.trackedHistory = Array.isArray(data?.trackedHistory)\n ? data.trackedHistory\n .filter(validHistoryIdentity)\n .slice(0, 100)\n .map(({ clusterId, scope, uid }) => ({ clusterId, scope, uid }))\n : [];\n }\n\n toJSON(): {\n enabled: boolean;\n diagnosticsVisible: boolean;\n historyEnabled: boolean;\n trackedHistory: HistoryIdentity[];\n } {\n return {\n enabled: this.enabled,\n diagnosticsVisible: this.diagnosticsVisible,\n historyEnabled: this.historyEnabled,\n trackedHistory: this.trackedHistory.map(({ clusterId, scope, uid }) => ({ clusterId, scope, uid })),\n };\n }\n}\n"],"mappings":";;;;AAIA,IAAa,6BAAb,cAAgD,mBAAA,OAAO,MAAM,eAK1D;CACD,UAAU;CACV,qBAAqB;CACrB,iBAAiB;CACjB,iBAAoC,CAAC;CAErC,cAAc;EACZ,MAAM;GACJ,YAAY;GACZ,UAAU;IAAE,SAAS;IAAO,oBAAoB;IAAM,gBAAgB;IAAO,gBAAgB,CAAC;GAAE;EAClG,CAAC;EACD,8BAAA,eAAe,MAAM;GACnB,SAAS,8BAAA;GACT,oBAAoB,8BAAA;GACpB,gBAAgB,8BAAA;GAChB,gBAAgB,8BAAA;GAChB,WAAW,8BAAA;EACb,CAAC;CACH;CAEA,UAAU,MAKD;EACP,KAAK,UAAU,MAAM,YAAY;EACjC,KAAK,qBAAqB,MAAM,uBAAuB;EACvD,KAAK,iBAAiB,MAAM,mBAAmB;EAC/C,KAAK,iBAAiB,MAAM,QAAQ,MAAM,cAAc,IACpD,KAAK,eACF,OAAO,2BAAA,oBAAoB,CAAC,CAC5B,MAAM,GAAG,GAAG,CAAC,CACb,KAAK,EAAE,WAAW,OAAO,WAAW;GAAE;GAAW;GAAO;EAAI,EAAE,IACjE,CAAC;CACP;CAEA,SAKE;EACA,OAAO;GACL,SAAS,KAAK;GACd,oBAAoB,KAAK;GACzB,gBAAgB,KAAK;GACrB,gBAAgB,KAAK,eAAe,KAAK,EAAE,WAAW,OAAO,WAAW;IAAE;IAAW;IAAO;GAAI,EAAE;EACpG;CACF;AACF"}