@64mb/freelens-power 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (208) hide show
  1. package/README.md +5 -4
  2. package/THIRD_PARTY_LICENSES +1707 -0
  3. package/out/main/ai.js +63 -23
  4. package/out/main/ai.js.map +1 -1
  5. package/out/main/cluster-icons-catalog.js +28 -0
  6. package/out/main/cluster-icons-catalog.js.map +1 -0
  7. package/out/main/cluster-icons.js +125 -0
  8. package/out/main/cluster-icons.js.map +1 -0
  9. package/out/main/common/ai-terminal-context.js +51 -0
  10. package/out/main/common/ai-terminal-context.js.map +1 -0
  11. package/out/main/common/ai.js.map +1 -1
  12. package/out/main/common/cluster-icon-ipc.js +6 -0
  13. package/out/main/common/cluster-icon-ipc.js.map +1 -0
  14. package/out/main/common/cluster-icons.js +121 -0
  15. package/out/main/common/cluster-icons.js.map +1 -0
  16. package/out/main/common/dashboard.js +1 -1
  17. package/out/main/common/dashboard.js.map +1 -1
  18. package/out/main/common/settings-export.js +3 -1
  19. package/out/main/common/settings-export.js.map +1 -1
  20. package/out/main/common/store/cluster-icons-store.js +32 -0
  21. package/out/main/common/store/cluster-icons-store.js.map +1 -0
  22. package/out/main/common/store/monitoring-preferences-store.js +5 -0
  23. package/out/main/common/store/monitoring-preferences-store.js.map +1 -1
  24. package/out/main/diagnostics-menu-order.js +57 -0
  25. package/out/main/diagnostics-menu-order.js.map +1 -0
  26. package/out/main/index.js +9 -1
  27. package/out/main/index.js.map +1 -1
  28. package/out/main/monitoring-history.js +13 -3
  29. package/out/main/monitoring-history.js.map +1 -1
  30. package/out/renderer/_virtual/_global-external_react-dom.js +2 -1
  31. package/out/renderer/_virtual/_global-external_react.js +10 -5
  32. package/out/renderer/_virtual/_rolldown/runtime.js +22 -0
  33. package/out/renderer/ai-terminal-context.js +200 -0
  34. package/out/renderer/ai-terminal-context.js.map +1 -0
  35. package/out/renderer/ai.js +90 -9
  36. package/out/renderer/ai.js.map +1 -1
  37. package/out/renderer/appearance.js +1 -0
  38. package/out/renderer/appearance.js.map +1 -1
  39. package/out/renderer/cluster-icon-colors.js +188 -0
  40. package/out/renderer/cluster-icon-colors.js.map +1 -0
  41. package/out/renderer/cluster-icons.js +304 -0
  42. package/out/renderer/cluster-icons.js.map +1 -0
  43. package/out/renderer/dashboard.js +8 -5
  44. package/out/renderer/dashboard.js.map +1 -1
  45. package/out/renderer/details/secret-certificate-details.js +9 -2
  46. package/out/renderer/details/secret-certificate-details.js.map +1 -1
  47. package/out/renderer/diagnostics.css.js +39 -0
  48. package/out/renderer/diagnostics.css.js.map +1 -0
  49. package/out/renderer/diagnostics.js +796 -343
  50. package/out/renderer/diagnostics.js.map +1 -1
  51. package/out/renderer/index.js +9 -4
  52. package/out/renderer/index.js.map +1 -1
  53. package/out/renderer/monitoring-details-chart.js +42 -0
  54. package/out/renderer/monitoring-details-chart.js.map +1 -0
  55. package/out/renderer/monitoring-history-collection.js +2 -18
  56. package/out/renderer/monitoring-history-collection.js.map +1 -1
  57. package/out/renderer/monitoring-history-view.js +111 -34
  58. package/out/renderer/monitoring-history-view.js.map +1 -1
  59. package/out/renderer/monitoring.js +68 -27
  60. package/out/renderer/monitoring.js.map +1 -1
  61. package/out/renderer/node-monitoring.js +23 -12
  62. package/out/renderer/node-monitoring.js.map +1 -1
  63. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js +10 -0
  64. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js.map +1 -0
  65. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js +8 -0
  66. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js.map +1 -0
  67. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js +9 -0
  68. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js.map +1 -0
  69. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js +9 -0
  70. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js.map +1 -0
  71. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/classCallCheck.js +8 -0
  72. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/classCallCheck.js.map +1 -0
  73. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/createClass.js +15 -0
  74. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/createClass.js.map +1 -0
  75. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/createSuper.js +19 -0
  76. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/createSuper.js.map +1 -0
  77. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/defineProperty.js +14 -0
  78. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/defineProperty.js.map +1 -0
  79. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/extends.js +19 -0
  80. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/extends.js.map +1 -0
  81. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js +15 -0
  82. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js.map +1 -0
  83. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/inherits.js +14 -0
  84. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/inherits.js.map +1 -0
  85. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/isNativeReflectConstruct.js +18 -0
  86. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/isNativeReflectConstruct.js.map +1 -0
  87. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/iterableToArray.js +8 -0
  88. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/iterableToArray.js.map +1 -0
  89. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js +26 -0
  90. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js.map +1 -0
  91. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/nonIterableRest.js +8 -0
  92. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/nonIterableRest.js.map +1 -0
  93. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js +8 -0
  94. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js.map +1 -0
  95. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/objectSpread2.js +27 -0
  96. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/objectSpread2.js.map +1 -0
  97. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js +15 -0
  98. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js.map +1 -0
  99. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js +14 -0
  100. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js.map +1 -0
  101. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js +12 -0
  102. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js.map +1 -0
  103. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js +15 -0
  104. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js.map +1 -0
  105. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/slicedToArray.js +12 -0
  106. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/slicedToArray.js.map +1 -0
  107. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/taggedTemplateLiteral.js +8 -0
  108. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/taggedTemplateLiteral.js.map +1 -0
  109. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/toConsumableArray.js +12 -0
  110. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/toConsumableArray.js.map +1 -0
  111. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/toPrimitive.js +16 -0
  112. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/toPrimitive.js.map +1 -0
  113. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/toPropertyKey.js +11 -0
  114. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/toPropertyKey.js.map +1 -0
  115. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/typeof.js +18 -0
  116. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/typeof.js.map +1 -0
  117. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js +13 -0
  118. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js.map +1 -0
  119. package/out/renderer/node_modules/.pnpm/@emotion_cache@11.14.0/node_modules/@emotion/cache/dist/emotion-cache.browser.esm.js +237 -0
  120. package/out/renderer/node_modules/.pnpm/@emotion_cache@11.14.0/node_modules/@emotion/cache/dist/emotion-cache.browser.esm.js.map +1 -0
  121. package/out/renderer/node_modules/.pnpm/@emotion_hash@0.9.2/node_modules/@emotion/hash/dist/emotion-hash.esm.js +25 -0
  122. package/out/renderer/node_modules/.pnpm/@emotion_hash@0.9.2/node_modules/@emotion/hash/dist/emotion-hash.esm.js.map +1 -0
  123. package/out/renderer/node_modules/.pnpm/@emotion_memoize@0.9.0/node_modules/@emotion/memoize/dist/emotion-memoize.esm.js +12 -0
  124. package/out/renderer/node_modules/.pnpm/@emotion_memoize@0.9.0/node_modules/@emotion/memoize/dist/emotion-memoize.esm.js.map +1 -0
  125. package/out/renderer/node_modules/.pnpm/@emotion_react@11.14.0_@types_react@17.0.93_react@17.0.2/node_modules/@emotion/react/dist/emotion-element-f0de968e.browser.esm.js +58 -0
  126. package/out/renderer/node_modules/.pnpm/@emotion_react@11.14.0_@types_react@17.0.93_react@17.0.2/node_modules/@emotion/react/dist/emotion-element-f0de968e.browser.esm.js.map +1 -0
  127. package/out/renderer/node_modules/.pnpm/@emotion_react@11.14.0_@types_react@17.0.93_react@17.0.2/node_modules/@emotion/react/dist/emotion-react.browser.esm.js +54 -0
  128. package/out/renderer/node_modules/.pnpm/@emotion_react@11.14.0_@types_react@17.0.93_react@17.0.2/node_modules/@emotion/react/dist/emotion-react.browser.esm.js.map +1 -0
  129. package/out/renderer/node_modules/.pnpm/@emotion_serialize@1.3.3/node_modules/@emotion/serialize/dist/emotion-serialize.esm.js +133 -0
  130. package/out/renderer/node_modules/.pnpm/@emotion_serialize@1.3.3/node_modules/@emotion/serialize/dist/emotion-serialize.esm.js.map +1 -0
  131. package/out/renderer/node_modules/.pnpm/@emotion_sheet@1.4.0/node_modules/@emotion/sheet/dist/emotion-sheet.esm.js +65 -0
  132. package/out/renderer/node_modules/.pnpm/@emotion_sheet@1.4.0/node_modules/@emotion/sheet/dist/emotion-sheet.esm.js.map +1 -0
  133. package/out/renderer/node_modules/.pnpm/@emotion_unitless@0.10.0/node_modules/@emotion/unitless/dist/emotion-unitless.esm.js +54 -0
  134. package/out/renderer/node_modules/.pnpm/@emotion_unitless@0.10.0/node_modules/@emotion/unitless/dist/emotion-unitless.esm.js.map +1 -0
  135. package/out/renderer/node_modules/.pnpm/@emotion_use-insertion-effect-with-fallbacks@1.2.0_react@17.0.2/node_modules/@emotion/use-insertion-effect-with-fallbacks/dist/emotion-use-insertion-effect-with-fallbacks.browser.esm.js +12 -0
  136. package/out/renderer/node_modules/.pnpm/@emotion_use-insertion-effect-with-fallbacks@1.2.0_react@17.0.2/node_modules/@emotion/use-insertion-effect-with-fallbacks/dist/emotion-use-insertion-effect-with-fallbacks.browser.esm.js.map +1 -0
  137. package/out/renderer/node_modules/.pnpm/@emotion_utils@1.4.2/node_modules/@emotion/utils/dist/emotion-utils.browser.esm.js +30 -0
  138. package/out/renderer/node_modules/.pnpm/@emotion_utils@1.4.2/node_modules/@emotion/utils/dist/emotion-utils.browser.esm.js.map +1 -0
  139. package/out/renderer/node_modules/.pnpm/@floating-ui_dom@1.7.2/node_modules/@floating-ui/dom/dist/floating-ui.dom.js +211 -0
  140. package/out/renderer/node_modules/.pnpm/@floating-ui_dom@1.7.2/node_modules/@floating-ui/dom/dist/floating-ui.dom.js.map +1 -0
  141. package/out/renderer/node_modules/.pnpm/@floating-ui_utils@0.2.10/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.js +97 -0
  142. package/out/renderer/node_modules/.pnpm/@floating-ui_utils@0.2.10/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.js.map +1 -0
  143. package/out/renderer/node_modules/.pnpm/@floating-ui_utils@0.2.10/node_modules/@floating-ui/utils/dist/floating-ui.utils.js +31 -0
  144. package/out/renderer/node_modules/.pnpm/@floating-ui_utils@0.2.10/node_modules/@floating-ui/utils/dist/floating-ui.utils.js.map +1 -0
  145. package/out/renderer/node_modules/.pnpm/hoist-non-react-statics@3.3.2/node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js +93 -0
  146. package/out/renderer/node_modules/.pnpm/hoist-non-react-statics@3.3.2/node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js.map +1 -0
  147. package/out/renderer/node_modules/.pnpm/memoize-one@6.0.0/node_modules/memoize-one/dist/memoize-one.esm.js +38 -0
  148. package/out/renderer/node_modules/.pnpm/memoize-one@6.0.0/node_modules/memoize-one/dist/memoize-one.esm.js.map +1 -0
  149. package/out/renderer/node_modules/.pnpm/react-is@16.13.1/node_modules/react-is/cjs/react-is.development.js +159 -0
  150. package/out/renderer/node_modules/.pnpm/react-is@16.13.1/node_modules/react-is/cjs/react-is.development.js.map +1 -0
  151. package/out/renderer/node_modules/.pnpm/react-is@16.13.1/node_modules/react-is/cjs/react-is.production.min.js +103 -0
  152. package/out/renderer/node_modules/.pnpm/react-is@16.13.1/node_modules/react-is/cjs/react-is.production.min.js.map +1 -0
  153. package/out/renderer/node_modules/.pnpm/react-is@16.13.1/node_modules/react-is/index.js +18 -0
  154. package/out/renderer/node_modules/.pnpm/react-is@16.13.1/node_modules/react-is/index.js.map +1 -0
  155. package/out/renderer/node_modules/.pnpm/react-select@5.10.2_@types_react@17.0.93_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/react-select/dist/Select-ef7c0426.esm.js +2200 -0
  156. package/out/renderer/node_modules/.pnpm/react-select@5.10.2_@types_react@17.0.93_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/react-select/dist/Select-ef7c0426.esm.js.map +1 -0
  157. package/out/renderer/node_modules/.pnpm/react-select@5.10.2_@types_react@17.0.93_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/react-select/dist/index-641ee5b8.esm.js +992 -0
  158. package/out/renderer/node_modules/.pnpm/react-select@5.10.2_@types_react@17.0.93_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/react-select/dist/index-641ee5b8.esm.js.map +1 -0
  159. package/out/renderer/node_modules/.pnpm/react-select@5.10.2_@types_react@17.0.93_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/react-select/dist/react-select.esm.js +14 -0
  160. package/out/renderer/node_modules/.pnpm/react-select@5.10.2_@types_react@17.0.93_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/react-select/dist/react-select.esm.js.map +1 -0
  161. package/out/renderer/node_modules/.pnpm/react-select@5.10.2_@types_react@17.0.93_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/react-select/dist/useStateManager-7e1e8489.esm.js +56 -0
  162. package/out/renderer/node_modules/.pnpm/react-select@5.10.2_@types_react@17.0.93_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/react-select/dist/useStateManager-7e1e8489.esm.js.map +1 -0
  163. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Enum.js +22 -0
  164. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Enum.js.map +1 -0
  165. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Middleware.js +30 -0
  166. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Middleware.js.map +1 -0
  167. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Parser.js +164 -0
  168. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Parser.js.map +1 -0
  169. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Serializer.js +37 -0
  170. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Serializer.js.map +1 -0
  171. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Tokenizer.js +245 -0
  172. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Tokenizer.js.map +1 -0
  173. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Utility.js +120 -0
  174. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Utility.js.map +1 -0
  175. package/out/renderer/node_modules/.pnpm/use-isomorphic-layout-effect@1.2.1_@types_react@17.0.93_react@17.0.2/node_modules/use-isomorphic-layout-effect/dist/use-isomorphic-layout-effect.browser.esm.js +6 -0
  176. package/out/renderer/node_modules/.pnpm/use-isomorphic-layout-effect@1.2.1_@types_react@17.0.93_react@17.0.2/node_modules/use-isomorphic-layout-effect/dist/use-isomorphic-layout-effect.browser.esm.js.map +1 -0
  177. package/out/renderer/pod-monitoring.js +15 -19
  178. package/out/renderer/pod-monitoring.js.map +1 -1
  179. package/out/renderer/preferences/ai-shortcuts-preferences.js +12 -4
  180. package/out/renderer/preferences/ai-shortcuts-preferences.js.map +1 -1
  181. package/out/renderer/preferences/dashboard-preferences.js +20 -4
  182. package/out/renderer/preferences/dashboard-preferences.js.map +1 -1
  183. package/out/renderer/preferences/monitoring-preferences.js +131 -44
  184. package/out/renderer/preferences/monitoring-preferences.js.map +1 -1
  185. package/out/renderer/preferences/preferences.js +31 -7
  186. package/out/renderer/preferences/preferences.js.map +1 -1
  187. package/out/renderer/read-only.js +2 -2
  188. package/out/renderer/read-only.js.map +1 -1
  189. package/out/renderer/src/common/ai-terminal-context.js +51 -0
  190. package/out/renderer/src/common/ai-terminal-context.js.map +1 -0
  191. package/out/renderer/src/common/ai.js.map +1 -1
  192. package/out/renderer/src/common/cluster-icon-ipc.js +6 -0
  193. package/out/renderer/src/common/cluster-icon-ipc.js.map +1 -0
  194. package/out/renderer/src/common/cluster-icons.js +133 -0
  195. package/out/renderer/src/common/cluster-icons.js.map +1 -0
  196. package/out/renderer/src/common/dashboard.js +1 -1
  197. package/out/renderer/src/common/dashboard.js.map +1 -1
  198. package/out/renderer/src/common/date-time.js +11 -0
  199. package/out/renderer/src/common/date-time.js.map +1 -0
  200. package/out/renderer/src/common/monitoring-history.js +2 -0
  201. package/out/renderer/src/common/monitoring-history.js.map +1 -1
  202. package/out/renderer/src/common/resource-diagnostics.js.map +1 -1
  203. package/out/renderer/src/common/settings-export.js.map +1 -1
  204. package/out/renderer/src/common/store/monitoring-preferences-store.js +5 -0
  205. package/out/renderer/src/common/store/monitoring-preferences-store.js.map +1 -1
  206. package/out/renderer/welcome.js +28 -6
  207. package/out/renderer/welcome.js.map +1 -1
  208. package/package.json +3 -2
