Count orchestrators on the board, pin it, and open on the assistant

Counting every step reported a fully scheduled system as 10 of 82, and reopening the last thread
brought its profile with it, so the tab came up as Troubleshoot pointed at nothing.
This commit is contained in:
Gmer4Lfe
2026-08-09 13:41:53 -04:00
parent 4980b62dc2
commit 66f9d6f435
2 changed files with 43 additions and 11 deletions
+11 -4
View File
@@ -739,10 +739,14 @@ body.vv-fullscreen #displaybox { padding-left: 1rem !important; padding-top: .5r
.vv-info-divider { font-size: 10px; text-transform: uppercase; letter-spacing: 0.1em; color: #444; .vv-info-divider { font-size: 10px; text-transform: uppercase; letter-spacing: 0.1em; color: #444;
padding: 10px 12px 4px; border-top: 1px solid #2a2a2a; margin-top: 2px; } padding: 10px 12px 4px; border-top: 1px solid #2a2a2a; margin-top: 2px; }
/* How do I use this — pinned at top of suggestions panel */ /* How do I use this — pinned directly beneath the notification board.
top is the board's measured height, not a constant: the board wraps to a second line in
Advanced mode, where the conf buttons and Git Pull join it. A hardcoded offset would let this
slide underneath it at exactly the width where the wrap happens. vvFitRight() keeps the
variable in step; the fallback is the board's own min-height. */
#vv-how-to-use { #vv-how-to-use {
position: sticky; position: sticky;
top: 0; top: var(--vv-nb-h, 34px);
z-index: 3; z-index: 3;
background: #1e1e1e; background: #1e1e1e;
border-bottom: 1px solid #333; border-bottom: 1px solid #333;
@@ -873,10 +877,13 @@ mark { background: #5d4037; color: #ffcc80; border-radius: 2px; }
.vv-disabled-name { color: #888; flex: 1; } .vv-disabled-name { color: #888; flex: 1; }
.vv-disabled-grp { color: #444; font-size: 10px; font-family: monospace; white-space: nowrap; } .vv-disabled-grp { color: #444; font-size: 10px; font-family: monospace; white-space: nowrap; }
/* Notification board */ /* Notification board. Pinned above the help block: what is running and what is scheduled is the
one thing on this panel worth seeing while reading anything else on it. Highest z-index of the
two pinned rows because it is the topmost — #vv-how-to-use sticks directly beneath it. */
.vv-nb-board { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; .vv-nb-board { display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
padding: 7px 10px; background: #141414; border-bottom: 1px solid #222; padding: 7px 10px; background: #141414; border-bottom: 1px solid #222;
font-size: 12px; min-height: 34px; } font-size: 12px; min-height: 34px;
position: sticky; top: 0; z-index: 4; }
.vv-nb-stat { color: #aaa; } .vv-nb-stat { color: #aaa; }
.vv-nb-sep { color: #444; } .vv-nb-sep { color: #444; }
.vv-nb-running { color: #f0a040; } .vv-nb-running { color: #f0a040; }
+32 -7
View File
@@ -137,14 +137,22 @@ $_childManuals = array_values(array_filter($_repoFiles, function($f) {
})); }));
sort($_childManuals); sort($_childManuals);
// Job stats for notification board // Job stats for notification board.
$totalJobs = 0; $scheduledJobs = 0; //
// Counted against orchestrators, not against every script. A schedule here is normally expressed
// as one cron on an orchestrator that then calls its steps in order, so the steps are deliberately
// cronless — counting them as unscheduled reported a fully-scheduled system as almost entirely
// unscheduled, "10 / 82", which is alarming and wrong.
//
// Steps that do carry their own cron are counted separately. That happens when an orchestrator is
// off and its steps have been given schedules of their own, which is the exception — and the
// number of exceptions is the figure actually worth knowing.
$orchTotal = 0; $orchScheduled = 0; $soloScheduled = 0;
foreach ($tree as $orch) { foreach ($tree as $orch) {
$totalJobs++; $orchTotal++;
if (!empty($orch['cron']) && $orch['enabled']) $scheduledJobs++; if (!empty($orch['cron']) && $orch['enabled']) $orchScheduled++;
foreach (($orch['children'] ?? []) as $child) { foreach (($orch['children'] ?? []) as $child) {
$totalJobs++; if (!empty($child['cron']) && $child['enabled']) $soloScheduled++;
if (!empty($child['cron']) && $child['enabled']) $scheduledJobs++;
} }
} }
$runningScripts = []; $runningScripts = [];
@@ -493,7 +501,11 @@ $runningScripts = array_unique($runningScripts);
<!-- ── Notification Board ── --> <!-- ── Notification Board ── -->
<div class="vv-nb-board"> <div class="vv-nb-board">
<span class="vv-nb-stat"><?= $scheduledJobs ?> / <?= $totalJobs ?> scheduled</span> <span class="vv-nb-stat"><?= $orchScheduled ?> / <?= $orchTotal ?> orchestrators</span>
<?php if ($soloScheduled): ?>
<span class="vv-nb-sep">·</span>
<span class="vv-nb-stat"><?= $soloScheduled ?> standalone<?= $soloScheduled === 1 ? '' : 's' ?></span>
<?php endif; ?>
<span class="vv-nb-sep">·</span> <span class="vv-nb-sep">·</span>
<span class="vv-nb-stat <?= !empty($runningScripts) ? 'vv-nb-running' : '' ?>"> <span class="vv-nb-stat <?= !empty($runningScripts) ? 'vv-nb-running' : '' ?>">
<?= !empty($runningScripts) ? 'Running: ' . htmlspecialchars(implode(', ', $runningScripts)) : 'Idle' ?> <?= !empty($runningScripts) ? 'Running: ' . htmlspecialchars(implode(', ', $runningScripts)) : 'Idle' ?>
@@ -1203,6 +1215,12 @@ function vvFitRight() {
const pre = document.getElementById('vv-log-pre'); const pre = document.getElementById('vv-log-pre');
const sug = document.getElementById('vv-suggestions'); const sug = document.getElementById('vv-suggestions');
// The pinned help block sticks directly under the notification board, so it needs the board's
// real height — which changes when Advanced mode adds the conf buttons and the board wraps.
// Set before the stacked-layout return below, because the two rows stay pinned there too.
const nb = right.querySelector('.vv-nb-board');
if (nb && sug) sug.style.setProperty('--vv-nb-h', nb.offsetHeight + 'px');
const leftRect = left.getBoundingClientRect(); const leftRect = left.getBoundingClientRect();
const rightRect = right.getBoundingClientRect(); const rightRect = right.getBoundingClientRect();
@@ -2398,6 +2416,13 @@ if (document.getElementById('vv-sched-ai-chat')) {
prefix: 'vv-sched-ai', prefix: 'vv-sched-ai',
profile: vvAiProfile, profile: vvAiProfile,
scopeLabel: vvAiScopeLabel, scopeLabel: vvAiScopeLabel,
// No reopening the last thread here, unlike the other two surfaces. Restoring a conversation
// restores the profile it was held under, so the tab would come up as Troubleshoot pointed at
// a log nobody has opened — the chip saying one thing and vvAiScope saying "Scheduler". This
// panel's subject follows the view, and at load the view is the tab itself, so it starts where
// that puts it: the assistant, scoped to the Scheduler. Saved threads are a click away under
// Saved.
resume: false,
// Re-read at send time rather than captured, because the operator moves around this tab // Re-read at send time rather than captured, because the operator moves around this tab
// between asking and sending. // between asking and sending.
scope: () => vvAiScope, scope: () => vvAiScope,