@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.
- package/README.md +5 -4
- package/THIRD_PARTY_LICENSES +1707 -0
- package/out/main/ai.js +63 -23
- package/out/main/ai.js.map +1 -1
- package/out/main/cluster-icons-catalog.js +28 -0
- package/out/main/cluster-icons-catalog.js.map +1 -0
- package/out/main/cluster-icons.js +125 -0
- package/out/main/cluster-icons.js.map +1 -0
- package/out/main/common/ai-terminal-context.js +51 -0
- package/out/main/common/ai-terminal-context.js.map +1 -0
- package/out/main/common/ai.js.map +1 -1
- package/out/main/common/cluster-icon-ipc.js +6 -0
- package/out/main/common/cluster-icon-ipc.js.map +1 -0
- package/out/main/common/cluster-icons.js +121 -0
- package/out/main/common/cluster-icons.js.map +1 -0
- package/out/main/common/dashboard.js +2 -1
- package/out/main/common/dashboard.js.map +1 -1
- package/out/main/common/settings-export.js +4 -2
- package/out/main/common/settings-export.js.map +1 -1
- package/out/main/common/store/cluster-icons-store.js +32 -0
- package/out/main/common/store/cluster-icons-store.js.map +1 -0
- package/out/main/common/store/dashboard-preferences-store.js +2 -1
- package/out/main/common/store/dashboard-preferences-store.js.map +1 -1
- package/out/main/common/store/monitoring-preferences-store.js +5 -0
- package/out/main/common/store/monitoring-preferences-store.js.map +1 -1
- package/out/main/dashboard-views.js +20 -10
- package/out/main/dashboard-views.js.map +1 -1
- package/out/main/diagnostics-menu-order.js +57 -0
- package/out/main/diagnostics-menu-order.js.map +1 -0
- package/out/main/index.js +9 -1
- package/out/main/index.js.map +1 -1
- package/out/main/monitoring-history.js +13 -3
- package/out/main/monitoring-history.js.map +1 -1
- package/out/renderer/_virtual/_global-external_react-dom.js +2 -1
- package/out/renderer/_virtual/_global-external_react.js +10 -5
- package/out/renderer/_virtual/_rolldown/runtime.js +22 -0
- package/out/renderer/ai-terminal-context.js +200 -0
- package/out/renderer/ai-terminal-context.js.map +1 -0
- package/out/renderer/ai.js +90 -9
- package/out/renderer/ai.js.map +1 -1
- package/out/renderer/appearance.js +1 -0
- package/out/renderer/appearance.js.map +1 -1
- package/out/renderer/cluster-icon-colors.js +188 -0
- package/out/renderer/cluster-icon-colors.js.map +1 -0
- package/out/renderer/cluster-icons.js +304 -0
- package/out/renderer/cluster-icons.js.map +1 -0
- package/out/renderer/dashboard.js +51 -14
- package/out/renderer/dashboard.js.map +1 -1
- package/out/renderer/details/secret-certificate-details.js +9 -2
- package/out/renderer/details/secret-certificate-details.js.map +1 -1
- package/out/renderer/diagnostics.css.js +39 -0
- package/out/renderer/diagnostics.css.js.map +1 -0
- package/out/renderer/diagnostics.js +796 -343
- package/out/renderer/diagnostics.js.map +1 -1
- package/out/renderer/index.js +9 -4
- package/out/renderer/index.js.map +1 -1
- package/out/renderer/monitoring-details-chart.js +42 -0
- package/out/renderer/monitoring-details-chart.js.map +1 -0
- package/out/renderer/monitoring-history-collection.js +2 -18
- package/out/renderer/monitoring-history-collection.js.map +1 -1
- package/out/renderer/monitoring-history-view.js +111 -34
- package/out/renderer/monitoring-history-view.js.map +1 -1
- package/out/renderer/monitoring.js +68 -27
- package/out/renderer/monitoring.js.map +1 -1
- package/out/renderer/node-monitoring.js +23 -12
- package/out/renderer/node-monitoring.js.map +1 -1
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js +10 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js +8 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js +9 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js +9 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/classCallCheck.js +8 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/classCallCheck.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/createClass.js +15 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/createClass.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/createSuper.js +19 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/createSuper.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/defineProperty.js +14 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/defineProperty.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/extends.js +19 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/extends.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js +15 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/inherits.js +14 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/inherits.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/isNativeReflectConstruct.js +18 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/isNativeReflectConstruct.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/iterableToArray.js +8 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/iterableToArray.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js +26 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/nonIterableRest.js +8 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/nonIterableRest.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js +8 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/objectSpread2.js +27 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/objectSpread2.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js +15 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js +14 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js +12 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js +15 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/slicedToArray.js +12 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/slicedToArray.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/taggedTemplateLiteral.js +8 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/taggedTemplateLiteral.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/toConsumableArray.js +12 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/toConsumableArray.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/toPrimitive.js +16 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/toPrimitive.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/toPropertyKey.js +11 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/toPropertyKey.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/typeof.js +18 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/typeof.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js +13 -0
- package/out/renderer/node_modules/.pnpm/@babel_runtime@7.27.6/node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/@emotion_cache@11.14.0/node_modules/@emotion/cache/dist/emotion-cache.browser.esm.js +237 -0
- package/out/renderer/node_modules/.pnpm/@emotion_cache@11.14.0/node_modules/@emotion/cache/dist/emotion-cache.browser.esm.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/@emotion_hash@0.9.2/node_modules/@emotion/hash/dist/emotion-hash.esm.js +25 -0
- package/out/renderer/node_modules/.pnpm/@emotion_hash@0.9.2/node_modules/@emotion/hash/dist/emotion-hash.esm.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/@emotion_memoize@0.9.0/node_modules/@emotion/memoize/dist/emotion-memoize.esm.js +12 -0
- package/out/renderer/node_modules/.pnpm/@emotion_memoize@0.9.0/node_modules/@emotion/memoize/dist/emotion-memoize.esm.js.map +1 -0
- 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
- 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
- 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
- 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
- package/out/renderer/node_modules/.pnpm/@emotion_serialize@1.3.3/node_modules/@emotion/serialize/dist/emotion-serialize.esm.js +133 -0
- package/out/renderer/node_modules/.pnpm/@emotion_serialize@1.3.3/node_modules/@emotion/serialize/dist/emotion-serialize.esm.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/@emotion_sheet@1.4.0/node_modules/@emotion/sheet/dist/emotion-sheet.esm.js +65 -0
- package/out/renderer/node_modules/.pnpm/@emotion_sheet@1.4.0/node_modules/@emotion/sheet/dist/emotion-sheet.esm.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/@emotion_unitless@0.10.0/node_modules/@emotion/unitless/dist/emotion-unitless.esm.js +54 -0
- package/out/renderer/node_modules/.pnpm/@emotion_unitless@0.10.0/node_modules/@emotion/unitless/dist/emotion-unitless.esm.js.map +1 -0
- 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
- 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
- package/out/renderer/node_modules/.pnpm/@emotion_utils@1.4.2/node_modules/@emotion/utils/dist/emotion-utils.browser.esm.js +30 -0
- package/out/renderer/node_modules/.pnpm/@emotion_utils@1.4.2/node_modules/@emotion/utils/dist/emotion-utils.browser.esm.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/@floating-ui_dom@1.7.2/node_modules/@floating-ui/dom/dist/floating-ui.dom.js +211 -0
- 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
- 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
- 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
- package/out/renderer/node_modules/.pnpm/@floating-ui_utils@0.2.10/node_modules/@floating-ui/utils/dist/floating-ui.utils.js +31 -0
- 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
- 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
- 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
- package/out/renderer/node_modules/.pnpm/memoize-one@6.0.0/node_modules/memoize-one/dist/memoize-one.esm.js +38 -0
- package/out/renderer/node_modules/.pnpm/memoize-one@6.0.0/node_modules/memoize-one/dist/memoize-one.esm.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/react-is@16.13.1/node_modules/react-is/cjs/react-is.development.js +159 -0
- package/out/renderer/node_modules/.pnpm/react-is@16.13.1/node_modules/react-is/cjs/react-is.development.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/react-is@16.13.1/node_modules/react-is/cjs/react-is.production.min.js +103 -0
- package/out/renderer/node_modules/.pnpm/react-is@16.13.1/node_modules/react-is/cjs/react-is.production.min.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/react-is@16.13.1/node_modules/react-is/index.js +18 -0
- package/out/renderer/node_modules/.pnpm/react-is@16.13.1/node_modules/react-is/index.js.map +1 -0
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Enum.js +22 -0
- package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Enum.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Middleware.js +30 -0
- package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Middleware.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Parser.js +164 -0
- package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Parser.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Serializer.js +37 -0
- package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Serializer.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Tokenizer.js +245 -0
- package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Tokenizer.js.map +1 -0
- package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Utility.js +120 -0
- package/out/renderer/node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Utility.js.map +1 -0
- 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
- 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
- package/out/renderer/pod-monitoring.js +15 -19
- package/out/renderer/pod-monitoring.js.map +1 -1
- package/out/renderer/preferences/ai-shortcuts-preferences.js +12 -4
- package/out/renderer/preferences/ai-shortcuts-preferences.js.map +1 -1
- package/out/renderer/preferences/dashboard-preferences.js +37 -6
- package/out/renderer/preferences/dashboard-preferences.js.map +1 -1
- package/out/renderer/preferences/monitoring-preferences.js +131 -44
- package/out/renderer/preferences/monitoring-preferences.js.map +1 -1
- package/out/renderer/preferences/preferences.js +31 -7
- package/out/renderer/preferences/preferences.js.map +1 -1
- package/out/renderer/read-only.js +2 -2
- package/out/renderer/read-only.js.map +1 -1
- package/out/renderer/src/common/ai-terminal-context.js +51 -0
- package/out/renderer/src/common/ai-terminal-context.js.map +1 -0
- package/out/renderer/src/common/ai.js.map +1 -1
- package/out/renderer/src/common/cluster-icon-ipc.js +6 -0
- package/out/renderer/src/common/cluster-icon-ipc.js.map +1 -0
- package/out/renderer/src/common/cluster-icons.js +133 -0
- package/out/renderer/src/common/cluster-icons.js.map +1 -0
- package/out/renderer/src/common/dashboard.js +2 -1
- package/out/renderer/src/common/dashboard.js.map +1 -1
- package/out/renderer/src/common/date-time.js +11 -0
- package/out/renderer/src/common/date-time.js.map +1 -0
- package/out/renderer/src/common/monitoring-history.js +2 -0
- package/out/renderer/src/common/monitoring-history.js.map +1 -1
- package/out/renderer/src/common/resource-diagnostics.js.map +1 -1
- package/out/renderer/src/common/settings-export.js.map +1 -1
- package/out/renderer/src/common/store/dashboard-preferences-store.js +2 -1
- package/out/renderer/src/common/store/dashboard-preferences-store.js.map +1 -1
- package/out/renderer/src/common/store/monitoring-preferences-store.js +5 -0
- package/out/renderer/src/common/store/monitoring-preferences-store.js.map +1 -1
- package/out/renderer/welcome.js +28 -6
- package/out/renderer/welcome.js.map +1 -1
- 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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"}
|
package/out/renderer/ai.js
CHANGED
|
@@ -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
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
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",
|
|
346
|
-
|
|
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 =
|
|
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,
|