@64mb/freelens-power 1.1.0 → 1.2.1

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 (214) hide show
  1. package/README.md +5 -4
  2. package/THIRD_PARTY_LICENSES +1707 -0
  3. package/out/main/ai.js +63 -23
  4. package/out/main/ai.js.map +1 -1
  5. package/out/main/cluster-icons-catalog.js +28 -0
  6. package/out/main/cluster-icons-catalog.js.map +1 -0
  7. package/out/main/cluster-icons.js +125 -0
  8. package/out/main/cluster-icons.js.map +1 -0
  9. package/out/main/common/ai-terminal-context.js +51 -0
  10. package/out/main/common/ai-terminal-context.js.map +1 -0
  11. package/out/main/common/ai.js.map +1 -1
  12. package/out/main/common/cluster-icon-ipc.js +6 -0
  13. package/out/main/common/cluster-icon-ipc.js.map +1 -0
  14. package/out/main/common/cluster-icons.js +121 -0
  15. package/out/main/common/cluster-icons.js.map +1 -0
  16. package/out/main/common/dashboard.js +2 -1
  17. package/out/main/common/dashboard.js.map +1 -1
  18. package/out/main/common/settings-export.js +4 -2
  19. package/out/main/common/settings-export.js.map +1 -1
  20. package/out/main/common/store/cluster-icons-store.js +32 -0
  21. package/out/main/common/store/cluster-icons-store.js.map +1 -0
  22. package/out/main/common/store/dashboard-preferences-store.js +2 -1
  23. package/out/main/common/store/dashboard-preferences-store.js.map +1 -1
  24. package/out/main/common/store/monitoring-preferences-store.js +5 -0
  25. package/out/main/common/store/monitoring-preferences-store.js.map +1 -1
  26. package/out/main/dashboard-views.js +20 -10
  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 +9 -1
  31. package/out/main/index.js.map +1 -1
  32. package/out/main/monitoring-history.js +13 -3
  33. package/out/main/monitoring-history.js.map +1 -1
  34. package/out/renderer/_virtual/_global-external_react-dom.js +2 -1
  35. package/out/renderer/_virtual/_global-external_react.js +10 -5
  36. package/out/renderer/_virtual/_rolldown/runtime.js +22 -0
  37. package/out/renderer/ai-terminal-context.js +200 -0
  38. package/out/renderer/ai-terminal-context.js.map +1 -0
  39. package/out/renderer/ai.js +90 -9
  40. package/out/renderer/ai.js.map +1 -1
  41. package/out/renderer/appearance.js +1 -0
  42. package/out/renderer/appearance.js.map +1 -1
  43. package/out/renderer/cluster-icon-colors.js +188 -0
  44. package/out/renderer/cluster-icon-colors.js.map +1 -0
  45. package/out/renderer/cluster-icons.js +304 -0
  46. package/out/renderer/cluster-icons.js.map +1 -0
  47. package/out/renderer/dashboard.js +51 -14
  48. package/out/renderer/dashboard.js.map +1 -1
  49. package/out/renderer/details/secret-certificate-details.js +9 -2
  50. package/out/renderer/details/secret-certificate-details.js.map +1 -1
  51. package/out/renderer/diagnostics.css.js +39 -0
  52. package/out/renderer/diagnostics.css.js.map +1 -0
  53. package/out/renderer/diagnostics.js +796 -343
  54. package/out/renderer/diagnostics.js.map +1 -1
  55. package/out/renderer/index.js +9 -4
  56. package/out/renderer/index.js.map +1 -1
  57. package/out/renderer/monitoring-details-chart.js +42 -0
  58. package/out/renderer/monitoring-details-chart.js.map +1 -0
  59. package/out/renderer/monitoring-history-collection.js +2 -18
  60. package/out/renderer/monitoring-history-collection.js.map +1 -1
  61. package/out/renderer/monitoring-history-view.js +111 -34
  62. package/out/renderer/monitoring-history-view.js.map +1 -1
  63. package/out/renderer/monitoring.js +68 -27
  64. package/out/renderer/monitoring.js.map +1 -1
  65. package/out/renderer/node-monitoring.js +23 -12
  66. package/out/renderer/node-monitoring.js.map +1 -1
  67. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js +10 -0
  68. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js.map +1 -0
  69. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js +8 -0
  70. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js.map +1 -0
  71. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js +9 -0
  72. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js.map +1 -0
  73. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js +9 -0
  74. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js.map +1 -0
  75. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/classCallCheck.js +8 -0
  76. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/classCallCheck.js.map +1 -0
  77. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/createClass.js +15 -0
  78. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/createClass.js.map +1 -0
  79. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/createSuper.js +19 -0
  80. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/createSuper.js.map +1 -0
  81. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/defineProperty.js +14 -0
  82. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/defineProperty.js.map +1 -0
  83. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/extends.js +19 -0
  84. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/extends.js.map +1 -0
  85. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js +15 -0
  86. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js.map +1 -0
  87. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/inherits.js +14 -0
  88. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/inherits.js.map +1 -0
  89. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/isNativeReflectConstruct.js +18 -0
  90. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/isNativeReflectConstruct.js.map +1 -0
  91. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/iterableToArray.js +8 -0
  92. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/iterableToArray.js.map +1 -0
  93. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js +26 -0
  94. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js.map +1 -0
  95. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/nonIterableRest.js +8 -0
  96. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/nonIterableRest.js.map +1 -0
  97. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js +8 -0
  98. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js.map +1 -0
  99. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/objectSpread2.js +27 -0
  100. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/objectSpread2.js.map +1 -0
  101. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js +15 -0
  102. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js.map +1 -0
  103. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js +14 -0
  104. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js.map +1 -0
  105. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js +12 -0
  106. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js.map +1 -0
  107. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js +15 -0
  108. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js.map +1 -0
  109. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/slicedToArray.js +12 -0
  110. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/slicedToArray.js.map +1 -0
  111. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/taggedTemplateLiteral.js +8 -0
  112. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/taggedTemplateLiteral.js.map +1 -0
  113. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/toConsumableArray.js +12 -0
  114. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/toConsumableArray.js.map +1 -0
  115. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/toPrimitive.js +16 -0
  116. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/toPrimitive.js.map +1 -0
  117. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/toPropertyKey.js +11 -0
  118. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/toPropertyKey.js.map +1 -0
  119. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/typeof.js +18 -0
  120. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/typeof.js.map +1 -0
  121. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js +13 -0
  122. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js.map +1 -0
  123. package/out/renderer/node_modules/.pnpm/@emotion_cache@11.14.0/node_modules/@emotion/cache/dist/emotion-cache.browser.esm.js +237 -0
  124. package/out/renderer/node_modules/.pnpm/@emotion_cache@11.14.0/node_modules/@emotion/cache/dist/emotion-cache.browser.esm.js.map +1 -0
  125. package/out/renderer/node_modules/.pnpm/@emotion_hash@0.9.2/node_modules/@emotion/hash/dist/emotion-hash.esm.js +25 -0
  126. package/out/renderer/node_modules/.pnpm/@emotion_hash@0.9.2/node_modules/@emotion/hash/dist/emotion-hash.esm.js.map +1 -0
  127. package/out/renderer/node_modules/.pnpm/@emotion_memoize@0.9.0/node_modules/@emotion/memoize/dist/emotion-memoize.esm.js +12 -0
  128. package/out/renderer/node_modules/.pnpm/@emotion_memoize@0.9.0/node_modules/@emotion/memoize/dist/emotion-memoize.esm.js.map +1 -0
  129. 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
  130. 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
  131. 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
  132. 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
  133. package/out/renderer/node_modules/.pnpm/@emotion_serialize@1.3.3/node_modules/@emotion/serialize/dist/emotion-serialize.esm.js +133 -0
  134. package/out/renderer/node_modules/.pnpm/@emotion_serialize@1.3.3/node_modules/@emotion/serialize/dist/emotion-serialize.esm.js.map +1 -0
  135. package/out/renderer/node_modules/.pnpm/@emotion_sheet@1.4.0/node_modules/@emotion/sheet/dist/emotion-sheet.esm.js +65 -0
  136. package/out/renderer/node_modules/.pnpm/@emotion_sheet@1.4.0/node_modules/@emotion/sheet/dist/emotion-sheet.esm.js.map +1 -0
  137. package/out/renderer/node_modules/.pnpm/@emotion_unitless@0.10.0/node_modules/@emotion/unitless/dist/emotion-unitless.esm.js +54 -0
  138. package/out/renderer/node_modules/.pnpm/@emotion_unitless@0.10.0/node_modules/@emotion/unitless/dist/emotion-unitless.esm.js.map +1 -0
  139. 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
  140. 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
  141. package/out/renderer/node_modules/.pnpm/@emotion_utils@1.4.2/node_modules/@emotion/utils/dist/emotion-utils.browser.esm.js +30 -0
  142. package/out/renderer/node_modules/.pnpm/@emotion_utils@1.4.2/node_modules/@emotion/utils/dist/emotion-utils.browser.esm.js.map +1 -0
  143. package/out/renderer/node_modules/.pnpm/@floating-ui_dom@1.7.2/node_modules/@floating-ui/dom/dist/floating-ui.dom.js +211 -0
  144. 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
  145. 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
  146. 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
  147. package/out/renderer/node_modules/.pnpm/@floating-ui_utils@0.2.10/node_modules/@floating-ui/utils/dist/floating-ui.utils.js +31 -0
  148. 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
  149. 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
  150. 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
  151. package/out/renderer/node_modules/.pnpm/memoize-one@6.0.0/node_modules/memoize-one/dist/memoize-one.esm.js +38 -0
  152. package/out/renderer/node_modules/.pnpm/memoize-one@6.0.0/node_modules/memoize-one/dist/memoize-one.esm.js.map +1 -0
  153. package/out/renderer/node_modules/.pnpm/react-is@16.13.1/node_modules/react-is/cjs/react-is.development.js +159 -0
  154. package/out/renderer/node_modules/.pnpm/react-is@16.13.1/node_modules/react-is/cjs/react-is.development.js.map +1 -0
  155. package/out/renderer/node_modules/.pnpm/react-is@16.13.1/node_modules/react-is/cjs/react-is.production.min.js +103 -0
  156. package/out/renderer/node_modules/.pnpm/react-is@16.13.1/node_modules/react-is/cjs/react-is.production.min.js.map +1 -0
  157. package/out/renderer/node_modules/.pnpm/react-is@16.13.1/node_modules/react-is/index.js +18 -0
  158. package/out/renderer/node_modules/.pnpm/react-is@16.13.1/node_modules/react-is/index.js.map +1 -0
  159. package/out/renderer/node_modules/.pnpm/react-select@5.10.2_@types_react@17.0.93_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/react-select/dist/Select-ef7c0426.esm.js +2200 -0
  160. package/out/renderer/node_modules/.pnpm/react-select@5.10.2_@types_react@17.0.93_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/react-select/dist/Select-ef7c0426.esm.js.map +1 -0
  161. package/out/renderer/node_modules/.pnpm/react-select@5.10.2_@types_react@17.0.93_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/react-select/dist/index-641ee5b8.esm.js +992 -0
  162. package/out/renderer/node_modules/.pnpm/react-select@5.10.2_@types_react@17.0.93_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/react-select/dist/index-641ee5b8.esm.js.map +1 -0
  163. 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
  164. 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
  165. 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
  166. 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
  167. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Enum.js +22 -0
  168. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Enum.js.map +1 -0
  169. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Middleware.js +30 -0
  170. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Middleware.js.map +1 -0
  171. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Parser.js +164 -0
  172. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Parser.js.map +1 -0
  173. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Serializer.js +37 -0
  174. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Serializer.js.map +1 -0
  175. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Tokenizer.js +245 -0
  176. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Tokenizer.js.map +1 -0
  177. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Utility.js +120 -0
  178. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Utility.js.map +1 -0
  179. 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
  180. 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
  181. package/out/renderer/pod-monitoring.js +15 -19
  182. package/out/renderer/pod-monitoring.js.map +1 -1
  183. package/out/renderer/preferences/ai-shortcuts-preferences.js +12 -4
  184. package/out/renderer/preferences/ai-shortcuts-preferences.js.map +1 -1
  185. package/out/renderer/preferences/dashboard-preferences.js +37 -6
  186. package/out/renderer/preferences/dashboard-preferences.js.map +1 -1
  187. package/out/renderer/preferences/monitoring-preferences.js +131 -44
  188. package/out/renderer/preferences/monitoring-preferences.js.map +1 -1
  189. package/out/renderer/preferences/preferences.js +31 -7
  190. package/out/renderer/preferences/preferences.js.map +1 -1
  191. package/out/renderer/read-only.js +2 -2
  192. package/out/renderer/read-only.js.map +1 -1
  193. package/out/renderer/src/common/ai-terminal-context.js +51 -0
  194. package/out/renderer/src/common/ai-terminal-context.js.map +1 -0
  195. package/out/renderer/src/common/ai.js.map +1 -1
  196. package/out/renderer/src/common/cluster-icon-ipc.js +6 -0
  197. package/out/renderer/src/common/cluster-icon-ipc.js.map +1 -0
  198. package/out/renderer/src/common/cluster-icons.js +133 -0
  199. package/out/renderer/src/common/cluster-icons.js.map +1 -0
  200. package/out/renderer/src/common/dashboard.js +2 -1
  201. package/out/renderer/src/common/dashboard.js.map +1 -1
  202. package/out/renderer/src/common/date-time.js +11 -0
  203. package/out/renderer/src/common/date-time.js.map +1 -0
  204. package/out/renderer/src/common/monitoring-history.js +2 -0
  205. package/out/renderer/src/common/monitoring-history.js.map +1 -1
  206. package/out/renderer/src/common/resource-diagnostics.js.map +1 -1
  207. package/out/renderer/src/common/settings-export.js.map +1 -1
  208. package/out/renderer/src/common/store/dashboard-preferences-store.js +2 -1
  209. package/out/renderer/src/common/store/dashboard-preferences-store.js.map +1 -1
  210. package/out/renderer/src/common/store/monitoring-preferences-store.js +5 -0
  211. package/out/renderer/src/common/store/monitoring-preferences-store.js.map +1 -1
  212. package/out/renderer/welcome.js +28 -6
  213. package/out/renderer/welcome.js.map +1 -1
  214. package/package.json +3 -2
