feat: wire entry point, manifest, property inspectors, and assets
No files matched your search
@@ -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 |
|
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 |
|
After Width: | Height: | Size: 26 KiB |
@@ -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"
|
||||||
|
|||||||
@@ -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://talos.milky.way: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://talos.milky.way: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>
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
/**!
|
||||||
|
* @license
|
||||||
|
* sdpi-components v4.0.1, Copyright Corsair Memory Inc. and other contributors (https://sdpi-components.dev)
|
||||||
|
* Lit, Copyright 2019 Google LLC, SPDX-License-Identifier: BSD-3-Clause (https://lit.dev/)
|
||||||
|
*/
|
||||||
|
!function(){"use strict";function t(t,e,i,s){var n,r=arguments.length,o=r<3?e:null===s?s=Object.getOwnPropertyDescriptor(e,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(t,e,i,s);else for(var a=t.length-1;a>=0;a--)(n=t[a])&&(o=(r<3?n(o):r>3?n(e,i,o):n(e,i))||o);return r>3&&o&&Object.defineProperty(e,i,o),o}function e(t,e){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(t,e)}const i=window,s=i.ShadowRoot&&(void 0===i.ShadyCSS||i.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,n=Symbol(),r=new WeakMap;let o=class{constructor(t,e,i){if(this._$cssResult$=!0,i!==n)throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");this.cssText=t,this.t=e}get styleSheet(){let t=this.o;const e=this.t;if(s&&void 0===t){const i=void 0!==e&&1===e.length;i&&(t=r.get(e)),void 0===t&&((this.o=t=new CSSStyleSheet).replaceSync(this.cssText),i&&r.set(e,t))}return t}toString(){return this.cssText}};const a=(t,...e)=>{const i=1===t.length?t[0]:e.reduce(((e,i,s)=>e+(t=>{if(!0===t._$cssResult$)return t.cssText;if("number"==typeof t)return t;throw Error("Value passed to 'css' function must be a 'css' function result: "+t+". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.")})(i)+t[s+1]),t[0]);return new o(i,t,n)},l=s?t=>t:t=>t instanceof CSSStyleSheet?(t=>{let e="";for(const i of t.cssRules)e+=i.cssText;return(t=>new o("string"==typeof t?t:t+"",void 0,n))(e)})(t):t;var d;const c=window,h=c.trustedTypes,u=h?h.emptyScript:"",p=c.reactiveElementPolyfillSupport,v={toAttribute(t,e){switch(e){case Boolean:t=t?u:null;break;case Object:case Array:t=null==t?t:JSON.stringify(t)}return t},fromAttribute(t,e){let i=t;switch(e){case Boolean:i=null!==t;break;case Number:i=null===t?null:Number(t);break;case Object:case Array:try{i=JSON.parse(t)}catch(t){i=null}}return i}},g=(t,e)=>e!==t&&(e==e||t==t),b={attribute:!0,type:String,converter:v,reflect:!1,hasChanged:g};let y=class extends HTMLElement{constructor(){super(),this._$Ei=new Map,this.isUpdatePending=!1,this.hasUpdated=!1,this._$El=null,this.u()}static addInitializer(t){var e;null!==(e=this.h)&&void 0!==e||(this.h=[]),this.h.push(t)}static get observedAttributes(){this.finalize();const t=[];return this.elementProperties.forEach(((e,i)=>{const s=this._$Ep(i,e);void 0!==s&&(this._$Ev.set(s,i),t.push(s))})),t}static createProperty(t,e=b){if(e.state&&(e.attribute=!1),this.finalize(),this.elementProperties.set(t,e),!e.noAccessor&&!this.prototype.hasOwnProperty(t)){const i="symbol"==typeof t?Symbol():"__"+t,s=this.getPropertyDescriptor(t,i,e);void 0!==s&&Object.defineProperty(this.prototype,t,s)}}static getPropertyDescriptor(t,e,i){return{get(){return this[e]},set(s){const n=this[t];this[e]=s,this.requestUpdate(t,n,i)},configurable:!0,enumerable:!0}}static getPropertyOptions(t){return this.elementProperties.get(t)||b}static finalize(){if(this.hasOwnProperty("finalized"))return!1;this.finalized=!0;const t=Object.getPrototypeOf(this);if(t.finalize(),this.elementProperties=new Map(t.elementProperties),this._$Ev=new Map,this.hasOwnProperty("properties")){const t=this.properties,e=[...Object.getOwnPropertyNames(t),...Object.getOwnPropertySymbols(t)];for(const i of e)this.createProperty(i,t[i])}return this.elementStyles=this.finalizeStyles(this.styles),!0}static finalizeStyles(t){const e=[];if(Array.isArray(t)){const i=new Set(t.flat(1/0).reverse());for(const t of i)e.unshift(l(t))}else void 0!==t&&e.push(l(t));return e}static _$Ep(t,e){const i=e.attribute;return!1===i?void 0:"string"==typeof i?i:"string"==typeof t?t.toLowerCase():void 0}u(){var t;this._$E_=new Promise((t=>this.enableUpdating=t)),this._$AL=new Map,this._$Eg(),this.requestUpdate(),null===(t=this.constructor.h)||void 0===t||t.forEach((t=>t(this)))}addController(t){var e,i;(null!==(e=this._$ES)&&void 0!==e?e:this._$ES=[]).push(t),void 0!==this.renderRoot&&this.isConnected&&(null===(i=t.hostConnected)||void 0===i||i.call(t))}removeController(t){var e;null===(e=this._$ES)||void 0===e||e.splice(this._$ES.indexOf(t)>>>0,1)}_$Eg(){this.constructor.elementProperties.forEach(((t,e)=>{this.hasOwnProperty(e)&&(this._$Ei.set(e,this[e]),delete this[e])}))}createRenderRoot(){var t;const e=null!==(t=this.shadowRoot)&&void 0!==t?t:this.attachShadow(this.constructor.shadowRootOptions);return((t,e)=>{s?t.adoptedStyleSheets=e.map((t=>t instanceof CSSStyleSheet?t:t.styleSheet)):e.forEach((e=>{const s=document.createElement("style"),n=i.litNonce;void 0!==n&&s.setAttribute("nonce",n),s.textContent=e.cssText,t.appendChild(s)}))})(e,this.constructor.elementStyles),e}connectedCallback(){var t;void 0===this.renderRoot&&(this.renderRoot=this.createRenderRoot()),this.enableUpdating(!0),null===(t=this._$ES)||void 0===t||t.forEach((t=>{var e;return null===(e=t.hostConnected)||void 0===e?void 0:e.call(t)}))}enableUpdating(t){}disconnectedCallback(){var t;null===(t=this._$ES)||void 0Line truncated
|
||||||
@@ -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();
|
||||||