shadok-ai 0.1.200 → 0.1.201
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/public/index.html +45 -20
package/package.json
CHANGED
package/public/index.html
CHANGED
|
@@ -855,6 +855,11 @@
|
|
|
855
855
|
#chanBar button.icon { padding: 4px 8px; font-size: 14px; line-height: 1; letter-spacing: 0; }
|
|
856
856
|
#chanBar button.icon.stop:hover { border-color: var(--err); color: var(--err); }
|
|
857
857
|
#chanBar button.icon.on { border-color: var(--amber); color: var(--amber); background: rgba(240, 168, 72, 0.15); }
|
|
858
|
+
/* Status / Directory / Session / Branch : inline & compact, so the channel
|
|
859
|
+
header stays a thin single line. */
|
|
860
|
+
#chanBar .gauge { flex-direction: row; align-items: baseline; gap: 4px; }
|
|
861
|
+
#chanBar .gauge .label { font-size: 10px; }
|
|
862
|
+
#chanBar #cwdView { display: inline-block; max-width: 200px; overflow: hidden; text-overflow: ellipsis; vertical-align: bottom; }
|
|
858
863
|
#xtermHost { flex: 1; min-height: 0; overflow: auto; padding: 8px 10px; }
|
|
859
864
|
#xtermHost .xterm { height: 100%; }
|
|
860
865
|
/* Aucun agent ouvert. Le panneau central n'affiche plus un formulaire à demi
|
|
@@ -1077,22 +1082,6 @@
|
|
|
1077
1082
|
|
|
1078
1083
|
<header>
|
|
1079
1084
|
<span class="brand">shadok-ai <span class="ver" id="verView" title="running version"></span></span>
|
|
1080
|
-
<div class="gauge">
|
|
1081
|
-
<span class="label">Status</span>
|
|
1082
|
-
<span class="value"><span id="led" class="led"></span><span id="state">—</span></span>
|
|
1083
|
-
</div>
|
|
1084
|
-
<div class="gauge">
|
|
1085
|
-
<span class="label">Directory</span>
|
|
1086
|
-
<span class="value" id="cwdView">—</span>
|
|
1087
|
-
</div>
|
|
1088
|
-
<div class="gauge">
|
|
1089
|
-
<span class="label">Session</span>
|
|
1090
|
-
<span class="value" id="sessionView">—</span>
|
|
1091
|
-
</div>
|
|
1092
|
-
<div class="gauge" id="branchGauge" hidden>
|
|
1093
|
-
<span class="label">Branch</span>
|
|
1094
|
-
<span class="value" id="branchView">—</span>
|
|
1095
|
-
</div>
|
|
1096
1085
|
<span class="spacer"></span>
|
|
1097
1086
|
<div class="gauge quota" id="quota5h" title="5-hour rolling limit">
|
|
1098
1087
|
<span class="label">5h</span>
|
|
@@ -1310,6 +1299,22 @@
|
|
|
1310
1299
|
séparé, donc ses actions n'ont pas de raison d'apparaître avec lui. -->
|
|
1311
1300
|
<div id="chanBar" hidden>
|
|
1312
1301
|
<span class="label" id="chanBarName"></span>
|
|
1302
|
+
<div class="gauge">
|
|
1303
|
+
<span class="label">Status</span>
|
|
1304
|
+
<span class="value"><span id="led" class="led"></span><span id="state">—</span></span>
|
|
1305
|
+
</div>
|
|
1306
|
+
<div class="gauge">
|
|
1307
|
+
<span class="label">Directory</span>
|
|
1308
|
+
<span class="value" id="cwdView">—</span>
|
|
1309
|
+
</div>
|
|
1310
|
+
<div class="gauge">
|
|
1311
|
+
<span class="label">Session</span>
|
|
1312
|
+
<span class="value" id="sessionView">—</span>
|
|
1313
|
+
</div>
|
|
1314
|
+
<div class="gauge" id="branchGauge" hidden>
|
|
1315
|
+
<span class="label">Branch</span>
|
|
1316
|
+
<span class="value" id="branchView">—</span>
|
|
1317
|
+
</div>
|
|
1313
1318
|
<span class="chan-actions">
|
|
1314
1319
|
<button id="chanCron" class="icon" title="Scheduled prompts for this agent (monitoring / reporting)">⏰</button>
|
|
1315
1320
|
<button id="chanStop" class="icon stop" title="End session">⏹️</button>
|
|
@@ -2315,12 +2320,32 @@
|
|
|
2315
2320
|
return el;
|
|
2316
2321
|
}
|
|
2317
2322
|
|
|
2323
|
+
/** Temps relatif compact : "now" / "3m ago" / "2h ago" / "5d ago". */
|
|
2324
|
+
function relTime(ts) {
|
|
2325
|
+
const s = Math.max(0, (Date.now() - ts) / 1000);
|
|
2326
|
+
if (s < 45) return "now";
|
|
2327
|
+
const m = Math.round(s / 60);
|
|
2328
|
+
if (m < 60) return m + "m ago";
|
|
2329
|
+
const h = Math.round(m / 60);
|
|
2330
|
+
if (h < 24) return h + "h ago";
|
|
2331
|
+
return Math.round(h / 24) + "d ago";
|
|
2332
|
+
}
|
|
2333
|
+
/** (Re)pose l'heure relative du dernier message sur l'onglet. */
|
|
2334
|
+
function renderLastAt(tab) {
|
|
2335
|
+
if (!tab.lastAtEl) return;
|
|
2336
|
+
if (!Number.isFinite(tab.lastMsgAt)) { tab.lastAtEl.textContent = ""; return; }
|
|
2337
|
+
tab.lastAtEl.textContent = relTime(tab.lastMsgAt);
|
|
2338
|
+
tab.lastAtEl.title = new Date(tab.lastMsgAt).toLocaleString();
|
|
2339
|
+
}
|
|
2340
|
+
// Le relatif vieillit tout seul : on rafraîchit tous les onglets périodiquement.
|
|
2341
|
+
setInterval(() => { for (const t of tabs) renderLastAt(t); }, 30000);
|
|
2342
|
+
|
|
2318
2343
|
function addTurn(tab, role, who, text, extraClass, at) {
|
|
2319
|
-
// Heure du dernier message dans la liste des canaux (
|
|
2320
|
-
// message (historique rejoué ou live) porte `at` ; le dernier gagne.
|
|
2321
|
-
if (Number.isFinite(at)
|
|
2344
|
+
// Heure du dernier message dans la liste des canaux, en relatif (« 3m ago »).
|
|
2345
|
+
// Chaque message (historique rejoué ou live) porte `at` ; le dernier gagne.
|
|
2346
|
+
if (Number.isFinite(at)) {
|
|
2322
2347
|
tab.lastMsgAt = at;
|
|
2323
|
-
tab
|
|
2348
|
+
renderLastAt(tab);
|
|
2324
2349
|
}
|
|
2325
2350
|
const turn = document.createElement("div");
|
|
2326
2351
|
turn.className = "turn " + role + (extraClass ? " " + extraClass : "");
|