@64mb/freelens-power 2.2.1 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -152,13 +152,16 @@ var AiPreferences = require__global_external_mobx_react.observer(() => {
152
152
  })
153
153
  })]
154
154
  }),
155
- !isClaude && /* @__PURE__ */ require_jsx_runtime.jsxs("div", {
155
+ /* @__PURE__ */ require_jsx_runtime.jsxs("div", {
156
156
  className: "power-settings-row",
157
157
  style: rowStyle,
158
- children: [/* @__PURE__ */ require_jsx_runtime.jsx("label", {
158
+ children: [/* @__PURE__ */ require_jsx_runtime.jsxs("div", { children: [/* @__PURE__ */ require_jsx_runtime.jsx("label", {
159
159
  htmlFor: "power-ai-speed",
160
160
  children: "Speed"
161
- }), /* @__PURE__ */ require_jsx_runtime.jsx("div", {
161
+ }), isClaude && /* @__PURE__ */ require_jsx_runtime.jsx("div", {
162
+ className: "power-settings-hint",
163
+ children: "Fast mode applies to Opus models. Availability depends on your CLI account."
164
+ })] }), /* @__PURE__ */ require_jsx_runtime.jsx("div", {
162
165
  style: controlStyle,
163
166
  children: /* @__PURE__ */ require_jsx_runtime.jsx(Select, {
164
167
  id: "power-ai-speed",
@@ -1 +1 @@
1
- {"version":3,"file":"ai-preferences.js","names":[],"sources":["../../../src/renderer/preferences/ai-preferences.tsx"],"sourcesContent":["import { Renderer } from \"@freelensapp/extensions\";\nimport { ipcRenderer } from \"electron\";\nimport { observer } from \"mobx-react\";\nimport { useEffect, useState } from \"react\";\nimport { AI_MODELS_CHANNEL, type AiModel } from \"../../common/ai-models\";\nimport { AiPreferencesStore } from \"../../common/store/ai-preferences-store\";\nimport { AiProviderIcon } from \"../ai-provider-icon\";\nimport { AiShortcutsPreferences } from \"./ai-shortcuts-preferences\";\n\nconst { Select, Switch } = Renderer.Component;\n\nexport const AiPreferences = observer(() => {\n const preferences = AiPreferencesStore.getInstanceOrCreate<AiPreferencesStore>();\n const [catalog, setCatalog] = useState<{ provider: string; models: AiModel[] }>({ provider: \"\", models: [] });\n const models = catalog.provider === preferences.provider ? catalog.models : [];\n useEffect(() => {\n if (!preferences.enabled) {\n setCatalog({ provider: preferences.provider, models: [] });\n return;\n }\n setCatalog({ provider: preferences.provider, models: [] });\n const provider = preferences.provider;\n let active = true;\n void ipcRenderer\n .invoke(AI_MODELS_CHANNEL, preferences.provider)\n .then((value: AiModel[]) => {\n if (active && Array.isArray(value)) setCatalog({ provider, models: value });\n })\n .catch(() => {});\n return () => {\n active = false;\n };\n }, [preferences.enabled, preferences.provider]);\n const isClaude = preferences.provider === \"claude\";\n const providerLabel = isClaude ? \"Claude\" : \"Codex\";\n const currentModel = isClaude ? preferences.claudeModel : preferences.model;\n const selectedModel = JSON.stringify([currentModel, isClaude ? \"\" : preferences.reasoningEffort]);\n const modelOptions = [\n { value: JSON.stringify([\"\", \"\"]), label: `${providerLabel} default` },\n ...models.flatMap((model) => [\n { value: JSON.stringify([model.id, \"\"]), label: `${model.label} · Default` },\n ...model.reasoningEfforts.map((effort) => ({\n value: JSON.stringify([model.id, effort]),\n label: `${model.label} · ${effort}`,\n })),\n ]),\n ];\n if (!modelOptions.some((option) => option.value === selectedModel)) {\n modelOptions.push({\n value: selectedModel,\n label: `${currentModel || `${providerLabel} default`} · ${isClaude ? \"Default\" : preferences.reasoningEffort || \"Default\"}`,\n });\n }\n const controlStyle = { width: 220, maxWidth: \"100%\", flexShrink: 0 };\n const rowStyle = { display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", gap: 20 };\n return (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 20 }}>\n <style>{`.power-ai-section-title { color: var(--textColorAccent); } .power-ai-prompt { width: 100%; min-height: 90px; max-height: 260px; field-sizing: content; overflow-y: auto; margin-top: 8px; box-sizing: border-box; padding: 12px; border: 1px solid var(--borderFaintColor, #666); border-radius: 8px; background: var(--mainBackground, #242424); color: var(--textColorPrimary, white); font: inherit; resize: none; } .power-ai-prompt:focus { border-color: var(--primary, #5896ff); outline: 1px solid var(--primary, #5896ff); }`}</style>\n <div>\n <Switch\n checked={preferences.enabled}\n onChange={(value) => {\n preferences.enabled = value;\n }}\n >\n Enable AI features\n </Switch>\n <div className=\"power-settings-hint\">\n Turn off to hide the chat, AI button and Ask about cluster, and stop active requests. Settings and\n conversations are kept.\n </div>\n </div>\n <div className=\"power-settings-row\" style={rowStyle}>\n <label htmlFor=\"power-ai-cli\">CLI</label>\n <div style={controlStyle}>\n <Select\n id=\"power-ai-cli\"\n value={preferences.provider}\n options={[\n { value: \"codex\", label: \"Codex\" },\n { value: \"claude\", label: \"Claude\" },\n ]}\n formatOptionLabel={(option) => (\n <span style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}>\n <AiProviderIcon provider={option.value === \"claude\" ? \"claude\" : \"codex\"} />\n {option.label}\n </span>\n )}\n onChange={(option) => {\n if (option?.value === \"codex\" || option?.value === \"claude\") preferences.provider = option.value;\n }}\n isDisabled={!preferences.enabled}\n isClearable={false}\n isSearchable={false}\n />\n </div>\n </div>\n <div className=\"power-settings-row\" style={rowStyle}>\n <div>\n <label htmlFor=\"power-ai-model\">Model</label>\n <div className=\"power-settings-hint\">\n {isClaude\n ? \"Native Claude model aliases. Availability depends on your CLI account.\"\n : \"Models and reasoning effort from the local Codex catalog.\"}\n </div>\n </div>\n <div style={controlStyle}>\n <Select\n id=\"power-ai-model\"\n value={selectedModel}\n options={modelOptions}\n isDisabled={!preferences.enabled}\n isClearable={false}\n isSearchable={true}\n onChange={(option) => {\n if (!option) return;\n const [model, effort] = JSON.parse(option.value);\n if (isClaude) preferences.claudeModel = model;\n else {\n preferences.model = model;\n preferences.reasoningEffort = effort;\n }\n }}\n />\n </div>\n </div>\n {!isClaude && (\n <div className=\"power-settings-row\" style={rowStyle}>\n <label htmlFor=\"power-ai-speed\">Speed</label>\n <div style={controlStyle}>\n <Select\n id=\"power-ai-speed\"\n value={preferences.speed}\n options={[\n { value: \"default\", label: \"Default\" },\n { value: \"fast\", label: \"Fast\" },\n ]}\n isDisabled={!preferences.enabled}\n isClearable={false}\n isSearchable={false}\n onChange={(option) => {\n if (option) preferences.speed = option.value as \"default\" | \"fast\";\n }}\n />\n </div>\n </div>\n )}\n <div className=\"power-settings-row\" style={rowStyle}>\n <div>\n <label htmlFor=\"power-ai-font-size\">Chat font size</label>\n <div className=\"power-settings-hint\">Messages and input, in pixels (10–24).</div>\n </div>\n <div style={controlStyle}>\n <Select\n id=\"power-ai-font-size\"\n value={preferences.chatFontSize}\n options={Array.from({ length: 15 }, (_, index) => ({ value: index + 10, label: `${index + 10} px` }))}\n isDisabled={!preferences.enabled}\n isSearchable={false}\n isClearable={false}\n onChange={(option) => {\n if (option) preferences.chatFontSize = option.value;\n }}\n />\n </div>\n </div>\n <div>\n <label className=\"power-ai-section-title\" htmlFor=\"power-ai-system-prompt\">\n System prompt\n </label>\n <textarea\n id=\"power-ai-system-prompt\"\n className=\"power-ai-prompt\"\n disabled={!preferences.enabled}\n value={preferences.systemPrompt}\n onChange={(event) => {\n preferences.systemPrompt = event.target.value;\n }}\n />\n </div>\n <div>\n <label className=\"power-ai-section-title\" htmlFor=\"power-ai-cluster-prompt\">\n Cluster prompt\n </label>\n <div className=\"power-settings-hint\">Additional instructions attached to cluster conversations.</div>\n <textarea\n id=\"power-ai-cluster-prompt\"\n className=\"power-ai-prompt\"\n disabled={!preferences.enabled}\n value={preferences.clusterPrompt}\n onChange={(event) => {\n preferences.clusterPrompt = event.target.value;\n }}\n />\n </div>\n <AiShortcutsPreferences disabled={!preferences.enabled} />\n </div>\n );\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"ai-preferences.js","names":[],"sources":["../../../src/renderer/preferences/ai-preferences.tsx"],"sourcesContent":["import { Renderer } from \"@freelensapp/extensions\";\nimport { ipcRenderer } from \"electron\";\nimport { observer } from \"mobx-react\";\nimport { useEffect, useState } from \"react\";\nimport { AI_MODELS_CHANNEL, type AiModel } from \"../../common/ai-models\";\nimport { AiPreferencesStore } from \"../../common/store/ai-preferences-store\";\nimport { AiProviderIcon } from \"../ai-provider-icon\";\nimport { AiShortcutsPreferences } from \"./ai-shortcuts-preferences\";\n\nconst { Select, Switch } = Renderer.Component;\n\nexport const AiPreferences = observer(() => {\n const preferences = AiPreferencesStore.getInstanceOrCreate<AiPreferencesStore>();\n const [catalog, setCatalog] = useState<{ provider: string; models: AiModel[] }>({ provider: \"\", models: [] });\n const models = catalog.provider === preferences.provider ? catalog.models : [];\n useEffect(() => {\n if (!preferences.enabled) {\n setCatalog({ provider: preferences.provider, models: [] });\n return;\n }\n setCatalog({ provider: preferences.provider, models: [] });\n const provider = preferences.provider;\n let active = true;\n void ipcRenderer\n .invoke(AI_MODELS_CHANNEL, preferences.provider)\n .then((value: AiModel[]) => {\n if (active && Array.isArray(value)) setCatalog({ provider, models: value });\n })\n .catch(() => {});\n return () => {\n active = false;\n };\n }, [preferences.enabled, preferences.provider]);\n const isClaude = preferences.provider === \"claude\";\n const providerLabel = isClaude ? \"Claude\" : \"Codex\";\n const currentModel = isClaude ? preferences.claudeModel : preferences.model;\n const selectedModel = JSON.stringify([currentModel, isClaude ? \"\" : preferences.reasoningEffort]);\n const modelOptions = [\n { value: JSON.stringify([\"\", \"\"]), label: `${providerLabel} default` },\n ...models.flatMap((model) => [\n { value: JSON.stringify([model.id, \"\"]), label: `${model.label} · Default` },\n ...model.reasoningEfforts.map((effort) => ({\n value: JSON.stringify([model.id, effort]),\n label: `${model.label} · ${effort}`,\n })),\n ]),\n ];\n if (!modelOptions.some((option) => option.value === selectedModel)) {\n modelOptions.push({\n value: selectedModel,\n label: `${currentModel || `${providerLabel} default`} · ${isClaude ? \"Default\" : preferences.reasoningEffort || \"Default\"}`,\n });\n }\n const controlStyle = { width: 220, maxWidth: \"100%\", flexShrink: 0 };\n const rowStyle = { display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", gap: 20 };\n return (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 20 }}>\n <style>{`.power-ai-section-title { color: var(--textColorAccent); } .power-ai-prompt { width: 100%; min-height: 90px; max-height: 260px; field-sizing: content; overflow-y: auto; margin-top: 8px; box-sizing: border-box; padding: 12px; border: 1px solid var(--borderFaintColor, #666); border-radius: 8px; background: var(--mainBackground, #242424); color: var(--textColorPrimary, white); font: inherit; resize: none; } .power-ai-prompt:focus { border-color: var(--primary, #5896ff); outline: 1px solid var(--primary, #5896ff); }`}</style>\n <div>\n <Switch\n checked={preferences.enabled}\n onChange={(value) => {\n preferences.enabled = value;\n }}\n >\n Enable AI features\n </Switch>\n <div className=\"power-settings-hint\">\n Turn off to hide the chat, AI button and Ask about cluster, and stop active requests. Settings and\n conversations are kept.\n </div>\n </div>\n <div className=\"power-settings-row\" style={rowStyle}>\n <label htmlFor=\"power-ai-cli\">CLI</label>\n <div style={controlStyle}>\n <Select\n id=\"power-ai-cli\"\n value={preferences.provider}\n options={[\n { value: \"codex\", label: \"Codex\" },\n { value: \"claude\", label: \"Claude\" },\n ]}\n formatOptionLabel={(option) => (\n <span style={{ display: \"inline-flex\", alignItems: \"center\", gap: 8 }}>\n <AiProviderIcon provider={option.value === \"claude\" ? \"claude\" : \"codex\"} />\n {option.label}\n </span>\n )}\n onChange={(option) => {\n if (option?.value === \"codex\" || option?.value === \"claude\") preferences.provider = option.value;\n }}\n isDisabled={!preferences.enabled}\n isClearable={false}\n isSearchable={false}\n />\n </div>\n </div>\n <div className=\"power-settings-row\" style={rowStyle}>\n <div>\n <label htmlFor=\"power-ai-model\">Model</label>\n <div className=\"power-settings-hint\">\n {isClaude\n ? \"Native Claude model aliases. Availability depends on your CLI account.\"\n : \"Models and reasoning effort from the local Codex catalog.\"}\n </div>\n </div>\n <div style={controlStyle}>\n <Select\n id=\"power-ai-model\"\n value={selectedModel}\n options={modelOptions}\n isDisabled={!preferences.enabled}\n isClearable={false}\n isSearchable={true}\n onChange={(option) => {\n if (!option) return;\n const [model, effort] = JSON.parse(option.value);\n if (isClaude) preferences.claudeModel = model;\n else {\n preferences.model = model;\n preferences.reasoningEffort = effort;\n }\n }}\n />\n </div>\n </div>\n <div className=\"power-settings-row\" style={rowStyle}>\n <div>\n <label htmlFor=\"power-ai-speed\">Speed</label>\n {isClaude && (\n <div className=\"power-settings-hint\">\n Fast mode applies to Opus models. Availability depends on your CLI account.\n </div>\n )}\n </div>\n <div style={controlStyle}>\n <Select\n id=\"power-ai-speed\"\n value={preferences.speed}\n options={[\n { value: \"default\", label: \"Default\" },\n { value: \"fast\", label: \"Fast\" },\n ]}\n isDisabled={!preferences.enabled}\n isClearable={false}\n isSearchable={false}\n onChange={(option) => {\n if (option) preferences.speed = option.value as \"default\" | \"fast\";\n }}\n />\n </div>\n </div>\n <div className=\"power-settings-row\" style={rowStyle}>\n <div>\n <label htmlFor=\"power-ai-font-size\">Chat font size</label>\n <div className=\"power-settings-hint\">Messages and input, in pixels (10–24).</div>\n </div>\n <div style={controlStyle}>\n <Select\n id=\"power-ai-font-size\"\n value={preferences.chatFontSize}\n options={Array.from({ length: 15 }, (_, index) => ({ value: index + 10, label: `${index + 10} px` }))}\n isDisabled={!preferences.enabled}\n isSearchable={false}\n isClearable={false}\n onChange={(option) => {\n if (option) preferences.chatFontSize = option.value;\n }}\n />\n </div>\n </div>\n <div>\n <label className=\"power-ai-section-title\" htmlFor=\"power-ai-system-prompt\">\n System prompt\n </label>\n <textarea\n id=\"power-ai-system-prompt\"\n className=\"power-ai-prompt\"\n disabled={!preferences.enabled}\n value={preferences.systemPrompt}\n onChange={(event) => {\n preferences.systemPrompt = event.target.value;\n }}\n />\n </div>\n <div>\n <label className=\"power-ai-section-title\" htmlFor=\"power-ai-cluster-prompt\">\n Cluster prompt\n </label>\n <div className=\"power-settings-hint\">Additional instructions attached to cluster conversations.</div>\n <textarea\n id=\"power-ai-cluster-prompt\"\n className=\"power-ai-prompt\"\n disabled={!preferences.enabled}\n value={preferences.clusterPrompt}\n onChange={(event) => {\n preferences.clusterPrompt = event.target.value;\n }}\n />\n </div>\n <AiShortcutsPreferences disabled={!preferences.enabled} />\n </div>\n );\n});\n"],"mappings":"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"}
@@ -136,14 +136,13 @@ var MonitoringPreferences = require__global_external_mobx_react.observer(() => {
136
136
  children: status?.error ?? (status?.available ? `${status.samples.toLocaleString()} metric buckets · 7-day retention` : "Checking history storage…")
137
137
  })
138
138
  ]
139
- }), /* @__PURE__ */ require_jsx_runtime.jsxs(require_extensions.Renderer.Component.Button, {
139
+ }), /* @__PURE__ */ require_jsx_runtime.jsx(require_extensions.Renderer.Component.Button, {
140
140
  tooltip: "Delete locally collected metric history without changing other settings",
141
141
  style: {
142
142
  flexShrink: 0,
143
143
  display: "inline-flex",
144
144
  alignItems: "center",
145
145
  justifyContent: "center",
146
- gap: 6,
147
146
  height: 30,
148
147
  padding: "0 10px",
149
148
  fontSize: 12,
@@ -162,10 +161,19 @@ var MonitoringPreferences = require__global_external_mobx_react.observer(() => {
162
161
  error: "Unable to clear local history. Try again."
163
162
  })));
164
163
  },
165
- children: [/* @__PURE__ */ require_jsx_runtime.jsx(require_extensions.Renderer.Component.Icon, {
166
- material: "delete_outline",
167
- size: 14
168
- }), /* @__PURE__ */ require_jsx_runtime.jsx("span", { children: "Clear" })]
164
+ children: /* @__PURE__ */ require_jsx_runtime.jsxs("span", {
165
+ style: {
166
+ display: "inline-flex",
167
+ alignItems: "center",
168
+ justifyContent: "center",
169
+ gap: 6
170
+ },
171
+ children: [/* @__PURE__ */ require_jsx_runtime.jsx(require_extensions.Renderer.Component.Icon, {
172
+ material: "delete_outline",
173
+ size: 14,
174
+ "aria-hidden": "true"
175
+ }), /* @__PURE__ */ require_jsx_runtime.jsx("span", { children: "Clear" })]
176
+ })
169
177
  })]
170
178
  })
