@64mb/freelens-power 1.1.0 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (214) hide show
  1. package/README.md +5 -4
  2. package/THIRD_PARTY_LICENSES +1707 -0
  3. package/out/main/ai.js +63 -23
  4. package/out/main/ai.js.map +1 -1
  5. package/out/main/cluster-icons-catalog.js +28 -0
  6. package/out/main/cluster-icons-catalog.js.map +1 -0
  7. package/out/main/cluster-icons.js +125 -0
  8. package/out/main/cluster-icons.js.map +1 -0
  9. package/out/main/common/ai-terminal-context.js +51 -0
  10. package/out/main/common/ai-terminal-context.js.map +1 -0
  11. package/out/main/common/ai.js.map +1 -1
  12. package/out/main/common/cluster-icon-ipc.js +6 -0
  13. package/out/main/common/cluster-icon-ipc.js.map +1 -0
  14. package/out/main/common/cluster-icons.js +121 -0
  15. package/out/main/common/cluster-icons.js.map +1 -0
  16. package/out/main/common/dashboard.js +2 -1
  17. package/out/main/common/dashboard.js.map +1 -1
  18. package/out/main/common/settings-export.js +4 -2
  19. package/out/main/common/settings-export.js.map +1 -1
  20. package/out/main/common/store/cluster-icons-store.js +32 -0
  21. package/out/main/common/store/cluster-icons-store.js.map +1 -0
  22. package/out/main/common/store/dashboard-preferences-store.js +2 -1
  23. package/out/main/common/store/dashboard-preferences-store.js.map +1 -1
  24. package/out/main/common/store/monitoring-preferences-store.js +5 -0
  25. package/out/main/common/store/monitoring-preferences-store.js.map +1 -1
  26. package/out/main/dashboard-views.js +20 -10
  27. package/out/main/dashboard-views.js.map +1 -1
  28. package/out/main/diagnostics-menu-order.js +57 -0
  29. package/out/main/diagnostics-menu-order.js.map +1 -0
  30. package/out/main/index.js +9 -1
  31. package/out/main/index.js.map +1 -1
  32. package/out/main/monitoring-history.js +13 -3
  33. package/out/main/monitoring-history.js.map +1 -1
  34. package/out/renderer/_virtual/_global-external_react-dom.js +2 -1
  35. package/out/renderer/_virtual/_global-external_react.js +10 -5
  36. package/out/renderer/_virtual/_rolldown/runtime.js +22 -0
  37. package/out/renderer/ai-terminal-context.js +200 -0
  38. package/out/renderer/ai-terminal-context.js.map +1 -0
  39. package/out/renderer/ai.js +90 -9
  40. package/out/renderer/ai.js.map +1 -1
  41. package/out/renderer/appearance.js +1 -0
  42. package/out/renderer/appearance.js.map +1 -1
  43. package/out/renderer/cluster-icon-colors.js +188 -0
  44. package/out/renderer/cluster-icon-colors.js.map +1 -0
  45. package/out/renderer/cluster-icons.js +304 -0
  46. package/out/renderer/cluster-icons.js.map +1 -0
  47. package/out/renderer/dashboard.js +51 -14
  48. package/out/renderer/dashboard.js.map +1 -1
  49. package/out/renderer/details/secret-certificate-details.js +9 -2
  50. package/out/renderer/details/secret-certificate-details.js.map +1 -1
  51. package/out/renderer/diagnostics.css.js +39 -0
  52. package/out/renderer/diagnostics.css.js.map +1 -0
  53. package/out/renderer/diagnostics.js +796 -343
  54. package/out/renderer/diagnostics.js.map +1 -1
  55. package/out/renderer/index.js +9 -4
  56. package/out/renderer/index.js.map +1 -1
  57. package/out/renderer/monitoring-details-chart.js +42 -0
  58. package/out/renderer/monitoring-details-chart.js.map +1 -0
  59. package/out/renderer/monitoring-history-collection.js +2 -18
  60. package/out/renderer/monitoring-history-collection.js.map +1 -1
  61. package/out/renderer/monitoring-history-view.js +111 -34
  62. package/out/renderer/monitoring-history-view.js.map +1 -1
  63. package/out/renderer/monitoring.js +68 -27
  64. package/out/renderer/monitoring.js.map +1 -1
  65. package/out/renderer/node-monitoring.js +23 -12
  66. package/out/renderer/node-monitoring.js.map +1 -1
  67. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js +10 -0
  68. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js.map +1 -0
  69. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js +8 -0
  70. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js.map +1 -0
  71. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js +9 -0
  72. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js.map +1 -0
  73. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js +9 -0
  74. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js.map +1 -0
  75. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/classCallCheck.js +8 -0
  76. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/classCallCheck.js.map +1 -0
  77. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/createClass.js +15 -0
  78. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/createClass.js.map +1 -0
  79. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/createSuper.js +19 -0
  80. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/createSuper.js.map +1 -0
  81. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/defineProperty.js +14 -0
  82. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/defineProperty.js.map +1 -0
  83. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/extends.js +19 -0
  84. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/extends.js.map +1 -0
  85. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js +15 -0
  86. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js.map +1 -0
  87. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/inherits.js +14 -0
  88. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/inherits.js.map +1 -0
  89. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/isNativeReflectConstruct.js +18 -0
  90. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/isNativeReflectConstruct.js.map +1 -0
  91. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/iterableToArray.js +8 -0
  92. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/iterableToArray.js.map +1 -0
  93. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js +26 -0
  94. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js.map +1 -0
  95. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/nonIterableRest.js +8 -0
  96. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/nonIterableRest.js.map +1 -0
  97. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js +8 -0
  98. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js.map +1 -0
  99. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/objectSpread2.js +27 -0
  100. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/objectSpread2.js.map +1 -0
  101. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js +15 -0
  102. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js.map +1 -0
  103. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js +14 -0
  104. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js.map +1 -0
  105. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js +12 -0
  106. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js.map +1 -0
  107. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js +15 -0
  108. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js.map +1 -0
  109. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/slicedToArray.js +12 -0
  110. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/slicedToArray.js.map +1 -0
  111. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/taggedTemplateLiteral.js +8 -0
  112. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/taggedTemplateLiteral.js.map +1 -0
  113. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/toConsumableArray.js +12 -0
  114. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/toConsumableArray.js.map +1 -0
  115. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/toPrimitive.js +16 -0
  116. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/toPrimitive.js.map +1 -0
  117. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/toPropertyKey.js +11 -0
  118. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/toPropertyKey.js.map +1 -0
  119. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/typeof.js +18 -0
  120. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/typeof.js.map +1 -0
  121. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js +13 -0
  122. package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js.map +1 -0
  123. package/out/renderer/node_modules/.pnpm/@emotion_cache@11.14.0/node_modules/@emotion/cache/dist/emotion-cache.browser.esm.js +237 -0
  124. package/out/renderer/node_modules/.pnpm/@emotion_cache@11.14.0/node_modules/@emotion/cache/dist/emotion-cache.browser.esm.js.map +1 -0
  125. package/out/renderer/node_modules/.pnpm/@emotion_hash@0.9.2/node_modules/@emotion/hash/dist/emotion-hash.esm.js +25 -0
  126. package/out/renderer/node_modules/.pnpm/@emotion_hash@0.9.2/node_modules/@emotion/hash/dist/emotion-hash.esm.js.map +1 -0
  127. package/out/renderer/node_modules/.pnpm/@emotion_memoize@0.9.0/node_modules/@emotion/memoize/dist/emotion-memoize.esm.js +12 -0
  128. package/out/renderer/node_modules/.pnpm/@emotion_memoize@0.9.0/node_modules/@emotion/memoize/dist/emotion-memoize.esm.js.map +1 -0
  129. package/out/renderer/node_modules/.pnpm/@emotion_react@11.14.0_@types_react@17.0.93_react@17.0.2/node_modules/@emotion/react/dist/emotion-element-f0de968e.browser.esm.js +58 -0
  130. package/out/renderer/node_modules/.pnpm/@emotion_react@11.14.0_@types_react@17.0.93_react@17.0.2/node_modules/@emotion/react/dist/emotion-element-f0de968e.browser.esm.js.map +1 -0
  131. package/out/renderer/node_modules/.pnpm/@emotion_react@11.14.0_@types_react@17.0.93_react@17.0.2/node_modules/@emotion/react/dist/emotion-react.browser.esm.js +54 -0
  132. package/out/renderer/node_modules/.pnpm/@emotion_react@11.14.0_@types_react@17.0.93_react@17.0.2/node_modules/@emotion/react/dist/emotion-react.browser.esm.js.map +1 -0
  133. package/out/renderer/node_modules/.pnpm/@emotion_serialize@1.3.3/node_modules/@emotion/serialize/dist/emotion-serialize.esm.js +133 -0
  134. package/out/renderer/node_modules/.pnpm/@emotion_serialize@1.3.3/node_modules/@emotion/serialize/dist/emotion-serialize.esm.js.map +1 -0
  135. package/out/renderer/node_modules/.pnpm/@emotion_sheet@1.4.0/node_modules/@emotion/sheet/dist/emotion-sheet.esm.js +65 -0
  136. package/out/renderer/node_modules/.pnpm/@emotion_sheet@1.4.0/node_modules/@emotion/sheet/dist/emotion-sheet.esm.js.map +1 -0
  137. package/out/renderer/node_modules/.pnpm/@emotion_unitless@0.10.0/node_modules/@emotion/unitless/dist/emotion-unitless.esm.js +54 -0
  138. package/out/renderer/node_modules/.pnpm/@emotion_unitless@0.10.0/node_modules/@emotion/unitless/dist/emotion-unitless.esm.js.map +1 -0
  139. package/out/renderer/node_modules/.pnpm/@emotion_use-insertion-effect-with-fallbacks@1.2.0_react@17.0.2/node_modules/@emotion/use-insertion-effect-with-fallbacks/dist/emotion-use-insertion-effect-with-fallbacks.browser.esm.js +12 -0
  140. package/out/renderer/node_modules/.pnpm/@emotion_use-insertion-effect-with-fallbacks@1.2.0_react@17.0.2/node_modules/@emotion/use-insertion-effect-with-fallbacks/dist/emotion-use-insertion-effect-with-fallbacks.browser.esm.js.map +1 -0
  141. package/out/renderer/node_modules/.pnpm/@emotion_utils@1.4.2/node_modules/@emotion/utils/dist/emotion-utils.browser.esm.js +30 -0
  142. package/out/renderer/node_modules/.pnpm/@emotion_utils@1.4.2/node_modules/@emotion/utils/dist/emotion-utils.browser.esm.js.map +1 -0
  143. package/out/renderer/node_modules/.pnpm/@floating-ui_dom@1.7.2/node_modules/@floating-ui/dom/dist/floating-ui.dom.js +211 -0
  144. package/out/renderer/node_modules/.pnpm/@floating-ui_dom@1.7.2/node_modules/@floating-ui/dom/dist/floating-ui.dom.js.map +1 -0
  145. package/out/renderer/node_modules/.pnpm/@floating-ui_utils@0.2.10/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.js +97 -0
  146. package/out/renderer/node_modules/.pnpm/@floating-ui_utils@0.2.10/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.js.map +1 -0
  147. package/out/renderer/node_modules/.pnpm/@floating-ui_utils@0.2.10/node_modules/@floating-ui/utils/dist/floating-ui.utils.js +31 -0
  148. package/out/renderer/node_modules/.pnpm/@floating-ui_utils@0.2.10/node_modules/@floating-ui/utils/dist/floating-ui.utils.js.map +1 -0
  149. package/out/renderer/node_modules/.pnpm/hoist-non-react-statics@3.3.2/node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js +93 -0
  150. package/out/renderer/node_modules/.pnpm/hoist-non-react-statics@3.3.2/node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js.map +1 -0
  151. package/out/renderer/node_modules/.pnpm/memoize-one@6.0.0/node_modules/memoize-one/dist/memoize-one.esm.js +38 -0
  152. package/out/renderer/node_modules/.pnpm/memoize-one@6.0.0/node_modules/memoize-one/dist/memoize-one.esm.js.map +1 -0
  153. package/out/renderer/node_modules/.pnpm/react-is@16.13.1/node_modules/react-is/cjs/react-is.development.js +159 -0
  154. package/out/renderer/node_modules/.pnpm/react-is@16.13.1/node_modules/react-is/cjs/react-is.development.js.map +1 -0
  155. package/out/renderer/node_modules/.pnpm/react-is@16.13.1/node_modules/react-is/cjs/react-is.production.min.js +103 -0
  156. package/out/renderer/node_modules/.pnpm/react-is@16.13.1/node_modules/react-is/cjs/react-is.production.min.js.map +1 -0
  157. package/out/renderer/node_modules/.pnpm/react-is@16.13.1/node_modules/react-is/index.js +18 -0
  158. package/out/renderer/node_modules/.pnpm/react-is@16.13.1/node_modules/react-is/index.js.map +1 -0
  159. package/out/renderer/node_modules/.pnpm/react-select@5.10.2_@types_react@17.0.93_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/react-select/dist/Select-ef7c0426.esm.js +2200 -0
  160. package/out/renderer/node_modules/.pnpm/react-select@5.10.2_@types_react@17.0.93_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/react-select/dist/Select-ef7c0426.esm.js.map +1 -0
  161. package/out/renderer/node_modules/.pnpm/react-select@5.10.2_@types_react@17.0.93_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/react-select/dist/index-641ee5b8.esm.js +992 -0
  162. package/out/renderer/node_modules/.pnpm/react-select@5.10.2_@types_react@17.0.93_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/react-select/dist/index-641ee5b8.esm.js.map +1 -0
  163. package/out/renderer/node_modules/.pnpm/react-select@5.10.2_@types_react@17.0.93_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/react-select/dist/react-select.esm.js +14 -0
  164. package/out/renderer/node_modules/.pnpm/react-select@5.10.2_@types_react@17.0.93_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/react-select/dist/react-select.esm.js.map +1 -0
  165. package/out/renderer/node_modules/.pnpm/react-select@5.10.2_@types_react@17.0.93_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/react-select/dist/useStateManager-7e1e8489.esm.js +56 -0
  166. package/out/renderer/node_modules/.pnpm/react-select@5.10.2_@types_react@17.0.93_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/react-select/dist/useStateManager-7e1e8489.esm.js.map +1 -0
  167. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Enum.js +22 -0
  168. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Enum.js.map +1 -0
  169. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Middleware.js +30 -0
  170. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Middleware.js.map +1 -0
  171. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Parser.js +164 -0
  172. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Parser.js.map +1 -0
  173. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Serializer.js +37 -0
  174. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Serializer.js.map +1 -0
  175. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Tokenizer.js +245 -0
  176. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Tokenizer.js.map +1 -0
  177. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Utility.js +120 -0
  178. package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Utility.js.map +1 -0
  179. package/out/renderer/node_modules/.pnpm/use-isomorphic-layout-effect@1.2.1_@types_react@17.0.93_react@17.0.2/node_modules/use-isomorphic-layout-effect/dist/use-isomorphic-layout-effect.browser.esm.js +6 -0
  180. package/out/renderer/node_modules/.pnpm/use-isomorphic-layout-effect@1.2.1_@types_react@17.0.93_react@17.0.2/node_modules/use-isomorphic-layout-effect/dist/use-isomorphic-layout-effect.browser.esm.js.map +1 -0
  181. package/out/renderer/pod-monitoring.js +15 -19
  182. package/out/renderer/pod-monitoring.js.map +1 -1
  183. package/out/renderer/preferences/ai-shortcuts-preferences.js +12 -4
  184. package/out/renderer/preferences/ai-shortcuts-preferences.js.map +1 -1
  185. package/out/renderer/preferences/dashboard-preferences.js +37 -6
  186. package/out/renderer/preferences/dashboard-preferences.js.map +1 -1
  187. package/out/renderer/preferences/monitoring-preferences.js +131 -44
  188. package/out/renderer/preferences/monitoring-preferences.js.map +1 -1
  189. package/out/renderer/preferences/preferences.js +31 -7
  190. package/out/renderer/preferences/preferences.js.map +1 -1
  191. package/out/renderer/read-only.js +2 -2
  192. package/out/renderer/read-only.js.map +1 -1
  193. package/out/renderer/src/common/ai-terminal-context.js +51 -0
  194. package/out/renderer/src/common/ai-terminal-context.js.map +1 -0
  195. package/out/renderer/src/common/ai.js.map +1 -1
  196. package/out/renderer/src/common/cluster-icon-ipc.js +6 -0
  197. package/out/renderer/src/common/cluster-icon-ipc.js.map +1 -0
  198. package/out/renderer/src/common/cluster-icons.js +133 -0
  199. package/out/renderer/src/common/cluster-icons.js.map +1 -0
  200. package/out/renderer/src/common/dashboard.js +2 -1
  201. package/out/renderer/src/common/dashboard.js.map +1 -1
  202. package/out/renderer/src/common/date-time.js +11 -0
  203. package/out/renderer/src/common/date-time.js.map +1 -0
  204. package/out/renderer/src/common/monitoring-history.js +2 -0
  205. package/out/renderer/src/common/monitoring-history.js.map +1 -1
  206. package/out/renderer/src/common/resource-diagnostics.js.map +1 -1
  207. package/out/renderer/src/common/settings-export.js.map +1 -1
  208. package/out/renderer/src/common/store/dashboard-preferences-store.js +2 -1
  209. package/out/renderer/src/common/store/dashboard-preferences-store.js.map +1 -1
  210. package/out/renderer/src/common/store/monitoring-preferences-store.js +5 -0
  211. package/out/renderer/src/common/store/monitoring-preferences-store.js.map +1 -1
  212. package/out/renderer/welcome.js +28 -6
  213. package/out/renderer/welcome.js.map +1 -1
  214. package/package.json +3 -2