@@ -1 +1 @@
1
- {"version":3,"file":"ai-shortcuts-preferences.js","names":[],"sources":["../../../src/renderer/preferences/ai-shortcuts-preferences.tsx"],"sourcesContent":["import { Renderer } from \"@freelensapp/extensions\";\nimport { observer } from \"mobx-react\";\nimport { useState } from \"react\";\nimport { AiShortcutsStore } from \"../../common/store/ai-shortcuts-store\";\nimport { SettingsIconAction } from \"./settings-icon-action\";\nimport { SettingsField, SettingsModal } from \"./settings-modal\";\n\nimport type { AiShortcut } from \"../../common/ai-shortcuts\";\n\nconst { Button, Input } = Renderer.Component;\n\nexport const AiShortcutsPreferences = observer(({ disabled = false }: { disabled?: boolean }) => {\n const preferences = AiShortcutsStore.getInstanceOrCreate<AiShortcutsStore>();\n const [editing, setEditing] = useState<AiShortcut | null>(null);\n const [error, setError] = useState(\"\");\n const edit = (shortcut: AiShortcut) => {\n setEditing({ ...shortcut });\n setError(\"\");\n };\n const close = () => {\n setEditing(null);\n setError(\"\");\n };\n return (\n <div>\n <div className=\"power-ai-section-title\">Prompt shortcuts</div>\n <div className=\"power-settings-hint\">Launch a prompt from a new chat or type /command before sending.</div>\n {preferences.shortcuts.map((shortcut) => (\n <div key={shortcut.id} style={{ display: \"flex\", alignItems: \"center\", gap: 8, marginTop: 8 }}>\n <div style={{ flex: 1, minWidth: 0, overflowWrap: \"anywhere\" }}>\n <div>{shortcut.label}</div>\n <div className=\"power-settings-hint\" style={{ marginTop: 3, fontSize: 11 }}>\n /{shortcut.command}\n </div>\n </div>\n <SettingsIconAction\n material=\"edit\"\n disabled={disabled}\n label={`Edit ${shortcut.label}`}\n onClick={() => edit(shortcut)}\n />\n <SettingsIconAction\n material=\"delete_outline\"\n disabled={disabled}\n label={`Remove ${shortcut.label}`}\n onClick={() => preferences.removeShortcut(shortcut.id)}\n />\n </div>\n ))}\n <div style={{ display: \"flex\", justifyContent: \"flex-end\", marginTop: 16 }}>\n <Button\n primary\n label=\"Add shortcut\"\n disabled={disabled}\n onClick={() => edit({ id: globalThis.crypto.randomUUID(), label: \"\", command: \"\", prompt: \"\" })}\n />\n </div>\n {editing && !disabled && (\n <SettingsModal\n id=\"power-ai-shortcut-editor\"\n title={\n preferences.shortcuts.some((shortcut) => shortcut.id === editing.id) ? \"Edit shortcut\" : \"Add a shortcut\"\n }\n onClose={close}\n >\n <SettingsField id=\"power-ai-shortcut-label\" label=\"Label\">\n <Input\n autoFocus\n id=\"power-ai-shortcut-label\"\n aria-label=\"Shortcut label\"\n placeholder=\"Label\"\n value={editing.label}\n maxLength={80}\n onChange={(label) => setEditing({ ...editing, label })}\n />\n </SettingsField>\n <SettingsField id=\"power-ai-shortcut-command\" label=\"Command\">\n <Input\n id=\"power-ai-shortcut-command\"\n aria-label=\"Shortcut command\"\n placeholder=\"/command\"\n value={editing.command}\n maxLength={33}\n onChange={(command) => setEditing({ ...editing, command })}\n />\n </SettingsField>\n <div>\n <label htmlFor=\"power-ai-shortcut-prompt\">Prompt</label>\n <textarea\n id=\"power-ai-shortcut-prompt\"\n aria-label=\"Shortcut prompt\"\n className=\"power-ai-prompt\"\n placeholder=\"Prompt\"\n value={editing.prompt}\n maxLength={10000}\n onChange={(event) => setEditing({ ...editing, prompt: event.target.value })}\n style={{ marginTop: 8 }}\n />\n </div>\n {error && <div role=\"alert\">{error}</div>}\n <div style={{ display: \"flex\", justifyContent: \"flex-end\", gap: 12 }}>\n <Button label=\"Cancel\" onClick={close} />\n <Button\n primary\n label=\"Save shortcut\"\n onClick={() => {\n if (preferences.upsertShortcut(editing)) close();\n else\n setError(\n \"Enter a label, prompt and unique command using 1–32 letters, numbers, hyphens or underscores.\",\n );\n }}\n />\n </div>\n </SettingsModal>\n )}\n </div>\n );\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"ai-shortcuts-preferences.js","names":[],"sources":["../../../src/renderer/preferences/ai-shortcuts-preferences.tsx"],"sourcesContent":["import { Renderer } from \"@freelensapp/extensions\";\nimport { observer } from \"mobx-react\";\nimport { useState } from \"react\";\nimport { AiShortcutsStore } from \"../../common/store/ai-shortcuts-store\";\nimport { SettingsIconAction } from \"./settings-icon-action\";\nimport { SettingsField, SettingsModal } from \"./settings-modal\";\n\nimport type { AiShortcut } from \"../../common/ai-shortcuts\";\n\nconst { Button, Input } = Renderer.Component;\n\nexport const AiShortcutsPreferences = observer(({ disabled = false }: { disabled?: boolean }) => {\n const preferences = AiShortcutsStore.getInstanceOrCreate<AiShortcutsStore>();\n const [editing, setEditing] = useState<AiShortcut | null>(null);\n const [error, setError] = useState(\"\");\n const edit = (shortcut: AiShortcut) => {\n setEditing({ ...shortcut });\n setError(\"\");\n };\n const close = () => {\n setEditing(null);\n setError(\"\");\n };\n return (\n <div>\n <div className=\"power-ai-section-title\">Prompt shortcuts</div>\n <div className=\"power-settings-hint\">Launch a prompt from a new chat or type /command before sending.</div>\n {preferences.shortcuts.map((shortcut) => (\n <div key={shortcut.id} style={{ display: \"flex\", alignItems: \"center\", gap: 8, marginTop: 8 }}>\n <div style={{ flex: 1, minWidth: 0, overflowWrap: \"anywhere\" }}>\n <div>{shortcut.label}</div>\n <div className=\"power-settings-hint\" style={{ marginTop: 3, fontSize: 11 }}>\n /{shortcut.command}\n </div>\n </div>\n <SettingsIconAction\n material=\"edit\"\n disabled={disabled}\n label={`Edit ${shortcut.label}`}\n onClick={() => edit(shortcut)}\n />\n <SettingsIconAction\n material=\"delete_outline\"\n disabled={disabled}\n label={`Remove ${shortcut.label}`}\n onClick={() => preferences.removeShortcut(shortcut.id)}\n />\n </div>\n ))}\n <div style={{ display: \"flex\", justifyContent: \"flex-end\", marginTop: 16 }}>\n <Button\n primary\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: 6 }}\n disabled={disabled}\n onClick={() => edit({ id: globalThis.crypto.randomUUID(), label: \"\", command: \"\", prompt: \"\" })}\n >\n <Renderer.Component.Icon material=\"add\" size={16} />\n <span>Add shortcut</span>\n </Button>\n </div>\n {editing && !disabled && (\n <SettingsModal\n id=\"power-ai-shortcut-editor\"\n title={\n preferences.shortcuts.some((shortcut) => shortcut.id === editing.id) ? \"Edit shortcut\" : \"Add a shortcut\"\n }\n onClose={close}\n >\n <SettingsField id=\"power-ai-shortcut-label\" label=\"Label\">\n <Input\n autoFocus\n id=\"power-ai-shortcut-label\"\n aria-label=\"Shortcut label\"\n placeholder=\"Label\"\n value={editing.label}\n maxLength={80}\n onChange={(label) => setEditing({ ...editing, label })}\n />\n </SettingsField>\n <SettingsField id=\"power-ai-shortcut-command\" label=\"Command\">\n <Input\n id=\"power-ai-shortcut-command\"\n aria-label=\"Shortcut command\"\n placeholder=\"/command\"\n value={editing.command}\n maxLength={33}\n onChange={(command) => setEditing({ ...editing, command })}\n />\n </SettingsField>\n <div>\n <label htmlFor=\"power-ai-shortcut-prompt\">Prompt</label>\n <textarea\n id=\"power-ai-shortcut-prompt\"\n aria-label=\"Shortcut prompt\"\n className=\"power-ai-prompt\"\n placeholder=\"Prompt\"\n value={editing.prompt}\n maxLength={10000}\n onChange={(event) => setEditing({ ...editing, prompt: event.target.value })}\n style={{ marginTop: 8 }}\n />\n </div>\n {error && <div role=\"alert\">{error}</div>}\n <div style={{ display: \"flex\", justifyContent: \"flex-end\", gap: 12 }}>\n <Button label=\"Cancel\" onClick={close} />\n <Button\n primary\n label=\"Save shortcut\"\n onClick={() => {\n if (preferences.upsertShortcut(editing)) close();\n else\n setError(\n \"Enter a label, prompt and unique command using 1–32 letters, numbers, hyphens or underscores.\",\n );\n }}\n />\n </div>\n </SettingsModal>\n )}\n </div>\n );\n});\n"],"mappings":"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"}
@@ -5,14 +5,18 @@ const require_dashboard = require("../src/common/dashboard.js");
5
5
  const require_dashboard_preferences_store = require("../src/common/store/dashboard-preferences-store.js");
6
6
  const require__global_external_react = require("../_virtual/_global-external_react.js");
7
7
  const require_jsx_runtime = require("../_virtual/_global-external_react/jsx-runtime.js");
8
+ const require_settings_modal = require("./settings-modal.js");
8
9
  const require_dashboard_views = require("../src/common/dashboard-views.js");
9
10
  const require_settings_icon_action = require("./settings-icon-action.js");
10
- const require_settings_modal = require("./settings-modal.js");
11
11
  const require_dashboard_picker = require("../src/common/dashboard-picker.js");
12
12
  let electron = require("electron");
13
13
  //#region src/renderer/preferences/dashboard-preferences.tsx