@@ -1 +1 @@
1
- {"version":3,"file":"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"}
@@ -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":"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"}
@@ -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"}
@@ -4,6 +4,7 @@ const require_monitoring_history = require("../monitoring-history.js");
4
4
  //#region src/common/store/monitoring-preferences-store.ts
5
5
  var MonitoringPreferencesStore = class extends require_extensions.Common.Store.ExtensionStore {
6
6
  enabled = false;
7
+ diagnosticsVisible = true;
7
8
  historyEnabled = false;
8
9
  trackedHistory = [];
9
10
  constructor() {
@@ -11,12 +12,14 @@ var MonitoringPreferencesStore = class extends require_extensions.Common.Store.E
11
12
  configName: "monitoring-preferences",
12
13
  defaults: {
13
14
  enabled: false,
15
+ diagnosticsVisible: true,
14
16
  historyEnabled: false,
15
17
  trackedHistory: []
16
18
  }
17
19
  });
18
20
  require__global_external_mobx.makeObservable(this, {
19
21
  enabled: require__global_external_mobx.observable,
22
+ diagnosticsVisible: require__global_external_mobx.observable,
20
23
  historyEnabled: require__global_external_mobx.observable,
21
24
  trackedHistory: require__global_external_mobx.observable,
22
25
  fromStore: require__global_external_mobx.action
@@ -24,6 +27,7 @@ var MonitoringPreferencesStore = class extends require_extensions.Common.Store.E
24
27
  }
25
28
  fromStore(data) {
26
29
  this.enabled = data?.enabled === true;
30
+ this.diagnosticsVisible = data?.diagnosticsVisible !== false;
27
31
  this.historyEnabled = data?.historyEnabled === true;
28
32
  this.trackedHistory = Array.isArray(data?.trackedHistory) ? data.trackedHistory.filter(require_monitoring_history.validHistoryIdentity).slice(0, 100).map(({ clusterId, scope, uid }) => ({
29
33
  clusterId,
@@ -34,6 +38,7 @@ var MonitoringPreferencesStore = class extends require_extensions.Common.Store.E
34
38
  toJSON() {
35
39
  return {
36
40
  enabled: this.enabled,
41
+ diagnosticsVisible: this.diagnosticsVisible,
37
42
  historyEnabled: this.historyEnabled,
38
43
  trackedHistory: this.trackedHistory.map(({ clusterId, scope, uid }) => ({
39
44
  clusterId,
@@ -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\";\nimport { type HistoryIdentity, validHistoryIdentity } from \"../monitoring-history\";\n\nexport class MonitoringPreferencesStore extends Common.Store.ExtensionStore<{\n enabled: boolean;\n historyEnabled: boolean;\n trackedHistory: HistoryIdentity[];\n}> {\n enabled = false;\n historyEnabled = false;\n trackedHistory: HistoryIdentity[] = [];\n\n constructor() {\n super({\n configName: \"monitoring-preferences\",\n defaults: { enabled: false, historyEnabled: false, trackedHistory: [] },\n });\n makeObservable(this, {\n enabled: observable,\n historyEnabled: observable,\n trackedHistory: observable,\n fromStore: action,\n });\n }\n\n fromStore(data: { enabled?: boolean; historyEnabled?: boolean; trackedHistory?: HistoryIdentity[] }): void {\n this.enabled = data?.enabled === true;\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(): { enabled: boolean; historyEnabled: boolean; trackedHistory: HistoryIdentity[] } {\n return {\n enabled: this.enabled,\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,eAI1D;CACD,UAAU;CACV,iBAAiB;CACjB,iBAAoC,CAAC;CAErC,cAAc;EACZ,MAAM;GACJ,YAAY;GACZ,UAAU;IAAE,SAAS;IAAO,gBAAgB;IAAO,gBAAgB,CAAC;GAAE;EACxE,CAAC;EACD,8BAAA,eAAe,MAAM;GACnB,SAAS,8BAAA;GACT,gBAAgB,8BAAA;GAChB,gBAAgB,8BAAA;GAChB,WAAW,8BAAA;EACb,CAAC;CACH;CAEA,UAAU,MAAiG;EACzG,KAAK,UAAU,MAAM,YAAY;EACjC,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,SAA2F;EACzF,OAAO;GACL,SAAS,KAAK;GACd,gBAAgB,KAAK;GACrB,gBAAgB,KAAK,eAAe,KAAK,EAAE,WAAW,OAAO,WAAW;IAAE;IAAW;IAAO;GAAI,EAAE;EACpG;CACF;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"}
@@ -0,0 +1,57 @@
1
+ const require_extension_info = require("./common/extension-info.js");
2
+ let electron = require("electron");
3
+ let node_path = require("node:path");
4
+ let node_fs = require("node:fs");
5
+ //#region src/main/diagnostics-menu-order.ts
6
+ var diagnosticsKey = `sidebar-item-${require_extension_info.EXTENSION_DISPLAY_NAME.replace("@", "").replace("/", "--")}`;
7
+ var nativeItems = [
8
+ "favorites",
9
+ "cluster-overview",
10
+ "nodes",
11
+ "workloads",
12
+ "config",
13
+ "network",
14
+ "storage",
15
+ "namespaces",
16
+ "events",
17
+ "helm",
18
+ "user-management",
19
+ "custom-resources"
20
+ ];
21
+ function isRecord(value) {
22
+ return !!value && typeof value === "object" && !Array.isArray(value);
23
+ }
24
+ function startDiagnosticsMenuOrder() {
25
+ try {
26
+ const path = (0, node_path.join)(electron.app.getPath("userData"), "lens-user-store.json");
27
+ const channel = `store-sync-main:${path}`;
28
+ if (!electron.ipcMain.listenerCount(channel)) return () => {};
29
+ const model = JSON.parse((0, node_fs.readFileSync)(path, "utf8"));
30
+ if (!isRecord(model)) return () => {};
31
+ const preferences = model.preferences ?? {};
32
+ if (!isRecord(preferences)) return () => {};
33
+ const order = preferences.clusterPageMenuOrder ?? {};
34
+ if (!isRecord(order) || Object.values(order).some((value) => typeof value !== "number" || !Number.isFinite(value))) return () => {};
35
+ if (order[diagnosticsKey] !== void 0 && order[diagnosticsKey] !== 9999) return () => {};
36
+ const effectiveOrder = Object.fromEntries(nativeItems.map((id, index) => [`sidebar-item-${id}`, index * 10]));
37
+ Object.assign(effectiveOrder, order);
38
+ const favorites = effectiveOrder["sidebar-item-favorites"];
39
+ const next = Math.min(...Object.entries(effectiveOrder).filter(([key, value]) => key !== diagnosticsKey && value > favorites).map(([, value]) => value));
40
+ const position = Number.isFinite(next) ? favorites / 2 + next / 2 : favorites + 5;
41
+ if (!Number.isFinite(position) || position <= favorites || position >= next) return () => {};
42
+ preferences.clusterPageMenuOrder = {
43
+ ...order,
44
+ [diagnosticsKey]: position
45
+ };
46
+ model.preferences = preferences;
47
+ electron.ipcMain.emit(channel, {
48
+ frameId: -1,
49
+ processId: process.pid
50
+ }, model);
51
+ } catch {}
52
+ return () => {};
53
+ }
54
+ //#endregion
55
+ exports.startDiagnosticsMenuOrder = startDiagnosticsMenuOrder;
56
+
57
+ //# sourceMappingURL=diagnostics-menu-order.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostics-menu-order.js","names":[],"sources":["../../src/main/diagnostics-menu-order.ts"],"sourcesContent":["import { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { app, ipcMain } from \"electron\";\nimport { EXTENSION_DISPLAY_NAME } from \"../common/extension-info\";\n\nconst diagnosticsKey = `sidebar-item-${EXTENSION_DISPLAY_NAME.replace(\"@\", \"\").replace(\"/\", \"--\")}`;\nconst nativeItems = [\n \"favorites\",\n \"cluster-overview\",\n \"nodes\",\n \"workloads\",\n \"config\",\n \"network\",\n \"storage\",\n \"namespaces\",\n \"events\",\n \"helm\",\n \"user-management\",\n \"custom-resources\",\n];\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n\nexport function startDiagnosticsMenuOrder(): () => void {\n try {\n const path = join(app.getPath(\"userData\"), \"lens-user-store.json\");\n const channel = `store-sync-main:${path}`;\n if (!ipcMain.listenerCount(channel)) return () => {};\n const model: unknown = JSON.parse(readFileSync(path, \"utf8\"));\n if (!isRecord(model)) return () => {};\n const preferences = model.preferences ?? {};\n if (!isRecord(preferences)) return () => {};\n const order = preferences.clusterPageMenuOrder ?? {};\n if (!isRecord(order) || Object.values(order).some((value) => typeof value !== \"number\" || !Number.isFinite(value)))\n return () => {};\n // preserve explicit user ordering after the initial native default has been replaced\n if (order[diagnosticsKey] !== undefined && order[diagnosticsKey] !== 9999) return () => {};\n const effectiveOrder = Object.fromEntries(nativeItems.map((id, index) => [`sidebar-item-${id}`, index * 10]));\n Object.assign(effectiveOrder, order);\n const favorites = effectiveOrder[\"sidebar-item-favorites\"];\n const next = Math.min(\n ...Object.entries(effectiveOrder)\n .filter(([key, value]) => key !== diagnosticsKey && value > favorites)\n .map(([, value]) => value),\n );\n const position = Number.isFinite(next) ? favorites / 2 + next / 2 : favorites + 5;\n if (!Number.isFinite(position) || position <= favorites || position >= next) return () => {};\n preferences.clusterPageMenuOrder = { ...order, [diagnosticsKey]: position };\n model.preferences = preferences;\n ipcMain.emit(channel, { frameId: -1, processId: process.pid }, model);\n } catch {\n // native preferences may be unavailable during startup or on unsupported host versions\n }\n return () => {};\n}\n"],"mappings":";;;;;AAKA,IAAM,iBAAiB,gBAAgB,uBAAA,uBAAuB,QAAQ,KAAK,EAAE,CAAC,CAAC,QAAQ,KAAK,IAAI;AAChG,IAAM,cAAc;CAClB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAEA,SAAS,SAAS,OAAkD;CAClE,OAAO,CAAC,CAAC,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AACrE;AAEA,SAAgB,4BAAwC;CACtD,IAAI;EACF,MAAM,QAAA,GAAA,UAAA,KAAA,CAAY,SAAA,IAAI,QAAQ,UAAU,GAAG,sBAAsB;EACjE,MAAM,UAAU,mBAAmB;EACnC,IAAI,CAAC,SAAA,QAAQ,cAAc,OAAO,GAAG,aAAa,CAAC;EACnD,MAAM,QAAiB,KAAK,OAAA,GAAA,QAAA,aAAA,CAAmB,MAAM,MAAM,CAAC;EAC5D,IAAI,CAAC,SAAS,KAAK,GAAG,aAAa,CAAC;EACpC,MAAM,cAAc,MAAM,eAAe,CAAC;EAC1C,IAAI,CAAC,SAAS,WAAW,GAAG,aAAa,CAAC;EAC1C,MAAM,QAAQ,YAAY,wBAAwB,CAAC;EACnD,IAAI,CAAC,SAAS,KAAK,KAAK,OAAO,OAAO,KAAK,CAAC,CAAC,MAAM,UAAU,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,KAAK,CAAC,GAC/G,aAAa,CAAC;EAEhB,IAAI,MAAM,oBAAoB,KAAA,KAAa,MAAM,oBAAoB,MAAM,aAAa,CAAC;EACzF,MAAM,iBAAiB,OAAO,YAAY,YAAY,KAAK,IAAI,UAAU,CAAC,gBAAgB,MAAM,QAAQ,EAAE,CAAC,CAAC;EAC5G,OAAO,OAAO,gBAAgB,KAAK;EACnC,MAAM,YAAY,eAAe;EACjC,MAAM,OAAO,KAAK,IAChB,GAAG,OAAO,QAAQ,cAAc,CAAC,CAC9B,QAAQ,CAAC,KAAK,WAAW,QAAQ,kBAAkB,QAAQ,SAAS,CAAC,CACrE,KAAK,GAAG,WAAW,KAAK,CAC7B;EACA,MAAM,WAAW,OAAO,SAAS,IAAI,IAAI,YAAY,IAAI,OAAO,IAAI,YAAY;EAChF,IAAI,CAAC,OAAO,SAAS,QAAQ,KAAK,YAAY,aAAa,YAAY,MAAM,aAAa,CAAC;EAC3F,YAAY,uBAAuB;GAAE,GAAG;IAAQ,iBAAiB;EAAS;EAC1E,MAAM,cAAc;EACpB,SAAA,QAAQ,KAAK,SAAS;GAAE,SAAS;GAAI,WAAW,QAAQ;EAAI,GAAG,KAAK;CACtE,QAAQ,CAER;CACA,aAAa,CAAC;AAChB"}
package/out/main/index.js CHANGED
@@ -8,6 +8,7 @@ const require_extension_info = require("./common/extension-info.js");
8
8
  const require_ai_preferences_store = require("./common/store/ai-preferences-store.js");
9
9
  const require_ai_shortcuts_store = require("./common/store/ai-shortcuts-store.js");
10
10
  const require_appearance_preferences_store = require("./common/store/appearance-preferences-store.js");
11
+ const require_cluster_icons_store = require("./common/store/cluster-icons-store.js");
11
12
  const require_dashboard_preferences_store = require("./common/store/dashboard-preferences-store.js");
12
13
  const require_monitoring_preferences_store = require("./common/store/monitoring-preferences-store.js");
13
14
  const require_node_shell_preferences_store = require("./common/store/node-shell-preferences-store.js");
@@ -15,9 +16,12 @@ const require_power_preferences_store = require("./common/store/power-preference
15
16
  const require_read_only_preferences_store = require("./common/store/read-only-preferences-store.js");
16
17
  const require_ai_ipc = require("./ai-ipc.js");
17
18
  const require_ai_models = require("./ai-models.js");
19
+ const require_cluster_icons = require("./cluster-icons.js");
20
+ const require_cluster_icons_catalog = require("./cluster-icons-catalog.js");
18
21
  const require_dashboard_catalog = require("./dashboard-catalog.js");
19
22
  const require_dashboard_picker = require("./dashboard-picker.js");
20
23
  const require_dashboard_views = require("./dashboard-views.js");
24
+ const require_diagnostics_menu_order = require("./diagnostics-menu-order.js");
21
25
  const require_dock_icon = require("./dock-icon.js");
22
26
  const require_monitoring_history = require("./monitoring-history.js");
23
27
  const require_settings_export = require("./settings-export.js");
@@ -43,6 +47,7 @@ var FreelensPowerMain = class extends require_extensions.Main.LensExtension {
43
47
  require_monitoring_preferences_store.MonitoringPreferencesStore.getInstanceOrCreate().loadExtension(this);
44
48
  require_appearance_preferences_store.AppearancePreferencesStore.getInstanceOrCreate().loadExtension(this);
45
49
  require_dashboard_preferences_store.DashboardPreferencesStore.getInstanceOrCreate().loadExtension(this);
50
+ require_cluster_icons_store.ClusterIconsStore.getInstanceOrCreate().loadExtension(this);
46
51
  this.stopFeatures?.();
47
52
  const stopExport = require_settings_export.startSettingsExport();
48
53
  let disposers = [];
@@ -50,12 +55,15 @@ var FreelensPowerMain = class extends require_extensions.Main.LensExtension {
50
55
  for (const dispose of disposers) dispose();
51
56
  disposers = enabled ? [
52
57
  require_monitoring_history.startMonitoringHistory(this),
58
+ require_diagnostics_menu_order.startDiagnosticsMenuOrder(),
53
59
  require_ai_ipc.startAiIpc(),
54
60
  require_ai_models.startAiModels(),
55
61
  require_dock_icon.startDockIconOverride(),
56
62
  require_dashboard_views.startDashboardViews(),
57
63
  require_dashboard_picker.startDashboardPicker(),
58
- require_dashboard_catalog.registerDashboardCatalog(this)
64
+ require_dashboard_catalog.registerDashboardCatalog(this),
65
+ require_cluster_icons_catalog.registerClusterIconsCatalog(this),
66
+ require_cluster_icons.startClusterIcons()
59
67
  ] : [];
60
68
  }, { fireImmediately: true });
61
69
  this.stopFeatures = () => {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/main/index.ts"],"sourcesContent":["import { Main } from \"@freelensapp/extensions\";\nimport { reaction } from \"mobx\";\nimport { EXTENSION_DISPLAY_NAME, EXTENSION_ID } from \"../common/extension-info\";\nimport { AiPreferencesStore } from \"../common/store/ai-preferences-store\";\nimport { AiShortcutsStore } from \"../common/store/ai-shortcuts-store\";\nimport { AppearancePreferencesStore } from \"../common/store/appearance-preferences-store\";\nimport { DashboardPreferencesStore } from \"../common/store/dashboard-preferences-store\";\nimport { MonitoringPreferencesStore } from \"../common/store/monitoring-preferences-store\";\nimport { NodeShellPreferencesStore } from \"../common/store/node-shell-preferences-store\";\nimport { PowerPreferencesStore } from \"../common/store/power-preferences-store\";\nimport { ReadOnlyPreferencesStore } from \"../common/store/read-only-preferences-store\";\nimport { startAiIpc } from \"./ai-ipc\";\nimport { startAiModels } from \"./ai-models\";\nimport { registerDashboardCatalog } from \"./dashboard-catalog\";\nimport { startDashboardPicker } from \"./dashboard-picker\";\nimport { startDashboardViews } from \"./dashboard-views\";\nimport { startDockIconOverride } from \"./dock-icon\";\nimport { startMonitoringHistory } from \"./monitoring-history\";\nimport { startSettingsExport } from \"./settings-export\";\n\nexport default class FreelensPowerMain extends Main.LensExtension {\n private stopFeatures?: () => void;\n\n get name() {\n return EXTENSION_DISPLAY_NAME;\n }\n get sanitizedExtensionId() {\n return EXTENSION_ID;\n }\n get storeName() {\n return this.manifest.storeName || EXTENSION_ID;\n }\n\n onActivate() {\n const power = PowerPreferencesStore.getInstanceOrCreate<PowerPreferencesStore>();\n power.loadExtension(this);\n AiPreferencesStore.getInstanceOrCreate().loadExtension(this);\n AiShortcutsStore.getInstanceOrCreate().loadExtension(this);\n ReadOnlyPreferencesStore.getInstanceOrCreate().loadExtension(this);\n NodeShellPreferencesStore.getInstanceOrCreate().loadExtension(this);\n MonitoringPreferencesStore.getInstanceOrCreate().loadExtension(this);\n AppearancePreferencesStore.getInstanceOrCreate().loadExtension(this);\n DashboardPreferencesStore.getInstanceOrCreate().loadExtension(this);\n this.stopFeatures?.();\n const stopExport = startSettingsExport();\n let disposers: (() => void)[] = [];\n const stop = reaction(\n () => power.enabled,\n (enabled) => {\n for (const dispose of disposers) dispose();\n disposers = enabled\n ? [\n startMonitoringHistory(this),\n startAiIpc(),\n startAiModels(),\n startDockIconOverride(),\n startDashboardViews(),\n startDashboardPicker(),\n registerDashboardCatalog(this),\n ]\n : [];\n },\n { fireImmediately: true },\n );\n this.stopFeatures = () => {\n stop();\n stopExport();\n for (const dispose of disposers) dispose();\n disposers = [];\n };\n }\n\n onDeactivate() {\n this.stopFeatures?.();\n this.stopFeatures = undefined;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAoBA,IAAqB,oBAArB,cAA+C,mBAAA,KAAK,cAAc;CAChE;CAEA,IAAI,OAAO;EACT,OAAO,uBAAA;CACT;CACA,IAAI,uBAAuB;EACzB,OAAO,uBAAA;CACT;CACA,IAAI,YAAY;EACd,OAAO,KAAK,SAAS,aAAA;CACvB;CAEA,aAAa;EACX,MAAM,QAAQ,gCAAA,sBAAsB,oBAA2C;EAC/E,MAAM,cAAc,IAAI;EACxB,6BAAA,mBAAmB,oBAAoB,CAAC,CAAC,cAAc,IAAI;EAC3D,2BAAA,iBAAiB,oBAAoB,CAAC,CAAC,cAAc,IAAI;EACzD,oCAAA,yBAAyB,oBAAoB,CAAC,CAAC,cAAc,IAAI;EACjE,qCAAA,0BAA0B,oBAAoB,CAAC,CAAC,cAAc,IAAI;EAClE,qCAAA,2BAA2B,oBAAoB,CAAC,CAAC,cAAc,IAAI;EACnE,qCAAA,2BAA2B,oBAAoB,CAAC,CAAC,cAAc,IAAI;EACnE,oCAAA,0BAA0B,oBAAoB,CAAC,CAAC,cAAc,IAAI;EAClE,KAAK,eAAe;EACpB,MAAM,aAAa,wBAAA,oBAAoB;EACvC,IAAI,YAA4B,CAAC;EACjC,MAAM,OAAO,8BAAA,eACL,MAAM,UACX,YAAY;GACX,KAAK,MAAM,WAAW,WAAW,QAAQ;GACzC,YAAY,UACR;IACE,2BAAA,uBAAuB,IAAI;IAC3B,eAAA,WAAW;IACX,kBAAA,cAAc;IACd,kBAAA,sBAAsB;IACtB,wBAAA,oBAAoB;IACpB,yBAAA,qBAAqB;IACrB,0BAAA,yBAAyB,IAAI;GAC/B,IACA,CAAC;EACP,GACA,EAAE,iBAAiB,KAAK,CAC1B;EACA,KAAK,qBAAqB;GACxB,KAAK;GACL,WAAW;GACX,KAAK,MAAM,WAAW,WAAW,QAAQ;GACzC,YAAY,CAAC;EACf;CACF;CAEA,eAAe;EACb,KAAK,eAAe;EACpB,KAAK,eAAe,KAAA;CACtB;AACF"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/main/index.ts"],"sourcesContent":["import { Main } from \"@freelensapp/extensions\";\nimport { reaction } from \"mobx\";\nimport { EXTENSION_DISPLAY_NAME, EXTENSION_ID } from \"../common/extension-info\";\nimport { AiPreferencesStore } from \"../common/store/ai-preferences-store\";\nimport { AiShortcutsStore } from \"../common/store/ai-shortcuts-store\";\nimport { AppearancePreferencesStore } from \"../common/store/appearance-preferences-store\";\nimport { ClusterIconsStore } from \"../common/store/cluster-icons-store\";\nimport { DashboardPreferencesStore } from \"../common/store/dashboard-preferences-store\";\nimport { MonitoringPreferencesStore } from \"../common/store/monitoring-preferences-store\";\nimport { NodeShellPreferencesStore } from \"../common/store/node-shell-preferences-store\";\nimport { PowerPreferencesStore } from \"../common/store/power-preferences-store\";\nimport { ReadOnlyPreferencesStore } from \"../common/store/read-only-preferences-store\";\nimport { startAiIpc } from \"./ai-ipc\";\nimport { startAiModels } from \"./ai-models\";\nimport { startClusterIcons } from \"./cluster-icons\";\nimport { registerClusterIconsCatalog } from \"./cluster-icons-catalog\";\nimport { registerDashboardCatalog } from \"./dashboard-catalog\";\nimport { startDashboardPicker } from \"./dashboard-picker\";\nimport { startDashboardViews } from \"./dashboard-views\";\nimport { startDiagnosticsMenuOrder } from \"./diagnostics-menu-order\";\nimport { startDockIconOverride } from \"./dock-icon\";\nimport { startMonitoringHistory } from \"./monitoring-history\";\nimport { startSettingsExport } from \"./settings-export\";\n\nexport default class FreelensPowerMain extends Main.LensExtension {\n private stopFeatures?: () => void;\n\n get name() {\n return EXTENSION_DISPLAY_NAME;\n }\n get sanitizedExtensionId() {\n return EXTENSION_ID;\n }\n get storeName() {\n return this.manifest.storeName || EXTENSION_ID;\n }\n\n onActivate() {\n const power = PowerPreferencesStore.getInstanceOrCreate<PowerPreferencesStore>();\n power.loadExtension(this);\n AiPreferencesStore.getInstanceOrCreate().loadExtension(this);\n AiShortcutsStore.getInstanceOrCreate().loadExtension(this);\n ReadOnlyPreferencesStore.getInstanceOrCreate().loadExtension(this);\n NodeShellPreferencesStore.getInstanceOrCreate().loadExtension(this);\n MonitoringPreferencesStore.getInstanceOrCreate().loadExtension(this);\n AppearancePreferencesStore.getInstanceOrCreate().loadExtension(this);\n DashboardPreferencesStore.getInstanceOrCreate().loadExtension(this);\n ClusterIconsStore.getInstanceOrCreate().loadExtension(this);\n this.stopFeatures?.();\n const stopExport = startSettingsExport();\n let disposers: (() => void)[] = [];\n const stop = reaction(\n () => power.enabled,\n (enabled) => {\n for (const dispose of disposers) dispose();\n disposers = enabled\n ? [\n startMonitoringHistory(this),\n startDiagnosticsMenuOrder(),\n startAiIpc(),\n startAiModels(),\n startDockIconOverride(),\n startDashboardViews(),\n startDashboardPicker(),\n registerDashboardCatalog(this),\n registerClusterIconsCatalog(this),\n startClusterIcons(),\n ]\n : [];\n },\n { fireImmediately: true },\n );\n this.stopFeatures = () => {\n stop();\n stopExport();\n for (const dispose of disposers) dispose();\n disposers = [];\n };\n }\n\n onDeactivate() {\n this.stopFeatures?.();\n this.stopFeatures = undefined;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwBA,IAAqB,oBAArB,cAA+C,mBAAA,KAAK,cAAc;CAChE;CAEA,IAAI,OAAO;EACT,OAAO,uBAAA;CACT;CACA,IAAI,uBAAuB;EACzB,OAAO,uBAAA;CACT;CACA,IAAI,YAAY;EACd,OAAO,KAAK,SAAS,aAAA;CACvB;CAEA,aAAa;EACX,MAAM,QAAQ,gCAAA,sBAAsB,oBAA2C;EAC/E,MAAM,cAAc,IAAI;EACxB,6BAAA,mBAAmB,oBAAoB,CAAC,CAAC,cAAc,IAAI;EAC3D,2BAAA,iBAAiB,oBAAoB,CAAC,CAAC,cAAc,IAAI;EACzD,oCAAA,yBAAyB,oBAAoB,CAAC,CAAC,cAAc,IAAI;EACjE,qCAAA,0BAA0B,oBAAoB,CAAC,CAAC,cAAc,IAAI;EAClE,qCAAA,2BAA2B,oBAAoB,CAAC,CAAC,cAAc,IAAI;EACnE,qCAAA,2BAA2B,oBAAoB,CAAC,CAAC,cAAc,IAAI;EACnE,oCAAA,0BAA0B,oBAAoB,CAAC,CAAC,cAAc,IAAI;EAClE,4BAAA,kBAAkB,oBAAoB,CAAC,CAAC,cAAc,IAAI;EAC1D,KAAK,eAAe;EACpB,MAAM,aAAa,wBAAA,oBAAoB;EACvC,IAAI,YAA4B,CAAC;EACjC,MAAM,OAAO,8BAAA,eACL,MAAM,UACX,YAAY;GACX,KAAK,MAAM,WAAW,WAAW,QAAQ;GACzC,YAAY,UACR;IACE,2BAAA,uBAAuB,IAAI;IAC3B,+BAAA,0BAA0B;IAC1B,eAAA,WAAW;IACX,kBAAA,cAAc;IACd,kBAAA,sBAAsB;IACtB,wBAAA,oBAAoB;IACpB,yBAAA,qBAAqB;IACrB,0BAAA,yBAAyB,IAAI;IAC7B,8BAAA,4BAA4B,IAAI;IAChC,sBAAA,kBAAkB;GACpB,IACA,CAAC;EACP,GACA,EAAE,iBAAiB,KAAK,CAC1B;EACA,KAAK,qBAAqB;GACxB,KAAK;GACL,WAAW;GACX,KAAK,MAAM,WAAW,WAAW,QAAQ;GACzC,YAAY,CAAC;EACf;CACF;CAEA,eAAe;EACb,KAAK,eAAe;EACpB,KAAK,eAAe,KAAA;CACtB;AACF"}
@@ -8,11 +8,21 @@ let node_fs = require("node:fs");
8
8
  //#region src/main/monitoring-history.ts
9
9
  function trusted(event) {
10
10
  const window = electron.BrowserWindow.fromWebContents(event.sender);
11
- if (!window || window.isDestroyed() || event.senderFrame !== event.sender.mainFrame) return false;
11
+ if (!window || window.isDestroyed() || !event.senderFrame) return false;
12
12
  try {
13
- const url = new URL(event.senderFrame?.url ?? "");
13
+ const frame = event.senderFrame;
14
+ const url = new URL(frame.url);
14
15
  const senderUrl = new URL(event.sender.getURL());
15
- return url.protocol === "https:" && senderUrl.origin === url.origin && (url.hostname === "renderer.freelens.app" || url.hostname.endsWith(".renderer.freelens.app"));
16
+ const trustedUrl = (candidate) => {
17
+ if (candidate.protocol !== "https:" || candidate.username || candidate.password) return false;
18
+ if (candidate.hostname === "renderer.freelens.app") return true;
19
+ if (!candidate.hostname.endsWith(".renderer.freelens.app")) return false;
20
+ const clusterId = candidate.hostname.slice(0, -22);
21
+ return !clusterId.includes(".") && !!require_extensions.Main.Catalog.getClusterById(clusterId);
22
+ };
23
+ if (!trustedUrl(url) || !trustedUrl(senderUrl)) return false;
24
+ if (frame === event.sender.mainFrame) return senderUrl.origin === url.origin;
25
+ return senderUrl.hostname === "renderer.freelens.app" && url.port === senderUrl.port && url.hostname !== "renderer.freelens.app" && frame.parent === event.sender.mainFrame && frame.top === event.sender.mainFrame;
16
26
  } catch {
17
27
  return false;
18
28
  }
@@ -1 +1 @@
1
- {"version":3,"file":"monitoring-history.js","names":[],"sources":["../../src/main/monitoring-history.ts"],"sourcesContent":["import { existsSync, mkdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { Main } from \"@freelensapp/extensions\";\nimport { app, BrowserWindow, type IpcMainInvokeEvent, ipcMain } from \"electron\";\nimport {\n HISTORY_RETENTION,\n type HistoryRequest,\n type HistoryStatus,\n MONITORING_HISTORY_CHANNEL,\n projectHistorySamples,\n validHistoryIdentity,\n} from \"../common/monitoring-history\";\nimport { MonitoringPreferencesStore } from \"../common/store/monitoring-preferences-store\";\nimport { MonitoringHistoryWorker } from \"./monitoring-history-worker\";\n\nfunction trusted(event: IpcMainInvokeEvent): boolean {\n const window = BrowserWindow.fromWebContents(event.sender);\n if (!window || window.isDestroyed() || event.senderFrame !== event.sender.mainFrame) return false;\n try {\n const url = new URL(event.senderFrame?.url ?? \"\");\n const senderUrl = new URL(event.sender.getURL());\n return (\n url.protocol === \"https:\" &&\n senderUrl.origin === url.origin &&\n (url.hostname === \"renderer.freelens.app\" || url.hostname.endsWith(\".renderer.freelens.app\"))\n );\n } catch {\n return false;\n }\n}\nexport function startMonitoringHistory(_extension: Main.LensExtension): () => void {\n let active = true;\n let database: MonitoringHistoryWorker | undefined;\n let error: string | undefined;\n const databasePath = join(app.getPath(\"userData\"), \"freelens-power-history\", \"monitoring.sqlite\");\n const preferences = MonitoringPreferencesStore.getInstanceOrCreate<MonitoringPreferencesStore>();\n const open = () => {\n if (!database && !error) {\n try {\n const directory = join(app.getPath(\"userData\"), \"freelens-power-history\");\n mkdirSync(directory, { recursive: true, mode: 0o700 });\n database = new MonitoringHistoryWorker(databasePath);\n } catch {\n error = \"Local SQLite history is unavailable in this Freelens runtime\";\n }\n }\n return database;\n };\n ipcMain.handle(MONITORING_HISTORY_CHANNEL, async (event, request: HistoryRequest) => {\n if (!active || !trusted(event)) throw new Error(\"History unavailable\");\n if (!request || ![\"status\", \"clear\", \"query\", \"append\"].includes(request.operation))\n throw new Error(\"Invalid history operation\");\n if (request.operation === \"clear\") {\n await open()?.call(\"clear\");\n return true;\n }\n if (request.operation === \"status\") {\n const db = preferences.historyEnabled || existsSync(databasePath) ? open() : database;\n let stats = { bytes: 0, samples: 0 };\n if (db) {\n try {\n stats = (await db.call(\"status\")) as typeof stats;\n } catch {\n error = \"Local SQLite history is unavailable in this Freelens runtime\";\n }\n }\n return { available: !error, enabled: preferences.historyEnabled, ...stats, error } satisfies HistoryStatus;\n }\n if (!preferences.historyEnabled) return request.operation === \"query\" ? [] : false;\n const db = open();\n if (!db) throw new Error(error);\n if (request.operation === \"append\") {\n if (!preferences.enabled) return false;\n const samples = projectHistorySamples(request.samples);\n if (samples.some((sample) => !Main.Catalog.getClusterById(sample.clusterId))) throw new Error(\"Unknown cluster\");\n await db.call(\"append\", samples);\n return true;\n }\n if (request.operation !== \"query\") throw new Error(\"Invalid history operation\");\n const query = request.query;\n const now = Date.now();\n if (\n !validHistoryIdentity(query) ||\n !Number.isSafeInteger(query.from) ||\n !Number.isSafeInteger(query.to) ||\n query.from > query.to ||\n query.from < now - HISTORY_RETENTION ||\n query.to > now + 30_000 ||\n !Main.Catalog.getClusterById(query.clusterId)\n )\n throw new Error(\"Invalid history query\");\n return db.call(\"query\", {\n clusterId: query.clusterId,\n scope: query.scope,\n uid: query.uid,\n from: query.from,\n to: query.to,\n });\n });\n return () => {\n active = false;\n ipcMain.removeHandler(MONITORING_HISTORY_CHANNEL);\n database?.close();\n database = undefined;\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"monitoring-history.js","names":[],"sources":["../../src/main/monitoring-history.ts"],"sourcesContent":["import { existsSync, mkdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { Main } from \"@freelensapp/extensions\";\nimport { app, BrowserWindow, type IpcMainInvokeEvent, ipcMain } from \"electron\";\nimport {\n HISTORY_RETENTION,\n type HistoryRequest,\n type HistoryStatus,\n MONITORING_HISTORY_CHANNEL,\n projectHistorySamples,\n validHistoryIdentity,\n} from \"../common/monitoring-history\";\nimport { MonitoringPreferencesStore } from \"../common/store/monitoring-preferences-store\";\nimport { MonitoringHistoryWorker } from \"./monitoring-history-worker\";\n\nfunction trusted(event: IpcMainInvokeEvent): boolean {\n const window = BrowserWindow.fromWebContents(event.sender);\n if (!window || window.isDestroyed() || !event.senderFrame) return false;\n try {\n const frame = event.senderFrame;\n const url = new URL(frame.url);\n const senderUrl = new URL(event.sender.getURL());\n const trustedUrl = (candidate: URL) => {\n if (candidate.protocol !== \"https:\" || candidate.username || candidate.password) return false;\n if (candidate.hostname === \"renderer.freelens.app\") return true;\n const suffix = \".renderer.freelens.app\";\n if (!candidate.hostname.endsWith(suffix)) return false;\n const clusterId = candidate.hostname.slice(0, -suffix.length);\n return !clusterId.includes(\".\") && !!Main.Catalog.getClusterById(clusterId);\n };\n if (!trustedUrl(url) || !trustedUrl(senderUrl)) return false;\n if (frame === event.sender.mainFrame) return senderUrl.origin === url.origin;\n return (\n senderUrl.hostname === \"renderer.freelens.app\" &&\n url.port === senderUrl.port &&\n url.hostname !== \"renderer.freelens.app\" &&\n frame.parent === event.sender.mainFrame &&\n frame.top === event.sender.mainFrame\n );\n } catch {\n return false;\n }\n}\n\nexport function startMonitoringHistory(_extension: Main.LensExtension): () => void {\n let active = true;\n let database: MonitoringHistoryWorker | undefined;\n let error: string | undefined;\n const databasePath = join(app.getPath(\"userData\"), \"freelens-power-history\", \"monitoring.sqlite\");\n const preferences = MonitoringPreferencesStore.getInstanceOrCreate<MonitoringPreferencesStore>();\n const open = () => {\n if (!database && !error) {\n try {\n const directory = join(app.getPath(\"userData\"), \"freelens-power-history\");\n mkdirSync(directory, { recursive: true, mode: 0o700 });\n database = new MonitoringHistoryWorker(databasePath);\n } catch {\n error = \"Local SQLite history is unavailable in this Freelens runtime\";\n }\n }\n return database;\n };\n ipcMain.handle(MONITORING_HISTORY_CHANNEL, async (event, request: HistoryRequest) => {\n if (!active || !trusted(event)) throw new Error(\"History unavailable\");\n if (!request || ![\"status\", \"clear\", \"query\", \"append\"].includes(request.operation))\n throw new Error(\"Invalid history operation\");\n if (request.operation === \"clear\") {\n await open()?.call(\"clear\");\n return true;\n }\n if (request.operation === \"status\") {\n const db = preferences.historyEnabled || existsSync(databasePath) ? open() : database;\n let stats = { bytes: 0, samples: 0 };\n if (db) {\n try {\n stats = (await db.call(\"status\")) as typeof stats;\n } catch {\n error = \"Local SQLite history is unavailable in this Freelens runtime\";\n }\n }\n return { available: !error, enabled: preferences.historyEnabled, ...stats, error } satisfies HistoryStatus;\n }\n if (!preferences.historyEnabled) return request.operation === \"query\" ? [] : false;\n const db = open();\n if (!db) throw new Error(error);\n if (request.operation === \"append\") {\n if (!preferences.enabled) return false;\n const samples = projectHistorySamples(request.samples);\n if (samples.some((sample) => !Main.Catalog.getClusterById(sample.clusterId))) throw new Error(\"Unknown cluster\");\n await db.call(\"append\", samples);\n return true;\n }\n if (request.operation !== \"query\") throw new Error(\"Invalid history operation\");\n const query = request.query;\n const now = Date.now();\n if (\n !validHistoryIdentity(query) ||\n !Number.isSafeInteger(query.from) ||\n !Number.isSafeInteger(query.to) ||\n query.from > query.to ||\n query.from < now - HISTORY_RETENTION ||\n query.to > now + 30_000 ||\n !Main.Catalog.getClusterById(query.clusterId)\n )\n throw new Error(\"Invalid history query\");\n return db.call(\"query\", {\n clusterId: query.clusterId,\n scope: query.scope,\n uid: query.uid,\n from: query.from,\n to: query.to,\n });\n });\n return () => {\n active = false;\n ipcMain.removeHandler(MONITORING_HISTORY_CHANNEL);\n database?.close();\n database = undefined;\n };\n}\n"],"mappings":";;;;;;;;AAeA,SAAS,QAAQ,OAAoC;CACnD,MAAM,SAAS,SAAA,cAAc,gBAAgB,MAAM,MAAM;CACzD,IAAI,CAAC,UAAU,OAAO,YAAY,KAAK,CAAC,MAAM,aAAa,OAAO;CAClE,IAAI;EACF,MAAM,QAAQ,MAAM;EACpB,MAAM,MAAM,IAAI,IAAI,MAAM,GAAG;EAC7B,MAAM,YAAY,IAAI,IAAI,MAAM,OAAO,OAAO,CAAC;EAC/C,MAAM,cAAc,cAAmB;GACrC,IAAI,UAAU,aAAa,YAAY,UAAU,YAAY,UAAU,UAAU,OAAO;GACxF,IAAI,UAAU,aAAa,yBAAyB,OAAO;GAE3D,IAAI,CAAC,UAAU,SAAS,SAAS,wBAAM,GAAG,OAAO;GACjD,MAAM,YAAY,UAAU,SAAS,MAAM,GAAG,GAAc;GAC5D,OAAO,CAAC,UAAU,SAAS,GAAG,KAAK,CAAC,CAAC,mBAAA,KAAK,QAAQ,eAAe,SAAS;EAC5E;EACA,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,SAAS,GAAG,OAAO;EACvD,IAAI,UAAU,MAAM,OAAO,WAAW,OAAO,UAAU,WAAW,IAAI;EACtE,OACE,UAAU,aAAa,2BACvB,IAAI,SAAS,UAAU,QACvB,IAAI,aAAa,2BACjB,MAAM,WAAW,MAAM,OAAO,aAC9B,MAAM,QAAQ,MAAM,OAAO;CAE/B,QAAQ;EACN,OAAO;CACT;AACF;AAEA,SAAgB,uBAAuB,YAA4C;CACjF,IAAI,SAAS;CACb,IAAI;CACJ,IAAI;CACJ,MAAM,gBAAA,GAAA,UAAA,KAAA,CAAoB,SAAA,IAAI,QAAQ,UAAU,GAAG,0BAA0B,mBAAmB;CAChG,MAAM,cAAc,qCAAA,2BAA2B,oBAAgD;CAC/F,MAAM,aAAa;EACjB,IAAI,CAAC,YAAY,CAAC,OAChB,IAAI;GAEF,CAAA,GAAA,QAAA,UAAA,EAAA,GAAA,UAAA,KAAA,CADuB,SAAA,IAAI,QAAQ,UAAU,GAAG,wBACtC,GAAW;IAAE,WAAW;IAAM,MAAM;GAAM,CAAC;GACrD,WAAW,IAAI,kCAAA,wBAAwB,YAAY;EACrD,QAAQ;GACN,QAAQ;EACV;EAEF,OAAO;CACT;CACA,SAAA,QAAQ,OAAO,2BAAA,4BAA4B,OAAO,OAAO,YAA4B;EACnF,IAAI,CAAC,UAAU,CAAC,QAAQ,KAAK,GAAG,MAAM,IAAI,MAAM,qBAAqB;EACrE,IAAI,CAAC,WAAW,CAAC;GAAC;GAAU;GAAS;GAAS;EAAQ,CAAC,CAAC,SAAS,QAAQ,SAAS,GAChF,MAAM,IAAI,MAAM,2BAA2B;EAC7C,IAAI,QAAQ,cAAc,SAAS;GACjC,MAAM,KAAK,CAAC,EAAE,KAAK,OAAO;GAC1B,OAAO;EACT;EACA,IAAI,QAAQ,cAAc,UAAU;GAClC,MAAM,KAAK,YAAY,mBAAA,GAAA,QAAA,WAAA,CAA6B,YAAY,IAAI,KAAK,IAAI;GAC7E,IAAI,QAAQ;IAAE,OAAO;IAAG,SAAS;GAAE;GACnC,IAAI,IACF,IAAI;IACF,QAAS,MAAM,GAAG,KAAK,QAAQ;GACjC,QAAQ;IACN,QAAQ;GACV;GAEF,OAAO;IAAE,WAAW,CAAC;IAAO,SAAS,YAAY;IAAgB,GAAG;IAAO;GAAM;EACnF;EACA,IAAI,CAAC,YAAY,gBAAgB,OAAO,QAAQ,cAAc,UAAU,CAAC,IAAI;EAC7E,MAAM,KAAK,KAAK;EAChB,IAAI,CAAC,IAAI,MAAM,IAAI,MAAM,KAAK;EAC9B,IAAI,QAAQ,cAAc,UAAU;GAClC,IAAI,CAAC,YAAY,SAAS,OAAO;GACjC,MAAM,UAAU,2BAAA,sBAAsB,QAAQ,OAAO;GACrD,IAAI,QAAQ,MAAM,WAAW,CAAC,mBAAA,KAAK,QAAQ,eAAe,OAAO,SAAS,CAAC,GAAG,MAAM,IAAI,MAAM,iBAAiB;GAC/G,MAAM,GAAG,KAAK,UAAU,OAAO;GAC/B,OAAO;EACT;EACA,IAAI,QAAQ,cAAc,SAAS,MAAM,IAAI,MAAM,2BAA2B;EAC9E,MAAM,QAAQ,QAAQ;EACtB,MAAM,MAAM,KAAK,IAAI;EACrB,IACE,CAAC,2BAAA,qBAAqB,KAAK,KAC3B,CAAC,OAAO,cAAc,MAAM,IAAI,KAChC,CAAC,OAAO,cAAc,MAAM,EAAE,KAC9B,MAAM,OAAO,MAAM,MACnB,MAAM,OAAO,MAAA,UACb,MAAM,KAAK,MAAM,OACjB,CAAC,mBAAA,KAAK,QAAQ,eAAe,MAAM,SAAS,GAE5C,MAAM,IAAI,MAAM,uBAAuB;EACzC,OAAO,GAAG,KAAK,SAAS;GACtB,WAAW,MAAM;GACjB,OAAO,MAAM;GACb,KAAK,MAAM;GACX,MAAM,MAAM;GACZ,IAAI,MAAM;EACZ,CAAC;CACH,CAAC;CACD,aAAa;EACX,SAAS;EACT,SAAA,QAAQ,cAAc,2BAAA,0BAA0B;EAChD,UAAU,MAAM;EAChB,WAAW,KAAA;CACb;AACF"}
@@ -1,7 +1,7 @@
1
1
  //#region \0global-external:react-dom
2
2
  var __m = global.ReactDOM;
3
3
  __m.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;
4
- __m.createPortal;
4
+ var createPortal = __m.createPortal;
5
5
  __m.findDOMNode;
6
6
  __m.flushSync;
7
7
  __m.hydrate;
@@ -12,4 +12,5 @@ __m.unstable_createPortal;
12
12
  __m.unstable_renderSubtreeIntoContainer;
13
13
  __m.version;
14
14
  //#endregion
15
+ exports.createPortal = createPortal;
15
16
  exports.default = __m;