@64mb/freelens-power 1.0.3 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (224) hide show
  1. package/README.md +9 -4
  2. package/THIRD_PARTY_LICENSES +1707 -0
  3. package/out/main/ai.js +63 -23
  4. package/out/main/ai.js.map +1 -1
  5. package/out/main/cluster-icons-catalog.js +28 -0
  6. package/out/main/cluster-icons-catalog.js.map +1 -0
  7. package/out/main/cluster-icons.js +125 -0
  8. package/out/main/cluster-icons.js.map +1 -0
  9. package/out/main/common/ai-terminal-context.js +51 -0
  10. package/out/main/common/ai-terminal-context.js.map +1 -0
  11. package/out/main/common/ai.js.map +1 -1
  12. package/out/main/common/cluster-icon-ipc.js +6 -0
  13. package/out/main/common/cluster-icon-ipc.js.map +1 -0
  14. package/out/main/common/cluster-icons.js +121 -0
  15. package/out/main/common/cluster-icons.js.map +1 -0
  16. package/out/main/common/dashboard.js +1 -1
  17. package/out/main/common/dashboard.js.map +1 -1
  18. package/out/main/common/monitoring-history.js +52 -0
  19. package/out/main/common/monitoring-history.js.map +1 -0
  20. package/out/main/common/settings-export.js +3 -1
  21. package/out/main/common/settings-export.js.map +1 -1
  22. package/out/main/common/store/cluster-icons-store.js +32 -0
  23. package/out/main/common/store/cluster-icons-store.js.map +1 -0
  24. package/out/main/common/store/monitoring-preferences-store.js +30 -2
  25. package/out/main/common/store/monitoring-preferences-store.js.map +1 -1
  26. package/out/main/dashboard-views.js +132 -28
  27. package/out/main/dashboard-views.js.map +1 -1
  28. package/out/main/diagnostics-menu-order.js +57 -0
  29. package/out/main/diagnostics-menu-order.js.map +1 -0
  30. package/out/main/index.js +11 -1
  31. package/out/main/index.js.map +1 -1
  32. package/out/main/monitoring-history-database.js +103 -0
  33. package/out/main/monitoring-history-database.js.map +1 -0
  34. package/out/main/monitoring-history-worker.js +61 -0
  35. package/out/main/monitoring-history-worker.js.map +1 -0
  36. package/out/main/monitoring-history.js +110 -0
  37. package/out/main/monitoring-history.js.map +1 -0
  38. package/out/renderer/_virtual/_global-external_mobx.js +2 -1
  39. package/out/renderer/_virtual/_global-external_react-dom.js +2 -1
  40. package/out/renderer/_virtual/_global-external_react.js +10 -5
  41. package/out/renderer/_virtual/_rolldown/runtime.js +22 -0
  42. package/out/renderer/ai-terminal-context.js +200 -0
  43. package/out/renderer/ai-terminal-context.js.map +1 -0
  44. package/out/renderer/ai.js +90 -9
  45. package/out/renderer/ai.js.map +1 -1
  46. package/out/renderer/appearance.js +1 -0
  47. package/out/renderer/appearance.js.map +1 -1
  48. package/out/renderer/cluster-icon-colors.js +188 -0
  49. package/out/renderer/cluster-icon-colors.js.map +1 -0
  50. package/out/renderer/cluster-icons.js +304 -0
  51. package/out/renderer/cluster-icons.js.map +1 -0
  52. package/out/renderer/dashboard.js +8 -5
  53. package/out/renderer/dashboard.js.map +1 -1
  54. package/out/renderer/details/secret-certificate-details.js +9 -2
  55. package/out/renderer/details/secret-certificate-details.js.map +1 -1
  56. package/out/renderer/diagnostics.css.js +39 -0
  57. package/out/renderer/diagnostics.css.js.map +1 -0
  58. package/out/renderer/diagnostics.js +1100 -0
  59. package/out/renderer/diagnostics.js.map +1 -0
  60. package/out/renderer/index.js +32 -0
  61. package/out/renderer/index.js.map +1 -1
  62. package/out/renderer/monitoring-collector.js +202 -0
  63. package/out/renderer/monitoring-collector.js.map +1 -0
  64. package/out/renderer/monitoring-details-chart.js +42 -0
  65. package/out/renderer/monitoring-details-chart.js.map +1 -0
  66. package/out/renderer/monitoring-history-collection.js +168 -0
  67. package/out/renderer/monitoring-history-collection.js.map +1 -0
  68. package/out/renderer/monitoring-history-view.js +227 -0
  69. package/out/renderer/monitoring-history-view.js.map +1 -0
  70. package/out/renderer/monitoring-history.js +19 -0
  71. package/out/renderer/monitoring-history.js.map +1 -0
  72. package/out/renderer/monitoring.js +153 -139
  73. package/out/renderer/monitoring.js.map +1 -1
  74. package/out/renderer/node-monitoring.js +127 -0
  75. package/out/renderer/node-monitoring.js.map +1 -0
  76. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js +10 -0
  77. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js.map +1 -0
  78. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js +8 -0
  79. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js.map +1 -0
  80. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js +9 -0
  81. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js.map +1 -0
  82. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js +9 -0
  83. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js.map +1 -0
  84. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/classCallCheck.js +8 -0
  85. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/classCallCheck.js.map +1 -0
  86. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/createClass.js +15 -0
  87. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/createClass.js.map +1 -0
  88. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/createSuper.js +19 -0
  89. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/createSuper.js.map +1 -0
  90. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/defineProperty.js +14 -0
  91. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/defineProperty.js.map +1 -0
  92. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/extends.js +19 -0
  93. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/extends.js.map +1 -0
  94. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js +15 -0
  95. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js.map +1 -0
  96. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/inherits.js +14 -0
  97. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/inherits.js.map +1 -0
  98. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/isNativeReflectConstruct.js +18 -0
  99. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/isNativeReflectConstruct.js.map +1 -0
  100. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/iterableToArray.js +8 -0
  101. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/iterableToArray.js.map +1 -0
  102. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js +26 -0
  103. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js.map +1 -0
  104. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/nonIterableRest.js +8 -0
  105. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/nonIterableRest.js.map +1 -0
  106. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js +8 -0
  107. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js.map +1 -0
  108. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/objectSpread2.js +27 -0
  109. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/objectSpread2.js.map +1 -0
  110. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js +15 -0
  111. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js.map +1 -0
  112. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js +14 -0
  113. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js.map +1 -0
  114. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js +12 -0
  115. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js.map +1 -0
  116. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js +15 -0
  117. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js.map +1 -0
  118. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/slicedToArray.js +12 -0
  119. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/slicedToArray.js.map +1 -0
  120. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/taggedTemplateLiteral.js +8 -0
  121. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/taggedTemplateLiteral.js.map +1 -0
  122. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/toConsumableArray.js +12 -0
  123. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/toConsumableArray.js.map +1 -0
  124. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/toPrimitive.js +16 -0
  125. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/toPrimitive.js.map +1 -0
  126. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/toPropertyKey.js +11 -0
  127. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/toPropertyKey.js.map +1 -0
  128. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/typeof.js +18 -0
  129. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/typeof.js.map +1 -0
  130. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js +13 -0
  131. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js.map +1 -0
  132. package/out/renderer/node_modules/.pnpm/@emotion_cache@11.14.0/node_modules/@emotion/cache/dist/emotion-cache.browser.esm.js +237 -0
  133. package/out/renderer/node_modules/.pnpm/@emotion_cache@11.14.0/node_modules/@emotion/cache/dist/emotion-cache.browser.esm.js.map +1 -0
  134. package/out/renderer/node_modules/.pnpm/@emotion_hash@0.9.2/node_modules/@emotion/hash/dist/emotion-hash.esm.js +25 -0
  135. package/out/renderer/node_modules/.pnpm/@emotion_hash@0.9.2/node_modules/@emotion/hash/dist/emotion-hash.esm.js.map +1 -0
  136. package/out/renderer/node_modules/.pnpm/@emotion_memoize@0.9.0/node_modules/@emotion/memoize/dist/emotion-memoize.esm.js +12 -0
  137. package/out/renderer/node_modules/.pnpm/@emotion_memoize@0.9.0/node_modules/@emotion/memoize/dist/emotion-memoize.esm.js.map +1 -0
  138. package/out/renderer/node_modules/.pnpm/@emotion_react@11.14.0_@types_react@17.0.93_react@17.0.2/node_modules/@emotion/react/dist/emotion-element-f0de968e.browser.esm.js +58 -0
  139. package/out/renderer/node_modules/.pnpm/@emotion_react@11.14.0_@types_react@17.0.93_react@17.0.2/node_modules/@emotion/react/dist/emotion-element-f0de968e.browser.esm.js.map +1 -0
  140. package/out/renderer/node_modules/.pnpm/@emotion_react@11.14.0_@types_react@17.0.93_react@17.0.2/node_modules/@emotion/react/dist/emotion-react.browser.esm.js +54 -0
  141. package/out/renderer/node_modules/.pnpm/@emotion_react@11.14.0_@types_react@17.0.93_react@17.0.2/node_modules/@emotion/react/dist/emotion-react.browser.esm.js.map +1 -0
  142. package/out/renderer/node_modules/.pnpm/@emotion_serialize@1.3.3/node_modules/@emotion/serialize/dist/emotion-serialize.esm.js +133 -0
  143. package/out/renderer/node_modules/.pnpm/@emotion_serialize@1.3.3/node_modules/@emotion/serialize/dist/emotion-serialize.esm.js.map +1 -0
  144. package/out/renderer/node_modules/.pnpm/@emotion_sheet@1.4.0/node_modules/@emotion/sheet/dist/emotion-sheet.esm.js +65 -0
  145. package/out/renderer/node_modules/.pnpm/@emotion_sheet@1.4.0/node_modules/@emotion/sheet/dist/emotion-sheet.esm.js.map +1 -0
  146. package/out/renderer/node_modules/.pnpm/@emotion_unitless@0.10.0/node_modules/@emotion/unitless/dist/emotion-unitless.esm.js +54 -0
  147. package/out/renderer/node_modules/.pnpm/@emotion_unitless@0.10.0/node_modules/@emotion/unitless/dist/emotion-unitless.esm.js.map +1 -0
  148. package/out/renderer/node_modules/.pnpm/@emotion_use-insertion-effect-with-fallbacks@1.2.0_react@17.0.2/node_modules/@emotion/use-insertion-effect-with-fallbacks/dist/emotion-use-insertion-effect-with-fallbacks.browser.esm.js +12 -0
  149. package/out/renderer/node_modules/.pnpm/@emotion_use-insertion-effect-with-fallbacks@1.2.0_react@17.0.2/node_modules/@emotion/use-insertion-effect-with-fallbacks/dist/emotion-use-insertion-effect-with-fallbacks.browser.esm.js.map +1 -0
  150. package/out/renderer/node_modules/.pnpm/@emotion_utils@1.4.2/node_modules/@emotion/utils/dist/emotion-utils.browser.esm.js +30 -0
  151. package/out/renderer/node_modules/.pnpm/@emotion_utils@1.4.2/node_modules/@emotion/utils/dist/emotion-utils.browser.esm.js.map +1 -0
  152. package/out/renderer/node_modules/.pnpm/@floating-ui_dom@1.7.2/node_modules/@floating-ui/dom/dist/floating-ui.dom.js +211 -0
  153. package/out/renderer/node_modules/.pnpm/@floating-ui_dom@1.7.2/node_modules/@floating-ui/dom/dist/floating-ui.dom.js.map +1 -0
  154. package/out/renderer/node_modules/.pnpm/@floating-ui_utils@0.2.10/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.js +97 -0
  155. package/out/renderer/node_modules/.pnpm/@floating-ui_utils@0.2.10/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.js.map +1 -0
  156. package/out/renderer/node_modules/.pnpm/@floating-ui_utils@0.2.10/node_modules/@floating-ui/utils/dist/floating-ui.utils.js +31 -0
  157. package/out/renderer/node_modules/.pnpm/@floating-ui_utils@0.2.10/node_modules/@floating-ui/utils/dist/floating-ui.utils.js.map +1 -0
  158. package/out/renderer/node_modules/.pnpm/hoist-non-react-statics@3.3.2/node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js +93 -0
  159. package/out/renderer/node_modules/.pnpm/hoist-non-react-statics@3.3.2/node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js.map +1 -0
  160. package/out/renderer/node_modules/.pnpm/memoize-one@6.0.0/node_modules/memoize-one/dist/memoize-one.esm.js +38 -0
  161. package/out/renderer/node_modules/.pnpm/memoize-one@6.0.0/node_modules/memoize-one/dist/memoize-one.esm.js.map +1 -0
  162. package/out/renderer/node_modules/.pnpm/react-is@16.13.1/node_modules/react-is/cjs/react-is.development.js +159 -0
  163. package/out/renderer/node_modules/.pnpm/react-is@16.13.1/node_modules/react-is/cjs/react-is.development.js.map +1 -0
  164. package/out/renderer/node_modules/.pnpm/react-is@16.13.1/node_modules/react-is/cjs/react-is.production.min.js +103 -0
  165. package/out/renderer/node_modules/.pnpm/react-is@16.13.1/node_modules/react-is/cjs/react-is.production.min.js.map +1 -0
  166. package/out/renderer/node_modules/.pnpm/react-is@16.13.1/node_modules/react-is/index.js +18 -0
  167. package/out/renderer/node_modules/.pnpm/react-is@16.13.1/node_modules/react-is/index.js.map +1 -0
  168. package/out/renderer/node_modules/.pnpm/react-select@5.10.2_@types_react@17.0.93_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/react-select/dist/Select-ef7c0426.esm.js +2200 -0
  169. package/out/renderer/node_modules/.pnpm/react-select@5.10.2_@types_react@17.0.93_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/react-select/dist/Select-ef7c0426.esm.js.map +1 -0
  170. package/out/renderer/node_modules/.pnpm/react-select@5.10.2_@types_react@17.0.93_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/react-select/dist/index-641ee5b8.esm.js +992 -0
  171. package/out/renderer/node_modules/.pnpm/react-select@5.10.2_@types_react@17.0.93_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/react-select/dist/index-641ee5b8.esm.js.map +1 -0
  172. package/out/renderer/node_modules/.pnpm/react-select@5.10.2_@types_react@17.0.93_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/react-select/dist/react-select.esm.js +14 -0
  173. package/out/renderer/node_modules/.pnpm/react-select@5.10.2_@types_react@17.0.93_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/react-select/dist/react-select.esm.js.map +1 -0
  174. package/out/renderer/node_modules/.pnpm/react-select@5.10.2_@types_react@17.0.93_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/react-select/dist/useStateManager-7e1e8489.esm.js +56 -0
  175. package/out/renderer/node_modules/.pnpm/react-select@5.10.2_@types_react@17.0.93_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/react-select/dist/useStateManager-7e1e8489.esm.js.map +1 -0
  176. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Enum.js +22 -0
  177. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Enum.js.map +1 -0
  178. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Middleware.js +30 -0
  179. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Middleware.js.map +1 -0
  180. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Parser.js +164 -0
  181. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Parser.js.map +1 -0
  182. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Serializer.js +37 -0
  183. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Serializer.js.map +1 -0
  184. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Tokenizer.js +245 -0
  185. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Tokenizer.js.map +1 -0
  186. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Utility.js +120 -0
  187. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Utility.js.map +1 -0
  188. package/out/renderer/node_modules/.pnpm/use-isomorphic-layout-effect@1.2.1_@types_react@17.0.93_react@17.0.2/node_modules/use-isomorphic-layout-effect/dist/use-isomorphic-layout-effect.browser.esm.js +6 -0
  189. package/out/renderer/node_modules/.pnpm/use-isomorphic-layout-effect@1.2.1_@types_react@17.0.93_react@17.0.2/node_modules/use-isomorphic-layout-effect/dist/use-isomorphic-layout-effect.browser.esm.js.map +1 -0
  190. package/out/renderer/pod-monitoring.js +38 -11
  191. package/out/renderer/pod-monitoring.js.map +1 -1
  192. package/out/renderer/preferences/ai-shortcuts-preferences.js +12 -4
  193. package/out/renderer/preferences/ai-shortcuts-preferences.js.map +1 -1
  194. package/out/renderer/preferences/dashboard-preferences.js +20 -4
  195. package/out/renderer/preferences/dashboard-preferences.js.map +1 -1
  196. package/out/renderer/preferences/monitoring-preferences.js +141 -9
  197. package/out/renderer/preferences/monitoring-preferences.js.map +1 -1
  198. package/out/renderer/preferences/preferences.js +31 -7
  199. package/out/renderer/preferences/preferences.js.map +1 -1
  200. package/out/renderer/read-only.js +2 -2
  201. package/out/renderer/read-only.js.map +1 -1
  202. package/out/renderer/src/common/ai-terminal-context.js +51 -0
  203. package/out/renderer/src/common/ai-terminal-context.js.map +1 -0
  204. package/out/renderer/src/common/ai.js.map +1 -1
  205. package/out/renderer/src/common/cluster-icon-ipc.js +6 -0
  206. package/out/renderer/src/common/cluster-icon-ipc.js.map +1 -0
  207. package/out/renderer/src/common/cluster-icons.js +133 -0
  208. package/out/renderer/src/common/cluster-icons.js.map +1 -0
  209. package/out/renderer/src/common/dashboard.js +1 -1
  210. package/out/renderer/src/common/dashboard.js.map +1 -1
  211. package/out/renderer/src/common/date-time.js +11 -0
  212. package/out/renderer/src/common/date-time.js.map +1 -0
  213. package/out/renderer/src/common/monitoring-history.js +17 -0
  214. package/out/renderer/src/common/monitoring-history.js.map +1 -0
  215. package/out/renderer/src/common/monitoring-math.js +98 -0
  216. package/out/renderer/src/common/monitoring-math.js.map +1 -0
  217. package/out/renderer/src/common/resource-diagnostics.js +227 -0
  218. package/out/renderer/src/common/resource-diagnostics.js.map +1 -0
  219. package/out/renderer/src/common/settings-export.js.map +1 -1
  220. package/out/renderer/src/common/store/monitoring-preferences-store.js +30 -2
  221. package/out/renderer/src/common/store/monitoring-preferences-store.js.map +1 -1
  222. package/out/renderer/welcome.js +31 -7
  223. package/out/renderer/welcome.js.map +1 -1
  224. package/package.json +3 -2
