agents-relay 1.0.145 → 1.0.146
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/dashboard-html.js +26 -2
- package/package.json +1 -1
package/dist/dashboard-html.js
CHANGED
|
@@ -107,6 +107,9 @@ export const dashboardHtml = `<!doctype html>
|
|
|
107
107
|
.usage-label { display:flex; justify-content:space-between; gap:1rem; font-weight:700; }
|
|
108
108
|
.usage-track { height:.72rem; overflow:hidden; border:1px solid var(--border); border-radius:999px; background:var(--surface2); }
|
|
109
109
|
.usage-fill { height:100%; width:0; border-radius:inherit; background:var(--accent); transition:width .2s ease; }
|
|
110
|
+
.usage-details { border-top:1px solid var(--border); padding-top:.45rem; }
|
|
111
|
+
.usage-details summary { cursor:pointer; color:var(--muted); font-size:.72rem; font-weight:700; }
|
|
112
|
+
.usage-details-body { display:grid; gap:.3rem; margin-top:.4rem; overflow-wrap:anywhere; }
|
|
110
113
|
.empty,.error-state { padding:.85rem; border:1px dashed var(--border); border-radius:.4rem; color:var(--muted); }
|
|
111
114
|
.error-state,.error-text { color:var(--bad); }
|
|
112
115
|
.skeleton { height:3.2rem; border-radius:.4rem; background:linear-gradient(90deg,#edf0f4,#fafbfc,#edf0f4); animation:pulse 1.2s infinite; }
|
|
@@ -150,6 +153,8 @@ export const dashboardHtml = `<!doctype html>
|
|
|
150
153
|
#usage-view .usage-track { height:.48rem; border:0; background:var(--border); }
|
|
151
154
|
#usage-view .usage-row .subtle { font-size:.68rem; line-height:1.25; }
|
|
152
155
|
#usage-view .usage-provider > .detail-value { font-size:1.2rem; font-weight:800; }
|
|
156
|
+
#usage-view .usage-details { padding-top:.35rem; }
|
|
157
|
+
#usage-view .usage-details-body { font-size:.68rem; }
|
|
153
158
|
.job-summary,.detail-groups { grid-template-columns:1fr; }
|
|
154
159
|
.panel-head { padding:.55rem .6rem; }
|
|
155
160
|
.panel-body { padding:.6rem; }
|
|
@@ -371,9 +376,28 @@ function usageBar(label,windowData){const percent=Math.max(0,Math.min(100,100-wi
|
|
|
371
376
|
function usageProvider(provider){const card=element('section','usage-provider');card.append(element('h3','',text(provider.label)));const usage=provider.usage||{};if(!usage.available||!usage.fiveHour||!usage.weekly){card.append(element('p','empty',text(usage.reason||'Account usage telemetry is unavailable.')));return card;}const bars=element('div','usage-bars');bars.append(usageBar('5-hour remaining',usage.fiveHour),usageBar('Weekly remaining',usage.weekly));card.append(bars);return card;}
|
|
372
377
|
function formatCredit(value,currency){if(value===null||value===undefined||!Number.isFinite(Number(value)))return '—';const number=Number(value);if(currency==='USD')return '$'+number.toFixed(2);if(currency==='CNY')return '¥'+number.toFixed(2);return number.toFixed(2)+' '+currency;}
|
|
373
378
|
function creditProvider(provider){const row=element('section','usage-provider');row.append(element('h3','',text(provider.label)));const credits=provider.credits||{};if(!credits.available||!Array.isArray(credits.balances)||!credits.balances.length){row.append(element('p','empty',text(credits.reason||'Credit balance is unavailable.')));return row;}const balance=credits.balances[0];row.append(element('div','detail-value',text(formatCredit(balance.remaining,balance.currency))));return row;}
|
|
374
|
-
function
|
|
379
|
+
function shortReset(reset){if(!Number.isFinite(reset))return '';const at=new Date(reset*1000);const minutes=Math.max(0,Math.ceil((at.getTime()-Date.now())/60000));const relative=minutes<60?minutes+'m':minutes<1440?Math.floor(minutes/60)+'h '+minutes%60+'m':Math.floor(minutes/1440)+'d '+Math.floor((minutes%1440)/60)+'h';return 'Reset '+relative;}
|
|
380
|
+
function githubBucket(label,bucket){const row=element('div','usage-row');const heading=element('div','usage-label');heading.append(element('span','',text(label)),element('span','',text(bucket.remaining+' / '+bucket.limit)));const percent=bucket.limit>0?Math.max(0,Math.min(100,100*bucket.remaining/bucket.limit)):0;const track=element('div','usage-track');track.setAttribute('role','progressbar');track.setAttribute('aria-label',label+' remaining');track.setAttribute('aria-valuemin','0');track.setAttribute('aria-valuemax','100');track.setAttribute('aria-valuenow',String(Math.round(percent)));const fill=element('div','usage-fill');fill.style.width=percent+'%';track.append(fill);row.append(heading,track);const reset=shortReset(bucket.reset);if(reset){const hint=element('div','subtle',text(reset));hint.title=new Date(bucket.reset*1000).toLocaleString();row.append(hint);}return row;}
|
|
375
381
|
function githubCounterLine(label,values){const entries=Object.entries(values||{}).sort((a,b)=>Number(b[1])-Number(a[1])).slice(0,8);return entries.length?element('div','subtle',text(label+' · '+entries.map(([key,count])=>key+' '+count).join(' · '))):null;}
|
|
376
|
-
function
|
|
382
|
+
function githubDiagnostics(status){const body=element('div','usage-details-body');if(status?.calls)body.append(element('div','subtle',text('Calls · GraphQL '+(status.calls.graphql||0)+' · REST '+(status.calls.rest||0)+' · quota '+(status.calls.rateLimit||0))));const operations=githubCounterLine('GraphQL operations',status?.graphql?.operations);if(operations)body.append(operations);const contexts=githubCounterLine('GraphQL contexts',status?.graphql?.contexts);if(contexts)body.append(contexts);if(status?.readPaths){body.append(element('div','subtle',text('Reads · scans '+(status.readPaths.workspaceScans||0)+' · PR '+(status.readPaths.prRefreshes||0)+' · coalesced '+(status.readPaths.prRefreshCoalesced||0))));const triggers=githubCounterLine('Refresh triggers',status.readPaths.prRefreshesByTrigger);if(triggers)body.append(triggers);const coalesced=githubCounterLine('Coalesced',status.readPaths.prRefreshCoalescedByTrigger);if(coalesced)body.append(coalesced);}if(!body.children.length)return null;const details=element('details','usage-details');details.append(element('summary','',text('Diagnostics')),body);return details;}
|
|
383
|
+
function githubUsageCard(snapshot,status){
|
|
384
|
+
const card=element('section','usage-provider');
|
|
385
|
+
card.append(element('h3','',text('GitHub API')));
|
|
386
|
+
const resources=snapshot?.resources||{};
|
|
387
|
+
const bars=element('div','usage-bars');
|
|
388
|
+
if(resources.core)bars.append(githubBucket('REST',resources.core));
|
|
389
|
+
if(resources.graphql)bars.append(githubBucket('GraphQL',resources.graphql));
|
|
390
|
+
if(resources.search)bars.append(githubBucket('Search',resources.search));
|
|
391
|
+
if(!bars.children.length)bars.append(element('p','empty',text('Quota unavailable')));
|
|
392
|
+
if(status?.limited){
|
|
393
|
+
const until=status.cooldownUntil?' until '+new Date(status.cooldownUntil).toLocaleTimeString():'';
|
|
394
|
+
bars.append(element('div','error-state',text('Cooldown active'+until)));
|
|
395
|
+
}
|
|
396
|
+
const diagnostics=githubDiagnostics(status);
|
|
397
|
+
if(diagnostics)bars.append(diagnostics);
|
|
398
|
+
card.append(bars);
|
|
399
|
+
return card;
|
|
400
|
+
}
|
|
377
401
|
async function drawUsage(){try{const overview=await loadJSON('/api/usage');usageRoot.replaceChildren();usageMeta.textContent='Real account telemetry when available';const providers=Array.isArray(overview.providers)?overview.providers:[];const credits=Array.isArray(overview.credits)?overview.credits:[];const grid=element('div','usage-providers');if(overview.github||overview.githubStatus)grid.append(githubUsageCard(overview.github,overview.githubStatus));for(const provider of providers)grid.append(usageProvider(provider));for(const provider of credits)grid.append(creditProvider(provider));if(!grid.children.length){usageRoot.append(element('p','empty',text('Usage telemetry is unavailable.')));return;}usageRoot.append(grid);}catch(error){usageMeta.textContent='Unavailable';usageRoot.replaceChildren(element('p','error-state',text('Usage unavailable: '+error.message)));}}
|
|
378
402
|
async function drawRules(){rulesStatus.textContent='';try{const rules=await loadJSON('/api/model-router-rules');rulesText.value=typeof rules.text==='string'?rules.text:'';rulesMeta.textContent=rules.hash&&rules.hash!=='none'?'Loaded · '+rules.hash.slice(0,12):'No custom rules saved';}catch(error){rulesMeta.textContent='Unavailable';rulesStatus.textContent='Could not load rules: '+error.message;}}
|
|
379
403
|
async function saveRules(){rulesSave.disabled=true;rulesStatus.textContent='Saving…';try{const response=await fetch('/api/model-router-rules',{method:'PUT',headers:{'content-type':'text/plain; charset=utf-8'},body:rulesText.value});if(!response.ok)throw new Error(response.status+' '+await response.text());const rules=await response.json();rulesMeta.textContent='Saved · '+rules.hash.slice(0,12);rulesStatus.textContent='Saved. New routing decisions will load these rules.';}catch(error){rulesStatus.textContent='Save failed: '+error.message;}finally{rulesSave.disabled=false;}}
|