PageSourceSearch

https://app.knockknockapp.ai/assets/AICreditLogs-CxR6yBY5.js

js knockknockapp.ai collected 2026-10-01 16:40:27 UTC 17,642 bytes, 1 lines download raw bytes

1import{w as W,l as o,m as i,q as t,B as N,z as Q,u as n,J as l,K as s,p as g,D as _,aa as k,ab as D,F as x,v as F,af as z,ac as U,y as X,a9 as Y,a6 as Z,r as w,b as tt,e as m}from"./vue-vendor-c0W5WEtO.js";import{b as P}from"./query-vendor-BMwEzNLN.js";import{_ as et}from"./Pagination-bRbpfmNK.js";import{G as rt,J as at}from"./companies-DTY0-k6y.js";import{g as st}from"./cost-tracking-Dl72SsbM.js";import{ac as ot,R as it}from"./ui-vendor-B7SopUXd.js";import"./index-B2Yag7Gu.js";import"./date-vendor-HBGOQ70J.js";import"./twilio-DAuME2Y9.js";import"./charts-BVdrK9wF.js";import"./socket-Kk_l3rvZ.js";const nt={class:"min-h-screen bg-gray-50 p-6 text-gray-900 dark:bg-gray-900 dark:text-gray-100"},dt={class:"mx-auto max-w-7xl space-y-6"},lt={class:"flex flex-wrap items-center justify-between gap-4"},pt={class:"text-sm text-gray-600 dark:text-gray-400"},ut={key:0},gt={class:"font-mono text-xs"},ct=["disabled"],mt={class:"rounded-lg border border-gray-200 bg-white p-6 dark:border-gray-700 dark:bg-gray-800"},yt={class:"mb-4 flex flex-wrap items-start justify-between gap-3"},xt={key:0,class:"py-6 text-center text-gray-500 dark:text-gray-400"},bt={key:1,class:"py-6 text-center text-red-600 dark:text-red-400"},_t={key:2,class:"py-6 text-center text-gray-500 dark:text-gray-400"},kt={key:3,class:"overflow-x-auto"},vt={class:"w-full text-left text-sm"},ht={class:"divide-y divide-gray-100 dark:divide-gray-700"},ft={class:"py-2 pr-3 font-mono text-xs"},wt={class:"py-2 pr-3 text-right tabular-nums"},Lt={class:"py-2 pr-3 text-right tabular-nums"},St={class:"py-2 pr-3 text-right tabular-nums"},Ct={class:"py-2 pr-3 text-right font-medium tabular-nums"},At={class:"py-2 pr-3 text-right"},Nt={class:"py-2 pr-3 text-right tabular-nums"},Dt={class:"grid gap-3 rounded-lg border border-gray-200 bg-white p-4 sm:grid-cols-2 lg:grid-cols-5 dark:border-gray-700 dark:bg-gray-800"},Ft={key:0,class:"grid gap-3 sm:grid-cols-2 lg:grid-cols-4"},Pt={class:"rounded-lg border border-gray-200 bg-white p-4 dark:border-gray-700 dark:bg-gray-800"},$t={class:"mt-1 text-xl font-semibold text-gray-900 dark:text-white"},Mt={class:"rounded-lg border border-gray-200 bg-white p-4 dark:border-gray-700 dark:bg-gray-800"},Vt={class:"mt-1 text-xl font-semibold text-red-600 dark:text-red-400"},Rt={class:"rounded-lg border border-gray-200 bg-white p-4 dark:border-gray-700 dark:bg-gray-800"},Tt={class:"mt-1 text-xl font-semibold text-green-600 dark:text-green-400"},qt={class:"rounded-lg border border-gray-200 bg-white p-4 dark:border-gray-700 dark:bg-gray-800"},zt={class:"mt-1 text-xl font-semibold text-gray-900 dark:text-white"},Ut={class:"text-sm text-gray-500"},Bt={class:"rounded-lg border border-gray-200 bg-white p-6 dark:border-gray-700 dark:bg-gray-800"},Ot={key:0,class:"py-8 text-center text-gray-500 dark:text-gray-400"},jt={key:1,class:"py-8 text-center text-red-600 dark:text-red-400"},Et={key:2,class:"py-8 text-center text-gray-500 dark:text-gray-400"},It={key:3,class:"overflow-x-auto"},Jt={class:"w-full text-left text-sm"},Kt={class:"divide-y divide-gray-100 dark:divide-gray-700"},Gt={class:"py-2 pr-3 text-xs whitespace-nowrap text-gray-500 dark:text-gray-400"},Ht={class:"py-2 pr-3 font-mono text-xs"},Wt={class:"py-2 pr-3"},Qt={class:"py-2 pr-3 text-right tabular-nums"},Xt={class:"py-2 pr-3 text-right tabular-nums"},Yt={class:"py-2 pr-3 text-right text-gray-600 tabular-nums dark:text-gray-400"},Zt={class:"py-2 pr-3 font-mono text-xs text-gray-500 dark:text-gray-400"},te={class:"py-2 pr-3 text-xs text-gray-600 dark:text-gray-400"},ee=["onClick"],re={key:0,class:"bg-gray-50 dark:bg-gray-900/40"},ae={colspan:"10",class:"px-3 py-3"},se={key:0,class:"mb-2 text-sm text-gray-700 dark:text-gray-300"},oe={key:1,class:"mb-2"},ie={class:"mt-1 overflow-x-auto rounded bg-white p-2 font-mono text-xs text-gray-700 dark:bg-gray-800 dark:text-gray-300"},ne={key:2,class:"mb-2 text-xs text-gray-600 dark:text-gray-400"},de={key:3},le={class:"text-xs font-medium text-gray-500 dark:text-gray-400"},pe={key:0},ue={class:"mt-1 max-h-64 overflow-auto rounded bg-white p-2 font-mono text-xs text-gray-700 dark:bg-gray-800 dark:text-gray-300"},Se={__name:"AICreditLogs",setup(ge){const y=Y(),c=w(1),b=w(50),v=w(null),h=w(30),d=tt({source:"",action:"",start_date:"",end_date:""});W([d,b],()=>{c.value=1});const $=m(()=>({skip:(c.value-1)*b.value,limit:b.value,...d.source?{source:d.source}:{},...d.action?{action:d.action}:{},...d.start_date?{start_date:new Date(d.start_date).toISOString()}:{},...d.end_date?{end_date:new Date(d.end_date).toISOString()}:{}})),{data:M}=P({queryKey:["admin","companies",m(()=>y.params.id)],queryFn:()=>rt(y.params.id)}),{data:u,isPending:L,isError:B,refetch:V}=P({queryKey:m(()=>["admin","companies",y.params.id,"ai-credit-logs",$.value]),queryFn:()=>at(y.params.id,$.value),keepPreviousData:!0}),{data:R,isPending:O,isError:j}=P({queryKey:m(()=>["admin","cost-tracking","voice-split",h.value]),queryFn:()=>st(h.value),keepPreviousData:!0}),E=m(()=>(u.value?.logs||[]).reduce((a,e)=>a+(e.consumed_credits||0),0)),I=m(()=>(u.value?.logs||[]).reduce((a,e)=>{const A=e.delta?.remaining_ai_credits||0,r=e.delta?.remaining_purchased_ai_credits||0;return a+Math.max(0,A)+Math.max(0,r)},0)),S=m(()=>{const a=u.value?.logs?.[0];return a?{pkg:a.after?.remaining_ai_credits??0,purchased:a.after?.remaining_purchased_ai_credits??0}:null}),p=a=>
1typeof a=="number"&&Number.isFinite(a)?a.toLocaleString():"0",f=a=>{const e=typeof a=="number"?a:Number(a);return Number.isFinite(e)?`$${e.toFixed(2)}`:"$0.00"},J=a=>(typeof a=="number"?a:0)>=40?"bg-amber-50 text-amber-700 dark:bg-amber-500/20 dark:text-amber-400":"bg-gray-100 text-gray-600 dark:bg-gray-700 dark:text-gray-300",T=a=>typeof a!="number"||!Number.isFinite(a)||a===0?"0":a>0?`+${p(a)}`:p(a),C=a=>a?new Date(a).toLocaleString("en-US",{year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit",second:"2-digit"}):"N/A",K=a=>({"bg-red-50 text-red-700 dark:bg-red-500/20 dark:text-red-400":a==="consume","bg-green-50 text-green-700 dark:bg-green-500/20 dark:text-green-400":a==="refill"||a==="addon","bg-blue-50 text-blue-700 dark:bg-blue-500/20 dark:text-blue-400":a==="set"||a==="reset"||a==="override"}),q=a=>{const e=typeof a=="number"?a:0;return{"text-red-600 dark:text-red-400":e<0,"text-green-600 dark:text-green-400":e>0}},G=a=>{v.value=v.value===a?null:a},H=()=>{d.source="",d.action="",d.start_date="",d.end_date="",c.value=1};return(a,e)=>{const A=Z("router-link");return o(),i("div",nt,[t("div",dt,[t("div",lt,[t("div",null,[N(A,{to:`/admin/companies/${n(y).params.id}`,class:"inline-flex items-center gap-1 text-sm text-gray-600 hover:text-gray-900 dark:text-gray-400 dark:hover:text-white"},{default:Q(()=>[N(n(ot),{size:16}),e[10]||(e[10]=l(" Back to Company ",-1))]),_:1},8,["to"]),e[11]||(e[11]=t("h1",{class:"mt-2 text-2xl font-bold text-gray-900 dark:text-white"},"AI Credit Logs",-1)),t("p",pt,[n(M)?.company?.company_name?(o(),i("span",ut,s(n(M).company.company_name)+" — ",1)):g("",!0),t("span",gt,s(n(y).params.id),1)])]),t("button",{onClick:e[0]||(e[0]=(...r)=>n(V)&&n(V)(...r)),disabled:n(L),class:"inline-flex items-center gap-2 rounded-lg bg-teal-50 px-4 py-2 text-sm font-medium text-teal-600 transition-colors hover:bg-teal-100 disabled:cursor-not-allowed disabled:opacity-50 dark:bg-teal-500/20 dark:text-teal-400 dark:hover:bg-teal-500/30"},[N(n(it),{size:16,class:_(n(L)?"animate-spin":"")},null,8,["class"]),e[12]||(e[12]=l(" Refresh ",-1))],8,ct)]),t("div",mt,[t("div",yt,[e[14]||(e[14]=t("div",null,[t("h2",{class:"text-lg font-semibold text-gray-900 dark:text-white"},"Voice cost split"),t("p",{class:"max-w-2xl text-sm text-gray-500 dark:text-gray-400"},[l(" Fleet-wide (all companies). Splits each voice agent's spend into "),t("span",{class:"font-medium"},"duration"),l(" (platform / call_charge) vs "),t("span",{class:"font-medium"},"inner-LLM"),l(" (llm_passthrough / llm_charge) — shows whether voice cost is driven by call length or LLM tokens. ")])],-1)),k(t("select",{"onUpdate:modelValue":e[1]||(e[1]=r=>h.value=r),class:"rounded-md border border-gray-300 bg-white px-2 py-1.5 text-sm dark:border-gray-600 dark:bg-gray-700 dark:text-white"},[...e[13]||(e[13]=[t("option",{value:7},"Last 7 days",-1),t("option",{value:30},"Last 30 days",-1),t("option",{value:90},"Last 90 days",-1)])],512),[[D,h.value,void 0,{number:!0}]])]),n(O)?(o(),i("div",xt," Loading… ")):n(j)?(o(),i("div",bt," Failed to load voice split. ")):n(R)?.summary?.length?(o(),i("div",kt,[t("table",vt,[e[15]||(e[15]=t("thead",{class:"border-b border-gray-200 dark:border-gray-700"},[t("tr",{class:"text-xs text-gray-500 uppercase dark:text-gray-400"},[t("th",{class:"py-2 pr-3 font-medium"},"Agent"),t("th",{class:"py-2 pr-3 text-right font-medium"},"Calls"),t("th",{class:"py-2 pr-3 text-right font-medium"},"Duration $"),t("th",{class:"py-2 pr-3 text-right font-medium"},"LLM $"),t("th",{class:"py-2 pr-3 text-right font-medium"},"Total $"),t("th",{class:"py-2 pr-3 text-right font-medium"},"LLM %"),t("th",{class:"py-2 pr-3 text-right font-medium"},"$ / call")])],-1)),t("tbody",ht,[(o(!0),i(x,null,F(n(R).summary,r=>(o(),i("tr",{key:r.agent,class:"text-gray-800 dark:text-gray-200"},[t("td",ft,s(r.agent),1),t("td",wt,s(p(r.calls)),1),t("td",Lt,s(f(r.platform_usd)),1),t("td",St,s(f(r.llm_usd)),1),t("td",Ct,s(f(r.total_usd)),1),t("td",At,[t("span",{class:_(["inline-flex rounded-full px-2 py-0.5 text-xs font-medium tabular-nums",J(r.llm_pct)])},s(r.llm_pct)+"% ",3)]),t("td",Nt,s(f(r.usd_per_call)),1)]))),128))])]),e[16]||(e[16]=t("p",{class:"mt-3 text-xs text-gray-500 dark:text-gray-400"},[l(" Reading it — for "),t("span",{class:"font-mono"},"knox-voice"),l(": a high "),t("span",{class:"font-medium"}
1,"LLM %"),l(" means spend is LLM tokens (lever: trim the voice system prompt + tool descriptions); a low LLM % means it's call duration (lever: lower max call duration). ")],-1))])):(o(),i("div",_t," No voice spend recorded in this window. "))]),t("div",Dt,[t("div",null,[e[18]||(e[18]=t("label",{class:"mb-1 block text-xs font-medium text-gray-600 dark:text-gray-400"}," Source ",-1)),k(t("select",{"onUpdate:modelValue":e[2]||(e[2]=r=>d.source=r),class:"w-full rounded-md border border-gray-300 bg-white px-2 py-1.5 text-sm dark:border-gray-600 dark:bg-gray-700 dark:text-white"},[...e[17]||(e[17]=[z('<option value="">All</option><option value="ai_tokens_credit_job">AI consumption (job)</option><option value="manual_ai_credits_job">Monthly manual reset</option><option value="subscription_renewal">Subscription renewal</option><option value="subscription_renewal_retry_stripe">Renewal retry (stripe)</option><option value="subscription_renewal_retry_charge">Renewal retry (charge)</option><option value="subscribe_stripe_product">New paid sub</option><option value="subscribe_trial">Trial sub</option><option value="update_stripe_subscription">Plan change</option><option value="buy_addon">Addon purchase</option><option value="agency_subscribe_bulk_reset">Agency subscribe reset</option><option value="agency_change_package_bulk_reset">Agency change-pkg reset</option><option value="agency_create_company">Agency create company</option><option value="agency_create_company_ghl">Agency create company (GHL)</option><option value="agency_invite_create_account">Agency invite create</option><option value="stripe_webhook_invoice_paid">Stripe webhook invoice</option><option value="stripe_webhook_agency_invoice_paid"> Stripe webhook agency invoice </option><option value="company_controller_resub">Company re-subscribe</option><option value="subscription_store_default">Subscription store default</option><option value="subscription_store_free_trial">Subscription store free trial</option><option value="subscription_store_private_package">Subscription store private</option><option value="playground_create">Playground</option>',22)])],512),[[D,d.source]])]),t("div",null,[e[20]||(e[20]=t("label",{class:"mb-1 block text-xs font-medium text-gray-600 dark:text-gray-400"}," Action ",-1)),k(t("select",{"onUpdate:modelValue":e[3]||(e[3]=r=>d.action=r),class:"w-full rounded-md border border-gray-300 bg-white px-2 py-1.5 text-sm dark:border-gray-600 dark:bg-gray-700 dark:text-white"},[...e[19]||(e[19]=[z('<option value="">All</option><option value="consume">consume</option><option value="refill">refill</option><option value="reset">reset</option><option value="set">set</option><option value="addon">addon</option><option value="override">override</option>',7)])],512),[[D,d.action]])]),t("div",null,[e[21]||(e[21]=t("label",{class:"mb-1 block text-xs font-medium text-gray-600 dark:text-gray-400"}," From ",-1)),k(t("input",{"onUpdate:modelValue":e[4]||(e[4]=r=>d.start_date=r),type:"datetime-local",class:"w-full rounded-md border border-gray-300 bg-white px-2 py-1.5 text-sm dark:border-gray-600 dark:bg-gray-700 dark:text-white"},null,512),[[U,d.start_date]])]),t("div",null,[e[22]||(e[22]=t("label",{class:"mb-1 block text-xs font-medium text-gray-600 dark:text-gray-400"}," To ",-1)),k(t("input",{"onUpdate:modelValue":e[5]||(e[5]=r=>d.end_date=r),type:"datetime-local",class:"w-full rounded-md border border-gray-300 bg-white px-2 py-1.5 text-sm dark:border-gray-600 dark:bg-gray-700 dark:text-white"},null,512),[[U,d.end_date]])]),t("div",{class:"flex items-end"},[t("button",{onClick:H,class:"inline-flex items-center gap-2 rounded-md border border-gray-300 px-3 py-1.5 text-sm text-gray-700 hover:bg-gray-100 dark:border-gray-600 dark:text-gray-300 dark:hover:bg-gray-700"}," Reset filters ")])]),n(u)?(o(),i("div",Ft,[t("div",Pt,[e[23]||(e[23]=t("p",{class:"text-xs text-gray-500 dark:text-gray-400"},"Entries (current filter)",-1)),t("p",$t,s(n(u).total),1)]),t("div",Mt,[e[24]||(e[24]=t("p",{class:"text-xs text-gray-500 dark:text-gray-400"},"Total consumed (page)",-1)),t("p",Vt,s(p(E.value)),1)]),t("div",Rt,[e[25]||(e[25]=t("p",{class:"text-xs text-gray-500 dark:text-gray-400"},"Total refilled (page)",-1)),t("p",Tt,s(p(I.value)),1)]),t("div",qt,[e[26]||(e[26]=t("p",{class:"text-xs text-gray-500 dark:text-gray-400"},"Latest balance",-1)),t("p",zt,[S.value?(o(),i(x,{key:0},[l(s(p(S.value.pkg))+" ",1),t("span",Ut,"+ "+s(p(S.value.purchased))+" purchased",1)],64)):(o(),i(x,{key:1},[l("—")],64))])])])):g("",!0),t("div",Bt,[n(L)?(o(),i("div",Ot," Loading... ")):n(B)?(o(),i("div",jt," Failed to load credit logs. ")):n(u)?.logs?.length?(o(),i("div",It,[t("table",Jt,[e[31]||(e[31]=t("thead",{class:"border-b border-gray-200 dark:border-gray-700"},[t("tr",{class:"text-xs text-gray-500 uppercase dark:text-gray-400"},[t("th",{class:"py-2 pr-3 font-medium"},"When"),t("th",{class:"py-2 pr-3 font-medium"},"Source"),t("th",{class:"py-2 pr-3 font-medium"},"Action"),t("th",{class:"py-2 pr-3 text-right font-medium"},"Pkg credits"),t("th",{class:"py-2 pr-3 text-right font-medium"},"Δ"),t("th",{class:"py-2 pr-3 text-right font-medium"},"Purchased"),t("th",{class:"py-2 pr-3 text-right font-medium"},"Δ"),t("th",{class:"py-2 pr-3 text-right font-medium"},"Consumed"),t("th",{class:"py-2 pr-3 font-medium"},"Subscription"),t("th",{class:"py-2 pr-3 font-medium"},"Notes")])],-1)),t("tbody",Kt,[(o(!0),i(x,null,F(n(u).logs,r=>(o(),i("tr",{key:r._id,class:"text-gray-800 dark:text-gray-200"},[t("td",Gt,s(C(r.created_at)),1),t("td",Ht,s(r.source),1),t("td",Wt,[t("span",{class:_(["inline-flex rounded-full px-2 py-0.5 text-xs font-medium",K(r.action)])}
1,s(r.action),3)]),t("td",Qt,s(p(r.before?.remaining_ai_credits))+" → "+s(p(r.after?.remaining_ai_credits)),1),t("td",{class:_(["py-2 pr-3 text-right tabular-nums",q(r.delta?.remaining_ai_credits)])},s(T(r.delta?.remaining_ai_credits)),3),t("td",Xt,s(p(r.before?.remaining_purchased_ai_credits))+" → "+s(p(r.after?.remaining_purchased_ai_credits)),1),t("td",{class:_(["py-2 pr-3 text-right tabular-nums",q(r.delta?.remaining_purchased_ai_credits)])},s(T(r.delta?.remaining_purchased_ai_credits)),3),t("td",Yt,s(p(r.consumed_credits)),1),t("td",Zt,s(r.subscription_id?String(r.subscription_id).slice(-6):"—"),1),t("td",te,[r.token_usage||r.metadata||r.notes?(o(),i("button",{key:0,class:"text-teal-600 hover:underline dark:text-teal-400",onClick:ce=>G(r._id)},s(v.value===r._id?"Hide":"Details"),9,ee)):g("",!0)])]))),128)),(o(!0),i(x,null,F(n(u).logs,r=>(o(),i(x,{key:`${r._id}-detail`},[v.value===r._id?(o(),i("tr",re,[t("td",ae,[r.notes?(o(),i("div",se,[e[27]||(e[27]=t("span",{class:"font-medium"},"Notes:",-1)),l(" "+s(r.notes),1)])):g("",!0),r.metadata&&Object.keys(r.metadata).length?(o(),i("div",oe,[e[28]||(e[28]=t("p",{class:"text-xs font-medium text-gray-500 dark:text-gray-400"},"Metadata",-1)),t("pre",ie,s(JSON.stringify(r.metadata,null,2)),1)])):g("",!0),r.window?.from||r.window?.to?(o(),i("div",ne,[e[29]||(e[29]=t("span",{class:"font-medium"},"Window:",-1)),l(" "+s(C(r.window?.from))+" → "+s(C(r.window?.to)),1)])):g("",!0),r.token_usage?(o(),i("div",de,[t("p",le,[l(" Token usage ("+s(Array.isArray(r.token_usage)?r.token_usage.length:1)+" item",1),Array.isArray(r.token_usage)&&r.token_usage.length!==1?(o(),i("span",pe,"s")):g("",!0),e[30]||(e[30]=l(") ",-1))]),t("pre",ue,s(JSON.stringify(r.token_usage,null,2)),1)])):g("",!0)])])):g("",!0)],64))),128))])])])):(o(),i("div",Et," No credit-change entries match the current filters. ")),n(u)?.logs?.length?(o(),X(et,{key:4,page:c.value,"page-size":b.value,total:n(u).total||0,"item-name":"logs","show-per-page-selector":"","show-page-buttons":"",onPrev:e[6]||(e[6]=r=>c.value--),onNext:e[7]||(e[7]=r=>c.value++),onGoto:e[8]||(e[8]=r=>c.value=r),"onUpdate:pageSize":e[9]||(e[9]=r=>b.value=r)},null,8,["page","page-size","total"])):g("",!0)])])])}}};export{Se as default};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.