feat: wire entry point, manifest, property inspectors, and assets

This commit is contained in:
2026-08-14 10:52:13 -06:00
parent c0e1ab8303
commit 17c8ef885f
13 changed files with 106 additions and 2 deletions
@@ -0,0 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
<rect x="4" y="4" width="12" height="12" rx="2" fill="none" stroke="#ffffff" stroke-width="2"/>
<rect x="8" y="8" width="4" height="4" fill="#ffffff"/>
<path d="M9 1v3M13 1v3M9 16v3M13 16v3M1 9h3M1 13h3M16 9h3M16 13h3" stroke="#ffffff" stroke-width="2" stroke-linecap="round"/>
</svg>

After

Width:  |  Height:  |  Size: 375 B

@@ -0,0 +1,6 @@
<svg xmlns="http://www.w3.org/2000/svg" width="72" height="72" viewBox="0 0 72 72">
<rect width="72" height="72" fill="#222222"/>
<rect x="14" y="14" width="44" height="44" rx="6" fill="none" stroke="#ffffff" stroke-width="4"/>
<rect x="30" y="30" width="12" height="12" fill="#ffffff"/>
<path d="M32 2v8M40 2v8M32 62v8M40 62v8M2 32h8M2 40h8M62 32h8M62 40h8" stroke="#ffffff" stroke-width="4" stroke-linecap="round"/>
</svg>

After

Width:  |  Height:  |  Size: 433 B

@@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
<polyline points="1,10 5,10 7,4 10,16 12,10 19,10" fill="none" stroke="#ffffff" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 239 B

@@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" width="72" height="72" viewBox="0 0 72 72">
<rect width="72" height="72" fill="#222222"/>
<polyline points="10,50 22,50 28,30 36,60 42,50 62,50" fill="none" stroke="#ffffff" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 291 B

@@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="56" height="56" viewBox="0 0 56 56">
<polyline points="8,42 20,32 28,38 42,16 48,10" fill="none" stroke="#ffffff" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 236 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

@@ -0,0 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="256" viewBox="0 0 256 256">
<rect width="256" height="256" rx="48" fill="#0e1117"/>
<polyline points="40,190 90,150 130,170 190,80 216,60" fill="none" stroke="#3fae5a" stroke-width="14" stroke-linecap="round" stroke-linejoin="round"/>
<circle cx="216" cy="60" r="16" fill="#e0453a"/>
</svg>

After

Width:  |  Height:  |  Size: 357 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

+22 -2
View File
@@ -3,13 +3,33 @@
"Name": "llama-watch", "Name": "llama-watch",
"Version": "1.0.0.0", "Version": "1.0.0.0",
"Author": "Bryce Zuccaro", "Author": "Bryce Zuccaro",
"Actions": [], "Actions": [
{
"Name": "In-Flight Monitor",
"UUID": "com.bryce.llamawatch.inflight",
"Icon": "imgs/actions/inflight/icon",
"Tooltip": "Shows whether a model has a request in flight",
"PropertyInspectorPath": "ui/inflight.html",
"Controllers": ["Keypad"],
"States": [{ "Image": "imgs/actions/inflight/key", "ShowTitle": false }]
},
{
"Name": "GPU Graph",
"UUID": "com.bryce.llamawatch.gpu",
"Icon": "imgs/actions/gpu/icon",
"Tooltip": "Live GPU metric graph",
"PropertyInspectorPath": "ui/gpu.html",
"Controllers": ["Keypad"],
"States": [{ "Image": "imgs/actions/gpu/key", "ShowTitle": false }]
}
],
"Category": "llama-watch", "Category": "llama-watch",
"CategoryIcon": "imgs/plugin/category-icon",
"CodePath": "bin/plugin.js", "CodePath": "bin/plugin.js",
"Description": "Monitor llama-swap: in-flight requests per model and live GPU metric graphs.", "Description": "Monitor llama-swap: in-flight requests per model and live GPU metric graphs.",
"Icon": "imgs/plugin/icon", "Icon": "imgs/plugin/icon",
"SDKVersion": 2, "SDKVersion": 2,
"Software": { "MinimumVersion": "6.5" }, "Software": { "MinimumVersion": "7.1" },
"OS": [{ "Platform": "mac", "MinimumVersion": "13" }], "OS": [{ "Platform": "mac", "MinimumVersion": "13" }],
"Nodejs": { "Version": "24" }, "Nodejs": { "Version": "24" },
"UUID": "com.bryce.llamawatch" "UUID": "com.bryce.llamawatch"
+27
View File
@@ -0,0 +1,27 @@
<!doctype html>
<html>
<head lang="en">
<meta charset="utf-8" />
<script src="sdpi-components.js"></script>
</head>
<body>
<sdpi-item label="Base URL">
<sdpi-textfield setting="baseUrl" value="http://localhost:9292" placeholder="http://host:port" />
</sdpi-item>
<sdpi-item label="API Key">
<sdpi-password setting="apiKey" placeholder="Optional" />
</sdpi-item>
<sdpi-item label="GPU">
<sdpi-select setting="gpuId" datasource="gpus" loading="Loading GPUs…" hot-reload default="all" placeholder="Select a GPU" />
</sdpi-item>
<sdpi-item label="Metric">
<sdpi-select setting="metric" default="util_percent" placeholder="Select a metric">
<option value="util_percent">Utilization %</option>
<option value="memory_util_percent">VRAM %</option>
<option value="temperature">Temperature</option>
<option value="power">Power draw</option>
<option value="fan">Fan speed</option>
</sdpi-select>
</sdpi-item>
</body>
</html>
@@ -0,0 +1,18 @@
<!doctype html>
<html>
<head lang="en">
<meta charset="utf-8" />
<script src="sdpi-components.js"></script>
</head>
<body>
<sdpi-item label="Base URL">
<sdpi-textfield setting="baseUrl" value="http://localhost:9292" placeholder="http://host:port" />
</sdpi-item>
<sdpi-item label="API Key">
<sdpi-password setting="apiKey" placeholder="Optional" />
</sdpi-item>
<sdpi-item label="Model">
<sdpi-select setting="modelId" datasource="models" loading="Loading models…" hot-reload placeholder="Select a model" />
</sdpi-item>
</body>
</html>
File diff suppressed because one or more lines are too long
+7
View File
@@ -1,3 +1,10 @@
import streamDeck from "@elgato/streamdeck"; import streamDeck from "@elgato/streamdeck";
import { GpuGraph } from "./actions/gpu-graph";
import { InflightMonitor } from "./actions/inflight-monitor";
import { registerDataSources } from "./lib/datasources";
streamDeck.actions.registerAction(new InflightMonitor());
streamDeck.actions.registerAction(new GpuGraph());
registerDataSources();
streamDeck.connect(); streamDeck.connect();