opencode-system-metrics-tui 0.1.7 → 0.1.10
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 +15 -10
- package/dist/tui.js +127 -33
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
## Install globally in OpenCode
|
|
4
4
|
|
|
5
5
|
```powershell
|
|
6
|
-
opencode plugin -g opencode-system-metrics-tui@0.1.
|
|
6
|
+
opencode plugin -g opencode-system-metrics-tui@0.1.10 --force
|
|
7
7
|
```
|
|
8
8
|
|
|
9
9
|
This is the primary installation path. The version must match `package.json`; `--force` asks OpenCode to refresh its package cache. The helper below skips OpenCode when the expected artifact is already current. Verify the actual installed artifact afterward:
|
|
@@ -31,12 +31,14 @@ The README is available in **Español**, **English**, and **Português**.
|
|
|
31
31
|
- RAM: memoria usada, total y porcentaje.
|
|
32
32
|
- GPU: utilización y temperatura.
|
|
33
33
|
- GPU VRAM: memoria usada, total y porcentaje.
|
|
34
|
+
- En Apple Silicon, la fila se muestra como **RAM** y usa los contadores generales de memoria del sistema.
|
|
34
35
|
- Red: velocidad de descarga y subida en tiempo real.
|
|
35
36
|
- CPU, RAM y red se consultan con una cadencia general de 2 segundos; GPU, VRAM y temperaturas usan una caché expirable de 10 segundos para reducir el coste sin congelar los sensores.
|
|
36
37
|
- Colores compatibles con el tema activo de OpenCode.
|
|
37
38
|
- Iconos Unicode por defecto en Windows (la detección de fuentes instaladas no cambia la selección); Linux/macOS usan Nerd Font solo si está instalada y mantienen fallback Unicode.
|
|
38
39
|
- En Windows usa iconos Unicode visibles de forma predeterminada, porque OpenCode no puede detectar la fuente activa de la terminal.
|
|
39
40
|
- Soporte para Linux, macOS y Windows cuando el sistema expone las métricas.
|
|
41
|
+
- En macOS, la utilización de GPU usa `ioreg` y las temperaturas usan el helper de Stats si está instalado; si cualquiera de ellos falta, esa métrica queda como no disponible sin interrumpir el plugin. En Intel se conserva el fallback de GPU discreta de `systeminformation`.
|
|
40
42
|
- En Windows, la temperatura de CPU requiere LibreHardwareMonitor ejecutándose como administrador con **Remote Web Server** activo en `http://127.0.0.1:8085`.
|
|
41
43
|
- En Windows, la velocidad de red usa PowerShell y `Get-NetAdapterStatistics`; no agrega una dependencia npm.
|
|
42
44
|
- Las lecturas opcionales de Windows se hacen bajo demanda, con timeout y caché; no hay timers globales de PowerShell.
|
|
@@ -91,7 +93,7 @@ npm publish --access public
|
|
|
91
93
|
En otro equipo:
|
|
92
94
|
|
|
93
95
|
```bash
|
|
94
|
-
opencode plugin opencode-system-metrics-tui@0.1.
|
|
96
|
+
opencode plugin opencode-system-metrics-tui@0.1.10
|
|
95
97
|
```
|
|
96
98
|
|
|
97
99
|
El paquete exporta tanto la raíz (`opencode-system-metrics-tui`) como `./tui`; ambas rutas cargan el mismo bundle TUI.
|
|
@@ -101,8 +103,8 @@ El instalador de OpenCode configura el plugin TUI automáticamente. Reinicia Ope
|
|
|
101
103
|
Publicar en npm e instalar en OpenCode son pasos distintos:
|
|
102
104
|
|
|
103
105
|
- `npm publish --access public` publica el paquete en npm.
|
|
104
|
-
- `opencode plugin opencode-system-metrics-tui@0.1.
|
|
105
|
-
- `opencode plugin -g opencode-system-metrics-tui@0.1.
|
|
106
|
+
- `opencode plugin opencode-system-metrics-tui@0.1.10` lo instala solo en el proyecto actual.
|
|
107
|
+
- `opencode plugin -g opencode-system-metrics-tui@0.1.10 --force` lo instala globalmente para todos los proyectos.
|
|
106
108
|
|
|
107
109
|
### Verificación
|
|
108
110
|
|
|
@@ -124,12 +126,14 @@ npm run build
|
|
|
124
126
|
- RAM: used memory, total memory, and percentage.
|
|
125
127
|
- GPU: utilization and temperature.
|
|
126
128
|
- GPU VRAM: used memory, total memory, and percentage.
|
|
129
|
+
- On Apple Silicon, the row is labeled **RAM** and uses the system-wide memory counters.
|
|
127
130
|
- Network: live download and upload speeds.
|
|
128
131
|
- CPU, RAM, and network use the 2-second general cadence; GPU, VRAM, and temperatures use an expiring 10-second cache to reduce cost without freezing sensors.
|
|
129
132
|
- Uses the active OpenCode theme colors.
|
|
130
133
|
- Windows uses Unicode icons by default (installed-font detection does not change selection); Linux/macOS use Nerd Font only when installed and retain Unicode fallback.
|
|
131
134
|
- On Windows, visible Unicode icons are used by default because OpenCode cannot detect the terminal's active font.
|
|
132
135
|
- Supports Linux, macOS, and Windows when the operating system exposes the metrics.
|
|
136
|
+
- On macOS, GPU utilization uses `ioreg` and temperatures use the Stats helper when installed; missing helpers leave only that metric unavailable without interrupting the plugin. Intel retains the discrete-GPU `systeminformation` fallback.
|
|
133
137
|
- On Windows, CPU temperature requires LibreHardwareMonitor running as administrator with **Remote Web Server** enabled at `http://127.0.0.1:8085`.
|
|
134
138
|
- On Windows, network speed uses PowerShell and `Get-NetAdapterStatistics`; it adds no npm dependency.
|
|
135
139
|
- Optional Windows reads are on demand, timeout-bounded, and cached; no global PowerShell timers are used.
|
|
@@ -184,7 +188,7 @@ npm publish --access public
|
|
|
184
188
|
On another machine:
|
|
185
189
|
|
|
186
190
|
```bash
|
|
187
|
-
opencode plugin opencode-system-metrics-tui@0.1.
|
|
191
|
+
opencode plugin opencode-system-metrics-tui@0.1.10
|
|
188
192
|
```
|
|
189
193
|
|
|
190
194
|
The package exports both the root (`opencode-system-metrics-tui`) and `./tui`; both paths load the same TUI bundle.
|
|
@@ -194,8 +198,8 @@ The OpenCode installer configures the TUI plugin automatically. Restart OpenCode
|
|
|
194
198
|
Publishing to npm and installing in OpenCode are separate steps:
|
|
195
199
|
|
|
196
200
|
- `npm publish --access public` publishes the package to npm.
|
|
197
|
-
- `opencode plugin opencode-system-metrics-tui@0.1.
|
|
198
|
-
- `opencode plugin -g opencode-system-metrics-tui@0.1.
|
|
201
|
+
- `opencode plugin opencode-system-metrics-tui@0.1.10` installs it for the current project only.
|
|
202
|
+
- `opencode plugin -g opencode-system-metrics-tui@0.1.10 --force` installs it globally for all projects.
|
|
199
203
|
|
|
200
204
|
### Verification
|
|
201
205
|
|
|
@@ -217,6 +221,7 @@ npm run build
|
|
|
217
221
|
- RAM: memória usada, total e porcentagem.
|
|
218
222
|
- GPU: utilização e temperatura.
|
|
219
223
|
- GPU VRAM: memória usada, total e porcentagem.
|
|
224
|
+
- No Apple Silicon, a linha de memória compartilhada é exibida como **RAM** e usa os contadores gerais de memória do sistema.
|
|
220
225
|
- Rede: velocidades de download e upload em tempo real.
|
|
221
226
|
- CPU, RAM e rede usam a cadência geral de 2 segundos; GPU, VRAM e temperaturas usam uma cache expirável de 10 segundos para reduzir o custo sem congelar os sensores.
|
|
222
227
|
- Usa as cores do tema ativo do OpenCode.
|
|
@@ -277,7 +282,7 @@ npm publish --access public
|
|
|
277
282
|
Em outro computador:
|
|
278
283
|
|
|
279
284
|
```bash
|
|
280
|
-
opencode plugin opencode-system-metrics-tui@0.1.
|
|
285
|
+
opencode plugin opencode-system-metrics-tui@0.1.10
|
|
281
286
|
```
|
|
282
287
|
|
|
283
288
|
O pacote exporta tanto a raiz (`opencode-system-metrics-tui`) quanto `./tui`; os dois caminhos carregam o mesmo bundle TUI.
|
|
@@ -287,8 +292,8 @@ O instalador do OpenCode configura o plugin TUI automaticamente. Reinicie o Open
|
|
|
287
292
|
Publicar no npm e instalar no OpenCode são etapas diferentes:
|
|
288
293
|
|
|
289
294
|
- `npm publish --access public` publica o pacote no npm.
|
|
290
|
-
- `opencode plugin opencode-system-metrics-tui@0.1.
|
|
291
|
-
- `opencode plugin -g opencode-system-metrics-tui@0.1.
|
|
295
|
+
- `opencode plugin opencode-system-metrics-tui@0.1.10` instala o plugin apenas no projeto atual.
|
|
296
|
+
- `opencode plugin -g opencode-system-metrics-tui@0.1.10 --force` instala o plugin globalmente para todos os projetos.
|
|
292
297
|
|
|
293
298
|
### Verificação
|
|
294
299
|
|
package/dist/tui.js
CHANGED
|
@@ -6,7 +6,7 @@ import { insertNode as _$insertNode } from "@opentui/solid";
|
|
|
6
6
|
import { insert as _$insert } from "@opentui/solid";
|
|
7
7
|
import { setProp as _$setProp } from "@opentui/solid";
|
|
8
8
|
import { createElement as _$createElement } from "@opentui/solid";
|
|
9
|
-
import { createSignal, onCleanup, onMount } from "solid-js";
|
|
9
|
+
import { createMemo, createSignal, onCleanup, onMount } from "solid-js";
|
|
10
10
|
import { TextAttributes } from "@opentui/core";
|
|
11
11
|
|
|
12
12
|
// src/format.ts
|
|
@@ -44,12 +44,67 @@ var DEFAULT_METRIC_TIMEOUT_MS = 1500;
|
|
|
44
44
|
var WINDOWS_MEMORY_TIMEOUT_MS = 5000;
|
|
45
45
|
var WINDOWS_NETWORK_PROCESS_TIMEOUT_MS = 4000;
|
|
46
46
|
var WINDOWS_NETWORK_OUTER_TIMEOUT_MS = 4500;
|
|
47
|
+
var MAC_METRIC_TIMEOUT_MS = 1500;
|
|
48
|
+
var MAC_STATS_HELPER = "/Applications/Stats.app/Contents/Resources/smc";
|
|
49
|
+
var runCommand = async (command, args, timeoutMs) => {
|
|
50
|
+
const { stdout } = await execFileAsync(command, args, { timeout: timeoutMs, maxBuffer: 1024 * 1024 });
|
|
51
|
+
return stdout;
|
|
52
|
+
};
|
|
53
|
+
async function detectMacHardwareArchitecture(runner = runCommand, processArchitecture = process.arch) {
|
|
54
|
+
try {
|
|
55
|
+
const output = (await runner("sysctl", ["-in", "hw.optional.arm64"], MAC_METRIC_TIMEOUT_MS)).trim();
|
|
56
|
+
if (output === "1")
|
|
57
|
+
return "arm64";
|
|
58
|
+
if (output === "0")
|
|
59
|
+
return "x86_64";
|
|
60
|
+
} catch {}
|
|
61
|
+
return processArchitecture === "arm64" ? "arm64" : "x86_64";
|
|
62
|
+
}
|
|
63
|
+
function gpuMemoryLabel(architecture, platform = process.platform) {
|
|
64
|
+
if (platform !== "darwin")
|
|
65
|
+
return "GPU VRAM";
|
|
66
|
+
if (architecture === "arm64")
|
|
67
|
+
return "RAM";
|
|
68
|
+
if (architecture === "x86_64")
|
|
69
|
+
return "GPU VRAM";
|
|
70
|
+
return "Memory";
|
|
71
|
+
}
|
|
47
72
|
function parseMonitorTemperature(value) {
|
|
48
73
|
if (value === undefined)
|
|
49
74
|
return;
|
|
50
75
|
const parsed = Number(value.replace(",", ".").replace(/[^\d.-]/g, ""));
|
|
51
76
|
return Number.isFinite(parsed) ? parsed : undefined;
|
|
52
77
|
}
|
|
78
|
+
function parseMacGpuUtilization(stdout) {
|
|
79
|
+
const match = stdout.match(/"Device Utilization %"\s*=\s*([\d]+(?:\.\d+)?)/);
|
|
80
|
+
if (match === null)
|
|
81
|
+
return;
|
|
82
|
+
const value = Number(match[1]);
|
|
83
|
+
return Number.isFinite(value) && value >= 0 && value <= 100 ? value : undefined;
|
|
84
|
+
}
|
|
85
|
+
function parseMacStatsTemperature(stdout, sensorPrefix) {
|
|
86
|
+
let maximum;
|
|
87
|
+
for (const line of stdout.split(/\r?\n/)) {
|
|
88
|
+
const fields = line.trim().split(/\s+/);
|
|
89
|
+
if (fields.length < 2 || !new RegExp(`^\\[${sensorPrefix}`).test(fields[0]))
|
|
90
|
+
continue;
|
|
91
|
+
const value = Number(fields[1].replace(",", ".").replace(/[°cC]/g, ""));
|
|
92
|
+
if (Number.isFinite(value) && value > 0 && (maximum === undefined || value > maximum))
|
|
93
|
+
maximum = value;
|
|
94
|
+
}
|
|
95
|
+
return maximum;
|
|
96
|
+
}
|
|
97
|
+
async function readMacMetrics(runner = runCommand) {
|
|
98
|
+
const [gpuOutput, temperatureOutput] = await Promise.all([
|
|
99
|
+
runner("ioreg", ["-r", "-d", "1", "-c", "IOAccelerator"], MAC_METRIC_TIMEOUT_MS).catch(() => ""),
|
|
100
|
+
runner(MAC_STATS_HELPER, ["list", "-t"], MAC_METRIC_TIMEOUT_MS).catch(() => "")
|
|
101
|
+
]);
|
|
102
|
+
return {
|
|
103
|
+
gpuPercent: parseMacGpuUtilization(gpuOutput) ?? null,
|
|
104
|
+
cpuTemperatureCelsius: parseMacStatsTemperature(temperatureOutput, "Tp") ?? null,
|
|
105
|
+
gpuTemperatureCelsius: parseMacStatsTemperature(temperatureOutput, "Tg") ?? null
|
|
106
|
+
};
|
|
107
|
+
}
|
|
53
108
|
async function readLibreHardwareMonitorTemperature() {
|
|
54
109
|
const response = await fetch("http://127.0.0.1:8085/data.json", { signal: AbortSignal.timeout(2000) });
|
|
55
110
|
if (!response.ok)
|
|
@@ -105,6 +160,7 @@ var unavailable = {
|
|
|
105
160
|
gpuMemoryUsedBytes: null,
|
|
106
161
|
gpuMemoryTotalBytes: null,
|
|
107
162
|
gpuMemoryPercent: null,
|
|
163
|
+
gpuMemoryIsUnified: null,
|
|
108
164
|
downloadBytesPerSecond: null,
|
|
109
165
|
uploadBytesPerSecond: null
|
|
110
166
|
};
|
|
@@ -129,7 +185,15 @@ var SLOW_METRIC_CACHE_MS = 1e4;
|
|
|
129
185
|
var TEMPERATURE_CACHE_MS = 1e4;
|
|
130
186
|
var OPTIONAL_SOURCE_BACKOFF_MS = 30000;
|
|
131
187
|
var isWindows = process.platform === "win32";
|
|
188
|
+
var isMac = process.platform === "darwin";
|
|
132
189
|
var NETWORK_CACHE_MS = 2000;
|
|
190
|
+
var macHardwareArchitecture;
|
|
191
|
+
function readMacHardwareArchitecture() {
|
|
192
|
+
if (!isMac)
|
|
193
|
+
return Promise.resolve("x86_64");
|
|
194
|
+
macHardwareArchitecture ??= detectMacHardwareArchitecture();
|
|
195
|
+
return macHardwareArchitecture;
|
|
196
|
+
}
|
|
133
197
|
function selectGpuMetrics(graphics) {
|
|
134
198
|
const empty = {
|
|
135
199
|
gpuPercent: null,
|
|
@@ -211,6 +275,11 @@ var cachedGraphics = {
|
|
|
211
275
|
lastAttemptAt: 0,
|
|
212
276
|
inFlight: undefined
|
|
213
277
|
};
|
|
278
|
+
var cachedMacMetrics = {
|
|
279
|
+
value: undefined,
|
|
280
|
+
lastAttemptAt: 0,
|
|
281
|
+
inFlight: undefined
|
|
282
|
+
};
|
|
214
283
|
var cachedNetwork = {
|
|
215
284
|
value: undefined,
|
|
216
285
|
lastAttemptAt: 0,
|
|
@@ -252,14 +321,16 @@ async function readWindowsCpuTemperature() {
|
|
|
252
321
|
return value === undefined ? undefined : { main: value };
|
|
253
322
|
}
|
|
254
323
|
async function readMetrics() {
|
|
255
|
-
const [load, memory] = await Promise.allSettled([
|
|
324
|
+
const [load, memory, hardwareArchitecture] = await Promise.allSettled([
|
|
256
325
|
withTimeout(si.currentLoad(), DEFAULT_METRIC_TIMEOUT_MS),
|
|
257
|
-
withTimeout(si.mem(), isWindows ? WINDOWS_MEMORY_TIMEOUT_MS : DEFAULT_METRIC_TIMEOUT_MS)
|
|
326
|
+
withTimeout(si.mem(), isWindows ? WINDOWS_MEMORY_TIMEOUT_MS : DEFAULT_METRIC_TIMEOUT_MS),
|
|
327
|
+
readMacHardwareArchitecture()
|
|
258
328
|
]);
|
|
259
|
-
const [temperature, graphics, network] = await Promise.allSettled([
|
|
329
|
+
const [temperature, graphics, network, mac] = await Promise.allSettled([
|
|
260
330
|
readCachedMetric(cachedCpuTemperature, isWindows ? readWindowsCpuTemperature : () => si.cpuTemperature(), TEMPERATURE_CACHE_MS, Date.now(), TEMPERATURE_CACHE_MS, 2500),
|
|
261
331
|
readCachedMetric(cachedGraphics, () => si.graphics(), SLOW_METRIC_CACHE_MS, Date.now(), SLOW_METRIC_CACHE_MS, 2500),
|
|
262
|
-
readCachedMetric(cachedNetwork, isWindows ? readWindowsNetworkMetrics : () => si.networkStats("*"), isWindows ? NETWORK_CACHE_MS : 2000, Date.now(), OPTIONAL_SOURCE_BACKOFF_MS, isWindows ? WINDOWS_NETWORK_OUTER_TIMEOUT_MS : DEFAULT_METRIC_TIMEOUT_MS)
|
|
332
|
+
readCachedMetric(cachedNetwork, isWindows ? readWindowsNetworkMetrics : () => si.networkStats("*"), isWindows ? NETWORK_CACHE_MS : 2000, Date.now(), OPTIONAL_SOURCE_BACKOFF_MS, isWindows ? WINDOWS_NETWORK_OUTER_TIMEOUT_MS : DEFAULT_METRIC_TIMEOUT_MS),
|
|
333
|
+
isMac ? readCachedMetric(cachedMacMetrics, () => readMacMetrics(), SLOW_METRIC_CACHE_MS, Date.now(), OPTIONAL_SOURCE_BACKOFF_MS, MAC_METRIC_TIMEOUT_MS) : Promise.resolve(undefined)
|
|
263
334
|
]);
|
|
264
335
|
const cpuPercent = load.status === "fulfilled" ? finite(load.value.currentLoad) : null;
|
|
265
336
|
const memoryTotalBytes = memory.status === "fulfilled" ? finite(memory.value.total) : null;
|
|
@@ -267,6 +338,14 @@ async function readMetrics() {
|
|
|
267
338
|
const memoryUsedBytes = memoryTotalBytes !== null && memoryAvailableBytes !== null ? Math.max(0, memoryTotalBytes - memoryAvailableBytes) : memory.status === "fulfilled" ? finite(memory.value.used) : null;
|
|
268
339
|
const memoryPercent = memoryUsedBytes !== null && memoryTotalBytes !== null && memoryTotalBytes > 0 ? memoryUsedBytes / memoryTotalBytes * 100 : null;
|
|
269
340
|
const gpu = selectGpuMetrics(graphics.status === "fulfilled" ? graphics.value : undefined);
|
|
341
|
+
const macMetrics = mac.status === "fulfilled" ? mac.value : undefined;
|
|
342
|
+
const architecture = hardwareArchitecture.status === "fulfilled" ? hardwareArchitecture.value : undefined;
|
|
343
|
+
const isAppleSilicon = isMac && architecture === "arm64";
|
|
344
|
+
if (isAppleSilicon) {
|
|
345
|
+
gpu.gpuMemoryUsedBytes = null;
|
|
346
|
+
gpu.gpuMemoryTotalBytes = null;
|
|
347
|
+
gpu.gpuMemoryPercent = null;
|
|
348
|
+
}
|
|
270
349
|
let downloadBytesPerSecond = null;
|
|
271
350
|
let uploadBytesPerSecond = null;
|
|
272
351
|
if (network.status === "fulfilled" && network.value !== undefined) {
|
|
@@ -293,12 +372,13 @@ async function readMetrics() {
|
|
|
293
372
|
memoryUsedBytes,
|
|
294
373
|
memoryTotalBytes,
|
|
295
374
|
memoryPercent,
|
|
296
|
-
gpuPercent: gpu.gpuPercent,
|
|
297
|
-
cpuTemperatureCelsius: temperature.status === "fulfilled" && temperature.value !== undefined ? finite(temperature.value.main) ?? ("max" in temperature.value ? finite(temperature.value.max) : null) : null,
|
|
298
|
-
gpuTemperatureCelsius: gpu.gpuTemperatureCelsius,
|
|
375
|
+
gpuPercent: macMetrics?.gpuPercent ?? gpu.gpuPercent,
|
|
376
|
+
cpuTemperatureCelsius: macMetrics?.cpuTemperatureCelsius ?? (temperature.status === "fulfilled" && temperature.value !== undefined ? finite(temperature.value.main) ?? ("max" in temperature.value ? finite(temperature.value.max) : null) : null),
|
|
377
|
+
gpuTemperatureCelsius: macMetrics?.gpuTemperatureCelsius ?? gpu.gpuTemperatureCelsius,
|
|
299
378
|
gpuMemoryUsedBytes: gpu.gpuMemoryUsedBytes,
|
|
300
379
|
gpuMemoryTotalBytes: gpu.gpuMemoryTotalBytes,
|
|
301
380
|
gpuMemoryPercent: gpu.gpuMemoryPercent,
|
|
381
|
+
gpuMemoryIsUnified: isAppleSilicon ? true : isMac && architecture === "x86_64" ? false : null,
|
|
302
382
|
downloadBytesPerSecond,
|
|
303
383
|
uploadBytesPerSecond
|
|
304
384
|
};
|
|
@@ -379,6 +459,7 @@ var initialMetrics = {
|
|
|
379
459
|
gpuMemoryUsedBytes: null,
|
|
380
460
|
gpuMemoryTotalBytes: null,
|
|
381
461
|
gpuMemoryPercent: null,
|
|
462
|
+
gpuMemoryIsUnified: null,
|
|
382
463
|
downloadBytesPerSecond: null,
|
|
383
464
|
uploadBytesPerSecond: null
|
|
384
465
|
};
|
|
@@ -434,14 +515,25 @@ function systemMetricsTitle() {
|
|
|
434
515
|
function MetricsPanel(props) {
|
|
435
516
|
onMount(startMetricsPolling);
|
|
436
517
|
onCleanup(stopMetricsPolling);
|
|
518
|
+
const gpuMemory = createMemo(() => {
|
|
519
|
+
const metrics = metricsState.sharedMetrics();
|
|
520
|
+
const unified = metrics.gpuMemoryIsUnified === true;
|
|
521
|
+
return {
|
|
522
|
+
icon: unified ? icons.ram : icons.vram,
|
|
523
|
+
label: gpuMemoryLabel(unified ? "arm64" : metrics.gpuMemoryIsUnified === false ? "x86_64" : undefined),
|
|
524
|
+
usedBytes: unified ? metrics.memoryUsedBytes : metrics.gpuMemoryUsedBytes,
|
|
525
|
+
totalBytes: unified ? metrics.memoryTotalBytes : metrics.gpuMemoryTotalBytes,
|
|
526
|
+
percent: unified ? metrics.memoryPercent : metrics.gpuMemoryPercent
|
|
527
|
+
};
|
|
528
|
+
});
|
|
437
529
|
return (() => {
|
|
438
|
-
var _el$ = _$createElement("box"), _el$2 = _$createElement("text"), _el$3 = _$createTextNode(` `), _el$4 = _$createElement("box"), _el$5 = _$createElement("text"), _el$6 = _$createElement("text"), _el$8 = _$createElement("text"), _el$9 = _$createTextNode(` · `), _el$0 = _$createTextNode(` `), _el$1 = _$createElement("box"), _el$10 = _$createElement("text"), _el$11 = _$createElement("text"), _el$13 = _$createElement("text"), _el$14 = _$createTextNode(` / `), _el$15 = _$createTextNode(` (`), _el$16 = _$createTextNode(`)`), _el$17 = _$createElement("box"), _el$18 = _$createElement("text"), _el$19 = _$createElement("text"), _el$21 = _$createElement("text"), _el$22 = _$createTextNode(` · `), _el$23 = _$createTextNode(` `), _el$24 = _$createElement("box"), _el$25 = _$createElement("text"), _el$26 = _$createElement("text"), _el$28 = _$createElement("text"), _el$
|
|
530
|
+
var _el$ = _$createElement("box"), _el$2 = _$createElement("text"), _el$3 = _$createTextNode(` `), _el$4 = _$createElement("box"), _el$5 = _$createElement("text"), _el$6 = _$createElement("text"), _el$8 = _$createElement("text"), _el$9 = _$createTextNode(` · `), _el$0 = _$createTextNode(` `), _el$1 = _$createElement("box"), _el$10 = _$createElement("text"), _el$11 = _$createElement("text"), _el$13 = _$createElement("text"), _el$14 = _$createTextNode(` / `), _el$15 = _$createTextNode(` (`), _el$16 = _$createTextNode(`)`), _el$17 = _$createElement("box"), _el$18 = _$createElement("text"), _el$19 = _$createElement("text"), _el$21 = _$createElement("text"), _el$22 = _$createTextNode(` · `), _el$23 = _$createTextNode(` `), _el$24 = _$createElement("box"), _el$25 = _$createElement("text"), _el$26 = _$createElement("text"), _el$27 = _$createTextNode(` `), _el$28 = _$createTextNode(` `), _el$29 = _$createElement("text"), _el$30 = _$createTextNode(` / `), _el$31 = _$createTextNode(` (`), _el$32 = _$createTextNode(`)`), _el$33 = _$createElement("box"), _el$34 = _$createElement("text"), _el$35 = _$createElement("text"), _el$37 = _$createElement("text"), _el$38 = _$createTextNode(`↓ `), _el$39 = _$createTextNode(` ↑ `);
|
|
439
531
|
_$insertNode(_el$, _el$2);
|
|
440
532
|
_$insertNode(_el$, _el$4);
|
|
441
533
|
_$insertNode(_el$, _el$1);
|
|
442
534
|
_$insertNode(_el$, _el$17);
|
|
443
535
|
_$insertNode(_el$, _el$24);
|
|
444
|
-
_$insertNode(_el$, _el$
|
|
536
|
+
_$insertNode(_el$, _el$33);
|
|
445
537
|
_$setProp(_el$, "flexDirection", "column");
|
|
446
538
|
_$setProp(_el$, "paddingLeft", 0);
|
|
447
539
|
_$setProp(_el$, "paddingRight", 0);
|
|
@@ -484,26 +576,28 @@ function MetricsPanel(props) {
|
|
|
484
576
|
_$insert(_el$21, () => formatTemperature(metricsState.sharedMetrics().gpuTemperatureCelsius), null);
|
|
485
577
|
_$insertNode(_el$24, _el$25);
|
|
486
578
|
_$insertNode(_el$24, _el$26);
|
|
487
|
-
_$insertNode(_el$24, _el$
|
|
579
|
+
_$insertNode(_el$24, _el$29);
|
|
488
580
|
_$setProp(_el$24, "flexDirection", "row");
|
|
489
|
-
_$insert(_el$25, () =>
|
|
490
|
-
_$insertNode(_el$26,
|
|
491
|
-
_$insertNode(_el$
|
|
492
|
-
_$
|
|
493
|
-
_$insertNode(_el$
|
|
494
|
-
_$
|
|
495
|
-
_$
|
|
496
|
-
_$insert(_el$
|
|
497
|
-
_$
|
|
498
|
-
_$
|
|
499
|
-
_$insertNode(_el$
|
|
500
|
-
_$
|
|
501
|
-
_$
|
|
502
|
-
_$
|
|
503
|
-
_$
|
|
504
|
-
_$insertNode(_el$
|
|
505
|
-
_$
|
|
506
|
-
_$
|
|
581
|
+
_$insert(_el$25, () => gpuMemory().icon);
|
|
582
|
+
_$insertNode(_el$26, _el$27);
|
|
583
|
+
_$insertNode(_el$26, _el$28);
|
|
584
|
+
_$insert(_el$26, () => gpuMemory().label, _el$28);
|
|
585
|
+
_$insertNode(_el$29, _el$30);
|
|
586
|
+
_$insertNode(_el$29, _el$31);
|
|
587
|
+
_$insertNode(_el$29, _el$32);
|
|
588
|
+
_$insert(_el$29, () => formatGiB(gpuMemory().usedBytes), _el$30);
|
|
589
|
+
_$insert(_el$29, () => formatGiB(gpuMemory().totalBytes), _el$31);
|
|
590
|
+
_$insert(_el$29, () => formatPercent(gpuMemory().percent), _el$32);
|
|
591
|
+
_$insertNode(_el$33, _el$34);
|
|
592
|
+
_$insertNode(_el$33, _el$35);
|
|
593
|
+
_$insertNode(_el$33, _el$37);
|
|
594
|
+
_$setProp(_el$33, "flexDirection", "row");
|
|
595
|
+
_$insert(_el$34, () => icons.network);
|
|
596
|
+
_$insertNode(_el$35, _$createTextNode(` NET `));
|
|
597
|
+
_$insertNode(_el$37, _el$38);
|
|
598
|
+
_$insertNode(_el$37, _el$39);
|
|
599
|
+
_$insert(_el$37, () => formatRate(metricsState.sharedMetrics().downloadBytesPerSecond), _el$39);
|
|
600
|
+
_$insert(_el$37, () => formatRate(metricsState.sharedMetrics().uploadBytesPerSecond), null);
|
|
507
601
|
_$effect((_p$) => {
|
|
508
602
|
var _v$ = props.theme.text, _v$2 = TextAttributes.BOLD, _v$3 = props.theme.success, _v$4 = props.theme.text, _v$5 = props.theme.textMuted, _v$6 = props.theme.success, _v$7 = props.theme.text, _v$8 = props.theme.textMuted, _v$9 = props.theme.success, _v$0 = props.theme.text, _v$1 = props.theme.textMuted, _v$10 = props.theme.success, _v$11 = props.theme.text, _v$12 = props.theme.textMuted, _v$13 = props.theme.success, _v$14 = props.theme.text, _v$15 = props.theme.textMuted;
|
|
509
603
|
_v$ !== _p$.e && (_p$.e = _$setProp(_el$2, "fg", _v$, _p$.e));
|
|
@@ -519,10 +613,10 @@ function MetricsPanel(props) {
|
|
|
519
613
|
_v$1 !== _p$.l && (_p$.l = _$setProp(_el$21, "fg", _v$1, _p$.l));
|
|
520
614
|
_v$10 !== _p$.u && (_p$.u = _$setProp(_el$25, "fg", _v$10, _p$.u));
|
|
521
615
|
_v$11 !== _p$.c && (_p$.c = _$setProp(_el$26, "fg", _v$11, _p$.c));
|
|
522
|
-
_v$12 !== _p$.w && (_p$.w = _$setProp(_el$
|
|
523
|
-
_v$13 !== _p$.m && (_p$.m = _$setProp(_el$
|
|
524
|
-
_v$14 !== _p$.f && (_p$.f = _$setProp(_el$
|
|
525
|
-
_v$15 !== _p$.y && (_p$.y = _$setProp(_el$
|
|
616
|
+
_v$12 !== _p$.w && (_p$.w = _$setProp(_el$29, "fg", _v$12, _p$.w));
|
|
617
|
+
_v$13 !== _p$.m && (_p$.m = _$setProp(_el$34, "fg", _v$13, _p$.m));
|
|
618
|
+
_v$14 !== _p$.f && (_p$.f = _$setProp(_el$35, "fg", _v$14, _p$.f));
|
|
619
|
+
_v$15 !== _p$.y && (_p$.y = _$setProp(_el$37, "fg", _v$15, _p$.y));
|
|
526
620
|
return _p$;
|
|
527
621
|
}, {
|
|
528
622
|
e: undefined,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "opencode-system-metrics-tui",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.10",
|
|
4
4
|
"description": "OpenCode TUI sidebar plugin for live system metrics",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -33,6 +33,7 @@
|
|
|
33
33
|
"dependencies": {
|
|
34
34
|
"@opentui/core": "^0.5.10",
|
|
35
35
|
"@opentui/solid": "^0.5.10",
|
|
36
|
+
"opencode-system-metrics-tui": "^0.1.8",
|
|
36
37
|
"solid-js": "^1.9.12",
|
|
37
38
|
"systeminformation": "^5.33.8"
|
|
38
39
|
},
|