@@ -0,0 +1,200 @@
1
+ const require_extensions = require("./_virtual/_global-external_@freelensapp/extensions.js");
2
+ const require__global_external_react = require("./_virtual/_global-external_react.js");
3
+ const require_jsx_runtime = require("./_virtual/_global-external_react/jsx-runtime.js");
4
+ const require_ai_icon = require("./ai-icon.js");
5
+ const require_ai_terminal_context = require("./src/common/ai-terminal-context.js");
6
+ const require_date_time = require("./src/common/date-time.js");
7
+ //#region src/renderer/ai-terminal-context.tsx
8
+ function activeAiTerminal(clusterId) {
9
+ if (!clusterId || require_extensions.Renderer.Catalog.activeCluster.get()?.metadata.uid !== clusterId) return;
10
+ for (const element of document.querySelectorAll(`[data-testid^="dock-tab-content-for-"]`)) {
11
+ let visible = true;
12
+ for (let node = element; node; node = node.parentElement) {
13
+ const style = getComputedStyle(node);
14
+ if (node.hidden || node.getAttribute("aria-hidden") === "true" || style.display === "none" || style.visibility === "hidden" || style.visibility === "collapse") {
15
+ visible = false;
16
+ break;
17
+ }
18
+ }
19
+ const id = element.dataset.testid?.slice(21);
20
+ if (!visible || !id || !require_extensions.Renderer.Component.terminalStore.isConnected(id)) continue;
21
+ const api = require_extensions.Renderer.Component.terminalStore.getTerminalApi(id);
22
+ if (api?.isReady && api.isConnected()) return id;
23
+ }
24
+ }
25
+ function captureAiTerminal(clusterId, expectedId) {
26
+ const id = activeAiTerminal(clusterId);
27
+ if (!id || expectedId && id !== expectedId) return;
28
+ try {
29
+ const buffer = require_extensions.Renderer.Component.terminalStore.getTerminal(id)?.xterm?.buffer?.active;
30
+ if (!buffer || !Number.isSafeInteger(buffer.length) || buffer.length > 1e4 || buffer.length < 0) return;
31
+ const end = buffer.length;
32
+ if (!Number.isSafeInteger(end) || end < 0) return;
33
+ const logical = [];
34
+ let characters = 0;
35
+ for (let index = 0; index < end; index++) {
36
+ const line = buffer.getLine(index);
37
+ if (!line || index === 0 && line.isWrapped) return;
38
+ const text = line.translateToString(!buffer.getLine(index + 1)?.isWrapped);
39
+ characters += text.length + 1;
40
+ if (characters > 1e6) return;
41
+ if (line.isWrapped && logical.length) logical[logical.length - 1] += text;
42
+ else logical.push(text);
43
+ }
44
+ if (activeAiTerminal(clusterId) !== id) return;
45
+ return require_ai_terminal_context.sanitizeAiTerminalSnapshot({
46
+ text: logical.join("\n"),
47
+ capturedAt: (/* @__PURE__ */ new Date()).toISOString()
48
+ });
49
+ } catch {
50
+ return;
51
+ }
52
+ }
53
+ function AiTerminalContext({ clusterId, attachment, onChange, disabled }) {
54
+ const [terminalId, setTerminalId] = require__global_external_react.useState(() => activeAiTerminal(clusterId));
55
+ const [preview, setPreview] = require__global_external_react.useState();
56
+ const [unavailable, setUnavailable] = require__global_external_react.useState(false);
57
+ require__global_external_react.useEffect(() => {
58
+ const update = () => setTerminalId(activeAiTerminal(clusterId));
59
+ update();
60
+ const timer = window.setInterval(update, 500);
61
+ return () => window.clearInterval(timer);
62
+ }, [clusterId]);
63
+ const attached = Boolean(attachment && attachment.clusterId === clusterId && attachment.terminalId === terminalId);
64
+ require__global_external_react.useEffect(() => {
65
+ if (!attached) {
66
+ if (attachment) onChange(void 0);
67
+ setPreview(void 0);
68
+ return;
69
+ }
70
+ let stopped = false;
71
+ let scheduled;
72
+ let polling;
73
+ let subscription;
74
+ const stop = () => {
75
+ stopped = true;
76
+ window.clearTimeout(scheduled);
77
+ window.clearInterval(polling);
78
+ subscription?.dispose();
79
+ subscription = void 0;
80
+ };
81
+ const update = () => {
82
+ if (stopped) return;
83
+ scheduled = void 0;
84
+ const snapshot = captureAiTerminal(clusterId, attachment?.terminalId);
85
+ setUnavailable(!snapshot);
86
+ if (!snapshot) {
87
+ setPreview(void 0);
88
+ if (activeAiTerminal(clusterId) !== attachment?.terminalId) {
89
+ stop();
90
+ onChange(void 0);
91
+ }
92
+ return;
93
+ }
94
+ setPreview((previous) => previous?.text === snapshot.text && previous.truncated === snapshot.truncated ? previous : snapshot);
95
+ };
96
+ update();
97
+ if (stopped) return stop;
98
+ try {
99
+ subscription = require_extensions.Renderer.Component.terminalStore.getTerminal(attachment.terminalId)?.xterm?.onWriteParsed?.(() => {
100
+ if (!stopped && scheduled === void 0) scheduled = window.setTimeout(update, 250);
101
+ });
102
+ } catch {}
103
+ if (!subscription) polling = window.setInterval(update, 1e3);
104
+ return stop;
105
+ }, [
106
+ attached,
107
+ attachment,
108
+ clusterId,
109
+ onChange
110
+ ]);
111
+ return /* @__PURE__ */ require_jsx_runtime.jsxs("div", {
112
+ className: "power-ai-terminal-context",
113
+ style: { fontSize: 11 },
114
+ children: [
115
+ /* @__PURE__ */ require_jsx_runtime.jsx("button", {
116
+ type: "button",
117
+ "aria-label": "Attach terminal output",
118
+ "aria-pressed": attached,
119
+ style: {
120
+ position: "absolute",
121
+ top: 8,
122
+ right: 8,
123
+ display: "inline-flex",
124
+ alignItems: "center",
125
+ justifyContent: "center",
126
+ width: 26,
127
+ height: 26,
128
+ minHeight: 26,
129
+ padding: 0,
130
+ color: "var(--textColorSecondary)",
131
+ borderColor: "var(--borderFaintColor)",
132
+ background: attached ? "color-mix(in srgb, var(--textColorPrimary) 8%, transparent)" : "transparent"
133
+ },
134
+ disabled: disabled || !terminalId,
135
+ title: attached ? "Detach terminal output from this question" : terminalId ? "Attach terminal output to this question" : "Open a connected terminal in this cluster",
136
+ onClick: () => {
137
+ if (attached) {
138
+ onChange(void 0);
139
+ setPreview(void 0);
140
+ return;
141
+ }
142
+ const snapshot = captureAiTerminal(clusterId, terminalId);
143
+ setUnavailable(!snapshot);
144
+ if (!snapshot || !clusterId || !terminalId) return;
145
+ setPreview(snapshot);
146
+ onChange({
147
+ clusterId,
148
+ terminalId
149
+ });
150
+ },
151
+ children: /* @__PURE__ */ require_jsx_runtime.jsx(require_ai_icon.AiIcon, {
152
+ material: "terminal",
153
+ size: 16
154
+ })
155
+ }),
156
+ attached && preview && /* @__PURE__ */ require_jsx_runtime.jsxs("details", {
157
+ style: {
158
+ padding: "0 16px 4px",
159
+ margin: 0
160
+ },
161
+ children: [
162
+ /* @__PURE__ */ require_jsx_runtime.jsxs("summary", { children: [
163
+ "Terminal · ",
164
+ preview.text.split("\n").length,
165
+ " rows",
166
+ preview.truncated ? " · truncated" : ""
167
+ ] }),
168
+ /* @__PURE__ */ require_jsx_runtime.jsxs("p", { children: [
169
+ "Preview captured ",
170
+ /* @__PURE__ */ require_jsx_runtime.jsx("span", {
171
+ style: { whiteSpace: "pre-wrap" },
172
+ children: require_date_time.formatDateTime(preview.capturedAt)
173
+ }),
174
+ " · captured again when sent · up to 300 rows / 32 KiB · Common credentials masked. Review before sending."
175
+ ] }),
176
+ /* @__PURE__ */ require_jsx_runtime.jsx("pre", {
177
+ style: {
178
+ maxHeight: 160,
179
+ overflow: "auto",
180
+ whiteSpace: "pre-wrap"
181
+ },
182
+ children: preview.text
183
+ }),
184
+ /* @__PURE__ */ require_jsx_runtime.jsx("p", { children: "The attachment is not stored in chat history. Assistant replies may quote it." })
185
+ ]
186
+ }),
187
+ unavailable && /* @__PURE__ */ require_jsx_runtime.jsx("div", {
188
+ role: "status",
189
+ style: { padding: "4px 16px 8px" },
190
+ children: "Terminal output is unavailable or exceeds the safe capture limit"
191
+ })
192
+ ]
193
+ });
194
+ }
195
+ //#endregion
196
+ exports.AiTerminalContext = AiTerminalContext;
197
+ exports.activeAiTerminal = activeAiTerminal;
198
+ exports.captureAiTerminal = captureAiTerminal;
199
+
200
+ //# sourceMappingURL=ai-terminal-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-terminal-context.js","names":[],"sources":["../../src/renderer/ai-terminal-context.tsx"],"sourcesContent":["import { Renderer } from \"@freelensapp/extensions\";\nimport { useEffect, useState } from \"react\";\nimport { type AiTerminalSnapshot, sanitizeAiTerminalSnapshot } from \"../common/ai-terminal-context\";\nimport { formatDateTime } from \"../common/date-time\";\nimport { AiIcon } from \"./ai-icon\";\n\ntype TerminalBuffer = {\n length: number;\n baseY: number;\n cursorY: number;\n getLine(index: number): { isWrapped?: boolean; translateToString(trimRight?: boolean): string } | undefined;\n};\n\nexport function activeAiTerminal(clusterId?: string): string | undefined {\n if (!clusterId || Renderer.Catalog.activeCluster.get()?.metadata.uid !== clusterId) return;\n const prefix = \"dock-tab-content-for-\";\n for (const element of document.querySelectorAll<HTMLElement>(`[data-testid^=\"${prefix}\"]`)) {\n let visible = true;\n for (let node: HTMLElement | null = element; node; node = node.parentElement) {\n const style = getComputedStyle(node);\n if (\n node.hidden ||\n node.getAttribute(\"aria-hidden\") === \"true\" ||\n style.display === \"none\" ||\n style.visibility === \"hidden\" ||\n style.visibility === \"collapse\"\n ) {\n visible = false;\n break;\n }\n }\n const id = element.dataset.testid?.slice(prefix.length);\n if (!visible || !id || !Renderer.Component.terminalStore.isConnected(id)) continue;\n const api = Renderer.Component.terminalStore.getTerminalApi(id);\n if (api?.isReady && api.isConnected()) return id;\n }\n return;\n}\n\nexport function captureAiTerminal(clusterId?: string, expectedId?: string): AiTerminalSnapshot | undefined {\n const id = activeAiTerminal(clusterId);\n if (!id || (expectedId && id !== expectedId)) return;\n try {\n // [xterm] is a guarded host implementation detail with no public buffer accessor\n const terminal = Renderer.Component.terminalStore.getTerminal(id) as unknown as\n | {\n xterm?: { buffer?: { active?: TerminalBuffer } };\n }\n | undefined;\n const buffer = terminal?.xterm?.buffer?.active;\n if (!buffer || !Number.isSafeInteger(buffer.length) || buffer.length > 10_000 || buffer.length < 0) return;\n const end = buffer.length;\n if (!Number.isSafeInteger(end) || end < 0) return;\n const logical: string[] = [];\n let characters = 0;\n for (let index = 0; index < end; index++) {\n const line = buffer.getLine(index);\n if (!line || (index === 0 && line.isWrapped)) return;\n const text = line.translateToString(!buffer.getLine(index + 1)?.isWrapped);\n characters += text.length + 1;\n if (characters > 1_000_000) return;\n if (line.isWrapped && logical.length) logical[logical.length - 1] += text;\n else logical.push(text);\n }\n if (activeAiTerminal(clusterId) !== id) return;\n return sanitizeAiTerminalSnapshot({ text: logical.join(\"\\n\"), capturedAt: new Date().toISOString() });\n } catch {\n return;\n }\n}\n\nexport interface AiTerminalAttachment {\n clusterId: string;\n terminalId: string;\n}\n\nexport function AiTerminalContext({\n clusterId,\n attachment,\n onChange,\n disabled,\n}: {\n clusterId?: string;\n attachment?: AiTerminalAttachment;\n onChange(value: AiTerminalAttachment | undefined): void;\n disabled: boolean;\n}) {\n const [terminalId, setTerminalId] = useState(() => activeAiTerminal(clusterId));\n const [preview, setPreview] = useState<AiTerminalSnapshot>();\n const [unavailable, setUnavailable] = useState(false);\n useEffect(() => {\n const update = () => setTerminalId(activeAiTerminal(clusterId));\n update();\n const timer = window.setInterval(update, 500);\n return () => window.clearInterval(timer);\n }, [clusterId]);\n const attached = Boolean(attachment && attachment.clusterId === clusterId && attachment.terminalId === terminalId);\n useEffect(() => {\n if (!attached) {\n if (attachment) onChange(undefined);\n setPreview(undefined);\n return;\n }\n let stopped = false;\n let scheduled: number | undefined;\n let polling: number | undefined;\n let subscription: { dispose(): void } | undefined;\n const stop = () => {\n stopped = true;\n window.clearTimeout(scheduled);\n window.clearInterval(polling);\n subscription?.dispose();\n subscription = undefined;\n };\n const update = () => {\n if (stopped) return;\n scheduled = undefined;\n const snapshot = captureAiTerminal(clusterId, attachment?.terminalId);\n setUnavailable(!snapshot);\n if (!snapshot) {\n setPreview(undefined);\n if (activeAiTerminal(clusterId) !== attachment?.terminalId) {\n stop();\n onChange(undefined);\n }\n return;\n }\n setPreview((previous) =>\n previous?.text === snapshot.text && previous.truncated === snapshot.truncated ? previous : snapshot,\n );\n };\n update();\n if (stopped) return stop;\n try {\n const terminal = Renderer.Component.terminalStore.getTerminal(attachment!.terminalId) as unknown as\n | {\n xterm?: { onWriteParsed?: (listener: () => void) => { dispose(): void } };\n }\n | undefined;\n subscription = terminal?.xterm?.onWriteParsed?.(() => {\n if (!stopped && scheduled === undefined) scheduled = window.setTimeout(update, 250);\n });\n } catch {}\n if (!subscription) polling = window.setInterval(update, 1000);\n return stop;\n }, [attached, attachment, clusterId, onChange]);\n return (\n <div className=\"power-ai-terminal-context\" style={{ fontSize: 11 }}>\n <button\n type=\"button\"\n aria-label=\"Attach terminal output\"\n aria-pressed={attached}\n style={{\n position: \"absolute\",\n top: 8,\n right: 8,\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 26,\n height: 26,\n minHeight: 26,\n padding: 0,\n color: \"var(--textColorSecondary)\",\n borderColor: \"var(--borderFaintColor)\",\n background: attached ? \"color-mix(in srgb, var(--textColorPrimary) 8%, transparent)\" : \"transparent\",\n }}\n disabled={disabled || !terminalId}\n title={\n attached\n ? \"Detach terminal output from this question\"\n : terminalId\n ? \"Attach terminal output to this question\"\n : \"Open a connected terminal in this cluster\"\n }\n onClick={() => {\n if (attached) {\n onChange(undefined);\n setPreview(undefined);\n return;\n }\n const snapshot = captureAiTerminal(clusterId, terminalId);\n setUnavailable(!snapshot);\n if (!snapshot || !clusterId || !terminalId) return;\n setPreview(snapshot);\n onChange({ clusterId, terminalId });\n }}\n >\n <AiIcon material=\"terminal\" size={16} />\n </button>\n {attached && preview && (\n <details style={{ padding: \"0 16px 4px\", margin: 0 }}>\n <summary>\n Terminal · {preview.text.split(\"\\n\").length} rows{preview.truncated ? \" · truncated\" : \"\"}\n </summary>\n <p>\n Preview captured <span style={{ whiteSpace: \"pre-wrap\" }}>{formatDateTime(preview.capturedAt)}</span> ·\n captured again when sent · up to 300 rows / 32 KiB · Common credentials masked. Review before sending.\n </p>\n <pre style={{ maxHeight: 160, overflow: \"auto\", whiteSpace: \"pre-wrap\" }}>{preview.text}</pre>\n <p>The attachment is not stored in chat history. Assistant replies may quote it.</p>\n </details>\n )}\n {unavailable && (\n <div role=\"status\" style={{ padding: \"4px 16px 8px\" }}>\n Terminal output is unavailable or exceeds the safe capture limit\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
@@ -16,6 +16,7 @@ const require_ai_message = require("./ai-message.js");
16
16
  const require_ai_provider_icon = require("./ai-provider-icon.js");