@@ -48,6 +48,26 @@ function rectangle(value) {
48
48
  height: rect.height
49
49
  };
50
50
  }
51
+ async function waitForReadiness(contents, network, selector, current) {
52
+ let deadline;
53
+ try {
54
+ await Promise.race([(async () => {
55
+ if (!current()) return;
56
+ await network.ready();
57
+ if (!current()) return;
58
+ await contents.executeJavaScriptInIsolatedWorld(1004, [{ code: require_dashboard_selector.dashboardSelectorScript(selector()) }]).catch(() => {});
59
+ do {
60
+ await network.wait();
61
+ if (!current()) return;
62
+ await contents.executeJavaScriptInIsolatedWorld(1004, [{ code: require_dashboard_readiness.dashboardReadinessScript(selector()) }]);
63
+ } while (current() && !network.quiet());
64
+ })().catch(() => new Promise((resolve) => setTimeout(resolve, 200))), new Promise((resolve) => {
65
+ deadline = setTimeout(resolve, 8500);
66
+ })]);
67
+ } finally {
68
+ clearTimeout(deadline);
69
+ }
70
+ }
51
71
  function startDashboardViews() {
52
72
  const websiteSession = electron.session.fromPartition("persist:freelens-power-websites");
53
73
  websiteSession.setPermissionRequestHandler((_contents, _permission, callback) => callback(false));
@@ -61,6 +81,7 @@ function startDashboardViews() {
61
81
  card.stopPreparation?.();
62
82
  card.faviconRequest?.abort();
63
83
  clearInterval(card.refreshTimer);
84
+ card.floatingPreparation?.stop();
64
85
  card.floating?.destroy();
65
86
  card.floating = void 0;
66
87
  if (!owner.window.isDestroyed()) owner.window.contentView.removeChildView(card.container);
@@ -149,25 +170,11 @@ function startDashboardViews() {
149
170
  return card.view.webContents.loadURL(target);
150
171
  };
151
172
  card.pending = load().then(async () => {
152
- let deadline;
153
173
  let preparing = true;
154
174
  const current = () => preparing && card.generation === generation && !card.view.webContents.isDestroyed() && [...owners.values()].some((owner) => [...owner.cards.values()].includes(card));
155
175
  try {
156
- await Promise.race([(async () => {
157
- if (!current()) return;
158
- await network.ready();
159
- if (!current()) return;
160
- await applySelector(card);
161
- do {
162
- await network.wait();
163
- if (!current()) return;
164
- await card.view.webContents.executeJavaScriptInIsolatedWorld(1004, [{ code: require_dashboard_readiness.dashboardReadinessScript(card.selector) }]);
165
- } while (current() && !network.quiet());
166
- })().catch(() => new Promise((resolve) => setTimeout(resolve, 200))), new Promise((resolve) => {
167
- deadline = setTimeout(resolve, 8500);
168
- })]);
176
+ await waitForReadiness(contents, network, () => card.selector, current);
169
177
  } finally {
170
- clearTimeout(deadline);
171
178
  preparing = false;
172
179
  stopPreparation();
173
180
  }
@@ -197,10 +204,7 @@ function startDashboardViews() {
197
204
  if (card.selector !== setting.selector) {
198
205
  card.selector = setting.selector;
199
206
  applySelector(card);
200
- if (card.floating && !card.floating.isDestroyed()) applySelector({
201
- view: { webContents: card.floating.webContents },
202
- selector: card.selector
203
- });
207
+ card.floatingPreparation?.selectorChanged();
204
208
  }
205
209
  if (card.floating && !card.floating.isDestroyed()) card.floating.setTitle(setting.title);
206
210
  if (!setting.autoRefresh) {
@@ -502,20 +506,123 @@ function startDashboardViews() {
502
506
  });
503
507
  contents.on("page-title-updated", (event) => event.preventDefault());
504
508
  contents.on("will-prevent-unload", (event) => event.preventDefault());
509
+ const skeleton = new electron.View();
510
+ skeleton.setBackgroundColor(electron.nativeTheme.shouldUseDarkColors ? "#202124" : "#ffffff");
511
+ const bars = Array.from({ length: 4 }, () => {
512
+ const bar = new electron.View();
513
+ bar.setBackgroundColor(electron.nativeTheme.shouldUseDarkColors ? "#393b40" : "#e8e9eb");
514
+ bar.setBorderRadius(6);
515
+ skeleton.addChildView(bar);
516
+ return bar;
517
+ });
518
+ const layoutSkeleton = () => {
519
+ const { width, height } = floating.getContentBounds();
520
+ skeleton.setBounds({
521
+ x: 0,
522
+ y: 0,
523
+ width,
524
+ height
525
+ });
526
+ bars.forEach((bar, index) => {
527
+ bar.setBounds({
528
+ x: 20,
529
+ y: index === 0 ? 20 : 60 + (index - 1) * 24,
530
+ width: Math.max(1, Math.round((width - 40) * (index === 0 ? .45 : 1))),
531
+ height: index === 0 ? 20 : index === 3 ? Math.max(30, height - 128) : 12
532
+ });
533
+ });
534
+ };
535
+ floating.contentView.addChildView(skeleton);
536
+ floating.on("resize", layoutSkeleton);
537
+ layoutSkeleton();
538
+ let generation = 0;
539
+ let stopPreparation = () => {};
540
+ let finishLoad;
541
+ const begin = () => {
542
+ stopPreparation();
543
+ const token = ++generation;
544
+ const backgroundThrottling = contents.getBackgroundThrottling();
545
+ if (backgroundThrottling) contents.setBackgroundThrottling(false);
546
+ const network = require_dashboard_network.observeDashboardNetwork(contents);
547
+ let active = true;
548
+ let finishing;
549
+ const current = () => active && generation === token && card.floating === floating && !contents.isDestroyed();
550
+ skeleton.setVisible(true);
551
+ stopPreparation = () => {
552
+ if (!active) return;
553
+ active = false;
554
+ network.dispose();
555
+ if (!contents.isDestroyed() && backgroundThrottling) contents.setBackgroundThrottling(true);
556
+ };
557
+ const stop = stopPreparation;
558
+ const finish = () => {
559
+ finishing ??= (async () => {
560
+ await waitForReadiness(contents, network, () => card.selector, current);
561
+ if (!current()) return false;
562
+ skeleton.setVisible(false);
563
+ stop();
564
+ return false;
565
+ })();
566
+ return finishing;
567
+ };
568
+ finishLoad = finish;
569
+ return {
570
+ finish,
571
+ fail: () => {
572
+ if (current()) {
573
+ skeleton.setVisible(false);
574
+ stop();
575
+ }
576
+ }
577
+ };
578
+ };
579
+ const refresh = () => {
580
+ const preparation = begin();
581
+ const current = contents.getURL();
582
+ return contents.loadURL(webUrl(current) ? current : configured.url).then(() => finishLoad?.() ?? false, () => {
583
+ preparation.fail();
584
+ return !contents.isDestroyed();
585
+ });
586
+ };
587
+ card.floatingPreparation = {
588
+ refresh,
589
+ selectorChanged: () => {
590
+ const preparation = begin();
591
+ if (!contents.isLoading()) preparation.finish();
592
+ },
593
+ stop: () => {
594
+ ++generation;
595
+ stopPreparation();
596
+ }
597
+ };
598
+ contents.on("did-start-navigation", (_event, _url, inPlace, mainFrame) => {
599
+ if (!mainFrame) return;
600
+ const preparation = begin();
601
+ if (inPlace) preparation.finish();
602
+ });
505
603
  contents.on("did-finish-load", () => {
506
604
  if (contents.isDestroyed()) return;
507
605
  contents.insertCSS(websiteStyles, { cssOrigin: "user" }).catch(() => {});
508
- applySelector({
509
- view: { webContents: contents },
510
- selector: card.selector
511
- });
606
+ finishLoad?.();
607
+ });
608
+ contents.on("did-fail-load", (_event, code, _description, _url, mainFrame) => {
609
+ if (!mainFrame || code === -3) return;
610
+ stopPreparation();
611
+ skeleton.setVisible(false);
612
+ });
613
+ contents.once("destroyed", () => {
614
+ ++generation;
615
+ stopPreparation();
512
616
  });
513
617
  floating.on("closed", () => {
514
618
  if (card.floating !== floating) return;
619
+ card.floatingPreparation?.stop();
620
+ card.floatingPreparation = void 0;
515
621
  card.floating = void 0;
516
622
  if (owner.cards.get(id) === card) publishPinned(event.sender, owner);
517
623
  });
518
- contents.loadURL(configured.url).catch(() => {});
624
+ const initial = begin();
625
+ contents.loadURL(configured.url).then(() => finishLoad?.(), initial.fail);
519
626
  floating.show();
520
627
  }
521
628
  publishPinned(event.sender, owner);
@@ -529,10 +636,7 @@ function startDashboardViews() {
529
636
  const card = owners.get(event.sender)?.cards.get(payload.id);
530
637
  const configured = require_dashboard.sanitizeDashboardCards(require_dashboard_preferences_store.DashboardPreferencesStore.getInstanceOrCreate().cards).find((item) => item.id === payload.id);
531
638
  if (!card || !configured || card.view.webContents.isDestroyed()) return;
532
- const floating = card.floating?.webContents;
533
- const current = floating?.getURL();
534
- const floatingReload = floating && !floating.isDestroyed() ? floating.loadURL(current && webUrl(current) ? current : configured.url).then(() => false, () => !floating.isDestroyed()) : Promise.resolve(false);
535
- const [, floatingFailed] = await Promise.all([reload(card, configured.url), floatingReload]);
639
+ const [, floatingFailed] = await Promise.all([reload(card, configured.url), card.floatingPreparation?.refresh() ?? Promise.resolve(false)]);
536
640
  return { failed: card.failed || floatingFailed ? [payload.id] : [] };
537
641
  });
538
642
  return () => {
@@ -1 +1 @@
1
- {"version":3,"file":"dashboard-views.js","names":[],"sources":["../../src/main/dashboard-views.ts"],"sourcesContent":["// SPDX-License-Identifier: Apache-2.0\nimport { join } from \"node:path\";\nimport {\n app,\n BrowserWindow,\n type IpcMainInvokeEvent,\n ipcMain,\n type Rectangle,\n session,\n shell,\n View,\n type WebContents,\n WebContentsView,\n} from \"electron\";\nimport { reaction } from \"mobx\";\nimport { sanitizeDashboardCards } from \"../common/dashboard\";\nimport { dashboardReadinessScript } from \"../common/dashboard-readiness\";\nimport { dashboardSelectorScript } from \"../common/dashboard-selector\";\nimport {\n DASHBOARD_SITE_ICONS,\n DASHBOARD_VIEWS_LOADING,\n DASHBOARD_VIEWS_PIN,\n DASHBOARD_VIEWS_PINNED,\n type DashboardSiteIcon,\n} from \"../common/dashboard-views\";\nimport { DashboardPreferencesStore } from \"../common/store/dashboard-preferences-store\";\nimport { boundedDashboardIcons, loadDashboardIcons, saveDashboardIcons } from \"./dashboard-icon-cache\";\nimport { observeDashboardNetwork } from \"./dashboard-network\";\n\nconst syncChannel = \"freelens-power:dashboard-views:sync\";\nconst reloadChannel = \"freelens-power:dashboard-views:reload\";\nconst clearChannel = \"freelens-power:dashboard-views:clear\";\nconst dashboardPath = \"/extension/freelens-power/dashboard\";\nconst websiteStyles =\n \"* { scrollbar-width: none !important; } *::-webkit-scrollbar { display: none !important; width: 0 !important; height: 0 !important; }\";\n\nfunction rendererUrl(value: string, dashboardOnly = false): boolean {\n try {\n const url = new URL(value);\n return (\n url.protocol === \"https:\" &&\n (url.hostname === \"renderer.freelens.app\" || url.hostname.endsWith(\".renderer.freelens.app\")) &&\n (!dashboardOnly || url.pathname === dashboardPath)\n );\n } catch {\n return false;\n }\n}\nfunction dashboardUrl(value: string): boolean {\n return rendererUrl(value, true);\n}\nfunction webUrl(value: string): boolean {\n try {\n return [\"https:\", \"http:\"].includes(new URL(value).protocol);\n } catch {\n return false;\n }\n}\nfunction rectangle(value: unknown): Rectangle | undefined {\n if (!value || typeof value !== \"object\") return;\n const rect = value as Rectangle;\n if (\n ![rect.x, rect.y, rect.width, rect.height].every(\n (n) => Number.isFinite(n) && Number.isInteger(n) && Math.abs(n) <= 32768,\n ) ||\n rect.width <= 0 ||\n rect.height <= 0\n )\n return;\n return { x: rect.x, y: rect.y, width: rect.width, height: rect.height };\n}\n\ntype CardView = {\n container: View;\n view: WebContentsView;\n url: string;\n failed: boolean;\n loading: boolean;\n visible: boolean;\n generation: number;\n stopPreparation?: () => void;\n selector?: string;\n pending?: Promise<void>;\n favicon?: string;\n faviconRequest?: AbortController;\n refreshTimer?: ReturnType<typeof setInterval>;\n floating?: BrowserWindow;\n};\ntype Owner = { window: BrowserWindow; cards: Map<string, CardView>; cleanup: () => void };\n\nexport function startDashboardViews(): () => void {\n const websiteSession = session.fromPartition(\"persist:freelens-power-websites\");\n websiteSession.setPermissionRequestHandler((_contents, _permission, callback) => callback(false));\n websiteSession.setPermissionCheckHandler(() => false);\n const owners = new Map<WebContents, Owner>();\n const icons = new Map<string, DashboardSiteIcon>();\n const remove = (owner: Owner, id: string) => {\n const card = owner.cards.get(id);\n if (!card) return;\n owner.cards.delete(id);\n card.stopPreparation?.();\n card.faviconRequest?.abort();\n clearInterval(card.refreshTimer);\n card.floating?.destroy();\n card.floating = undefined;\n if (!owner.window.isDestroyed()) owner.window.contentView.removeChildView(card.container);\n if (!card.view.webContents.isDestroyed()) card.view.webContents.close();\n };\n const clear = (sender: WebContents) => {\n const owner = owners.get(sender);\n if (!owner) return;\n owners.delete(sender);\n for (const id of owner.cards.keys()) remove(owner, id);\n owner.cleanup();\n };\n const hide = (sender: WebContents) => {\n for (const card of owners.get(sender)?.cards.values() ?? []) {\n card.visible = false;\n card.container.setVisible(false);\n }\n };\n const configuredCards = () =>\n sanitizeDashboardCards(DashboardPreferencesStore.getInstanceOrCreate<DashboardPreferencesStore>().cards);\n const cachePath = join(app.getPath(\"userData\"), \"freelens-power\", \"dashboard-icons.json\");\n const ready = loadDashboardIcons(cachePath).then((saved) => {\n const configured = configuredCards();\n for (const icon of saved) {\n if (!icons.has(icon.id) && configured.some((card) => card.id === icon.id && card.url === icon.pageUrl))\n icons.set(icon.id, icon);\n }\n });\n let writes = ready;\n const persistIcons = () => {\n writes = writes\n .then(async () => {\n const configured = configuredCards();\n const bounded = boundedDashboardIcons(\n [...icons.values()].filter((icon) =>\n configured.some((card) => card.id === icon.id && card.url === icon.pageUrl),\n ),\n );\n icons.clear();\n for (const icon of bounded) icons.set(icon.id, icon);\n await saveDashboardIcons(cachePath, bounded);\n })\n .catch(() => {});\n };\n persistIcons();\n const publishLoading = (card: CardView) => {\n for (const [sender, owner] of owners) {\n const id = [...owner.cards].find(([, candidate]) => candidate === card)?.[0];\n if (\n !id ||\n sender.isDestroyed() ||\n !dashboardUrl(sender.mainFrame.url) ||\n !dashboardUrl(sender.getURL()) ||\n !configuredCards().some((configured) => configured.id === id && configured.url === card.url)\n )\n continue;\n sender.send(DASHBOARD_VIEWS_LOADING, { id, url: card.url, loading: card.loading, failed: card.failed });\n }\n };\n const reload = (card: CardView, configuredUrl: string, initial = false) => {\n const current = card.view.webContents.getURL();\n const target = !initial && card.url === configuredUrl && webUrl(current) ? current : configuredUrl;\n card.faviconRequest?.abort();\n card.url = configuredUrl;\n card.failed = false;\n card.loading = true;\n card.stopPreparation?.();\n const contents = card.view.webContents;\n const backgroundThrottling = contents.getBackgroundThrottling();\n if (backgroundThrottling) contents.setBackgroundThrottling(false);\n const network = observeDashboardNetwork(card.view.webContents);\n let stopped = false;\n const stopPreparation = () => {\n if (stopped) return;\n stopped = true;\n network.dispose();\n contents.removeListener(\"destroyed\", stopPreparation);\n if (!contents.isDestroyed() && backgroundThrottling && !contents.getBackgroundThrottling())\n contents.setBackgroundThrottling(backgroundThrottling);\n if (card.stopPreparation === stopPreparation) card.stopPreparation = undefined;\n };\n card.stopPreparation = stopPreparation;\n contents.once(\"destroyed\", stopPreparation);\n const generation = ++card.generation;\n card.container.setVisible(false);\n publishLoading(card);\n const settled = (failed: boolean) => {\n if (card.generation !== generation || card.view.webContents.isDestroyed()) return;\n card.failed = failed;\n card.loading = false;\n for (const [sender, owner] of owners) {\n if (![...owner.cards.values()].includes(card)) continue;\n card.container.setVisible(card.visible && !card.floating && !failed && dashboardUrl(sender.getURL()));\n }\n publishLoading(card);\n };\n const load = () => {\n if (\n card.generation !== generation ||\n card.view.webContents.isDestroyed() ||\n ![...owners.values()].some((owner) => [...owner.cards.values()].includes(card))\n )\n return Promise.resolve();\n return card.view.webContents.loadURL(target);\n };\n card.pending = load().then(\n async () => {\n let deadline: ReturnType<typeof setTimeout> | undefined;\n let preparing = true;\n const current = () =>\n preparing &&\n card.generation === generation &&\n !card.view.webContents.isDestroyed() &&\n [...owners.values()].some((owner) => [...owner.cards.values()].includes(card));\n try {\n await Promise.race([\n (async () => {\n if (!current()) return;\n await network.ready();\n if (!current()) return;\n await applySelector(card);\n do {\n await network.wait();\n if (!current()) return;\n await card.view.webContents.executeJavaScriptInIsolatedWorld(1004, [\n { code: dashboardReadinessScript(card.selector) },\n ]);\n } while (current() && !network.quiet());\n })().catch(() => new Promise<void>((resolve) => setTimeout(resolve, 200))),\n new Promise<void>((resolve) => {\n deadline = setTimeout(resolve, 8500);\n }),\n ]);\n } finally {\n clearTimeout(deadline);\n preparing = false;\n stopPreparation();\n }\n settled(false);\n },\n () => {\n stopPreparation();\n settled(true);\n },\n );\n return card.pending;\n };\n const applySelector = (card: { view: { webContents: WebContents }; selector?: string }) => {\n if (card.view.webContents.isDestroyed()) return Promise.resolve();\n return card.view.webContents\n .executeJavaScriptInIsolatedWorld(1004, [{ code: dashboardSelectorScript(card.selector) }])\n .catch(() => {});\n };\n const refreshTimers = () => {\n const configured = configuredCards();\n for (const [id, icon] of icons) {\n if (!configured.some((card) => card.id === id && card.url === icon.pageUrl)) {\n icons.delete(id);\n persistIcons();\n }\n }\n for (const [sender, owner] of owners) {\n for (const [id, card] of owner.cards) {\n const setting = configured.find((item) => item.id === id);\n if (!setting || setting.url !== card.url) {\n remove(owner, id);\n continue;\n }\n if (card.selector !== setting.selector) {\n card.selector = setting.selector;\n applySelector(card);\n if (card.floating && !card.floating.isDestroyed())\n applySelector({ view: { webContents: card.floating.webContents }, selector: card.selector });\n }\n if (card.floating && !card.floating.isDestroyed()) card.floating.setTitle(setting.title);\n if (!setting.autoRefresh) {\n clearInterval(card.refreshTimer);\n card.refreshTimer = undefined;\n continue;\n }\n if (card.refreshTimer) continue;\n card.refreshTimer = setInterval(() => {\n const latest = configuredCards().find((item) => item.id === id);\n if (\n owners.get(sender) !== owner ||\n card.floating ||\n dashboardUrl(sender.getURL()) ||\n owner.cards.get(id) !== card ||\n !latest?.autoRefresh ||\n latest.url !== card.url ||\n card.view.webContents.isDestroyed() ||\n card.view.webContents.isLoading()\n )\n return;\n void reload(card, latest.url);\n }, 600000);\n }\n }\n };\n const stopSettingsReaction = reaction(\n () =>\n JSON.stringify(\n configuredCards().map(({ id, title, url, autoRefresh, selector }) => ({\n id,\n title,\n url,\n autoRefresh,\n selector,\n })),\n ),\n refreshTimers,\n );\n const trusted = (event: IpcMainInvokeEvent) =>\n event.senderFrame === event.sender.mainFrame &&\n dashboardUrl(event.senderFrame?.url ?? \"\") &&\n dashboardUrl(event.sender.getURL());\n ipcMain.handle(DASHBOARD_SITE_ICONS, async (event) => {\n if (\n event.senderFrame !== event.sender.mainFrame ||\n !rendererUrl(event.senderFrame?.url ?? \"\") ||\n !rendererUrl(event.sender.getURL()) ||\n !BrowserWindow.fromWebContents(event.sender)\n )\n return [];\n await ready;\n return configuredCards().flatMap((card) => {\n const icon = icons.get(card.id);\n return icon?.pageUrl === card.url ? [icon] : [];\n });\n });\n ipcMain.handle(syncChannel, async (event, payload: unknown) => {\n if (!trusted(event)) return;\n const window = BrowserWindow.fromWebContents(event.sender);\n if (!window || window.isDestroyed()) return;\n const requested =\n payload && typeof payload === \"object\" && \"cards\" in payload && Array.isArray(payload.cards) ? payload.cards : [];\n const cards = sanitizeDashboardCards(\n DashboardPreferencesStore.getInstanceOrCreate<DashboardPreferencesStore>().cards,\n );\n let owner = owners.get(event.sender);\n if (!owner) {\n const sender = event.sender;\n const navigation = (_event: unknown, url: string) => {\n if (!dashboardUrl(url)) hide(sender);\n };\n const destroyed = () => clear(sender);\n sender.on(\"did-navigate\", navigation);\n sender.on(\"did-navigate-in-page\", navigation);\n sender.on(\"destroyed\", destroyed);\n owner = {\n window,\n cards: new Map(),\n cleanup: () => {\n sender.removeListener(\"did-navigate\", navigation);\n sender.removeListener(\"did-navigate-in-page\", navigation);\n sender.removeListener(\"destroyed\", destroyed);\n },\n };\n owners.set(sender, owner);\n }\n if (payload && typeof payload === \"object\" && \"hidden\" in payload && payload.hidden === true) {\n hide(event.sender);\n return { failed: [], pinned: [...owner.cards].filter(([, card]) => card.floating).map(([id]) => id) };\n }\n const visible = new Set<string>();\n for (const item of requested.slice(0, cards.length)) {\n if (!item || typeof item !== \"object\" || typeof item.id !== \"string\" || visible.has(item.id)) continue;\n const configured = cards.find((card) => card.id === item.id);\n const bounds = rectangle(item.bounds);\n const clip = rectangle(item.clip);\n if (\n !configured ||\n !bounds ||\n !clip ||\n clip.x < bounds.x ||\n clip.y < bounds.y ||\n clip.x + clip.width > bounds.x + bounds.width ||\n clip.y + clip.height > bounds.y + bounds.height\n )\n continue;\n visible.add(item.id);\n let card = owner.cards.get(item.id);\n if (card?.floating) {\n card.visible = false;\n card.container.setVisible(false);\n continue;\n }\n if (!card) {\n const container = new View();\n container.setBackgroundColor(\"#00000000\");\n const view = new WebContentsView({\n webPreferences: {\n nodeIntegration: false,\n nodeIntegrationInSubFrames: false,\n contextIsolation: true,\n sandbox: true,\n webSecurity: true,\n partition: \"persist:freelens-power-websites\",\n },\n });\n view.setBackgroundColor(\"#00000000\");\n view.webContents.on(\"did-finish-load\", () => {\n if (!view.webContents.isDestroyed())\n void view.webContents.insertCSS(websiteStyles, { cssOrigin: \"user\" }).catch(() => {});\n });\n view.webContents.setWindowOpenHandler(({ url }) => {\n if (webUrl(url)) void shell.openExternal(url).catch(() => {});\n return { action: \"deny\" };\n });\n const navigation = (event: Electron.Event, url: string) => {\n if (!webUrl(url)) event.preventDefault();\n };\n view.webContents.on(\"will-navigate\", navigation);\n view.webContents.on(\"will-redirect\", navigation);\n view.webContents.on(\"will-frame-navigate\", (event) => {\n if (!webUrl(event.url)) event.preventDefault();\n });\n container.addChildView(view);\n window.contentView.addChildView(container);\n card = { container, view, url: \"\", failed: false, loading: false, visible: false, generation: 0 };\n owner.cards.set(item.id, card);\n const created = card;\n view.webContents.on(\"before-input-event\", (_event, input: Electron.Input) => {\n if (\n input.type !== \"keyDown\" ||\n input.key !== \"Escape\" ||\n owners.get(event.sender) !== owner ||\n owner.cards.get(item.id) !== created ||\n !trusted(event)\n )\n return;\n event.sender.send(\"freelens-power:dashboard-escape\");\n });\n created.selector = configured.selector;\n view.webContents.on(\"did-finish-load\", () => applySelector(created));\n view.webContents.on(\"page-favicon-updated\", (_event, favicons: string[]) => {\n const favicon = favicons.find((value) => {\n if (!webUrl(value)) return false;\n const parsed = new URL(value);\n return !parsed.username && !parsed.password;\n });\n if (!favicon || owners.get(event.sender) !== owner || owner.cards.get(item.id) !== created) return;\n created.faviconRequest?.abort();\n const request = new AbortController();\n created.faviconRequest = request;\n created.favicon = favicon;\n const publish = (url: string) => {\n if (\n request.signal.aborted ||\n owners.get(event.sender) !== owner ||\n owner.cards.get(item.id) !== created ||\n event.senderFrame !== event.sender.mainFrame\n )\n return;\n created.favicon = url;\n if (\n url.startsWith(\"data:\") &&\n configuredCards().some((card) => card.id === item.id && card.url === created.url)\n ) {\n icons.set(item.id, { id: item.id, pageUrl: created.url, dataUrl: url });\n persistIcons();\n if (rendererUrl(event.senderFrame?.url ?? \"\") && rendererUrl(event.sender.getURL()))\n event.sender.send(DASHBOARD_SITE_ICONS);\n }\n if (!trusted(event)) return;\n event.sender.send(\"freelens-power:dashboard-site-icon\", { id: item.id, url });\n };\n publish(favicon);\n const timeout = setTimeout(() => request.abort(), 5000);\n void (async () => {\n let current = favicon;\n for (let redirects = 0; redirects <= 5; redirects++) {\n const response = await websiteSession.fetch(current, {\n signal: request.signal,\n redirect: \"manual\",\n credentials: \"include\",\n });\n if (response.status >= 300 && response.status < 400) {\n await response.body?.cancel();\n const location = response.headers.get(\"location\");\n if (!location) return;\n const next = new URL(location, current);\n if (!webUrl(next.href) || next.username || next.password) return;\n current = next.href;\n continue;\n }\n const mime = response.headers.get(\"content-type\")?.split(\";\")[0].trim().toLowerCase();\n if (\n !response.ok ||\n !mime ||\n ![\n \"image/png\",\n \"image/jpeg\",\n \"image/gif\",\n \"image/webp\",\n \"image/x-icon\",\n \"image/vnd.microsoft.icon\",\n \"image/svg+xml\",\n ].includes(mime) ||\n Number(response.headers.get(\"content-length\")) > 524288\n ) {\n await response.body?.cancel();\n return;\n }\n const reader = response.body?.getReader();\n if (!reader) return;\n const chunks: Uint8Array[] = [];\n let size = 0;\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n size += value.length;\n if (size > 524288) {\n await reader.cancel();\n return;\n }\n chunks.push(value);\n }\n if (size) publish(`data:${mime};base64,${Buffer.concat(chunks).toString(\"base64\")}`);\n return;\n }\n })()\n .catch(() => {})\n .finally(() => clearTimeout(timeout));\n });\n }\n card.visible = true;\n card.container.setVisible(!card.loading && !card.failed && card.url === configured.url);\n const zoom = event.sender.getZoomFactor();\n card.container.setBorderRadius(Math.round(12 * zoom));\n card.view.setBorderRadius(Math.round(12 * zoom));\n const scale = (rect: Rectangle): Rectangle => ({\n x: Math.round(rect.x * zoom),\n y: Math.round(rect.y * zoom),\n width: Math.round(rect.width * zoom),\n height: Math.round(rect.height * zoom),\n });\n card.container.setBounds(scale(clip));\n card.view.setBounds(\n scale({ x: bounds.x - clip.x, y: bounds.y - clip.y, width: bounds.width, height: bounds.height }),\n );\n if (card.url !== configured.url) {\n card.favicon = undefined;\n card.faviconRequest?.abort();\n void reload(card, configured.url, true);\n }\n publishLoading(card);\n if (card.favicon) event.sender.send(\"freelens-power:dashboard-site-icon\", { id: item.id, url: card.favicon });\n }\n for (const [id, card] of owner.cards) {\n if (!cards.some((configured) => configured.id === id)) remove(owner, id);\n else if (!visible.has(id)) {\n card.visible = false;\n card.container.setVisible(false);\n }\n }\n refreshTimers();\n await Promise.all([...owner.cards.values()].map((card) => card.pending));\n return {\n failed: [...owner.cards.entries()].filter(([, card]) => card.failed).map(([id]) => id),\n pinned: [...owner.cards].filter(([, card]) => card.floating).map(([id]) => id),\n };\n });\n const publishPinned = (sender: WebContents, owner: Owner) => {\n if (!sender.isDestroyed())\n sender.send(\n DASHBOARD_VIEWS_PINNED,\n [...owner.cards].filter(([, card]) => card.floating).map(([id]) => id),\n );\n };\n ipcMain.handle(DASHBOARD_VIEWS_PIN, (event, payload: unknown) => {\n if (\n !trusted(event) ||\n !payload ||\n typeof payload !== \"object\" ||\n !(\"id\" in payload) ||\n typeof payload.id !== \"string\" ||\n !((\"pinned\" in payload && typeof payload.pinned === \"boolean\") || (\"focus\" in payload && payload.focus === true))\n )\n return;\n const id = payload.id;\n const owner = owners.get(event.sender);\n const card = owner?.cards.get(payload.id);\n const configured = configuredCards().find((item) => item.id === payload.id);\n if (\n !owner ||\n !card ||\n !configured ||\n card.url !== configured.url ||\n owner.window.isDestroyed() ||\n BrowserWindow.fromWebContents(event.sender) !== owner.window ||\n card.view.webContents.isDestroyed()\n )\n return;\n if (\"focus\" in payload && payload.focus === true) {\n card.floating?.show();\n card.floating?.focus();\n } else if (!(\"pinned\" in payload) || !payload.pinned) {\n card.floating?.close();\n } else if (!card.floating) {\n const floating = new BrowserWindow({\n title: configured.title,\n width: 800,\n height: 600,\n minWidth: 240,\n minHeight: 160,\n resizable: true,\n alwaysOnTop: true,\n autoHideMenuBar: true,\n show: false,\n webPreferences: {\n nodeIntegration: false,\n nodeIntegrationInSubFrames: false,\n contextIsolation: true,\n sandbox: true,\n webSecurity: true,\n partition: \"persist:freelens-power-websites\",\n },\n });\n floating.setMenu(null);\n floating.setAlwaysOnTop(true, \"floating\");\n floating.setVisibleOnAllWorkspaces(true, { visibleOnFullScreen: true });\n card.floating = floating;\n card.container.setVisible(false);\n const contents = floating.webContents;\n contents.setWindowOpenHandler(({ url }) => {\n if (webUrl(url)) void shell.openExternal(url).catch(() => {});\n return { action: \"deny\" };\n });\n const navigation = (event: Electron.Event, url: string) => {\n if (!webUrl(url)) event.preventDefault();\n };\n contents.on(\"will-navigate\", navigation);\n contents.on(\"will-redirect\", navigation);\n contents.on(\"will-frame-navigate\", (event) => {\n if (!webUrl(event.url)) event.preventDefault();\n });\n contents.on(\"page-title-updated\", (event) => event.preventDefault());\n contents.on(\"will-prevent-unload\", (event) => event.preventDefault());\n contents.on(\"did-finish-load\", () => {\n if (contents.isDestroyed()) return;\n void contents.insertCSS(websiteStyles, { cssOrigin: \"user\" }).catch(() => {});\n applySelector({ view: { webContents: contents }, selector: card.selector });\n });\n floating.on(\"closed\", () => {\n if (card.floating !== floating) return;\n card.floating = undefined;\n if (owner.cards.get(id) === card) publishPinned(event.sender, owner);\n });\n void contents.loadURL(configured.url).catch(() => {});\n floating.show();\n }\n publishPinned(event.sender, owner);\n return { pinned: [...owner.cards].filter(([, item]) => item.floating).map(([id]) => id) };\n });\n ipcMain.handle(clearChannel, (event) => {\n if (\n event.senderFrame === event.sender.mainFrame &&\n rendererUrl(event.senderFrame?.url ?? \"\") &&\n rendererUrl(event.sender.getURL())\n )\n hide(event.sender);\n });\n ipcMain.handle(reloadChannel, async (event, payload: unknown) => {\n if (\n !trusted(event) ||\n !payload ||\n typeof payload !== \"object\" ||\n !(\"id\" in payload) ||\n typeof payload.id !== \"string\"\n )\n return;\n const owner = owners.get(event.sender);\n const card = owner?.cards.get(payload.id);\n const configured = sanitizeDashboardCards(\n DashboardPreferencesStore.getInstanceOrCreate<DashboardPreferencesStore>().cards,\n ).find((item) => item.id === payload.id);\n if (!card || !configured || card.view.webContents.isDestroyed()) return;\n const floating = card.floating?.webContents;\n const current = floating?.getURL();\n const floatingReload =\n floating && !floating.isDestroyed()\n ? floating.loadURL(current && webUrl(current) ? current : configured.url).then(\n () => false,\n () => !floating.isDestroyed(),\n )\n : Promise.resolve(false);\n const [, floatingFailed] = await Promise.all([reload(card, configured.url), floatingReload]);\n return { failed: card.failed || floatingFailed ? [payload.id] : [] };\n });\n return () => {\n stopSettingsReaction();\n ipcMain.removeHandler(DASHBOARD_VIEWS_PIN);\n ipcMain.removeHandler(DASHBOARD_SITE_ICONS);\n ipcMain.removeHandler(syncChannel);\n ipcMain.removeHandler(clearChannel);\n ipcMain.removeHandler(reloadChannel);\n for (const sender of owners.keys()) clear(sender);\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"dashboard-views.js","names":[],"sources":["../../src/main/dashboard-views.ts"],"sourcesContent":["// SPDX-License-Identifier: Apache-2.0\nimport { join } from \"node:path\";\nimport {\n app,\n BrowserWindow,\n type IpcMainInvokeEvent,\n ipcMain,\n nativeTheme,\n type Rectangle,\n session,\n shell,\n View,\n type WebContents,\n WebContentsView,\n} from \"electron\";\nimport { reaction } from \"mobx\";\nimport { sanitizeDashboardCards } from \"../common/dashboard\";\nimport { dashboardReadinessScript } from \"../common/dashboard-readiness\";\nimport { dashboardSelectorScript } from \"../common/dashboard-selector\";\nimport {\n DASHBOARD_SITE_ICONS,\n DASHBOARD_VIEWS_LOADING,\n DASHBOARD_VIEWS_PIN,\n DASHBOARD_VIEWS_PINNED,\n type DashboardSiteIcon,\n} from \"../common/dashboard-views\";\nimport { DashboardPreferencesStore } from \"../common/store/dashboard-preferences-store\";\nimport { boundedDashboardIcons, loadDashboardIcons, saveDashboardIcons } from \"./dashboard-icon-cache\";\nimport { observeDashboardNetwork } from \"./dashboard-network\";\n\nconst syncChannel = \"freelens-power:dashboard-views:sync\";\nconst reloadChannel = \"freelens-power:dashboard-views:reload\";\nconst clearChannel = \"freelens-power:dashboard-views:clear\";\nconst dashboardPath = \"/extension/freelens-power/dashboard\";\nconst websiteStyles =\n \"* { scrollbar-width: none !important; } *::-webkit-scrollbar { display: none !important; width: 0 !important; height: 0 !important; }\";\n\nfunction rendererUrl(value: string, dashboardOnly = false): boolean {\n try {\n const url = new URL(value);\n return (\n url.protocol === \"https:\" &&\n (url.hostname === \"renderer.freelens.app\" || url.hostname.endsWith(\".renderer.freelens.app\")) &&\n (!dashboardOnly || url.pathname === dashboardPath)\n );\n } catch {\n return false;\n }\n}\nfunction dashboardUrl(value: string): boolean {\n return rendererUrl(value, true);\n}\nfunction webUrl(value: string): boolean {\n try {\n return [\"https:\", \"http:\"].includes(new URL(value).protocol);\n } catch {\n return false;\n }\n}\nfunction rectangle(value: unknown): Rectangle | undefined {\n if (!value || typeof value !== \"object\") return;\n const rect = value as Rectangle;\n if (\n ![rect.x, rect.y, rect.width, rect.height].every(\n (n) => Number.isFinite(n) && Number.isInteger(n) && Math.abs(n) <= 32768,\n ) ||\n rect.width <= 0 ||\n rect.height <= 0\n )\n return;\n return { x: rect.x, y: rect.y, width: rect.width, height: rect.height };\n}\n\ntype CardView = {\n container: View;\n view: WebContentsView;\n url: string;\n failed: boolean;\n loading: boolean;\n visible: boolean;\n generation: number;\n stopPreparation?: () => void;\n selector?: string;\n pending?: Promise<void>;\n favicon?: string;\n faviconRequest?: AbortController;\n refreshTimer?: ReturnType<typeof setInterval>;\n floating?: BrowserWindow;\n floatingPreparation?: { refresh: () => Promise<boolean>; selectorChanged: () => void; stop: () => void };\n};\ntype Owner = { window: BrowserWindow; cards: Map<string, CardView>; cleanup: () => void };\n\nasync function waitForReadiness(\n contents: WebContents,\n network: ReturnType<typeof observeDashboardNetwork>,\n selector: () => string | undefined,\n current: () => boolean,\n): Promise<void> {\n let deadline: ReturnType<typeof setTimeout> | undefined;\n try {\n await Promise.race([\n (async () => {\n if (!current()) return;\n await network.ready();\n if (!current()) return;\n await contents\n .executeJavaScriptInIsolatedWorld(1004, [{ code: dashboardSelectorScript(selector()) }])\n .catch(() => {});\n do {\n await network.wait();\n if (!current()) return;\n await contents.executeJavaScriptInIsolatedWorld(1004, [{ code: dashboardReadinessScript(selector()) }]);\n } while (current() && !network.quiet());\n })().catch(() => new Promise<void>((resolve) => setTimeout(resolve, 200))),\n new Promise<void>((resolve) => {\n deadline = setTimeout(resolve, 8500);\n }),\n ]);\n } finally {\n clearTimeout(deadline);\n }\n}\n\nexport function startDashboardViews(): () => void {\n const websiteSession = session.fromPartition(\"persist:freelens-power-websites\");\n websiteSession.setPermissionRequestHandler((_contents, _permission, callback) => callback(false));\n websiteSession.setPermissionCheckHandler(() => false);\n const owners = new Map<WebContents, Owner>();\n const icons = new Map<string, DashboardSiteIcon>();\n const remove = (owner: Owner, id: string) => {\n const card = owner.cards.get(id);\n if (!card) return;\n owner.cards.delete(id);\n card.stopPreparation?.();\n card.faviconRequest?.abort();\n clearInterval(card.refreshTimer);\n card.floatingPreparation?.stop();\n card.floating?.destroy();\n card.floating = undefined;\n if (!owner.window.isDestroyed()) owner.window.contentView.removeChildView(card.container);\n if (!card.view.webContents.isDestroyed()) card.view.webContents.close();\n };\n const clear = (sender: WebContents) => {\n const owner = owners.get(sender);\n if (!owner) return;\n owners.delete(sender);\n for (const id of owner.cards.keys()) remove(owner, id);\n owner.cleanup();\n };\n const hide = (sender: WebContents) => {\n for (const card of owners.get(sender)?.cards.values() ?? []) {\n card.visible = false;\n card.container.setVisible(false);\n }\n };\n const configuredCards = () =>\n sanitizeDashboardCards(DashboardPreferencesStore.getInstanceOrCreate<DashboardPreferencesStore>().cards);\n const cachePath = join(app.getPath(\"userData\"), \"freelens-power\", \"dashboard-icons.json\");\n const ready = loadDashboardIcons(cachePath).then((saved) => {\n const configured = configuredCards();\n for (const icon of saved) {\n if (!icons.has(icon.id) && configured.some((card) => card.id === icon.id && card.url === icon.pageUrl))\n icons.set(icon.id, icon);\n }\n });\n let writes = ready;\n const persistIcons = () => {\n writes = writes\n .then(async () => {\n const configured = configuredCards();\n const bounded = boundedDashboardIcons(\n [...icons.values()].filter((icon) =>\n configured.some((card) => card.id === icon.id && card.url === icon.pageUrl),\n ),\n );\n icons.clear();\n for (const icon of bounded) icons.set(icon.id, icon);\n await saveDashboardIcons(cachePath, bounded);\n })\n .catch(() => {});\n };\n persistIcons();\n const publishLoading = (card: CardView) => {\n for (const [sender, owner] of owners) {\n const id = [...owner.cards].find(([, candidate]) => candidate === card)?.[0];\n if (\n !id ||\n sender.isDestroyed() ||\n !dashboardUrl(sender.mainFrame.url) ||\n !dashboardUrl(sender.getURL()) ||\n !configuredCards().some((configured) => configured.id === id && configured.url === card.url)\n )\n continue;\n sender.send(DASHBOARD_VIEWS_LOADING, { id, url: card.url, loading: card.loading, failed: card.failed });\n }\n };\n const reload = (card: CardView, configuredUrl: string, initial = false) => {\n const current = card.view.webContents.getURL();\n const target = !initial && card.url === configuredUrl && webUrl(current) ? current : configuredUrl;\n card.faviconRequest?.abort();\n card.url = configuredUrl;\n card.failed = false;\n card.loading = true;\n card.stopPreparation?.();\n const contents = card.view.webContents;\n const backgroundThrottling = contents.getBackgroundThrottling();\n if (backgroundThrottling) contents.setBackgroundThrottling(false);\n const network = observeDashboardNetwork(card.view.webContents);\n let stopped = false;\n const stopPreparation = () => {\n if (stopped) return;\n stopped = true;\n network.dispose();\n contents.removeListener(\"destroyed\", stopPreparation);\n if (!contents.isDestroyed() && backgroundThrottling && !contents.getBackgroundThrottling())\n contents.setBackgroundThrottling(backgroundThrottling);\n if (card.stopPreparation === stopPreparation) card.stopPreparation = undefined;\n };\n card.stopPreparation = stopPreparation;\n contents.once(\"destroyed\", stopPreparation);\n const generation = ++card.generation;\n card.container.setVisible(false);\n publishLoading(card);\n const settled = (failed: boolean) => {\n if (card.generation !== generation || card.view.webContents.isDestroyed()) return;\n card.failed = failed;\n card.loading = false;\n for (const [sender, owner] of owners) {\n if (![...owner.cards.values()].includes(card)) continue;\n card.container.setVisible(card.visible && !card.floating && !failed && dashboardUrl(sender.getURL()));\n }\n publishLoading(card);\n };\n const load = () => {\n if (\n card.generation !== generation ||\n card.view.webContents.isDestroyed() ||\n ![...owners.values()].some((owner) => [...owner.cards.values()].includes(card))\n )\n return Promise.resolve();\n return card.view.webContents.loadURL(target);\n };\n card.pending = load().then(\n async () => {\n let preparing = true;\n const current = () =>\n preparing &&\n card.generation === generation &&\n !card.view.webContents.isDestroyed() &&\n [...owners.values()].some((owner) => [...owner.cards.values()].includes(card));\n try {\n await waitForReadiness(contents, network, () => card.selector, current);\n } finally {\n preparing = false;\n stopPreparation();\n }\n settled(false);\n },\n () => {\n stopPreparation();\n settled(true);\n },\n );\n return card.pending;\n };\n const applySelector = (card: { view: { webContents: WebContents }; selector?: string }) => {\n if (card.view.webContents.isDestroyed()) return Promise.resolve();\n return card.view.webContents\n .executeJavaScriptInIsolatedWorld(1004, [{ code: dashboardSelectorScript(card.selector) }])\n .catch(() => {});\n };\n const refreshTimers = () => {\n const configured = configuredCards();\n for (const [id, icon] of icons) {\n if (!configured.some((card) => card.id === id && card.url === icon.pageUrl)) {\n icons.delete(id);\n persistIcons();\n }\n }\n for (const [sender, owner] of owners) {\n for (const [id, card] of owner.cards) {\n const setting = configured.find((item) => item.id === id);\n if (!setting || setting.url !== card.url) {\n remove(owner, id);\n continue;\n }\n if (card.selector !== setting.selector) {\n card.selector = setting.selector;\n applySelector(card);\n card.floatingPreparation?.selectorChanged();\n }\n if (card.floating && !card.floating.isDestroyed()) card.floating.setTitle(setting.title);\n if (!setting.autoRefresh) {\n clearInterval(card.refreshTimer);\n card.refreshTimer = undefined;\n continue;\n }\n if (card.refreshTimer) continue;\n card.refreshTimer = setInterval(() => {\n const latest = configuredCards().find((item) => item.id === id);\n if (\n owners.get(sender) !== owner ||\n card.floating ||\n dashboardUrl(sender.getURL()) ||\n owner.cards.get(id) !== card ||\n !latest?.autoRefresh ||\n latest.url !== card.url ||\n card.view.webContents.isDestroyed() ||\n card.view.webContents.isLoading()\n )\n return;\n void reload(card, latest.url);\n }, 600000);\n }\n }\n };\n const stopSettingsReaction = reaction(\n () =>\n JSON.stringify(\n configuredCards().map(({ id, title, url, autoRefresh, selector }) => ({\n id,\n title,\n url,\n autoRefresh,\n selector,\n })),\n ),\n refreshTimers,\n );\n const trusted = (event: IpcMainInvokeEvent) =>\n event.senderFrame === event.sender.mainFrame &&\n dashboardUrl(event.senderFrame?.url ?? \"\") &&\n dashboardUrl(event.sender.getURL());\n ipcMain.handle(DASHBOARD_SITE_ICONS, async (event) => {\n if (\n event.senderFrame !== event.sender.mainFrame ||\n !rendererUrl(event.senderFrame?.url ?? \"\") ||\n !rendererUrl(event.sender.getURL()) ||\n !BrowserWindow.fromWebContents(event.sender)\n )\n return [];\n await ready;\n return configuredCards().flatMap((card) => {\n const icon = icons.get(card.id);\n return icon?.pageUrl === card.url ? [icon] : [];\n });\n });\n ipcMain.handle(syncChannel, async (event, payload: unknown) => {\n if (!trusted(event)) return;\n const window = BrowserWindow.fromWebContents(event.sender);\n if (!window || window.isDestroyed()) return;\n const requested =\n payload && typeof payload === \"object\" && \"cards\" in payload && Array.isArray(payload.cards) ? payload.cards : [];\n const cards = sanitizeDashboardCards(\n DashboardPreferencesStore.getInstanceOrCreate<DashboardPreferencesStore>().cards,\n );\n let owner = owners.get(event.sender);\n if (!owner) {\n const sender = event.sender;\n const navigation = (_event: unknown, url: string) => {\n if (!dashboardUrl(url)) hide(sender);\n };\n const destroyed = () => clear(sender);\n sender.on(\"did-navigate\", navigation);\n sender.on(\"did-navigate-in-page\", navigation);\n sender.on(\"destroyed\", destroyed);\n owner = {\n window,\n cards: new Map(),\n cleanup: () => {\n sender.removeListener(\"did-navigate\", navigation);\n sender.removeListener(\"did-navigate-in-page\", navigation);\n sender.removeListener(\"destroyed\", destroyed);\n },\n };\n owners.set(sender, owner);\n }\n if (payload && typeof payload === \"object\" && \"hidden\" in payload && payload.hidden === true) {\n hide(event.sender);\n return { failed: [], pinned: [...owner.cards].filter(([, card]) => card.floating).map(([id]) => id) };\n }\n const visible = new Set<string>();\n for (const item of requested.slice(0, cards.length)) {\n if (!item || typeof item !== \"object\" || typeof item.id !== \"string\" || visible.has(item.id)) continue;\n const configured = cards.find((card) => card.id === item.id);\n const bounds = rectangle(item.bounds);\n const clip = rectangle(item.clip);\n if (\n !configured ||\n !bounds ||\n !clip ||\n clip.x < bounds.x ||\n clip.y < bounds.y ||\n clip.x + clip.width > bounds.x + bounds.width ||\n clip.y + clip.height > bounds.y + bounds.height\n )\n continue;\n visible.add(item.id);\n let card = owner.cards.get(item.id);\n if (card?.floating) {\n card.visible = false;\n card.container.setVisible(false);\n continue;\n }\n if (!card) {\n const container = new View();\n container.setBackgroundColor(\"#00000000\");\n const view = new WebContentsView({\n webPreferences: {\n nodeIntegration: false,\n nodeIntegrationInSubFrames: false,\n contextIsolation: true,\n sandbox: true,\n webSecurity: true,\n partition: \"persist:freelens-power-websites\",\n },\n });\n view.setBackgroundColor(\"#00000000\");\n view.webContents.on(\"did-finish-load\", () => {\n if (!view.webContents.isDestroyed())\n void view.webContents.insertCSS(websiteStyles, { cssOrigin: \"user\" }).catch(() => {});\n });\n view.webContents.setWindowOpenHandler(({ url }) => {\n if (webUrl(url)) void shell.openExternal(url).catch(() => {});\n return { action: \"deny\" };\n });\n const navigation = (event: Electron.Event, url: string) => {\n if (!webUrl(url)) event.preventDefault();\n };\n view.webContents.on(\"will-navigate\", navigation);\n view.webContents.on(\"will-redirect\", navigation);\n view.webContents.on(\"will-frame-navigate\", (event) => {\n if (!webUrl(event.url)) event.preventDefault();\n });\n container.addChildView(view);\n window.contentView.addChildView(container);\n card = { container, view, url: \"\", failed: false, loading: false, visible: false, generation: 0 };\n owner.cards.set(item.id, card);\n const created = card;\n view.webContents.on(\"before-input-event\", (_event, input: Electron.Input) => {\n if (\n input.type !== \"keyDown\" ||\n input.key !== \"Escape\" ||\n owners.get(event.sender) !== owner ||\n owner.cards.get(item.id) !== created ||\n !trusted(event)\n )\n return;\n event.sender.send(\"freelens-power:dashboard-escape\");\n });\n created.selector = configured.selector;\n view.webContents.on(\"did-finish-load\", () => applySelector(created));\n view.webContents.on(\"page-favicon-updated\", (_event, favicons: string[]) => {\n const favicon = favicons.find((value) => {\n if (!webUrl(value)) return false;\n const parsed = new URL(value);\n return !parsed.username && !parsed.password;\n });\n if (!favicon || owners.get(event.sender) !== owner || owner.cards.get(item.id) !== created) return;\n created.faviconRequest?.abort();\n const request = new AbortController();\n created.faviconRequest = request;\n created.favicon = favicon;\n const publish = (url: string) => {\n if (\n request.signal.aborted ||\n owners.get(event.sender) !== owner ||\n owner.cards.get(item.id) !== created ||\n event.senderFrame !== event.sender.mainFrame\n )\n return;\n created.favicon = url;\n if (\n url.startsWith(\"data:\") &&\n configuredCards().some((card) => card.id === item.id && card.url === created.url)\n ) {\n icons.set(item.id, { id: item.id, pageUrl: created.url, dataUrl: url });\n persistIcons();\n if (rendererUrl(event.senderFrame?.url ?? \"\") && rendererUrl(event.sender.getURL()))\n event.sender.send(DASHBOARD_SITE_ICONS);\n }\n if (!trusted(event)) return;\n event.sender.send(\"freelens-power:dashboard-site-icon\", { id: item.id, url });\n };\n publish(favicon);\n const timeout = setTimeout(() => request.abort(), 5000);\n void (async () => {\n let current = favicon;\n for (let redirects = 0; redirects <= 5; redirects++) {\n const response = await websiteSession.fetch(current, {\n signal: request.signal,\n redirect: \"manual\",\n credentials: \"include\",\n });\n if (response.status >= 300 && response.status < 400) {\n await response.body?.cancel();\n const location = response.headers.get(\"location\");\n if (!location) return;\n const next = new URL(location, current);\n if (!webUrl(next.href) || next.username || next.password) return;\n current = next.href;\n continue;\n }\n const mime = response.headers.get(\"content-type\")?.split(\";\")[0].trim().toLowerCase();\n if (\n !response.ok ||\n !mime ||\n ![\n \"image/png\",\n \"image/jpeg\",\n \"image/gif\",\n \"image/webp\",\n \"image/x-icon\",\n \"image/vnd.microsoft.icon\",\n \"image/svg+xml\",\n ].includes(mime) ||\n Number(response.headers.get(\"content-length\")) > 524288\n ) {\n await response.body?.cancel();\n return;\n }\n const reader = response.body?.getReader();\n if (!reader) return;\n const chunks: Uint8Array[] = [];\n let size = 0;\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n size += value.length;\n if (size > 524288) {\n await reader.cancel();\n return;\n }\n chunks.push(value);\n }\n if (size) publish(`data:${mime};base64,${Buffer.concat(chunks).toString(\"base64\")}`);\n return;\n }\n })()\n .catch(() => {})\n .finally(() => clearTimeout(timeout));\n });\n }\n card.visible = true;\n card.container.setVisible(!card.loading && !card.failed && card.url === configured.url);\n const zoom = event.sender.getZoomFactor();\n card.container.setBorderRadius(Math.round(12 * zoom));\n card.view.setBorderRadius(Math.round(12 * zoom));\n const scale = (rect: Rectangle): Rectangle => ({\n x: Math.round(rect.x * zoom),\n y: Math.round(rect.y * zoom),\n width: Math.round(rect.width * zoom),\n height: Math.round(rect.height * zoom),\n });\n card.container.setBounds(scale(clip));\n card.view.setBounds(\n scale({ x: bounds.x - clip.x, y: bounds.y - clip.y, width: bounds.width, height: bounds.height }),\n );\n if (card.url !== configured.url) {\n card.favicon = undefined;\n card.faviconRequest?.abort();\n void reload(card, configured.url, true);\n }\n publishLoading(card);\n if (card.favicon) event.sender.send(\"freelens-power:dashboard-site-icon\", { id: item.id, url: card.favicon });\n }\n for (const [id, card] of owner.cards) {\n if (!cards.some((configured) => configured.id === id)) remove(owner, id);\n else if (!visible.has(id)) {\n card.visible = false;\n card.container.setVisible(false);\n }\n }\n refreshTimers();\n await Promise.all([...owner.cards.values()].map((card) => card.pending));\n return {\n failed: [...owner.cards.entries()].filter(([, card]) => card.failed).map(([id]) => id),\n pinned: [...owner.cards].filter(([, card]) => card.floating).map(([id]) => id),\n };\n });\n const publishPinned = (sender: WebContents, owner: Owner) => {\n if (!sender.isDestroyed())\n sender.send(\n DASHBOARD_VIEWS_PINNED,\n [...owner.cards].filter(([, card]) => card.floating).map(([id]) => id),\n );\n };\n ipcMain.handle(DASHBOARD_VIEWS_PIN, (event, payload: unknown) => {\n if (\n !trusted(event) ||\n !payload ||\n typeof payload !== \"object\" ||\n !(\"id\" in payload) ||\n typeof payload.id !== \"string\" ||\n !((\"pinned\" in payload && typeof payload.pinned === \"boolean\") || (\"focus\" in payload && payload.focus === true))\n )\n return;\n const id = payload.id;\n const owner = owners.get(event.sender);\n const card = owner?.cards.get(payload.id);\n const configured = configuredCards().find((item) => item.id === payload.id);\n if (\n !owner ||\n !card ||\n !configured ||\n card.url !== configured.url ||\n owner.window.isDestroyed() ||\n BrowserWindow.fromWebContents(event.sender) !== owner.window ||\n card.view.webContents.isDestroyed()\n )\n return;\n if (\"focus\" in payload && payload.focus === true) {\n card.floating?.show();\n card.floating?.focus();\n } else if (!(\"pinned\" in payload) || !payload.pinned) {\n card.floating?.close();\n } else if (!card.floating) {\n const floating = new BrowserWindow({\n title: configured.title,\n width: 800,\n height: 600,\n minWidth: 240,\n minHeight: 160,\n resizable: true,\n alwaysOnTop: true,\n autoHideMenuBar: true,\n show: false,\n webPreferences: {\n nodeIntegration: false,\n nodeIntegrationInSubFrames: false,\n contextIsolation: true,\n sandbox: true,\n webSecurity: true,\n partition: \"persist:freelens-power-websites\",\n },\n });\n floating.setMenu(null);\n floating.setAlwaysOnTop(true, \"floating\");\n floating.setVisibleOnAllWorkspaces(true, { visibleOnFullScreen: true });\n card.floating = floating;\n card.container.setVisible(false);\n const contents = floating.webContents;\n contents.setWindowOpenHandler(({ url }) => {\n if (webUrl(url)) void shell.openExternal(url).catch(() => {});\n return { action: \"deny\" };\n });\n const navigation = (event: Electron.Event, url: string) => {\n if (!webUrl(url)) event.preventDefault();\n };\n contents.on(\"will-navigate\", navigation);\n contents.on(\"will-redirect\", navigation);\n contents.on(\"will-frame-navigate\", (event) => {\n if (!webUrl(event.url)) event.preventDefault();\n });\n contents.on(\"page-title-updated\", (event) => event.preventDefault());\n contents.on(\"will-prevent-unload\", (event) => event.preventDefault());\n const skeleton = new View();\n skeleton.setBackgroundColor(nativeTheme.shouldUseDarkColors ? \"#202124\" : \"#ffffff\");\n const bars = Array.from({ length: 4 }, () => {\n const bar = new View();\n bar.setBackgroundColor(nativeTheme.shouldUseDarkColors ? \"#393b40\" : \"#e8e9eb\");\n bar.setBorderRadius(6);\n skeleton.addChildView(bar);\n return bar;\n });\n const layoutSkeleton = () => {\n const { width, height } = floating.getContentBounds();\n skeleton.setBounds({ x: 0, y: 0, width, height });\n bars.forEach((bar, index) => {\n bar.setBounds({\n x: 20,\n y: index === 0 ? 20 : 60 + (index - 1) * 24,\n width: Math.max(1, Math.round((width - 40) * (index === 0 ? 0.45 : 1))),\n height: index === 0 ? 20 : index === 3 ? Math.max(30, height - 128) : 12,\n });\n });\n };\n floating.contentView.addChildView(skeleton);\n floating.on(\"resize\", layoutSkeleton);\n layoutSkeleton();\n let generation = 0;\n let stopPreparation = () => {};\n let finishLoad: (() => Promise<boolean>) | undefined;\n const begin = () => {\n stopPreparation();\n const token = ++generation;\n const backgroundThrottling = contents.getBackgroundThrottling();\n if (backgroundThrottling) contents.setBackgroundThrottling(false);\n const network = observeDashboardNetwork(contents);\n let active = true;\n let finishing: Promise<boolean> | undefined;\n const current = () => active && generation === token && card.floating === floating && !contents.isDestroyed();\n skeleton.setVisible(true);\n stopPreparation = () => {\n if (!active) return;\n active = false;\n network.dispose();\n if (!contents.isDestroyed() && backgroundThrottling) contents.setBackgroundThrottling(true);\n };\n const stop = stopPreparation;\n const finish = () => {\n finishing ??= (async () => {\n await waitForReadiness(contents, network, () => card.selector, current);\n if (!current()) return false;\n skeleton.setVisible(false);\n stop();\n return false;\n })();\n return finishing;\n };\n finishLoad = finish;\n return {\n finish,\n fail: () => {\n if (current()) {\n skeleton.setVisible(false);\n stop();\n }\n },\n };\n };\n const refresh = () => {\n const preparation = begin();\n const current = contents.getURL();\n return contents.loadURL(webUrl(current) ? current : configured.url).then(\n () => finishLoad?.() ?? false,\n () => {\n preparation.fail();\n return !contents.isDestroyed();\n },\n );\n };\n card.floatingPreparation = {\n refresh,\n selectorChanged: () => {\n const preparation = begin();\n if (!contents.isLoading()) void preparation.finish();\n },\n stop: () => {\n ++generation;\n stopPreparation();\n },\n };\n contents.on(\"did-start-navigation\", (_event, _url, inPlace, mainFrame) => {\n if (!mainFrame) return;\n const preparation = begin();\n if (inPlace) void preparation.finish();\n });\n contents.on(\"did-finish-load\", () => {\n if (contents.isDestroyed()) return;\n void contents.insertCSS(websiteStyles, { cssOrigin: \"user\" }).catch(() => {});\n void finishLoad?.();\n });\n contents.on(\"did-fail-load\", (_event, code, _description, _url, mainFrame) => {\n if (!mainFrame || code === -3) return;\n stopPreparation();\n skeleton.setVisible(false);\n });\n contents.once(\"destroyed\", () => {\n ++generation;\n stopPreparation();\n });\n floating.on(\"closed\", () => {\n if (card.floating !== floating) return;\n card.floatingPreparation?.stop();\n card.floatingPreparation = undefined;\n card.floating = undefined;\n if (owner.cards.get(id) === card) publishPinned(event.sender, owner);\n });\n const initial = begin();\n void contents.loadURL(configured.url).then(() => finishLoad?.(), initial.fail);\n floating.show();\n }\n publishPinned(event.sender, owner);\n return { pinned: [...owner.cards].filter(([, item]) => item.floating).map(([id]) => id) };\n });\n ipcMain.handle(clearChannel, (event) => {\n if (\n event.senderFrame === event.sender.mainFrame &&\n rendererUrl(event.senderFrame?.url ?? \"\") &&\n rendererUrl(event.sender.getURL())\n )\n hide(event.sender);\n });\n ipcMain.handle(reloadChannel, async (event, payload: unknown) => {\n if (\n !trusted(event) ||\n !payload ||\n typeof payload !== \"object\" ||\n !(\"id\" in payload) ||\n typeof payload.id !== \"string\"\n )\n return;\n const owner = owners.get(event.sender);\n const card = owner?.cards.get(payload.id);\n const configured = sanitizeDashboardCards(\n DashboardPreferencesStore.getInstanceOrCreate<DashboardPreferencesStore>().cards,\n ).find((item) => item.id === payload.id);\n if (!card || !configured || card.view.webContents.isDestroyed()) return;\n const [, floatingFailed] = await Promise.all([\n reload(card, configured.url),\n card.floatingPreparation?.refresh() ?? Promise.resolve(false),\n ]);\n return { failed: card.failed || floatingFailed ? [payload.id] : [] };\n });\n return () => {\n stopSettingsReaction();\n ipcMain.removeHandler(DASHBOARD_VIEWS_PIN);\n ipcMain.removeHandler(DASHBOARD_SITE_ICONS);\n ipcMain.removeHandler(syncChannel);\n ipcMain.removeHandler(clearChannel);\n ipcMain.removeHandler(reloadChannel);\n for (const sender of owners.keys()) clear(sender);\n };\n}\n"],"mappings":"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"}
@@ -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,10 +16,14 @@ 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");
26
+ const require_monitoring_history = require("./monitoring-history.js");
22
27
  const require_settings_export = require("./settings-export.js");
23
28
  //#region src/main/index.ts
24
29
  var FreelensPowerMain = class extends require_extensions.Main.LensExtension {
@@ -42,18 +47,23 @@ var FreelensPowerMain = class extends require_extensions.Main.LensExtension {
42
47
  require_monitoring_preferences_store.MonitoringPreferencesStore.getInstanceOrCreate().loadExtension(this);
43
48
  require_appearance_preferences_store.AppearancePreferencesStore.getInstanceOrCreate().loadExtension(this);
44
49
  require_dashboard_preferences_store.DashboardPreferencesStore.getInstanceOrCreate().loadExtension(this);
50
+ require_cluster_icons_store.ClusterIconsStore.getInstanceOrCreate().loadExtension(this);
45
51
  this.stopFeatures?.();
46
52
  const stopExport = require_settings_export.startSettingsExport();
47
53
  let disposers = [];
48
54
  const stop = require__global_external_mobx.reaction(() => power.enabled, (enabled) => {
49
55
  for (const dispose of disposers) dispose();
50
56
  disposers = enabled ? [
57
+ require_monitoring_history.startMonitoringHistory(this),
58
+ require_diagnostics_menu_order.startDiagnosticsMenuOrder(),
51
59
  require_ai_ipc.startAiIpc(),
52
60
  require_ai_models.startAiModels(),
53
61
  require_dock_icon.startDockIconOverride(),
54
62
  require_dashboard_views.startDashboardViews(),
55
63
  require_dashboard_picker.startDashboardPicker(),
56
- require_dashboard_catalog.registerDashboardCatalog(this)
64
+ require_dashboard_catalog.registerDashboardCatalog(this),
65
+ require_cluster_icons_catalog.registerClusterIconsCatalog(this),
66
+ require_cluster_icons.startClusterIcons()
57
67
  ] : [];
58
68
  }, { fireImmediately: true });
59
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 { 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 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":";;;;;;;;;;;;;;;;;;;;;;;AAmBA,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,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"}