171
179
  ]
@@ -1 +1 @@
1
- {"version":3,"file":"monitoring-preferences.js","names":[],"sources":["../../../src/renderer/preferences/monitoring-preferences.tsx"],"sourcesContent":["import { Renderer } from \"@freelensapp/extensions\";\nimport { observer } from \"mobx-react\";\nimport { useEffect, useState } from \"react\";\nimport { HISTORY_MAX_BYTES, type HistoryStatus } from \"../../common/monitoring-history\";\nimport { MonitoringPreferencesStore } from \"../../common/store/monitoring-preferences-store\";\nimport { monitoringHistory } from \"../monitoring-history\";\nimport { NativeTooltip } from \"../native-tooltip\";\n\nexport const MonitoringPreferences = observer(() => {\n const preferences = MonitoringPreferencesStore.getInstanceOrCreate<MonitoringPreferencesStore>();\n const [status, setStatus] = useState<HistoryStatus>();\n const refresh = () => {\n void monitoringHistory\n .status()\n .then(setStatus)\n .catch(() =>\n setStatus({\n available: false,\n enabled: preferences.historyEnabled,\n bytes: 0,\n samples: 0,\n error: \"History service unavailable\",\n }),\n );\n };\n useEffect(refresh, [preferences.historyEnabled]);\n return (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 20 }}>\n <div>\n <Renderer.Component.Switch\n checked={preferences.diagnosticsVisible}\n onChange={(value) => {\n preferences.diagnosticsVisible = value;\n }}\n >\n Show Diagnostics in sidebar\n </Renderer.Component.Switch>\n <div className=\"power-settings-hint\">Resource consumers, application events and Pending diagnostics.</div>\n </div>\n <div>\n <Renderer.Component.Switch\n checked={preferences.relationshipsVisible}\n onChange={(value) => {\n preferences.relationshipsVisible = value;\n }}\n >\n Show Relationships in sidebar\n </Renderer.Component.Switch>\n <div className=\"power-settings-hint\">\n Focused resource connections from API evidence, with links to related objects.\n </div>\n </div>\n <div>\n <Renderer.Component.Switch\n checked={preferences.resourceSearchEnabled}\n onChange={(value) => {\n preferences.resourceSearchEnabled = value;\n }}\n >\n Enable resource search (Shift–Shift)\n </Renderer.Component.Switch>\n <div className=\"power-settings-hint\">\n Search resources with Shift–Shift. Turning this off stops keyboard search and background indexing.\n </div>\n </div>\n <div>\n <Renderer.Component.Switch\n checked={preferences.enabled}\n onChange={(value) => {\n preferences.enabled = value;\n }}\n >\n Metrics-server monitoring\n </Renderer.Component.Switch>\n <div className=\"power-settings-hint\">\n CPU/RAM charts for clusters, nodes and pods. Keeps 30 minutes of live samples.\n </div>\n </div>\n <div>\n <Renderer.Component.Switch\n checked={preferences.historyEnabled}\n onChange={(value) => {\n preferences.historyEnabled = value;\n }}\n >\n Keep local history\n </Renderer.Component.Switch>\n <NativeTooltip title=\"SQLite storage. Collects while the cluster view is active. Resolution: 30 seconds for 2 hours, 5 minutes for 24 hours, 30 minutes for 7 days. Disabling preserves saved history.\">\n <div className=\"power-settings-hint\">Up to 7 days, limited to 100 MiB.</div>\n </NativeTooltip>\n </div>\n <div style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", gap: 12 }}>\n <div style={{ flex: 1, minWidth: 0 }} role=\"status\">\n <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"baseline\", gap: 12 }}>\n <span>Local storage</span>\n <span style={{ fontVariantNumeric: \"tabular-nums\", color: \"var(--textColorSecondary)\" }}>\n {status?.available\n ? `${(status.bytes / 1024 / 1024).toFixed(2)} / ${HISTORY_MAX_BYTES / 1024 / 1024} MiB`\n : \"— / 100 MiB\"}\n </span>\n </div>\n {status?.available && (\n <div\n role=\"progressbar\"\n aria-label=\"Local history storage\"\n aria-valuemin={0}\n aria-valuemax={HISTORY_MAX_BYTES}\n aria-valuenow={status.bytes}\n aria-valuetext={`${(status.bytes / 1024 / 1024).toFixed(2)} of 100 MiB`}\n style={{ height: 4, marginTop: 8, borderRadius: 2, overflow: \"hidden\", background: \"var(--borderColor)\" }}\n >\n <div\n style={{\n height: \"100%\",\n width: `${Math.min(100, Math.max(0, (status.bytes / HISTORY_MAX_BYTES) * 100))}%`,\n background: \"var(--primary)\",\n transition: \"width 180ms ease\",\n }}\n />\n </div>\n )}\n <div className=\"power-settings-hint\" style={{ marginTop: 6 }}>\n {status?.error ??\n (status?.available\n ? `${status.samples.toLocaleString()} metric buckets · 7-day retention`\n : \"Checking history storage…\")}\n </div>\n </div>\n <Renderer.Component.Button\n tooltip=\"Delete locally collected metric history without changing other settings\"\n style={{\n flexShrink: 0,\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 6,\n height: 30,\n padding: \"0 10px\",\n fontSize: 12,\n lineHeight: \"16px\",\n border: \"1px solid var(--borderFaintColor)\",\n borderRadius: 6,\n background: \"var(--contentColor)\",\n color: \"var(--textColorSecondary)\",\n }}\n onClick={() => {\n void monitoringHistory\n .clear()\n .then(refresh)\n .catch(() =>\n setStatus((previous) => ({\n available: previous?.available ?? false,\n enabled: preferences.historyEnabled,\n bytes: previous?.bytes ?? 0,\n samples: previous?.samples ?? 0,\n error: \"Unable to clear local history. Try again.\",\n })),\n );\n }}\n >\n <Renderer.Component.Icon material=\"delete_outline\" size={14} />\n <span>Clear</span>\n </Renderer.Component.Button>\n </div>\n </div>\n );\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"monitoring-preferences.js","names":[],"sources":["../../../src/renderer/preferences/monitoring-preferences.tsx"],"sourcesContent":["import { Renderer } from \"@freelensapp/extensions\";\nimport { observer } from \"mobx-react\";\nimport { useEffect, useState } from \"react\";\nimport { HISTORY_MAX_BYTES, type HistoryStatus } from \"../../common/monitoring-history\";\nimport { MonitoringPreferencesStore } from \"../../common/store/monitoring-preferences-store\";\nimport { monitoringHistory } from \"../monitoring-history\";\nimport { NativeTooltip } from \"../native-tooltip\";\n\nexport const MonitoringPreferences = observer(() => {\n const preferences = MonitoringPreferencesStore.getInstanceOrCreate<MonitoringPreferencesStore>();\n const [status, setStatus] = useState<HistoryStatus>();\n const refresh = () => {\n void monitoringHistory\n .status()\n .then(setStatus)\n .catch(() =>\n setStatus({\n available: false,\n enabled: preferences.historyEnabled,\n bytes: 0,\n samples: 0,\n error: \"History service unavailable\",\n }),\n );\n };\n useEffect(refresh, [preferences.historyEnabled]);\n return (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 20 }}>\n <div>\n <Renderer.Component.Switch\n checked={preferences.diagnosticsVisible}\n onChange={(value) => {\n preferences.diagnosticsVisible = value;\n }}\n >\n Show Diagnostics in sidebar\n </Renderer.Component.Switch>\n <div className=\"power-settings-hint\">Resource consumers, application events and Pending diagnostics.</div>\n </div>\n <div>\n <Renderer.Component.Switch\n checked={preferences.relationshipsVisible}\n onChange={(value) => {\n preferences.relationshipsVisible = value;\n }}\n >\n Show Relationships in sidebar\n </Renderer.Component.Switch>\n <div className=\"power-settings-hint\">\n Focused resource connections from API evidence, with links to related objects.\n </div>\n </div>\n <div>\n <Renderer.Component.Switch\n checked={preferences.resourceSearchEnabled}\n onChange={(value) => {\n preferences.resourceSearchEnabled = value;\n }}\n >\n Enable resource search (Shift–Shift)\n </Renderer.Component.Switch>\n <div className=\"power-settings-hint\">\n Search resources with Shift–Shift. Turning this off stops keyboard search and background indexing.\n </div>\n </div>\n <div>\n <Renderer.Component.Switch\n checked={preferences.enabled}\n onChange={(value) => {\n preferences.enabled = value;\n }}\n >\n Metrics-server monitoring\n </Renderer.Component.Switch>\n <div className=\"power-settings-hint\">\n CPU/RAM charts for clusters, nodes and pods. Keeps 30 minutes of live samples.\n </div>\n </div>\n <div>\n <Renderer.Component.Switch\n checked={preferences.historyEnabled}\n onChange={(value) => {\n preferences.historyEnabled = value;\n }}\n >\n Keep local history\n </Renderer.Component.Switch>\n <NativeTooltip title=\"SQLite storage. Collects while the cluster view is active. Resolution: 30 seconds for 2 hours, 5 minutes for 24 hours, 30 minutes for 7 days. Disabling preserves saved history.\">\n <div className=\"power-settings-hint\">Up to 7 days, limited to 100 MiB.</div>\n </NativeTooltip>\n </div>\n <div style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", gap: 12 }}>\n <div style={{ flex: 1, minWidth: 0 }} role=\"status\">\n <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"baseline\", gap: 12 }}>\n <span>Local storage</span>\n <span style={{ fontVariantNumeric: \"tabular-nums\", color: \"var(--textColorSecondary)\" }}>\n {status?.available\n ? `${(status.bytes / 1024 / 1024).toFixed(2)} / ${HISTORY_MAX_BYTES / 1024 / 1024} MiB`\n : \"— / 100 MiB\"}\n </span>\n </div>\n {status?.available && (\n <div\n role=\"progressbar\"\n aria-label=\"Local history storage\"\n aria-valuemin={0}\n aria-valuemax={HISTORY_MAX_BYTES}\n aria-valuenow={status.bytes}\n aria-valuetext={`${(status.bytes / 1024 / 1024).toFixed(2)} of 100 MiB`}\n style={{ height: 4, marginTop: 8, borderRadius: 2, overflow: \"hidden\", background: \"var(--borderColor)\" }}\n >\n <div\n style={{\n height: \"100%\",\n width: `${Math.min(100, Math.max(0, (status.bytes / HISTORY_MAX_BYTES) * 100))}%`,\n background: \"var(--primary)\",\n transition: \"width 180ms ease\",\n }}\n />\n </div>\n )}\n <div className=\"power-settings-hint\" style={{ marginTop: 6 }}>\n {status?.error ??\n (status?.available\n ? `${status.samples.toLocaleString()} metric buckets · 7-day retention`\n : \"Checking history storage…\")}\n </div>\n </div>\n <Renderer.Component.Button\n tooltip=\"Delete locally collected metric history without changing other settings\"\n style={{\n flexShrink: 0,\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: 30,\n padding: \"0 10px\",\n fontSize: 12,\n lineHeight: \"16px\",\n border: \"1px solid var(--borderFaintColor)\",\n borderRadius: 6,\n background: \"var(--contentColor)\",\n color: \"var(--textColorSecondary)\",\n }}\n onClick={() => {\n void monitoringHistory\n .clear()\n .then(refresh)\n .catch(() =>\n setStatus((previous) => ({\n available: previous?.available ?? false,\n enabled: preferences.historyEnabled,\n bytes: previous?.bytes ?? 0,\n samples: previous?.samples ?? 0,\n error: \"Unable to clear local history. Try again.\",\n })),\n );\n }}\n >\n <span style={{ display: \"inline-flex\", alignItems: \"center\", justifyContent: \"center\", gap: 6 }}>\n <Renderer.Component.Icon material=\"delete_outline\" size={14} aria-hidden=\"true\" />\n <span>Clear</span>\n </span>\n </Renderer.Component.Button>\n </div>\n </div>\n );\n});\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@64mb/freelens-power",
3
- "version": "2.2.1",
3
+ "version": "2.3.0",
4
4
  "description": "Power tools for Freelens Kubernetes IDE",
5
5
  "main": "out/main/index.js",
6
6
  "renderer": "out/renderer/index.js",