From 729d475d94e5d5e0d2b79af0cd7e1ea8fd17636a Mon Sep 17 00:00:00 2001 From: AI_Architect Date: Thu, 23 Jul 2026 17:11:15 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=A1=AC=E4=BB=B6=E7=9B=91?= =?UTF-8?q?=E6=8E=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LibreHardwareMonitorLib.dll | Bin 0 -> 1214976 bytes __init__.py | 3 + docs/XB_MemoryVisualization_manual.md | 440 ++++ js/xb_memory_viz.css | 670 ++++++ js/xb_memory_viz.js | 3158 +++++++++++++++++++++++++ js/xb_memory_viz_graph.js | 623 +++++ locales/zh/nodeDefs.json | 9 + nodes_memory_viz.py | 888 +++++++ requirements.txt | 6 + 9 files changed, 5797 insertions(+) create mode 100644 LibreHardwareMonitorLib.dll create mode 100644 docs/XB_MemoryVisualization_manual.md create mode 100644 js/xb_memory_viz.css create mode 100644 js/xb_memory_viz.js create mode 100644 js/xb_memory_viz_graph.js create mode 100644 nodes_memory_viz.py diff --git a/LibreHardwareMonitorLib.dll b/LibreHardwareMonitorLib.dll new file mode 100644 index 0000000000000000000000000000000000000000..b9145b83e623c76f22b114b0c4a71d84f08c9969 GIT binary patch literal 1214976 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

}0nGaJpx*M>En!kI`-2 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%0AqBW_hA85ijJ z#;vMF2P5yK@olPu#x{RPsU8M%`bMe29VxsW4@RkBos9ndxL4$eQL06n!Pz*Ul+GyS zcQ&{>_Cv8hsB##u!%tI8Ef}pfYHagkjLPXk;cb50u9h3j_3w6-)K$wle{NR|HMaV< ztMzA9*1tn-HkkGAP%X}`tbd2mzsIZ5j8pET`Qv!?k;b+>#;g5|&Gge9i7N5R%ITS??(A1NzDepnjct6B)HIE4e3Mlshd1#}R`vcu`ZoV2 zt0s(1e3Mn$Rh8qLtd{n#9N$!xr?Is^RTUb{{!dj~7#n+2)vjwu-{#*`Ri?4czX#QU zftBsgP=_?O>6xLNK_s{F%~TPMr$tP9W~!Twoa3LVCNehh&r~C?HSv!^eM`=nsU~P_ zW05s(egk`;Vxew`+U4echikTb0~F*!CY;s?=a^|5>WrSS{!NBTMzx z*!q{HF1nNC)}P1Jr5fY={9S3heoXb(I76(hL;c-j%DGF2XMZ14sf>-kkEy;I8~aZe zJf{9Sp2AOyT#b81x8%%IH))&^xgB^c@MxCbfcN=t$$3hRWBGl+V}UbRo_`YQKdl~S zd>H%1uM|A3o?x7uV&u;=?mO4uR~R>D{HDe>y-%xLmeYOa`Oed7E#td6{AR|Nd`bR2 ztv+EK!TSM(cQamv`~QT?G|mu*YSQ;*o>mR-G5KZkCtD4?zjFR%tI-;p{JK9UTRk_C z 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 z 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 Rxhh`95!XaU_|5-<{{yS`DDMCO literal 0 HcmV?d00001 diff --git a/__init__.py b/__init__.py index 8277e0e..5c60d34 100644 --- a/__init__.py +++ b/__init__.py @@ -56,6 +56,7 @@ try: from .nodes_blockswap_sage import XB_Sage_BlockSwap from .nodes_wiring import XB_DynamicBus, XB_UNetNameBroadcaster, XB_CLIPNameBroadcaster from .nodes_dashboard import XB_Dashboard_Zen + from .nodes_memory_viz import XB_MemoryVisualization from .nodes_tile import XB_SamplerChunkMaster from .nodes_wan_vae import (XB_WanImageToVideo, XB_WanFirstLastFrameToVideo, XB_WanSoundImageToVideo, XB_WanFunControlToVideo, XB_WanVaceToVideo, XB_Wan22FunControlToVideo, XB_WanInfiniteTalkToVideo, XB_WanInfiniteTalkToVideo_Single, XB_WanInfiniteTalkToVideo_Dual, XB_WanVAEDecodeTiled, XB_WanFunInpaintToVideo, XB_WanCameraImageToVideo, XB_WanPhantomSubjectToVideo, XB_WanHuMoImageToVideo, XB_Wan22ImageToVideoLatent, XB_WanSoundImageToVideoExtend, XB_WanSCAILToVideo, XB_WanSCAILToVideoPro, XB_WanDancerVideo, XB_WanDanceSwitcher, XB_WanDancerCombo, XB_BerniniConditioning) from .nodes_batch import XB_BatchFolderLoader @@ -135,6 +136,7 @@ try: "XB_UNetNameBroadcaster": XB_UNetNameBroadcaster, "XB_CLIPNameBroadcaster": XB_CLIPNameBroadcaster, "XB_Dashboard_Zen": XB_Dashboard_Zen, + "XB_MemoryVisualization": XB_MemoryVisualization, "XB_SamplerChunkMaster": XB_SamplerChunkMaster, "XB_WanImageToVideo": XB_WanImageToVideo, "XB_WanFirstLastFrameToVideo": XB_WanFirstLastFrameToVideo, @@ -275,6 +277,7 @@ try: "XB_UNetNameBroadcaster": "XB-BOX - UNet Name Broadcaster", "XB_CLIPNameBroadcaster": "XB-BOX - CLIP Name Broadcaster", "XB_Dashboard_Zen": "XB-BOX - Dashboard Zen", + "XB_MemoryVisualization": "XB 📊 硬件监控面板 (Memory Visualization)", "XB_SamplerChunkMaster": "XB-BOX - Sampler Chunk Master", "XB_WanImageToVideo": "XB-BOX - Wan Image2Video", "XB_WanFirstLastFrameToVideo": "XB-BOX - Wan First/Last Frame2Video", diff --git a/docs/XB_MemoryVisualization_manual.md b/docs/XB_MemoryVisualization_manual.md new file mode 100644 index 0000000..2e958fb --- /dev/null +++ b/docs/XB_MemoryVisualization_manual.md @@ -0,0 +1,440 @@ +# XB 📊 硬件监控面板 — 使用说明书 + +> **节点名称**: `XB_MemoryVisualization` +> **显示名称**: `XB 📊 硬件监控面板 (Memory Visualization)` +> **分类**: `XB_ToolBox/Dashboard` +> **基于**: [ComfyUI-MemoryVisualization](https://github.com/kijai/ComfyUI-MemoryVisualization) +> **适配**: 小白工具箱 (XB_ToolBox) / NVIDIA + AMD 双卡支持 + +--- + +## 目录 + +1. [功能概览](#1-功能概览) +2. [安装与依赖](#2-安装与依赖) +3. [快速上手](#3-快速上手) +4. [面板布局详解](#4-面板布局详解) +5. [右键菜单](#5-右键菜单) +6. [迷你栏 (Mini Bar)](#6-迷你栏-mini-bar) +7. [模型列表](#7-模型列表) +8. [历史图表](#8-历史图表) +9. [主题切换](#9-主题切换) +10. [AMD GPU 用户须知](#10-amd-gpu-用户须知) +11. [常见问题](#11-常见问题) + +--- + +## 1. 功能概览 + +硬件监控面板是一个**实时、可拖拽、可缩放**的系统资源监控窗口,在 ComfyUI 界面右下角自动显示。 + +### 核心功能 + +| 功能 | 说明 | +|------|------| +| **VRAM 显存监控** | 实时显示 GPU 显存使用量、分段占比(模型/Torch/缓存/其他) | +| **RAM 内存监控** | 系统内存、进程内存、固定内存、Python 占用 | +| **GPU 状态** | 利用率、温度、功耗(NVIDIA 全支持 / AMD 需 LibreHardwareMonitor) | +| **CPU 状态** | CPU 使用率、型号识别 | +| **磁盘监控** | 磁盘读写速率、各分区剩余空间 | +| **页面文件** | 虚拟内存使用情况 | +| **模型详情** | 已加载模型列表、每个模型的 VRAM/内存分段占用 | +| **历史图表** | VRAM 使用量趋势图(面积图/柱状图/K线图/点阵图) | +| **快捷操作** | 一键卸载模型、清除缓存、执行/中断工作流 | + +### 界面截图说明 + +``` +┌─────────────────────────────────────────┐ +│ ≡ 硬件监控 [▶] [卸载▾] [⤤] [−] │ ← 标题栏(可拖拽) +├─────────────────────────────────────────┤ +│ 内存 32.5GB|64.0GB │ +│ ████████░░░░░░░░░░░░░░ 固定/已加载/... │ ← 内容区 +│ 显存 9.0GB|15.9GB │ +│ ██████████████░░░░░░░░ 模型/Torch/... │ +│ 峰值: 12.3GB 缓存: 1.2GB GPU 45% 55°C │ +│ 页面文件 2.1GB|16.0GB │ +├─────────────────────────────────────────┤ +│ 14:30 14:32 · 9.0GB 实时 │ ← 图表时间轴 +│ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ │ ← 历史图表 +│ ─────── ⬌ 拖拽调整图表高度 ─────── │ +├─────────────────────────────────────────┤ +│ ▸ AutoencodingEngine 320 MB │ ← 模型列表 +│ ▸ Lumina2 5.7 GB │ +│ ▸ ZImageT2IModel 4.1 GB │ +└─────────────────────────────────────────┘ +``` + +--- + +## 2. 安装与依赖 + +### 自动安装 + +面板**无需放置节点即可自动加载**。ComfyUI 启动后,监控窗口自动出现在界面右下角。 + +### 必备依赖 + +```bash +pip install psutil pythonnet +``` + +| 依赖 | 用途 | 必需 | +|------|------|------| +| `psutil` | CPU/内存/磁盘/进程信息 | ✅ 是 | +| `pythonnet` | .NET 桥接,驱动 LibreHardwareMonitor | ✅ 是 | +| `LibreHardwareMonitorLib.dll` | GPU 传感器读取(已内置) | ✅ 是 | +| `nvidia-ml-py` | NVIDIA GPU 精准显存数据 | ⚠️ 可选 | + +> `LibreHardwareMonitorLib.dll` 已内置在 `XB_ToolBox\` 目录中,无需额外下载。 + +### NVIDIA 用户(可选) + +```bash +pip install nvidia-ml-py +``` + +安装后可获得设备级显存数据(而非进程级),Windows WDDM 下尤其有用。 + +--- + +## 3. 快速上手 + +### 3.1 启动面板 + +1. 启动 ComfyUI +2. 面板**自动出现**在界面右下角 +3. 如果没有看到,检查 ComfyUI 控制台是否有报错 + +### 3.2 面板操作 + +| 操作 | 方法 | +|------|------| +| **移动面板** | 拖拽标题栏 | +| **调整大小** | 拖拽面板左/右/下边缘或右下角 | +| **折叠/展开** | 点击标题栏 `−` / `+` 按钮 | +| **弹出窗口** | 点击 `⤤` 按钮(画中画模式) | +| **运行工作流** | 点击 `▶` 按钮 | +| **取消运行** | 运行中点击 `■` 按钮 | +| **打开菜单** | 右键点击面板任意位置 | + +### 3.3 工作流节点(可选) + +你也可以将 `XB 📊 硬件监控面板` 节点拖入工作流: +- 节点本身**不产生任何输出** +- 执行节点时会在控制台打印当前 VRAM 状态 +- 主要用作工作流中的"书签"标记 + +--- + +## 4. 面板布局详解 + +### 4.1 标题栏 + +``` +≡ 硬件监控 [▶] [卸载▾] [⤤] [−] +``` + +| 元素 | 功能 | +|------|------| +| `≡` | 拖拽手柄(停靠模式下可见) | +| `硬件监控` | 面板标题 | +| `▶` / `■` | 执行/中断工作流按钮 | +| `卸载▾` | 卸载模型菜单 | +| `⤤` | 弹出画中画窗口 | +| `−` / `+` | 折叠/展开面板 | + +### 4.2 内容区 + +#### 内存行 +``` +内存 32.5GB|64.0GB +████████░░░░░░░░░░░░░░░░░░░░ +■ 固定 9.9GB ■ 已加载 0KB ■ Python 11.3GB ■ 其他 11.3GB +``` + +- **固定内存 (Pinned)**:用于 GPU 快速传输的锁页内存 +- **已加载 (Loaded)**:已从磁盘加载到 RAM 的模型数据 +- **Python**:Python 进程自身占用 +- **其他**:系统及其他进程占用 + +#### 显存行 +``` +显存 (AMD Radeon RX 7900 XTX) 9.0GB|15.9GB +████████████████░░░░░░░░░░░░░░░░ +■ 模型 5.7GB ■ Torch 2.1GB ■ 缓存 0.5GB ■ 其他 0.7GB +峰值: 12.3GB 缓存: 1.2GB GPU 45% 55°C 9W ● 运行中 +``` + +- **模型 (Models)**:已加载模型占用的 VRAM +- **Torch**:PyTorch 活跃分配 +- **缓存 (Cache)**:PyTorch 缓存池(可释放) +- **其他 (Other)**:驱动及其他进程占用 + +底部信息行: +| 项目 | 说明 | +|------|------| +| `峰值` | 自面板启动以来的 VRAM 最大使用量 | +| `缓存` | PyTorch 缓存池大小 | +| `GPU XX%` | GPU 核心利用率(点击可切换图表上的 GPU 曲线) | +| `XX°C` | GPU 温度 | +| `XX W` | GPU 功耗 | +| `● 运行中` / `● 空闲` | 工作流执行状态 | + +#### 页面文件行 +``` +页面文件 2.1GB|16.0GB +████████░░░░░░░░░░░░░░░░░░░░░░ +``` +仅当系统启用了页面文件时显示。 + +--- + +## 5. 右键菜单 + +右键点击面板任意位置打开配置菜单: + +``` +┌─────────────────────┐ +│ 缩放 ▸ │ 面板整体缩放 (50%~200%) +│ 字号 ▸ │ 字体大小 (10px~20px) +│ 轮询间隔 ▸ │ 数据刷新频率 (100ms~5s) +│ 显示 ▸ │ 显示选项 +│ 迷你视图 ▸ │ 折叠状态下的迷你栏选项 +│ 图表 ▸ │ 图表样式和颜色 +│ 主题 ▸ │ 配色方案 +│ 停靠宽度 ▸ │ 停靠到顶栏时的宽度 +│ ✓ 停靠到顶栏 │ 切换浮动/停靠模式 +│ 重置历史 │ 清除图表历史数据 +└─────────────────────┘ +``` + +### 5.1 缩放子菜单 + +| 选项 | 效果 | +|------|------| +| 50% ~ 200% | 面板整体缩放,包括所有文字和图表 | + +### 5.2 字号子菜单 + +| 选项 | 适用场景 | +|------|----------| +| 10px ~ 12px | 小屏幕 / 紧凑布局 | +| 13px ~ 14px | 正常阅读 | +| 16px ~ 20px | 大屏 / 远距离观看 | + +> 字号与缩放独立:字号只改变文字大小,缩放改变整个面板尺寸。 + +### 5.3 轮询间隔子菜单 + +| 选项 | 说明 | +|------|------| +| 100ms ~ 250ms | 极快刷新,CPU 开销较大 | +| **500ms** | 默认,平衡刷新率和性能 | +| 1s ~ 5s | 低频刷新,适合长时间监控 | + +### 5.4 显示子菜单 + +| 选项 | 默认 | 说明 | +|------|------|------| +| 模型条着色 | ☐ | 按模型类型着色进度条 | +| 模型边框着色 | ☑ | 按模型类型着色边框 | +| 模型名着色 | ☑ | 按模型类型着色名称 | +| 显示图例 | ☑ | 显示分段图例文字 | +| 显示标题 | ☑ | 显示面板标题 | +| 执行按钮 | ☐ | 显示播放/停止按钮 | + +### 5.5 迷你视图子菜单 + +控制面板折叠后迷你栏中显示哪些内容: + +| 选项 | 说明 | +|------|------| +| RAM | 内存进度条 | +| VRAM | 显存进度条 | +| CPU | CPU 使用率 | +| 页面文件 | 虚拟内存 | +| GPU ▸ | GPU 子菜单(利用率/温度/功耗) | +| 磁盘 ▸ | 磁盘子菜单(I/O + 各分区空间) | +| 设备名称 | 显示 GPU/CPU 型号 | +| 类型标签 | 显示 RAM/VRAM/CPU 标签 | +| 数值显示 | 显示具体数值 | +| 单位显示 | 显示 GB/MB/°C/W 单位 | +| 分隔线 | 显示分组分隔线 | + +### 5.6 图表子菜单 + +| 选项 | 说明 | +|------|------| +| 面积图 (堆叠) | 默认,aimdo+Torch+其他分层显示 | +| 柱状图 | 每3个采样点聚合为一个柱子 | +| K线图 | 类似股票K线,显示开盘/收盘/最高/最低 | +| 点阵 (渐变) | 由上到下渐变的点阵密度图 | +| 显存颜色 | 自定义 VRAM 区域颜色 | +| 总量颜色 | 自定义总量曲线颜色 | +| 平滑度 | 总量曲线的移动平均窗口大小 (0~20) | + +### 5.7 主题子菜单 + +| 主题 | 风格 | +|------|------| +| **default** | 深色主题,橙/绿/蓝配色 | +| comfy | 跟随 ComfyUI 自身主题 | +| light | 亮色主题 | +| sepia | 复古暖色调 | +| fallout | 哔哔小子辐射风(绿色 CRT) | +| pink | 粉色少女风 | +| lucifer | 黑底红字暗黑风 | + +--- + +## 6. 迷你栏 (Mini Bar) + +面板折叠后显示的精简状态栏: + +``` +RAM ████████░░░░ 32.5|64.0GB │ VRAM ██████░░░░ 9.0|15.9GB │ CPU ████░░ 45% +``` + +迷你栏中的 GPU 区域支持**多行模式**(同时显示利用率/温度/功耗时自动启用更紧凑的排版)。 + +--- + +## 7. 模型列表 + +展开面板后,底部显示所有已加载模型的详细信息: + +``` +▸ AutoencodingEngine 320 MB [×] + ████████████████████████████████████░░░░░░░░ + ■ VRAM 320MB ■ pinned 0KB ■ loaded 0KB ■ RAM 0KB + +▾ Lumina2 5.7 GB [×] + ██████████████████████████████████░░░░░░░░░░ + ■ VRAM 5.6GB ■ pinned 103MB ■ loaded 0KB ■ unloaded 4KB + + ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░░░░░░░░░ ← aimdo 页级驻留(需 aimdo) + ■ VRAM 5.6GB ■ unloaded 4KB +``` + +| 元素 | 说明 | +|------|------| +| `▸` / `▾` | 点击模型名展开/折叠详情 | +| `[×]` | 卸载该模型 | +| 彩色进度条 | VRAM(橙) / 固定内存(蓝) / 已加载(深蓝) / 未加载(灰) | +| 小方块网格 | aimdo 页面驻留可视化(需安装 comfy_aimdo) | +| `(static)` | 标记为非动态加载的模型 | + +--- + +## 8. 历史图表 + +图表区域显示 VRAM 使用量随时间变化的趋势: + +``` +14:30 14:32 · 9.0GB 实时 +▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ +─────────────────────── ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ← 虚线 = 总显存上限 +────────────────⬌ 拖拽调整图表高度 ──────────────── +``` + +| 操作 | 方法 | +|------|------| +| 查看历史 | 在图表上**左右拖拽**浏览历史数据 | +| 回到实时 | 拖到最右侧自动恢复实时模式 | +| 悬停详情 | 鼠标悬停在图表上查看具体时间/数值 | +| 调整高度 | 拖拽图表下方的分隔条 | +| 执行标记 | 绿色竖线 = 开始执行,红色竖线 = 执行结束 | + +### 图表样式 + +| 样式 | 特点 | +|------|------| +| **面积图** | 堆叠显示 aimdo+Torch+其他,直观 | +| 柱状图 | 每3秒聚合,干净简洁 | +| K线图 | 精确显示波动范围 | +| 点阵图 | 由上到下密度渐变,艺术感强 | + +--- + +## 9. AMD GPU 用户须知 + +### 支持的 GPU + +| GPU 系列 | 架构 | 利用率 | 温度 | 功耗 | VRAM | +|----------|------|--------|------|------|------| +| RX 7000 系列 | RDNA 3 | ✅ | ✅ | ✅ | ✅ | +| RX 6000 系列 | RDNA 2 | ✅ | ✅ | ✅ | ✅ | +| RX 5000 系列 | RDNA 1 | ✅ | ✅ | ✅ | ✅ | +| Vega / Radeon VII | GCN | ✅ | ✅ | ✅ | ✅ | + +### 监控原理 + +AMD GPU 监控通过 **LibreHardwareMonitor** 实现(一个跨厂商的开源硬件监控库)。原理是直接读取 GPU 的 SMU(System Management Unit)传感器数据,与 AMD Adrenalin 驱动面板使用相同的底层接口。 + +### 如果数据不显示 + +1. 确认 `XB_ToolBox\LibreHardwareMonitorLib.dll` 存在 +2. 确认已安装 `pythonnet`:`pip install pythonnet` +3. 尝试**以管理员身份**运行 ComfyUI +4. 查看 ComfyUI 控制台是否有 `aimdo-viz: LibreHardwareMonitor` 相关日志 + +### 功耗显示的差异 + +AMD 功耗显示为 **GPU Package**(整个显卡的总功耗),单位是瓦特 (W),没有功率上限对比。这与 NVIDIA 的显示格式略有不同(NVIDIA 有 `功耗/上限` 格式)。 + +--- + +## 10. 常见问题 + +### Q: 面板没有自动出现? + +A: 检查 ComfyUI 控制台是否有 JavaScript 报错。常见原因: +- `pythonnet` 未安装 +- `LibreHardwareMonitorLib.dll` 缺失 +- JS 文件加载失败(检查 `js/xb_memory_viz.js` 是否存在) + +### Q: GPU 利用率/温度/功耗都显示"无数据"? + +A: +- **NVIDIA**:安装 `nvidia-ml-py` 并重启 +- **AMD**:确认 `pythonnet` 已安装,查看控制台日志 + +### Q: 面板太大/太小? + +A: 右键 → **缩放** 调整面板大小,或右键 → **字号** 仅调整文字大小。 + +### Q: 如何让面板固定在顶栏? + +A: 拖拽面板到顶部 ComfyUI 操作栏的"停靠左侧"或"停靠右侧"区域释放,或右键 → 停靠到顶栏。 + +### Q: 图表不更新? + +A: 检查轮询间隔设置(右键 → 轮询间隔)。确保未将面板拖拽到历史数据中(右侧显示"实时"即为实时模式)。 + +### Q: 节点放到工作流中有用吗? + +A: 面板**不需要**节点即可工作。节点的作用是: +- 作为工作流书签 +- 执行时在控制台打印 VRAM 状态 + +--- + +## 附录:键盘与鼠标操作速查 + +| 操作 | 快捷键/方法 | +|------|------------| +| 移动面板 | 拖拽标题栏 | +| 快速拖拽(任意位置) | `Ctrl` + 拖拽 | +| 调整宽度 | 拖拽左/右边缘 | +| 调整高度 | 拖拽底部边缘 | +| 同时调整宽高 | 拖拽右下角 | +| 折叠/展开 | 点击 `−` / `+` | +| 弹出画中画 | 点击 `⤤` | +| 打开菜单 | 右键面板 | +| 关闭菜单 | 点击菜单外部 | +| 浏览图表历史 | 在图表上左右拖拽 | +| 图表悬停详情 | 鼠标悬停图表 | +| 切换图表 GPU 曲线 | 点击 `GPU XX%` 文字 | +| 折叠模型详情 | 点击模型名称 | +| 卸载单个模型 | 点击模型行 `[×]` | diff --git a/js/xb_memory_viz.css b/js/xb_memory_viz.css new file mode 100644 index 0000000..69bd4cf --- /dev/null +++ b/js/xb_memory_viz.css @@ -0,0 +1,670 @@ +/* + aimdo memory visualization — static styles. + + JS still owns dynamic values (positions, widths, scale/zoom, drop-zone hover state). + All theme palettes live here, indexed by data-aimdo-theme on . JS toggles + that attribute and reads computed CSS variables back into a small C palette + object — needed because can't see CSS custom properties. +*/ + +/* ---------------- themes ---------------- + :root holds the default theme. Other themes override only what differs from + default — JS toggles them by writing data-aimdo-theme on . + fadeOutFrom / fadeOutTo are comma-separated RGB triplets parsed by JS for + the canvas fade animation; CSS itself doesn't consume them. +*/ +:root { + --aimdo-bg: #181818; + --aimdo-rowBg: #1f1f1f; + --aimdo-headerBg: #202020; + --aimdo-border: #2a2a2a; + --aimdo-btn: #2a2a2a; + --aimdo-btnText: #888; + --aimdo-text: #b0b0b0; + --aimdo-textDim: #707070; + --aimdo-running: #b0b0b0; + --aimdo-vram: #e67e22; + --aimdo-torch: #2ecc71; + --aimdo-pinned: #4a9eff; + --aimdo-loadedRam: #0b3d66; + --aimdo-unloaded: #3a3a3a; + --aimdo-torchCache: #1a7a3a; + --aimdo-python: #9b59b6; + --aimdo-other: #505050; + --aimdo-graphBg: #0e0e0e; + --aimdo-gridLine: #1e1e1e; + --aimdo-totalLine: #d0d0d0; + --aimdo-gpuUtil: #c9a227; + --aimdo-gpuUtilHi: #e74c3c; + --aimdo-capLine: #555; + --aimdo-barBg: #222; + --aimdo-fadeOutFrom: 200, 60, 60; + --aimdo-fadeOutTo: 58, 58, 58; + + /* model type colors (match LiteGraph slot colors) */ + --aimdo-type-model: #B39DDB; + --aimdo-type-vae: #FF6E6E; + --aimdo-type-clip: #FFD500; + --aimdo-type-clip_vision: #A8DADC; + --aimdo-type-controlnet: #76B900; + --aimdo-type-style_model: #C2FFAE; + --aimdo-type-gligen: #9B59B6; + --aimdo-type-upscale_model: #7AB1FF; +} + +[data-aimdo-theme="light"] { + --aimdo-bg: #f5f5f5; --aimdo-rowBg: #ebebeb; --aimdo-headerBg: #e2e2e2; + --aimdo-border: #a8a8a8; --aimdo-btn: #c8c8c8; --aimdo-btnText: #333; + --aimdo-text: #1a1a1a; --aimdo-textDim: #555; + --aimdo-graphBg: #fdfdfd; --aimdo-gridLine: #c8c8c8; --aimdo-barBg: #b8b8b8; + --aimdo-vram: #c2410c; --aimdo-torch: #15803d; --aimdo-pinned: #1d4ed8; + --aimdo-loadedRam: #7c9cc8; + --aimdo-unloaded: #888; --aimdo-torchCache: #166534; --aimdo-python: #6d28d9; + --aimdo-other: #666; + --aimdo-totalLine: #222; --aimdo-gpuUtil: #854d0e; --aimdo-gpuUtilHi: #b91c1c; + --aimdo-capLine: #555; --aimdo-running: #333; + --aimdo-fadeOutFrom: 180, 60, 60; --aimdo-fadeOutTo: 136, 136, 136; + + --aimdo-type-model: #7c3aed; --aimdo-type-vae: #dc2626; --aimdo-type-clip: #ca8a04; + --aimdo-type-clip_vision: #0891b2; --aimdo-type-controlnet: #15803d; + --aimdo-type-style_model: #22c55e; --aimdo-type-gligen: #9333ea; --aimdo-type-upscale_model: #1e40af; +} + +[data-aimdo-theme="sepia"] { + --aimdo-bg: #f4ecd8; --aimdo-rowBg: #ebe1c9; --aimdo-headerBg: #e0d4b6; + --aimdo-border: #b8a982; --aimdo-btn: #d6c89e; --aimdo-btnText: #6b5a3e; + --aimdo-text: #3a2f1e; --aimdo-textDim: #7a6a4e; + --aimdo-graphBg: #faf6e8; --aimdo-gridLine: #d8cba8; --aimdo-barBg: #c9b88a; + --aimdo-vram: #b8732e; --aimdo-torch: #6b8e23; --aimdo-pinned: #5a7a8c; + --aimdo-loadedRam: #3a5a6c; + --aimdo-unloaded: #c9b88a; --aimdo-torchCache: #4a6e23; --aimdo-python: #7a4a8a; + --aimdo-other: #8a7a5a; + --aimdo-totalLine: #4a3a2a; --aimdo-gpuUtil: #8a6818; --aimdo-gpuUtilHi: #a83a2a; + --aimdo-capLine: #8a7a5a; --aimdo-running: #5a4a3a; + --aimdo-fadeOutFrom: 168, 88, 68; --aimdo-fadeOutTo: 201, 184, 138; + + --aimdo-type-model: #7a5e8a; --aimdo-type-vae: #b03030; --aimdo-type-clip: #a87818; + --aimdo-type-clip_vision: #5a8a8a; --aimdo-type-controlnet: #6b8e23; + --aimdo-type-style_model: #7a9a5a; --aimdo-type-gligen: #7a4a8a; --aimdo-type-upscale_model: #5a7a9a; +} + +/* Pip-Boy CRT — green screen housed in metallic gray-brown chrome */ +[data-aimdo-theme="fallout"] { + --aimdo-bg: #0a1a0a; --aimdo-rowBg: #0f2510; --aimdo-headerBg: #2a2520; + --aimdo-border: #5a4a3a; --aimdo-btn: #3a3530; --aimdo-btnText: #c8b89a; + --aimdo-text: #7fff7f; --aimdo-textDim: #3a8a3a; + --aimdo-graphBg: #051005; --aimdo-gridLine: #1a4a1a; --aimdo-barBg: #0f2510; + --aimdo-vram: #88ff66; --aimdo-torch: #ccff44; --aimdo-pinned: #44ffcc; + --aimdo-loadedRam: #2a7a5a; + --aimdo-unloaded: #1a4a1a; --aimdo-torchCache: #5a9a3a; --aimdo-python: #aaff88; + --aimdo-other: #2a4a2a; + --aimdo-totalLine: #7fff7f; --aimdo-gpuUtil: #ffcc44; --aimdo-gpuUtilHi: #ff5555; + --aimdo-capLine: #3a8a3a; --aimdo-running: #88ff66; + --aimdo-fadeOutFrom: 220, 80, 80; --aimdo-fadeOutTo: 26, 74, 26; + + --aimdo-type-model: #aaff88; --aimdo-type-vae: #ff8866; --aimdo-type-clip: #ffdd44; + --aimdo-type-clip_vision: #88ffdd; --aimdo-type-controlnet: #aaff44; + --aimdo-type-style_model: #ccffaa; --aimdo-type-gligen: #ff88cc; --aimdo-type-upscale_model: #66ddff; +} + +/* pastel pink with mint/lavender accents so data colors stay distinguishable */ +[data-aimdo-theme="pink"] { + --aimdo-bg: #fff0f5; --aimdo-rowBg: #ffeaf2; --aimdo-headerBg: #ffd6e8; + --aimdo-border: #e8a4c4; --aimdo-btn: #ffc4d6; --aimdo-btnText: #7a3a5a; + --aimdo-text: #4a1f3a; --aimdo-textDim: #8a4a6a; + --aimdo-graphBg: #fff5fa; --aimdo-gridLine: #f5cadc; --aimdo-barBg: #f5c0d4; + --aimdo-vram: #e91e63; --aimdo-torch: #10a37f; --aimdo-pinned: #a78bfa; + --aimdo-loadedRam: #7a5ec0; + --aimdo-unloaded: #d8b4c0; --aimdo-torchCache: #0f8a6a; --aimdo-python: #7c3aed; + --aimdo-other: #a878a0; + --aimdo-totalLine: #4a1f3a; --aimdo-gpuUtil: #e0a04a; --aimdo-gpuUtilHi: #d32f5e; + --aimdo-capLine: #b67a8a; --aimdo-running: #5a2a4a; + --aimdo-fadeOutFrom: 220, 80, 110; --aimdo-fadeOutTo: 216, 180, 192; + + --aimdo-type-model: #e91e63; --aimdo-type-vae: #ef4444; --aimdo-type-clip: #f59e0b; + --aimdo-type-clip_vision: #0ea5a4; --aimdo-type-controlnet: #65a30d; + --aimdo-type-style_model: #f472b6; --aimdo-type-gligen: #a855f7; --aimdo-type-upscale_model: #3b82f6; +} + +/* Inherits ComfyUI's design tokens via var() so the panel adopts whatever + palette the host is in (light/dark mode is read live through the cascade). + --aimdo-type-* and --aimdo-fadeOut* are intentionally omitted — the + LiteGraph slot hues and fade RGB triplets from :root carry through. */ +[data-aimdo-theme="comfy"] { + --aimdo-bg: var(--comfy-menu-bg); + --aimdo-rowBg: var(--comfy-menu-secondary-bg); + --aimdo-headerBg: var(--comfy-menu-bg); + --aimdo-border: var(--border-color); + --aimdo-btn: var(--comfy-input-bg); + --aimdo-btnText: var(--input-text); + --aimdo-text: var(--input-text); + --aimdo-textDim: var(--descrip-text); + --aimdo-running: var(--input-text); + --aimdo-graphBg: var(--comfy-menu-secondary-bg); + --aimdo-gridLine: var(--border-color); + --aimdo-barBg: var(--comfy-input-bg); + --aimdo-totalLine: var(--fg-color); + --aimdo-capLine: var(--border-color); + + --aimdo-vram: var(--color-gold-500); + --aimdo-torch: var(--color-jade-600); + --aimdo-pinned: var(--color-azure-400); + --aimdo-loadedRam: var(--color-cobalt-800); + --aimdo-unloaded: var(--color-ash-800); + --aimdo-torchCache: var(--color-jade-600); + --aimdo-python: var(--color-magenta-700); + --aimdo-other: var(--color-neutral-550); + --aimdo-gpuUtil: var(--color-gold-500); + --aimdo-gpuUtilHi: var(--color-coral-500); + + /* Neutral fade endpoints chosen to read OK against both light and dark + Comfy backgrounds — the dark-tuned :root defaults would streak black + on light mode. */ + --aimdo-fadeOutFrom: 200, 100, 80; + --aimdo-fadeOutTo: 128, 128, 128; +} + +/* CUSTOM THEME: Lucifer - Black and Red */ +[data-aimdo-theme="lucifer"] { + --aimdo-bg: #000000; + --aimdo-rowBg: #050000; + --aimdo-headerBg: #000000; + --aimdo-border: #FF0000; + --aimdo-btn: #110000; + --aimdo-btnText: #FF0000; + --aimdo-text: #ffffff; + --aimdo-textDim: #880000; + --aimdo-running: #ffffff; + --aimdo-vram: #FF0000; + --aimdo-torch: #CC0000; + --aimdo-pinned: #880000; + --aimdo-loadedRam: #440000; + --aimdo-unloaded: #222222; + --aimdo-torchCache: #660000; + --aimdo-python: #FF0000; + --aimdo-other: #444444; + --aimdo-graphBg: #000000; + --aimdo-gridLine: #220000; + --aimdo-totalLine: #ffffff; + --aimdo-gpuUtil: #FF0000; + --aimdo-gpuUtilHi: #FF5555; + --aimdo-capLine: #FF0000; + --aimdo-barBg: #110000; + --aimdo-fadeOutFrom: 255, 0, 0; + --aimdo-fadeOutTo: 0, 0, 0; + + /* model type colors — all red to match the Obsidian Redline aesthetic */ + --aimdo-type-model: #FF0000; + --aimdo-type-vae: #FF0000; + --aimdo-type-clip: #FF0000; + --aimdo-type-clip_vision: #FF0000; + --aimdo-type-controlnet: #FF0000; + --aimdo-type-style_model: #FF0000; + --aimdo-type-gligen: #FF0000; + --aimdo-type-upscale_model: #FF0000; +} + +/* ---------------- panel ---------------- */ +#aimdo-viz-panel { + position: fixed; + background: var(--aimdo-bg); + color: var(--aimdo-text); + border: 1px solid var(--aimdo-border); + border-radius: 8px; + padding: 0; + font-family: monospace; + font-size: var(--aimdo-font-size, 12px); + z-index: 50; + min-width: 200px; + width: 340px; + max-width: 100vw; + box-shadow: 0 4px 12px rgba(0,0,0,0.7); + user-select: none; + display: flex; + flex-direction: column; +} + +/* docked: flatten the panel into a horizontal row that fits the topbar actionbar */ +#aimdo-viz-panel.aimdo-docked { + position: static !important; + left: auto !important; top: auto !important; right: auto !important; bottom: auto !important; + width: auto !important; height: auto !important; + min-width: 0 !important; max-width: none !important; max-height: none !important; + border: none !important; border-radius: 0 !important; + box-shadow: none !important; background: transparent !important; + flex-direction: row !important; + align-items: center; + zoom: 1 !important; + transform: none !important; +} + +/* ---------------- header ---------------- */ +.aimdo-header { + display: flex; justify-content: space-between; align-items: center; + padding: 6px 10px; + background: var(--aimdo-headerBg); + border-radius: 8px 8px 0 0; + cursor: move; +} +.aimdo-title { + font-weight: bold; + color: var(--aimdo-text); + white-space: nowrap; +} +/* 2x3 circular-dot drag handle — matches the grip icon on ComfyUI's docked actionbar. + Only shown when docked; floating mode lets the entire header act as the drag surface. + The shape is an SVG mask painted by background-color: border-radius can't anti-alias + a 2px circle reliably, and a radial-gradient ends up chunkier than what Chrome draws + for true SVG primitives. SVG renders the same crisp dots in both browsers. */ +.aimdo-drag-handle { + display: none; + box-sizing: content-box; + width: 6px; + height: 10px; + padding: 0 4px; + background-color: var(--aimdo-textDim); + -webkit-mask-image: url("data:image/svg+xml,"); + mask-image: url("data:image/svg+xml,"); + -webkit-mask-size: 6px 10px; + mask-size: 6px 10px; + -webkit-mask-repeat: no-repeat; + mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-position: center; + -webkit-mask-origin: content-box; + mask-origin: content-box; + cursor: grab; + touch-action: none; + flex-shrink: 0; + align-self: center; +} +#aimdo-viz-panel.aimdo-docked .aimdo-drag-handle { + display: inline-block; + padding: 0 8px; +} +.aimdo-drag-handle:active { cursor: grabbing; } +.aimdo-drag-handle:hover { background-color: var(--aimdo-text); } +.aimdo-header-right { + display: flex; align-items: center; gap: 6px; + margin-left: auto; +} +#aimdo-viz-panel.aimdo-docked .aimdo-header { + padding: 2px 8px 2px 0 !important; + background: transparent !important; + border-radius: 0 !important; + flex-shrink: 0; + cursor: default; +} + +/* ---------------- buttons ---------------- */ +.aimdo-btn { + cursor: pointer; + font-size: 0.833em; + line-height: 1; + padding: 1px 6px; + background: var(--aimdo-btn); + border-radius: 3px; + color: var(--aimdo-btnText); + white-space: nowrap; +} +.aimdo-btn-icon { + cursor: pointer; + color: var(--aimdo-btnText); + padding: 0 4px; +} +#aimdo-viz-panel.aimdo-docked .aimdo-btn { + font-size: 0.917em; + padding: 3px 6px; +} + +/* play / cancel-running button — same shape as other header buttons, but the icon + carries the state color (green play, red stop). Hover lifts the background. */ +.aimdo-exec-btn { + cursor: pointer; + user-select: none; + display: inline-block; + text-align: center; + min-width: 1em; /* keeps width stable across ┬╗ / ┬á */ + font-size: 0.833em; + line-height: 1; + padding: 2px 6px; + background: var(--aimdo-btn); + border-radius: 3px; + color: var(--aimdo-torch); + white-space: nowrap; + transition: filter 0.1s; +} +.aimdo-exec-btn:hover { filter: brightness(1.4); } +.aimdo-exec-btn.is-running { color: var(--aimdo-gpuUtilHi); } +#aimdo-viz-panel.aimdo-docked .aimdo-exec-btn { + font-size: 1em; + padding: 2.5px 10px; +} + +/* ---------------- mini-bar ---------------- */ +.aimdo-mini-bar { + display: none; + padding: 4px 10px 6px; + font-size: 0.833em; + color: var(--aimdo-textDim); +} +.aimdo-mini-row { + display: flex; justify-content: space-between; gap: 6px; margin-bottom: 2px; +} +.aimdo-mini-track { + background: var(--aimdo-barBg); + border-radius: 2px; + height: 4px; + overflow: hidden; + display: flex; + margin-bottom: 4px; +} +.aimdo-mini-track-last { + margin-bottom: 0; +} +/* GPU section: one row per metric — bar + value on the same line. The compact 8px + font + 3px bar kicks in only when temp/power are also visible (the .is-multibar + class); with only util showing, the row keeps the regular mini-bar styling so it + matches RAM/VRAM/CPU above. */ +.aimdo-mini-inline { + display: flex; + align-items: center; + gap: 4px; +} +.mini-gpu-section.is-multibar .aimdo-mini-inline, +.mini-disk-section.is-multibar .aimdo-mini-inline { + line-height: 1; + font-size: 0.667em; +} +.mini-gpu-section.is-multibar .aimdo-mini-inline .aimdo-mini-track, +.mini-disk-section.is-multibar .aimdo-mini-inline .aimdo-mini-track { height: 3px; } +.aimdo-mini-inline .aimdo-mini-track { + flex: 1 1 0; + margin-bottom: 0; +} +.aimdo-mini-inline > .mini-gpu-usage, +.aimdo-mini-inline > .mini-temp-usage, +.aimdo-mini-inline > .mini-power-usage, +.aimdo-mini-inline > .mini-disk-read-usage, +.aimdo-mini-inline > .mini-disk-write-usage { + flex-shrink: 0; + text-align: right; + min-width: 32px; +} +/* push the header value to the right even when the GPU label is hidden */ +.mini-gpu-header-value { + margin-left: auto; +} +/* single-bar mode: hide the inline value next to the bar — the value lives in + the title row instead so the layout matches RAM/VRAM/CPU above. */ +.mini-gpu-section:not(.is-multibar) .aimdo-mini-inline > .mini-gpu-usage, +.mini-gpu-section:not(.is-multibar) .aimdo-mini-inline > .mini-temp-usage, +.mini-gpu-section:not(.is-multibar) .aimdo-mini-inline > .mini-power-usage { + display: none; +} +.aimdo-mini-fill { + height: 100%; + width: 0; + transition: width 0.35s ease-out, background 0.35s ease-out; +} +.mini-disk-read-fill { background: var(--aimdo-pinned); } +.mini-disk-write-fill { background: var(--aimdo-vram); } +.mini-faults-fill { background: var(--aimdo-gpuUtil); } + +/* Optional group dividers: a thin line between logical groups (memory, + storage, compute). The .mini-group-start class marks the first section + of each non-leading group. Sections of the same group sit flush; if every + section in a group is hidden the divider still lands on the next visible + group-start (acceptable, matches the leading-edge quirk elsewhere). */ +.aimdo-mini-bar.has-separators > .mini-group-start { + border-top: 1px solid var(--aimdo-border); + padding-top: 10px; + margin-top: 10px; +} +#aimdo-viz-panel.aimdo-docked .aimdo-mini-bar.has-separators > .mini-group-start { + border-top: 0; + padding-top: 0; + margin-top: 0; + border-left: 1px solid var(--aimdo-border); + padding-left: 16px; + margin-left: 6px; +} + +/* free disk space: one row per selected drive, mountpoint left, bar middle, "free" right. + Mountpoint column is fixed-width so multiple drives align vertically. */ +.mini-diskspace-section.is-multibar .aimdo-mini-inline { line-height: 1; font-size: 0.667em; } +.mini-diskspace-section.is-multibar .aimdo-mini-inline .aimdo-mini-track { height: 3px; } +.mini-diskspace-drive-row > .mini-diskspace-mp { + flex-shrink: 0; + text-align: left; + min-width: 18px; + max-width: 36px; + overflow: hidden; + text-overflow: ellipsis; +} +.mini-diskspace-drive-row > .mini-diskspace-usage { + flex-shrink: 0; + text-align: right; + min-width: 32px; +} +.mini-diskspace-section.no-units .mini-diskspace-drive-row > .mini-diskspace-usage { + min-width: 18px; +} + +/* docked mini-bar: horizontal, fixed-width sections */ +#aimdo-viz-panel.aimdo-docked .aimdo-mini-bar { + display: flex !important; flex-direction: row !important; + padding: 0 !important; gap: 12px; align-items: center; + flex: 1 1 auto; min-width: 0; + font-size: 0.75em; +} +#aimdo-viz-panel.aimdo-docked .aimdo-mini-row { + flex-wrap: wrap; + gap: 0 6px; + margin-bottom: 3px; +} +#aimdo-viz-panel.aimdo-docked .aimdo-mini-row > span { + flex-shrink: 0; + white-space: nowrap; +} +#aimdo-viz-panel.aimdo-docked .aimdo-mini-bar > * { + width: var(--aimdo-dock-section-w, 110px); + min-width: var(--aimdo-dock-section-w, 110px); + flex: 0 0 auto; + overflow: hidden; +} + +/* ---------------- body ---------------- */ +#aimdo-viz-body { + padding: 8px 10px; + flex: 1 1 auto; + min-height: 120px; + display: flex; + flex-direction: column; + overflow: hidden; +} +#aimdo-viz-panel.aimdo-docked #aimdo-viz-body { display: none !important; } +#aimdo-viz-panel.aimdo-docked.aimdo-docked-expanded #aimdo-viz-body { + display: flex !important; + position: fixed !important; + z-index: 1500; + width: 420px; + max-height: 60vh; + background: var(--aimdo-bg); + color: var(--aimdo-text); + border: 1px solid var(--aimdo-border); + border-radius: 6px; + box-shadow: 0 4px 12px rgba(0,0,0,0.7); +} + +/* ---------------- bar segments (mini-bar + main content rows) ---------------- */ +.aimdo-seg { height: 100%; } +.aimdo-seg-vram { background: var(--aimdo-vram); } +.aimdo-seg-torch { background: var(--aimdo-torch); } +.aimdo-seg-torchCache { background: var(--aimdo-torchCache); } +.aimdo-seg-pinned { background: var(--aimdo-pinned); } +.aimdo-seg-loadedRam { background: var(--aimdo-loadedRam); } +.aimdo-seg-python { background: var(--aimdo-python); } +.aimdo-seg-other { background: var(--aimdo-other); } +.aimdo-seg-unloaded { background: var(--aimdo-unloaded); } + +/* ---------------- model rows (scroll area) ---------------- */ +#aimdo-models { scrollbar-width: thin; scrollbar-color: var(--aimdo-btn) transparent; } +#aimdo-models::-webkit-scrollbar { width: 8px; } +#aimdo-models::-webkit-scrollbar-track { background: transparent; } +#aimdo-models::-webkit-scrollbar-thumb { background: var(--aimdo-btn); border-radius: 4px; } +#aimdo-models::-webkit-scrollbar-thumb:hover { background: var(--aimdo-textDim); } + +.aimdo-model-row { + margin-top: 6px; + background: var(--aimdo-rowBg); + /* transparent border reserves space so the row height stays constant when the colored stroke toggles */ + border: 1px solid transparent; + border-radius: 4px; + padding: 6px 8px; +} +.aimdo-model-head { + display: flex; justify-content: space-between; align-items: center; + margin-bottom: 2px; +} +.aimdo-model-name { + cursor: pointer; user-select: none; + padding: 1px 4px; margin: -1px -4px; + border-radius: 3px; + transition: background 0.1s; +} +.aimdo-model-name:hover { background: var(--aimdo-btn); } +.aimdo-model-chevron { + color: var(--aimdo-textDim); + margin-right: 4px; + font-size: 0.75em; +} +.aimdo-model-right { + display: flex; align-items: center; gap: 6px; +} +.aimdo-model-bar { + background: var(--aimdo-barBg); + border-radius: 3px; + height: 10px; + overflow: hidden; + display: flex; +} +.aimdo-model-legend { + display: flex; gap: 8px; + font-size: 0.833em; + color: var(--aimdo-textDim); + margin-top: 2px; +} +.aimdo-unload-btn, .aimdo-reset-wm-btn { + cursor: pointer; + font-size: 0.75em; + padding: 0px 4px; + background: var(--aimdo-btn); + border-radius: 2px; + color: var(--aimdo-btnText); +} + +.aimdo-graph-canvas { cursor: crosshair; } + +/* graph-height resize bar — highlights on hover and stays lit while dragging */ +.aimdo-graph-resize { + height: 4px; cursor: ns-resize; + flex-shrink: 0; margin: 1px 0; +} +.aimdo-graph-resize:hover, +.aimdo-graph-resize.is-dragging { background: var(--aimdo-btn); } + +/* ---------------- menus (root + submenus + unload menu) ---------------- */ +.aimdo-menu { + display: none; + position: fixed; + z-index: 1500; + background: var(--aimdo-headerBg); + color: var(--aimdo-text); + border: 1px solid var(--aimdo-border); + border-radius: 4px; + padding: 2px 0; + min-width: 120px; + box-shadow: 0 4px 12px rgba(0,0,0,0.7); + font-family: monospace; + font-size: 0.833em; +} +.aimdo-menu-item { + padding: 4px 10px; + cursor: pointer; + white-space: nowrap; +} +.aimdo-menu-item:hover { + background: var(--aimdo-btn); +} +.aimdo-menu-item.is-disabled { + opacity: 0.4; + cursor: default; +} +.aimdo-menu-header { + padding: 4px 10px 2px; + color: var(--aimdo-textDim); + font-size: 0.75em; + text-transform: uppercase; + letter-spacing: 0.5px; + border-top: 1px solid var(--aimdo-border); + margin-top: 2px; + cursor: default; +} +.aimdo-menu-item.is-disabled:hover { + background: transparent; +} +.aimdo-menu-parent { + padding: 4px 10px; cursor: default; white-space: nowrap; + display: flex; justify-content: space-between; gap: 12px; +} +.aimdo-menu-parent:hover { + background: var(--aimdo-btn); +} +.aimdo-chevron { color: var(--aimdo-textDim); } +.aimdo-check { + display: inline-block; + width: 12px; + text-align: center; +} + +/* ---------------- resize handles ---------------- */ +.aimdo-edge-handle { position: absolute; z-index: 1; } +.aimdo-edge-left { top: 28px; bottom: 0; left: 0; width: 4px; cursor: ew-resize; } +.aimdo-edge-right { top: 28px; bottom: 0; right: 0; width: 4px; cursor: ew-resize; } +.aimdo-edge-bottom { left: 4px; right: 4px; bottom: 0; height: 4px; cursor: ns-resize; } +.aimdo-corner-handle { + position: absolute; right: 0; bottom: 0; + width: 8px; height: 8px; cursor: nwse-resize; z-index: 2; + background: linear-gradient(135deg, + transparent 50%, + var(--aimdo-textDim) 50%, var(--aimdo-textDim) 60%, + transparent 60%, transparent 75%, + var(--aimdo-textDim) 75%, var(--aimdo-textDim) 85%, + transparent 85%); + border-bottom-right-radius: 4px; + opacity: 0.55; +} +.aimdo-corner-handle:hover { opacity: 1; } +#aimdo-viz-panel.aimdo-docked .aimdo-edge-handle, +#aimdo-viz-panel.aimdo-docked .aimdo-corner-handle { display: none !important; } + +/* ---------------- drop zone (shown during a drag toward the topbar) ---------------- */ +.aimdo-dropzone { + position: relative; z-index: 1501; + align-self: stretch; margin: 6px; + padding: 0 12px; + display: flex; align-items: center; justify-content: center; + font-family: monospace; font-size: 0.917em; + border: 2px dashed #3b82f6; border-radius: 6px; + background: rgba(59,130,246,0.4); color: #fff; + pointer-events: auto; min-width: 160px; + opacity: 0.9; + transition: transform 0.12s, opacity 0.12s, box-shadow 0.12s, border-width 0.12s; +} +.aimdo-dropzone-left { order: -2; } +.aimdo-dropzone-right { order: 2; } +.aimdo-dropzone.is-hover { + opacity: 1; transform: scale(1.04); + border-width: 3px; box-shadow: 0 0 20px rgba(59,130,246,0.45); +} diff --git a/js/xb_memory_viz.js b/js/xb_memory_viz.js new file mode 100644 index 0000000..8b7bc14 --- /dev/null +++ b/js/xb_memory_viz.js @@ -0,0 +1,3158 @@ +import { app } from "../../scripts/app.js"; +import { api } from "../../scripts/api.js"; +import { + GRAPH_POINTS, HISTORY_TICK_MS, + history, graphHover, graphState, + pushHistory, pushExecEvent, historyGet, smoothGpuUtil, + loadHistory, saveHistory, clearHistoryStorage, + loadGraphSavedState, resetHistoryState, + drawGraph, buildGraphSubmenu, initGraph, +} from "./xb_memory_viz_graph.js"; + +let pollInterval = 500; +const FADE_TICKS = 6; + +const execState = { running: false, node: null, progress: null }; +let peakVramUsed = 0; +let modelCollapsed = {}; +let colorModelBars = false; +let colorModelStroke = true; +let colorModelName = true; +let showLegends = true; +let showRamInMini = true; +let showVramInMini = true; +let showGpuInMini = true; +let showCpuInMini = true; +let showPagefileInMini = false; +let showDiskInMini = false; +const DISK_PEAK_FLOOR = 50 * 1024 * 1024; // 50 MB/s — small enough idle activity is visible +const DISK_PEAK_HALFLIFE = 30; // seconds — peak decays back toward floor when quiet +const diskState = { + prevRead: null, prevWrite: null, prevTime: 0, + peakRead: DISK_PEAK_FLOOR, peakWrite: DISK_PEAK_FLOOR, +}; +let showFaultsInMini = false; +const FAULT_PEAK_FLOOR = 50; // faults/s — keeps light activity visible +const FAULT_PEAK_HALFLIFE = 30; +const faultState = { prev: null, prevTime: 0, peak: FAULT_PEAK_FLOOR }; +// Free-disk-space monitor — array of selected mountpoints (e.g. ["C:\\","D:\\"]). +// allDisksCache holds the most recent full enumeration so the tooltip can list +// every fixed drive even when only some are pinned to the bar. +let selectedDisks = []; +let allDisksCache = []; +let wantDisksList = false; // one-shot — set when settings menu wants a fresh drive list +let _rebuildDriveMenu = null; // assigned by createPanel; called from renderData when allDisksCache refreshes +let showHwNames = true; +let showTitle = true; +let showExecBtn = false; // optional play / cancel-running button in the header +let miniShowNumbers = true; +let miniShowUnits = true; +let miniShowType = true; +let miniShowGpuTemp = true; +let miniShowGpuPower = true; +let miniShowSeparators = true; +let graphHeight = 80; +let currentTheme = "default"; +let fontSize = 12; // 面板基础字号 (px) +let lang = "zh"; // 界面语言: "zh" | "en" + +// ── 中英文翻译映射表 ── +const L = { + zh: { + title: "硬件监控", titleAimdo: "硬件监控 (aimdo)", + unload: "卸载 ▾", unloadTitle: "卸载模型 / 释放缓存 (点击查看选项)", + popout: "弹出到画中画窗口", collapse: "折叠 / 展开面板", + cancelRun: "取消正在运行的工作流", runWorkflow: "运行工作流", + dragMove: "拖拽移动 (或拖到顶部停靠)", dragResize: "拖拽调整大小", + dragResizeGraph: "拖拽调整图表高度", + ram: "内存", vram: "显存", pagefile: "页面文件", faults: "硬缺页", + disk: "磁盘", diskSpace: "磁盘空间", + noGpu: "不可用 (GPU未检测到)", fetchError: "数据获取失败", + peak: "峰值", cache: "缓存", running: "运行中", idle: "空闲", + noModels: "暂无已加载模型", clickCollapse: "点击折叠/展开", + unloadModel: "卸载此模型", pinned: "固定", loaded: "已加载", + unloaded: "未加载", ramLabel: "内存", static_: "静态", + pinnedRAM: "固定内存", loadedRAM: "已加载内存", vramLabel: "显存", + ramTooltip: "内存", wm: "水位", wmTitle: "重置水位线", + na: "无数据", live: "实时", + models: "模型", torch: "PyTorch", other: "其他", python: "Python", + total: "总量", gpuPct: "GPU利用率", + pageVRAM: "页显存", pageUnloaded: "页未加载", + vramColor: "显存颜色", totalColor: "总量颜色", smoothness: "平滑度", + reset: "重置", + graphArea: "面积图 (堆叠)", graphBars: "柱状图", graphTicker: "K线图", graphDots: "点阵 (渐变)", + menuScale: "缩放", menuFontSize: "字号", menuPoll: "轮询间隔", + menuDisplay: "显示", menuMini: "迷你视图", menuGraph: "图表", + menuTheme: "主题", menuDockWidth: "停靠宽度", menuLang: "语言", + dockSectionW: "区域宽度", dockLeft: "停靠左侧", dockRight: "停靠右侧", + undock: "取消停靠 (浮动)", dockTop: "停靠到顶栏", + resetHistory: "重置历史", resetHistoryTitle: "重置峰值显存标记并清除历史图表", + toggleColorBars: "模型条着色", toggleColorStroke: "模型边框着色", + toggleColorName: "模型名着色", toggleShowLegends: "显示图例", + toggleShowTitle: "显示标题", toggleExecBtn: "执行按钮", + toggleRam: "内存", toggleVram: "显存", togglePagefile: "页面文件", + toggleIO: "I/O", toggleFaults: "页面抖动 (硬缺页)", + toggleUtil: "利用率", toggleNames: "设备名称", + toggleNumbers: "数值显示", toggleUnits: "单位显示", + toggleType: "类型标签", toggleTemp: "温度", togglePower: "功耗", + toggleSeparators: "分隔线", toggleDisk: "磁盘", drives: "磁盘驱动器", + detecting: "检测中…", + unloadAimdo: "aimdo (立即卸载)", unloadAimdoTitle: "立即卸载 aimdo 管理的模型", + unloadModels: "模型", unloadModelsTitle: "ComfyUI /free — 下次队列时卸载模型", + unloadCache: "模型 + 节点缓存", unloadCacheTitle: "ComfyUI /free — 卸载模型并清除节点输出缓存", + diskUnavailable: "不可用", diskUsed: "已用", diskFree: "剩余", + gpuPowerTitle: "GPU功耗 / 上限", gpuLineTitle: "点击切换图表上的GPU曲线", + langZh: "中文", langEn: "English", + }, + en: { + title: "Memory", titleAimdo: "Memory (aimdo)", + unload: "unload ▾", unloadTitle: "Unload models / free cache (click for options)", + popout: "Pop out into a Picture-in-Picture window", collapse: "Collapse / expand panel", + cancelRun: "Cancel running workflow", runWorkflow: "Run workflow", + dragMove: "Drag to move (or to dock at the top)", dragResize: "Drag to resize", + dragResizeGraph: "Drag to resize graph", + ram: "RAM", vram: "VRAM", pagefile: "Pagefile", faults: "Faults", + disk: "Disk", diskSpace: "Disk space", + noGpu: "Not available (GPU not detected)", fetchError: "Error fetching data", + peak: "peak", cache: "cache", running: "running", idle: "idle", + noModels: "No models loaded", clickCollapse: "Click to collapse/expand", + unloadModel: "Unload this model", pinned: "pinned", loaded: "loaded", + unloaded: "unloaded", ramLabel: "RAM", static_: "static", + pinnedRAM: "pinned RAM", loadedRAM: "loaded RAM", vramLabel: "VRAM", + ramTooltip: "RAM", wm: "wm", wmTitle: "reset watermark", + na: "N/A", live: "live", + models: "models", torch: "torch", other: "other", python: "python", + total: "total", gpuPct: "GPU %", + pageVRAM: "VRAM", pageUnloaded: "unloaded", + vramColor: "VRAM color", totalColor: "Total color", smoothness: "Total smoothness", + reset: "reset", + graphArea: "Area (stacked)", graphBars: "Bars", graphTicker: "Ticker", graphDots: "Dots (fade)", + menuScale: "Scale", menuFontSize: "Font size", menuPoll: "Polling interval", + menuDisplay: "Display", menuMini: "Mini view", menuGraph: "Graph", + menuTheme: "Theme", menuDockWidth: "Dock width", menuLang: "Language", + dockSectionW: "Section width", dockLeft: "Dock left", dockRight: "Dock right", + undock: "Undock to floating", dockTop: "Dock to top", + resetHistory: "Reset history", resetHistoryTitle: "Reset peak VRAM marker and clear history graph", + toggleColorBars: "Color model bars", toggleColorStroke: "Color model stroke", + toggleColorName: "Color model name", toggleShowLegends: "Show legends", + toggleShowTitle: "Show title", toggleExecBtn: "Execute button", + toggleRam: "RAM", toggleVram: "VRAM", togglePagefile: "Pagefile", + toggleIO: "I/O", toggleFaults: "Thrashing (hard faults)", + toggleUtil: "util", toggleNames: "Device names", + toggleNumbers: "Numbers", toggleUnits: "Units", + toggleType: "Type labels", toggleTemp: "temp", togglePower: "power", + toggleSeparators: "Separators", toggleDisk: "Disk", drives: "Drives", + detecting: "detecting…", + unloadAimdo: "aimdo (immediate)", unloadAimdoTitle: "Immediately unload aimdo-managed models", + unloadModels: "models", unloadModelsTitle: "ComfyUI /free — unload models on next queue tick", + unloadCache: "models + node cache", unloadCacheTitle: "ComfyUI /free — unload models and clear node output cache", + diskUnavailable: "unavailable", diskUsed: "used", diskFree: "free", + gpuPowerTitle: "GPU power draw / cap", gpuLineTitle: "Click to toggle GPU line on graph", + langZh: "中文", langEn: "English", + } +}; + +function _t(key) { return (L[lang] && L[lang][key]) || key; } + +const STORAGE_KEY = "aimdo_viz_state"; +function loadState() { + try { return JSON.parse(localStorage.getItem(STORAGE_KEY)) || {}; } + catch { return {}; } +} +function saveState(patch) { + const s = loadState(); + Object.assign(s, patch); + localStorage.setItem(STORAGE_KEY, JSON.stringify(s)); +} + +// Themes live in aimdo_viz.css as `[data-aimdo-theme=""]` blocks layered +// over a :root default. Selecting a theme is just setting that attribute on +// — CSS does the rest. JS keeps a parallel `C` palette object only +// because can't read CSS variables; canvas rendering reads hex/rgb +// strings from C, which we refresh from computed CSS on each theme switch. +const THEME_NAMES = ["default", "comfy", "light", "sepia", "fallout", "pink", "lucifer"]; + +// Keys whose values are color strings the canvas can read directly. fadeOutFrom / +// fadeOutTo are stored as comma-separated RGB triplets in CSS and parsed into +// [r,g,b] arrays for the canvas fade animation. +const PALETTE_KEYS = Object.freeze([ + "vram","torch","pinned","loadedRam","unloaded","torchCache","python","other", + "text","textDim","running","bg","rowBg","headerBg","border","btn","btnText", + "graphBg","gridLine","totalLine","gpuUtil","gpuUtilHi","capLine","barBg", +]); +const MODEL_TYPE_KEYS = Object.freeze([ + "model","vae","clip","clip_vision","controlnet","style_model","gligen","upscale_model", +]); +const RGB_KEYS = Object.freeze(["fadeOutFrom", "fadeOutTo"]); + +// Filled by applyPalette() from computed CSS once the stylesheet is loaded. +// Canvas drawing reads from here because can't read CSS variables; +// the DOM reads var(--aimdo-X) directly from CSS and never touches C. +const C = {}; +const MODEL_TYPE_COLOR = {}; + +// Load the stylesheet and expose the load as a promise. Init code awaits this +// before touching C so the canvas never draws against an unpopulated palette. +const cssLoaded = new Promise((resolve) => { + const id = "aimdo-viz-stylesheet"; + if (document.getElementById(id)) { resolve(); return; } + const link = document.createElement("link"); + link.id = id; + link.rel = "stylesheet"; + link.href = new URL("xb_memory_viz.css", import.meta.url).href; + link.addEventListener("load", () => resolve(), { once: true }); + link.addEventListener("error", () => resolve(), { once: true }); // proceed even on 404 + document.head.appendChild(link); +}); + +// The panel uses a custom element, hook disconnectedCallback to detect whena something removes it from the DOM +if (!customElements.get("aimdo-viz-panel")) { + customElements.define("aimdo-viz-panel", class extends HTMLElement { + disconnectedCallback() { if (this._onDisconnect) this._onDisconnect(); } + }); +} + +function parseRgbTriplet(s) { + const parts = s.split(",").map(x => parseInt(x.trim(), 10)); + if (parts.length === 3 && parts.every(Number.isFinite)) return parts; + return null; +} + +// Set the theme on so the matching CSS block takes effect, then +// refresh C from computed CSS variables for canvas use. +function applyPalette(name) { + const root = document.documentElement; + if (name && name !== "default" && THEME_NAMES.includes(name)) { + root.dataset.aimdoTheme = name; + } else { + delete root.dataset.aimdoTheme; + } + const cs = getComputedStyle(root); + for (const k of PALETTE_KEYS) { + const v = cs.getPropertyValue(`--aimdo-${k}`).trim(); + if (v) C[k] = v; + } + for (const k of MODEL_TYPE_KEYS) { + const v = cs.getPropertyValue(`--aimdo-type-${k}`).trim(); + if (v) MODEL_TYPE_COLOR[k] = v; + } + for (const k of RGB_KEYS) { + const v = cs.getPropertyValue(`--aimdo-${k}`).trim(); + const rgb = v && parseRgbTriplet(v); + if (rgb) C[k] = rgb; + } +} + +// The "comfy" theme maps --aimdo-* to ComfyUI's --comfy-*/--color-* tokens via +// var(). Those tokens themselves change when ComfyUI toggles its .dark-theme +// class on or . DOM elements track that automatically through +// the cascade, but the cached `C` palette used by the canvas does not — so we +// re-run applyPalette whenever the host's theme class flips. +function watchHostThemeFlip() { + const reapply = () => { if (currentTheme === "comfy") applyPalette("comfy"); }; + const opts = { attributes: true, attributeFilter: ["class"] }; + new MutationObserver(reapply).observe(document.documentElement, opts); + if (document.body) new MutationObserver(reapply).observe(document.body, opts); +} + +function hexToRgb(hex) { + const h = hex.replace("#", ""); + return [parseInt(h.slice(0, 2), 16), parseInt(h.slice(2, 4), 16), parseInt(h.slice(4, 6), 16)]; +} +function hexToRgba(hex, alpha) { + const [r, g, b] = hexToRgb(hex); + return `rgba(${r},${g},${b},${alpha})`; +} +// blend [r,g,b] toward white. Used so fade-in stays in the type's hue family. +function lightenRgb([r, g, b], amount) { + return [ + Math.round(r + (255 - r) * amount), + Math.round(g + (255 - g) * amount), + Math.round(b + (255 - b) * amount), + ]; +} + +initGraph({ C, hexToRgb, hexToRgba, saveState, _t }); + + +function escHtml(s) { + return String(s).replace(/&/g, "&").replace(//g, ">").replace(/"/g, """); +} + +function gpuUtilColor(pct) { + if (pct < 10) return C.textDim; + if (pct < 80) return C.gpuUtil; + return C.gpuUtilHi; +} + +function gpuTempColor(c) { + if (c < 60) return C.textDim; + if (c < 80) return C.gpuUtil; + return C.gpuUtilHi; +} + +function gpuPowerColor(draw_mW, limit_mW) { + if (draw_mW == null) return C.textDim; + if (limit_mW == null || limit_mW <= 0) return C.gpuUtil; + return gpuUtilColor(draw_mW / limit_mW * 100); +} + +function formatPower(draw_mW, limit_mW, withUnit = true) { + if (draw_mW == null) return null; + const draw = Math.round(draw_mW / 1000); + const u = withUnit ? "W" : ""; + if (limit_mW == null || limit_mW <= 0) return `${draw}${u}`; + return `${draw}/${Math.round(limit_mW / 1000)}${u}`; +} + +function formatClock(ms) { + const d = new Date(ms); + const pad = n => n.toString().padStart(2, "0"); + return `${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`; +} + +function shortenGpuName(name) { + return name.replace(/^NVIDIA\s+/i, "").replace(/^GeForce\s+/i, "").replace(/\s+Laptop GPU$/i, ""); +} + +function shortenCpuName(name) { + return name + .replace(/\(R\)|\(TM\)|\(tm\)/gi, "") + .replace(/\s+CPU\s+@.*$/i, "") // "i9-12900K CPU @ 3.20GHz" → "i9-12900K" + .replace(/\s+\d+-Core\s+Processor$/i, "")// "Ryzen 9 7950X 16-Core Processor" → "Ryzen 9 7950X" + .replace(/^Intel\s+Core\s+/i, "") + .replace(/^AMD\s+/i, "") + .replace(/\s+/g, " ") + .trim(); +} + +function formatBytes(bytes, withUnit = true) { + if (bytes == null) return "?"; + // non-breaking space ( ) so "8.4 GB" never line-wraps between value and unit. + if (bytes >= 1024 ** 3) return (bytes / 1024 ** 3).toFixed(1) + (withUnit ? " GB" : ""); + if (bytes >= 1024 ** 2) return (bytes / 1024 ** 2).toFixed(0) + (withUnit ? " MB" : ""); + return (bytes / 1024).toFixed(0) + (withUnit ? " KB" : ""); +} + + +// "C:\" → "C:", "/" stays "/". Avoids stripping a bare root slash on POSIX. +function shortMountpoint(mp) { + if (!mp) return ""; + if (mp.length > 1) return mp.replace(/[\\\/]+$/, ""); + return mp; +} + +function buildDiskTooltip(disks) { + if (!disks || !disks.length) return ""; + return disks.map(d => { + const mp = shortMountpoint(d.mountpoint); + const label = d.label ? ` "${d.label}"` : ""; + if (d.total == null || d.free == null) return `${mp}${label}: ${_t("diskUnavailable")}`; + const used = d.total - d.free; + const pct = Math.round(used / d.total * 100); + return `${mp}${label}: ${formatBytes(used)} / ${formatBytes(d.total)} (${_t("diskUsed")}${pct}%, ${_t("diskFree")}${formatBytes(d.free)})`; + }).join("\n"); +} + +// per-model residency diff state +const modelState = {}; + +function diffResidency(key, residency) { + let st = modelState[key]; + if (!st || st.prev.length !== residency.length) { + st = { prev: new Uint8Array(residency), changeAge: new Uint8Array(residency.length) }; + modelState[key] = st; + return st; + } + + for (let i = 0; i < residency.length; i++) { + if (residency[i] !== st.prev[i]) { + st.changeAge[i] = FADE_TICKS; + } else if (st.changeAge[i] > 0) { + st.changeAge[i]--; + } + st.prev[i] = residency[i]; + } + return st; +} + +// draw page grid to canvas — much faster than 700 DOM divs. +// vramColor (hex) tints static cells and the fade-in landing color per model. +// Normal mode keeps the original yellow→vram "warm-up" pulse; per-model coloring +// uses a lightened type color so the hue stays in the model's family. +function drawPageGrid(ctx, cssW, residency, changeAge, panelScale, vramColor) { + const vramHex = vramColor || C.vram; + const vramRgb = hexToRgb(vramHex); + const fadeInFromRgb = vramColor ? lightenRgb(vramRgb, 0.55) : [255, 220, 0]; + const cellSize = 6; + const gap = 1; + const step = cellSize + gap; + const cols = Math.max(1, Math.floor((cssW + gap) / step)); + const rows = Math.ceil(residency.length / cols); + const cssH = rows * step; + + const dpr = window.devicePixelRatio || 1; + const totalScale = panelScale * dpr; + const canvas = ctx.canvas; + const backingW = Math.max(1, Math.round(cssW * totalScale)); + const backingH = Math.max(1, Math.round((cssH || 1) * totalScale)); + + // skip draw when nothing's animating and inputs match the previous call. + let anyAnimating = false; + for (let i = 0; i < changeAge.length; i++) if (changeAge[i] > 0) { anyAnimating = true; break; } + const sig = `${vramHex}|var(--aimdo-unloaded)|${backingW}x${backingH}|${residency.length}`; + if (!anyAnimating && canvas._lastSig === sig) return; + canvas._lastSig = sig; + + if (canvas.width !== backingW) canvas.width = backingW; + if (canvas.height !== backingH) canvas.height = backingH; + canvas.style.height = (cssH || 1) + "px"; + ctx.setTransform(totalScale, 0, 0, totalScale, 0, 0); + ctx.clearRect(0, 0, cssW, cssH || 1); + + // batch: draw all static vram cells, then all static unloaded, then animated individually + const animated = []; + + ctx.fillStyle = vramColor || C.vram; + for (let i = 0; i < residency.length; i++) { + if (changeAge[i] > 0) { animated.push(i); continue; } + if (!(residency[i] & 1)) continue; + ctx.fillRect((i % cols) * step, Math.floor(i / cols) * step, cellSize, cellSize); + } + + ctx.fillStyle = C.unloaded; + for (let i = 0; i < residency.length; i++) { + if (changeAge[i] > 0 || (residency[i] & 1)) continue; + ctx.fillRect((i % cols) * step, Math.floor(i / cols) * step, cellSize, cellSize); + } + + // fade-in: lightened type color → type color. fade-out: red → gray (universal "removed"). + for (const i of animated) { + const resident = residency[i] & 1; + const t = changeAge[i] / FADE_TICKS; + const [fr, fg, fb] = resident ? fadeInFromRgb : C.fadeOutFrom; + const [tr, tg, tb] = resident ? vramRgb : C.fadeOutTo; + ctx.fillStyle = `rgb(${Math.round(fr * t + tr * (1 - t))},${Math.round(fg * t + tg * (1 - t))},${Math.round(fb * t + tb * (1 - t))})`; + ctx.fillRect((i % cols) * step, Math.floor(i / cols) * step, cellSize, cellSize); + } +} + +function createPanel() { + const saved = loadState(); + if (saved.pollInterval) pollInterval = saved.pollInterval; + loadGraphSavedState(saved); + if (typeof saved.colorModelBars === "boolean") colorModelBars = saved.colorModelBars; + if (typeof saved.colorModelStroke === "boolean") colorModelStroke = saved.colorModelStroke; + if (typeof saved.colorModelName === "boolean") colorModelName = saved.colorModelName; + if (typeof saved.showLegends === "boolean") showLegends = saved.showLegends; + if (typeof saved.showRamInMini === "boolean") showRamInMini = saved.showRamInMini; + if (typeof saved.showVramInMini === "boolean") showVramInMini = saved.showVramInMini; + if (typeof saved.showGpuInMini === "boolean") showGpuInMini = saved.showGpuInMini; + if (typeof saved.showCpuInMini === "boolean") showCpuInMini = saved.showCpuInMini; + if (typeof saved.showPagefileInMini === "boolean") showPagefileInMini = saved.showPagefileInMini; + if (typeof saved.showDiskInMini === "boolean") showDiskInMini = saved.showDiskInMini; + if (typeof saved.showFaultsInMini === "boolean") showFaultsInMini = saved.showFaultsInMini; + if (Array.isArray(saved.selectedDisks)) selectedDisks = saved.selectedDisks.slice(); + if (typeof saved.showHwNames === "boolean") showHwNames = saved.showHwNames; + if (typeof saved.showTitle === "boolean") showTitle = saved.showTitle; + if (typeof saved.showExecBtn === "boolean") showExecBtn = saved.showExecBtn; + if (typeof saved.miniShowNumbers === "boolean") miniShowNumbers = saved.miniShowNumbers; + if (typeof saved.miniShowUnits === "boolean") miniShowUnits = saved.miniShowUnits; + if (typeof saved.miniShowType === "boolean") miniShowType = saved.miniShowType; + if (typeof saved.miniShowGpuTemp === "boolean") miniShowGpuTemp = saved.miniShowGpuTemp; + if (typeof saved.miniShowGpuPower === "boolean") miniShowGpuPower = saved.miniShowGpuPower; + if (typeof saved.miniShowSeparators === "boolean") miniShowSeparators = saved.miniShowSeparators; + if (typeof saved.graphHeight === "number" && saved.graphHeight > 0) graphHeight = saved.graphHeight; + if (typeof saved.theme === "string" && THEME_NAMES.includes(saved.theme)) { + currentTheme = saved.theme; + } + if (typeof saved.fontSize === "number" && saved.fontSize >= 8 && saved.fontSize <= 24) { + fontSize = saved.fontSize; + } + if (typeof saved.lang === "string" && (saved.lang === "zh" || saved.lang === "en")) { + lang = saved.lang; + } + // always run — primes C from computed CSS so the canvas matches the stylesheet + applyPalette(currentTheme); + watchHostThemeFlip(); + if (saved.modelCollapsed && typeof saved.modelCollapsed === "object") modelCollapsed = saved.modelCollapsed; + let panelScale = typeof saved.scale === "number" ? saved.scale : 1; + + // structural styles live in aimdo_viz.css; CSS variables on :root carry the palette. + // theme switches go through applyPalette → setCssVars; no per-element repaint here. + const panel = document.createElement("aimdo-viz-panel"); + panel.id = "aimdo-viz-panel"; + panel.style.zoom = panelScale; + panel.style.setProperty('--aimdo-font-size', fontSize + 'px'); + panel._scale = panelScale; + if (saved.width != null) panel.style.width = Math.min(saved.width, window.innerWidth) / panelScale + "px"; + // explicit height only when expanded; collapsed shrinks to header. + // separate height persistence per mode — expanding/collapsing loads the right one + const initialHeight = saved.collapsed ? saved.heightCollapsed : saved.height; + if (initialHeight != null) { + panel.style.height = Math.min(initialHeight, window.innerHeight) / panelScale + "px"; + } else if (!saved.collapsed) { + // 无保存高度时设置合理的默认高度,防止内容显示不全 + panel.style.height = Math.min(480, window.innerHeight * 0.5) / panelScale + "px"; + } + + // CSS sizes are pre-zoom (logical); divide visual targets by panelScale. + // 50vh cap when auto-growing; relaxes to viewport when user sets explicit height. + let pipWindow = null; // set when the panel is moved into a PiP window + const isPoppedOut = () => pipWindow && !pipWindow.closed; + function applyConstraints() { + if (isPoppedOut()) return; // PiP fills its own window; main-page bounds don't apply + const heightCapFrac = panel.style.height ? 1.0 : 0.5; + panel.style.minWidth = (200 / panelScale) + "px"; + panel.style.maxWidth = (window.innerWidth / panelScale) + "px"; + panel.style.maxHeight = (window.innerHeight * heightCapFrac / panelScale) + "px"; + } + applyConstraints(); + + // .graph-canvas-panel shrinks when sidebars open; #graph-canvas-container doesn't + function getCanvasEl() { + return document.querySelector(".graph-canvas-panel") + || document.getElementById("graph-canvas-container") + || document.getElementById("graph-canvas") + || (app && app.canvasEl) + || null; + } + + function getCanvasBounds() { + const el = getCanvasEl(); + if (el) { + const r = el.getBoundingClientRect(); + if (r.width > 0 && r.height > 0) return r; + } + return { left: 0, top: 0, right: window.innerWidth, bottom: window.innerHeight }; + } + + let rightOffset = saved.rightOffset != null ? saved.rightOffset : 10; + let bottomOffset = saved.bottomOffset != null ? saved.bottomOffset : 10; + + // Topbar/tabs sit above the panel; leaf bars block only where their items actually sit. + // Cache the layout so drag mousemoves don't trigger getBoundingClientRect on every leaf. + let chromeCache = null; + function refreshChromeCache() { + const fullSels = [".comfyui-body-top", ".topbar-container", ".workflow-tabs-container", ".workflow-tabs"]; + let bottom = 0; + for (const s of fullSels) { + for (const el of document.querySelectorAll(s)) { + const r = el.getBoundingClientRect(); + if (r.height > 0 && r.bottom > bottom) bottom = r.bottom; + } + } + const containers = []; + const leaves = []; + for (const el of document.querySelectorAll(".actionbar-container")) { + const r = el.getBoundingClientRect(); + if (r.height <= 0) continue; + containers.push({ left: r.left, right: r.right, bottom: r.bottom }); + for (const node of el.querySelectorAll("*")) { + if (node.children.length > 0) continue; + const nr = node.getBoundingClientRect(); + if (nr.width <= 0 || nr.height <= 0) continue; + leaves.push({ left: nr.left, right: nr.right, bottom: nr.bottom }); + } + } + const sideLeft = []; + const sideRight = []; + for (const el of document.querySelectorAll(".side-toolbar-container")) { + const r = el.getBoundingClientRect(); + if (r.width <= 0) continue; + const isLeft = r.left < 8; + const isRight = window.innerWidth - r.right < 8; + if (isLeft) sideLeft.push({ right: r.right, top: r.top, bottom: r.bottom }); + else if (isRight) sideRight.push({ left: r.left, top: r.top, bottom: r.bottom }); + } + chromeCache = { fullBottom: bottom, containers, leaves, sideLeft, sideRight }; + } + function invalidateChromeCache() { chromeCache = null; } + // sidebars don't fire window.resize and may overlay (not shrink) the canvas, so the + // canvas ResizeObserver alone can't catch them — drop the stale cache and re-clamp here. + function onSideChromeChange() { invalidateChromeCache(); applyOffsets(); } + window.addEventListener("resize", invalidateChromeCache); + let chromeObserversAttached = false; + function attachChromeObservers() { + if (chromeObserversAttached) return; + const ac = document.querySelector(".actionbar-container"); + const top = document.querySelector(".comfyui-body-top"); + if (!ac && !top) { requestAnimationFrame(attachChromeObservers); return; } + chromeObserversAttached = true; + const targets = [ac, top].filter(Boolean); + for (const t of targets) { + new MutationObserver(invalidateChromeCache).observe(t, { childList: true, subtree: true }); + if (typeof ResizeObserver !== "undefined") new ResizeObserver(invalidateChromeCache).observe(t); + } + // body-side wrappers are stable grid areas; the sidebar panel toggles inside them, + // changing their width. Observe both so opening either sidebar re-clamps the panel. + for (const sel of [".comfyui-body-left", ".comfyui-body-right"]) { + const el = document.querySelector(sel); + if (!el) continue; + // childList only (no subtree) — catch the panel toggling in/out without firing + // on the sidebar's own live content updates. Width changes covered by the resize obs. + new MutationObserver(onSideChromeChange).observe(el, { childList: true }); + if (typeof ResizeObserver !== "undefined") new ResizeObserver(onSideChromeChange).observe(el); + } + } + attachChromeObservers(); + + function getTopChromeBottom(panelLeft, panelRight) { + if (!chromeCache) refreshChromeCache(); + let bottom = chromeCache.fullBottom; + if (panelLeft == null) { + for (const c of chromeCache.containers) if (c.bottom > bottom) bottom = c.bottom; + return bottom; + } + for (const nr of chromeCache.leaves) { + if (nr.right <= panelLeft || nr.left >= panelRight) continue; + if (nr.bottom > bottom) bottom = nr.bottom; + } + return bottom; + } + + function getSideChromeBounds(panelTop, panelBottom) { + if (!chromeCache) refreshChromeCache(); + let minLeft = 0; + let maxRight = window.innerWidth; + for (const r of chromeCache.sideLeft) { + if (panelTop != null && (r.bottom <= panelTop || r.top >= panelBottom)) continue; + if (r.right > minLeft) minLeft = r.right; + } + for (const r of chromeCache.sideRight) { + if (panelTop != null && (r.bottom <= panelTop || r.top >= panelBottom)) continue; + if (r.left < maxRight) maxRight = r.left; + } + return { minLeft, maxRight }; + } + + function clampOffsets(ro, bo) { + const b = getCanvasBounds(); + const pr = panel.getBoundingClientRect(); + const w = pr.width, h = pr.height; + const vw = window.innerWidth, vh = window.innerHeight; + const panelRight = b.right - ro; + const panelLeft = panelRight - w; + const panelTop = b.bottom - bo - h; + const panelBottom = b.bottom - bo; + const minTop = getTopChromeBottom(panelLeft, panelRight); + const { minLeft, maxRight } = getSideChromeBounds(panelTop, panelBottom); + + // when window's too short for both constraints, prefer the chrome + // clamp over the viewport edge so we never overlap the topbar/sidebar. + const boHi = b.bottom - h - minTop; + const boLo = b.bottom - vh; + const boClamped = boHi < boLo ? boHi : Math.max(boLo, Math.min(bo, boHi)); + + // roLo combines viewport-right and right-chrome constraints (whichever is tighter). + const roHi = b.right - w - minLeft; + const roLo = Math.max(b.right - vw, b.right - maxRight); + const roClamped = roHi < roLo ? roHi : Math.max(roLo, Math.min(ro, roHi)); + return { ro: roClamped, bo: boClamped, b, w, h }; + } + + // visual-only clamp; closure offsets stay as user intent so they survive temporary shrinks. + // CSS zoom scales style.left/top along with size, so we divide by panelScale to land at + // the intended viewport position rather than position × scale. + function applyOffsets() { + if (pipWindow && !pipWindow.closed) return; // PiP owns layout while popped out + if (isDocked) return; // docked panel lives in the actionbar flex flow + const { ro, bo, b, w, h } = clampOffsets(rightOffset, bottomOffset); + // while actively dragging, bypass clamping so the user can fly over the topbar + // to reach the dock drop zone. mouseup re-clamps before persisting. + const useRo = dragging ? rightOffset : ro; + const useBo = dragging ? bottomOffset : bo; + const tx = (b.right - w - useRo) / panelScale; + const ty = (b.bottom - h - useBo) / panelScale; + panel.style.left = "0"; + panel.style.top = "0"; + panel.style.right = "auto"; + panel.style.bottom = "auto"; + // translate3d keeps positioning on the compositor — no layout per drag move. + panel.style.transform = `translate3d(${tx}px, ${ty}px, 0)`; + } + window.addEventListener("resize", () => { applyConstraints(); applyOffsets(); positionDockedBody(); }); + + // --- Docking to ComfyUI's top actionbar --- + // Same pattern as ComfyActionbar.vue: during a drag we expose a drop zone inside + // .actionbar-container; mouseup-while-hovering reparents the panel into that container + // and switches it to a flat horizontal mini-bar layout via the .aimdo-docked class. + let isDocked = !!saved.docked; + let dockSide = saved.dockSide === "left" ? "left" : "right"; + let dockExpanded = false; // session-only: body shown as overlay below the docked mini-bar + let autoDockPending = false; // true while the post-load redock poll is running + let dockSectionWidth = (typeof saved.dockSectionWidth === "number" && saved.dockSectionWidth > 40) + ? saved.dockSectionWidth : 110; + let savedPanelCss = null; // snapshot before docking so undock can restore exact styles + let preDockCollapsed = null; + let dropZoneLeft = null; // present only while a drag is in progress + let dropZoneRight = null; + let dropZoneHoverSide = null; // "left" | "right" | null + function applyDockSectionWidth() { + panel.style.setProperty("--aimdo-dock-section-w", dockSectionWidth + "px"); + positionDockedBody(); + } + applyDockSectionWidth(); + + // overlay anchored under the docked panel; right-docked panels extend the overlay leftward + // so it doesn't get pushed off-screen when the panel sits at the topbar's right edge. + function positionDockedBody() { + if (!isDocked || !dockExpanded) return; + const r = panel.getBoundingClientRect(); + const ac = getActionbarContainer(); + const acr = ac ? ac.getBoundingClientRect() : null; + const overlayW = 420; + const anchor = dockSide === "right" + ? (acr ? acr.right - overlayW : r.right - overlayW) + : (acr ? acr.left : r.left); + const left = Math.max(4, Math.min(window.innerWidth - overlayW - 4, anchor)); + body.style.top = (r.bottom + 12) + "px"; + body.style.left = left + "px"; + } + + function getActionbarContainer() { + return document.querySelector(".actionbar-container"); + } + + // two zones — one before the existing actionbar items, one after — let the user choose + // which side to dock on via CSS order on the panel. + function makeDropZone(side) { + const dz = document.createElement("div"); + dz.className = "aimdo-dropzone aimdo-dropzone-" + side; + dz.textContent = side === "left" ? _t("dockLeft") : _t("dockRight"); + dz.addEventListener("mouseenter", () => { + if (!dragging) return; + dropZoneHoverSide = side; + dz.classList.add("is-hover"); + }); + dz.addEventListener("mouseleave", () => { + if (dropZoneHoverSide === side) dropZoneHoverSide = null; + dz.classList.remove("is-hover"); + }); + return dz; + } + function ensureDropZone() { + const ac = getActionbarContainer(); + if (!ac) return null; + if (dropZoneLeft && dropZoneLeft.parentNode === ac) return ac; + if (dropZoneLeft) dropZoneLeft.remove(); + if (dropZoneRight) dropZoneRight.remove(); + dropZoneLeft = makeDropZone("left"); + dropZoneRight = makeDropZone("right"); + ac.appendChild(dropZoneLeft); + ac.appendChild(dropZoneRight); + return ac; + } + function clearDropZone() { + dropZoneHoverSide = null; + if (dropZoneLeft) { dropZoneLeft.remove(); dropZoneLeft = null; } + if (dropZoneRight) { dropZoneRight.remove(); dropZoneRight = null; } + } + + function dock(side) { + const ac = getActionbarContainer(); + if (!ac) return false; + if (side === "left" || side === "right") dockSide = side; + if (isDocked) { + panel.style.order = dockSide === "left" ? "-1" : "1"; + if (panel.parentNode !== ac) ac.appendChild(panel); + saveState({ dockSide }); + return true; + } + preDockCollapsed = collapsed; + if (!collapsed) { + collapsed = true; + body.style.display = "none"; + miniBar.style.display = "block"; + toggleBtn.textContent = "+"; + } + dockExpanded = false; + savedPanelCss = panel.style.cssText; + panel.classList.add("aimdo-docked"); + panel.style.order = dockSide === "left" ? "-1" : "1"; + ac.appendChild(panel); + isDocked = true; + saveState({ docked: true, dockSide }); + return true; + } + + function reconcileDocking() { + if (!isDocked || panel.isConnected) return; + const ac = getActionbarContainer(); + if (!ac) return; + panel.style.order = dockSide === "left" ? "-1" : "1"; + ac.appendChild(panel); + } + // The panel is a custom element — its disconnectedCallback fires the instant Vue + // (or anything else) removes it from the DOM. + panel._onDisconnect = () => { if (isDocked) queueMicrotask(reconcileDocking); }; + + function undock() { + autoDockPending = false; // explicit undock cancels any in-flight auto-redock poll + if (!isDocked) return; + dockExpanded = false; + panel.classList.remove("aimdo-docked", "aimdo-docked-expanded"); + body.style.top = ""; + body.style.left = ""; + if (savedPanelCss != null) panel.style.cssText = savedPanelCss; + savedPanelCss = null; + document.body.appendChild(panel); + isDocked = false; + const restoreCollapsed = preDockCollapsed != null ? preDockCollapsed : false; + preDockCollapsed = null; + collapsed = restoreCollapsed; + body.style.display = collapsed ? "none" : "flex"; + miniBar.style.display = collapsed ? "block" : "none"; + toggleBtn.textContent = collapsed ? "+" : "−"; + if (!collapsed) { + const s = loadState(); + const h = s.height; + panel.style.height = h != null ? (Math.min(h, window.innerHeight) / panelScale + "px") : ""; + } + saveState({ collapsed, docked: false }); + applyConstraints(); + applyOffsets(); + } + + const header = document.createElement("div"); + header.className = "aimdo-header"; + // visible drag affordance matching ComfyUI's docked actionbar handle — six dots in a 2x3 grid + const dragHandle = document.createElement("span"); + dragHandle.className = "aimdo-drag-handle"; + dragHandle.title = _t("dragMove"); + header.appendChild(dragHandle); + const titleSpan = document.createElement("span"); + titleSpan.className = "aimdo-title"; + titleSpan.textContent = _t("title"); + header.appendChild(titleSpan); + + const miniBar = document.createElement("div"); + miniBar.className = "aimdo-mini-bar"; + miniBar.innerHTML = `

+
+
+ ${_t("vram")} +
+
+
+
+
+
+
+
+
+
+ ${_t("pagefile")} +
+
+
+
+
+
+
+ ${_t("faults")} +
+
+
+
+
+ ${_t("disk")} +
+
+
+ +
+
+
+ +
+
+
+
+ ${_t("diskSpace")} +
+
+
+
+
+ CPU +
+
+
+
+
+ GPU +
+
+
+ +
+
+
+ +
+
+
+ +
+
`; + + // refs cached once so the per-tick render path doesn't re-query + const mbRefs = { + bar: miniBar, + ramSection: miniBar.querySelector(".mini-ram-section"), + ramLabel: miniBar.querySelector(".mini-ram-label"), + ramUsage: miniBar.querySelector(".mini-ram-usage"), + ramSegs: miniBar.querySelectorAll(".mini-ram-bar > .aimdo-seg"), + vramSection: miniBar.querySelector(".mini-vram-section"), + vramLabel: miniBar.querySelector(".mini-vram-label"), + vramUsage: miniBar.querySelector(".mini-vram-usage"), + vramSegs: miniBar.querySelectorAll(".mini-vram-bar > .aimdo-seg"), + cpuSection: miniBar.querySelector(".mini-cpu-section"), + cpuLabel: miniBar.querySelector(".mini-cpu-label"), + cpuUsage: miniBar.querySelector(".mini-cpu-usage"), + cpuFill: miniBar.querySelector(".mini-cpu-fill"), + pagefileSection: miniBar.querySelector(".mini-pagefile-section"), + pagefileLabel: miniBar.querySelector(".mini-pagefile-label"), + pagefileUsage: miniBar.querySelector(".mini-pagefile-usage"), + pagefileSegs: miniBar.querySelectorAll(".mini-pagefile-bar > .aimdo-seg"), + faultsSection: miniBar.querySelector(".mini-faults-section"), + faultsLabel: miniBar.querySelector(".mini-faults-label"), + faultsUsage: miniBar.querySelector(".mini-faults-usage"), + faultsFill: miniBar.querySelector(".mini-faults-fill"), + diskSection: miniBar.querySelector(".mini-disk-section"), + diskLabel: miniBar.querySelector(".mini-disk-label"), + diskReadUsage: miniBar.querySelector(".mini-disk-read-usage"), + diskReadFill: miniBar.querySelector(".mini-disk-read-fill"), + diskWriteUsage: miniBar.querySelector(".mini-disk-write-usage"), + diskWriteFill: miniBar.querySelector(".mini-disk-write-fill"), + diskSpaceSection: miniBar.querySelector(".mini-diskspace-section"), + diskSpaceLabel: miniBar.querySelector(".mini-diskspace-label"), + diskSpaceRows: miniBar.querySelector(".mini-diskspace-rows"), + gpuSection: miniBar.querySelector(".mini-gpu-section"), + gpuRow: miniBar.querySelector(".mini-gpu-row"), + gpuLabel: miniBar.querySelector(".mini-gpu-label"), + gpuHeaderValue: miniBar.querySelector(".mini-gpu-header-value"), + utilRow: miniBar.querySelector(".mini-util-row"), + gpuUsage: miniBar.querySelector(".mini-gpu-usage"), + gpuFill: miniBar.querySelector(".mini-gpu-fill"), + tempRow: miniBar.querySelector(".mini-temp-row"), + tempUsage: miniBar.querySelector(".mini-temp-usage"), + tempFill: miniBar.querySelector(".mini-temp-fill"), + powerRow: miniBar.querySelector(".mini-power-row"), + powerUsage: miniBar.querySelector(".mini-power-usage"), + powerFill: miniBar.querySelector(".mini-power-fill"), + }; + miniBar._refs = mbRefs; + + const headerRight = document.createElement("div"); + headerRight.className = "aimdo-header-right"; + + // optional play / cancel-running button. Toggles based on execState.running which + // setup() keeps current via api event listeners; we also call updateExecBtnState + // directly from those listeners so the button flips the instant execution starts/ends. + const execBtn = document.createElement("span"); + execBtn.className = "aimdo-exec-btn"; + execBtn.style.display = showExecBtn ? "" : "none"; + function updateExecBtnState() { + if (execState.running) { + execBtn.classList.add("is-running"); + execBtn.textContent = "■"; + execBtn.title = _t("cancelRun"); + } else { + execBtn.classList.remove("is-running"); + execBtn.textContent = "▶"; + execBtn.title = _t("runWorkflow"); + } + } + updateExecBtnState(); + let execBusy = false; + execBtn.addEventListener("click", async (e) => { + e.stopPropagation(); + // re-entrancy guard: fast double-clicks during the in-flight request would + // otherwise double-queue (or send a redundant interrupt). + if (execBusy) return; + execBusy = true; + try { + if (execState.running) await api.interrupt(null); + else await app.queuePrompt(0); + } catch (err) { + console.error("aimdo-viz: exec/interrupt failed", err); + } finally { + execBusy = false; + } + }); + headerRight.appendChild(execBtn); + + const unloadBtn = document.createElement("span"); + unloadBtn.className = "aimdo-btn"; + unloadBtn.textContent = _t("unload"); + unloadBtn.title = _t("unloadTitle"); + + const unloadMenu = document.createElement("div"); + unloadMenu.className = "aimdo-menu"; + unloadMenu.style.minWidth = "160px"; + const unloadOptions = [ + { label: _t("unloadAimdo"), title: _t("unloadAimdoTitle"), run: () => + api.fetchApi("/aimdo/unload_all", { method: "POST" }) }, + { label: _t("unloadModels"), title: _t("unloadModelsTitle"), run: () => + api.fetchApi("/free", { method: "POST", + body: JSON.stringify({ unload_models: true }), + headers: { "Content-Type": "application/json" } }) }, + { label: _t("unloadCache"), title: _t("unloadCacheTitle"), run: () => + api.fetchApi("/free", { method: "POST", + body: JSON.stringify({ unload_models: true, free_memory: true }), + headers: { "Content-Type": "application/json" } }) }, + ]; + for (const opt of unloadOptions) { + const item = document.createElement("div"); + item.className = "aimdo-menu-item"; + item.textContent = opt.label; + item.title = opt.title; + item.addEventListener("click", async (e) => { + e.stopPropagation(); + unloadMenu.style.display = "none"; + unloadBtn.textContent = "..."; + try { await opt.run(); } + finally { unloadBtn.textContent = _t("unload"); } + }); + unloadMenu.appendChild(item); + } + document.body.appendChild(unloadMenu); + + unloadBtn.addEventListener("click", (e) => { + e.stopPropagation(); + if (unloadMenu.style.display === "block") { + unloadMenu.style.display = "none"; + return; + } + const r = unloadBtn.getBoundingClientRect(); + unloadMenu.style.zoom = panelScale; + // style.left/top are pre-zoom on a zoomed element, divide visual targets by scale + unloadMenu.style.left = (Math.max(4, r.right - 160 * panelScale) / panelScale) + "px"; + unloadMenu.style.top = ((r.bottom + 2) / panelScale) + "px"; + unloadMenu.style.display = "block"; + }); + document.addEventListener("click", (e) => { + if (e.target !== unloadBtn && !unloadMenu.contains(e.target)) { + unloadMenu.style.display = "none"; + } + }); + + function resetHistory() { + peakVramUsed = 0; + resetHistoryState(); + clearHistoryStorage(); + } + + const popoutBtn = document.createElement("span"); + popoutBtn.className = "aimdo-btn-icon"; + popoutBtn.style.fontSize = "1em"; + popoutBtn.textContent = "\u2924"; + popoutBtn.title = _t("popout"); + popoutBtn.addEventListener("click", async (e) => { + e.stopPropagation(); + if (pipWindow && !pipWindow.closed) { pipWindow.close(); return; } + if (!window.documentPictureInPicture) { + alert("Picture-in-Picture isn't supported here. Try Chrome or Edge."); + return; + } + // PiP rewrites size to fill its window; .aimdo-docked's !important rules would fight it + if (isDocked) undock(); + const r = panel.getBoundingClientRect(); + pipWindow = await window.documentPictureInPicture.requestWindow({ + width: Math.max(280, Math.round(r.width)), + height: Math.max(200, Math.round(r.height)), + }); + // mirror the stylesheet into the PiP window. Wait for the cloned to finish + // loading before continuing, otherwise the panel briefly renders unstyled while the + // CSS file is being fetched in the PiP document. + const styleSrc = document.getElementById("aimdo-viz-stylesheet"); + if (styleSrc) { + const clone = styleSrc.cloneNode(true); + await new Promise((resolve) => { + clone.addEventListener("load", resolve, { once: true }); + clone.addEventListener("error", resolve, { once: true }); // proceed anyway after a 404 + pipWindow.document.head.appendChild(clone); + }); + } + // mirror the active theme onto PiP's — the cloned stylesheet contains + // every theme's overrides, the data attribute picks which block applies + const themeAttr = document.documentElement.dataset.aimdoTheme; + if (themeAttr) pipWindow.document.documentElement.dataset.aimdoTheme = themeAttr; + // remember origins so we can restore on close + const moved = []; + const remember = el => moved.push({ el, parent: el.parentNode, next: el.nextSibling }); + remember(panel); + for (const m of [rootMenu, unloadMenu, ...allSubmenus]) remember(m); + const origPanelCss = panel.style.cssText; + // fill the PiP window; drop the fixed positioning the main-page math expects + Object.assign(panel.style, { + position: "static", left: "auto", top: "auto", right: "auto", bottom: "auto", + transform: "none", + width: "100%", height: "100vh", maxWidth: "none", maxHeight: "none", + border: "none", borderRadius: "0", boxShadow: "none", + }); + pipWindow.document.body.style.margin = "0"; + pipWindow.document.body.style.background = C.bg; + for (const { el } of moved) pipWindow.document.body.appendChild(el); + pipWindow.addEventListener("pagehide", () => { + panel.style.cssText = origPanelCss; + for (const { el, parent, next } of moved) { + if (!parent) continue; + if (next && next.parentNode === parent) parent.insertBefore(el, next); + else parent.appendChild(el); + } + pipWindow = null; + applyOffsets(); + }, { once: true }); + }); + + const toggleBtn = document.createElement("span"); + toggleBtn.className = "aimdo-btn-icon"; + toggleBtn.style.fontSize = "1.333em"; + toggleBtn.textContent = "\u2212"; + toggleBtn.title = _t("collapse"); + + const body = document.createElement("div"); + body.id = "aimdo-viz-body"; + + let collapsed = !!saved.collapsed; + if (collapsed) { + body.style.display = "none"; + toggleBtn.textContent = "+"; + miniBar.style.display = "block"; + } + toggleBtn.addEventListener("click", (e) => { + e.stopPropagation(); + // docked: toggle the overlay body below the docked mini-bar; stays docked + if (isDocked) { + dockExpanded = !dockExpanded; + if (dockExpanded) { + panel.classList.add("aimdo-docked-expanded"); + positionDockedBody(); + toggleBtn.textContent = "\u2212"; + } else { + panel.classList.remove("aimdo-docked-expanded"); + toggleBtn.textContent = "+"; + } + return; + } + collapsed = !collapsed; + body.style.display = collapsed ? "none" : "flex"; + miniBar.style.display = collapsed ? "block" : "none"; + toggleBtn.textContent = collapsed ? "+" : "\u2212"; + // each mode persists its own height so toggling restores the right size. + const s = loadState(); + const h = collapsed ? s.heightCollapsed : s.height; + panel.style.height = h != null ? (Math.min(h, window.innerHeight) / panelScale + "px") : ""; + applyConstraints(); + saveState({ collapsed }); + }); + + headerRight.appendChild(unloadBtn); + headerRight.appendChild(popoutBtn); + headerRight.appendChild(toggleBtn); + header.appendChild(headerRight); + panel.appendChild(header); + panel.appendChild(miniBar); + panel.appendChild(body); + + let dragging = false, dx = 0, dy = 0; + let dragSavedPointerEvents = null; + let dragW = 0, dragH = 0; + let dragRafPending = false; + let dragLastX = 0, dragLastY = 0; + // pendingDrag distinguishes "clicking a button in the header" from "grabbing to drag". + // mousedown only arms; we wait for >DRAG_THRESHOLD px of movement before promoting to a real drag, + // so a click on unload/reset/popout never triggers an undock. + let pendingDrag = null; + const DRAG_THRESHOLD = 5; + + function promoteDrag(e) { + if (pendingDrag.dockedAtStart && isDocked) { + // jump the now-floating panel under the cursor with a reasonable grab offset + undock(); + const r = panel.getBoundingClientRect(); + dx = Math.min(r.width - 20, Math.max(20, 40)); + dy = Math.min(r.height - 8, Math.max(8, 14)); + const b = getCanvasBounds(); + rightOffset = b.right - (e.clientX - dx) - r.width; + bottomOffset = b.bottom - (e.clientY - dy) - r.height; + applyOffsets(); + } + // for non-docked starts, dx/dy were captured at mousedown + dragging = true; + pendingDrag = null; + dragSavedPointerEvents = panel.style.pointerEvents || ""; + panel.style.pointerEvents = "none"; + const r0 = panel.getBoundingClientRect(); + dragW = r0.width; + dragH = r0.height; + ensureDropZone(); + } + + header.addEventListener("mousedown", (e) => { + if (e.button !== 0) return; + // when docked, only the drag handle starts a drag — the title and buttons + // around it must stay plain-clickable. floating mode keeps the whole header. + if (isDocked && !dragHandle.contains(e.target)) return; + autoDockPending = false; // user intent overrides the pending auto-redock + pendingDrag = { startX: e.clientX, startY: e.clientY, dockedAtStart: isDocked }; + if (!isDocked) { + const r = panel.getBoundingClientRect(); + dx = e.clientX - r.left; + dy = e.clientY - r.top; + } + }); + // Ctrl/Cmd + mousedown anywhere on the panel starts a drag — capture phase + // so we intercept before child elements (buttons, edge handles) react + const isModifier = e => (e.ctrlKey || e.metaKey) && e.button === 0; + const updateCursor = (e) => { panel.style.cursor = (e.ctrlKey || e.metaKey) ? "move" : ""; }; + document.addEventListener("keydown", updateCursor); + document.addEventListener("keyup", updateCursor); + window.addEventListener("blur", () => { panel.style.cursor = ""; }); + panel.addEventListener("mousedown", (e) => { + if (!isModifier(e) || dragging || pendingDrag) return; + e.preventDefault(); + e.stopPropagation(); + pendingDrag = { startX: e.clientX, startY: e.clientY, dockedAtStart: isDocked }; + if (!isDocked) { + const r = panel.getBoundingClientRect(); + dx = e.clientX - r.left; + dy = e.clientY - r.top; + } + }, true); + // suppress the click that follows a Ctrl+drag so a Ctrl+click on a button + // doesn't trigger its action after the drag ends + panel.addEventListener("click", (e) => { + if (isModifier(e)) { + e.preventDefault(); + e.stopPropagation(); + } + }, true); + function flushDrag() { + dragRafPending = false; + if (!dragging) return; + const b = getCanvasBounds(); + rightOffset = b.right - (dragLastX - dx) - dragW; + bottomOffset = b.bottom - (dragLastY - dy) - dragH; + applyOffsets(); + } + document.addEventListener("mousemove", (e) => { + if (pendingDrag) { + const adx = Math.abs(e.clientX - pendingDrag.startX); + const ady = Math.abs(e.clientY - pendingDrag.startY); + if (Math.max(adx, ady) < DRAG_THRESHOLD) return; + promoteDrag(e); + } + if (!dragging) return; + dragLastX = e.clientX; + dragLastY = e.clientY; + if (!dragRafPending) { + dragRafPending = true; + requestAnimationFrame(flushDrag); + } + }); + // shared drag-end cleanup so a mouseup off-window (or alt-tab during drag) doesn't + // leave pendingDrag armed, pointer-events stuck at "none", or drop zones in the DOM. + function endDrag(commit) { + pendingDrag = null; + if (!dragging) { + // pendingDrag-only path (click without movement). No drop zones to clear, + // but call clearDropZone defensively in case a stale one slipped through. + clearDropZone(); + return; + } + const wantDockSide = commit ? dropZoneHoverSide : null; + clearDropZone(); + if (dragSavedPointerEvents !== null) { + panel.style.pointerEvents = dragSavedPointerEvents; + dragSavedPointerEvents = null; + } + dragging = false; // before applyOffsets so it uses the clamped position + if (commit) { + if (wantDockSide) { + dock(wantDockSide); + } else { + const c = clampOffsets(rightOffset, bottomOffset); + rightOffset = c.ro; + bottomOffset = c.bo; + applyOffsets(); + saveState({ rightOffset, bottomOffset }); + } + } else { + // abort (blur / alt-tab): snap back into bounds visually without persisting + applyOffsets(); + } + } + document.addEventListener("mouseup", () => endDrag(true)); + window.addEventListener("blur", () => endDrag(false)); + + // edge handles: left grows left (right edge anchored), right grows right (left + // edge anchored via RO ro-delta), bottom grows down (top edge anchored via bo-delta). + let suppressWidthAnchor = false; + let edgeDrag = null; + function makeEdgeHandle(side) { + const h = document.createElement("div"); + h.className = `aimdo-edge-handle aimdo-edge-${side}`; + h.title = _t("dragResize"); + h.addEventListener("mousedown", (e) => { + if (e.button !== 0) return; + e.preventDefault(); + e.stopPropagation(); + // captured at drag start so the RO ro-shift mid-drag can't move the cap. + const r = panel.getBoundingClientRect(); + const { minLeft, maxRight } = getSideChromeBounds(r.top, r.bottom); + const maxWidth = side === "right" ? maxRight - r.left : r.right - minLeft; + edgeDrag = { side, startX: e.clientX, startWidth: r.width, maxWidth }; + if (side === "left") suppressWidthAnchor = true; + }); + panel.appendChild(h); + } + makeEdgeHandle("left"); + makeEdgeHandle("right"); + + // collapsed: can't shrink below header + miniBar. expanded: keep modelsDiv top visible. + function computeMinHeight(panelRect) { + if (collapsed) return miniBar.getBoundingClientRect().bottom - panelRect.top + 2; + if (refs && refs.modelsDiv) { + return Math.max(40, refs.modelsDiv.getBoundingClientRect().top - panelRect.top + 8); + } + return 80; + } + + let bottomDrag = null; + function makeBottomHandle() { + const h = document.createElement("div"); + // inset from the side handles so corners go to the ew-resize handles + h.className = "aimdo-edge-handle aimdo-edge-bottom"; + h.title = _t("dragResize"); + h.addEventListener("mousedown", (e) => { + if (e.button !== 0) return; + e.preventDefault(); + e.stopPropagation(); + const r = panel.getBoundingClientRect(); + const minHeight = computeMinHeight(r); + const maxHeight = window.innerHeight - r.top; + bottomDrag = { startY: e.clientY, startHeight: r.height, minHeight, maxHeight }; + }); + panel.appendChild(h); + } + makeBottomHandle(); + + // bottom-right corner handle: diagonal width+height drag. The grip gradient + hover + // opacity live in aimdo_viz.css now. + let cornerDrag = null; + function makeCornerHandle() { + const h = document.createElement("div"); + h.className = "aimdo-corner-handle"; + h.title = _t("dragResize"); + h.addEventListener("mousedown", (e) => { + if (e.button !== 0) return; + e.preventDefault(); + e.stopPropagation(); + const r = panel.getBoundingClientRect(); + const { minLeft, maxRight } = getSideChromeBounds(r.top, r.bottom); + cornerDrag = { + startX: e.clientX, startY: e.clientY, + startWidth: r.width, startHeight: r.height, + maxWidth: maxRight - r.left, + maxHeight: window.innerHeight - r.top, + minHeight: computeMinHeight(r), + }; + }); + panel.appendChild(h); + } + makeCornerHandle(); + + document.addEventListener("mousemove", (e) => { + if (!edgeDrag) return; + const delta = e.clientX - edgeDrag.startX; + const newWidth = edgeDrag.side === "left" ? edgeDrag.startWidth - delta : edgeDrag.startWidth + delta; + panel.style.width = Math.max(200, Math.min(edgeDrag.maxWidth, newWidth)) / panelScale + "px"; + }); + document.addEventListener("mousemove", (e) => { + if (!bottomDrag) return; + const delta = e.clientY - bottomDrag.startY; + const newHeight = Math.max(bottomDrag.minHeight, Math.min(bottomDrag.maxHeight, bottomDrag.startHeight + delta)); + panel.style.height = (newHeight / panelScale) + "px"; + // relax the 50vh auto-grow cap once user sets an explicit height. + applyConstraints(); + }); + document.addEventListener("mousemove", (e) => { + if (!cornerDrag) return; + const dx = e.clientX - cornerDrag.startX; + const dy = e.clientY - cornerDrag.startY; + const newWidth = Math.max(200, Math.min(cornerDrag.maxWidth, cornerDrag.startWidth + dx)); + const newHeight = Math.max(cornerDrag.minHeight, Math.min(cornerDrag.maxHeight, cornerDrag.startHeight + dy)); + panel.style.width = (newWidth / panelScale) + "px"; + panel.style.height = (newHeight / panelScale) + "px"; + applyConstraints(); + }); + document.addEventListener("mouseup", () => { + if (edgeDrag) { + edgeDrag = null; + suppressWidthAnchor = false; + } + if (bottomDrag) bottomDrag = null; + if (cornerDrag) cornerDrag = null; + }); + + // menu chrome lives in aimdo_viz.css (.aimdo-menu). Submenus differ only by + // position which we set inline at openSubmenu time. + function makeMenu() { + const m = document.createElement("div"); + m.className = "aimdo-menu"; + return m; + } + const rootMenu = makeMenu(); + const scaleSubmenu = makeMenu(); + const pollSubmenu = makeMenu(); + const displaySubmenu = makeMenu(); + const miniSubmenu = makeMenu(); + const themeSubmenu = makeMenu(); + const dockWidthSubmenu = makeMenu(); + const graphSubmenu = makeMenu(); + const gpuSubmenu = makeMenu(); + const diskSubmenu = makeMenu(); + const fontSizeSubmenu = makeMenu(); + const langSubmenu = makeMenu(); + const allSubmenus = [scaleSubmenu, fontSizeSubmenu, pollSubmenu, displaySubmenu, miniSubmenu, themeSubmenu, dockWidthSubmenu, graphSubmenu, gpuSubmenu, diskSubmenu, langSubmenu]; + function closeAllSubmenus() { for (const m of allSubmenus) m.style.display = "none"; } + + // submenu overlaps parent by 1px so mouse transit doesn't trigger mouseleave-close. + // anchorMenu defaults to rootMenu (top-level submenus) but can be another submenu + // for nested cases; keepOpen lists ancestors that must NOT be closed when this opens. + function openSubmenu(parentItem, submenu, anchorMenu, keepOpen) { + anchorMenu = anchorMenu || rootMenu; + keepOpen = keepOpen || []; + for (const m of allSubmenus) { + if (m === submenu || keepOpen.includes(m)) continue; + m.style.display = "none"; + } + submenu.style.zoom = panelScale; + submenu.style.display = "block"; + const anchorR = anchorMenu.getBoundingClientRect(); + const itemR = parentItem.getBoundingClientRect(); + const subR = submenu.getBoundingClientRect(); + let left = anchorR.right - 1; + if (left + subR.width > window.innerWidth) left = Math.max(2, anchorR.left - subR.width + 1); + submenu.style.left = (left / panelScale) + "px"; + submenu.style.top = (Math.min(itemR.top, window.innerHeight - subR.height - 4) / panelScale) + "px"; + } + + // factory for a checkbox-style toggle item bound to a module-level flag. + function makeToggleItem(label, getValue, setValue, stateKey) { + const item = document.createElement("div"); + item.className = "aimdo-menu-item"; + const render = () => { + item.innerHTML = `${getValue() ? "✓" : ""}${label}`; + }; + render(); + item.addEventListener("click", (e) => { + e.stopPropagation(); + if (item.classList.contains("is-disabled")) return; + setValue(!getValue()); + saveState({ [stateKey]: getValue() }); + render(); + // visible change kicks in on the next poll tick (<= pollInterval ms). + }); + return { item, render }; + } + + // parent item that opens a submenu on hover; chevron hints at the nesting. + function makeSubmenuParent(label, submenu, anchorMenu, keepOpen) { + const item = document.createElement("div"); + item.className = "aimdo-menu-parent"; + item.innerHTML = `${label}▸`; + item.addEventListener("mouseenter", () => openSubmenu(item, submenu, anchorMenu, keepOpen)); + return item; + } + + // --- Scale submenu + const scalePresets = [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2]; + const scaleItems = new Map(); + function renderScaleItems() { + for (const [s, item] of scaleItems) { + const on = Math.abs(s - panelScale) < 1e-6; + item.innerHTML = `${on ? "✓" : ""}${Math.round(s * 100)}%`; + } + } + function setScale(s) { + const r = panel.getBoundingClientRect(); + const w = r.width, h = r.height; + const hadExplicitHeight = panel.style.height !== ""; + panelScale = s; + panel._scale = s; + panel.style.zoom = s; + panel.style.width = (w / s) + "px"; + if (hadExplicitHeight) panel.style.height = (h / s) + "px"; + applyConstraints(); + applyOffsets(); + saveState({ scale: s }); + } + for (const s of scalePresets) { + const item = document.createElement("div"); + item.className = "aimdo-menu-item"; + item.addEventListener("click", (e) => { + e.stopPropagation(); + setScale(s); + renderScaleItems(); + rootMenu.style.display = "none"; + closeAllSubmenus(); + }); + scaleSubmenu.appendChild(item); + scaleItems.set(s, item); + } + renderScaleItems(); + + // --- Font Size submenu (single-select, like Scale) + const fontSizePresets = [10, 11, 12, 13, 14, 16, 18, 20]; + const fontSizeItems = new Map(); + function renderFontSizeItems() { + for (const [s, item] of fontSizeItems) { + const on = s === fontSize; + item.innerHTML = `${on ? "✓" : ""}${s}px`; + } + } + function setFontSize(s) { + fontSize = s; + panel.style.setProperty('--aimdo-font-size', s + 'px'); + saveState({ fontSize: s }); + } + for (const s of fontSizePresets) { + const item = document.createElement("div"); + item.className = "aimdo-menu-item"; + item.addEventListener("click", (e) => { + e.stopPropagation(); + setFontSize(s); + renderFontSizeItems(); + rootMenu.style.display = "none"; + closeAllSubmenus(); + }); + fontSizeSubmenu.appendChild(item); + fontSizeItems.set(s, item); + } + renderFontSizeItems(); + + // --- Language submenu (single-select) + const langPresets = [ + { key: "zh", label: _t("langZh") }, + { key: "en", label: _t("langEn") }, + ]; + const langItems = new Map(); + function renderLangItems() { + for (const [k, item] of langItems) { + const on = k === lang; + const label = langPresets.find(p => p.key === k).label; + item.innerHTML = `${on ? "✓" : ""}${label}`; + } + } + function setLang(l) { + lang = l; + saveState({ lang: l }); + // 更新迷你栏静态标签 + const m = mbRefs; + if (m) { + m.ramLabel.textContent = _t("ram"); + m.vramLabel.textContent = _t("vram"); + m.pagefileLabel.textContent = _t("pagefile"); + m.faultsLabel.textContent = _t("faults"); + m.diskLabel.textContent = _t("disk"); + m.diskSpaceLabel.textContent = _t("diskSpace"); + } + // 更新标题 + if (body._titleSpan && body._titleSpan.style.display !== "none") { + body._titleSpan.textContent = _t("title"); + } + // 更新按钮 + titleSpan.textContent = _t("title"); + unloadBtn.textContent = _t("unload"); + unloadBtn.title = _t("unloadTitle"); + popoutBtn.title = _t("popout"); + toggleBtn.title = _t("collapse"); + dragHandle.title = _t("dragMove"); + graphResize.title = _t("dragResizeGraph"); + // 更新菜单项文本(下次打开菜单时生效) + } + for (const p of langPresets) { + const item = document.createElement("div"); + item.className = "aimdo-menu-item"; + item.addEventListener("click", (e) => { + e.stopPropagation(); + setLang(p.key); + renderLangItems(); + rootMenu.style.display = "none"; + closeAllSubmenus(); + }); + langSubmenu.appendChild(item); + langItems.set(p.key, item); + } + renderLangItems(); + + // --- Display submenu + const colorBars = makeToggleItem(_t("toggleColorBars"), + () => colorModelBars, v => { colorModelBars = v; }, "colorModelBars"); + const colorStroke = makeToggleItem(_t("toggleColorStroke"), + () => colorModelStroke, v => { colorModelStroke = v; }, "colorModelStroke"); + const colorName = makeToggleItem(_t("toggleColorName"), + () => colorModelName, v => { colorModelName = v; }, "colorModelName"); + const showLeg = makeToggleItem(_t("toggleShowLegends"), + () => showLegends, v => { showLegends = v; }, "showLegends"); + const showTitleItem = makeToggleItem(_t("toggleShowTitle"), + () => showTitle, v => { showTitle = v; }, "showTitle"); + const showExecBtnItem = makeToggleItem(_t("toggleExecBtn"), + () => showExecBtn, + v => { showExecBtn = v; execBtn.style.display = v ? "" : "none"; }, + "showExecBtn"); + displaySubmenu.appendChild(colorBars.item); + displaySubmenu.appendChild(colorStroke.item); + displaySubmenu.appendChild(colorName.item); + displaySubmenu.appendChild(showLeg.item); + displaySubmenu.appendChild(showTitleItem.item); + displaySubmenu.appendChild(showExecBtnItem.item); + + // --- Mini view submenu + const showRam = makeToggleItem(_t("toggleRam"), + () => showRamInMini, v => { showRamInMini = v; }, "showRamInMini"); + const showVram = makeToggleItem(_t("toggleVram"), + () => showVramInMini, v => { showVramInMini = v; }, "showVramInMini"); + const showCpu = makeToggleItem("CPU", + () => showCpuInMini, v => { showCpuInMini = v; }, "showCpuInMini"); + const showPagefile = makeToggleItem(_t("togglePagefile"), + () => showPagefileInMini, v => { showPagefileInMini = v; }, "showPagefileInMini"); + const showDisk = makeToggleItem(_t("toggleIO"), + () => showDiskInMini, v => { showDiskInMini = v; }, "showDiskInMini"); + const showFaults = makeToggleItem(_t("toggleFaults"), + () => showFaultsInMini, v => { showFaultsInMini = v; }, "showFaultsInMini"); + // labeled "util" since these live under the nested GPU submenu now + const showGpu = makeToggleItem(_t("toggleUtil"), + () => showGpuInMini, v => { showGpuInMini = v; }, "showGpuInMini"); + const showNames = makeToggleItem(_t("toggleNames"), + () => showHwNames, v => { showHwNames = v; }, "showHwNames"); + const showNumbers = makeToggleItem(_t("toggleNumbers"), + () => miniShowNumbers, v => { miniShowNumbers = v; }, "miniShowNumbers"); + const showUnits = makeToggleItem(_t("toggleUnits"), + () => miniShowUnits, v => { miniShowUnits = v; }, "miniShowUnits"); + const showType = makeToggleItem(_t("toggleType"), + () => miniShowType, v => { miniShowType = v; }, "miniShowType"); + const showGpuTemp = makeToggleItem(_t("toggleTemp"), + () => miniShowGpuTemp, v => { miniShowGpuTemp = v; }, "miniShowGpuTemp"); + const showGpuPower = makeToggleItem(_t("togglePower"), + () => miniShowGpuPower, v => { miniShowGpuPower = v; }, "miniShowGpuPower"); + const showSeparators = makeToggleItem(_t("toggleSeparators"), + () => miniShowSeparators, v => { miniShowSeparators = v; }, "miniShowSeparators"); + miniSubmenu.appendChild(showRam.item); + miniSubmenu.appendChild(showVram.item); + miniSubmenu.appendChild(showCpu.item); + miniSubmenu.appendChild(showPagefile.item); + // GPU's util / temp / power get their own submenu since they're closely related — + // keeps the Mini-view list flat and groups the three multibar toggles together. + // Each is independent: any combination can be on/off, including just temp+power. + gpuSubmenu.appendChild(showGpu.item); + gpuSubmenu.appendChild(showGpuTemp.item); + gpuSubmenu.appendChild(showGpuPower.item); + miniSubmenu.appendChild(makeSubmenuParent("GPU", gpuSubmenu, miniSubmenu, [miniSubmenu])); + + // --- Disk submenu: I/O toggle + one toggle per detected fixed drive. + // Drive items are populated lazily from the next poll once list_disks=1 + // is requested. Selecting any drive enables the disk-space mini section. + diskSubmenu.appendChild(showDisk.item); + diskSubmenu.appendChild(showFaults.item); + const drivesHeader = document.createElement("div"); + drivesHeader.className = "aimdo-menu-header"; + drivesHeader.textContent = _t("drives"); + diskSubmenu.appendChild(drivesHeader); + const drivesPlaceholder = document.createElement("div"); + drivesPlaceholder.className = "aimdo-menu-item is-disabled"; + drivesPlaceholder.innerHTML = `(${_t("detecting")})`; + diskSubmenu.appendChild(drivesPlaceholder); + const driveItems = new Map(); // mountpoint → menu item element + function renderDriveItems() { + for (const [mp, item] of driveItems) { + const on = selectedDisks.includes(mp); + const entry = allDisksCache.find(d => d.mountpoint === mp); + // Volume labels are user-supplied (e.g. drive renamed in Explorer), + // so escape them before splicing into innerHTML. + const lbl = entry && entry.label ? ` ${escHtml(entry.label)}` : ""; + item.innerHTML = `${on ? "✓" : ""}${escHtml(shortMountpoint(mp))}${lbl}`; + } + } + function rebuildDriveMenu() { + if (!allDisksCache.length) return; + if (drivesPlaceholder.parentNode) drivesPlaceholder.remove(); + // Remove items for drives no longer present, and add new ones. + const present = new Set(allDisksCache.map(d => d.mountpoint)); + for (const [mp, item] of driveItems) { + if (!present.has(mp)) { item.remove(); driveItems.delete(mp); } + } + for (const d of allDisksCache) { + if (driveItems.has(d.mountpoint)) continue; + const item = document.createElement("div"); + item.className = "aimdo-menu-item"; + item.addEventListener("click", (e) => { + e.stopPropagation(); + const idx = selectedDisks.indexOf(d.mountpoint); + if (idx >= 0) selectedDisks.splice(idx, 1); + else selectedDisks.push(d.mountpoint); + saveState({ selectedDisks }); + renderDriveItems(); + }); + diskSubmenu.appendChild(item); + driveItems.set(d.mountpoint, item); + } + renderDriveItems(); + } + _rebuildDriveMenu = rebuildDriveMenu; + const diskParent = makeSubmenuParent(_t("toggleDisk"), diskSubmenu, miniSubmenu, [miniSubmenu]); + // first hover triggers a fresh enumeration on the next poll + diskParent.addEventListener("mouseenter", () => { wantDisksList = true; }); + miniSubmenu.appendChild(diskParent); + + // when the cursor enters a non-parent item in miniSubmenu, close nested submenus + // — otherwise they'd linger open while the user is interacting with sibling toggles. + miniSubmenu.addEventListener("mouseover", (e) => { + const item = e.target.closest(".aimdo-menu-item, .aimdo-menu-parent"); + if (item && item.classList.contains("aimdo-menu-item")) { + gpuSubmenu.style.display = "none"; + diskSubmenu.style.display = "none"; + } + }); + miniSubmenu.appendChild(showNames.item); + miniSubmenu.appendChild(showType.item); + miniSubmenu.appendChild(showNumbers.item); + miniSubmenu.appendChild(showUnits.item); + miniSubmenu.appendChild(showSeparators.item); + + // --- Polling interval submenu (single-select like Scale) + const pollPresets = [100, 250, 500, 1000, 2000, 5000]; + const pollItems = new Map(); + function renderPollItems() { + for (const [ms, item] of pollItems) { + const on = ms === pollInterval; + const label = ms < 1000 ? `${ms} ms` : `${ms / 1000} s`; + item.innerHTML = `${on ? "✓" : ""}${label}`; + } + } + for (const ms of pollPresets) { + const item = document.createElement("div"); + item.className = "aimdo-menu-item"; + item.addEventListener("click", (e) => { + e.stopPropagation(); + pollInterval = ms; + saveState({ pollInterval }); + renderPollItems(); + rootMenu.style.display = "none"; + closeAllSubmenus(); + }); + pollSubmenu.appendChild(item); + pollItems.set(ms, item); + } + renderPollItems(); + + // --- Theme submenu (single-select; live-applies) + // applyPalette pushes the active palette into CSS variables on :root, so + // most chrome repaints itself. We only need to manually clear places that + // bake colors into innerHTML / canvas at render time and pick the new + // palette up on their next tick. + function applyTheme(name) { + if (!THEME_NAMES.includes(name)) return; + currentTheme = name; + applyPalette(name); + if (refs && refs.bottomLegend) { + refs.bottomLegend.remove(); + refs.bottomLegend = null; + } + } + const themeItems = new Map(); + function renderThemeItems() { + for (const [name, item] of themeItems) { + const on = name === currentTheme; + const label = name[0].toUpperCase() + name.slice(1); + item.innerHTML = `${on ? "✓" : ""}${label}`; + } + } + for (const name of THEME_NAMES) { + const item = document.createElement("div"); + item.className = "aimdo-menu-item"; + item.addEventListener("click", (e) => { + e.stopPropagation(); + applyTheme(name); + saveState({ theme: name }); + renderThemeItems(); + rootMenu.style.display = "none"; + closeAllSubmenus(); + }); + themeSubmenu.appendChild(item); + themeItems.set(name, item); + } + renderThemeItems(); + + // --- Dock width submenu (section width when docked into the topbar) + const dockWidthSliderRow = document.createElement("div"); + dockWidthSliderRow.style.cssText = `padding:6px 10px;display:flex;flex-direction:column;gap:4px;min-width:180px;`; + dockWidthSliderRow.addEventListener("click", (e) => e.stopPropagation()); + const dockWidthLabel = document.createElement("div"); + dockWidthLabel.style.cssText = `display:flex;justify-content:space-between;font-size:0.833em;color:var(--aimdo-textDim);`; + dockWidthLabel.innerHTML = `${_t("dockSectionW")}${dockSectionWidth}px`; + const dockWidthSlider = document.createElement("input"); + dockWidthSlider.type = "range"; + dockWidthSlider.min = "60"; + dockWidthSlider.max = "400"; + dockWidthSlider.step = "5"; + dockWidthSlider.value = String(dockSectionWidth); + dockWidthSlider.style.cssText = `width:100%;accent-color:var(--aimdo-vram);cursor:pointer;`; + const dockWidthValSpan = dockWidthLabel.querySelector(".aimdo-dw-val"); + dockWidthSlider.addEventListener("input", () => { + dockSectionWidth = parseInt(dockWidthSlider.value, 10); + dockWidthValSpan.textContent = dockSectionWidth + "px"; + applyDockSectionWidth(); + saveState({ dockSectionWidth }); + }); + dockWidthSliderRow.appendChild(dockWidthLabel); + dockWidthSliderRow.appendChild(dockWidthSlider); + dockWidthSubmenu.appendChild(dockWidthSliderRow); + function renderDockWidthItems() { + dockWidthSlider.value = String(dockSectionWidth); + dockWidthValSpan.textContent = dockSectionWidth + "px"; + } + + buildGraphSubmenu(graphSubmenu, () => redrawGraph()); + + // --- Root menu items + rootMenu.appendChild(makeSubmenuParent(_t("menuScale"), scaleSubmenu)); + rootMenu.appendChild(makeSubmenuParent(_t("menuFontSize"), fontSizeSubmenu)); + rootMenu.appendChild(makeSubmenuParent(_t("menuPoll"), pollSubmenu)); + rootMenu.appendChild(makeSubmenuParent(_t("menuDisplay"), displaySubmenu)); + rootMenu.appendChild(makeSubmenuParent(_t("menuMini"), miniSubmenu)); + rootMenu.appendChild(makeSubmenuParent(_t("menuGraph"), graphSubmenu)); + rootMenu.appendChild(makeSubmenuParent(_t("menuTheme"), themeSubmenu)); + rootMenu.appendChild(makeSubmenuParent(_t("menuDockWidth"), dockWidthSubmenu)); + rootMenu.appendChild(makeSubmenuParent(_t("menuLang"), langSubmenu)); + + // dock / undock toggle — present only when the actionbar is available so we don't + // offer a no-op when ComfyUI's new menu is disabled. + const dockItem = document.createElement("div"); + dockItem.className = "aimdo-menu-item"; + function renderDockItem() { + const canDock = !!getActionbarContainer(); + dockItem.style.display = (isDocked || canDock) ? "" : "none"; + dockItem.innerHTML = `${isDocked ? "✓" : ""}${isDocked ? _t("undock") : _t("dockTop")}`; + } + dockItem.addEventListener("click", (e) => { + e.stopPropagation(); + if (isDocked) undock(); else dock(); + renderDockItem(); + rootMenu.style.display = "none"; + closeAllSubmenus(); + }); + renderDockItem(); + rootMenu.appendChild(dockItem); + + // reset peak VRAM marker + clear history graph; this used to live on the header + const resetItem = document.createElement("div"); + resetItem.className = "aimdo-menu-item"; + resetItem.innerHTML = `${_t("resetHistory")}`; + resetItem.title = _t("resetHistoryTitle"); + resetItem.addEventListener("click", (e) => { + e.stopPropagation(); + resetHistory(); + rootMenu.style.display = "none"; + closeAllSubmenus(); + }); + rootMenu.appendChild(resetItem); + + function renderColorBarsItem() { + renderScaleItems(); renderPollItems(); renderThemeItems(); renderDockWidthItems(); + colorBars.render(); colorStroke.render(); colorName.render(); showLeg.render(); + showRam.render(); showVram.render(); showCpu.render(); showGpu.render(); showNames.render(); + showTitleItem.render(); showExecBtnItem.render(); + showType.render(); showNumbers.render(); showUnits.render(); + showGpuTemp.render(); showGpuPower.render(); + renderDockItem(); + } + + document.body.appendChild(rootMenu); + for (const m of allSubmenus) document.body.appendChild(m); + + panel.addEventListener("contextmenu", (e) => { + e.preventDefault(); + e.stopPropagation(); + renderColorBarsItem(); + closeAllSubmenus(); + rootMenu.style.zoom = panelScale; + rootMenu.style.display = "block"; + const mRect = rootMenu.getBoundingClientRect(); + const mw = mRect.width || 120 * panelScale; + const mh = mRect.height || 120 * panelScale; + rootMenu.style.left = (Math.min(e.clientX, window.innerWidth - mw - 4) / panelScale) + "px"; + rootMenu.style.top = (Math.min(e.clientY, window.innerHeight - mh - 4) / panelScale) + "px"; + }); + document.addEventListener("click", (e) => { + if (rootMenu.contains(e.target)) return; + for (const m of allSubmenus) if (m.contains(e.target)) return; + rootMenu.style.display = "none"; + closeAllSubmenus(); + }); + // moving the mouse out of the menu structure into empty space should also + // close the submenu so it doesn't linger over unrelated UI. + rootMenu.addEventListener("mouseleave", (e) => { + const target = e.relatedTarget; + if (target && (target instanceof Node) && allSubmenus.some(m => m.contains(target))) return; + closeAllSubmenus(); + }); + for (const m of allSubmenus) { + m.addEventListener("mouseleave", (e) => { + const target = e.relatedTarget; + if (target && (target instanceof Node) && (rootMenu.contains(target) || allSubmenus.some(x => x.contains(target)))) return; + m.style.display = "none"; + }); + } + + document.body.appendChild(panel); + applyOffsets(); + + // restore docked placement once ComfyUI has built the topbar. Until the container + // exists we wait — the panel sits floating in its persisted spot in the meantime. + // Capped at ~3s so a user who disabled the new menu doesn't keep us polling. + // Any user-initiated drag or explicit undock during the wait cancels the poll so + // we don't yank the panel out from under them. + if (isDocked) { + isDocked = false; // dock() guards on this; reset so it actually runs + autoDockPending = true; + let frames = 0; + const tryDock = () => { + if (!autoDockPending) return; + if (dock(dockSide)) return; + if (++frames > 180) { autoDockPending = false; saveState({ docked: false }); return; } + requestAnimationFrame(tryDock); + }; + requestAnimationFrame(tryDock); + } + + // width changes shift ro to anchor one edge (unless suppressed by the left handle). + // height changes always anchor the top edge by shifting bo by -Δh. + let lastPanelWidth = null; + let lastPanelHeight = null; + if (typeof ResizeObserver !== "undefined") { + new ResizeObserver(() => { + if (isPoppedOut()) return; // PiP resize doesn't persist back to main-page state + if (isDocked) { lastPanelWidth = null; lastPanelHeight = null; positionDockedBody(); return; } + const r = panel.getBoundingClientRect(); + const w = r.width, h = r.height; + if (lastPanelWidth !== null && w !== lastPanelWidth) { + if (!suppressWidthAnchor) rightOffset -= (w - lastPanelWidth); + saveState({ width: w, rightOffset, bottomOffset }); + } + if (lastPanelHeight !== null && h !== lastPanelHeight) { + bottomOffset -= (h - lastPanelHeight); + // persist height only on explicit drag, and key it by current mode so + // expanded vs collapsed heights don't overwrite each other. + if (bottomDrag || cornerDrag) { + const key = collapsed ? "heightCollapsed" : "height"; + saveState({ [key]: h, bottomOffset }); + } else saveState({ bottomOffset }); + } + lastPanelWidth = w; + lastPanelHeight = h; + applyOffsets(); + }).observe(panel); + } + + // sidebar toggles don't fire window.resize. canvas may not exist yet — poll until it does. + let observed = null; + function attachCanvasObserver() { + const el = getCanvasEl(); + if (!el) { + requestAnimationFrame(attachCanvasObserver); + return; + } + if (el === observed) return; + observed = el; + if (typeof ResizeObserver !== "undefined") { + new ResizeObserver(() => { applyOffsets(); positionDockedBody(); }).observe(el); + } + applyOffsets(); + } + attachCanvasObserver(); + body._titleSpan = titleSpan; + body._miniBar = miniBar; + body._panel = panel; + body._updateExecBtnState = updateExecBtnState; + return body; +} + +// persistent DOM refs to avoid re-querying / re-creating +let refs = null; + +function ensureStructure(body) { + if (refs) return refs; + + body.innerHTML = ""; + + const contentDiv = document.createElement("div"); + contentDiv.id = "aimdo-content"; + contentDiv.style.cssText = "flex-shrink: 0;"; + contentDiv.addEventListener("click", (e) => { + const t = e.target.closest(".aimdo-gpu-util"); + if (!t) return; + graphState.gpuLineVisible = !graphState.gpuLineVisible; + saveState({ gpuLineVisible: graphState.gpuLineVisible }); + redrawGraph(); + t.style.opacity = graphState.gpuLineVisible ? "1" : "0.4"; + }); + // skeleton built once; renderData mutates text/widths/visibility only. + contentDiv.innerHTML = ` +
+
+ ${_t("ram")} + +
+
+
+
+
+
+
+
+ ■ + ■ + ■ + ■ +
+
+
+
+ ${_t("vram")} + +
+
+
+
+
+
+
+
+ ■ + ■ + ■ + ■ +
+
+ + + + + + +
+
+
+
+ ${_t("pagefile")} + +
+
+
+
+
+ `; + const _q = (s) => contentDiv.querySelector(s); + // .aimdo-seg-other: [0]=RAM block, [1]=VRAM block + const _others = contentDiv.querySelectorAll(".aimdo-seg-other"); + contentDiv._refs = { + ramUsage: _q(".content-ram-usage"), + ramSegs: [_q(".aimdo-seg-pinned"), _q(".aimdo-seg-loadedRam"), _q(".aimdo-seg-python"), _others[0]], + ramTexts: { + pinned: _q(".content-ram-pinned-txt"), + loaded: _q(".content-ram-loaded-txt"), + python: _q(".content-ram-python-txt"), + other: _q(".content-ram-other-txt"), + }, + ramLegend: _q(".content-ram-legend"), + vramLabel: _q(".content-vram-label"), + vramUsage: _q(".content-vram-usage"), + vramSegs: [_q(".aimdo-seg-vram"), _q(".aimdo-seg-torch"), _q(".aimdo-seg-torchCache"), _others[1]], + vramWraps: { + models: _q(".content-vram-models-wrap"), + torch: _q(".content-vram-torch-wrap"), + cache: _q(".content-vram-cache-wrap"), + }, + vramTexts: { + models: _q(".content-vram-models-txt"), + torch: _q(".content-vram-torch-txt"), + cache: _q(".content-vram-cache-txt"), + other: _q(".content-vram-other-txt"), + }, + vramLegend: _q(".content-vram-legend"), + infoPeak: _q(".content-info-peak"), + infoCache: _q(".content-info-cache"), + infoGpu: _q(".content-info-gpu"), + infoTemp: _q(".content-info-temp"), + infoPower: _q(".content-info-power"), + infoState: _q(".content-info-state"), + pagefileSection: _q(".content-pagefile-section"), + pagefileUsage: _q(".content-pagefile-usage"), + pagefileSegs: contentDiv.querySelectorAll(".content-pagefile-bar > .aimdo-seg"), + }; + body.appendChild(contentDiv); + + const graphHeader = document.createElement("div"); + graphHeader.style.cssText = `display:flex;justify-content:space-between;font-size:0.75em;color:var(--aimdo-textDim);margin-bottom:2px;flex-shrink:0;`; + graphHeader.innerHTML = ``; + body.appendChild(graphHeader); + + const graphCanvas = document.createElement("canvas"); + graphCanvas.className = "aimdo-graph-canvas"; + graphCanvas.width = 300; + graphCanvas.height = graphHeight; + graphCanvas.style.cssText = `width:100%;height:${graphHeight}px;border-radius:3px;background:var(--aimdo-graphBg);flex-shrink:0;`; + body.appendChild(graphCanvas); + + const redrawGraph = () => { + if (!refs || !refs.graphCtx) return; + const panelScale = (body._panel && body._panel._scale) || 1; + const gRect = graphCanvas.getBoundingClientRect(); + if (gRect.width > 0 && gRect.height > 0) { + drawGraph(refs.graphCtx, gRect.width / panelScale, gRect.height / panelScale); + } + updateGraphTimes(); + }; + // rAF-coalesce bursts from mousemove (hover + scrub) so we draw at most once per frame + let redrawPending = false; + const scheduleRedraw = () => { + if (redrawPending) return; + redrawPending = true; + requestAnimationFrame(() => { redrawPending = false; redrawGraph(); }); + }; + + graphCanvas.addEventListener("mousemove", (e) => { + if (scrubDrag) return; // hover line during drag is distracting + const rect = graphCanvas.getBoundingClientRect(); + const scale = (body._panel && body._panel._scale) || 1; + const x = (e.clientX - rect.left) / scale; + const w = rect.width / scale; + const stepX = w / (GRAPH_POINTS - 1); + const slotIdx = Math.round(x / stepX); + const len = history.len; + const visible = Math.min(GRAPH_POINTS, len - history.viewOffset); + const visibleIdx = slotIdx - (GRAPH_POINTS - visible); + if (visible < 1 || visibleIdx < 0 || visibleIdx >= visible) { + graphHover.x = null; + graphHover.idx = null; + } else { + const startIdx = len - visible - history.viewOffset; + graphHover.idx = startIdx + visibleIdx; + graphHover.x = slotIdx * stepX; + } + scheduleRedraw(); + }); + graphCanvas.addEventListener("mouseleave", () => { + graphHover.x = null; + graphHover.idx = null; + redrawGraph(); + }); + + // drag scrubbing: dragging the full visible window's worth scrolls by GRAPH_POINTS. + // Drag right pulls older points into view; releasing at viewOffset 0 re-enables + // follow-live so new data slides into the window automatically. + let scrubDrag = null; + graphCanvas.addEventListener("mousedown", (e) => { + if (e.button !== 0) return; + e.preventDefault(); + e.stopPropagation(); + const visualScale = (body._panel && body._panel._scale) || 1; + scrubDrag = { startX: e.clientX, startOffset: history.viewOffset, scale: visualScale }; + history.followLive = false; + graphCanvas.style.cursor = "grabbing"; + }); + document.addEventListener("mousemove", (e) => { + if (!scrubDrag) return; + const rect = graphCanvas.getBoundingClientRect(); + const dxPx = (e.clientX - scrubDrag.startX) / scrubDrag.scale; + const ptsPerPx = GRAPH_POINTS / Math.max(1, rect.width / scrubDrag.scale); + const maxOffset = Math.max(0, history.len - GRAPH_POINTS); + history.viewOffset = Math.max(0, Math.min(maxOffset, Math.round(scrubDrag.startOffset + dxPx * ptsPerPx))); + scheduleRedraw(); + }); + document.addEventListener("mouseup", () => { + if (!scrubDrag) return; + scrubDrag = null; + graphCanvas.style.cursor = ""; // restore to CSS-default crosshair + if (history.viewOffset <= 1) { + history.viewOffset = 0; + history.followLive = true; + } + redrawGraph(); + }); + + // drag handle below the graph — adjusts canvas height; modelsDiv takes the rest. + const graphResize = document.createElement("div"); + graphResize.className = "aimdo-graph-resize"; + graphResize.title = _t("dragResizeGraph"); + let graphDrag = null; + graphResize.addEventListener("mousedown", (e) => { + if (e.button !== 0) return; + e.preventDefault(); + e.stopPropagation(); + graphDrag = { startY: e.clientY, startHeight: graphCanvas.getBoundingClientRect().height }; + graphResize.classList.add("is-dragging"); + }); + document.addEventListener("mousemove", (e) => { + if (!graphDrag) return; + const visualScale = (body._panel && body._panel._scale) || 1; + const delta = (e.clientY - graphDrag.startY) / visualScale; + const next = Math.max(20, Math.min(600, graphDrag.startHeight / visualScale + delta)); + graphHeight = Math.round(next); + graphCanvas.style.height = graphHeight + "px"; + }); + document.addEventListener("mouseup", () => { + if (graphDrag) { + graphDrag = null; + graphResize.classList.remove("is-dragging"); + saveState({ graphHeight }); + } + }); + body.appendChild(graphResize); + + const modelsDiv = document.createElement("div"); + modelsDiv.id = "aimdo-models"; + modelsDiv.style.cssText = "flex: 1 1 auto; min-height: 0; overflow-y: auto;"; + body.appendChild(modelsDiv); + + refs = { + contentDiv, + graphHeader, + graphCanvas, + graphResize, + graphCtx: graphCanvas.getContext("2d"), + modelsDiv, + pageCanvases: {}, // keyed by `${index}_${vi}` + pageCtxs: {}, + modelRows: {}, // keyed by m.index — refs to mutable row parts + noModelsMsg: null, + bottomLegend: null, + }; + return refs; +} + +function updateGraphTimes() { + if (!refs || !refs.graphHeader) return; + refs.graphHeader.style.color = "var(--aimdo-textDim)"; + const leftEl = refs.graphHeader.querySelector(".graph-time-left"); + const hoverEl = refs.graphHeader.querySelector(".graph-hover-info"); + const rightEl = refs.graphHeader.querySelector(".graph-time-right"); + const len = history.len; + if (len < 2) { + leftEl.textContent = ""; + hoverEl.textContent = ""; + rightEl.textContent = ""; + return; + } + const visible = Math.min(GRAPH_POINTS, len - history.viewOffset); + if (visible < 1) { + leftEl.textContent = ""; + hoverEl.textContent = ""; + rightEl.textContent = ""; + return; + } + const startIdx = len - visible - history.viewOffset; + const endIdx = len - 1 - history.viewOffset; + leftEl.textContent = formatClock(historyGet(history.times, startIdx)); + rightEl.textContent = history.followLive ? _t("live") : formatClock(historyGet(history.times, endIdx)); + if (graphHover.idx != null) { + const used = history.total_vram - historyGet(history.free_vram, graphHover.idx); + const parts = [ + formatClock(historyGet(history.times, graphHover.idx)), + formatBytes(used), + ]; + if (graphState.gpuLineVisible) parts.push(Math.round(historyGet(history.gpu_util, graphHover.idx)) + "%"); + hoverEl.textContent = parts.join(" · "); + } else { + hoverEl.textContent = ""; + } +} + +function applyRowCollapsed(row) { + row.bar.style.display = row.collapsed ? "none" : "flex"; + row.legend.style.display = (row.collapsed || !showLegends) ? "none" : "flex"; + row.vbarsDiv.style.display = row.collapsed ? "none" : ""; + row.chevron.textContent = row.collapsed ? "▸" : "▾"; +} + +// build (or reuse) a model row, mutating only what changed +function renderModelRow(r, m, data) { + const wantsWm = m.dynamic && data.aimdo_active; + let row = r.modelRows[m.index]; + if (!row) { + const el = document.createElement("div"); + el.className = "aimdo-model-row"; + const head = document.createElement("div"); + head.className = "aimdo-model-head"; + const nameWrap = document.createElement("span"); + nameWrap.className = "aimdo-model-name"; + nameWrap.title = _t("clickCollapse"); + const chevron = document.createElement("span"); + chevron.className = "aimdo-model-chevron"; + const nameSpan = document.createElement("span"); + nameWrap.appendChild(chevron); + nameWrap.appendChild(nameSpan); + const right = document.createElement("span"); + right.className = "aimdo-model-right"; + const sizeSpan = document.createElement("span"); + right.appendChild(sizeSpan); + const unloadBtn = document.createElement("span"); + unloadBtn.className = "aimdo-unload-btn"; + unloadBtn.dataset.index = m.index; + unloadBtn.textContent = "x"; + unloadBtn.title = _t("unloadModel"); + right.appendChild(unloadBtn); + head.appendChild(nameWrap); + head.appendChild(right); + el.appendChild(head); + const bar = document.createElement("div"); + bar.className = "aimdo-model-bar"; + el.appendChild(bar); + const legend = document.createElement("div"); + legend.className = "aimdo-model-legend"; + const makeLegendEntry = () => { + const wrap = document.createElement("span"); + const sw = document.createElement("span"); + sw.innerHTML = "■"; + const txt = document.createTextNode(""); + wrap.appendChild(sw); + wrap.appendChild(txt); + return { wrap, sw, txt }; + }; + const legendEntries = { + vram: makeLegendEntry(), + pinned: makeLegendEntry(), + loaded: makeLegendEntry(), + last: makeLegendEntry(), // "unloaded" for dynamic models, "RAM" for static + }; + legendEntries.pinned.sw.style.color = "var(--aimdo-pinned)"; + legendEntries.loaded.sw.style.color = "var(--aimdo-loadedRam)"; + legend.appendChild(legendEntries.vram.wrap); + legend.appendChild(legendEntries.pinned.wrap); + legend.appendChild(legendEntries.loaded.wrap); + legend.appendChild(legendEntries.last.wrap); + el.appendChild(legend); + const vbarsDiv = document.createElement("div"); + el.appendChild(vbarsDiv); + row = { el, chevron, nameSpan, sizeSpan, right, unloadBtn, bar, barSegs: [], legend, legendEntries, vbarsDiv, vbarRefs: [], wmBtn: null, lastDynamic: null, lastVbarSig: "", collapsed: false }; + nameWrap.addEventListener("click", () => { + row.collapsed = !row.collapsed; + modelCollapsed[m.name] = row.collapsed; + saveState({ modelCollapsed }); + applyRowCollapsed(row); + }); + row.collapsed = !!modelCollapsed[m.name]; + applyRowCollapsed(row); + r.modelRows[m.index] = row; + } + + row.nameSpan.textContent = m.name + (m.dynamic ? "" : ` (${_t("static_")})`); + const typeColor = MODEL_TYPE_COLOR[m.type]; + const vramColor = (colorModelBars && typeColor) || C.vram; + row.nameSpan.style.color = (colorModelName && typeColor) || C.text; + row.el.style.borderColor = (colorModelStroke && typeColor) ? hexToRgba(typeColor, 0.4) : "transparent"; + if (!row.collapsed) row.legend.style.display = showLegends ? "flex" : "none"; + row.sizeSpan.textContent = formatBytes(m.total_size); + + if (wantsWm && !row.wmBtn) { + const wm = document.createElement("span"); + wm.className = "aimdo-reset-wm-btn"; + wm.dataset.index = m.index; + wm.textContent = _t("wm"); + wm.title = _t("wmTitle"); + row.right.insertBefore(wm, row.unloadBtn); + row.wmBtn = wm; + } else if (!wantsWm && row.wmBtn) { + row.wmBtn.remove(); + row.wmBtn = null; + } + + const barColors = m.dynamic ? [C.vram, C.pinned, C.loadedRam, C.unloaded] : [C.vram, C.pinned, C.loadedRam, C.pinned]; + if (row.lastDynamic !== m.dynamic || row.barSegs.length !== barColors.length) { + row.bar.innerHTML = ""; + row.barSegs = []; + for (const color of barColors) { + const seg = document.createElement("div"); + seg.style.cssText = `background:${color};height:100%;`; + row.bar.appendChild(seg); + row.barSegs.push(seg); + } + row.lastDynamic = m.dynamic; + } + // re-apply each tick so theme changes reach the segments created once on dynamic-change rebuild. + row.barSegs.forEach((seg, i) => { seg.style.background = i === 0 ? vramColor : barColors[i]; }); + + const total = m.total_size || 1; + const pinnedRam = m.pinned_ram || 0; + const loadedRam = m.loaded_ram || 0; + let vramShown, lastSize, lastLabel, lastColor, lastAlwaysShow; + if (m.dynamic) { + vramShown = m.vbar_loaded; + lastSize = Math.max(0, m.total_size - m.vbar_loaded - pinnedRam - loadedRam); + lastLabel = _t("unloaded"); + lastColor = "var(--aimdo-unloaded)"; + lastAlwaysShow = true; + } else { + vramShown = m.loaded_size; + const inRam = Math.max(0, m.total_size - m.loaded_size); + lastSize = Math.max(0, inRam - pinnedRam - loadedRam); + lastLabel = _t("ramLabel"); + lastColor = "var(--aimdo-pinned)"; + lastAlwaysShow = false; + } + row.barSegs[0].style.width = (vramShown / total * 100) + "%"; + row.barSegs[0].title = _t("vramLabel") + ": " + formatBytes(vramShown); + row.barSegs[1].style.width = (pinnedRam / total * 100) + "%"; + row.barSegs[1].title = _t("pinnedRAM") + ": " + formatBytes(pinnedRam); + row.barSegs[2].style.width = (loadedRam / total * 100) + "%"; + row.barSegs[2].title = _t("loadedRAM") + ": " + formatBytes(loadedRam); + row.barSegs[3].style.width = (lastSize / total * 100) + "%"; + row.barSegs[3].title = (m.dynamic ? _t("unloaded") + ": " : _t("ramTooltip") + ": ") + formatBytes(lastSize); + + const le = row.legendEntries; + le.vram.sw.style.color = vramColor; + le.vram.txt.nodeValue = ` ${_t("vramLabel")} ${formatBytes(vramShown)}`; + le.pinned.wrap.style.display = pinnedRam > 0 ? "" : "none"; + if (pinnedRam > 0) le.pinned.txt.nodeValue = ` ${_t("pinned")} ${formatBytes(pinnedRam)}`; + le.loaded.wrap.style.display = loadedRam > 0 ? "" : "none"; + if (loadedRam > 0) le.loaded.txt.nodeValue = ` ${_t("loaded")} ${formatBytes(loadedRam)}`; + const showLast = lastAlwaysShow || lastSize > 0; + le.last.wrap.style.display = showLast ? "" : "none"; + if (showLast) { + le.last.sw.style.color = lastColor; + le.last.txt.nodeValue = ` ${lastLabel} ${formatBytes(lastSize)}`; + } + + // vbars: rebuild structure only when device list / count changes + const vbars = (m.vbars || []).filter(v => v.residency && v.residency.length > 0); + const sig = vbars.map(v => v.device + ":" + v.residency.length).join("|"); + if (row.lastVbarSig !== sig) { + row.vbarsDiv.innerHTML = ""; + row.vbarRefs = []; + const showLabel = vbars.length > 1; + for (let vi = 0; vi < vbars.length; vi++) { + const vb = vbars[vi]; + if (showLabel) { + const lbl = document.createElement("div"); + lbl.style.cssText = `font-size:0.833em;color:var(--aimdo-textDim);margin-top:3px;`; + lbl.textContent = vb.device; + row.vbarsDiv.appendChild(lbl); + } + const pgrid = document.createElement("div"); + pgrid.style.cssText = "margin-top:2px;"; + row.vbarsDiv.appendChild(pgrid); + const stats = document.createElement("div"); + stats.style.cssText = `color:var(--aimdo-textDim);font-size:0.833em;margin-top:2px;`; + const vramSw = document.createElement("span"); vramSw.innerHTML = "■"; + const vramTxt = document.createTextNode(""); + const vramWrap = document.createElement("span"); + vramWrap.appendChild(vramSw); vramWrap.appendChild(vramTxt); + const unloadedSw = document.createElement("span"); + unloadedSw.style.color = "var(--aimdo-unloaded)"; + unloadedSw.innerHTML = "■"; + const unloadedTxt = document.createTextNode(""); + const unloadedWrap = document.createElement("span"); + unloadedWrap.appendChild(unloadedSw); unloadedWrap.appendChild(unloadedTxt); + stats.appendChild(vramWrap); + stats.appendChild(document.createTextNode(" ")); + stats.appendChild(unloadedWrap); + row.vbarsDiv.appendChild(stats); + row.vbarRefs.push({ vi, pgrid, stats, vramSw, vramTxt, unloadedTxt }); + } + row.lastVbarSig = sig; + } + return row; +} + +function renderData(body, data) { + if (!data.enabled) { + body.innerHTML = `
${_t("noGpu")}
`; + refs = null; + return; + } + + const r = ensureStructure(body); + const pw = body._panel.getBoundingClientRect().width; + body._titleSpan.style.display = showTitle ? "" : "none"; + body._titleSpan.textContent = + pw >= 320 && data.aimdo_active ? _t("titleAimdo") : + pw >= 240 ? _t("title") : ""; + data.gpu_util = smoothGpuUtil(data.gpu_util); + // throttle history snapshots so a fast poll rate (e.g. 100 ms) doesn't fill + // the buffer in 2 minutes; UI keeps updating at the full poll cadence. + if (Date.now() - (history.lastPush || 0) >= HISTORY_TICK_MS) { + pushHistory(data); + history.lastPush = Date.now(); + } + + const used = data.total_vram - data.free_vram; + if (used > peakVramUsed) peakVramUsed = used; + + // aimdo allocates through pytorch's caching allocator, so aimdo_usage + // and torch_reserved overlap. Derive non-overlapping segments from + // the driver-level total (used) as ground truth. + let aimdo, torchActive, torchCache, otherUsed; + if (data.aimdo_usage > 0) { + // aimdo active: torch stats are a subset of aimdo, not additive + aimdo = data.aimdo_usage; + torchActive = 0; + torchCache = 0; + otherUsed = Math.max(0, used - aimdo); + } else { + // no aimdo: torch stats are the full picture + aimdo = 0; + torchActive = data.torch_active; + torchCache = Math.max(0, data.torch_reserved - data.torch_active); + otherUsed = Math.max(0, used - data.torch_reserved); + } + const aimdoPct = (aimdo / data.total_vram * 100).toFixed(0); + const torchPct = (torchActive / data.total_vram * 100).toFixed(0); + const torchCachePct = (torchCache / data.total_vram * 100).toFixed(0); + const otherPct = (otherUsed / data.total_vram * 100).toFixed(0); + + const ramUsed = data.used_ram || 0; + const ramTotal = data.total_ram || 1; + const processRam = data.process_ram || 0; + const pinnedRamTotal = data.pinned_ram || 0; + const loadedRamTotal = data.loaded_ram || 0; + const pythonOther = Math.max(0, processRam - pinnedRamTotal - loadedRamTotal); + const ramOther = Math.max(0, ramUsed - processRam); + const pinnedRamPct = (pinnedRamTotal / ramTotal * 100).toFixed(0); + const loadedRamPct = (loadedRamTotal / ramTotal * 100).toFixed(0); + const pythonOtherPct = (pythonOther / ramTotal * 100).toFixed(0); + const ramOtherPct = (ramOther / ramTotal * 100).toFixed(0); + + const mb = body._miniBar; + const m = mb._refs; // refs cached at panel creation (see mbRefs in createPanel) + const _u = miniShowUnits; + const _n = miniShowNumbers; + // "%" isn't a unit — units off should still show ratios as percentages, just + // without GB/MB/°C/W. Quantities with a denominator (RAM/VRAM/power) become + // "used/total" percentages; CPU/GPU util are already percentages so the "%" + // stays on regardless; temp has no natural denominator so we drop the °C. + // leading zero on single-digit values keeps width stable, matching the CPU/GPU util format + const asPct = (num, total) => { + if (total <= 0) return "?"; + const p = Math.round(num / total * 100); + return (p < 10 ? "0" : "") + p + "%"; + }; + m.vramUsage.textContent = !_n ? "" : + _u ? `${formatBytes(used)}|${formatBytes(data.total_vram)}` + : asPct(used, data.total_vram); + m.vramSegs[0].style.width = aimdoPct + "%"; + m.vramSegs[1].style.width = torchPct + "%"; + m.vramSegs[2].style.width = torchCachePct + "%"; + m.vramSegs[3].style.width = otherPct + "%"; + m.ramUsage.textContent = !_n ? "" : + _u ? `${formatBytes(ramUsed)}|${formatBytes(ramTotal)}` + : asPct(ramUsed, ramTotal); + m.ramSegs[0].style.width = pinnedRamPct + "%"; + m.ramSegs[1].style.width = loadedRamPct + "%"; + m.ramSegs[2].style.width = pythonOtherPct + "%"; + m.ramSegs[3].style.width = ramOtherPct + "%"; + + // toggleable "Type" label hides RAM / VRAM / CPU / GPU prefixes (plus any device suffix) + m.ramLabel.style.display = miniShowType ? "" : "none"; + m.vramLabel.style.display = miniShowType ? "" : "none"; + + m.bar.classList.toggle("has-separators", miniShowSeparators); + m.ramSection.style.display = showRamInMini ? "" : "none"; + m.vramSection.style.display = showVramInMini ? "" : "none"; + if (data.cpu_util != null && showCpuInMini) { + m.cpuSection.style.display = ""; + const cpuColor = gpuUtilColor(data.cpu_util); + const cpuPct = Math.round(data.cpu_util); + m.cpuUsage.innerHTML = _n + ? `${(cpuPct < 10 ? "0" : "") + cpuPct}%` + : ""; + m.cpuFill.style.background = cpuColor; + m.cpuFill.style.width = `${cpuPct}%`; + m.cpuLabel.textContent = (showHwNames && data.cpu_name) ? `CPU (${shortenCpuName(data.cpu_name)})` : "CPU"; + m.cpuLabel.title = data.cpu_name || ""; + m.cpuLabel.style.display = miniShowType ? "" : "none"; + } else { + m.cpuSection.style.display = "none"; + } + if (showDiskInMini && data.disk_read != null && data.disk_write != null) { + m.diskSection.style.display = ""; + const now = performance.now(); + let readRate = 0, writeRate = 0; + if (diskState.prevRead != null && diskState.prevTime > 0) { + const dt = (now - diskState.prevTime) / 1000; + if (dt > 0) { + readRate = Math.max(0, (data.disk_read - diskState.prevRead) / dt); + writeRate = Math.max(0, (data.disk_write - diskState.prevWrite) / dt); + const decay = Math.pow(0.5, dt / DISK_PEAK_HALFLIFE); + diskState.peakRead = Math.max(readRate, diskState.peakRead * decay, DISK_PEAK_FLOOR); + diskState.peakWrite = Math.max(writeRate, diskState.peakWrite * decay, DISK_PEAK_FLOOR); + } + } + diskState.prevRead = data.disk_read; + diskState.prevWrite = data.disk_write; + diskState.prevTime = now; + m.diskReadUsage.textContent = _n ? (formatBytes(readRate) + "/s ↓") : ""; + m.diskWriteUsage.textContent = _n ? (formatBytes(writeRate) + "/s ↑") : ""; + m.diskReadFill.style.width = (readRate / diskState.peakRead * 100) + "%"; + m.diskWriteFill.style.width = (writeRate / diskState.peakWrite * 100) + "%"; + m.diskLabel.style.display = miniShowType ? "" : "none"; + } else { + m.diskSection.style.display = "none"; + diskState.prevRead = null; + diskState.prevTime = 0; + } + // Free disk space — one row per selected drive, with all detected drives in + // the tooltip so the user sees the full picture without checking every box. + if (Array.isArray(data.disks)) { + const oldMps = allDisksCache.map(d => d.mountpoint).join("|"); + const newMps = data.disks.map(d => d.mountpoint).join("|"); + allDisksCache = data.disks; + if (_rebuildDriveMenu && oldMps !== newMps) _rebuildDriveMenu(); + } + const visibleDisks = selectedDisks.length + ? allDisksCache.filter(d => selectedDisks.includes(d.mountpoint)) + : []; + if (visibleDisks.length > 0) { + m.diskSpaceSection.style.display = ""; + m.diskSpaceSection.classList.toggle("no-units", !_u); + const rows = m.diskSpaceRows; + while (rows.children.length < visibleDisks.length) { + const row = document.createElement("div"); + row.className = "aimdo-mini-inline mini-diskspace-drive-row"; + row.innerHTML = `` + + `
` + + ``; + rows.appendChild(row); + } + while (rows.children.length > visibleDisks.length) rows.lastChild.remove(); + for (let i = 0; i < visibleDisks.length; i++) { + const d = visibleDisks[i]; + const row = rows.children[i]; + const mpEl = row.firstChild; + const fillEl = row.querySelector(".mini-diskspace-fill"); + const usageEl = row.lastChild; + const total = d.total, free = d.free; + const used = (total != null && free != null) ? total - free : null; + const pct = (used != null && total) ? (used / total * 100) : 0; + mpEl.textContent = shortMountpoint(d.mountpoint); + fillEl.style.width = pct.toFixed(1) + "%"; + // colour warms as the drive fills — same scale as gpuUtilColor (10/80 thresholds + // are util-shaped; for free space "low → warmer" maps better at 75/90). + fillEl.style.background = pct >= 90 ? C.gpuUtilHi : (pct >= 75 ? C.gpuUtil : C.pinned); + usageEl.textContent = !_n ? "" : + (free == null || !total) ? "?" : + _u ? formatBytes(free) + : asPct(used, total); + } + m.diskSpaceSection.title = buildDiskTooltip(allDisksCache); + m.diskSpaceLabel.style.display = miniShowType ? "" : "none"; + } else { + m.diskSpaceSection.style.display = "none"; + } + if (data.total_swap > 0 && showPagefileInMini) { + m.pagefileSection.style.display = ""; + const swapPct = Math.round(data.used_swap / data.total_swap * 100); + m.pagefileUsage.textContent = _n + ? (_u ? `${formatBytes(data.used_swap)}|${formatBytes(data.total_swap)}` : (swapPct < 10 ? "0" : "") + swapPct + "%") + : ""; + m.pagefileSegs[0].style.width = (data.used_swap / data.total_swap * 100) + "%"; + m.pagefileLabel.style.display = miniShowType ? "" : "none"; + } else { + m.pagefileSection.style.display = "none"; + } + if (showFaultsInMini && data.hard_faults != null) { + m.faultsSection.style.display = ""; + const now = performance.now(); + let rate = 0; + if (faultState.prev != null && faultState.prevTime > 0) { + const dt = (now - faultState.prevTime) / 1000; + if (dt > 0) { + rate = Math.max(0, (data.hard_faults - faultState.prev) / dt); + const decay = Math.pow(0.5, dt / FAULT_PEAK_HALFLIFE); + faultState.peak = Math.max(rate, faultState.peak * decay, FAULT_PEAK_FLOOR); + } + } + faultState.prev = data.hard_faults; + faultState.prevTime = now; + // bar height is rate vs recent peak; fixed color (height conveys activity) + m.faultsFill.style.width = (rate / faultState.peak * 100) + "%"; + m.faultsUsage.textContent = _n ? `${Math.round(rate)}/s` : ""; + m.faultsLabel.style.display = miniShowType ? "" : "none"; + } else { + m.faultsSection.style.display = "none"; + faultState.prev = null; + faultState.prevTime = 0; + } + // each bar is independently toggleable; null data shows "N/A" rather than hiding, + // so a missing pynvml doesn't make the whole section vanish silently. + const _showUtil = showGpuInMini; + const _showTemp = miniShowGpuTemp; + const _showPower = miniShowGpuPower; + const _utilOk = data.gpu_util != null; + const _tempOk = data.gpu_temp != null; + const _powerOk = data.gpu_power != null; + const _activeBars = (_showUtil ? 1 : 0) + (_showTemp ? 1 : 0) + (_showPower ? 1 : 0); + if (_activeBars > 0) { + m.gpuSection.style.display = ""; + // compact 8px / 3px styling kicks in only when there's >1 bar to fit + const isSingleBar = _activeBars === 1; + m.gpuSection.classList.toggle("is-multibar", !isSingleBar); + + // title row — "GPU" or "GPU (RTX 4090)" on the left, value on the right when + // only one bar is visible (then the layout matches RAM/VRAM/CPU above). + m.gpuLabel.textContent = (showHwNames && data.gpu_name) ? `GPU (${shortenGpuName(data.gpu_name)})` : "GPU"; + m.gpuLabel.title = data.gpu_name || ""; + m.gpuLabel.style.display = miniShowType ? "" : "none"; + // keep the row visible if either the label is on, or there's a single-bar value to show + m.gpuRow.style.display = (miniShowType || isSingleBar) ? "" : "none"; + + // util row + m.utilRow.style.display = _showUtil ? "" : "none"; + if (_showUtil) { + if (_utilOk) { + const gpuColor = gpuUtilColor(data.gpu_util); + m.gpuFill.style.background = gpuColor; + m.gpuFill.style.width = `${data.gpu_util}%`; + m.gpuUsage.innerHTML = _n + ? `${(data.gpu_util < 10 ? "0" : "") + data.gpu_util}%` + : ""; + } else { + m.gpuFill.style.width = "0%"; + m.gpuUsage.textContent = _t("na"); + } + } + + // temp row — 100°C is full scale; units-off uses "%" since the bar already + // treats 100°C as the denominator (75°C → 75% of the bar full). + m.tempRow.style.display = _showTemp ? "" : "none"; + if (_showTemp) { + if (_tempOk) { + const tempColor = gpuTempColor(data.gpu_temp); + m.tempFill.style.background = tempColor; + m.tempFill.style.width = `${Math.min(100, data.gpu_temp)}%`; + const tempDisplay = _u ? `${data.gpu_temp}°C` : `${Math.min(100, data.gpu_temp)}%`; + m.tempUsage.innerHTML = _n + ? `${tempDisplay}` + : ""; + } else { + m.tempFill.style.width = "0%"; + m.tempUsage.textContent = _t("na"); + } + } + + // power row — fill is draw/limit; value is W or % depending on the Units toggle + m.powerRow.style.display = _showPower ? "" : "none"; + if (_showPower) { + if (_powerOk) { + const powerColor = gpuPowerColor(data.gpu_power, data.gpu_power_limit); + m.powerFill.style.background = powerColor; + const powerPct = data.gpu_power_limit > 0 + ? Math.min(100, data.gpu_power / data.gpu_power_limit * 100) + : 0; + m.powerFill.style.width = `${powerPct}%`; + const powerText = _u + ? formatPower(data.gpu_power, data.gpu_power_limit) + : asPct(data.gpu_power, data.gpu_power_limit); + m.powerUsage.innerHTML = _n + ? `${powerText}` + : ""; + } else { + m.powerFill.style.width = "0%"; + m.powerUsage.textContent = _t("na"); + } + } + + // single-bar mode: lift the visible value into the title row so the section + // reads like RAM/VRAM/CPU above (label + value on top, bar below). + let headerHtml = ""; + if (isSingleBar) { + if (_showUtil) headerHtml = m.gpuUsage.innerHTML; + else if (_showTemp) headerHtml = m.tempUsage.innerHTML; + else if (_showPower) headerHtml = m.powerUsage.innerHTML; + } + m.gpuHeaderValue.innerHTML = headerHtml; + } else { + m.gpuSection.style.display = "none"; + } + + // Group dividers: mark the first visible section of each non-leading group + // so CSS can draw a separator above it. Recompute every render because the + // first visible can change as the user toggles individual sections. + function markFirstVisible(group) { + let found = false; + for (const sec of group) { + if (!found && sec.style.display !== "none") { + sec.classList.add("mini-group-start"); + found = true; + } else { + sec.classList.remove("mini-group-start"); + } + } + } + markFirstVisible([m.diskSection, m.diskSpaceSection]); + markFirstVisible([m.cpuSection, m.gpuSection]); + + const cr = r.contentDiv._refs; + cr.ramUsage.textContent = `${formatBytes(ramUsed)}|${formatBytes(ramTotal)}`; + cr.ramSegs[0].style.width = pinnedRamPct + "%"; + cr.ramSegs[0].title = _t("pinned") + ": " + formatBytes(pinnedRamTotal); + cr.ramSegs[1].style.width = loadedRamPct + "%"; + cr.ramSegs[1].title = _t("loaded") + ": " + formatBytes(loadedRamTotal); + cr.ramSegs[2].style.width = pythonOtherPct + "%"; + cr.ramSegs[2].title = _t("python") + ": " + formatBytes(pythonOther); + cr.ramSegs[3].style.width = ramOtherPct + "%"; + cr.ramSegs[3].title = _t("other") + ": " + formatBytes(ramOther); + cr.ramLegend.style.display = showLegends ? "flex" : "none"; + if (showLegends) { + cr.ramTexts.pinned.textContent = `${_t("pinned")} ${formatBytes(pinnedRamTotal)}`; + cr.ramTexts.loaded.textContent = `${_t("loaded")} ${formatBytes(loadedRamTotal)}`; + cr.ramTexts.python.textContent = `${_t("python")} ${formatBytes(pythonOther)}`; + cr.ramTexts.other.textContent = `${_t("other")} ${formatBytes(ramOther)}`; + } + + cr.vramLabel.textContent = _t("vram") + ((showHwNames && data.gpu_name) ? ` (${shortenGpuName(data.gpu_name)})` : ""); + cr.vramLabel.title = data.gpu_name || ""; + cr.vramUsage.textContent = `${formatBytes(used)}|${formatBytes(data.total_vram)}`; + cr.vramSegs[0].style.width = aimdoPct + "%"; + cr.vramSegs[0].title = _t("models") + ": " + formatBytes(aimdo); + cr.vramSegs[1].style.width = torchPct + "%"; + cr.vramSegs[1].title = _t("torch") + ": " + formatBytes(torchActive); + cr.vramSegs[2].style.width = torchCachePct + "%"; + cr.vramSegs[2].title = _t("cache") + ": " + formatBytes(torchCache); + cr.vramSegs[3].style.width = otherPct + "%"; + cr.vramSegs[3].title = _t("other") + ": " + formatBytes(otherUsed); + cr.vramLegend.style.display = showLegends ? "flex" : "none"; + if (showLegends) { + cr.vramWraps.models.style.display = aimdo > 0 ? "" : "none"; + if (aimdo > 0) cr.vramTexts.models.textContent = `${_t("models")} ${formatBytes(aimdo)}`; + cr.vramWraps.torch.style.display = torchActive > 0 ? "" : "none"; + if (torchActive > 0) cr.vramTexts.torch.textContent = `${_t("torch")} ${formatBytes(torchActive)}`; + cr.vramWraps.cache.style.display = torchCache > 0 ? "" : "none"; + if (torchCache > 0) cr.vramTexts.cache.textContent = `${_t("cache")} ${formatBytes(torchCache)}`; + cr.vramTexts.other.textContent = `${_t("other")} ${formatBytes(otherUsed)}`; + } + + cr.infoPeak.textContent = _t("peak") + ": " + formatBytes(peakVramUsed); + cr.infoCache.textContent = _t("cache") + ": " + formatBytes(data.torch_reserved - data.torch_active); + if (data.gpu_util != null) { + cr.infoGpu.style.display = ""; + cr.infoGpu.style.color = gpuUtilColor(data.gpu_util); + cr.infoGpu.style.opacity = graphState.gpuLineVisible ? "1" : "0.4"; + cr.infoGpu.textContent = `GPU ${data.gpu_util < 10 ? "0" : ""}${data.gpu_util}%`; + } else { + cr.infoGpu.style.display = "none"; + } + if (data.gpu_temp != null) { + cr.infoTemp.style.display = ""; + cr.infoTemp.style.color = gpuTempColor(data.gpu_temp); + cr.infoTemp.innerHTML = `${data.gpu_temp}°C`; + } else { + cr.infoTemp.style.display = "none"; + } + if (data.gpu_power != null) { + cr.infoPower.style.display = ""; + cr.infoPower.style.color = gpuPowerColor(data.gpu_power, data.gpu_power_limit); + cr.infoPower.textContent = formatPower(data.gpu_power, data.gpu_power_limit); + } else { + cr.infoPower.style.display = "none"; + } + if (execState.running) { + cr.infoState.style.color = "var(--aimdo-running)"; + cr.infoState.textContent = `● ${execState.node || _t("running")}${execState.progress ? " " + execState.progress : ""}`; + } else { + cr.infoState.style.color = ""; + cr.infoState.textContent = "● " + _t("idle"); + } + if (data.total_swap > 0) { + cr.pagefileSection.style.display = ""; + cr.pagefileSegs[0].style.width = (data.used_swap / data.total_swap * 100) + "%"; + cr.pagefileUsage.textContent = `${formatBytes(data.used_swap)}|${formatBytes(data.total_swap)}`; + } else { + cr.pagefileSection.style.display = "none"; + } + + // sync canvas backing to device pixels: visual viewport px × devicePixelRatio. + // Drawing then happens in logical (panel-local) CSS px via the totalScale transform, + // so cells/lines scale with panelScale while staying crisp on HiDPI. + const panelScaleNow = body._panel._scale || 1; + const dpr = window.devicePixelRatio || 1; + const totalScale = panelScaleNow * dpr; + const gRect = r.graphCanvas.getBoundingClientRect(); + if (gRect.width > 0 && gRect.height > 0) { + const backingW = Math.max(1, Math.round(gRect.width * dpr)); + const backingH = Math.max(1, Math.round(gRect.height * dpr)); + if (r.graphCanvas.width !== backingW) r.graphCanvas.width = backingW; + if (r.graphCanvas.height !== backingH) r.graphCanvas.height = backingH; + r.graphCtx.setTransform(totalScale, 0, 0, totalScale, 0, 0); + drawGraph(r.graphCtx, gRect.width / panelScaleNow, gRect.height / panelScaleNow); + updateGraphTimes(); + } + + // models section — incremental DOM updates: keep rows across polls, only mutate text/widths + if (data.models.length === 0 && !r.noModelsMsg) { + r.noModelsMsg = document.createElement("div"); + r.noModelsMsg.textContent = _t("noModels"); + r.noModelsMsg.style.cssText = `color:var(--aimdo-textDim);margin-top:6px;`; + r.modelsDiv.insertBefore(r.noModelsMsg, r.modelsDiv.firstChild); + } else if (data.models.length > 0 && r.noModelsMsg) { + r.noModelsMsg.remove(); + r.noModelsMsg = null; + } + + // remove rows for models no longer present and clean up their canvas refs + const liveIndices = new Set(data.models.map(m => m.index)); + for (const idx of Object.keys(r.modelRows)) { + if (!liveIndices.has(parseInt(idx))) { + r.modelRows[idx].el.remove(); + delete r.modelRows[idx]; + } + } + for (const key of Object.keys(r.pageCanvases)) { + const idx = parseInt(key.split("_")[0]); + if (!liveIndices.has(idx)) { + delete r.pageCanvases[key]; + delete r.pageCtxs[key]; + delete modelState[key]; + } + } + + if (!r.bottomLegend) { + r.bottomLegend = document.createElement("div"); + r.bottomLegend.style.cssText = `display:flex;flex-wrap:wrap;gap:8px;font-size:0.833em;color:var(--aimdo-textDim);margin-top:4px;border-bottom:1px solid var(--aimdo-border);padding-bottom:4px;`; + r.bottomLegend.innerHTML = + `■ ${_t("vram")}` + + `■ ${_t("pinned")}` + + `■ ${_t("loaded")}` + + `■ ${_t("unloaded")}` + + `■ ${_t("torch")}` + + `─ ${_t("total")}` + + `─ ${_t("gpuPct")}`; + r.modelsDiv.insertBefore(r.bottomLegend, r.modelsDiv.firstChild); + } + r.bottomLegend.style.display = showLegends ? "flex" : "none"; + + for (const m of data.models) { + const isNew = !r.modelRows[m.index]; + const row = renderModelRow(r, m, data); + if (isNew) r.modelsDiv.appendChild(row.el); + } + + // draw page grids and update vbar stat text + for (const m of data.models) { + const row = r.modelRows[m.index]; + if (!row || !row.vbarRefs.length || row.collapsed) continue; + const vbars = (m.vbars || []).filter(v => v.residency && v.residency.length > 0); + for (let vi = 0; vi < row.vbarRefs.length; vi++) { + const vb = vbars[vi]; + if (!vb) continue; + const ref = row.vbarRefs[vi]; + const vkey = `${m.index}_${ref.vi}`; + const st = diffResidency(vkey, vb.residency); + let residentCount = 0, pinnedCount = 0; + for (let i = 0; i < vb.residency.length; i++) { + const flag = vb.residency[i]; + if (flag & 2) pinnedCount++; + else if (flag & 1) residentCount++; + } + const PAGE = 32 * 1024 * 1024; + const vramPages = residentCount + pinnedCount; + const ramPages = vb.residency.length - vramPages; + const vramColor = (colorModelBars && MODEL_TYPE_COLOR[m.type]) || C.vram; + // swatch carries the category color; text inherits readable textDim. + ref.vramSw.style.color = vramColor; + ref.vramTxt.nodeValue = ` ${vramPages} ${_t("pageVRAM")} (${formatBytes(vramPages * PAGE)})`; + ref.unloadedTxt.nodeValue = ` ${ramPages} ${_t("pageUnloaded")} (${formatBytes(ramPages * PAGE)})`; + + let canvas = r.pageCanvases[vkey]; + if (!canvas) { + canvas = document.createElement("canvas"); + canvas.style.cssText = "width:100%;border-radius:2px;"; + r.pageCanvases[vkey] = canvas; + r.pageCtxs[vkey] = canvas.getContext("2d"); + } + if (canvas.parentElement !== ref.pgrid) ref.pgrid.appendChild(canvas); + const pgVisualW = ref.pgrid.getBoundingClientRect().width + || r.modelsDiv.getBoundingClientRect().width + || 300 * panelScaleNow; + const pgCssW = pgVisualW / panelScaleNow; + drawPageGrid(r.pageCtxs[vkey], pgCssW, vb.residency, st ? st.changeAge : new Uint8Array(vb.residency.length), panelScaleNow, colorModelBars ? MODEL_TYPE_COLOR[m.type] : undefined); + } + } + + // attach button handlers via event delegation (once) + if (!r.modelsDiv._delegated) { + r.modelsDiv._delegated = true; + r.modelsDiv.addEventListener("click", async (e) => { + const wmBtn = e.target.closest(".aimdo-reset-wm-btn"); + if (wmBtn) { + const idx = parseInt(wmBtn.dataset.index); + wmBtn.textContent = "..."; + try { + await api.fetchApi("/aimdo/reset_watermark", { + method: "POST", + body: JSON.stringify({ index: idx }), + headers: { "Content-Type": "application/json" }, + }); + } finally { + wmBtn.textContent = _t("wm"); + } + return; + } + const unloadBtn = e.target.closest(".aimdo-unload-btn"); + if (unloadBtn) { + const idx = parseInt(unloadBtn.dataset.index); + unloadBtn.textContent = "..."; + try { + await api.fetchApi("/aimdo/unload_model", { + method: "POST", + body: JSON.stringify({ index: idx }), + headers: { "Content-Type": "application/json" }, + }); + } catch { /* next poll will reflect state */ } + } + }); + } +} + +app.registerExtension({ + name: "aimdo.VRAMVisualization", + async setup() { + // ── 注册 ComfyUI 设置面板开关 ── + const SETTING_ID = "xb_toolbox.memory_viz.enabled"; + let panelEnabled = true; + + // 从 localStorage 读取初始状态(settings 系统可能还没就绪) + try { + const raw = localStorage.getItem("Comfy.Settings." + SETTING_ID); + if (raw !== null) panelEnabled = JSON.parse(raw) !== false; + } catch {} + + // 注册设置项(出现在 ComfyUI 设置 → XB_ToolBox 分类下) + if (app.ui && app.ui.settings) { + app.ui.settings.addSetting({ + id: SETTING_ID, + name: "XB 📊 硬件监控面板 (Memory Visualization)", + type: "boolean", + defaultValue: true, + category: ["XB_ToolBox", "硬件监控"], + onChange: (value) => { + panelEnabled = value; + const panel = document.getElementById("aimdo-viz-panel"); + if (panel) panel.style.display = value ? "" : "none"; + } + }); + } + + if (!panelEnabled) return; // 用户禁用了面板,不创建 + + // wait for aimdo_viz.css so applyPalette can read CSS variables back into C — + // canvas drawing needs real hex strings, not unresolved var() references. + await cssLoaded; + // load before wiring the periodic save so a stray tick can't overwrite the + // stored history with an empty buffer between extension boot and first poll. + await loadHistory(); + setInterval(saveHistory, 10000); + // beforeunload is best-effort with IDB: writes are async and may not commit + // before teardown. The 10s interval bounds loss to ~1% of the 20-min buffer. + window.addEventListener("beforeunload", saveHistory); + const body = createPanel(); + + api.addEventListener("execution_start", () => { + execState.running = true; + execState.node = null; + execState.progress = null; + pushExecEvent("start"); + body._updateExecBtnState?.(); + }); + api.addEventListener("executing", ({ detail }) => { + // detail is the node ID string while executing; null/undefined when done + // (older ComfyUI) or when interrupted. Newer versions may not fire null. + if (detail != null) { + execState.running = true; + execState.node = detail; + } + body._updateExecBtnState?.(); + }); + api.addEventListener("execution_interrupted", () => { + execState.running = false; + execState.node = null; + execState.progress = null; + pushExecEvent("end"); + body._updateExecBtnState?.(); + }); + // status event — reliable execution-end signal in newer ComfyUI (queue_remaining == 0) + api.addEventListener("status", ({ detail }) => { + if (detail && detail.exec_info && detail.exec_info.queue_remaining === 0) { + if (execState.running) { + execState.running = false; + execState.node = null; + execState.progress = null; + pushExecEvent("end"); + body._updateExecBtnState?.(); + } + } + }); + api.addEventListener("progress", ({ detail }) => { + if (detail) { + execState.progress = `${detail.value}/${detail.max}`; + } + }); + + let pollTimer = null; + async function poll() { + // Skip fetch when the tab is hidden or the panel is detached + if (document.hidden || !body.isConnected || !panelEnabled) { + pollTimer = setTimeout(poll, pollInterval); + return; + } + try { + const params = []; + if (showDiskInMini) params.push("disk=1"); + if (showPagefileInMini) params.push("pagefile=1"); + if (showFaultsInMini) params.push("faults=1"); + // list_disks drives both the visible bars (filtered by selectedDisks) + // and the tooltip listing every fixed drive. The one-shot + // wantDisksList flag lets the settings menu request a fresh list + // even when nothing is selected yet. + if (selectedDisks.length > 0 || wantDisksList) { + params.push("list_disks=1"); + wantDisksList = false; + } + const url = "/aimdo/vram" + (params.length ? "?" + params.join("&") : ""); + const resp = await api.fetchApi(url); + const data = await resp.json(); + renderData(body, data); + } catch (e) { + body.innerHTML = `
${_t("fetchError")}
`; + refs = null; + } + pollTimer = setTimeout(poll, pollInterval); + } + + // Wake immediately when the tab becomes visible + document.addEventListener("visibilitychange", () => { + if (!document.hidden && pollTimer != null) { + clearTimeout(pollTimer); + pollTimer = null; + poll(); + } + }); + + poll(); + } +}); \ No newline at end of file diff --git a/js/xb_memory_viz_graph.js b/js/xb_memory_viz_graph.js new file mode 100644 index 0000000..c9e69b2 --- /dev/null +++ b/js/xb_memory_viz_graph.js @@ -0,0 +1,623 @@ +// Graph subsystem: history ring buffer, persistence, drawGraph, graph submenu. +// +// External dependencies (palette, color utilities, persistence) are wired by +// initGraph(deps) — graph.js doesn't import from aimdo_viz.js so the dependency +// graph stays one-way (main → graph). + +let C = null; +let hexToRgb = null; +let hexToRgba = null; +let saveState = null; +let _t = null; + +export function initGraph(deps) { + C = deps.C; + hexToRgb = deps.hexToRgb; + hexToRgba = deps.hexToRgba; + saveState = deps.saveState; + _t = deps._t || ((k) => k); +} + +export const GRAPH_POINTS = 120; // visible window size on the canvas +export const HISTORY_BUFFER = 1200; // total points retained for scrollback (~20 min @ 1s) +export const HISTORY_TICK_MS = 1000; // min interval between history snapshots +const EXEC_EVENTS_MAX = 200; +const EXEC_NOOP_MS = 1500; // start→end shorter than this is treated as a no-op +const HISTORY_DB_NAME = "aimdo_viz"; +const HISTORY_DB_VERSION = 1; +const HISTORY_STORE = "kv"; +const HISTORY_KEY = "history"; +const HISTORY_SCHEMA = 1; // bump when the stored record shape changes +const GPU_SMOOTH_WINDOW = 3; + +// Mutable graph state. Both main and graph mutate via property assignment so +// `let` exports' read-only semantics don't get in the way. +export const graphState = { + gpuLineVisible: true, + graphStyle: "area", // "area" | "dots" | "ticker" | "bars" + graphVramColor: null, // null = use theme C.vram; otherwise hex override + graphTotalColor: null, // null = use theme C.totalLine; otherwise hex override + graphTotalSmoothness: 0, // 0 = raw, larger = wider moving-average window radius +}; + +export const history = { + torch_active: new Float64Array(HISTORY_BUFFER), + aimdo_usage: new Float64Array(HISTORY_BUFFER), + free_vram: new Float64Array(HISTORY_BUFFER), + gpu_util: new Float64Array(HISTORY_BUFFER), + times: new Float64Array(HISTORY_BUFFER), + total_vram: 1, + head: 0, + len: 0, + pushCount: 0, // monotonic total pushes; absolute sample id + viewOffset: 0, // points back from newest; 0 = right edge (live) + followLive: true, + execEvents: [], // {type: "start"|"end", time: ms} +}; + +// hover-line state for the graph; null when cursor is outside the data range. +export const graphHover = { x: null, idx: null }; + +const gpuRawBuf = []; +export function smoothGpuUtil(raw) { + // NVML util frequently dips to 0 mid-workload; peak-hold preserves real peaks. + if (raw == null) { + gpuRawBuf.length = 0; + return null; + } + gpuRawBuf.push(raw); + if (gpuRawBuf.length > GPU_SMOOTH_WINDOW) gpuRawBuf.shift(); + let m = 0; + for (const v of gpuRawBuf) if (v > m) m = v; + return m; +} + +export function pushExecEvent(type) { + if (type === "end" && history.execEvents.length > 0) { + const last = history.execEvents[history.execEvents.length - 1]; + if (last.type === "start" && Date.now() - last.time < EXEC_NOOP_MS) { + history.execEvents.pop(); + return; + } + } + history.execEvents.push({ type, time: Date.now() }); + if (history.execEvents.length > EXEC_EVENTS_MAX) { + history.execEvents.splice(0, history.execEvents.length - EXEC_EVENTS_MAX); + } +} + +export function pushHistory(data) { + history.total_vram = data.total_vram; + const i = history.head; + // store non-overlapping values matching the bar logic + if (data.aimdo_usage > 0) { + history.aimdo_usage[i] = data.aimdo_usage; + history.torch_active[i] = 0; + } else { + history.aimdo_usage[i] = 0; + history.torch_active[i] = data.torch_active; + } + history.free_vram[i] = data.free_vram; + history.gpu_util[i] = data.gpu_util != null ? data.gpu_util : 0; + history.times[i] = Date.now(); + history.head = (i + 1) % HISTORY_BUFFER; + if (history.len < HISTORY_BUFFER) history.len++; + history.pushCount++; + // when scrolled back, advance viewOffset so the user's pinned window keeps + // showing the same chronological data instead of sliding with new points. + if (!history.followLive) { + const maxOffset = Math.max(0, history.len - GRAPH_POINTS); + history.viewOffset = Math.min(maxOffset, history.viewOffset + 1); + } +} + +export function historyGet(arr, idx) { + // idx 0 = oldest valid, idx len-1 = newest + return arr[(history.head - history.len + idx + HISTORY_BUFFER) % HISTORY_BUFFER]; +} + +export function resetHistoryState() { + history.head = 0; + history.len = 0; + history.pushCount = 0; + history.viewOffset = 0; + history.followLive = true; + history.torch_active.fill(0); + history.aimdo_usage.fill(0); + history.free_vram.fill(0); + history.gpu_util.fill(0); + history.times.fill(0); + history.execEvents.length = 0; +} + +let _dbPromise = null; +function openHistoryDb() { + if (_dbPromise) return _dbPromise; + _dbPromise = new Promise((resolve, reject) => { + const req = indexedDB.open(HISTORY_DB_NAME, HISTORY_DB_VERSION); + req.onupgradeneeded = () => req.result.createObjectStore(HISTORY_STORE); + req.onsuccess = () => resolve(req.result); + req.onerror = () => reject(req.error); + }); + _dbPromise.catch(() => { _dbPromise = null; }); // allow retry after open failure + return _dbPromise; +} + +// cleanup the localStorage key for users upgrading from the previous version. +try { localStorage.removeItem("aimdo_viz_history"); } catch {} + +export async function saveHistory() { + if (history.len === 0) return; + try { + const db = await openHistoryDb(); + db.transaction(HISTORY_STORE, "readwrite").objectStore(HISTORY_STORE).put({ + v: HISTORY_SCHEMA, + head: history.head, + len: history.len, + buffer_size: HISTORY_BUFFER, + total_vram: history.total_vram, + times: history.times, + torch_active: history.torch_active, + aimdo_usage: history.aimdo_usage, + free_vram: history.free_vram, + gpu_util: history.gpu_util, + execEvents: history.execEvents, + }, HISTORY_KEY); + } catch (err) { + if (!saveHistory._warned) { + saveHistory._warned = true; + console.warn("aimdo-viz: history save failed", err); + } + } +} + +export async function clearHistoryStorage() { + try { + const db = await openHistoryDb(); + db.transaction(HISTORY_STORE, "readwrite").objectStore(HISTORY_STORE).delete(HISTORY_KEY); + } catch (err) { console.warn("aimdo-viz: history clear failed", err); } +} + +export async function loadHistory() { + try { + const db = await openHistoryDb(); + const data = await new Promise((resolve, reject) => { + const req = db.transaction(HISTORY_STORE, "readonly").objectStore(HISTORY_STORE).get(HISTORY_KEY); + req.onsuccess = () => resolve(req.result); + req.onerror = () => reject(req.error); + }); + if (!data || data.v !== HISTORY_SCHEMA || typeof data.len !== "number") return; + if (!data.times || data.times.length !== HISTORY_BUFFER) return; + const copy = (target, source) => { if (source) target.set(source); }; + history.total_vram = data.total_vram || 1; + copy(history.times, data.times); + copy(history.torch_active, data.torch_active); + copy(history.aimdo_usage, data.aimdo_usage); + copy(history.free_vram, data.free_vram); + copy(history.gpu_util, data.gpu_util); + history.len = Math.min(data.len, HISTORY_BUFFER); + history.head = (typeof data.head === "number" ? data.head : history.len) % HISTORY_BUFFER; + history.pushCount = history.len; + if (Array.isArray(data.execEvents)) history.execEvents = data.execEvents.slice(-EXEC_EVENTS_MAX); + } catch (err) { console.warn("aimdo-viz: history load failed", err); } +} + +export function loadGraphSavedState(saved) { + if (typeof saved.gpuLineVisible === "boolean") graphState.gpuLineVisible = saved.gpuLineVisible; + if (typeof saved.graphStyle === "string") graphState.graphStyle = saved.graphStyle; + if (typeof saved.graphVramColor === "string") graphState.graphVramColor = saved.graphVramColor; + if (typeof saved.graphTotalColor === "string") graphState.graphTotalColor = saved.graphTotalColor; + if (typeof saved.graphTotalSmoothness === "number") { + graphState.graphTotalSmoothness = Math.max(0, Math.min(20, saved.graphTotalSmoothness | 0)); + } +} + +export function drawGraph(ctx, w, h) { + const total = history.total_vram; + const len = history.len; + if (len < 2) return; + + const visible = Math.min(GRAPH_POINTS, len - history.viewOffset); + if (visible < 2) return; + const startIdx = len - visible - history.viewOffset; + + ctx.clearRect(0, 0, w, h); + + ctx.strokeStyle = C.gridLine; + ctx.lineWidth = 1; + for (const pct of [0.25, 0.5, 0.75]) { + const y = Math.round(h - h * pct) + 0.5; + ctx.beginPath(); + ctx.moveTo(0, y); + ctx.lineTo(w, y); + ctx.stroke(); + } + + const stepX = w / (GRAPH_POINTS - 1); + const yFor = val => h - (val / total) * h; + const dataStartX = (GRAPH_POINTS - visible) * stepX; + const xFor = i => (GRAPH_POINTS - visible + i) * stepX; + const at = (arr, i) => historyGet(arr, startIdx + i); + + // smoothed total-used values, precomputed once per frame and shared by the total + // line, dots, and area-"other" layer so dots/areas stay at-or-below the line. + const smoothN = graphState.graphTotalSmoothness; + const totalValues = new Float64Array(visible); + for (let i = 0; i < visible; i++) totalValues[i] = total - at(history.free_vram, i); + let smoothedValues; + if (smoothN > 0 && visible > 0) { + smoothedValues = new Float64Array(visible); + let sum = 0, count = 0; + const initEnd = Math.min(visible - 1, smoothN); + for (let k = 0; k <= initEnd; k++) { sum += totalValues[k]; count++; } + smoothedValues[0] = sum / count; + for (let i = 1; i < visible; i++) { + const add = i + smoothN; + const drop = i - smoothN - 1; + if (add < visible) { sum += totalValues[add]; count++; } + if (drop >= 0) { sum -= totalValues[drop]; count--; } + smoothedValues[i] = sum / count; + } + } else { + smoothedValues = totalValues; + } + const valueAt = (i) => smoothedValues[i]; + + const style = graphState.graphStyle; + const vramHex = graphState.graphVramColor || C.vram; + if (style === "area") { + ctx.beginPath(); + ctx.moveTo(dataStartX, h); + for (let i = 0; i < visible; i++) { + ctx.lineTo(xFor(i), yFor(at(history.aimdo_usage, i))); + } + ctx.lineTo(xFor(visible - 1), h); + ctx.closePath(); + ctx.fillStyle = hexToRgba(vramHex, 0.35); + ctx.fill(); + + ctx.beginPath(); + ctx.moveTo(dataStartX, yFor(at(history.aimdo_usage, 0))); + for (let i = 0; i < visible; i++) { + ctx.lineTo(xFor(i), yFor(at(history.aimdo_usage, i) + at(history.torch_active, i))); + } + for (let i = visible - 1; i >= 0; i--) { + ctx.lineTo(xFor(i), yFor(at(history.aimdo_usage, i))); + } + ctx.closePath(); + ctx.fillStyle = hexToRgba(C.torch, 0.4); + ctx.fill(); + + const stackTop = (i) => at(history.aimdo_usage, i) + at(history.torch_active, i); + const topFor = (i) => Math.max(stackTop(i), valueAt(i)); + ctx.beginPath(); + ctx.moveTo(dataStartX, yFor(stackTop(0))); + for (let i = 0; i < visible; i++) { + ctx.lineTo(xFor(i), yFor(topFor(i))); + } + for (let i = visible - 1; i >= 0; i--) { + ctx.lineTo(xFor(i), yFor(stackTop(i))); + } + ctx.closePath(); + ctx.fillStyle = hexToRgba(C.other, 0.4); + ctx.fill(); + } else if (style === "bars") { + const groupSize = 3; + const barStep = stepX * groupSize; + const barW = Math.max(4, barStep - 4); + ctx.fillStyle = hexToRgba(vramHex, 0.55); + const newestAbs = history.pushCount - 1 - history.viewOffset; + const oldestAbs = newestAbs - visible + 1; + const firstGroupAbs = Math.floor(oldestAbs / groupSize) * groupSize; + const lastGroupAbs = Math.floor(newestAbs / groupSize) * groupSize; + for (let absG = firstGroupAbs; absG <= lastGroupAbs; absG += groupSize) { + const sStart = Math.max(absG, oldestAbs); + const sEnd = Math.min(absG + groupSize - 1, newestAbs); + let peak = 0; + for (let a = sStart; a <= sEnd; a++) { + const v = total - at(history.free_vram, a - oldestAbs); + if (v > peak) peak = v; + } + const centerRel = (absG - oldestAbs) + (groupSize - 1) / 2; + const cx = xFor(centerRel); + const y = yFor(peak); + ctx.fillRect(cx - barW / 2, y, barW, h - y); + } + } else if (style === "ticker") { + const groupSize = 3; + const candleStep = stepX * groupSize; + const barW = Math.max(5, candleStep - 3); + const up = "#10b981"; + const down = "#ef4444"; + const newestAbs = history.pushCount - 1 - history.viewOffset; + const oldestAbs = newestAbs - visible + 1; + const firstGroupAbs = Math.floor(oldestAbs / groupSize) * groupSize; + const lastGroupAbs = Math.floor(newestAbs / groupSize) * groupSize; + ctx.lineWidth = 1; + for (let absG = firstGroupAbs; absG <= lastGroupAbs; absG += groupSize) { + const sStart = Math.max(absG, oldestAbs); + const sEnd = Math.min(absG + groupSize - 1, newestAbs); + const oRel = sStart - oldestAbs; + const cRel = sEnd - oldestAbs; + const o = total - at(history.free_vram, oRel); + const c = total - at(history.free_vram, cRel); + const hiLoStartRel = Math.max(0, oRel - 1); + const hiLoEndRel = Math.min(visible - 1, cRel + 1); + let hi = o, lo = o; + for (let rel = hiLoStartRel; rel <= hiLoEndRel; rel++) { + const v = total - at(history.free_vram, rel); + if (v > hi) hi = v; + if (v < lo) lo = v; + } + const yO = yFor(o), yC = yFor(c); + const yTop = Math.min(yO, yC); + const bodyH = Math.max(1, Math.abs(yC - yO)); + const centerRel = (absG - oldestAbs) + (groupSize - 1) / 2; + const cx = xFor(centerRel); + const isUp = c >= o; + const color = isUp ? up : down; + const yBot = yTop + bodyH; + ctx.strokeStyle = color; + const wickX = Math.round(cx) + 0.5; + const yHi = yFor(hi); + const yLo = yFor(lo); + if (yHi < yTop) { + ctx.beginPath(); + ctx.moveTo(wickX, yHi); + ctx.lineTo(wickX, yTop); + ctx.stroke(); + } + if (yLo > yBot) { + ctx.beginPath(); + ctx.moveTo(wickX, yBot); + ctx.lineTo(wickX, yLo); + ctx.stroke(); + } + const bx = Math.round(cx - barW / 2); + if (isUp) { + ctx.strokeRect(bx + 0.5, Math.round(yTop) + 0.5, barW - 1, bodyH); + } else { + ctx.fillStyle = color; + ctx.fillRect(bx, Math.round(yTop), barW, bodyH); + } + } + } else if (style === "dots") { + const dotR = 1; + const dotStep = 8; + const colStep = 2; + const [r, g, b] = hexToRgb(vramHex); + for (let y = 0; y < h; y += dotStep) { + const f = 1 - y / h; + ctx.fillStyle = `rgba(${r},${g},${b},${(0.15 + 0.65 * f).toFixed(3)})`; + ctx.beginPath(); + for (let i = 0; i < visible; i += colStep) { + if (y < yFor(valueAt(i))) continue; + const x = xFor(i); + ctx.moveTo(x + dotR, y); + ctx.arc(x, y, dotR, 0, Math.PI * 2); + } + ctx.fill(); + } + } + + // total used line — ticker already encodes the value in each candle's edge, + // so skip the line to avoid overlapping the bars. + if (style !== "ticker") { + ctx.beginPath(); + ctx.strokeStyle = graphState.graphTotalColor || C.totalLine; + ctx.lineWidth = 1.5; + ctx.lineJoin = "round"; + ctx.lineCap = "round"; + if (smoothN > 0 && visible >= 3) { + const xs = new Float64Array(visible); + const ys = new Float64Array(visible); + for (let i = 0; i < visible; i++) { xs[i] = xFor(i); ys[i] = yFor(valueAt(i)); } + ctx.moveTo(xs[0], ys[0]); + for (let i = 1; i < visible - 1; i++) { + const mx = (xs[i] + xs[i + 1]) / 2; + const my = (ys[i] + ys[i + 1]) / 2; + ctx.quadraticCurveTo(xs[i], ys[i], mx, my); + } + ctx.lineTo(xs[visible - 1], ys[visible - 1]); + } else { + for (let i = 0; i < visible; i++) { + const x = xFor(i); + const y = yFor(valueAt(i)); + if (i === 0) ctx.moveTo(x, y); else ctx.lineTo(x, y); + } + } + ctx.stroke(); + } + + // capacity line + ctx.strokeStyle = C.capLine; + ctx.lineWidth = 1; + ctx.setLineDash([4, 4]); + ctx.beginPath(); + ctx.moveTo(0, yFor(total)); + ctx.lineTo(w, yFor(total)); + ctx.stroke(); + ctx.setLineDash([]); + + // exec start/end markers — positioned by interpolating each event's time into the + // visible sample times array, so markers stay glued to the data during scrubbing + // even if pollInterval drifts between ticks. + if (history.execEvents.length) { + const sampleTimes = new Float64Array(visible); + for (let i = 0; i < visible; i++) sampleTimes[i] = historyGet(history.times, startIdx + i); + const tFirst = sampleTimes[0]; + const tLast = sampleTimes[visible - 1]; + ctx.lineWidth = 1; + ctx.setLineDash([2, 3]); + for (const evt of history.execEvents) { + if (evt.time < tFirst || evt.time > tLast) continue; + let lo = 0, hi = visible - 1; + while (lo < hi) { + const mid = (lo + hi + 1) >> 1; + if (sampleTimes[mid] <= evt.time) lo = mid; else hi = mid - 1; + } + const tA = sampleTimes[lo]; + const tB = lo < visible - 1 ? sampleTimes[lo + 1] : tA; + const frac = tB > tA ? (evt.time - tA) / (tB - tA) : 0; + const x = xFor(lo + frac); + ctx.strokeStyle = evt.type === "start" ? C.torch : C.gpuUtilHi; + ctx.beginPath(); + ctx.moveTo(x + 0.5, 0); + ctx.lineTo(x + 0.5, h); + ctx.stroke(); + } + ctx.setLineDash([]); + } + + // gpu line uses its own 0..100 scale, not the VRAM byte scale + if (graphState.gpuLineVisible) { + ctx.beginPath(); + ctx.strokeStyle = C.gpuUtil; + ctx.lineWidth = 1.25; + for (let i = 0; i < visible; i++) { + const y = h - (at(history.gpu_util, i) / 100) * h; + if (i === 0) ctx.moveTo(xFor(i), y); else ctx.lineTo(xFor(i), y); + } + ctx.stroke(); + } + + if (graphHover.x != null && graphHover.idx != null) { + const hi = graphHover.idx - startIdx; + if (hi >= 0 && hi < visible) { + ctx.strokeStyle = C.vram; + ctx.lineWidth = 1; + ctx.beginPath(); + ctx.moveTo(graphHover.x + 0.5, 0); + ctx.lineTo(graphHover.x + 0.5, h); + ctx.stroke(); + + const dot = (x, y, fill) => { + ctx.beginPath(); + ctx.arc(x, y, 3, 0, Math.PI * 2); + ctx.fillStyle = fill; + ctx.fill(); + ctx.lineWidth = 1.5; + ctx.strokeStyle = C.graphBg; + ctx.stroke(); + }; + const totalY = yFor(total - at(history.free_vram, hi)); + dot(graphHover.x, totalY, C.totalLine); + if (graphState.gpuLineVisible) { + const gpuY = h - (at(history.gpu_util, hi) / 100) * h; + dot(graphHover.x, gpuY, C.gpuUtil); + } + } + } +} + +// Build the "Graph" submenu (style + colors + smoothness). The caller passes the +// submenu container + a redraw callback that's tied to the active panel instance. +export function buildGraphSubmenu(submenu, redrawGraph) { + const graphStyles = [ + { key: "area", label: _t("graphArea") }, + { key: "bars", label: _t("graphBars") }, + { key: "ticker", label: _t("graphTicker") }, + { key: "dots", label: _t("graphDots") }, + ]; + const items = new Map(); + function renderItems() { + for (const [k, item] of items) { + const on = k === graphState.graphStyle; + const label = graphStyles.find(s => s.key === k).label; + item.innerHTML = `${on ? "✓" : ""}${label}`; + } + } + for (const s of graphStyles) { + const item = document.createElement("div"); + item.className = "aimdo-menu-item"; + item.addEventListener("click", (e) => { + e.stopPropagation(); + graphState.graphStyle = s.key; + saveState({ graphStyle: s.key }); + renderItems(); + redrawGraph(); + }); + submenu.appendChild(item); + items.set(s.key, item); + } + renderItems(); + + // VRAM color picker + const colorRow = document.createElement("div"); + colorRow.style.cssText = `padding:6px 10px;display:flex;align-items:center;gap:8px;font-size:0.917em;`; + colorRow.addEventListener("click", (e) => e.stopPropagation()); + const colorInput = document.createElement("input"); + colorInput.type = "color"; + colorInput.value = graphState.graphVramColor || C.vram; + colorInput.style.cssText = `width:24px;height:18px;padding:0;border:none;background:transparent;cursor:pointer;`; + colorInput.addEventListener("input", () => { + graphState.graphVramColor = colorInput.value; + saveState({ graphVramColor: colorInput.value }); + redrawGraph(); + }); + const resetColor = document.createElement("span"); + resetColor.textContent = _t("reset"); + resetColor.style.cssText = `margin-left:auto;color:var(--aimdo-textDim);cursor:pointer;font-size:0.833em;`; + resetColor.addEventListener("click", () => { + graphState.graphVramColor = null; + saveState({ graphVramColor: null }); + colorInput.value = C.vram; + redrawGraph(); + }); + colorRow.appendChild(colorInput); + colorRow.appendChild(document.createTextNode(_t("vramColor"))); + colorRow.appendChild(resetColor); + submenu.appendChild(colorRow); + + // Total-line color picker + const totalColorRow = document.createElement("div"); + totalColorRow.style.cssText = colorRow.style.cssText; + totalColorRow.addEventListener("click", (e) => e.stopPropagation()); + const totalColorInput = document.createElement("input"); + totalColorInput.type = "color"; + totalColorInput.value = graphState.graphTotalColor || C.totalLine; + totalColorInput.style.cssText = colorInput.style.cssText; + totalColorInput.addEventListener("input", () => { + graphState.graphTotalColor = totalColorInput.value; + saveState({ graphTotalColor: totalColorInput.value }); + redrawGraph(); + }); + const resetTotalColor = document.createElement("span"); + resetTotalColor.textContent = _t("reset"); + resetTotalColor.style.cssText = resetColor.style.cssText; + resetTotalColor.addEventListener("click", () => { + graphState.graphTotalColor = null; + saveState({ graphTotalColor: null }); + totalColorInput.value = C.totalLine; + redrawGraph(); + }); + totalColorRow.appendChild(totalColorInput); + totalColorRow.appendChild(document.createTextNode(_t("totalColor"))); + totalColorRow.appendChild(resetTotalColor); + submenu.appendChild(totalColorRow); + + // Total-line smoothness slider + const smoothRow = document.createElement("div"); + smoothRow.style.cssText = `padding:6px 10px;display:flex;flex-direction:column;gap:4px;min-width:180px;font-size:0.833em;`; + smoothRow.addEventListener("click", (e) => e.stopPropagation()); + const smoothLabel = document.createElement("div"); + smoothLabel.style.cssText = `display:flex;justify-content:space-between;color:var(--aimdo-textDim);`; + smoothLabel.innerHTML = `${_t("smoothness")}${graphState.graphTotalSmoothness}`; + const smoothSlider = document.createElement("input"); + smoothSlider.type = "range"; + smoothSlider.min = "0"; + smoothSlider.max = "20"; + smoothSlider.step = "1"; + smoothSlider.value = String(graphState.graphTotalSmoothness); + smoothSlider.style.cssText = `width:100%;accent-color:var(--aimdo-vram);cursor:pointer;`; + const smoothValSpan = smoothLabel.querySelector(".aimdo-sm-val"); + smoothSlider.addEventListener("input", () => { + graphState.graphTotalSmoothness = parseInt(smoothSlider.value, 10); + smoothValSpan.textContent = String(graphState.graphTotalSmoothness); + saveState({ graphTotalSmoothness: graphState.graphTotalSmoothness }); + redrawGraph(); + }); + smoothRow.appendChild(smoothLabel); + smoothRow.appendChild(smoothSlider); + submenu.appendChild(smoothRow); +} diff --git a/locales/zh/nodeDefs.json b/locales/zh/nodeDefs.json index 1d64486..908208d 100644 --- a/locales/zh/nodeDefs.json +++ b/locales/zh/nodeDefs.json @@ -4670,5 +4670,14 @@ "name": "📝 系统提示词" } } + }, + "XB_MemoryVisualization": { + "display_name": "XB 📊 硬件监控面板 (Memory Visualization)", + "description": "实时显存内存监控面板——显示GPU/CPU/内存/磁盘等硬件资源使用情况。将此节点添加到工作流即可在界面右下角激活可拖拽的监控面板。", + "inputs": { + "any_input": { + "name": "任意输入(可选)" + } + } } } \ No newline at end of file diff --git a/nodes_memory_viz.py b/nodes_memory_viz.py new file mode 100644 index 0000000..8e72979 --- /dev/null +++ b/nodes_memory_viz.py @@ -0,0 +1,888 @@ +NODE_CLASS_MAPPINGS = {} +NODE_DISPLAY_NAME_MAPPINGS = {} + +import logging +import asyncio +import ctypes +import os +import platform +import subprocess +import time +import torch +import server +from aiohttp import web +import psutil +import comfy.model_management +import comfy.memory_management +import comfy.model_base + + +log = logging.getLogger(__name__) + +try: + import comfy_aimdo.control +except ImportError: + comfy_aimdo = None + +# ── AMD / ROCm GPU 监控 ── +# 优先使用 LibreHardwareMonitor(跨厂商硬件监控库), +# 其次尝试 rocm-smi CLI。 +# LHM 需要 pythonnet + LibreHardwareMonitorLib.dll (net8.0) +_lhm_state = {"checked": False, "available": False, "computer": None} +_amd_state = {"checked": False, "available": False, "gpu_name": None, + "rocm_smi_path": None, + "util_cache": None, "temp_cache": None, + "power_cache": None, "cache_time": 0} + +def _init_lhm(): + """初始化 LibreHardwareMonitor (跨厂商硬件监控)""" + if _lhm_state["checked"]: + return _lhm_state["available"] + _lhm_state["checked"] = True + + try: + import pythonnet + pythonnet.load('coreclr') + import clr + + dll_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), + "LibreHardwareMonitorLib.dll") + if not os.path.exists(dll_path): + log.info("aimdo-viz: LibreHardwareMonitorLib.dll 未找到") + return False + + clr.AddReference(dll_path) + from LibreHardwareMonitor.Hardware import Computer + + computer = Computer() + computer.IsGpuEnabled = True + computer.Open() + + _lhm_state["computer"] = computer + _lhm_state["available"] = True + log.info("aimdo-viz: LibreHardwareMonitor 初始化成功") + return True + except Exception as e: + log.debug("aimdo-viz: LHM 初始化失败: %s", e) + _lhm_state["available"] = False + return False + +def _query_lhm(): + """通过 LibreHardwareMonitor 读取 AMD GPU 利用率/温度/功耗""" + computer = _lhm_state.get("computer") + if computer is None: + return None, None, None + + try: + util = None + temp = None + power = None + + for hw in computer.Hardware: + hw.Update() + hw_type = str(hw.HardwareType) + + # 只处理 AMD 独立显卡,跳过集成显卡 + if "GpuAmd" not in hw_type: + continue + + hw_name = str(hw.Name).lower() + # 如果是集成显卡(通常包含 "graphics" 不含具体型号标记),跳过 + # RX 7900 XTX 等独显名称包含 "rx" 或 "radeon rx" + is_dgpu = any(kw in hw_name for kw in ["rx", "7900", "7800", "7700", "7600", + "6900", "6800", "6700", "6600", + "5700", "5600", "5500", "vega", + "radeon vii", "fury"]) + + for sensor in hw.Sensors: + s_type = str(sensor.SensorType) + s_name = str(sensor.Name).lower() + s_val = sensor.Value + if s_val is None: + continue + + if s_type == "Load" and s_name == "gpu core" and is_dgpu: + util = s_val + elif s_type == "Temperature" and s_name == "gpu core" and is_dgpu: + temp = s_val + elif s_type == "Power" and s_name == "gpu package" and is_dgpu: + power = s_val # 瓦特 + + # 如果独显没找到数据,回退到任意 AMD GPU + if util is None and not is_dgpu: + for sensor in hw.Sensors: + s_type = str(sensor.SensorType) + s_name = str(sensor.Name).lower() + s_val = sensor.Value + if s_val is None: + continue + if s_type == "Load" and s_name == "gpu core" and util is None: + util = s_val + elif s_type == "Temperature" and s_name == "gpu core" and temp is None: + temp = s_val + elif s_type == "Power" and s_name == "gpu package" and power is None: + power = s_val + + # power 是瓦特,转换为毫瓦以匹配 NVIDIA API + if power is not None: + power = power * 1000 + + return util, temp, power + except Exception as e: + log.debug("aimdo-viz: LHM 查询失败: %s", e) + return None, None, None + +def _detect_amd_gpu(): + """检测是否为 AMD GPU 并初始化监控后端""" + if _amd_state["checked"]: + return _amd_state["available"] + _amd_state["checked"] = True + + if not torch.cuda.is_available(): + return False + + device = comfy.model_management.get_torch_device() + gpu_name = torch.cuda.get_device_name(device) + + is_amd = any(kw in gpu_name.lower() for kw in + ["amd", "radeon", "instinct", "mi", "rx", "vega", "navi", + "gfx", "radeon rx", "radeon pro", "firepro"]) + if not is_amd: + return False + + log.info("aimdo-viz: 检测到 AMD GPU: %s", gpu_name) + _amd_state["gpu_name"] = gpu_name + + # 方案 1: LibreHardwareMonitor (推荐,支持 RDNA 3) + if _init_lhm(): + _amd_state["available"] = True + log.info("aimdo-viz: 使用 LibreHardwareMonitor 监控 AMD GPU") + return True + + # 方案 2: rocm-smi CLI (Linux / 未来 Windows) + import shutil + candidates = [] + if platform.system() == "Windows": + candidates = [ + r"C:\Program Files\AMD\ROCm\7.1\bin\rocm-smi.exe", + r"C:\Program Files\AMD\ROCm\6.2\bin\rocm-smi.exe", + "rocm-smi.exe", + ] + else: + candidates = ["rocm-smi", "/opt/rocm/bin/rocm-smi"] + + for path in candidates: + if "*" not in path and shutil.which(path): + _amd_state["rocm_smi_path"] = path + log.info("aimdo-viz: 使用 rocm-smi: %s", path) + _amd_state["available"] = True + return True + + log.info("aimdo-viz: AMD GPU 监控不可用,仅显示 VRAM") + _amd_state["available"] = True + return True + +def _query_amd_gpu(): + """查询 AMD GPU 状态,返回 (util, temp_c, power_mw)""" + # LHM 优先 + if _lhm_state.get("available"): + now = time.time() + if now - _amd_state["cache_time"] < 2: + return _amd_state["util_cache"], _amd_state["temp_cache"], _amd_state["power_cache"] + _amd_state["cache_time"] = now + u, t, p = _query_lhm() + _amd_state["util_cache"] = u + _amd_state["temp_cache"] = t + _amd_state["power_cache"] = p + return u, t, p + + # rocm-smi 回退 + if _amd_state.get("rocm_smi_path"): + now = time.time() + if now - _amd_state["cache_time"] < 2: + return _amd_state["util_cache"], _amd_state["temp_cache"], _amd_state["power_cache"] + _amd_state["cache_time"] = now + + path = _amd_state["rocm_smi_path"] + import json as _json + try: + proc = subprocess.run( + [path, "--showuse", "--showtemp", "--showpower", "--json"], + capture_output=True, text=True, timeout=5 + ) + if proc.returncode == 0: + data = _json.loads(proc.stdout) + for card_key in data: + card = data[card_key] + try: + _amd_state["util_cache"] = int(float(card.get("GPU use (%)", "0"))) + except (ValueError, TypeError): + _amd_state["util_cache"] = None + try: + _amd_state["temp_cache"] = float(card.get("Temperature (C)", "0")) + except (ValueError, TypeError): + _amd_state["temp_cache"] = None + try: + _amd_state["power_cache"] = float(card.get("Average Graphics Package Power (W)", 0)) * 1000 + except (ValueError, TypeError): + _amd_state["power_cache"] = None + break + except Exception as e: + log.debug("aimdo-viz: rocm-smi 错误: %s", e) + + return _amd_state["util_cache"], _amd_state["temp_cache"], _amd_state["power_cache"] + +# NVML handle + power-cap cache. Cap and device name are static for a given +# driver state, so we only query them once. Handle init is best-effort; failures stick. +_nvml_state = {"handle": None, "tried": False, "power_limit": None, "gpu_name": None} + +def _resolve_nvml_handle(pynvml, device): + # NVML enumerates physical GPUs and ignores CUDA_VISIBLE_DEVICES, so the torch + # device index can point at the wrong card on multi-GPU systems. Match by UUID. + idx = device.index if device.index is not None else torch.cuda.current_device() + try: + torch_uuid = "GPU-" + str(torch.cuda.get_device_properties(idx).uuid) + for i in range(pynvml.nvmlDeviceGetCount()): + h = pynvml.nvmlDeviceGetHandleByIndex(i) + uuid = pynvml.nvmlDeviceGetUUID(h) + if (uuid.decode() if isinstance(uuid, bytes) else uuid) == torch_uuid: + return h + except Exception as e: + log.debug("aimdo-viz: nvml uuid match failed: %s", e) + return pynvml.nvmlDeviceGetHandleByIndex(idx) + +def _nvml_handle(device): + if _nvml_state["tried"]: + return _nvml_state["handle"] + _nvml_state["tried"] = True + try: + import pynvml + pynvml.nvmlInit() + _nvml_state["handle"] = _resolve_nvml_handle(pynvml, device) + except Exception as e: + log.debug("aimdo-viz: pynvml init failed: %s", e) + return _nvml_state["handle"] + +def _nvml_mem_info(device): + # On Windows WDDM, cudaMemGetInfo reports per-process memory, hiding other + # processes' VRAM. NVML is always device-wide. + h = _nvml_handle(device) + if h is None: + return None + try: + import pynvml + info = pynvml.nvmlDeviceGetMemoryInfo(h) + return info.free, info.total + except Exception as e: + log.debug("aimdo-viz: nvmlDeviceGetMemoryInfo failed: %s", e) + return None + +def _nvml_power_limit(device): + if _nvml_state["power_limit"] is not None: + return _nvml_state["power_limit"] + h = _nvml_handle(device) + if h is None: + return None + try: + import pynvml + _nvml_state["power_limit"] = pynvml.nvmlDeviceGetPowerManagementLimit(h) + return _nvml_state["power_limit"] + except Exception as e: + log.debug("aimdo-viz: nvmlDeviceGetPowerManagementLimit failed: %s", e) + return None + +def _get_lock(): + # Stored on comfy.model_management so the same lock survives hot reloads. + mm = comfy.model_management + if not hasattr(mm, '_viz_model_lock'): + mm._viz_model_lock = asyncio.Lock() + return mm._viz_model_lock + +# cached; CPU model doesn't change at runtime. +_cpu_name_cache = {"tried": False, "name": None} + +def _get_cpu_name(): + if _cpu_name_cache["tried"]: + return _cpu_name_cache["name"] + _cpu_name_cache["tried"] = True + try: + sys_name = platform.system() + if sys_name == "Windows": + import winreg + with winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, r"HARDWARE\DESCRIPTION\System\CentralProcessor\0") as key: + name, _ = winreg.QueryValueEx(key, "ProcessorNameString") + _cpu_name_cache["name"] = name.strip() + elif sys_name == "Darwin": + _cpu_name_cache["name"] = subprocess.check_output( + ["sysctl", "-n", "machdep.cpu.brand_string"], timeout=2 + ).decode().strip() + elif sys_name == "Linux": + with open("/proc/cpuinfo") as f: + for line in f: + if "model name" in line: + _cpu_name_cache["name"] = line.split(":", 1)[1].strip() + break + except Exception as e: + log.debug("aimdo-viz: cpu name lookup failed: %s", e) + return _cpu_name_cache["name"] + +# Fixed drives + volume labels are static for the session — enumerate once and cache. +# Sleepy/external drives could make GetVolumeInformationW block, so do it lazily off +# the polling path (first time a client asks for the list). +_disks_cache = {"tried": False, "list": []} + +def _get_volume_label(mountpoint): + try: + if platform.system() != "Windows": + return None + buf = ctypes.create_unicode_buffer(256) + fs = ctypes.create_unicode_buffer(256) + ok = ctypes.windll.kernel32.GetVolumeInformationW( + ctypes.c_wchar_p(mountpoint), buf, 256, None, None, None, fs, 256) + if ok: + return buf.value or None + except Exception as e: + log.debug("aimdo-viz: GetVolumeInformationW failed for %s: %s", mountpoint, e) + return None + +def _get_disk_partitions(): + if _disks_cache["tried"]: + return _disks_cache["list"] + _disks_cache["tried"] = True + try: + # all=False filters CD-ROM, removable, and network on Windows + parts = [] + for p in psutil.disk_partitions(all=False): + parts.append({"mountpoint": p.mountpoint, "label": _get_volume_label(p.mountpoint)}) + _disks_cache["list"] = parts + except Exception as e: + log.debug("aimdo-viz: disk_partitions failed: %s", e) + return _disks_cache["list"] + + +# Windows reads true pagefile.sys usage via NtQuerySystemInformation +# falls back to psutil on non-Windows or on any failure. +_pagefile_state = {"tried": False, "query": None} + +def _build_win_pagefile_query(): + from ctypes import wintypes + + class UNICODE_STRING(ctypes.Structure): + _fields_ = [("Length", wintypes.USHORT), + ("MaximumLength", wintypes.USHORT), + ("Buffer", wintypes.LPWSTR)] + + class SYSTEM_PAGEFILE_INFORMATION(ctypes.Structure): + _fields_ = [("NextEntryOffset", wintypes.ULONG), + ("TotalSize", wintypes.ULONG), + ("TotalInUse", wintypes.ULONG), + ("PeakUsage", wintypes.ULONG), + ("PageFileName", UNICODE_STRING)] + + class SYSTEM_INFO(ctypes.Structure): + _fields_ = [("wProcessorArchitecture", wintypes.WORD), + ("wReserved", wintypes.WORD), + ("dwPageSize", wintypes.DWORD), + ("lpMinimumApplicationAddress", ctypes.c_void_p), + ("lpMaximumApplicationAddress", ctypes.c_void_p), + ("dwActiveProcessorMask", ctypes.POINTER(wintypes.DWORD)), + ("dwNumberOfProcessors", wintypes.DWORD), + ("dwProcessorType", wintypes.DWORD), + ("dwAllocationGranularity", wintypes.DWORD), + ("wProcessorLevel", wintypes.WORD), + ("wProcessorRevision", wintypes.WORD)] + + SystemPageFileInformation = 18 + ntdll = ctypes.WinDLL("ntdll") + ntdll.NtQuerySystemInformation.restype = wintypes.LONG + si = SYSTEM_INFO() + ctypes.windll.kernel32.GetSystemInfo(ctypes.byref(si)) + page = si.dwPageSize + buf = ctypes.create_string_buffer(8192) + ret = wintypes.ULONG(0) + + def query(): + status = ntdll.NtQuerySystemInformation(SystemPageFileInformation, buf, len(buf), ctypes.byref(ret)) + if status < 0 or ret.value == 0: + return 0, 0 + total = used = 0 + off = 0 + while True: + info = SYSTEM_PAGEFILE_INFORMATION.from_buffer(buf, off) + total += info.TotalSize + used += info.TotalInUse + if info.NextEntryOffset == 0: + break + off += info.NextEntryOffset + return total * page, used * page + + return query + +def _pagefile_usage(): + """(total_bytes, used_bytes) of system pagefiles — true on-disk usage.""" + if platform.system() == "Windows": + st = _pagefile_state + if not st["tried"]: + st["tried"] = True + try: + st["query"] = _build_win_pagefile_query() + except Exception as e: + log.debug("aimdo-viz: pagefile query init failed: %s", e) + if st["query"] is not None: + try: + return st["query"]() + except Exception as e: + log.debug("aimdo-viz: pagefile query failed: %s", e) + try: + sw = psutil.swap_memory() + return sw.total, sw.used + except Exception: + return 0, 0 + + +# Hard page faults — faults that hit disk, i.e. memory paged back in. A rising +# rate is the thrashing signal. Windows reads SYSTEM_PERFORMANCE_INFORMATION; +# Linux reads /proc/vmstat pgmajfault. Returns a monotonic count; the client +# differentiates it into faults/sec. +_hardfault_state = {"tried": False, "query": None} + +def _build_win_hardfault_query(): + from ctypes import wintypes + + class PERF_PREFIX(ctypes.Structure): + _fields_ = [("IdleProcessTime", ctypes.c_longlong), + ("IoReadTransferCount", ctypes.c_longlong), + ("IoWriteTransferCount", ctypes.c_longlong), + ("IoOtherTransferCount", ctypes.c_longlong), + ("IoReadOperationCount", wintypes.ULONG), + ("IoWriteOperationCount", wintypes.ULONG), + ("IoOtherOperationCount", wintypes.ULONG), + ("AvailablePages", wintypes.ULONG), + ("CommittedPages", wintypes.ULONG), + ("CommitLimit", wintypes.ULONG), + ("PeakCommitment", wintypes.ULONG), + ("PageFaultCount", wintypes.ULONG), + ("CopyOnWriteCount", wintypes.ULONG), + ("TransitionCount", wintypes.ULONG), + ("CacheTransitionCount", wintypes.ULONG), + ("DemandZeroCount", wintypes.ULONG), + ("PageReadCount", wintypes.ULONG), + ("PageReadIoCount", wintypes.ULONG)] + + SystemPerformanceInformation = 2 + ntdll = ctypes.WinDLL("ntdll") + ntdll.NtQuerySystemInformation.restype = wintypes.LONG + buf = ctypes.create_string_buffer(8192) + ret = wintypes.ULONG(0) + + def query(): + status = ntdll.NtQuerySystemInformation(SystemPerformanceInformation, buf, len(buf), ctypes.byref(ret)) + if status < 0 or ret.value < ctypes.sizeof(PERF_PREFIX): + return None + return PERF_PREFIX.from_buffer(buf).PageReadIoCount + + return query + +def _hard_fault_count(): + """Monotonic count of hard/major page faults, or None if unavailable.""" + sysname = platform.system() + if sysname == "Windows": + st = _hardfault_state + if not st["tried"]: + st["tried"] = True + try: + st["query"] = _build_win_hardfault_query() + except Exception as e: + log.debug("aimdo-viz: hardfault query init failed: %s", e) + if st["query"] is not None: + try: + return st["query"]() + except Exception as e: + log.debug("aimdo-viz: hardfault query failed: %s", e) + return None + if sysname == "Linux": + try: + with open("/proc/vmstat") as f: + for line in f: + if line.startswith("pgmajfault "): + return int(line.split()[1]) + except Exception as e: + log.debug("aimdo-viz: /proc/vmstat read failed: %s", e) + return None + + +def _vbar_residency(vbar, used_pages): + """Per-page residency flags for the used range only. vbar.get_residency() + builds a Python list over the whole ~10x-overallocated VBAR every poll + (hundreds of us for large models); we run the same native fill but convert + only the used slice. Falls back to the full read on any binding mismatch.""" + try: + lib = comfy_aimdo.control.lib + nr = vbar.get_nr_pages() + buf = (ctypes.c_uint8 * nr)() + lib.vbar_get_residency(vbar._devctx, vbar._ptr, buf, nr) + return buf[:max(0, min(used_pages, nr))] + except Exception as e: + log.debug("aimdo-viz: bounded residency read failed, using full: %s", e) + try: + return vbar.get_residency()[:used_pages] + except Exception: + return [] + + +def _detect_model_type(model_obj): + """Classify a loaded model into a ComfyUI slot type so the UI can color it + consistently with node connection colors. Returns None when nothing matches + so the UI falls back to the default text color rather than mislabeling.""" + try: + if isinstance(model_obj, comfy.model_base.BaseModel): + return "model" + except Exception: + pass + cls = model_obj.__class__ + name = cls.__name__.lower() + module = (cls.__module__ or "").lower() + # order matters: clip_vision before clip, style_model before model substring matches. + if "clipvision" in name or "clip_vision" in name or "clip_vision" in module: + return "clip_vision" + if "controlnet" in name or "t2iadapter" in name or "controlnet" in module: + return "controlnet" + if "stylemodel" in name or "style_model" in name: + return "style_model" + if "gligen" in name: + return "gligen" + if "vae" in name or "autoencod" in name or module.endswith(".vae"): + return "vae" + if "clip" in name or "t5" in name or "textencoder" in name or "text_encoders" in module: + return "clip" + if "esrgan" in name or "upscal" in name or "rrdb" in name or "spandrel" in module: + return "upscale_model" + return None +routes = server.PromptServer.instance.routes + +@routes.get("/aimdo/vram") +async def aimdo_vram_status(request): + device = comfy.model_management.get_torch_device() + if not torch.cuda.is_available() or device.type != "cuda": + return web.json_response({"enabled": False}) + + aimdo_active = getattr(comfy.memory_management, 'aimdo_enabled', False) and comfy_aimdo is not None + + models = [] + loaded_models = list(comfy.model_management.current_loaded_models) + for model_idx, lm in enumerate(loaded_models): + patcher = lm.model + if patcher is None: + continue + + model_obj = patcher.model + if model_obj is None: + continue + + name = model_obj.__class__.__name__ + is_dynamic = patcher.is_dynamic() + total_size = patcher.model_size() + loaded = patcher.loaded_size() + + # RAM side: pinned host memory used for fast transfers, plus + # non-pinned loaded host memory when the patcher exposes it. + pinned_ram = 0 + try: + if hasattr(patcher, 'pinned_memory_size'): + pinned_ram = patcher.pinned_memory_size() + except Exception as e: + log.debug("aimdo-viz: pinned_memory_size failed: %s", e) + loaded_ram = 0 + try: + if hasattr(patcher, 'loaded_ram_size'): + loaded_ram = max(0, patcher.loaded_ram_size() - pinned_ram) + except Exception as e: + log.debug("aimdo-viz: loaded_ram_size failed: %s", e) + + # VBAR state per device (aimdo only) + vbars = [] + vbar_loaded_total = 0 + + if aimdo_active and is_dynamic and hasattr(model_obj, "dynamic_vbars"): + for dev, vbar in model_obj.dynamic_vbars.items(): + try: + loaded_bytes = vbar.loaded_size() + vbar_loaded_total += loaded_bytes + page_size = getattr(vbar, 'page_size', 32 * 1024 * 1024) + vbar_offset = getattr(vbar, 'offset', 0) + if vbar_offset > 0: + used_pages = (vbar_offset + page_size - 1) // page_size + else: + used_pages = (total_size + page_size - 1) // page_size + vbars.append({ + "device": str(dev), + "loaded": loaded_bytes, + "watermark": vbar.get_watermark(), + "residency": _vbar_residency(vbar, used_pages), + }) + except Exception as e: + log.warning("aimdo-viz: VBAR query failed: %s", e) + + entry = { + "index": model_idx, + "name": name, + "type": _detect_model_type(model_obj), + "total_size": total_size, + "loaded_size": loaded, + "vbar_loaded": vbar_loaded_total, + "ram_size": max(0, total_size - vbar_loaded_total), + "pinned_ram": pinned_ram, + "loaded_ram": loaded_ram, + "dynamic": is_dynamic, + "vbars": vbars, + } + + models.append(entry) + + has_dynamic = any(m.get("dynamic") for m in models) + aimdo_usage = comfy_aimdo.control.get_total_vram_usage() if aimdo_active and has_dynamic else 0 + + # prefer NVML (device-wide on every driver model) and fall back to cudaMemGetInfo + # — the latter under-reports on Windows WDDM by hiding other processes' VRAM. + _mem = _nvml_mem_info(device) + if _mem is not None: + free_cuda, total_vram = _mem + else: + free_cuda, total_vram = torch.cuda.mem_get_info(device) + + try: + gpu_util = torch.cuda.utilization(device) + except Exception: + gpu_util = None + + try: + gpu_temp = torch.cuda.temperature(device) + except Exception: + gpu_temp = None + + try: + gpu_power = torch.cuda.power_draw(device) # mW + except Exception: + gpu_power = None + gpu_power_limit = _nvml_power_limit(device) # mW + + # ── AMD/ROCm 回退方案 ── + # 当 NVIDIA 专有 API 返回 None 时(AMD 显卡),尝试 rocm-smi + if _detect_amd_gpu() and (gpu_util is None or gpu_temp is None): + amd_util, amd_temp, amd_power = _query_amd_gpu() + if gpu_util is None and amd_util is not None: + gpu_util = amd_util + if gpu_temp is None and amd_temp is not None: + gpu_temp = amd_temp + if gpu_power is None and amd_power is not None: + gpu_power = amd_power + + gpu_name = _nvml_state["gpu_name"] + if gpu_name is None: + h = _nvml_handle(device) + if h is not None: + try: + import pynvml + name = pynvml.nvmlDeviceGetName(h) + gpu_name = _nvml_state["gpu_name"] = name.decode() if isinstance(name, bytes) else name + except Exception as e: + log.debug("aimdo-viz: nvmlDeviceGetName failed: %s", e) + if gpu_name is None: + try: + gpu_name = _nvml_state["gpu_name"] = torch.cuda.get_device_name(device) + except Exception: + pass + # AMD 回退:torch.cuda.get_device_name 在 ROCm 下可用 + if gpu_name is None and _amd_state.get("gpu_name"): + gpu_name = _amd_state["gpu_name"] + + # non-blocking; first call after process start returns 0, subsequent calls are real + try: + cpu_util = psutil.cpu_percent(interval=None) + except Exception: + cpu_util = None + + # pytorch internal stats + stats = torch.cuda.memory_stats(device) + torch_active = stats.get('active_bytes.all.current', 0) + torch_reserved = stats.get('reserved_bytes.all.current', 0) + + ram = psutil.virtual_memory() + proc = psutil.Process() + + process_ram = proc.memory_info().rss + swap_total = swap_used = 0 + if request.query.get("pagefile") == "1": + swap_total, swap_used = _pagefile_usage() + + hard_faults = None + if request.query.get("faults") == "1": + hard_faults = _hard_fault_count() + + disk_read = disk_write = None + if request.query.get("disk") == "1": + try: + d = psutil.disk_io_counters() + if d is not None: + disk_read, disk_write = d.read_bytes, d.write_bytes + except Exception: + pass + + # client opts in by sending list_disks=1; backend skips entirely when absent. + disks_list = None + if request.query.get("list_disks") == "1": + disks_list = [] + for p in _get_disk_partitions(): + entry = {"mountpoint": p["mountpoint"], "label": p["label"], "total": None, "free": None} + try: + du = psutil.disk_usage(p["mountpoint"]) + entry["total"] = du.total + entry["free"] = du.free + except Exception as e: + log.debug("aimdo-viz: disk_usage(%s) failed: %s", p["mountpoint"], e) + disks_list.append(entry) + + total_pinned = sum(m.get("pinned_ram", 0) for m in models) + total_loaded_ram = sum(m.get("loaded_ram", 0) for m in models) + + return web.json_response({ + "enabled": True, + "aimdo_active": aimdo_active, + "total_vram": total_vram, + "free_vram": free_cuda, + "gpu_util": gpu_util, + "gpu_temp": gpu_temp, + "gpu_power": gpu_power, + "gpu_power_limit": gpu_power_limit, + "gpu_name": gpu_name, + "cpu_util": cpu_util, + "cpu_name": _get_cpu_name(), + "aimdo_usage": aimdo_usage, + "torch_active": torch_active, + "torch_reserved": torch_reserved, + "total_ram": ram.total, + "used_ram": ram.used, + "total_swap": swap_total, + "used_swap": swap_used, + "hard_faults": hard_faults, + "disk_read": disk_read, + "disk_write": disk_write, + "disks": disks_list, + "process_ram": process_ram, + "pinned_ram": total_pinned, + "loaded_ram": total_loaded_ram, + "models": models, + }) + +@routes.post("/aimdo/unload_all") +async def aimdo_unload_all(request): + if _is_executing(): + return web.json_response({"error": "cannot unload during execution"}, status=409) + async with _get_lock(): + await asyncio.get_running_loop().run_in_executor(None, comfy.model_management.unload_all_models) + return web.json_response({"status": "ok"}) + + +def _is_executing(): + return bool(server.PromptServer.instance.prompt_queue.currently_running) + +def _get_model_idx(data): + idx = data.get("index") + if not isinstance(idx, int) or isinstance(idx, bool): + return None, web.json_response({"error": "missing or invalid index"}, status=400) + models = comfy.model_management.current_loaded_models + if idx < 0 or idx >= len(models): + return None, web.json_response({"error": "index out of range"}, status=400) + return idx, None + +@routes.post("/aimdo/reset_watermark") +async def aimdo_reset_watermark(request): + idx, err = _get_model_idx(await request.json()) + if err: + return err + async with _get_lock(): + torch.cuda.empty_cache() + models = comfy.model_management.current_loaded_models + if idx >= len(models): + return web.json_response({"error": "model no longer at index"}, status=409) + patcher = models[idx].model + if patcher is not None and hasattr(patcher, '_vbar_get'): + vbar = patcher._vbar_get() + if vbar is not None: + vbar.prioritize() + return web.json_response({"status": "ok"}) + +@routes.post("/aimdo/unload_model") +async def aimdo_unload_model(request): + if _is_executing(): + return web.json_response({"error": "cannot unload during execution"}, status=409) + idx, err = _get_model_idx(await request.json()) + if err: + return err + async with _get_lock(): + models = comfy.model_management.current_loaded_models + if idx >= len(models): + return web.json_response({"error": "model no longer at index"}, status=409) + models[idx].model_unload() + models.pop(idx) + comfy.model_management.soft_empty_cache() + return web.json_response({"status": "ok"}) + + +# ============================================================ +# XB_MemoryVisualization — 显存内存观察节点 +# ============================================================ +class XB_MemoryVisualization: + """显存内存实时监控面板节点 + + 【重要说明】 + 监控面板会在 ComfyUI 启动时自动加载到界面右下角,无需将此节点添加到工作流。 + 面板提供可拖拽的硬件监控窗口,功能包括: + - VRAM/内存使用率分段条形图 + - GPU利用率/温度/功耗实时显示 + - 磁盘I/O读写速率 + - 页面文件使用情况 + - CPU使用率 + - 已加载模型列表及显存占用详情 + - 历史VRAM使用量趋势图(面积图/柱状图/K线图/点阵图) + - 模型卸载、缓存清理快捷按钮 + + 此节点的作用: + - 作为工作流中的"锚点",方便快速定位监控面板 + - 可通过右键菜单 → "字号"调节面板字体大小 + - 可通过右键菜单 → "缩放"调节面板整体缩放 + - 执行此节点不会影响工作流,仅作为标记使用 + """ + + @classmethod + def INPUT_TYPES(s): + return { + "required": {}, + "optional": { + "any_input": ("*", { + "tooltip": "可选任意输入——面板启动时自动显示,此输入仅用于触发节点执行" + }), + } + } + + RETURN_TYPES = () + FUNCTION = "show_panel" + CATEGORY = "XB_ToolBox/Dashboard" + OUTPUT_NODE = True + DESCRIPTION = "实时显存内存监控面板——启动时自动显示在界面右下角,可拖拽/缩放/调节字号。右键面板查看更多选项。" + + def show_panel(self, any_input=None, **kwargs): + import torch + if torch.cuda.is_available(): + free, total = torch.cuda.mem_get_info() + free_gb = free / (1024**3) + total_gb = total / (1024**3) + used_gb = total_gb - free_gb + print(f"[XB 硬件监控] GPU显存: {used_gb:.1f}GB / {total_gb:.1f}GB (空闲 {free_gb:.1f}GB)") + else: + print("[XB 硬件监控] 未检测到CUDA GPU,面板仅显示CPU/内存信息") + return () + + +NODE_CLASS_MAPPINGS["XB_MemoryVisualization"] = XB_MemoryVisualization +NODE_DISPLAY_NAME_MAPPINGS["XB_MemoryVisualization"] = "XB 📊 硬件监控面板 (Memory Visualization)" diff --git a/requirements.txt b/requirements.txt index 94e2d81..cdcd2fb 100644 --- a/requirements.txt +++ b/requirements.txt @@ -16,6 +16,12 @@ easyocr # OCR 文字识别 (漫画工具) onnxruntime>=1.18.0 # ONNX 推理 (人像分割 + CosyVoice3) imageio-ffmpeg # FFmpeg 回退 (视频服务器) +# ── 硬件监控面板依赖 (Memory Visualization) ── +psutil # CPU/内存/磁盘系统信息 +pythonnet # .NET 桥接 (LibreHardwareMonitor GPU 监控) +# LibreHardwareMonitorLib.dll 已内置在工具箱目录中,无需额外下载 +# NVIDIA GPU: 可选安装 nvidia-ml-py 以获得更精准的显存数据 + # ── Llama 节点依赖 (LLM/VLM 本地推理) ── diskcache # 磁盘缓存 gguf # GGUF 模型格式解析