UNPKG

manifest

Version:

Self-hosted Manifest LLM router with embedded server, SQLite database, and dashboard

2 lines (1 loc) 17.5 kB
import{t as c,l as q,i,g as l,S as y,h as B,q as he,d as de,p as ce,m as U,s as H,z as me,B as ve,F as Y,n as _e,u as fe,b as pe,a as E,k as ne,f as le,T as $e,M as ye,A as be}from"./vendor-C-Y5oNOq.js";import{u as J}from"./charts-Cty976qB.js";import{u as Q,g as R,a as D,c as X,f as Z,p as ee,s as G,b as xe,d as te,m as j,e as ae,i as se,h as re,j as F}from"./chart-utils-DTt1NOye.js";import{I as Ce,g as ke,p as we}from"./model-display-DHwvDtl4.js";import{f as ue,a as ge,c as Se,i as Ne,p as Me,b as ie,E as Re}from"./index-C4Qw7vZo.js";import{a as Ve,b as Te}from"./AuthBadge-Dj2KkXRW.js";import{i as W,c as Pe,s as oe,p as Ie,a as Ae,g as Le}from"./routing-utils-CHapjwyd.js";import{S as Ue,M as De,C as ze,a as Ee}from"./overview-DKLGwfLs.js";import{g as Oe}from"./routing-CLLAl6kl.js";import"./auth-CU91cd7V.js";import"./SetupStepAddProvider-CSNkQmoC.js";import"./CopyButton-BWMVlK2w.js";var Fe=c("<div style=width:100%;min-height:260px>");const Be=e=>{let r;return Q({el:()=>r,data:()=>e.data,buildChart(){if(!r)return null;const s=r.clientWidth||r.getBoundingClientRect().width;if(s===0)return null;const a=R("--chart-1"),m=D("--foreground",.55),v=D("--foreground",.05),g=R("--card"),u=X(m,v,e.range);return u[1]={...u[1],values:(t,o)=>o.map(d=>isNaN(d)?"–":d%1===0?`$${d}`:`$${d.toFixed(2)}`)},new J({width:s,height:260,padding:[16,16,0,0],cursor:re(g,a),scales:{x:{time:!se(e.range),range:ae(e.range)},y:{auto:!0,range:(t,o,d)=>[0,d>0?d*1.15:1]}},axes:u,series:[{value:te(e.range)},{label:"Cost",stroke:a,width:2.5,fill:j("--chart-1",.25),value:xe}]},(()=>{const t=e.range==="24h",o=Z(e.data,e.range??"",t?"hour":"date",d=>t?{hour:d,cost:0}:{date:d,cost:0});return[ee(o),G(o.map(d=>d.cost))]})(),r)}}),(()=>{var s=Fe(),a=r;return typeof a=="function"?q(a,s):r=s,s})()};var Ge=c("<div style=width:100%;min-height:260px>");const je=e=>{let r;return Q({el:()=>r,data:()=>e.data,buildChart(){if(!r)return null;const s=r.clientWidth||r.getBoundingClientRect().width;if(s===0)return null;const a=R(e.colorVar),m=D("--foreground",.55),v=D("--foreground",.05),g=R("--card");return new J({width:s,height:260,padding:[16,16,0,0],cursor:re(g,a),scales:{x:{time:!se(e.range),range:ae(e.range)},y:{auto:!0,range:(u,t,o)=>[0,o>0?o*1.1:10]}},axes:X(m,v,e.range),series:[{value:te(e.range)},{label:e.label,stroke:a,width:2.5,fill:j(e.colorVar,.25)}]},(()=>{const u=Z(e.data,e.range??"","time",o=>({time:o,value:0})),t=u.map(o=>o.time.includes("T")||o.time.includes(" ")?{hour:o.time}:{date:o.time});return[ee(t),G(u.map(o=>o.value))]})(),r)}}),(()=>{var s=Ge(),a=r;return typeof a=="function"?q(a,s):r=s,s})()};var He=c("<div style=width:100%;min-height:260px>");const We=e=>{let r;return Q({el:()=>r,data:()=>e.data,buildChart(){if(!r)return null;const s=r.clientWidth||r.getBoundingClientRect().width;if(s===0)return null;const a=R("--bar-input"),m=R("--bar-output"),v=R("--bar-output-axis"),g=D("--foreground",.55),u=D("--foreground",.05),t=R("--card"),o=(d,_,h)=>[0,h>0?h*1.1:100];return new J({width:s,height:260,padding:[16,0,0,0],cursor:re(t,a),scales:{x:{time:!se(e.range),range:ae(e.range)},y:{auto:!0,range:o},y2:{auto:!0,range:o}},axes:(()=>{const d=X(g,u,e.range);return d[1]={...d[1],stroke:a,values:(_,h)=>h.map(b=>F(_,b))},d.push({scale:"y2",side:1,stroke:v,grid:{show:!1},ticks:{show:!1},font:'11px "DM Sans", sans-serif',size:54,gap:8,values:(_,h)=>h.map(b=>F(_,b))}),d})(),series:[{value:te(e.range)},{label:"Sent to AI",scale:"y",stroke:a,width:2.5,fill:j("--bar-input",.25),value:F},{label:"Received from AI",scale:"y2",stroke:m,width:2,fill:j("--bar-output",.15),value:F}]},(()=>{const d=e.range==="24h",_=Z(e.data,e.range??"",d?"hour":"date",h=>d?{hour:h,input_tokens:0,output_tokens:0}:{date:h,input_tokens:0,output_tokens:0});return[ee(_),G(_.map(h=>h.input_tokens)),G(_.map(h=>h.output_tokens))]})(),r)}}),(()=>{var s=He(),a=r;return typeof a=="function"?q(a,s):r=s,s})()};var Ke=c("<span>%"),Ye=c('<div class=chart-card><div class=chart-card__header><div class="chart-card__stat chart-card__stat--clickable"><span class=chart-card__label>Cost</span><div class=chart-card__value-row><span class=chart-card__value></span></div></div><div class="chart-card__stat chart-card__stat--clickable"><span class=chart-card__label>Token usage</span><div class=chart-card__value-row><span class=chart-card__value></span></div></div><div class="chart-card__stat chart-card__stat--clickable"><span class=chart-card__label>Messages</span><div class=chart-card__value-row><span class=chart-card__value></span></div></div></div><div class=chart-card__body>'),qe=c("<div style=height:260px;color:hsl(var(--muted-foreground));display:flex;align-items:center;justify-content:center>No cost data for this time range"),Je=c("<div style=height:260px;color:hsl(var(--muted-foreground));display:flex;align-items:center;justify-content:center>No token data for this time range"),Qe=c("<div style=height:260px;color:hsl(var(--muted-foreground));display:flex;align-items:center;justify-content:center>No message data for this time range");const K=(e,r,s)=>{if(e===0||Math.abs(r)<.005)return null;const a=Math.max(-999,Math.min(999,Math.round(e)));if(a===0)return null;let m;s==="neutral"?m="trend trend--neutral":m=a>0?"trend trend--up-bad":"trend trend--down-good";const v=a>0?"+":"";return(()=>{var g=Ke(),u=g.firstChild;return he(g,m),i(g,v,u),i(g,a,u),g})()},Xe=e=>(()=>{var r=Ye(),s=r.firstChild,a=s.firstChild,m=a.firstChild,v=m.nextSibling,g=v.firstChild,u=a.nextSibling,t=u.firstChild;t.firstChild;var o=t.nextSibling,d=o.firstChild,_=u.nextSibling,h=_.firstChild,b=h.nextSibling,M=b.firstChild,w=s.nextSibling;return a.$$click=()=>e.onViewChange("cost"),i(g,()=>ue(e.costValue)??"$0.00"),i(v,()=>K(e.costTrendPct,e.costValue,"inverted"),null),u.$$click=()=>e.onViewChange("tokens"),i(t,l(Ce,{text:"Tokens are units of text that AI models process. More tokens = higher cost."}),null),i(d,()=>ge(e.tokensValue)),i(o,()=>K(e.tokensTrendPct,e.tokensValue,"inverted"),null),_.$$click=()=>e.onViewChange("messages"),i(M,()=>e.messagesValue),i(b,()=>K(e.messagesTrendPct,e.messagesValue,"neutral"),null),i(w,l(y,{get when(){return e.activeView==="cost"},get children(){return l(y,{get when(){return e.costUsage?.length},get fallback(){return qe()},get children(){return l(Be,{get data(){return e.costUsage},get range(){return e.range}})}})}}),null),i(w,l(y,{get when(){return e.activeView==="tokens"},get children(){return l(y,{get when(){return e.tokenUsage?.length},get fallback(){return Je()},get children(){return l(We,{get data(){return e.tokenUsage},get range(){return e.range}})}})}}),null),i(w,l(y,{get when(){return e.activeView==="messages"},get children(){return l(y,{get when(){return e.messageChartData.length},get fallback(){return Qe()},get children(){return l(je,{get data(){return e.messageChartData},label:"Messages",colorVar:"--chart-1",get range(){return e.range}})}})}}),null),B(x=>{var V=e.activeView==="cost",T=e.activeView==="tokens",f=e.activeView==="messages";return V!==x.e&&a.classList.toggle("chart-card__stat--active",x.e=V),T!==x.t&&u.classList.toggle("chart-card__stat--active",x.t=T),f!==x.a&&_.classList.toggle("chart-card__stat--active",x.a=f),x},{e:void 0,t:void 0,a:void 0}),r})();de(["click"]);var Ze=c('<div class=panel style=margin-top:var(--gap-lg)><div class=panel__title>Cost by Model</div><p style="font-size:var(--font-size-xs);color:hsl(var(--muted-foreground));margin:-8px 0 12px">How much each model costs you</p><table class=data-table><thead><tr><th>Model</th><th>Tokens</th><th>% of total</th><th>Cost</th></tr></thead><tbody>'),et=c("<tr><td style=font-family:var(--font-mono);font-size:var(--font-size-sm)><span style=display:inline-flex;align-items:center;gap:4px></span></td><td></td><td><div style=display:flex;align-items:center;gap:8px><div style=width:40px;height:4px;border-radius:2px;background:hsl(var(--muted));overflow:hidden><div></div></div><span style=font-size:var(--font-size-xs);color:hsl(var(--muted-foreground))>%</span></div></td><td style=font-weight:600>"),tt=c("<span class=provider-card__logo-letter style=width:16px;height:16px;font-size:9px;flex-shrink:0;border-radius:50%>"),at=c("<span style=display:inline-flex;flex-shrink:0;position:relative>");const st=e=>{const r=ce(()=>[...e.rows].sort((s,a)=>a.estimated_cost-s.estimated_cost));return(()=>{var s=Ze(),a=s.firstChild,m=a.nextSibling,v=m.nextSibling,g=v.firstChild,u=g.nextSibling;return i(u,l(Y,{get each(){return r()},children:t=>(()=>{var o=et(),d=o.firstChild,_=d.firstChild,h=d.nextSibling,b=h.nextSibling,M=b.firstChild,w=M.firstChild,x=w.firstChild,V=w.nextSibling,T=V.firstChild,f=b.nextSibling;return i(_,(()=>{var C=U(()=>!!(t.model&&W(t.model)==="custom"));return()=>C()?(()=>{const $=e.customProviderName(t.model),S=Pe($??"",16,void 0,t.model??void 0);if(S)return S;const z=($??oe(t.model)).charAt(0).toUpperCase();return(()=>{var A=tt();return H(A,"title",$),i(A,z),B(n=>me(A,"background",Se($??""))),A})()})():U(()=>!!(t.model&&W(t.model)))()?(()=>{var $=at();return i($,()=>Ie(W(t.model),14),null),i($,()=>Ve(t.auth_type,8),null),B(()=>H($,"title",`${Ae(t.model)} (${Te(t.auth_type)})`)),$})():null})(),null),i(_,(()=>{var C=U(()=>!!t.model);return()=>C()?U(()=>!!t.model.startsWith("custom:"))()?`custom:${e.customProviderName(t.model)??"Custom"}/${oe(t.model)}`:t.display_name||ke(t.model):t.model})(),null),i(h,()=>ge(t.tokens)),i(V,()=>Math.round(t.share_pct),T),i(f,()=>ue(t.estimated_cost)??"—"),B(C=>{var $=`width: ${t.share_pct}%; height: 100%; background: hsl(var(--chart-1)); border-radius: 2px;`,S=t.estimated_cost>0&&t.estimated_cost<.01?`$${t.estimated_cost.toFixed(6)}`:void 0;return C.e=ve(x,$,C.e),S!==C.t&&H(f,"title",C.t=S),C},{e:void 0,t:void 0}),o})()})),s})()};var rt=c('<div class=chart-card><div class=chart-card__header><div class="chart-card__stat chart-card__stat--active"><span class=chart-card__label>Cost</span><div class=chart-card__value-row><div class="skeleton skeleton--text"style=width:80px;height:28px></div></div></div><div class=chart-card__stat><span class=chart-card__label>Token usage</span><div class=chart-card__value-row><div class="skeleton skeleton--text"style=width:70px;height:28px></div></div></div><div class=chart-card__stat><span class=chart-card__label>Messages</span><div class=chart-card__value-row><div class="skeleton skeleton--text"style=width:50px;height:28px></div></div></div></div><div class=chart-card__body><div class="skeleton skeleton--rect"style=width:100%;height:260px>'),nt=c("<div class=panel><div class=panel__title style=display:flex;justify-content:space-between;align-items:center>Recent Messages<span class=view-more-link style=pointer-events:none;opacity:0.4>View more</span></div><table class=data-table><thead><tr><th>Date</th><th>Message</th><th>Cost</th><th>Model</th><th>Tokens</th><th>Status</th></tr></thead><tbody>"),lt=c('<div class=panel style=margin-top:var(--gap-lg)><div class=panel__title>Cost by Model</div><p style="font-size:var(--font-size-xs);color:hsl(var(--muted-foreground));margin:-8px 0 12px">How much each AI model is costing you</p><table class=data-table><thead><tr><th>Model</th><th>Tokens</th><th>% of total</th><th>Cost</th></tr></thead><tbody>'),it=c('<tr><td><div class="skeleton skeleton--text"style=width:70%></div></td><td><div class="skeleton skeleton--text"style=width:50%></div></td><td><div class="skeleton skeleton--text"style=width:50%></div></td><td><div class="skeleton skeleton--text"style=width:70%></div></td><td><div class="skeleton skeleton--text"style=width:40%></div></td><td><div class="skeleton skeleton--text"style=width:50%>'),ot=c('<tr><td><div class="skeleton skeleton--text"style=width:60%></div></td><td><div class="skeleton skeleton--text"style=width:40%></div></td><td><div class="skeleton skeleton--text"style=width:50%></div></td><td><div class="skeleton skeleton--text"style=width:40%>');const dt=()=>[rt(),(()=>{var e=nt(),r=e.firstChild,s=r.nextSibling,a=s.firstChild,m=a.nextSibling;return i(m,l(Y,{each:[1,2,3,4,5],children:()=>it()})),e})(),(()=>{var e=lt(),r=e.firstChild,s=r.nextSibling,a=s.nextSibling,m=a.firstChild,v=m.nextSibling;return i(v,l(Y,{each:[1,2,3],children:()=>ot()})),e})()];var ct=c('<button class="btn btn--primary btn--sm">Set up agent'),ut=c('<div class=empty-state><div class=empty-state__title>No activity yet</div><p>Connect a provider to start routing LLM calls.</p><button class="btn btn--primary btn--sm"style=margin-top:var(--gap-md)>Enable routing</button><div class=empty-state__img-wrapper><img src=/example-overview.svg alt="Example dashboard overview showing cost and token charts"class=empty-state__img loading=lazy>',!0,!1,!1),gt=c("<div class=container--md><div class=page-header><div><h1>Overview</h1><span class=breadcrumb>Real-time summary of spending, tokens, and messages</span></div><div class=header-controls>"),ht=c('<div class=empty-state><div class=empty-state__title>No activity yet</div><p>Set up your agent and send a message. Usage data shows up here.</p><button class="btn btn--primary btn--sm"style=margin-top:var(--gap-md)>Set up agent</button><div class=empty-state__img-wrapper><img src=/example-overview.svg alt="Example dashboard overview showing cost and token charts"class=empty-state__img loading=lazy>',!0,!1,!1),mt=c('<div class=waiting-banner><i class="bxd bx-florist"></i><p>No activity yet. Your dashboard updates seconds after the first LLM call.'),vt=c("<div class=panel><div class=panel__title style=display:flex;justify-content:space-between;align-items:center>Recent Messages");const Mt=()=>{const e=_e(),r=fe(),s=pe();we();const a="manifest_chart_range",m=new Set(["24h","7d","30d"]),v=localStorage.getItem(a),[g,u]=E(v&&m.has(v)?v:"30d"),[t,o]=E(!!v),d=n=>{u(n),o(!0),localStorage.setItem(a,n)},[_,h]=E("cost"),[b,M]=E(Ne(decodeURIComponent(e.agentName))),[w,x]=E(!!localStorage.getItem(`setup_completed_${e.agentName}`)),[V]=ne(()=>e.agentName,n=>Oe(decodeURIComponent(n))),T=n=>{const k=n.match(/^custom:([^/]+)\//);if(!k)return;const P=k[1];return V()?.find(O=>O.id===P)?.name},[f,{refetch:C}]=ne(()=>({range:g(),agentName:e.agentName,_ping:Me()}),n=>Le(n.range,n.agentName)),$=()=>{const n=f();return!!n&&(n.has_data!==!1||n.has_providers===!0)},S=()=>{const n=f();return!!n&&n.has_data===!1&&!n.has_providers};le(()=>{S()&&!w()&&!localStorage.getItem(`setup_dismissed_${e.agentName}`)&&M(!0)});const z=["30d","7d","24h"];le(()=>{if(t())return;const n=f();if(!n||n.has_data===!1&&!n.has_providers||(n.token_usage?.length??0)>0||(n.cost_usage?.length??0)>0||(n.message_usage?.length??0)>0)return;const P=z.indexOf(g());P<0||P>=z.length-1||u(z[P+1])});const A=ce(()=>f()?.message_usage?.map(k=>({time:k.hour??k.date??"",value:k.count}))??[]);return(()=>{var n=gt(),k=n.firstChild,P=k.firstChild,O=P.nextSibling;return i(n,l($e,{get children(){return[U(()=>ie()??decodeURIComponent(e.agentName))," Overview - Manifest"]}}),k),i(n,l(ye,{name:"description",get content(){return`Monitor ${ie()??decodeURIComponent(e.agentName)} performance — costs, tokens, and activity.`}}),k),i(O,l(y,{get when(){return $()},get children(){return l(Ue,{get value(){return g()},onChange:d,options:[{label:"Last 24 hours",value:"24h"},{label:"Last 7 days",value:"7d"},{label:"Last 30 days",value:"30d"}]})}}),null),i(O,l(y,{get when(){return U(()=>!!S())()&&!w()},get children(){var N=ct();return N.$$click=()=>M(!0),N}}),null),i(n,l(y,{get when(){return f()!==void 0||!f.loading},get fallback(){return l(dt,{})},get children(){return l(y,{get when(){return!f.error},get fallback(){return l(Re,{get error(){return f.error},onRetry:C})},get children(){return[l(y,{get when(){return S()},get children(){return l(y,{get when(){return w()},get fallback(){return(()=>{var N=ht(),p=N.firstChild,I=p.nextSibling,L=I.nextSibling;return L.$$click=()=>M(!0),N})()},get children(){var N=ut(),p=N.firstChild,I=p.nextSibling,L=I.nextSibling;return L.$$click=()=>s(`/agents/${encodeURIComponent(e.agentName)}/routing`,{state:{openProviders:!0}}),N}})}}),l(y,{get when(){return $()},children:N=>{const p=()=>f();return[l(y,{get when(){return p().has_data===!1},get children(){return mt()}}),l(Xe,{get activeView(){return _()},onViewChange:h,get costValue(){return p().summary?.cost_today?.value??0},get costTrendPct(){return p().summary?.cost_today?.trend_pct??0},get tokensValue(){return p().summary?.tokens_today?.value??0},get tokensTrendPct(){return p().summary?.tokens_today?.trend_pct??0},get messagesValue(){return p().summary?.messages?.value??0},get messagesTrendPct(){return p().summary?.messages?.trend_pct??0},get costUsage(){return p().cost_usage},get tokenUsage(){return p().token_usage},get messageChartData(){return A()},get range(){return g()}}),(()=>{var I=vt(),L=I.firstChild;return L.firstChild,i(L,l(be,{get href(){return`/agents/${e.agentName}/messages`},class:"view-more-link",children:"View more"}),null),i(I,l(De,{get items(){return p().recent_activity?.slice(0,5)??[]},columns:ze,get agentName(){return e.agentName},customProviderName:T}),null),I})(),l(st,{get rows(){return p().cost_by_model??[]},customProviderName:T})]}})]}})}}),null),i(n,l(Ee,{get open(){return b()},get agentName(){return decodeURIComponent(e.agentName)},get apiKey(){return r.state?.newApiKey??null},onClose:()=>{localStorage.setItem(`setup_dismissed_${e.agentName}`,"1"),M(!1)},onDone:()=>{localStorage.setItem(`setup_completed_${e.agentName}`,"1"),x(!0)},onGoToRouting:()=>{s(`/agents/${encodeURIComponent(e.agentName)}/routing`,{state:{openProviders:!0}})}}),null),n})()};de(["click"]);export{Mt as default};