14
14
  var { Input, Select, Button, Icon, Checkbox } = require_extensions.Renderer.Component;
15
15
  var sizeOptions = [
16
+ {
17
+ value: "xs",
18
+ label: "XS · Extra small"
19
+ },
16
20
  {
17
21
  value: "s",
18
22
  label: "S · Small"
@@ -24,6 +28,10 @@ var sizeOptions = [
24
28
  {
25
29
  value: "l",
26
30
  label: "L · Large"
31
+ },
32
+ {
33
+ value: "xl",
34
+ label: "XL · Extra large"
27
35
  }
28
36
  ];
29
37
  function CardEditor({ card, onSave, onClose }) {
@@ -48,6 +56,7 @@ function CardEditor({ card, onSave, onClose }) {
48
56
  url: normalizedUrl,
49
57
  size,
50
58
  autoRefresh,
59
+ ...card?.refreshEvery10Seconds ? { refreshEvery10Seconds: true } : {},
51
60
  selector: require_dashboard_selector.normalizeDashboardSelector(selector)
52
61
  });
53
62
  onClose();
@@ -166,11 +175,25 @@ function CardEditor({ card, onSave, onClose }) {
166
175
  }),
167
176
  /* @__PURE__ */ require_jsx_runtime.jsx(require_settings_modal.SettingsField, {
168
177
  id: `${id}-autorefresh`,
169
- label: "Autorefresh",
178
+ label: "Background refresh",
170
179
  children: /* @__PURE__ */ require_jsx_runtime.jsx(Checkbox, {
171
180
  id: `${id}-autorefresh`,
172
181
  value: autoRefresh,
173
- onChange: setAutoRefresh
182
+ onChange: setAutoRefresh,
183
+ children: /* @__PURE__ */ require_jsx_runtime.jsx("span", {
184
+ style: {
185
+ display: "inline-flex",
186
+ marginLeft: 6
187
+ },
188
+ children: /* @__PURE__ */ require_jsx_runtime.jsx(Icon, {
189
+ material: "info_outline",
190
+ size: 14,
191
+ tooltip: {
192
+ children: "Refresh cached pages every 10 minutes while the dashboard is closed",
193
+ style: { zIndex: 12020 }
194
+ }
195
+ })
196
+ })
174
197
  })
175
198
  }),
176
199
  /* @__PURE__ */ require_jsx_runtime.jsxs("div", {
@@ -372,10 +395,18 @@ var DashboardPreferences = require__global_external_mobx_react.observer(() => {
372
395
  display: "flex",
373
396
  justifyContent: "flex-end"
374
397
  },
375
- children: /* @__PURE__ */ require_jsx_runtime.jsx(Button, {
398
+ children: /* @__PURE__ */ require_jsx_runtime.jsxs(Button, {
376
399
  primary: true,
377
- label: "Add card",
378
- onClick: () => setEditing("new")
400
+ style: {
401
+ display: "inline-flex",
402
+ alignItems: "center",
403
+ gap: 6
404
+ },
405
+ onClick: () => setEditing("new"),
406
+ children: [/* @__PURE__ */ require_jsx_runtime.jsx(require_extensions.Renderer.Component.Icon, {
407
+ material: "add",
408
+ size: 16
409
+ }), /* @__PURE__ */ require_jsx_runtime.jsx("span", { children: "Add card" })]
379
410
  })
380
411
  }),
381
412
  editing && /* @__PURE__ */ require_jsx_runtime.jsx(CardEditor, {
@@ -1 +1 @@
1
- {"version":3,"file":"dashboard-preferences.js","names":[],"sources":["../../../src/renderer/preferences/dashboard-preferences.tsx"],"sourcesContent":["import { Renderer } from \"@freelensapp/extensions\";\nimport { ipcRenderer } from \"electron\";\nimport { observer } from \"mobx-react\";\nimport { useEffect, useState } from \"react\";\nimport { type DashboardCard, type DashboardCardSize, normalizeDashboardUrl } from \"../../common/dashboard\";\nimport { DASHBOARD_PICK_ELEMENT, type DashboardPickerResult } from \"../../common/dashboard-picker\";\nimport { dashboardSelectorLimit, normalizeDashboardSelector } from \"../../common/dashboard-selector\";\nimport { DASHBOARD_SITE_ICONS, type DashboardSiteIcon } from \"../../common/dashboard-views\";\nimport { DashboardPreferencesStore } from \"../../common/store/dashboard-preferences-store\";\nimport { SettingsIconAction } from \"./settings-icon-action\";\nimport { SettingsField, SettingsModal } from \"./settings-modal\";\n\nconst { Input, Select, Button, Icon, Checkbox } = Renderer.Component;\nconst sizeOptions = [\n { value: \"s\" as const, label: \"S · Small\" },\n { value: \"m\" as const, label: \"M · Medium\" },\n { value: \"l\" as const, label: \"L · Large\" },\n];\n\nfunction CardEditor({\n card,\n onSave,\n onClose,\n}: {\n card?: DashboardCard;\n onSave: (card: DashboardCard) => void;\n onClose: () => void;\n}) {\n const [title, setTitle] = useState(card?.title ?? \"\");\n const [url, setUrl] = useState(card?.url ?? \"\");\n const [size, setSize] = useState<DashboardCardSize>(card?.size ?? \"m\");\n const [autoRefresh, setAutoRefresh] = useState(card ? card.autoRefresh === true : true);\n const [selector, setSelector] = useState(card?.selector ?? \"\");\n const selectorInvalid = selector.trim().length > 0 && !normalizeDashboardSelector(selector);\n const [picking, setPicking] = useState(false);\n const [pickerError, setPickerError] = useState(false);\n const [submitted, setSubmitted] = useState(false);\n const id = `freelens-power-dashboard-${card?.id ?? \"new\"}`;\n const normalizedUrl = normalizeDashboardUrl(url);\n const invalid = (submitted || url.length > 0) && !normalizedUrl;\n\n function save() {\n setSubmitted(true);\n if (!normalizedUrl || selectorInvalid) return;\n onSave({\n id: card?.id ?? crypto.randomUUID(),\n title: title.trim() || new URL(normalizedUrl).hostname,\n url: normalizedUrl,\n size,\n autoRefresh,\n selector: normalizeDashboardSelector(selector),\n });\n onClose();\n }\n\n return (\n <SettingsModal id={id} title={card ? \"Edit card\" : \"Add a card\"} onClose={onClose}>\n <SettingsField id={`${id}-title`} label=\"Title\">\n <Input autoFocus id={`${id}-title`} value={title} placeholder=\"Website name\" onChange={setTitle} />\n </SettingsField>\n <SettingsField id={`${id}-url`} label=\"URL\">\n <Input\n id={`${id}-url`}\n value={url}\n placeholder=\"https://example.com\"\n onChange={setUrl}\n aria-invalid={invalid}\n aria-describedby={invalid ? `${id}-error` : undefined}\n />\n {invalid && (\n <div id={`${id}-error`} role=\"alert\" style={{ color: \"var(--colorError)\", marginTop: 6 }}>\n Enter a valid HTTP or HTTPS URL.\n </div>\n )}\n </SettingsField>\n <SettingsField id={`${id}-selector`} label=\"CSS selector (optional)\">\n <div className=\"power-dashboard-selector-editor\">\n <div className=\"power-dashboard-selector-field\">\n <Input\n className=\"power-dashboard-selector-input\"\n id={`${id}-selector`}\n value={selector}\n onChange={setSelector}\n placeholder=\"main .chart\"\n aria-invalid={selectorInvalid}\n />\n {selector && (\n <SettingsIconAction\n material=\"close\"\n label=\"Clear selector\"\n disabled={picking}\n onClick={() => setSelector(\"\")}\n />\n )}\n <SettingsIconAction\n material=\"center_focus_strong\"\n label={picking ? \"Selecting element…\" : \"Pick element on website\"}\n disabled={!normalizedUrl || picking}\n onClick={() => {\n if (!normalizedUrl || picking) return;\n setPicking(true);\n setPickerError(false);\n void ipcRenderer\n .invoke(DASHBOARD_PICK_ELEMENT, { url: normalizedUrl })\n .then((result: DashboardPickerResult) => {\n if (result?.status === \"selected\") {\n const selected = normalizeDashboardSelector(result.selector);\n if (selected) setSelector(selected);\n else setPickerError(true);\n } else if (result?.status !== \"canceled\") setPickerError(true);\n })\n .catch(() => setPickerError(true))\n .finally(() => setPicking(false));\n }}\n />\n </div>\n {selectorInvalid && (\n <div role=\"alert\">Use at most {dashboardSelectorLimit} characters without control characters.</div>\n )}\n {pickerError && <div role=\"alert\">Could not select an element. Try again or enter a CSS selector.</div>}\n </div>\n </SettingsField>\n <SettingsField id={`${id}-size`} label=\"Card size\">\n <Select\n id={`${id}-size`}\n aria-label=\"Card size\"\n styles={{ menuPortal: (base) => ({ ...base, zIndex: 12010 }) }}\n options={sizeOptions}\n value={size}\n isSearchable={false}\n isClearable={false}\n onChange={(option) => {\n if (option) setSize(option.value);\n }}\n />\n </SettingsField>\n <SettingsField id={`${id}-autorefresh`} label=\"Autorefresh\">\n <Checkbox {...{ id: `${id}-autorefresh` }} value={autoRefresh} onChange={setAutoRefresh} />\n </SettingsField>\n <div style={{ display: \"flex\", justifyContent: \"flex-end\", gap: 12 }}>\n <Button label=\"Cancel\" onClick={onClose} />\n <Button primary label={card ? \"Save card\" : \"Add card\"} onClick={save} />\n </div>\n </SettingsModal>\n );\n}\n\nfunction WebsiteIcon({ url, favicon }: { url: string; favicon?: string }) {\n const source = favicon || new URL(\"/favicon.ico\", url).href;\n const [failedSource, setFailedSource] = useState<string>();\n return failedSource === source ? (\n <span aria-hidden=\"true\">🌐</span>\n ) : (\n <img\n src={source}\n alt=\"\"\n width={20}\n height={20}\n loading=\"lazy\"\n referrerPolicy=\"no-referrer\"\n onError={() => setFailedSource(source)}\n />\n );\n}\n\nexport const DashboardPreferences = observer(() => {\n const preferences = DashboardPreferencesStore.getInstanceOrCreate<DashboardPreferencesStore>();\n const [siteIcons, setSiteIcons] = useState<DashboardSiteIcon[]>([]);\n const cardIdentity = JSON.stringify(preferences.cards.map(({ id, url }) => ({ id, url })));\n useEffect(() => {\n let active = true;\n const refreshIcons = () =>\n void ipcRenderer\n .invoke(DASHBOARD_SITE_ICONS)\n .then((icons: DashboardSiteIcon[]) => {\n if (active && Array.isArray(icons)) setSiteIcons(icons);\n })\n .catch(() => {});\n refreshIcons();\n ipcRenderer.on(DASHBOARD_SITE_ICONS, refreshIcons);\n return () => {\n active = false;\n ipcRenderer.removeListener(DASHBOARD_SITE_ICONS, refreshIcons);\n };\n }, [cardIdentity]);\n const [editing, setEditing] = useState<DashboardCard | \"new\" | null>(null);\n const [draggingId, setDraggingId] = useState<string | null>(null);\n const [dropId, setDropId] = useState<string | null>(null);\n const [announcement, setAnnouncement] = useState(\"\");\n\n function moveCard(card: DashboardCard, index: number) {\n preferences.moveCard(card.id, index);\n setAnnouncement(\n `${card.title} moved to position ${preferences.cards.findIndex((entry) => entry.id === card.id) + 1}`,\n );\n }\n\n function finishDrag() {\n setDraggingId(null);\n setDropId(null);\n }\n\n return (\n <div style={{ display: \"grid\", gap: 8 }}>\n <div className=\"power-settings-hint\">\n Display websites in responsive dashboard cards. Some websites block embedding.\n </div>\n <style>{`\n .power-dashboard-drag-handle { display: inline-flex; align-items: center; padding: 4px; border: 0; border-radius: 4px; background: transparent; color: var(--textColorSecondary); cursor: grab; flex-shrink: 0; }\n .power-dashboard-drag-handle:focus-visible { outline: 2px solid var(--primary); outline-offset: 2px; }\n .power-dashboard-drag-handle:active { cursor: grabbing; }\n `}</style>\n <div\n role=\"status\"\n aria-live=\"polite\"\n style={{ position: \"absolute\", width: 1, height: 1, overflow: \"hidden\", clipPath: \"inset(50%)\" }}\n >\n {announcement}\n </div>\n {preferences.cards.map((card, index) => (\n <div\n key={card.id}\n data-dashboard-card-id={card.id}\n onDragOver={(event) => {\n if (!draggingId || draggingId === card.id) return;\n event.preventDefault();\n event.dataTransfer.dropEffect = \"move\";\n setDropId(card.id);\n }}\n onDrop={(event) => {\n if (!draggingId) return;\n event.preventDefault();\n const dragged = preferences.cards.find((entry) => entry.id === draggingId);\n if (dragged) moveCard(dragged, index);\n finishDrag();\n }}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 12,\n minWidth: 0,\n padding: \"8px 0\",\n borderBottom: \"1px solid var(--borderFaintColor)\",\n boxShadow:\n dropId === card.id && draggingId !== card.id\n ? `0 ${preferences.cards.findIndex((entry) => entry.id === draggingId) < index ? 2 : -2}px 0 var(--primary)`\n : undefined,\n opacity: draggingId === card.id ? 0.5 : 1,\n }}\n >\n <button\n type=\"button\"\n className=\"power-dashboard-drag-handle\"\n draggable\n aria-label={`Reorder ${card.title}`}\n title=\"Drag to reorder, or use the Up and Down arrow keys\"\n onDragStart={(event) => {\n event.dataTransfer.effectAllowed = \"move\";\n event.dataTransfer.setData(\"text/plain\", card.id);\n setDraggingId(card.id);\n }}\n onDragEnd={finishDrag}\n onKeyDown={(event) => {\n if (event.key !== \"ArrowUp\" && event.key !== \"ArrowDown\") return;\n event.preventDefault();\n event.stopPropagation();\n moveCard(\n card,\n Math.max(0, Math.min(preferences.cards.length - 1, index + (event.key === \"ArrowUp\" ? -1 : 1))),\n );\n }}\n >\n <Icon material=\"drag_indicator\" />\n </button>\n <WebsiteIcon\n key={card.url}\n url={card.url}\n favicon={\n siteIcons.find((icon) => icon.id === card.id && icon.pageUrl === normalizeDashboardUrl(card.url))?.dataUrl\n }\n />\n <div style={{ flex: 1, minWidth: 0 }}>\n <div\n title={card.title}\n style={{ fontWeight: 600, overflow: \"hidden\", textOverflow: \"ellipsis\", whiteSpace: \"nowrap\" }}\n >\n {card.title}\n </div>\n <div\n className=\"power-settings-hint\"\n title={card.url}\n style={{ overflow: \"hidden\", textOverflow: \"ellipsis\", whiteSpace: \"nowrap\", marginTop: 3 }}\n >\n {card.url}\n </div>\n </div>\n <span\n aria-label={`Card size ${card.size.toUpperCase()}`}\n style={{\n flexShrink: 0,\n marginRight: 10,\n padding: \"3px 7px\",\n border: \"1px solid var(--borderFaintColor)\",\n borderRadius: 6,\n fontSize: 11,\n fontFamily: \"var(--font-monospace, monospace)\",\n lineHeight: \"18px\",\n color: \"var(--textColorSecondary)\",\n }}\n >\n Size: {card.size.toUpperCase()}\n </span>\n <SettingsIconAction material=\"edit\" label={`Edit ${card.title}`} onClick={() => setEditing(card)} />\n <SettingsIconAction\n material=\"delete_outline\"\n label={`Remove ${card.title}`}\n onClick={() => preferences.removeCard(card.id)}\n />\n </div>\n ))}\n <div style={{ display: \"flex\", justifyContent: \"flex-end\" }}>\n <Button primary label=\"Add card\" onClick={() => setEditing(\"new\")} />\n </div>\n {editing && (\n <CardEditor\n card={editing === \"new\" ? undefined : editing}\n onSave={(value) => preferences.upsertCard(value)}\n onClose={() => setEditing(null)}\n />\n )}\n </div>\n );\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"dashboard-preferences.js","names":[],"sources":["../../../src/renderer/preferences/dashboard-preferences.tsx"],"sourcesContent":["import { Renderer } from \"@freelensapp/extensions\";\nimport { ipcRenderer } from \"electron\";\nimport { observer } from \"mobx-react\";\nimport { useEffect, useState } from \"react\";\nimport { type DashboardCard, type DashboardCardSize, normalizeDashboardUrl } from \"../../common/dashboard\";\nimport { DASHBOARD_PICK_ELEMENT, type DashboardPickerResult } from \"../../common/dashboard-picker\";\nimport { dashboardSelectorLimit, normalizeDashboardSelector } from \"../../common/dashboard-selector\";\nimport { DASHBOARD_SITE_ICONS, type DashboardSiteIcon } from \"../../common/dashboard-views\";\nimport { DashboardPreferencesStore } from \"../../common/store/dashboard-preferences-store\";\nimport { SettingsIconAction } from \"./settings-icon-action\";\nimport { SettingsField, SettingsModal } from \"./settings-modal\";\n\nconst { Input, Select, Button, Icon, Checkbox } = Renderer.Component;\nconst sizeOptions = [\n { value: \"xs\" as const, label: \"XS · Extra small\" },\n { value: \"s\" as const, label: \"S · Small\" },\n { value: \"m\" as const, label: \"M · Medium\" },\n { value: \"l\" as const, label: \"L · Large\" },\n { value: \"xl\" as const, label: \"XL · Extra large\" },\n];\n\nfunction CardEditor({\n card,\n onSave,\n onClose,\n}: {\n card?: DashboardCard;\n onSave: (card: DashboardCard) => void;\n onClose: () => void;\n}) {\n const [title, setTitle] = useState(card?.title ?? \"\");\n const [url, setUrl] = useState(card?.url ?? \"\");\n const [size, setSize] = useState<DashboardCardSize>(card?.size ?? \"m\");\n const [autoRefresh, setAutoRefresh] = useState(card ? card.autoRefresh === true : true);\n const [selector, setSelector] = useState(card?.selector ?? \"\");\n const selectorInvalid = selector.trim().length > 0 && !normalizeDashboardSelector(selector);\n const [picking, setPicking] = useState(false);\n const [pickerError, setPickerError] = useState(false);\n const [submitted, setSubmitted] = useState(false);\n const id = `freelens-power-dashboard-${card?.id ?? \"new\"}`;\n const normalizedUrl = normalizeDashboardUrl(url);\n const invalid = (submitted || url.length > 0) && !normalizedUrl;\n\n function save() {\n setSubmitted(true);\n if (!normalizedUrl || selectorInvalid) return;\n onSave({\n id: card?.id ?? crypto.randomUUID(),\n title: title.trim() || new URL(normalizedUrl).hostname,\n url: normalizedUrl,\n size,\n autoRefresh,\n ...(card?.refreshEvery10Seconds ? { refreshEvery10Seconds: true } : {}),\n selector: normalizeDashboardSelector(selector),\n });\n onClose();\n }\n\n return (\n <SettingsModal id={id} title={card ? \"Edit card\" : \"Add a card\"} onClose={onClose}>\n <SettingsField id={`${id}-title`} label=\"Title\">\n <Input autoFocus id={`${id}-title`} value={title} placeholder=\"Website name\" onChange={setTitle} />\n </SettingsField>\n <SettingsField id={`${id}-url`} label=\"URL\">\n <Input\n id={`${id}-url`}\n value={url}\n placeholder=\"https://example.com\"\n onChange={setUrl}\n aria-invalid={invalid}\n aria-describedby={invalid ? `${id}-error` : undefined}\n />\n {invalid && (\n <div id={`${id}-error`} role=\"alert\" style={{ color: \"var(--colorError)\", marginTop: 6 }}>\n Enter a valid HTTP or HTTPS URL.\n </div>\n )}\n </SettingsField>\n <SettingsField id={`${id}-selector`} label=\"CSS selector (optional)\">\n <div className=\"power-dashboard-selector-editor\">\n <div className=\"power-dashboard-selector-field\">\n <Input\n className=\"power-dashboard-selector-input\"\n id={`${id}-selector`}\n value={selector}\n onChange={setSelector}\n placeholder=\"main .chart\"\n aria-invalid={selectorInvalid}\n />\n {selector && (\n <SettingsIconAction\n material=\"close\"\n label=\"Clear selector\"\n disabled={picking}\n onClick={() => setSelector(\"\")}\n />\n )}\n <SettingsIconAction\n material=\"center_focus_strong\"\n label={picking ? \"Selecting element…\" : \"Pick element on website\"}\n disabled={!normalizedUrl || picking}\n onClick={() => {\n if (!normalizedUrl || picking) return;\n setPicking(true);\n setPickerError(false);\n void ipcRenderer\n .invoke(DASHBOARD_PICK_ELEMENT, { url: normalizedUrl })\n .then((result: DashboardPickerResult) => {\n if (result?.status === \"selected\") {\n const selected = normalizeDashboardSelector(result.selector);\n if (selected) setSelector(selected);\n else setPickerError(true);\n } else if (result?.status !== \"canceled\") setPickerError(true);\n })\n .catch(() => setPickerError(true))\n .finally(() => setPicking(false));\n }}\n />\n </div>\n {selectorInvalid && (\n <div role=\"alert\">Use at most {dashboardSelectorLimit} characters without control characters.</div>\n )}\n {pickerError && <div role=\"alert\">Could not select an element. Try again or enter a CSS selector.</div>}\n </div>\n </SettingsField>\n <SettingsField id={`${id}-size`} label=\"Card size\">\n <Select\n id={`${id}-size`}\n aria-label=\"Card size\"\n styles={{ menuPortal: (base) => ({ ...base, zIndex: 12010 }) }}\n options={sizeOptions}\n value={size}\n isSearchable={false}\n isClearable={false}\n onChange={(option) => {\n if (option) setSize(option.value);\n }}\n />\n </SettingsField>\n <SettingsField id={`${id}-autorefresh`} label=\"Background refresh\">\n <Checkbox {...{ id: `${id}-autorefresh` }} value={autoRefresh} onChange={setAutoRefresh}>\n <span style={{ display: \"inline-flex\", marginLeft: 6 }}>\n <Icon\n material=\"info_outline\"\n size={14}\n tooltip={{\n children: \"Refresh cached pages every 10 minutes while the dashboard is closed\",\n style: { zIndex: 12020 },\n }}\n />\n </span>\n </Checkbox>\n </SettingsField>\n <div style={{ display: \"flex\", justifyContent: \"flex-end\", gap: 12 }}>\n <Button label=\"Cancel\" onClick={onClose} />\n <Button primary label={card ? \"Save card\" : \"Add card\"} onClick={save} />\n </div>\n </SettingsModal>\n );\n}\n\nfunction WebsiteIcon({ url, favicon }: { url: string; favicon?: string }) {\n const source = favicon || new URL(\"/favicon.ico\", url).href;\n const [failedSource, setFailedSource] = useState<string>();\n return failedSource === source ? (\n <span aria-hidden=\"true\">🌐</span>\n ) : (\n <img\n src={source}\n alt=\"\"\n width={20}\n height={20}\n loading=\"lazy\"\n referrerPolicy=\"no-referrer\"\n onError={() => setFailedSource(source)}\n />\n );\n}\n\nexport const DashboardPreferences = observer(() => {\n const preferences = DashboardPreferencesStore.getInstanceOrCreate<DashboardPreferencesStore>();\n const [siteIcons, setSiteIcons] = useState<DashboardSiteIcon[]>([]);\n const cardIdentity = JSON.stringify(preferences.cards.map(({ id, url }) => ({ id, url })));\n useEffect(() => {\n let active = true;\n const refreshIcons = () =>\n void ipcRenderer\n .invoke(DASHBOARD_SITE_ICONS)\n .then((icons: DashboardSiteIcon[]) => {\n if (active && Array.isArray(icons)) setSiteIcons(icons);\n })\n .catch(() => {});\n refreshIcons();\n ipcRenderer.on(DASHBOARD_SITE_ICONS, refreshIcons);\n return () => {\n active = false;\n ipcRenderer.removeListener(DASHBOARD_SITE_ICONS, refreshIcons);\n };\n }, [cardIdentity]);\n const [editing, setEditing] = useState<DashboardCard | \"new\" | null>(null);\n const [draggingId, setDraggingId] = useState<string | null>(null);\n const [dropId, setDropId] = useState<string | null>(null);\n const [announcement, setAnnouncement] = useState(\"\");\n\n function moveCard(card: DashboardCard, index: number) {\n preferences.moveCard(card.id, index);\n setAnnouncement(\n `${card.title} moved to position ${preferences.cards.findIndex((entry) => entry.id === card.id) + 1}`,\n );\n }\n\n function finishDrag() {\n setDraggingId(null);\n setDropId(null);\n }\n\n return (\n <div style={{ display: \"grid\", gap: 8 }}>\n <div className=\"power-settings-hint\">\n Display websites in responsive dashboard cards. Some websites block embedding.\n </div>\n <style>{`\n .power-dashboard-drag-handle { display: inline-flex; align-items: center; padding: 4px; border: 0; border-radius: 4px; background: transparent; color: var(--textColorSecondary); cursor: grab; flex-shrink: 0; }\n .power-dashboard-drag-handle:focus-visible { outline: 2px solid var(--primary); outline-offset: 2px; }\n .power-dashboard-drag-handle:active { cursor: grabbing; }\n `}</style>\n <div\n role=\"status\"\n aria-live=\"polite\"\n style={{ position: \"absolute\", width: 1, height: 1, overflow: \"hidden\", clipPath: \"inset(50%)\" }}\n >\n {announcement}\n </div>\n {preferences.cards.map((card, index) => (\n <div\n key={card.id}\n data-dashboard-card-id={card.id}\n onDragOver={(event) => {\n if (!draggingId || draggingId === card.id) return;\n event.preventDefault();\n event.dataTransfer.dropEffect = \"move\";\n setDropId(card.id);\n }}\n onDrop={(event) => {\n if (!draggingId) return;\n event.preventDefault();\n const dragged = preferences.cards.find((entry) => entry.id === draggingId);\n if (dragged) moveCard(dragged, index);\n finishDrag();\n }}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 12,\n minWidth: 0,\n padding: \"8px 0\",\n borderBottom: \"1px solid var(--borderFaintColor)\",\n boxShadow:\n dropId === card.id && draggingId !== card.id\n ? `0 ${preferences.cards.findIndex((entry) => entry.id === draggingId) < index ? 2 : -2}px 0 var(--primary)`\n : undefined,\n opacity: draggingId === card.id ? 0.5 : 1,\n }}\n >\n <button\n type=\"button\"\n className=\"power-dashboard-drag-handle\"\n draggable\n aria-label={`Reorder ${card.title}`}\n title=\"Drag to reorder, or use the Up and Down arrow keys\"\n onDragStart={(event) => {\n event.dataTransfer.effectAllowed = \"move\";\n event.dataTransfer.setData(\"text/plain\", card.id);\n setDraggingId(card.id);\n }}\n onDragEnd={finishDrag}\n onKeyDown={(event) => {\n if (event.key !== \"ArrowUp\" && event.key !== \"ArrowDown\") return;\n event.preventDefault();\n event.stopPropagation();\n moveCard(\n card,\n Math.max(0, Math.min(preferences.cards.length - 1, index + (event.key === \"ArrowUp\" ? -1 : 1))),\n );\n }}\n >\n <Icon material=\"drag_indicator\" />\n </button>\n <WebsiteIcon\n key={card.url}\n url={card.url}\n favicon={\n siteIcons.find((icon) => icon.id === card.id && icon.pageUrl === normalizeDashboardUrl(card.url))?.dataUrl\n }\n />\n <div style={{ flex: 1, minWidth: 0 }}>\n <div\n title={card.title}\n style={{ fontWeight: 600, overflow: \"hidden\", textOverflow: \"ellipsis\", whiteSpace: \"nowrap\" }}\n >\n {card.title}\n </div>\n <div\n className=\"power-settings-hint\"\n title={card.url}\n style={{ overflow: \"hidden\", textOverflow: \"ellipsis\", whiteSpace: \"nowrap\", marginTop: 3 }}\n >\n {card.url}\n </div>\n </div>\n <span\n aria-label={`Card size ${card.size.toUpperCase()}`}\n style={{\n flexShrink: 0,\n marginRight: 10,\n padding: \"3px 7px\",\n border: \"1px solid var(--borderFaintColor)\",\n borderRadius: 6,\n fontSize: 11,\n fontFamily: \"var(--font-monospace, monospace)\",\n lineHeight: \"18px\",\n color: \"var(--textColorSecondary)\",\n }}\n >\n Size: {card.size.toUpperCase()}\n </span>\n <SettingsIconAction material=\"edit\" label={`Edit ${card.title}`} onClick={() => setEditing(card)} />\n <SettingsIconAction\n material=\"delete_outline\"\n label={`Remove ${card.title}`}\n onClick={() => preferences.removeCard(card.id)}\n />\n </div>\n ))}\n <div style={{ display: \"flex\", justifyContent: \"flex-end\" }}>\n <Button\n primary\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: 6 }}\n onClick={() => setEditing(\"new\")}\n >\n <Renderer.Component.Icon material=\"add\" size={16} />\n <span>Add card</span>\n </Button>\n </div>\n {editing && (\n <CardEditor\n card={editing === \"new\" ? undefined : editing}\n onSave={(value) => preferences.upsertCard(value)}\n onClose={() => setEditing(null)}\n />\n )}\n </div>\n );\n});\n"],"mappings":"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"}
@@ -1,15 +1,16 @@
1
1
  const require_extensions = require("../_virtual/_global-external_@freelensapp/extensions.js");
2
2
  const require__global_external_mobx_react = require("../_virtual/_global-external_mobx-react.js");
3
+ const require_monitoring_history = require("../src/common/monitoring-history.js");
3
4
  const require_monitoring_preferences_store = require("../src/common/store/monitoring-preferences-store.js");
4
5
  const require__global_external_react = require("../_virtual/_global-external_react.js");
5
6
  const require_jsx_runtime = require("../_virtual/_global-external_react/jsx-runtime.js");
6
- const require_monitoring_history = require("../monitoring-history.js");
7
+ const require_monitoring_history$1 = require("../monitoring-history.js");
7
8
  //#region src/renderer/preferences/monitoring-preferences.tsx
8
9
  var MonitoringPreferences = require__global_external_mobx_react.observer(() => {
9
10
  const preferences = require_monitoring_preferences_store.MonitoringPreferencesStore.getInstanceOrCreate();
10
11
  const [status, setStatus] = require__global_external_react.useState();
11
12
  const refresh = () => {
12
- require_monitoring_history.monitoringHistory.status().then(setStatus).catch(() => setStatus({
13
+ require_monitoring_history$1.monitoringHistory.status().then(setStatus).catch(() => setStatus({
13
14
  available: false,
14
15
  enabled: preferences.historyEnabled,
15
16
  bytes: 0,
@@ -18,48 +19,134 @@ var MonitoringPreferences = require__global_external_mobx_react.observer(() => {
18
19
  }));
19
20
  };
20
21
  require__global_external_react.useEffect(refresh, [preferences.historyEnabled]);
21
- return /* @__PURE__ */ require_jsx_runtime.jsxs("div", { children: [
22
- /* @__PURE__ */ require_jsx_runtime.jsx(require_extensions.Renderer.Component.Switch, {
23
- checked: preferences.enabled,
24
- onChange: (value) => {
25
- preferences.enabled = value;
26
- },
27
- children: "Metrics-server monitoring"
28
- }),
29
- /* @__PURE__ */ require_jsx_runtime.jsx("div", {
30
- className: "power-settings-hint",
31
- children: "Show cluster, node and pod CPU/memory charts from metrics-server. Live samples are kept for 30 minutes. Requires permission to read the corresponding resource metrics. Requests and capacity use Kubernetes resource data."
32
- }),
33
- /* @__PURE__ */ require_jsx_runtime.jsx(require_extensions.Renderer.Component.Switch, {
34
- checked: preferences.historyEnabled,
35
- onChange: (value) => {
36
- preferences.historyEnabled = value;
37
- },
38
- children: "Keep local numeric monitoring history"
39
- }),
40
- /* @__PURE__ */ require_jsx_runtime.jsx("div", {
41
- className: "power-settings-hint",
42
- children: "Opt-in local SQLite history. Retained for up to 7 days within 100 MiB. Collection runs while monitoring is enabled and the cluster view is active. Track individual pods or workloads in Diagnostics. Resolution: 30 seconds for 2 hours, 5 minutes for 24 hours, 30 minutes for 7 days. No data is backfilled. Disabling collection preserves existing history until cleared."
43
- }),
44
- /* @__PURE__ */ require_jsx_runtime.jsx("div", {
45
- role: "status",
46
- children: status?.error ?? (status ? `${(status.bytes / 1024 / 1024).toFixed(2)} MiB, ${status.samples} stored metric buckets` : "Checking history storage…")
47
- }),
48
- /* @__PURE__ */ require_jsx_runtime.jsx("button", {
49
- type: "button",
50
- title: "Delete locally collected metric history without changing other settings",
51
- onClick: () => {
52
- require_monitoring_history.monitoringHistory.clear().then(refresh).catch(() => setStatus({
53
- available: false,
54
- enabled: preferences.historyEnabled,
55
- bytes: 0,
56
- samples: 0,
57
- error: "Unable to clear local history"
58
- }));
59
- },
60
- children: "Clear local history"
61
- })
62
- ] });
22
+ return /* @__PURE__ */ require_jsx_runtime.jsxs("div", {
23
+ style: {
24
+ display: "flex",
25
+ flexDirection: "column",
26
+ gap: 20
27
+ },
28
+ children: [
29
+ /* @__PURE__ */ require_jsx_runtime.jsxs("div", { children: [/* @__PURE__ */ require_jsx_runtime.jsx(require_extensions.Renderer.Component.Switch, {
30
+ checked: preferences.diagnosticsVisible,
31
+ onChange: (value) => {
32
+ preferences.diagnosticsVisible = value;
33
+ },
34
+ children: "Show Diagnostics in sidebar"
35
+ }), /* @__PURE__ */ require_jsx_runtime.jsx("div", {
36
+ className: "power-settings-hint",
37
+ children: "Resource consumers, application events and Pending diagnostics."
38
+ })] }),
39
+ /* @__PURE__ */ require_jsx_runtime.jsxs("div", { children: [/* @__PURE__ */ require_jsx_runtime.jsx(require_extensions.Renderer.Component.Switch, {
40
+ checked: preferences.enabled,
41
+ onChange: (value) => {
42
+ preferences.enabled = value;
43
+ },
44
+ children: "Metrics-server monitoring"
45
+ }), /* @__PURE__ */ require_jsx_runtime.jsx("div", {
46
+ className: "power-settings-hint",
47
+ children: "CPU/RAM charts for clusters, nodes and pods. Keeps 30 minutes of live samples."
48
+ })] }),
49
+ /* @__PURE__ */ require_jsx_runtime.jsxs("div", { children: [/* @__PURE__ */ require_jsx_runtime.jsx(require_extensions.Renderer.Component.Switch, {
50
+ checked: preferences.historyEnabled,
51
+ onChange: (value) => {
52
+ preferences.historyEnabled = value;
53
+ },
54
+ children: "Keep local history"
55
+ }), /* @__PURE__ */ require_jsx_runtime.jsx("div", {
56
+ className: "power-settings-hint",
57
+ title: "SQLite storage. Collects while the cluster view is active. Resolution: 30 seconds for 2 hours, 5 minutes for 24 hours, 30 minutes for 7 days. Disabling preserves saved history.",
58
+ children: "Up to 7 days, limited to 100 MiB."
59
+ })] }),
60
+ /* @__PURE__ */ require_jsx_runtime.jsxs("div", {
61
+ style: {
62
+ display: "flex",
63
+ alignItems: "center",
64
+ justifyContent: "space-between",
65
+ gap: 12
66
+ },
67
+ children: [/* @__PURE__ */ require_jsx_runtime.jsxs("div", {
68
+ style: {
69
+ flex: 1,
70
+ minWidth: 0
71
+ },
72
+ role: "status",
73
+ children: [
74
+ /* @__PURE__ */ require_jsx_runtime.jsxs("div", {
75
+ style: {
76
+ display: "flex",
77
+ justifyContent: "space-between",
78
+ alignItems: "baseline",
79
+ gap: 12
80
+ },
81
+ children: [/* @__PURE__ */ require_jsx_runtime.jsx("span", { children: "Local storage" }), /* @__PURE__ */ require_jsx_runtime.jsx("span", {
82
+ style: {
83
+ fontVariantNumeric: "tabular-nums",
84
+ color: "var(--textColorSecondary)"
85
+ },
86
+ children: status?.available ? `${(status.bytes / 1024 / 1024).toFixed(2)} / ${require_monitoring_history.HISTORY_MAX_BYTES / 1024 / 1024} MiB` : "— / 100 MiB"
87
+ })]
88
+ }),
89
+ status?.available && /* @__PURE__ */ require_jsx_runtime.jsx("div", {
90
+ role: "progressbar",
91
+ "aria-label": "Local history storage",
92
+ "aria-valuemin": 0,
93
+ "aria-valuemax": 104857600,
94
+ "aria-valuenow": status.bytes,
95
+ "aria-valuetext": `${(status.bytes / 1024 / 1024).toFixed(2)} of 100 MiB`,
96
+ style: {
97
+ height: 4,
98
+ marginTop: 8,
99
+ borderRadius: 2,
100
+ overflow: "hidden",
101
+ background: "var(--borderColor)"
102
+ },
103
+ children: /* @__PURE__ */ require_jsx_runtime.jsx("div", { style: {
104
+ height: "100%",
105
+ width: `${Math.min(100, Math.max(0, status.bytes / 104857600 * 100))}%`,
106
+ background: "var(--primary)",
107
+ transition: "width 180ms ease"
108
+ } })
109
+ }),
110
+ /* @__PURE__ */ require_jsx_runtime.jsx("div", {
111
+ className: "power-settings-hint",
112
+ style: { marginTop: 6 },
113
+ children: status?.error ?? (status?.available ? `${status.samples.toLocaleString()} metric buckets · 7-day retention` : "Checking history storage…")
114
+ })
115
+ ]
116
+ }), /* @__PURE__ */ require_jsx_runtime.jsxs(require_extensions.Renderer.Component.Button, {
117
+ style: {
118
+ flexShrink: 0,
119
+ display: "inline-flex",
120
+ alignItems: "center",
121
+ justifyContent: "center",
122
+ gap: 6,
123
+ height: 30,
124
+ padding: "0 10px",
125
+ fontSize: 12,
126
+ lineHeight: "16px",
127
+ border: "1px solid var(--borderFaintColor)",
128
+ borderRadius: 6,
129
+ background: "var(--contentColor)",
130
+ color: "var(--textColorSecondary)"
131
+ },
132
+ title: "Delete locally collected metric history without changing other settings",
133
+ onClick: () => {
134
+ require_monitoring_history$1.monitoringHistory.clear().then(refresh).catch(() => setStatus((previous) => ({
135
+ available: previous?.available ?? false,
136
+ enabled: preferences.historyEnabled,
137
+ bytes: previous?.bytes ?? 0,
138
+ samples: previous?.samples ?? 0,
139
+ error: "Unable to clear local history. Try again."
140
+ })));
141
+ },
142
+ children: [/* @__PURE__ */ require_jsx_runtime.jsx(require_extensions.Renderer.Component.Icon, {
143
+ material: "delete_outline",
144
+ size: 14
145
+ }), /* @__PURE__ */ require_jsx_runtime.jsx("span", { children: "Clear" })]
146
+ })]
147
+ })
148
+ ]
149
+ });
63
150
  });
64
151
  //#endregion
65
152
  exports.MonitoringPreferences = MonitoringPreferences;
@@ -1 +1 @@
1
- {"version":3,"file":"monitoring-preferences.js","names":[],"sources":["../../../src/renderer/preferences/monitoring-preferences.tsx"],"sourcesContent":["import { Renderer } from \"@freelensapp/extensions\";\nimport { observer } from \"mobx-react\";\nimport { useEffect, useState } from \"react\";\nimport { type HistoryStatus } from \"../../common/monitoring-history\";\nimport { MonitoringPreferencesStore } from \"../../common/store/monitoring-preferences-store\";\nimport { monitoringHistory } from \"../monitoring-history\";\n\nexport const MonitoringPreferences = observer(() => {\n const preferences = MonitoringPreferencesStore.getInstanceOrCreate<MonitoringPreferencesStore>();\n const [status, setStatus] = useState<HistoryStatus>();\n const refresh = () => {\n void monitoringHistory\n .status()\n .then(setStatus)\n .catch(() =>\n setStatus({\n available: false,\n enabled: preferences.historyEnabled,\n bytes: 0,\n samples: 0,\n error: \"History service unavailable\",\n }),\n );\n };\n useEffect(refresh, [preferences.historyEnabled]);\n return (\n <div>\n <Renderer.Component.Switch\n checked={preferences.enabled}\n onChange={(value) => {\n preferences.enabled = value;\n }}\n >\n Metrics-server monitoring\n </Renderer.Component.Switch>\n <div className=\"power-settings-hint\">\n Show cluster, node and pod CPU/memory charts from metrics-server. Live samples are kept for 30 minutes. Requires\n permission to read the corresponding resource metrics. Requests and capacity use Kubernetes resource data.\n </div>\n <Renderer.Component.Switch\n checked={preferences.historyEnabled}\n onChange={(value) => {\n preferences.historyEnabled = value;\n }}\n >\n Keep local numeric monitoring history\n </Renderer.Component.Switch>\n <div className=\"power-settings-hint\">\n Opt-in local SQLite history. Retained for up to 7 days within 100 MiB. Collection runs while monitoring is\n enabled and the cluster view is active. Track individual pods or workloads in Diagnostics. Resolution: 30\n seconds for 2 hours, 5 minutes for 24 hours, 30 minutes for 7 days. No data is backfilled. Disabling collection\n preserves existing history until cleared.\n </div>\n <div role=\"status\">\n {status?.error ??\n (status\n ? `${(status.bytes / 1024 / 1024).toFixed(2)} MiB, ${status.samples} stored metric buckets`\n : \"Checking history storage…\")}\n </div>\n <button\n type=\"button\"\n title=\"Delete locally collected metric history without changing other settings\"\n onClick={() => {\n void monitoringHistory\n .clear()\n .then(refresh)\n .catch(() =>\n setStatus({\n available: false,\n enabled: preferences.historyEnabled,\n bytes: 0,\n samples: 0,\n error: \"Unable to clear local history\",\n }),\n );\n }}\n >\n Clear local history\n </button>\n </div>\n );\n});\n"],"mappings":";;;;;;;AAOA,IAAa,wBAAwB,oCAAA,eAAe;CAClD,MAAM,cAAc,qCAAA,2BAA2B,oBAAgD;CAC/F,MAAM,CAAC,QAAQ,aAAa,+BAAA,SAAwB;CACpD,MAAM,gBAAgB;EACpB,2BAAK,kBACF,OAAO,CAAC,CACR,KAAK,SAAS,CAAC,CACf,YACC,UAAU;GACR,WAAW;GACX,SAAS,YAAY;GACrB,OAAO;GACP,SAAS;GACT,OAAO;EACT,CAAC,CACH;CACJ;CACA,+BAAA,UAAU,SAAS,CAAC,YAAY,cAAc,CAAC;CAC/C,OACE,oCAAA,KAAC,OAAD,EAAA,UAAA;EACE,oCAAA,IAAC,mBAAA,SAAS,UAAU,QAApB;GACE,SAAS,YAAY;GACrB,WAAW,UAAU;IACnB,YAAY,UAAU;GACxB;aACD;EAE0B,CAAA;EAC3B,oCAAA,IAAC,OAAD;GAAK,WAAU;aAAsB;EAGhC,CAAA;EACL,oCAAA,IAAC,mBAAA,SAAS,UAAU,QAApB;GACE,SAAS,YAAY;GACrB,WAAW,UAAU;IACnB,YAAY,iBAAiB;GAC/B;aACD;EAE0B,CAAA;EAC3B,oCAAA,IAAC,OAAD;GAAK,WAAU;aAAsB;EAKhC,CAAA;EACL,oCAAA,IAAC,OAAD;GAAK,MAAK;aACP,QAAQ,UACN,SACG,IAAI,OAAO,QAAQ,OAAO,KAAA,CAAM,QAAQ,CAAC,EAAE,QAAQ,OAAO,QAAQ,0BAClE;EACH,CAAA;EACL,oCAAA,IAAC,UAAD;GACE,MAAK;GACL,OAAM;GACN,eAAe;IACb,2BAAK,kBACF,MAAM,CAAC,CACP,KAAK,OAAO,CAAC,CACb,YACC,UAAU;KACR,WAAW;KACX,SAAS,YAAY;KACrB,OAAO;KACP,SAAS;KACT,OAAO;IACT,CAAC,CACH;GACJ;aACD;EAEO,CAAA;CACL,EAAA,CAAA;AAET,CAAC"}
1
+ {"version":3,"file":"monitoring-preferences.js","names":[],"sources":["../../../src/renderer/preferences/monitoring-preferences.tsx"],"sourcesContent":["import { Renderer } from \"@freelensapp/extensions\";\nimport { observer } from \"mobx-react\";\nimport { useEffect, useState } from \"react\";\nimport { HISTORY_MAX_BYTES, type HistoryStatus } from \"../../common/monitoring-history\";\nimport { MonitoringPreferencesStore } from \"../../common/store/monitoring-preferences-store\";\nimport { monitoringHistory } from \"../monitoring-history\";\n\nexport const MonitoringPreferences = observer(() => {\n const preferences = MonitoringPreferencesStore.getInstanceOrCreate<MonitoringPreferencesStore>();\n const [status, setStatus] = useState<HistoryStatus>();\n const refresh = () => {\n void monitoringHistory\n .status()\n .then(setStatus)\n .catch(() =>\n setStatus({\n available: false,\n enabled: preferences.historyEnabled,\n bytes: 0,\n samples: 0,\n error: \"History service unavailable\",\n }),\n );\n };\n useEffect(refresh, [preferences.historyEnabled]);\n return (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 20 }}>\n <div>\n <Renderer.Component.Switch\n checked={preferences.diagnosticsVisible}\n onChange={(value) => {\n preferences.diagnosticsVisible = value;\n }}\n >\n Show Diagnostics in sidebar\n </Renderer.Component.Switch>\n <div className=\"power-settings-hint\">Resource consumers, application events and Pending diagnostics.</div>\n </div>\n <div>\n <Renderer.Component.Switch\n checked={preferences.enabled}\n onChange={(value) => {\n preferences.enabled = value;\n }}\n >\n Metrics-server monitoring\n </Renderer.Component.Switch>\n <div className=\"power-settings-hint\">\n CPU/RAM charts for clusters, nodes and pods. Keeps 30 minutes of live samples.\n </div>\n </div>\n <div>\n <Renderer.Component.Switch\n checked={preferences.historyEnabled}\n onChange={(value) => {\n preferences.historyEnabled = value;\n }}\n >\n Keep local history\n </Renderer.Component.Switch>\n <div\n className=\"power-settings-hint\"\n title=\"SQLite storage. Collects while the cluster view is active. Resolution: 30 seconds for 2 hours, 5 minutes for 24 hours, 30 minutes for 7 days. Disabling preserves saved history.\"\n >\n Up to 7 days, limited to 100 MiB.\n </div>\n </div>\n <div style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", gap: 12 }}>\n <div style={{ flex: 1, minWidth: 0 }} role=\"status\">\n <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"baseline\", gap: 12 }}>\n <span>Local storage</span>\n <span style={{ fontVariantNumeric: \"tabular-nums\", color: \"var(--textColorSecondary)\" }}>\n {status?.available\n ? `${(status.bytes / 1024 / 1024).toFixed(2)} / ${HISTORY_MAX_BYTES / 1024 / 1024} MiB`\n : \"— / 100 MiB\"}\n </span>\n </div>\n {status?.available && (\n <div\n role=\"progressbar\"\n aria-label=\"Local history storage\"\n aria-valuemin={0}\n aria-valuemax={HISTORY_MAX_BYTES}\n aria-valuenow={status.bytes}\n aria-valuetext={`${(status.bytes / 1024 / 1024).toFixed(2)} of 100 MiB`}\n style={{ height: 4, marginTop: 8, borderRadius: 2, overflow: \"hidden\", background: \"var(--borderColor)\" }}\n >\n <div\n style={{\n height: \"100%\",\n width: `${Math.min(100, Math.max(0, (status.bytes / HISTORY_MAX_BYTES) * 100))}%`,\n background: \"var(--primary)\",\n transition: \"width 180ms ease\",\n }}\n />\n </div>\n )}\n <div className=\"power-settings-hint\" style={{ marginTop: 6 }}>\n {status?.error ??\n (status?.available\n ? `${status.samples.toLocaleString()} metric buckets · 7-day retention`\n : \"Checking history storage…\")}\n </div>\n </div>\n <Renderer.Component.Button\n style={{\n flexShrink: 0,\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 6,\n height: 30,\n padding: \"0 10px\",\n fontSize: 12,\n lineHeight: \"16px\",\n border: \"1px solid var(--borderFaintColor)\",\n borderRadius: 6,\n background: \"var(--contentColor)\",\n color: \"var(--textColorSecondary)\",\n }}\n title=\"Delete locally collected metric history without changing other settings\"\n onClick={() => {\n void monitoringHistory\n .clear()\n .then(refresh)\n .catch(() =>\n setStatus((previous) => ({\n available: previous?.available ?? false,\n enabled: preferences.historyEnabled,\n bytes: previous?.bytes ?? 0,\n samples: previous?.samples ?? 0,\n error: \"Unable to clear local history. Try again.\",\n })),\n );\n }}\n >\n <Renderer.Component.Icon material=\"delete_outline\" size={14} />\n <span>Clear</span>\n </Renderer.Component.Button>\n </div>\n </div>\n );\n});\n"],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  const require_extensions = require("../_virtual/_global-external_@freelensapp/extensions.js");
2
+ const require_extension_info = require("../src/common/extension-info.js");
2
3
  const require_jsx_runtime = require("../_virtual/_global-external_react/jsx-runtime.js");
3
4
  const require_ai_preferences = require("./ai-preferences.js");
4
5
  const require_appearance_preferences = require("./appearance-preferences.js");
@@ -71,13 +72,36 @@ var PowerPreferences = () => /* @__PURE__ */ require_jsx_runtime.jsxs("div", {
71
72
  }),
72
73
  /* @__PURE__ */ require_jsx_runtime.jsxs("section", {
73
74
  "aria-labelledby": "freelens-power-appearance-title",
74
- children: [/* @__PURE__ */ require_jsx_runtime.jsxs("h3", {
75
- id: "freelens-power-appearance-title",
76
- children: [/* @__PURE__ */ require_jsx_runtime.jsx(require_extensions.Renderer.Component.Icon, {
77
- material: "palette",
78
- size: 20
79
- }), " Appearance"]
80
- }), /* @__PURE__ */ require_jsx_runtime.jsx(require_appearance_preferences.AppearancePreferences, {})]
75
+ children: [
76
+ /* @__PURE__ */ require_jsx_runtime.jsxs("h3", {
77
+ id: "freelens-power-appearance-title",
78
+ children: [/* @__PURE__ */ require_jsx_runtime.jsx(require_extensions.Renderer.Component.Icon, {
79
+ material: "palette",
80
+ size: 20
81
+ }), " Appearance"]
82
+ }),
83
+ /* @__PURE__ */ require_jsx_runtime.jsx(require_appearance_preferences.AppearancePreferences, {}),
84
+ /* @__PURE__ */ require_jsx_runtime.jsx("div", {
85
+ style: {
86
+ display: "flex",
87
+ justifyContent: "flex-end",
88
+ marginTop: 20
89
+ },
90
+ children: /* @__PURE__ */ require_jsx_runtime.jsxs(require_extensions.Renderer.Component.Button, {
91
+ style: {
92
+ display: "inline-flex",
93
+ alignItems: "center",
94
+ gap: 6
95
+ },
96
+ onClick: () => require_extensions.Renderer.Navigation.navigate(`/extension/${require_extension_info.EXTENSION_ID}/cluster-icons`),
97
+ title: "Create matching icons for your saved clusters",
98
+ children: [/* @__PURE__ */ require_jsx_runtime.jsx(require_extensions.Renderer.Component.Icon, {
99
+ material: "palette",
100
+ size: 16
101
+ }), " Cluster icons"]
102
+ })
103
+ })
104
+ ]
81
105
  }),
82
106
  /* @__PURE__ */ require_jsx_runtime.jsxs("section", {
83
107
  "aria-labelledby": "freelens-power-monitoring-title",
@@ -1 +1 @@
1
- {"version":3,"file":"preferences.js","names":[],"sources":["../../../src/renderer/preferences/preferences.tsx"],"sourcesContent":["import { Renderer } from \"@freelensapp/extensions\";\nimport { AiPreferences } from \"./ai-preferences\";\nimport { AppearancePreferences } from \"./appearance-preferences\";\nimport { DashboardPreferences } from \"./dashboard-preferences\";\nimport { MonitoringPreferences } from \"./monitoring-preferences\";\nimport { NodeShellPreferences } from \"./node-shell-preferences\";\nimport { PowerPreferencesToggle } from \"./power-preferences\";\nimport { ReadOnlyPreferences } from \"./read-only-preferences\";\nimport { SettingsExport } from \"./settings-export\";\n\nconst styles = `\n .power-preferences-heading { display: flex; align-items: center; justify-content: space-between; gap: 16px; }\n .power-preferences-header-actions { display: inline-flex; margin-left: auto; flex-shrink: 0; }\n #freelens-power-settings > .SubTitle,\n #freelens-power-settings > .hint,\n #freelens-power-settings + hr { display: none; }\n .freelens-power-preferences { display: grid; gap: 24px; max-width: 760px; }\n .freelens-power-preferences section {\n padding: 24px; border: 1px solid var(--borderFaintColor);\n border-radius: 12px; background: var(--contentColor);\n }\n .freelens-power-preferences button, .freelens-power-preferences .Button { transition: color 160ms ease, background-color 160ms ease, border-color 160ms ease; }\n :root .freelens-power-preferences button.power-settings-icon-action,\n :root .power-preferences-header-actions button.power-settings-icon-action {\n display: inline-flex; align-items: center; justify-content: center;\n width: 32px; height: 32px; min-width: 32px; padding: 0; flex-shrink: 0;\n border: 0; border-radius: 6px; background: transparent; color: var(--textColorSecondary); cursor: pointer;\n transition: color 160ms ease, background-color 160ms ease;\n }\n :root .freelens-power-preferences button.power-settings-icon-action:not(:disabled):hover,\n :root .power-preferences-header-actions button.power-settings-icon-action:not(:disabled):hover {\n color: var(--primary); background: color-mix(in srgb, var(--primary) 10%, transparent);\n }\n :root .freelens-power-preferences button.power-settings-icon-action:focus-visible,\n :root .power-preferences-header-actions button.power-settings-icon-action:focus-visible { outline: 2px solid var(--primary); outline-offset: 2px; }\n :root .freelens-power-preferences button.power-settings-icon-action:disabled,\n :root .power-preferences-header-actions button.power-settings-icon-action:disabled { opacity: 0.4; cursor: default; }\n .freelens-power-preferences h3 {\n display: flex; align-items: center; gap: 10px; margin: 0 0 24px; font-size: 16px; font-weight: 600; color: var(--textColorAccent);\n }\n .freelens-power-preferences label[data-testid=\"switch\"] {\n display: flex; width: 100%; align-items: center; justify-content: space-between;\n }\n .freelens-power-preferences .power-settings-hint {\n margin-top: 6px; font-size: 12px; line-height: 1.5; color: var(--textColorSecondary);\n }\n @media (max-width: 760px) {\n .freelens-power-preferences section { padding: 18px; }\n .freelens-power-preferences .power-settings-row { flex-wrap: wrap; }\n }\n`;\n\nexport const PowerPreferences = () => (\n <div className=\"freelens-power-preferences\">\n <style>{styles}</style>\n <SettingsExport />\n <section aria-label=\"Freelens Power\">\n <PowerPreferencesToggle />\n </section>\n <section aria-labelledby=\"freelens-power-safety-title\">\n <h3 id=\"freelens-power-safety-title\">\n <Renderer.Component.Icon material=\"lock_outline\" size={20} /> Read-only mode\n </h3>\n <ReadOnlyPreferences />\n </section>\n <section aria-labelledby=\"freelens-power-appearance-title\">\n <h3 id=\"freelens-power-appearance-title\">\n <Renderer.Component.Icon material=\"palette\" size={20} /> Appearance\n </h3>\n <AppearancePreferences />\n </section>\n <section aria-labelledby=\"freelens-power-monitoring-title\">\n <h3 id=\"freelens-power-monitoring-title\">\n <Renderer.Component.Icon material=\"show_chart\" size={20} /> Monitoring\n </h3>\n <MonitoringPreferences />\n </section>\n <section aria-labelledby=\"freelens-power-shell-title\">\n <h3 id=\"freelens-power-shell-title\">\n <Renderer.Component.Icon material=\"vpn_key\" size={20} /> Secure Node Shell\n </h3>\n <NodeShellPreferences />\n </section>\n <section aria-labelledby=\"freelens-power-ai-title\">\n <h3 id=\"freelens-power-ai-title\">\n <Renderer.Component.Icon material=\"chat_bubble_outline\" size={20} /> AI assistant\n </h3>\n <AiPreferences />\n </section>\n <section aria-labelledby=\"freelens-power-dashboard-title\">\n <h3 id=\"freelens-power-dashboard-title\">\n <Renderer.Component.Icon material=\"dashboard\" size={20} /> Dashboard\n </h3>\n <DashboardPreferences />\n </section>\n </div>\n);\n"],"mappings":";;;;;;;;;;;AAUA,IAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0Cf,IAAa,yBACX,oCAAA,KAAC,OAAD;CAAK,WAAU;WAAf;EACE,oCAAA,IAAC,SAAD,EAAA,UAAQ,OAAc,CAAA;EACtB,oCAAA,IAAC,wBAAA,gBAAD,CAAiB,CAAA;EACjB,oCAAA,IAAC,WAAD;GAAS,cAAW;aAClB,oCAAA,IAAC,0BAAA,wBAAD,CAAyB,CAAA;EAClB,CAAA;EACT,oCAAA,KAAC,WAAD;GAAS,mBAAgB;aAAzB,CACE,oCAAA,KAAC,MAAD;IAAI,IAAG;cAAP,CACE,oCAAA,IAAC,mBAAA,SAAS,UAAU,MAApB;KAAyB,UAAS;KAAe,MAAM;IAAK,CAAA,GAAC,iBAC3D;OACJ,oCAAA,IAAC,8BAAA,qBAAD,CAAsB,CAAA,CACf;;EACT,oCAAA,KAAC,WAAD;GAAS,mBAAgB;aAAzB,CACE,oCAAA,KAAC,MAAD;IAAI,IAAG;cAAP,CACE,oCAAA,IAAC,mBAAA,SAAS,UAAU,MAApB;KAAyB,UAAS;KAAU,MAAM;IAAK,CAAA,GAAC,aACtD;OACJ,oCAAA,IAAC,+BAAA,uBAAD,CAAwB,CAAA,CACjB;;EACT,oCAAA,KAAC,WAAD;GAAS,mBAAgB;aAAzB,CACE,oCAAA,KAAC,MAAD;IAAI,IAAG;cAAP,CACE,oCAAA,IAAC,mBAAA,SAAS,UAAU,MAApB;KAAyB,UAAS;KAAa,MAAM;IAAK,CAAA,GAAC,aACzD;OACJ,oCAAA,IAAC,+BAAA,uBAAD,CAAwB,CAAA,CACjB;;EACT,oCAAA,KAAC,WAAD;GAAS,mBAAgB;aAAzB,CACE,oCAAA,KAAC,MAAD;IAAI,IAAG;cAAP,CACE,oCAAA,IAAC,mBAAA,SAAS,UAAU,MAApB;KAAyB,UAAS;KAAU,MAAM;IAAK,CAAA,GAAC,oBACtD;OACJ,oCAAA,IAAC,+BAAA,sBAAD,CAAuB,CAAA,CAChB;;EACT,oCAAA,KAAC,WAAD;GAAS,mBAAgB;aAAzB,CACE,oCAAA,KAAC,MAAD;IAAI,IAAG;cAAP,CACE,oCAAA,IAAC,mBAAA,SAAS,UAAU,MAApB;KAAyB,UAAS;KAAsB,MAAM;IAAK,CAAA,GAAC,eAClE;OACJ,oCAAA,IAAC,uBAAA,eAAD,CAAgB,CAAA,CACT;;EACT,oCAAA,KAAC,WAAD;GAAS,mBAAgB;aAAzB,CACE,oCAAA,KAAC,MAAD;IAAI,IAAG;cAAP,CACE,oCAAA,IAAC,mBAAA,SAAS,UAAU,MAApB;KAAyB,UAAS;KAAY,MAAM;IAAK,CAAA,GAAC,YACxD;OACJ,oCAAA,IAAC,8BAAA,sBAAD,CAAuB,CAAA,CAChB;;CACN"}
1
+ {"version":3,"file":"preferences.js","names":[],"sources":["../../../src/renderer/preferences/preferences.tsx"],"sourcesContent":["import { Renderer } from \"@freelensapp/extensions\";\nimport { EXTENSION_ID } from \"../../common/extension-info\";\nimport { AiPreferences } from \"./ai-preferences\";\nimport { AppearancePreferences } from \"./appearance-preferences\";\nimport { DashboardPreferences } from \"./dashboard-preferences\";\nimport { MonitoringPreferences } from \"./monitoring-preferences\";\nimport { NodeShellPreferences } from \"./node-shell-preferences\";\nimport { PowerPreferencesToggle } from \"./power-preferences\";\nimport { ReadOnlyPreferences } from \"./read-only-preferences\";\nimport { SettingsExport } from \"./settings-export\";\n\nconst styles = `\n .power-preferences-heading { display: flex; align-items: center; justify-content: space-between; gap: 16px; }\n .power-preferences-header-actions { display: inline-flex; margin-left: auto; flex-shrink: 0; }\n #freelens-power-settings > .SubTitle,\n #freelens-power-settings > .hint,\n #freelens-power-settings + hr { display: none; }\n .freelens-power-preferences { display: grid; gap: 24px; max-width: 760px; }\n .freelens-power-preferences section {\n padding: 24px; border: 1px solid var(--borderFaintColor);\n border-radius: 12px; background: var(--contentColor);\n }\n .freelens-power-preferences button, .freelens-power-preferences .Button { transition: color 160ms ease, background-color 160ms ease, border-color 160ms ease; }\n :root .freelens-power-preferences button.power-settings-icon-action,\n :root .power-preferences-header-actions button.power-settings-icon-action {\n display: inline-flex; align-items: center; justify-content: center;\n width: 32px; height: 32px; min-width: 32px; padding: 0; flex-shrink: 0;\n border: 0; border-radius: 6px; background: transparent; color: var(--textColorSecondary); cursor: pointer;\n transition: color 160ms ease, background-color 160ms ease;\n }\n :root .freelens-power-preferences button.power-settings-icon-action:not(:disabled):hover,\n :root .power-preferences-header-actions button.power-settings-icon-action:not(:disabled):hover {\n color: var(--primary); background: color-mix(in srgb, var(--primary) 10%, transparent);\n }\n :root .freelens-power-preferences button.power-settings-icon-action:focus-visible,\n :root .power-preferences-header-actions button.power-settings-icon-action:focus-visible { outline: 2px solid var(--primary); outline-offset: 2px; }\n :root .freelens-power-preferences button.power-settings-icon-action:disabled,\n :root .power-preferences-header-actions button.power-settings-icon-action:disabled { opacity: 0.4; cursor: default; }\n .freelens-power-preferences h3 {\n display: flex; align-items: center; gap: 10px; margin: 0 0 24px; font-size: 16px; font-weight: 600; color: var(--textColorAccent);\n }\n .freelens-power-preferences label[data-testid=\"switch\"] {\n display: flex; width: 100%; align-items: center; justify-content: space-between;\n }\n .freelens-power-preferences .power-settings-hint {\n margin-top: 6px; font-size: 12px; line-height: 1.5; color: var(--textColorSecondary);\n }\n @media (max-width: 760px) {\n .freelens-power-preferences section { padding: 18px; }\n .freelens-power-preferences .power-settings-row { flex-wrap: wrap; }\n }\n`;\n\nexport const PowerPreferences = () => (\n <div className=\"freelens-power-preferences\">\n <style>{styles}</style>\n <SettingsExport />\n <section aria-label=\"Freelens Power\">\n <PowerPreferencesToggle />\n </section>\n <section aria-labelledby=\"freelens-power-safety-title\">\n <h3 id=\"freelens-power-safety-title\">\n <Renderer.Component.Icon material=\"lock_outline\" size={20} /> Read-only mode\n </h3>\n <ReadOnlyPreferences />\n </section>\n <section aria-labelledby=\"freelens-power-appearance-title\">\n <h3 id=\"freelens-power-appearance-title\">\n <Renderer.Component.Icon material=\"palette\" size={20} /> Appearance\n </h3>\n <AppearancePreferences />\n <div style={{ display: \"flex\", justifyContent: \"flex-end\", marginTop: 20 }}>\n <Renderer.Component.Button\n style={{ display: \"inline-flex\", alignItems: \"center\", gap: 6 }}\n onClick={() => Renderer.Navigation.navigate(`/extension/${EXTENSION_ID}/cluster-icons`)}\n title=\"Create matching icons for your saved clusters\"\n >\n <Renderer.Component.Icon material=\"palette\" size={16} /> Cluster icons\n </Renderer.Component.Button>\n </div>\n </section>\n <section aria-labelledby=\"freelens-power-monitoring-title\">\n <h3 id=\"freelens-power-monitoring-title\">\n <Renderer.Component.Icon material=\"show_chart\" size={20} /> Monitoring\n </h3>\n <MonitoringPreferences />\n </section>\n <section aria-labelledby=\"freelens-power-shell-title\">\n <h3 id=\"freelens-power-shell-title\">\n <Renderer.Component.Icon material=\"vpn_key\" size={20} /> Secure Node Shell\n </h3>\n <NodeShellPreferences />\n </section>\n <section aria-labelledby=\"freelens-power-ai-title\">\n <h3 id=\"freelens-power-ai-title\">\n <Renderer.Component.Icon material=\"chat_bubble_outline\" size={20} /> AI assistant\n </h3>\n <AiPreferences />\n </section>\n <section aria-labelledby=\"freelens-power-dashboard-title\">\n <h3 id=\"freelens-power-dashboard-title\">\n <Renderer.Component.Icon material=\"dashboard\" size={20} /> Dashboard\n </h3>\n <DashboardPreferences />\n </section>\n </div>\n);\n"],"mappings":";;;;;;;;;;;;AAWA,IAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0Cf,IAAa,yBACX,oCAAA,KAAC,OAAD;CAAK,WAAU;WAAf;EACE,oCAAA,IAAC,SAAD,EAAA,UAAQ,OAAc,CAAA;EACtB,oCAAA,IAAC,wBAAA,gBAAD,CAAiB,CAAA;EACjB,oCAAA,IAAC,WAAD;GAAS,cAAW;aAClB,oCAAA,IAAC,0BAAA,wBAAD,CAAyB,CAAA;EAClB,CAAA;EACT,oCAAA,KAAC,WAAD;GAAS,mBAAgB;aAAzB,CACE,oCAAA,KAAC,MAAD;IAAI,IAAG;cAAP,CACE,oCAAA,IAAC,mBAAA,SAAS,UAAU,MAApB;KAAyB,UAAS;KAAe,MAAM;IAAK,CAAA,GAAC,iBAC3D;OACJ,oCAAA,IAAC,8BAAA,qBAAD,CAAsB,CAAA,CACf;;EACT,oCAAA,KAAC,WAAD;GAAS,mBAAgB;aAAzB;IACE,oCAAA,KAAC,MAAD;KAAI,IAAG;eAAP,CACE,oCAAA,IAAC,mBAAA,SAAS,UAAU,MAApB;MAAyB,UAAS;MAAU,MAAM;KAAK,CAAA,GAAC,aACtD;;IACJ,oCAAA,IAAC,+BAAA,uBAAD,CAAwB,CAAA;IACxB,oCAAA,IAAC,OAAD;KAAK,OAAO;MAAE,SAAS;MAAQ,gBAAgB;MAAY,WAAW;KAAG;eACvE,oCAAA,KAAC,mBAAA,SAAS,UAAU,QAApB;MACE,OAAO;OAAE,SAAS;OAAe,YAAY;OAAU,KAAK;MAAE;MAC9D,eAAe,mBAAA,SAAS,WAAW,SAAS,cAAc,uBAAA,aAAa,eAAe;MACtF,OAAM;gBAHR,CAKE,oCAAA,IAAC,mBAAA,SAAS,UAAU,MAApB;OAAyB,UAAS;OAAU,MAAM;MAAK,CAAA,GAAC,gBAC/B;;IACxB,CAAA;GACE;;EACT,oCAAA,KAAC,WAAD;GAAS,mBAAgB;aAAzB,CACE,oCAAA,KAAC,MAAD;IAAI,IAAG;cAAP,CACE,oCAAA,IAAC,mBAAA,SAAS,UAAU,MAApB;KAAyB,UAAS;KAAa,MAAM;IAAK,CAAA,GAAC,aACzD;OACJ,oCAAA,IAAC,+BAAA,uBAAD,CAAwB,CAAA,CACjB;;EACT,oCAAA,KAAC,WAAD;GAAS,mBAAgB;aAAzB,CACE,oCAAA,KAAC,MAAD;IAAI,IAAG;cAAP,CACE,oCAAA,IAAC,mBAAA,SAAS,UAAU,MAApB;KAAyB,UAAS;KAAU,MAAM;IAAK,CAAA,GAAC,oBACtD;OACJ,oCAAA,IAAC,+BAAA,sBAAD,CAAuB,CAAA,CAChB;;EACT,oCAAA,KAAC,WAAD;GAAS,mBAAgB;aAAzB,CACE,oCAAA,KAAC,MAAD;IAAI,IAAG;cAAP,CACE,oCAAA,IAAC,mBAAA,SAAS,UAAU,MAApB;KAAyB,UAAS;KAAsB,MAAM;IAAK,CAAA,GAAC,eAClE;OACJ,oCAAA,IAAC,uBAAA,eAAD,CAAgB,CAAA,CACT;;EACT,oCAAA,KAAC,WAAD;GAAS,mBAAgB;aAAzB,CACE,oCAAA,KAAC,MAAD;IAAI,IAAG;cAAP,CACE,oCAAA,IAAC,mBAAA,SAAS,UAAU,MAApB;KAAyB,UAAS;KAAY,MAAM;IAAK,CAAA,GAAC,YACxD;OACJ,oCAAA,IAAC,8BAAA,sBAAD,CAAuB,CAAA,CAChB;;CACN"}
@@ -6,7 +6,7 @@ var excluded = ".freelens-power-preferences, #freelens-power-settings, .freelens
6
6
  var directActions = [
7
7
  ".CatalogAddButton",
8
8
  ".KubeObjectListLayout .AddRemoveButtons .add-button",
9
- ".KubeObjectListLayout .AddRemoveButtons .remove-button",
9
+ ".AddRemoveButtons .remove-button",
10
10
  ".create-resource-tab",
11
11
  ".CreateResource .InfoPanel button.active",
12
12
  "[data-testid^=\"save-edit-resource-from-tab-for-\"]",
@@ -35,7 +35,7 @@ function startReadOnlyMode() {
35
35
  const preferences = require_read_only_preferences_store.ReadOnlyPreferencesStore.getInstanceOrCreate();
36
36
  const style = document.createElement("style");
37
37
  style.dataset.freelensPower = "read-only";
38
- style.textContent = `[${marker}] { display: none !important; }`;
38
+ style.textContent = `[${marker}], .AddRemoveButtons .remove-button { display: none !important; }`;
39
39
  const hidden = /* @__PURE__ */ new Set();
40
40
  function restore() {
41
41
  for (const element of hidden) element.removeAttribute(marker);