v8: agent logos on idle, transparent backgrounds, fix PI settings persistence
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
const { Plugins, Actions, log } = require('./utils/plugin');
|
const { Plugins, Actions, log } = require('./utils/plugin');
|
||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
const path = require('path');
|
const path = require('path');
|
||||||
const os = require('os');
|
const os = require('os');
|
||||||
@@ -8,7 +8,21 @@ const timers = {};
|
|||||||
const sessionOffsets = {};
|
const sessionOffsets = {};
|
||||||
const DEBUG_LOG = path.join(__dirname, '..', 'debug.log');
|
const DEBUG_LOG = path.join(__dirname, '..', 'debug.log');
|
||||||
function dlog(msg) { try { fs.appendFileSync(DEBUG_LOG, '[' + new Date().toISOString() + '] ' + msg + '\n'); } catch (_) {} }
|
function dlog(msg) { try { fs.appendFileSync(DEBUG_LOG, '[' + new Date().toISOString() + '] ' + msg + '\n'); } catch (_) {} }
|
||||||
dlog('=== AI Monitor v7 multi-agent ===');
|
dlog('=== AI Monitor v8 multi-agent ===');
|
||||||
|
|
||||||
|
// --- Load agent logos as data URIs ---
|
||||||
|
function loadSvg(filename) {
|
||||||
|
try {
|
||||||
|
var file = path.join(__dirname, '..', 'static', 'img', filename);
|
||||||
|
var raw = fs.readFileSync(file, 'utf-8');
|
||||||
|
return 'data:image/svg+xml;charset=utf-8,' + encodeURIComponent(raw);
|
||||||
|
} catch (_) { return ''; }
|
||||||
|
}
|
||||||
|
var AGENT_LOGOS = {
|
||||||
|
codex: loadSvg('codex-icon.svg'),
|
||||||
|
claude: loadSvg('claude-icon.svg'),
|
||||||
|
opencode: loadSvg('opencode-icon.svg')
|
||||||
|
};
|
||||||
|
|
||||||
const HOME = os.homedir();
|
const HOME = os.homedir();
|
||||||
const DEFAULT_POLL = 1000;
|
const DEFAULT_POLL = 1000;
|
||||||
@@ -107,7 +121,7 @@ function makeSvg(fill, label, blink, breathe) {
|
|||||||
var anim = '';
|
var anim = '';
|
||||||
if (blink) anim = '<animate attributeName="opacity" values="1;0.2;1" dur="0.8s" repeatCount="indefinite"/>';
|
if (blink) anim = '<animate attributeName="opacity" values="1;0.2;1" dur="0.8s" repeatCount="indefinite"/>';
|
||||||
else if (breathe) anim = '<animate attributeName="opacity" values="1;0.4;1" dur="2s" repeatCount="indefinite"/>';
|
else if (breathe) anim = '<animate attributeName="opacity" values="1;0.4;1" dur="2s" repeatCount="indefinite"/>';
|
||||||
return '<svg width="144" height="144" xmlns="http://www.w3.org/2000/svg"><rect width="144" height="144" rx="20" fill="#1a1a2e"/><circle cx="72" cy="58" r="32" fill="' + fill + '">' + anim + '</circle><text x="72" y="118" font-family="Arial" font-weight="bold" font-size="13" fill="white" text-anchor="middle">' + label + '</text></svg>';
|
return '<svg width="144" height="144" xmlns="http://www.w3.org/2000/svg"><rect width="144" height="144" rx="20" fill="none"/><circle cx="72" cy="58" r="32" fill="' + fill + '">' + anim + '</circle><text x="72" y="118" font-family="Arial" font-weight="bold" font-size="13" fill="white" text-anchor="middle">' + label + '</text></svg>';
|
||||||
}
|
}
|
||||||
|
|
||||||
function setDisplay(context, state) {
|
function setDisplay(context, state) {
|
||||||
@@ -124,7 +138,7 @@ function animateTick() {
|
|||||||
var alpha = d.blink ? (phase < 0.5 ? 1 : 0.2) : 0.4 + 0.6 * Math.sin(phase * Math.PI);
|
var alpha = d.blink ? (phase < 0.5 ? 1 : 0.2) : 0.4 + 0.6 * Math.sin(phase * Math.PI);
|
||||||
var _r = parseInt(d.fill.slice(1,3),16), _g = parseInt(d.fill.slice(3,5),16), _b = parseInt(d.fill.slice(5,7),16);
|
var _r = parseInt(d.fill.slice(1,3),16), _g = parseInt(d.fill.slice(3,5),16), _b = parseInt(d.fill.slice(5,7),16);
|
||||||
var color = 'rgb(' + Math.round(16+(_r-16)*alpha) + ',' + Math.round(16+(_g-16)*alpha) + ',' + Math.round(16+(_b-16)*alpha) + ')';
|
var color = 'rgb(' + Math.round(16+(_r-16)*alpha) + ',' + Math.round(16+(_g-16)*alpha) + ',' + Math.round(16+(_b-16)*alpha) + ')';
|
||||||
var svg = '<svg width="144" height="144" xmlns="http://www.w3.org/2000/svg"><rect width="144" height="144" rx="20" fill="#1a1a2e"/><circle cx="72" cy="58" r="32" fill="' + color + '"/><text x="72" y="118" font-family="Arial" font-weight="bold" font-size="13" fill="white" text-anchor="middle">' + d.title + '</text></svg>';
|
var svg = '<svg width="144" height="144" xmlns="http://www.w3.org/2000/svg"><rect width="144" height="144" rx="20" fill="none"/><circle cx="72" cy="58" r="32" fill="' + color + '"/><text x="72" y="118" font-family="Arial" font-weight="bold" font-size="13" fill="white" text-anchor="middle">' + d.title + '</text></svg>';
|
||||||
plugin.setImage(currentCtx, 'data:image/svg+xml;charset=utf-8,' + svg);
|
plugin.setImage(currentCtx, 'data:image/svg+xml;charset=utf-8,' + svg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,16 +8,13 @@
|
|||||||
const statusDot = document.getElementById('statusDot');
|
const statusDot = document.getElementById('statusDot');
|
||||||
const statusText = document.getElementById('statusText');
|
const statusText = document.getElementById('statusText');
|
||||||
|
|
||||||
// $settings is the SDK-provided settings proxy (auto-persists)
|
|
||||||
$settings = $settings || {};
|
|
||||||
|
|
||||||
function applySettings(settings) {
|
function applySettings(settings) {
|
||||||
if (settings.agent) { agentSelect.value = settings.agent; }
|
if (settings && settings.agent) { agentSelect.value = settings.agent; }
|
||||||
if (settings.pollInterval !== undefined) {
|
if (settings && settings.pollInterval !== undefined) {
|
||||||
pollSlider.value = settings.pollInterval;
|
pollSlider.value = settings.pollInterval;
|
||||||
pollVal.textContent = settings.pollInterval + 'ms';
|
pollVal.textContent = settings.pollInterval + 'ms';
|
||||||
}
|
}
|
||||||
if (settings.showHealth !== undefined) {
|
if (settings && settings.showHealth !== undefined) {
|
||||||
showHealthToggle.checked = settings.showHealth;
|
showHealthToggle.checked = settings.showHealth;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,4 @@
|
|||||||
|
<svg width="144" height="144" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<circle cx="72" cy="72" r="40" fill="none" stroke="#d97706" stroke-width="4"/>
|
||||||
|
<text x="72" y="82" text-anchor="middle" fill="#d97706" font-family="serif" font-size="48" font-weight="bold">C</text>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 275 B |
@@ -1 +1,4 @@
|
|||||||
<svg width="144" height="144" xmlns="http://www.w3.org/2000/svg"><rect width="144" height="144" rx="20" fill="#1a1a2e"/><polygon points="72,24 112,60 112,108 72,144 32,108 32,60" fill="none" stroke="#f59e0b" stroke-width="3"/><text x="72" y="84" text-anchor="middle" fill="#f59e0b" font-family="Arial,sans-serif" font-size="28" font-weight="bold">CX</text></svg>
|
<svg width="144" height="144" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<polygon points="72,30 108,60 108,105 72,135 36,105 36,60" fill="none" stroke="#f59e0b" stroke-width="4"/>
|
||||||
|
<text x="72" y="88" text-anchor="middle" fill="#f59e0b" font-family="Arial,sans-serif" font-size="30" font-weight="bold">CX</text>
|
||||||
|
</svg>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 363 B After Width: | Height: | Size: 315 B |
@@ -0,0 +1,5 @@
|
|||||||
|
<svg width="144" height="144" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<rect x="32" y="32" width="80" height="80" rx="12" fill="none" stroke="#06b6d4" stroke-width="4"/>
|
||||||
|
<line x1="52" y1="52" x2="52" y2="92" stroke="#06b6d4" stroke-width="3" stroke-linecap="round"/>
|
||||||
|
<line x1="52" y1="52" x2="92" y2="52" stroke="#06b6d4" stroke-width="3" stroke-linecap="round"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 372 B |
Reference in New Issue
Block a user