@qlucent/fishi-core 0.16.3 → 0.16.5
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/dist/index.js +52 -23
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -15274,10 +15274,10 @@ function getDashboardHtml() {
|
|
|
15274
15274
|
<main>
|
|
15275
15275
|
<!-- Stat cards -->
|
|
15276
15276
|
<div class="stat-grid">
|
|
15277
|
+
<div class="card"><div class="card-label">Total Events</div><div class="card-value" id="statEvents">\u2014</div></div>
|
|
15278
|
+
<div class="card"><div class="card-label">Gates Passed</div><div class="card-value" id="statGates">\u2014</div></div>
|
|
15279
|
+
<div class="card"><div class="card-label">Checkpoints</div><div class="card-value" id="statCheckpoints">\u2014</div></div>
|
|
15277
15280
|
<div class="card"><div class="card-label">Agent Completions</div><div class="card-value" id="statCompletions">\u2014</div></div>
|
|
15278
|
-
<div class="card"><div class="card-label">Files Changed</div><div class="card-value" id="statFiles">\u2014</div></div>
|
|
15279
|
-
<div class="card"><div class="card-label">Total Tokens</div><div class="card-value" id="statTokens">\u2014</div></div>
|
|
15280
|
-
<div class="card"><div class="card-label">Dynamic Agents</div><div class="card-value" id="statDynamic">\u2014</div></div>
|
|
15281
15281
|
</div>
|
|
15282
15282
|
|
|
15283
15283
|
<!-- Phase bar -->
|
|
@@ -15300,12 +15300,12 @@ function getDashboardHtml() {
|
|
|
15300
15300
|
<!-- Bottom row -->
|
|
15301
15301
|
<div class="bottom-grid">
|
|
15302
15302
|
<div class="panel">
|
|
15303
|
-
<div class="panel-title">
|
|
15304
|
-
<div id="
|
|
15303
|
+
<div class="panel-title">Checkpoints</div>
|
|
15304
|
+
<div id="checkpointsPanel"><span class="empty-msg">No checkpoints.</span></div>
|
|
15305
15305
|
</div>
|
|
15306
15306
|
<div class="panel">
|
|
15307
|
-
<div class="panel-title">
|
|
15308
|
-
<div id="
|
|
15307
|
+
<div class="panel-title">TaskBoard</div>
|
|
15308
|
+
<div id="taskboardPanel"><span class="empty-msg">No tasks.</span></div>
|
|
15309
15309
|
</div>
|
|
15310
15310
|
<div class="panel">
|
|
15311
15311
|
<div class="panel-title">Gates</div>
|
|
@@ -15315,7 +15315,7 @@ function getDashboardHtml() {
|
|
|
15315
15315
|
</main>
|
|
15316
15316
|
|
|
15317
15317
|
<script>
|
|
15318
|
-
const PHASES = ['init', 'discovery', '
|
|
15318
|
+
const PHASES = ['init', 'discovery', 'prd', 'architecture', 'sprint_planning', 'development', 'deployment', 'deployed'];
|
|
15319
15319
|
|
|
15320
15320
|
function fmt(n) {
|
|
15321
15321
|
if (n >= 1e6) return (n / 1e6).toFixed(1) + 'M';
|
|
@@ -15369,12 +15369,36 @@ function getDashboardHtml() {
|
|
|
15369
15369
|
).join('');
|
|
15370
15370
|
}
|
|
15371
15371
|
|
|
15372
|
-
function
|
|
15373
|
-
const panel = document.getElementById(
|
|
15374
|
-
const
|
|
15375
|
-
if (!
|
|
15376
|
-
panel.innerHTML =
|
|
15377
|
-
\`<div class="kv-row"
|
|
15372
|
+
function renderCheckpoints(events) {
|
|
15373
|
+
const panel = document.getElementById('checkpointsPanel');
|
|
15374
|
+
const checkpoints = events.filter(e => e.type === 'checkpoint.created').slice(-5).reverse();
|
|
15375
|
+
if (!checkpoints.length) { panel.innerHTML = '<span class="empty-msg">No checkpoints.</span>'; return; }
|
|
15376
|
+
panel.innerHTML = checkpoints.map(c =>
|
|
15377
|
+
\`<div class="kv-row">
|
|
15378
|
+
<span class="kv-key">#\${c.data?.checkpointId || '?'} \u2014 \${c.data?.phase || 'unknown'}</span>
|
|
15379
|
+
<span class="kv-val">\${fmtTime(c.timestamp)}</span>
|
|
15380
|
+
</div>\`
|
|
15381
|
+
).join('');
|
|
15382
|
+
}
|
|
15383
|
+
|
|
15384
|
+
function renderTaskboard(events) {
|
|
15385
|
+
const panel = document.getElementById('taskboardPanel');
|
|
15386
|
+
// Get latest checkpoint with taskCounts
|
|
15387
|
+
const withCounts = events.filter(e => e.data?.taskCounts).reverse();
|
|
15388
|
+
if (!withCounts.length) { panel.innerHTML = '<span class="empty-msg">No task data.</span>'; return; }
|
|
15389
|
+
const tc = withCounts[0].data.taskCounts;
|
|
15390
|
+
const cols = [
|
|
15391
|
+
{ name: 'Backlog', count: tc.backlog || 0, color: '#6b7280' },
|
|
15392
|
+
{ name: 'Ready', count: tc.ready || 0, color: '#f59e0b' },
|
|
15393
|
+
{ name: 'In Progress', count: tc.inProgress || 0, color: '#3b82f6' },
|
|
15394
|
+
{ name: 'Review', count: tc.review || 0, color: '#a855f7' },
|
|
15395
|
+
{ name: 'Done', count: tc.done || 0, color: '#22c55e' },
|
|
15396
|
+
];
|
|
15397
|
+
panel.innerHTML = cols.map(c =>
|
|
15398
|
+
\`<div class="kv-row">
|
|
15399
|
+
<span class="kv-key" style="color:\${c.color}">\${c.name}</span>
|
|
15400
|
+
<span class="kv-val">\${c.count}</span>
|
|
15401
|
+
</div>\`
|
|
15378
15402
|
).join('');
|
|
15379
15403
|
}
|
|
15380
15404
|
|
|
@@ -15382,10 +15406,11 @@ function getDashboardHtml() {
|
|
|
15382
15406
|
const panel = document.getElementById('gatesPanel');
|
|
15383
15407
|
if (!gates || !gates.length) { panel.innerHTML = '<span class="empty-msg">No gates.</span>'; return; }
|
|
15384
15408
|
panel.innerHTML = gates.map(g => {
|
|
15385
|
-
const cls = g.status === '
|
|
15409
|
+
const cls = g.status === 'approved' ? 'passed' : g.status === 'rejected' ? 'failed' : g.status === 'skipped' ? 'pending' : 'pending';
|
|
15410
|
+
const label = g.phase || g.name || 'unknown';
|
|
15386
15411
|
return \`<div class="gate-row">
|
|
15387
15412
|
<span class="gate-dot \${cls}"></span>
|
|
15388
|
-
<span class="gate-name">\${
|
|
15413
|
+
<span class="gate-name">\${label}</span>
|
|
15389
15414
|
<span class="gate-status \${cls}">\${g.status}</span>
|
|
15390
15415
|
</div>\`;
|
|
15391
15416
|
}).join('');
|
|
@@ -15402,17 +15427,21 @@ function getDashboardHtml() {
|
|
|
15402
15427
|
dot.classList.remove('offline');
|
|
15403
15428
|
|
|
15404
15429
|
const s = data.summary || {};
|
|
15430
|
+
const events = data.events || [];
|
|
15431
|
+
const gates = data.gates || [];
|
|
15432
|
+
|
|
15433
|
+
// Stat cards
|
|
15434
|
+
document.getElementById('statEvents').textContent = fmt(events.length);
|
|
15435
|
+
document.getElementById('statGates').textContent = fmt(gates.filter(g => g.status === 'approved').length);
|
|
15436
|
+
document.getElementById('statCheckpoints').textContent = fmt(events.filter(e => e.type === 'checkpoint.created').length);
|
|
15405
15437
|
document.getElementById('statCompletions').textContent = fmt(s.totalAgentCompletions || 0);
|
|
15406
|
-
document.getElementById('statFiles').textContent = fmt(s.totalFilesChanged || 0);
|
|
15407
|
-
document.getElementById('statTokens').textContent = fmt(s.totalTokens || 0);
|
|
15408
|
-
document.getElementById('statDynamic').textContent = fmt(s.dynamicAgentsCreated || 0);
|
|
15409
15438
|
|
|
15410
15439
|
renderPhase(data.phase || 'init');
|
|
15411
|
-
renderEvents(
|
|
15440
|
+
renderEvents(events);
|
|
15412
15441
|
renderAgents(data.agentSummary || {});
|
|
15413
|
-
|
|
15414
|
-
|
|
15415
|
-
renderGates(
|
|
15442
|
+
renderCheckpoints(events);
|
|
15443
|
+
renderTaskboard(events);
|
|
15444
|
+
renderGates(gates);
|
|
15416
15445
|
|
|
15417
15446
|
lu.textContent = 'Updated: ' + new Date().toLocaleTimeString();
|
|
15418
15447
|
} catch (err) {
|