Merge pull request #59 from wagesj45/codex/update-maintenance-tab-in-options-page

Improve maintenance timing display
This commit is contained in:
Jordan Wages 2025-06-29 21:23:21 -05:00 committed by GitHub
commit 5ab4459af0
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 42 additions and 18 deletions

View file

@ -19,7 +19,7 @@ let queue = Promise.resolve();
let queuedCount = 0; let queuedCount = 0;
let processing = false; let processing = false;
let iconTimer = null; let iconTimer = null;
let timingStats = { count: 0, mean: 0, m2: 0, total: 0 }; let timingStats = { count: 0, mean: 0, m2: 0, total: 0, last: -1 };
let currentStart = 0; let currentStart = 0;
function setIcon(path) { function setIcon(path) {
@ -149,6 +149,7 @@ async function applyAiRules(idsInput) {
const t = timingStats; const t = timingStats;
t.count += 1; t.count += 1;
t.total += elapsed; t.total += elapsed;
t.last = elapsed;
const delta = elapsed - t.mean; const delta = elapsed - t.mean;
t.mean += delta / t.count; t.mean += delta / t.count;
t.m2 += delta * (elapsed - t.mean); t.m2 += delta * (elapsed - t.mean);
@ -161,6 +162,7 @@ async function applyAiRules(idsInput) {
const t = timingStats; const t = timingStats;
t.count += 1; t.count += 1;
t.total += elapsed; t.total += elapsed;
t.last = elapsed;
const delta = elapsed - t.mean; const delta = elapsed - t.mean;
t.mean += delta / t.count; t.mean += delta / t.count;
t.m2 += delta * (elapsed - t.mean); t.m2 += delta * (elapsed - t.mean);
@ -224,6 +226,9 @@ async function clearCacheForMessages(idsInput) {
if (savedStats.classifyStats && typeof savedStats.classifyStats === 'object') { if (savedStats.classifyStats && typeof savedStats.classifyStats === 'object') {
Object.assign(timingStats, savedStats.classifyStats); Object.assign(timingStats, savedStats.classifyStats);
} }
if (typeof timingStats.last !== 'number') {
timingStats.last = -1;
}
aiRules = Array.isArray(store.aiRules) ? store.aiRules.map(r => { aiRules = Array.isArray(store.aiRules) ? store.aiRules.map(r => {
if (r.actions) return r; if (r.actions) return r;
const actions = []; const actions = [];
@ -421,6 +426,8 @@ async function clearCacheForMessages(idsInput) {
return { return {
count: queuedCount + (processing ? 1 : 0), count: queuedCount + (processing ? 1 : 0),
current: currentStart ? Date.now() - currentStart : -1, current: currentStart ? Date.now() - currentStart : -1,
last: t.last,
runs: t.count,
average: t.mean, average: t.mean,
total: t.total, total: t.total,
stddev: std stddev: std

View file

@ -180,9 +180,10 @@
<tr><th>Rule count</th><td id="rule-count"></td></tr> <tr><th>Rule count</th><td id="rule-count"></td></tr>
<tr><th>Cache entries</th><td id="cache-count"></td></tr> <tr><th>Cache entries</th><td id="cache-count"></td></tr>
<tr><th>Queue items</th><td id="queue-count"></td></tr> <tr><th>Queue items</th><td id="queue-count"></td></tr>
<tr><th>Current run time</th><td id="current-time">--:--</td></tr> <tr><th>Current run time</th><td id="current-time">--:--:--</td></tr>
<tr><th>Average run time</th><td id="average-time">--:--</td></tr> <tr><th>Last run time</th><td id="last-time">--:--:--</td></tr>
<tr><th>Total run time</th><td id="total-time">--:--</td></tr> <tr><th>Average run time</th><td id="average-time">--:--:--</td></tr>
<tr><th>Total run time</th><td id="total-time">--:--:--</td></tr>
</tbody> </tbody>
</table> </table>
<button class="button is-danger" id="clear-cache" type="button">Clear Cache</button> <button class="button is-danger" id="clear-cache" type="button">Clear Cache</button>

View file

@ -306,6 +306,7 @@ document.addEventListener('DOMContentLoaded', async () => {
const cacheCountEl = document.getElementById('cache-count'); const cacheCountEl = document.getElementById('cache-count');
const queueCountEl = document.getElementById('queue-count'); const queueCountEl = document.getElementById('queue-count');
const currentTimeEl = document.getElementById('current-time'); const currentTimeEl = document.getElementById('current-time');
const lastTimeEl = document.getElementById('last-time');
const averageTimeEl = document.getElementById('average-time'); const averageTimeEl = document.getElementById('average-time');
const totalTimeEl = document.getElementById('total-time'); const totalTimeEl = document.getElementById('total-time');
let timingLogged = false; let timingLogged = false;
@ -313,29 +314,43 @@ document.addEventListener('DOMContentLoaded', async () => {
cacheCountEl.textContent = defaults.aiCache ? Object.keys(defaults.aiCache).length : 0; cacheCountEl.textContent = defaults.aiCache ? Object.keys(defaults.aiCache).length : 0;
function format(ms) { function format(ms) {
if (ms < 0) return '--:--'; if (ms < 0) return '--:--:--';
return (ms / 1000).toFixed(1) + 's'; let totalSec = Math.floor(ms / 1000);
const sec = totalSec % 60;
totalSec = (totalSec - sec) / 60;
const min = totalSec % 60;
const hr = (totalSec - min) / 60;
return `${String(hr).padStart(2, '0')}:${String(min).padStart(2, '0')}:${String(sec).padStart(2, '0')}`;
} }
async function refreshMaintenance() { async function refreshMaintenance() {
try { try {
const stats = await browser.runtime.sendMessage({ type: 'sortana:getTiming' }); const stats = await browser.runtime.sendMessage({ type: 'sortana:getTiming' });
queueCountEl.textContent = stats.count; queueCountEl.textContent = stats.count;
currentTimeEl.classList.remove('has-text-success','has-text-danger'); currentTimeEl.classList.remove('has-text-danger');
lastTimeEl.classList.remove('has-text-success','has-text-danger');
let arrow = ''; let arrow = '';
if (stats.last >= 0) {
if (stats.stddev > 0 && stats.last - stats.average > stats.stddev) {
lastTimeEl.classList.add('has-text-danger');
arrow = ' ▲';
} else if (stats.stddev > 0 && stats.average - stats.last > stats.stddev) {
lastTimeEl.classList.add('has-text-success');
arrow = ' ▼';
}
lastTimeEl.textContent = format(stats.last) + arrow;
} else {
lastTimeEl.textContent = '--:--:--';
}
if (stats.current >= 0) { if (stats.current >= 0) {
if (stats.stddev > 0 && stats.current - stats.average > stats.stddev) { if (stats.stddev > 0 && stats.current - stats.average > stats.stddev) {
currentTimeEl.classList.add('has-text-danger'); currentTimeEl.classList.add('has-text-danger');
arrow = ' ▲';
} else if (stats.stddev > 0 && stats.average - stats.current > stats.stddev) {
currentTimeEl.classList.add('has-text-success');
arrow = ' ▼';
} }
currentTimeEl.textContent = format(stats.current) + arrow; currentTimeEl.textContent = format(stats.current);
} else { } else {
currentTimeEl.textContent = '--:--'; currentTimeEl.textContent = '--:--:--';
} }
averageTimeEl.textContent = stats.count ? format(stats.average) : '--:--'; averageTimeEl.textContent = stats.runs > 0 ? format(stats.average) : '--:--:--';
totalTimeEl.textContent = format(stats.total); totalTimeEl.textContent = format(stats.total);
if (!timingLogged) { if (!timingLogged) {
logger.aiLog('retrieved timing stats', {debug: true}); logger.aiLog('retrieved timing stats', {debug: true});
@ -343,9 +358,10 @@ document.addEventListener('DOMContentLoaded', async () => {
} }
} catch (e) { } catch (e) {
queueCountEl.textContent = '?'; queueCountEl.textContent = '?';
currentTimeEl.textContent = '--:--'; currentTimeEl.textContent = '--:--:--';
averageTimeEl.textContent = '--:--'; lastTimeEl.textContent = '--:--:--';
totalTimeEl.textContent = '--:--'; averageTimeEl.textContent = '--:--:--';
totalTimeEl.textContent = '--:--:--';
} }
ruleCountEl.textContent = document.querySelectorAll('#rules-container .rule').length; ruleCountEl.textContent = document.querySelectorAll('#rules-container .rule').length;
@ -357,7 +373,7 @@ document.addEventListener('DOMContentLoaded', async () => {
} }
refreshMaintenance(); refreshMaintenance();
setInterval(refreshMaintenance, 2000); setInterval(refreshMaintenance, 1000);
document.getElementById('clear-cache').addEventListener('click', async () => { document.getElementById('clear-cache').addEventListener('click', async () => {
await AiClassifier.clearCache(); await AiClassifier.clearCache();