17
17
  const require_ai_resize = require("./ai-resize.js");
18
18
  const require_ai_shortcuts$1 = require("./ai-shortcuts.js");
19
+ const require_ai_terminal_context = require("./ai-terminal-context.js");
19
20
  let electron = require("electron");
20
21
  //#region src/renderer/ai.tsx
21
22
  function readAiContext() {
@@ -80,6 +81,7 @@ function hasAiOverlay() {
80
81
  var styles = `
81
82
  @keyframes power-ai-spin { to { transform: rotate(360deg); } }
82
83
  @keyframes power-ai-dot { 0%, 80%, 100% { opacity: .25; } 40% { opacity: 1; } }
84
+ body:has(.AddRemoveButtons .remove-button:not([data-freelens-power-read-only])) .power-ai-launcher { display: none; }
83
85
  .power-ai-read-activity > span { display: inline-flex; align-items: center; gap: 4px; }
84
86
  .power-ai-read-activity [data-status="reading"] .Icon { animation: power-ai-spin 1.2s linear infinite; }
85
87
  .power-ai-thinking { margin: 12px 16px 18px; line-height: 1.5; color: var(--textColorSecondary); }
@@ -138,6 +140,7 @@ var styles = `
138
140
  :root .power-ai-panel header button.power-ai-pin[aria-pressed="true"] { color: var(--primary); }
139
141
  .power-ai-panel header > button { flex-shrink: 0; }
140
142
  .power-ai-panel form { position: relative; flex-shrink: 0; margin: 0 16px 16px; border: 1px solid var(--borderFaintColor); border-radius: 12px; background: var(--mainBackground); transition: border-color 160ms ease; }
143
+ .power-ai-panel form > .power-ai-context-preview { padding: 8px 48px 4px 16px !important; min-height: 34px; margin: 0; box-sizing: border-box; }
141
144
  .power-ai-panel form:focus-within { border-color: var(--primary); }
142
145
  .power-ai-message > strong { display: flex; align-items: center; gap: 8px; font-size: 12px; font-weight: 500; color: var(--textColorSecondary); margin-bottom: 10px; }
143
146
  .power-ai-message-assistant { border-color: transparent; background: transparent; }
@@ -187,6 +190,7 @@ var AiChat = require__global_external_mobx_react.observer(({ isClusterDocument }
187
190
  const [viewportWidth, setViewportWidth] = require__global_external_react.useState(window.innerWidth);
188
191
  const [launcherHidden, setLauncherHidden] = require__global_external_react.useState(false);
189
192
  const [draft, setDraft] = require__global_external_react.useState("");
193
+ const [terminalAttachment, setTerminalAttachment] = require__global_external_react.useState();
190
194
  const [suggestionIndex, setSuggestionIndex] = require__global_external_react.useState(0);
191
195
  const [dismissedDraft, setDismissedDraft] = require__global_external_react.useState();
192
196
  const suggestions = /^\/[^\s]*$/.test(draft) && dismissedDraft !== draft ? require_ai_shortcuts_store.AiShortcutsStore.getInstanceOrCreate().shortcuts.filter((shortcut) => `${shortcut.command} ${shortcut.label}`.toLowerCase().includes(draft.slice(1).toLowerCase())) : [];
@@ -333,21 +337,58 @@ var AiChat = require__global_external_mobx_react.observer(({ isClusterDocument }
333
337
  return () => document.removeEventListener("click", onOutsideClick, true);
334
338
  }, [open, pinned]);
335
339
  require__global_external_react.useEffect(() => {
336
- const toggle = (event) => {
337
- const mac = /Mac|iPhone|iPad/.test(navigator.platform);
338
- if (event.repeat || event.isComposing || event.keyCode === 229 || event.altKey || !event.shiftKey || (mac ? !event.metaKey || event.ctrlKey : !event.ctrlKey || event.metaKey) || event.code !== "KeyY" || !preferences.enabled || !isClusterDocument() || hasAiOverlay()) return;
339
- event.preventDefault();
340
- event.stopPropagation();
341
- event.stopImmediatePropagation();
340
+ const heldKeys = /* @__PURE__ */ new Set();
341
+ let shiftDownAt;
342
+ let lastTapAt;
343
+ const reset = () => {
344
+ shiftDownAt = void 0;
345
+ lastTapAt = void 0;
346
+ };
347
+ const onKeyDown = (event) => {
348
+ if (event.key !== "Shift") heldKeys.add(event.code || event.key);
349
+ if (event.key !== "Shift" || event.repeat || event.isComposing || event.keyCode === 229 || event.altKey || event.ctrlKey || event.metaKey || heldKeys.size > 0 || shiftDownAt !== void 0) {
350
+ reset();
351
+ return;
352
+ }
353
+ shiftDownAt = performance.now();
354
+ };
355
+ const onKeyUp = (event) => {
356
+ if (event.key === "Meta") {
357
+ heldKeys.clear();
358
+ reset();
359
+ return;
360
+ }
361
+ heldKeys.delete(event.code || event.key);
362
+ const now = performance.now();
363
+ if (event.key !== "Shift" || shiftDownAt === void 0 || now - shiftDownAt > 400 || event.isComposing || event.altKey || event.ctrlKey || event.metaKey || !preferences.enabled || !isClusterDocument() || hasAiOverlay()) {
364
+ reset();
365
+ return;
366
+ }
367
+ shiftDownAt = void 0;
368
+ if (lastTapAt === void 0 || now - lastTapAt > 400) {
369
+ lastTapAt = now;
370
+ return;
371
+ }
372
+ reset();
342
373
  setContext(readAiContext());
343
374
  setOpen((value) => !value);
344
375
  };
345
- window.addEventListener("keydown", toggle, true);
346
- return () => window.removeEventListener("keydown", toggle, true);
376
+ window.addEventListener("keydown", onKeyDown, true);
377
+ window.addEventListener("keyup", onKeyUp, true);
378
+ const onBlur = () => {
379
+ heldKeys.clear();
380
+ reset();
381
+ };
382
+ window.addEventListener("blur", onBlur);
383
+ return () => {
384
+ window.removeEventListener("keydown", onKeyDown, true);
385
+ window.removeEventListener("keyup", onKeyUp, true);
386
+ window.removeEventListener("blur", onBlur);
387
+ };
347
388
  }, [preferences, isClusterDocument]);
348
389
  const availablePanelWidth = Math.max(1, viewportWidth - Math.max(0, launcherLeft - 16));
349
390
  const panelWidth = require_ai_resize.clampAiPanelWidth(preferences.chatPanelWidth ?? 560, availablePanelWidth);
350
- const shortcutLabel = /Mac|iPhone|iPad/.test(navigator.platform) ? "⌘⇧Y" : "Ctrl+Shift+Y";
391
+ const shortcutLabel = "Shift, Shift";
351
392
  const key = context.clusterId ?? "global";
352
393
  const messages = preferences.conversations[key] ?? [];
353
394
  const busy = pending.includes(key);
@@ -366,6 +407,31 @@ var AiChat = require__global_external_mobx_react.observer(({ isClusterDocument }
366
407
  const element = messagesElement.current;
367
408
  if (element && open) element.scrollTop = element.scrollHeight;
368
409
  }, [open, key]);
410
+ require__global_external_react.useEffect(() => {
411
+ if (!terminalAttachment) return;
412
+ const update = () => {
413
+ if (require_ai_terminal_context.activeAiTerminal(terminalAttachment.clusterId) !== terminalAttachment.terminalId) setTerminalAttachment(void 0);
414
+ };
415
+ update();
416
+ const timer = window.setInterval(update, 500);
417
+ const observer = new MutationObserver(update);
418
+ observer.observe(document.body, {
419
+ childList: true,
420
+ subtree: true,
421
+ attributes: true,
422
+ attributeFilter: [
423
+ "class",
424
+ "style",
425
+ "hidden",
426
+ "aria-hidden",
427
+ "data-testid"
428
+ ]
429
+ });
430
+ return () => {
431
+ window.clearInterval(timer);
432
+ observer.disconnect();
433
+ };
434
+ }, [terminalAttachment, context.clusterId]);
369
435
  if (!preferences.enabled || !isClusterDocument() || coveredByOverlay) return null;
370
436
  const send = async (starter) => {
371
437
  const question = require_ai_shortcuts.expandAiShortcut((starter ?? draft).trim(), require_ai_shortcuts_store.AiShortcutsStore.getInstanceOrCreate().shortcuts);
@@ -379,6 +445,13 @@ var AiChat = require__global_external_mobx_react.observer(({ isClusterDocument }
379
445
  setContext(requestContext);
380
446
  return;
381
447
  }
448
+ const terminalSnapshot = terminalAttachment?.clusterId === requestContext.clusterId ? require_ai_terminal_context.captureAiTerminal(requestContext.clusterId, terminalAttachment?.terminalId) : void 0;
449
+ if (terminalAttachment && !terminalSnapshot) {
450
+ setTerminalAttachment(void 0);
451
+ setError("The attached terminal changed or is unavailable. Attach it again before sending.");
452
+ return;
453
+ }
454
+ setTerminalAttachment(void 0);
382
455
  following.current = true;
383
456
  const next = [...messages, {
384
457
  role: "user",
@@ -407,6 +480,7 @@ var AiChat = require__global_external_mobx_react.observer(({ isClusterDocument }
407
480
  return tail;
408
481
  }, []),
409
482
  context: requestContext,
483
+ ...terminalSnapshot ? { terminalSnapshot } : {},
410
484
  systemPrompt: [preferences.systemPrompt, requestContext.clusterId ? preferences.clusterPrompt : ""].filter(Boolean).join("\n\n"),
411
485
  model: preferences.model,
412
486
  speed: preferences.speed,
@@ -525,6 +599,7 @@ var AiChat = require__global_external_mobx_react.observer(({ isClusterDocument }
525
599
  "aria-label": "New chat",
526
600
  title: "Clear this conversation and start a new chat",
527
601
  onClick: () => {
602
+ setTerminalAttachment(void 0);
528
603
  preferences.setMessages(key, []);
529
604
  setStopped((keys) => keys.filter((entry) => entry !== key));
530
605
  setActivity({
@@ -711,6 +786,12 @@ var AiChat = require__global_external_mobx_react.observer(({ isClusterDocument }
711
786
  }, shortcut.id))
712
787
  }),
713
788
  /* @__PURE__ */ require_jsx_runtime.jsx(require_ai_extras$1.AiContextPreview, { context: require_ai_extras.attachedAiContext(context) }),
789
+ /* @__PURE__ */ require_jsx_runtime.jsx(require_ai_terminal_context.AiTerminalContext, {
790
+ clusterId: context.clusterId,
791
+ attachment: terminalAttachment,
792
+ onChange: setTerminalAttachment,
793
+ disabled: busy
794
+ }),
714
795
  /* @__PURE__ */ require_jsx_runtime.jsx("textarea", {
715
796
  ref: composer,
716
797
  "aria-controls": suggestions.length ? "power-ai-commands" : void 0,