agent-session-inspector 0.1.8 → 0.1.10

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.
Files changed (100) hide show
  1. package/README.md +1 -1
  2. package/VERSION +1 -1
  3. package/app/.next/BUILD_ID +1 -1
  4. package/app/.next/build-manifest.json +3 -3
  5. package/app/.next/prerender-manifest.json +3 -3
  6. package/app/.next/required-server-files.json +1 -1
  7. package/app/.next/server/app/_global-error.html +1 -1
  8. package/app/.next/server/app/_global-error.rsc +1 -1
  9. package/app/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  10. package/app/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  11. package/app/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  12. package/app/.next/server/app/_not-found/page.js.nft.json +1 -1
  13. package/app/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  14. package/app/.next/server/app/_not-found.html +1 -1
  15. package/app/.next/server/app/_not-found.rsc +14 -14
  16. package/app/.next/server/app/_not-found.segments/_full.segment.rsc +14 -14
  17. package/app/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +13 -13
  18. package/app/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  19. package/app/.next/server/app/api/analytics/route.js.nft.json +1 -1
  20. package/app/.next/server/app/api/logs/route.js.nft.json +1 -1
  21. package/app/.next/server/app/api/pricing/route.js.nft.json +1 -1
  22. package/app/.next/server/app/api/providers/route.js.nft.json +1 -1
  23. package/app/.next/server/app/api/search/route.js.nft.json +1 -1
  24. package/app/.next/server/app/api/sessions/[provider]/[id]/record/route.js.nft.json +1 -1
  25. package/app/.next/server/app/api/sessions/[provider]/[id]/reveal/route.js.nft.json +1 -1
  26. package/app/.next/server/app/api/sessions/[provider]/[id]/route.js.nft.json +1 -1
  27. package/app/.next/server/app/api/sessions/route.js.nft.json +1 -1
  28. package/app/.next/server/app/index.html +1 -1
  29. package/app/.next/server/app/index.rsc +16 -16
  30. package/app/.next/server/app/index.segments/__PAGE__.segment.rsc +15 -15
  31. package/app/.next/server/app/index.segments/_full.segment.rsc +16 -16
  32. package/app/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  33. package/app/.next/server/app/page.js.nft.json +1 -1
  34. package/app/.next/server/app/page_client-reference-manifest.js +1 -1
  35. package/app/.next/server/app/sessions/[provider]/[id]/page.js.nft.json +1 -1
  36. package/app/.next/server/app/sessions/[provider]/[id]/page_client-reference-manifest.js +1 -1
  37. package/app/.next/server/chunks/[root-of-the-server]__014br-h._.js +1 -1
  38. package/app/.next/server/chunks/[root-of-the-server]__0co499t._.js +1 -1
  39. package/app/.next/server/chunks/[root-of-the-server]__0p_hyq8._.js +1 -1
  40. package/app/.next/server/chunks/[root-of-the-server]__0yxic1z._.js +2 -2
  41. package/app/.next/server/chunks/ssr/_0e8jdju._.js +7 -0
  42. package/app/.next/server/chunks/ssr/_0f8nmc3._.js +1 -1
  43. package/app/.next/server/chunks/ssr/_0gr0upx._.js +7 -0
  44. package/app/.next/server/chunks/ssr/src_app_page_tsx_1chiuah._.js +1 -1
  45. package/app/.next/server/chunks/ssr/src_app_sessions_[provider]_[id]_page_tsx_0uf635h._.js +2 -6
  46. package/app/.next/server/middleware-build-manifest.js +3 -3
  47. package/app/.next/server/pages/404.html +1 -1
  48. package/app/.next/server/pages/500.html +1 -1
  49. package/app/.next/server/server-reference-manifest.js +1 -1
  50. package/app/.next/server/server-reference-manifest.json +1 -1
  51. package/app/.next/static/chunks/0hav9to299upa.js +1 -0
  52. package/app/.next/static/chunks/1-qn722atv1by.css +1 -0
  53. package/app/.next/static/chunks/{1fe2mxakoweia.js → 18c6__lhilfeo.js} +1 -1
  54. package/app/.next/static/chunks/1bgubb_nxxbrk.js +2 -0
  55. package/app/.next/static/chunks/1gwxc9rvk6onv.js +5 -0
  56. package/app/AGENTS.md +9 -0
  57. package/app/CLAUDE.md +1 -0
  58. package/app/CONTRIBUTING.md +90 -0
  59. package/app/Dockerfile +34 -0
  60. package/app/LICENSE +21 -0
  61. package/app/README.md +369 -0
  62. package/app/bin/agent-session-inspector.mjs +185 -0
  63. package/app/components.json +25 -0
  64. package/app/docs/screenshots/analytics-dark.png +0 -0
  65. package/app/docs/screenshots/analytics.png +0 -0
  66. package/app/docs/screenshots/request-table.png +0 -0
  67. package/app/docs/screenshots/session-overview-dark.png +0 -0
  68. package/app/docs/screenshots/session-overview.png +0 -0
  69. package/app/docs/screenshots/sessions-dark.png +0 -0
  70. package/app/docs/screenshots/sessions.png +0 -0
  71. package/app/docs/screenshots/timeline-dark.png +0 -0
  72. package/app/docs/screenshots/timeline.png +0 -0
  73. package/app/docs/screenshots/token-optimizer-dark.png +0 -0
  74. package/app/docs/screenshots/token-optimizer.png +0 -0
  75. package/app/docs/social-preview.png +0 -0
  76. package/app/eslint.config.mjs +20 -0
  77. package/app/install.sh +85 -0
  78. package/app/next.config.ts +17 -0
  79. package/app/package.json +3 -3
  80. package/app/pnpm-lock.yaml +7031 -0
  81. package/app/pnpm-workspace.yaml +3 -0
  82. package/app/postcss.config.mjs +7 -0
  83. package/app/scripts/build-cli.mjs +26 -0
  84. package/app/scripts/demo-data.mjs +337 -0
  85. package/app/scripts/deploy-docker.sh +71 -0
  86. package/app/scripts/package-release.sh +86 -0
  87. package/app/server.js +1 -1
  88. package/app/tsconfig.json +34 -0
  89. package/bin/agent-session-inspector.mjs +2 -2
  90. package/cli/cli.mjs +234 -84
  91. package/package.json +1 -1
  92. package/app/.next/server/chunks/ssr/_0o294sf._.js +0 -3
  93. package/app/.next/server/chunks/ssr/_0wfo2z0._.js +0 -3
  94. package/app/.next/static/chunks/1lmw5sxsr57p6.css +0 -1
  95. package/app/.next/static/chunks/1nuneih_2_kul.js +0 -1
  96. package/app/.next/static/chunks/21ckxredfe3pr.js +0 -6
  97. package/app/.next/static/chunks/3-g9jvt_m-6_4.js +0 -1
  98. /package/app/.next/static/{muuOFZsnyOfIG_5aUuqFV → QagODMnr1on0whIZ_GMxV}/_buildManifest.js +0 -0
  99. /package/app/.next/static/{muuOFZsnyOfIG_5aUuqFV → QagODMnr1on0whIZ_GMxV}/_clientMiddlewareManifest.js +0 -0
  100. /package/app/.next/static/{muuOFZsnyOfIG_5aUuqFV → QagODMnr1on0whIZ_GMxV}/_ssgManifest.js +0 -0
@@ -0,0 +1,5 @@
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,77224,e=>{"use strict";let t=(0,e.i(13496).default)("bug",[["path",{d:"M12 20v-9",key:"1qisl0"}],["path",{d:"M14 7a4 4 0 0 1 4 4v3a6 6 0 0 1-12 0v-3a4 4 0 0 1 4-4z",key:"uouzyp"}],["path",{d:"M14.12 3.88 16 2",key:"qol33r"}],["path",{d:"M21 21a4 4 0 0 0-3.81-4",key:"1b0z45"}],["path",{d:"M21 5a4 4 0 0 1-3.55 3.97",key:"5cxbf6"}],["path",{d:"M22 13h-4",key:"1jl80f"}],["path",{d:"M3 21a4 4 0 0 1 3.81-4",key:"1fjd4g"}],["path",{d:"M3 5a4 4 0 0 0 3.55 3.97",key:"1d7oge"}],["path",{d:"M6 13H2",key:"82j7cp"}],["path",{d:"m8 2 1.88 1.88",key:"fmnt4t"}],["path",{d:"M9 7.13V6a3 3 0 1 1 6 0v1.13",key:"1vgav8"}]]);e.s(["Bug",0,t],77224)},50267,e=>{"use strict";let t=(0,e.i(13496).default)("calendar-days",[["path",{d:"M8 2v3",key:"1ioesn"}],["path",{d:"M16 2v3",key:"otl347"}],["rect",{x:"3",y:"3",width:"18",height:"18",rx:"2",key:"h1oib"}],["path",{d:"M3 9h18",key:"1pudct"}],["path",{d:"M8 13h.01",key:"1sbv64"}],["path",{d:"M12 13h.01",key:"y0uutt"}],["path",{d:"M16 13h.01",key:"wip0gl"}],["path",{d:"M8 17h.01",key:"p3bg7i"}],["path",{d:"M12 17h.01",key:"p32p05"}],["path",{d:"M16 17h.01",key:"ql8jdd"}]]);e.s(["CalendarDays",0,t],50267)},93304,98993,e=>{"use strict";let t=(0,e.i(13496).default)("chevron-right",[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]]);e.s(["default",0,t],98993),e.s(["ChevronRight",0,t],93304)},26162,e=>{"use strict";let t=(0,e.i(13496).default)("circle-check",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]]);e.s(["CheckCircle2",0,t],26162)},93125,e=>{"use strict";let t=(0,e.i(13496).default)("git-branch",[["path",{d:"M15 6a9 9 0 0 0-9 9V3",key:"1cii5b"}],["circle",{cx:"18",cy:"6",r:"3",key:"1h7g24"}],["circle",{cx:"6",cy:"18",r:"3",key:"fqmcym"}]]);e.s(["GitBranch",0,t],93125)},50395,e=>{"use strict";let t=(0,e.i(13496).default)("info",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 16v-4",key:"1dtifu"}],["path",{d:"M12 8h.01",key:"e9boi3"}]]);e.s(["Info",0,t],50395)},59920,10976,e=>{"use strict";let t=(0,e.i(13496).default)("triangle-alert",[["path",{d:"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3",key:"wmoenq"}],["path",{d:"M12 9v4",key:"juzpu7"}],["path",{d:"M12 17h.01",key:"p32p05"}]]);e.s(["default",0,t],10976),e.s(["AlertTriangle",0,t],59920)},32660,e=>{"use strict";let t=(0,e.i(13496).default)("zap",[["path",{d:"M15.914 4a1.5 1.5 0 00-2.474-1.561l-9 9A1.5 1.5 0 005.5 14h4.002a.5.5 0 01.471.666L8.086 20a1.5 1.5 0 002.475 1.56l9-9A1.5 1.5 0 0018.5 10h-3.997a.5.5 0 01-.472-.667z",key:"1v7up4"}]]);e.s(["Zap",0,t],32660)},93472,e=>{"use strict";var t=e.i(45650),r=e.i(75157);e.s(["BarList",0,function({items:e,color:a="bg-brand",max:n,emptyLabel:s="None",limit:o,format:i=e=>e.toLocaleString()}){if(0===e.length)return(0,t.jsx)("p",{className:"text-xs text-muted-foreground",children:s});let l=[...e].sort((e,t)=>t.value-e.value),d=o?l.slice(0,o):l,c=n??l[0].value??1;return(0,t.jsxs)("div",{className:"space-y-1.5",children:[d.map(({name:e,value:n})=>(0,t.jsxs)("div",{className:"flex items-center gap-2.5 text-xs",children:[(0,t.jsx)("div",{className:"w-28 shrink-0 truncate font-mono text-muted-foreground sm:w-36",title:e,children:e}),(0,t.jsx)("div",{className:"h-4 flex-1 overflow-hidden rounded-sm bg-muted",children:(0,t.jsx)("div",{className:(0,r.cn)("h-full rounded-sm",a),style:{width:`${Math.max(n/c*100,2)}%`}})}),(0,t.jsx)("div",{className:"w-12 shrink-0 text-right font-medium tabular-nums text-foreground",children:i(n)})]},e)),o&&l.length>o&&(0,t.jsxs)("p",{className:"pt-1 text-xs text-muted-foreground",children:["+",l.length-o," more"]})]})}])},35334,e=>{"use strict";var t=e.i(45650),r=e.i(75157);e.s(["EmptyState",0,function({icon:e,title:a,description:n,action:s,className:o}){return(0,t.jsxs)("div",{className:(0,r.cn)("flex flex-col items-center justify-center gap-2 rounded-xl border border-dashed border-border px-6 py-14 text-center",o),children:[(0,t.jsx)("div",{className:"flex size-10 items-center justify-center rounded-full bg-muted text-muted-foreground",children:(0,t.jsx)(e,{className:"size-5","aria-hidden":!0})}),(0,t.jsx)("p",{className:"text-sm font-medium text-foreground",children:a}),n&&(0,t.jsx)("p",{className:"max-w-sm text-xs leading-relaxed text-muted-foreground",children:n}),s&&(0,t.jsx)("div",{className:"mt-2",children:s})]})}])},82183,9449,e=>{"use strict";var t=e.i(45650);let r={A:{badge:"border-emerald-300 bg-emerald-50 text-emerald-700 dark:border-emerald-900 dark:bg-emerald-950/40 dark:text-emerald-300",bar:"bg-emerald-500"},B:{badge:"border-sky-300 bg-sky-50 text-sky-700 dark:border-sky-900 dark:bg-sky-950/40 dark:text-sky-300",bar:"bg-sky-500"},C:{badge:"border-amber-300 bg-amber-50 text-amber-700 dark:border-amber-900 dark:bg-amber-950/40 dark:text-amber-300",bar:"bg-amber-500"},D:{badge:"border-orange-300 bg-orange-50 text-orange-700 dark:border-orange-900 dark:bg-orange-950/40 dark:text-orange-300",bar:"bg-orange-500"},F:{badge:"border-red-300 bg-red-50 text-red-700 dark:border-red-900 dark:bg-red-950/40 dark:text-red-300",bar:"bg-red-500"}},a={completed:"The agent had the last word.",in_progress:"The agent is still writing to this session.",abandoned:"The session stops mid-work, or on a prompt the agent never answered.",errored:"The transcript ends on an API error."},n=(e,t,r=`${t}s`)=>`${e.toLocaleString()} ${1===e?t:r}`;e.s(["GRADES",0,["A","B","C","D","F"],"GRADE_STYLES",0,r,"OUTCOMES",0,["completed","in_progress","abandoned","errored"],"OUTCOME_BARS",0,{completed:"bg-emerald-500",in_progress:"bg-sky-500",abandoned:"bg-amber-500",errored:"bg-red-500"},"OUTCOME_LABELS",0,{completed:"Completed",in_progress:"In progress",abandoned:"Abandoned",errored:"Errored"},"OUTCOME_NOTES",0,a,"SIGNAL_INFO",0,{outcome:{label:"Unfinished sessions",describe:(e,t)=>a[t.outcome],advice:"Review errored and abandoned sessions first: they spent tokens without reaching an answer."},tool_failures:{label:"Tool failures",describe:(e,t)=>{let r=Math.max(t.toolResults,e.count);return`${e.count.toLocaleString()} of ${n(r,"tool result")} failed (${Math.round(e.count/r*100)}%).`},advice:"Open the failed calls and look for a recurring cause: wrong paths, missing dependencies, commands that need a flag.",focus:{failures:!0}},retry_loops:{label:"Retry loops",describe:e=>`The same tool failed three or more times in a row, ${n(e.count,"time")}.`,advice:"An agent repeating a failing call lacks the context to try something else. Put the working command in AGENTS.md or CLAUDE.md.",focus:{failures:!0}},api_errors:{label:"API errors",describe:e=>`${n(e.count,"API error")} or retried request${1===e.count?"":"s"}.`,advice:"Each retry re-sends the whole context. Frequent errors point at rate limits or an overloaded model.",focus:{categories:["session"],subKeys:["session.error"]}},aborted_turns:{label:"Interrupted turns",describe:e=>`${n(e.count,"turn")} interrupted before the agent finished.`,advice:"Interruptions usually mean the agent set off in the wrong direction. State the constraints and the success criteria up front.",focus:{categories:["session"],subKeys:["session.turn_aborted"]}},compactions:{label:"Context compactions",describe:e=>`Context was compacted ${n(e.count,"time")}.`,advice:"Split long tasks into separate sessions before the context fills up: compacting mid-task loses detail.",focus:{categories:["session"],subKeys:["session.compaction_start"]}}},"healthSummary",0,function(e){return`${e.grade} \xb7 ${e.score}`}],9449);var s=e.i(75157);e.s(["GradeBadge",0,function({grade:e,score:a,className:n,...o}){return(0,t.jsxs)("span",{...o,className:(0,s.cn)("inline-flex h-5 min-w-5 shrink-0 items-center justify-center gap-1 rounded-sm border px-1 font-mono text-xs font-bold leading-none",r[e].badge,n),children:[e,void 0!==a&&(0,t.jsx)("span",{className:"font-medium tabular-nums",children:a})]})}],82183)},4503,22910,e=>{"use strict";var t=e.i(45650),r=e.i(10364);let a=(0,e.i(13496).default)("arrow-up",[["path",{d:"m5 12 7-7 7 7",key:"hav0vg"}],["path",{d:"M12 19V5",key:"x0mq9r"}]]);var n=e.i(19455),s=e.i(46798),o=e.i(75157);function i({className:e}){return(0,t.jsx)("div",{"aria-hidden":!0,className:(0,o.cn)("animate-pulse rounded-md bg-muted",e)})}e.s(["ScrollToTop",0,function({threshold:e=600}){let[i,l]=(0,r.useState)(!1);return(0,r.useEffect)(()=>{let t=()=>l(window.scrollY>e);return t(),window.addEventListener("scroll",t,{passive:!0}),()=>window.removeEventListener("scroll",t)},[e]),(0,t.jsxs)(s.Tooltip,{children:[(0,t.jsx)(s.TooltipTrigger,{render:(0,t.jsx)(n.Button,{variant:"outline",size:"icon-lg",onClick:()=>window.scrollTo({top:0,behavior:"smooth"}),"aria-label":"Back to top",tabIndex:i?0:-1,className:(0,o.cn)("fixed bottom-6 right-6 z-30 size-10 rounded-full bg-card text-muted-foreground shadow-lg dark:bg-card",i?"translate-y-0 opacity-100":"pointer-events-none translate-y-2 opacity-0"),children:(0,t.jsx)(a,{"aria-hidden":!0})})}),(0,t.jsx)(s.TooltipContent,{side:"left",children:"Back to top"})]})}],4503),e.s(["SessionCardSkeleton",0,function(){return(0,t.jsxs)("div",{className:"rounded-xl border border-border bg-card px-4 py-3",children:[(0,t.jsxs)("div",{className:"flex items-start justify-between gap-3",children:[(0,t.jsxs)("div",{className:"min-w-0 flex-1 space-y-2",children:[(0,t.jsx)(i,{className:"h-4 w-2/3"}),(0,t.jsx)(i,{className:"h-3 w-1/3"})]}),(0,t.jsx)(i,{className:"h-3 w-16"})]}),(0,t.jsxs)("div",{className:"mt-3 flex gap-2",children:[(0,t.jsx)(i,{className:"h-3 w-20"}),(0,t.jsx)(i,{className:"h-3 w-16"}),(0,t.jsx)(i,{className:"h-3 w-24"})]})]})},"Skeleton",0,i],22910)},75858,e=>{"use strict";var t=e.i(45650);let r=(0,e.i(13496).default)("circle-question-mark",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3",key:"1u773s"}],["path",{d:"M12 17h.01",key:"p32p05"}]]);var a=e.i(50395),n=e.i(46798),s=e.i(75157);e.s(["StatCard",0,function({label:e,value:o,sub:i,accent:l=!1,hint:d,onClick:c}){let u=(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)("span",{className:"flex items-center justify-between gap-2 text-xs uppercase tracking-wider text-muted-foreground",children:[e,d&&!c&&(0,t.jsxs)(n.Tooltip,{children:[(0,t.jsx)(n.TooltipTrigger,{render:(0,t.jsx)("span",{tabIndex:0,"aria-label":d,className:"rounded-sm opacity-60 transition-opacity hover:opacity-100 focus-visible:opacity-100 focus-visible:outline-2 focus-visible:outline-ring",children:(0,t.jsx)(r,{className:"size-3.5","aria-hidden":!0})})}),(0,t.jsx)(n.TooltipContent,{className:"normal-case tracking-normal",children:d})]}),c&&(0,t.jsx)(a.Info,{className:"size-3.5 shrink-0 opacity-60 transition-opacity group-hover:opacity-100","aria-hidden":!0})]}),(0,t.jsx)("span",{className:(0,s.cn)("mt-1.5 block text-2xl font-bold leading-none tabular-nums",l?"text-brand":"text-foreground"),children:o}),i&&(0,t.jsx)("span",{className:"mt-1 block truncate text-xs normal-case text-muted-foreground",title:i,children:i})]});return c?(0,t.jsx)("button",{type:"button",onClick:c,"aria-haspopup":"dialog",className:"group block rounded-xl border border-border bg-card p-4 text-left transition-colors hover:border-brand/40 hover:bg-muted/40 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring",children:u}):(0,t.jsx)("div",{className:"rounded-xl border border-border bg-card p-4",children:u})},"StatCardGrid",0,function({children:e}){return(0,t.jsx)("div",{className:"grid grid-cols-[repeat(auto-fill,minmax(150px,1fr))] gap-3",children:e})}],75858)},82574,e=>{"use strict";var t=e.i(13496);let r=(0,t.default)("arrow-down-to-line",[["path",{d:"M12 17V3",key:"1cwfxf"}],["path",{d:"m6 11 6 6 6-6",key:"12ii2o"}],["path",{d:"M19 21H5",key:"150jfl"}]]),a=(0,t.default)("arrow-up-from-line",[["path",{d:"m18 9-6-6-6 6",key:"kcunyi"}],["path",{d:"M12 3v14",key:"7cf3v8"}],["path",{d:"M5 21h14",key:"11awu3"}]]);e.s(["InputTokensIcon",0,a,"OutputTokensIcon",0,r],82574)},19007,44581,e=>{"use strict";var t=e.i(45650),r=e.i(10364),a=e.i(51958),n=e.i(77224),s=e.i(50395);let o=(0,e.i(13496).default)("tag",[["path",{d:"M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z",key:"vktsd0"}],["circle",{cx:"7.5",cy:"7.5",r:".5",fill:"currentColor",key:"kqv944"}]]);var i=e.i(19455),l=e.i(76639),d=e.i(46798),c=e.i(34960);let u="https://github.com/kishanmundha/agent-session-inspector",h={name:"Agent Session Inspector",description:"A local web UI for reading agent CLI transcripts: what the agent did, how long it took, and where the tokens went. It reads the session files on this machine and never sends them anywhere.",version:"0.1.10",author:{name:"Kishan Mundha",url:"https://github.com/kishanmundha"},repoUrl:u,issuesUrl:`${u}/issues`,releasesUrl:`${u}/releases`};e.s(["APP_INFO",0,h],44581);var f=e.i(46816),p=e.i(75157);function m({className:e}){return(0,t.jsx)("svg",{viewBox:"0 0 16 16",fill:"currentColor",className:e,"aria-hidden":!0,children:(0,t.jsx)("path",{d:"M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27s1.36.09 2 .27c1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8Z"})})}let x={target:"_blank",rel:"noreferrer"};e.s(["AboutDialog",0,function({providers:e,className:u}){let[b,g]=(0,r.useState)(!1),[v,y]=(0,r.useState)(null),j=(0,r.useRef)(!1),w=e??v,k=w?.filter(e=>e.available),N=w?.filter(e=>!e.available)??[];return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(d.Tooltip,{children:[(0,t.jsx)(d.TooltipTrigger,{render:(0,t.jsx)(i.Button,{variant:"outline",size:"icon",onClick:function(){g(!0),e||j.current||(j.current=!0,fetch("/api/providers").then(e=>e.ok?e.json():[]).then(y).catch(()=>y([])))},"aria-label":"About",className:(0,p.cn)("text-muted-foreground",u),children:(0,t.jsx)(s.Info,{className:"size-3.5","aria-hidden":!0})})}),(0,t.jsx)(d.TooltipContent,{children:"About"})]}),(0,t.jsx)(l.Dialog,{open:b,onOpenChange:g,children:(0,t.jsxs)(l.DialogContent,{children:[(0,t.jsxs)("div",{className:"flex items-center gap-3",children:[(0,t.jsx)("span",{className:"flex size-10 shrink-0 items-center justify-center rounded-lg bg-brand text-brand-foreground",children:(0,t.jsx)(a.Bot,{className:"size-5","aria-hidden":!0})}),(0,t.jsxs)("div",{className:"min-w-0",children:[(0,t.jsx)(l.DialogTitle,{children:h.name}),(0,t.jsxs)("p",{className:"mt-0.5 text-xs text-muted-foreground",children:[(0,t.jsxs)("span",{className:"font-mono",children:["v",h.version]})," · by ",(0,t.jsx)("a",{href:h.author.url,...x,className:"font-medium text-foreground underline-offset-2 hover:underline",children:h.author.name})]})]})]}),(0,t.jsx)(l.DialogDescription,{children:h.description}),(0,t.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,t.jsxs)(i.Button,{variant:"outline",size:"sm",nativeButton:!1,render:(0,t.jsx)("a",{href:h.repoUrl,...x}),children:[(0,t.jsx)(m,{className:"size-3.5"}),"GitHub"]}),(0,t.jsxs)(i.Button,{variant:"outline",size:"sm",nativeButton:!1,render:(0,t.jsx)("a",{href:h.releasesUrl,...x}),children:[(0,t.jsx)(o,{className:"size-3.5","aria-hidden":!0}),"Releases"]}),(0,t.jsxs)(i.Button,{variant:"outline",size:"sm",nativeButton:!1,render:(0,t.jsx)("a",{href:h.issuesUrl,...x}),children:[(0,t.jsx)(n.Bug,{className:"size-3.5","aria-hidden":!0}),"Report an issue"]})]}),(0,t.jsxs)("section",{className:"space-y-2 border-t border-border pt-3",children:[(0,t.jsx)("h3",{className:"text-xs font-medium text-foreground",children:"Data sources"}),k?k.length>0?(0,t.jsx)("ul",{className:"overflow-hidden rounded-lg border border-border text-xs",children:k.map(e=>(0,t.jsxs)("li",{className:"flex items-center gap-2 border-b border-border/60 px-3 py-2 last:border-b-0",children:[(0,t.jsx)("span",{className:(0,p.cn)("size-1.5 shrink-0 rounded-full",(0,f.providerStyle)(e.id).dotCls),"aria-hidden":!0}),(0,t.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,t.jsx)("p",{className:"truncate font-medium text-foreground",children:e.label}),(0,t.jsx)("p",{className:"truncate font-mono text-muted-foreground",children:e.rootDir})]}),(0,t.jsx)("span",{className:"shrink-0 tabular-nums text-muted-foreground",children:`${e.sessionCount??0} ${1===e.sessionCount?"session":"sessions"}`}),(0,t.jsx)(c.CopyButton,{value:e.rootDir,label:"Copy path"})]},e.id))}):(0,t.jsx)("p",{className:"text-xs text-muted-foreground",children:"No agent directories found."}):(0,t.jsx)("p",{className:"text-xs text-muted-foreground",children:"Loading…"}),N.length>0&&(0,t.jsxs)("p",{className:"text-xs text-muted-foreground",children:[k?.length?"Also supports":"Supports"," ",N.map(e=>e.label).join(", "),"."]})]})]})})]})}],19007)},19390,e=>{"use strict";var t=e.i(45650),r=e.i(10364),a=e.i(75379),n=e.i(75157);let s="\0other";function o(e,t){return"costUSD"===e?(0,a.formatCost)(t):(0,a.formatTokens)(t)??"0"}function i(e){if(e<=0)return 1;let t=10**Math.floor(Math.log10(e));return([1,1.5,2,3,4,5,6,8,10].find(r=>r*t>=e)??10)*t}let l=e=>e.toLocaleDateString([],{month:"short",day:"numeric"});e.s(["OTHER",0,s,"OTHER_COLOR",0,"color-mix(in srgb, var(--muted-foreground) 45%, transparent)","SERIES_COLORS",0,["var(--chart-1)","var(--chart-2)","var(--chart-3)","var(--chart-4)","var(--chart-5)"],"StackedBars",0,function({periods:e,breakdownOf:a,series:d,unit:c}){var u;let[h,f]=(0,r.useState)(null),p=i(Math.max(0,...e.map(e=>e[c]))),m=e.map(e=>(function(e,t,r){let a=new Set(t.map(e=>e.name)),n=0;for(let[t,s]of Object.entries(e))a.has(t)||(n+=s[r]);return t.map(t=>t.name===s?n:e[t.name]?.[r]??0)})(a(e),d,c)),x=null!==h&&h<e.length?h:null,b=d.map((e,t)=>m.reduce((e,r)=>e+r[t],0)),g=null===x?b:m[x],v=g.reduce((e,t)=>e+t,0),y=Math.floor((e.length-1)/2);return(0,t.jsxs)("div",{children:[(0,t.jsxs)("div",{className:"flex gap-2",children:[(0,t.jsxs)("div",{className:"flex h-48 flex-col justify-between text-right text-[10px] leading-none tabular-nums text-muted-foreground",children:[(0,t.jsx)("span",{children:o(c,p)}),(0,t.jsx)("span",{children:o(c,p/2)}),(0,t.jsx)("span",{children:o(c,0)})]}),(0,t.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,t.jsxs)("div",{role:"img","aria-label":`${"costUSD"===c?"Cost":"Tokens"} per ${e[0]?.days===1?"day":"week"} over ${e.length} bars`,className:"relative flex h-48 items-end gap-[2px] border-b border-border",onMouseLeave:()=>f(null),children:[(0,t.jsx)("span",{className:"pointer-events-none absolute inset-x-0 top-0 border-t border-dashed border-border"}),(0,t.jsx)("span",{className:"pointer-events-none absolute inset-x-0 top-1/2 border-t border-dashed border-border"}),e.map((e,r)=>(0,t.jsx)("div",{onMouseEnter:()=>f(r),className:(0,n.cn)("relative flex h-full min-w-0 max-w-12 flex-1 flex-col-reverse",null!==x&&x!==r&&"opacity-50"),children:d.map((e,a)=>m[r][a]>0?(0,t.jsx)("div",{className:"w-full shrink-0 border-t-2 border-card first:border-t-0 last:rounded-t-[3px]",style:{height:`${m[r][a]/p*100}%`,minHeight:2,background:e.color}},e.name):null)},e.start.getTime()))]}),(0,t.jsxs)("div",{className:"mt-1.5 flex justify-between text-[10px] text-muted-foreground",children:[(0,t.jsx)("span",{children:e.length>0&&l(e[0].start)}),e.length>4&&(0,t.jsx)("span",{children:l(e[y].start)}),(0,t.jsx)("span",{children:e.length>1&&l(e[e.length-1].start)})]})]})]}),(0,t.jsxs)("div",{className:"mt-3 flex flex-wrap items-center gap-x-4 gap-y-1.5 text-xs","aria-live":"polite",children:[(0,t.jsxs)("span",{className:"font-medium tabular-nums",children:[null===x?"Whole range":1===(u=e[x]).days?u.start.toLocaleDateString([],{weekday:"short",month:"short",day:"numeric"}):`Week of ${l(u.start)}`," ·"," ",o(c,v)]}),d.map((e,r)=>(0,t.jsxs)("span",{className:"flex min-w-0 items-center gap-1.5 text-muted-foreground",children:[(0,t.jsx)("span",{className:"size-2.5 shrink-0 rounded-[3px]",style:{background:e.color},"aria-hidden":!0}),(0,t.jsx)("span",{className:"max-w-40 truncate",title:e.label,children:e.label}),(0,t.jsx)("span",{className:"tabular-nums text-foreground",children:o(c,g[r])})]},e.name))]})]})},"Treemap",0,function({items:e,unit:r}){let a=e.filter(e=>e.value>0).sort((e,t)=>t.value-e.value),n=a.reduce((e,t)=>e+t.value,0),s=function(e){let t=e.reduce((e,t)=>e+t,0);if(t<=0)return[];let r=e.map(e=>e/t*5600),a=[],n=0,s=0,o=100,i=56,l=0;for(;l<r.length;){let e=Math.min(o,i),t=(t,r,a)=>Math.max(e*e*a/(t*t),t*t/(e*e*r)),d=r[l],c=l+1;for(;c<r.length;){let e=d+r[c];if(t(e,r[c],r[l])>t(d,r[c-1],r[l]))break;d=e,c++}let u=d/e,h=0;for(let e=l;e<c;e++){let t=r[e]/u;a.push(o>=i?{x:n,y:s+h,w:u,h:t}:{x:n+h,y:s,w:t,h:u}),h+=t}o>=i?(n+=u,o-=u):(s+=u,i-=u),l=c}return a}(a.map(e=>e.value));return(0,t.jsx)("div",{className:"relative w-full",style:{aspectRatio:"100 / 56"},role:"img","aria-label":`Share of ${"costUSD"===r?"cost":"tokens"} across ${a.length} groups`,children:a.map((e,a)=>{let i=s[a],l=e.value/n;return(0,t.jsx)("div",{title:`${e.label}: ${o(r,e.value)} (${(100*l).toFixed(1)}%)`,className:"absolute p-px",style:{left:`${i.x/100*100}%`,top:`${i.y/56*100}%`,width:`${i.w/100*100}%`,height:`${i.h/56*100}%`},children:(0,t.jsx)("div",{className:"size-full overflow-hidden rounded-[4px] border-l-[3px] px-1.5 py-1 hover:ring-1 hover:ring-foreground/50",style:{background:`color-mix(in srgb, ${e.color} 28%, var(--card))`,borderColor:e.color},children:i.w>14&&i.h>11&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("span",{className:"block truncate text-xs font-medium",children:e.label}),(0,t.jsxs)("span",{className:"block truncate text-[11px] tabular-nums text-muted-foreground",children:[o(r,e.value)," · ",(100*l).toFixed(1),"%"]})]})})},e.name)})})},"formatUnit",0,o,"niceCeil",0,i])},36558,52558,71932,e=>{"use strict";var t=e.i(45650),r=e.i(10364),a=e.i(93304);let n=(0,e.i(13496).default)("external-link",[["path",{d:"M15 3h6v6",key:"1q9fwt"}],["path",{d:"M10 14 21 3",key:"gplh6r"}],["path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6",key:"a6xqqp"}]]);e.s(["ExternalLink",0,n],52558);var s=e.i(76639),o=e.i(84774),i=e.i(34960),l=e.i(75379);let d=[{label:"Anthropic",url:"https://platform.claude.com/docs/en/about-claude/pricing",match:/^claude/},{label:"OpenAI",url:"https://platform.openai.com/docs/pricing",match:/^(gpt|chatgpt|codex|o\d)/},{label:"Google Gemini",url:"https://ai.google.dev/gemini-api/docs/pricing",match:/^gemini/},{label:"xAI",url:"https://docs.x.ai/docs/models",match:/^grok/},{label:"Mistral",url:"https://mistral.ai/pricing",match:/^(mistral|codestral|devstral|magistral|ministral|pixtral)/},{label:"DeepSeek",url:"https://api-docs.deepseek.com/quick_start/pricing",match:/^deepseek/}],c={label:"OpenRouter",url:"https://openrouter.ai/models"};function u(e){return d.find(t=>t.match.test(e))??{label:c.label,url:`${c.url}?q=${encodeURIComponent(e)}`}}e.s(["CATALOG",0,c,"PRICE_SOURCES",0,d,"sourceOf",0,u],71932);var h=e.i(75157);let f={input:"Uncached input",cacheWrite:"Cache write",cacheWrite1h:"Cache write (1h)",cacheRead:"Cache read",output:"Output"},p=[["Uncached input","new prompt text the model had not seen before."],["Cache write","context stored so later requests can reuse it. A 1-hour cache costs more to write than the default."],["Cache read","stored context reused at a discount. The whole conversation is re-sent on every request, so this grows fastest in long sessions."],["Output","the model's replies, tool calls and reasoning."]],m={target:"_blank",rel:"noreferrer"};function x({model:e,priceKey:r}){if(!r)return(0,t.jsx)(t.Fragment,{children:e});let a=u(r);return(0,t.jsxs)("a",{href:a.url,...m,title:`Check the rates on ${a.label} pricing`,className:"inline-flex items-center gap-1 rounded-sm underline decoration-muted-foreground/50 underline-offset-2 hover:text-brand hover:decoration-current focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring",children:[e,(0,t.jsx)(n,{className:"size-3 text-muted-foreground","aria-hidden":!0}),(0,t.jsxs)("span",{className:"sr-only",children:["(",a.label," pricing, opens in a new tab)"]})]})}function b({path:e}){return(0,t.jsx)("span",{title:`Priced from ${e}, not the bundled table`,className:"ml-2 rounded-sm border border-amber-500/40 bg-amber-500/10 px-1.5 py-px font-sans text-[10px] font-medium uppercase tracking-wider text-amber-700 dark:text-amber-400",children:"Your price"})}function g(e){return`$${e.toLocaleString(void 0,{minimumFractionDigits:2,maximumFractionDigits:4})}`}function v({cost:e,totalLabel:a}){let n=e.byModel.length>1,s=e.unpricedModels.length>0,i=new Set(e.customPriced??[]);return(0,t.jsx)("div",{className:"overflow-hidden rounded-lg border border-border",children:(0,t.jsxs)(o.Table,{className:"text-xs",children:[(0,t.jsx)(o.TableHeader,{children:(0,t.jsxs)(o.TableRow,{className:"bg-muted/60 hover:bg-muted/60",children:[(0,t.jsx)(o.TableHead,{className:"h-8 px-3 text-muted-foreground",children:"Token type"}),(0,t.jsx)(o.TableHead,{className:"h-8 px-3 text-right text-muted-foreground",children:"Tokens"}),(0,t.jsx)(o.TableHead,{className:"h-8 px-3 text-right text-muted-foreground",children:"Rate / 1M"}),(0,t.jsx)(o.TableHead,{className:"h-8 px-3 text-right text-muted-foreground",children:"Cost"})]})}),(0,t.jsx)(o.TableBody,{className:"tabular-nums",children:e.byModel.map(a=>(0,t.jsxs)(r.Fragment,{children:[(0,t.jsxs)(o.TableRow,{className:"bg-muted/30 hover:bg-muted/30",children:[(0,t.jsxs)(o.TableHead,{colSpan:3,scope:"rowgroup",className:"h-auto px-3 py-1.5 font-mono font-semibold",children:[(0,t.jsx)(x,{model:a.model,priceKey:e.priceKeys?.[a.model]}),i.has(a.model)&&(0,t.jsx)(b,{path:e.overridePath})]}),(0,t.jsx)(o.TableCell,{className:"px-3 py-1.5 text-right font-mono font-semibold text-foreground",children:n&&null!==a.costUSD&&(0,l.formatCost)(a.costUSD)})]}),e.lines.filter(e=>e.model===a.model).map(e=>(0,t.jsxs)(o.TableRow,{className:"border-border/60",children:[(0,t.jsx)(o.TableCell,{className:"px-3 py-1.5 text-foreground",children:f[e.kind]}),(0,t.jsx)(o.TableCell,{className:"px-3 py-1.5 text-right font-mono",children:e.tokens.toLocaleString()}),(0,t.jsx)(o.TableCell,{className:"px-3 py-1.5 text-right font-mono",children:null===e.rate?"—":g(e.rate)}),(0,t.jsx)(o.TableCell,{className:"px-3 py-1.5 text-right font-mono text-foreground",children:null===e.usd?(0,t.jsx)("span",{className:"font-sans text-muted-foreground",children:"no price"}):(0,l.formatCost)(e.usd)})]},`${e.kind}-${e.rate}`))]},a.model))}),(0,t.jsx)(o.TableFooter,{className:"bg-muted/60",children:(0,t.jsxs)(o.TableRow,{className:"hover:bg-transparent",children:[(0,t.jsx)(o.TableHead,{colSpan:3,scope:"row",className:"h-auto px-3 py-2 font-semibold",children:a}),(0,t.jsxs)(o.TableCell,{className:"px-3 py-2 text-right font-mono font-bold tabular-nums text-foreground",children:[(0,l.formatCost)(e.totalUSD),s&&"+"]})]})})]})})}e.s(["CLASS_LABEL",0,f,"CostDialog",0,function({cost:e,open:n,onOpenChange:o,scope:l}){let d,c=e.unpricedModels.length>0,u=Object.keys(e.prices).length>0?(d=Object.entries(e.prices).map(([e,t])=>{let r=(t??[{input:0,output:0}]).map(e=>` ${JSON.stringify(e).replace(/([{,:])/g,"$1 ").replace("}"," }")}`).join(",\n");return` ${JSON.stringify(e)}: [
2
+ ${r}
3
+ ]`}),`{
4
+ ${d.join(",\n")}
5
+ }`):null,f=e.customPriced??[],[m,x]=(0,r.useState)(c);return(0,t.jsx)(s.Dialog,{open:n,onOpenChange:o,children:(0,t.jsxs)(s.DialogContent,{className:"gap-0 overflow-hidden p-0 sm:max-w-xl",children:[(0,t.jsxs)("div",{className:"space-y-1.5 border-b border-border px-5 pt-5 pb-3",children:[(0,t.jsx)(s.DialogTitle,{children:"How this cost is estimated"}),(0,t.jsxs)(s.DialogDescription,{children:[l?(0,t.jsxs)(t.Fragment,{children:["This is what the tokens of ",l.sessions.toLocaleString()," session",1===l.sessions?"":"s"," (",l.period,") would cost on the pay-per-token API at list prices."]}):(0,t.jsx)(t.Fragment,{children:"This is what the session’s tokens would cost on the pay-per-token API at list prices."})," ","It is not a bill: on a subscription or a request-based plan you pay your plan price, however many tokens a session uses."]})]}),(0,t.jsxs)("div",{className:"flex min-h-0 shrink! flex-col gap-4 overflow-y-auto px-5 pt-4 pb-5 *:shrink-0",children:[(0,t.jsx)(v,{cost:e,totalLabel:e.inherited?"This session":"Total"}),(0,t.jsxs)("p",{className:"text-xs text-muted-foreground",children:["Each row is tokens ÷ 1,000,000 × rate, using the list price on the day of the request. Click a model name to check its rates on the vendor’s price list.",c&&(0,t.jsxs)(t.Fragment,{children:[" ","No price is known for ",e.unpricedModels.join(", "),", so the total leaves ",e.unpricedModels.length>1?"them":"it"," out."]})]}),f.length>0&&(0,t.jsxs)("p",{className:"rounded-lg border border-amber-500/30 bg-amber-500/5 px-3 py-2 text-xs leading-relaxed text-muted-foreground",children:[(0,t.jsx)("span",{className:"font-medium text-foreground",children:"Custom prices in use."})," ",(0,t.jsx)("code",{className:"font-mono text-foreground",children:e.overridePath})," sets the price for ",(0,t.jsx)("span",{className:"font-mono text-foreground",children:f.join(", ")}),", in place of the bundled table."]}),e.inherited&&(0,t.jsxs)("div",{className:"space-y-2 border-t border-border pt-3",children:[(0,t.jsxs)("div",{className:"space-y-1",children:[(0,t.jsx)("h3",{className:"text-sm font-medium text-foreground",children:"Inherited from the forked session"}),(0,t.jsx)("p",{className:"text-xs leading-relaxed text-muted-foreground",children:"This session is a fork, so it opens with a copy of its parent’s history. Those requests were made, and are counted, in the parent session; they are listed here for reference and are not part of this session’s cost or of any usage total."})]}),(0,t.jsx)(v,{cost:e.inherited,totalLabel:"Inherited"})]}),(0,t.jsx)("dl",{className:"space-y-1.5 border-t border-border pt-3 text-xs leading-relaxed text-muted-foreground",children:p.map(([e,r])=>(0,t.jsxs)("div",{children:[(0,t.jsxs)("dt",{className:"inline font-medium text-foreground",children:[e,": "]}),(0,t.jsx)("dd",{className:"inline",children:r})]},e))}),(0,t.jsxs)("div",{className:"overflow-hidden rounded-lg border border-border bg-card text-xs",children:[(0,t.jsxs)("button",{type:"button",onClick:()=>x(!m),"aria-expanded":m,"aria-controls":"cost-dialog-prices",className:"flex w-full items-center gap-2 px-3 py-2 text-left font-medium text-foreground transition-colors hover:bg-muted/60 focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-ring",children:[(0,t.jsx)(a.ChevronRight,{className:(0,h.cn)("size-3.5 shrink-0 text-muted-foreground transition-transform",m&&"rotate-90"),"aria-hidden":!0}),c?"Add the missing price":"Change these prices"]}),(0,t.jsxs)("div",{id:"cost-dialog-prices",hidden:!m,className:"space-y-2 border-t border-border px-3 py-3 leading-relaxed text-muted-foreground",children:[u?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)("p",{children:["Save the block below as"," ",(0,t.jsx)("code",{className:"font-mono text-foreground",children:e.overridePath})," ","and edit the numbers. It replaces the bundled price for the models it lists and takes effect on the next page load."]}),(0,t.jsxs)("div",{className:"relative",children:[(0,t.jsx)("pre",{className:"overflow-x-auto rounded-lg border border-border bg-muted/50 p-3 pr-10 font-mono text-[11px] leading-relaxed text-foreground",children:u}),(0,t.jsx)(i.CopyButton,{value:u,label:"Copy pricing.json",className:"absolute top-1.5 right-1.5"})]})]}):(0,t.jsx)("p",{children:"Loading the prices these models use now…"}),(0,t.jsxs)("ul",{className:"list-disc space-y-1 pl-4",children:[(0,t.jsx)("li",{children:"All prices are US dollars per million tokens."}),(0,t.jsxs)("li",{children:[(0,t.jsx)("code",{className:"font-mono text-foreground",children:"input"})," and"," ",(0,t.jsx)("code",{className:"font-mono text-foreground",children:"output"})," are required. ",(0,t.jsx)("code",{className:"font-mono text-foreground",children:"cacheRead"}),","," ",(0,t.jsx)("code",{className:"font-mono text-foreground",children:"cacheWrite"})," and"," ",(0,t.jsx)("code",{className:"font-mono text-foreground",children:"cacheWrite1h"})," ","are optional: the first two fall back to the input price, and ",(0,t.jsx)("code",{className:"font-mono text-foreground",children:"cacheWrite1h"})," ","to ",(0,t.jsx)("code",{className:"font-mono text-foreground",children:"cacheWrite"}),"."," ",(0,t.jsx)("code",{className:"font-mono text-foreground",children:"fast"})," multiplies every price for requests made in a faster, premium speed tier."]}),(0,t.jsxs)("li",{children:["To record a price change, add a second entry with"," ",(0,t.jsx)("code",{className:"font-mono text-foreground",children:'"from": "YYYY-MM-DD"'}),". Requests before that day keep the old price."]})]})]})]})]})]})})},"formatRate",0,g],36558)},87486,e=>{"use strict";var t=e.i(29494),r=e.i(50403),a=e.i(94237),n=e.i(75157);let s=(0,a.cva)("group/badge inline-flex h-5 w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-4xl border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-all focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3!",{variants:{variant:{default:"bg-primary text-primary-foreground [a]:hover:bg-primary/80",secondary:"bg-secondary text-secondary-foreground [a]:hover:bg-secondary/80",destructive:"bg-destructive/10 text-destructive focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:focus-visible:ring-destructive/40 [a]:hover:bg-destructive/20",outline:"border-border text-foreground [a]:hover:bg-muted [a]:hover:text-muted-foreground",ghost:"hover:bg-muted hover:text-muted-foreground dark:hover:bg-muted/50",link:"text-primary underline-offset-4 hover:underline"}},defaultVariants:{variant:"default"}});e.s(["Badge",0,function({className:e,variant:a="default",render:o,...i}){var l;return l={defaultTagName:"span",props:(0,t.mergeProps)({className:(0,n.cn)(s({variant:a}),e)},i),render:o,state:{slot:"badge",variant:a}},(0,r.useRenderElement)(l.defaultTagName??"div",l,l)}],87486)},59684,34960,e=>{"use strict";var t=e.i(45650);e.s([],88752),e.i(88752);var r=e.i(10364),a=e.i(19458),n=e.i(2304),s=e.i(82420);let o=r.createContext(void 0);function i(){let e=r.useContext(o);if(void 0===e)throw Error((0,s.default)(53));return e}var l=e.i(50403);function d(e,t,r){if(!e)return 0;let a=getComputedStyle(e),n=`${t}${"x"===r?"Inline":"Block"}`,s=parseFloat(a[`${n}Start`]);return"x"===r&&"margin"===t?2*s:s+parseFloat(a[`${n}End`])}var c=e.i(96100),u=e.i(99281);let h=e=>t=>t?{[e]:""}:null,f={hasOverflowX:h("data-has-overflow-x"),hasOverflowY:h("data-has-overflow-y"),overflowXStart:h("data-overflow-x-start"),overflowXEnd:h("data-overflow-x-end"),overflowYStart:h("data-overflow-y-start"),overflowYEnd:h("data-overflow-y-end"),cornerHidden:()=>null};var p=e.i(29148),m=e.i(63370);let x={x:0,y:0},b={width:0,height:0},g={xStart:!1,xEnd:!1,yStart:!1,yEnd:!1},v={x:!0,y:!0,corner:!0},y=r.forwardRef(function(e,s){var i;let h,{render:y,className:j,overflowEdgeThreshold:w,style:k,...N}=e,{xStart:S,xEnd:C,yStart:T,yEnd:R}=(h="number"==typeof(i=w)?{xStart:i,xEnd:i,yStart:i,yEnd:i}:i,{xStart:Math.max(0,h?.xStart||0),xEnd:Math.max(0,h?.xEnd||0),yStart:Math.max(0,h?.yStart||0),yEnd:Math.max(0,h?.yEnd||0)}),E=(0,u.useBaseUiId)(),M=(0,n.useTimeout)(),I=(0,n.useTimeout)(),{nonce:A,disableStyleElements:L}=(0,m.useCSPContext)(),[$,P]=r.useState(!1),[D,O]=r.useState(!1),[z,H]=r.useState(!1),[B,U]=r.useState(!1),[W,_]=r.useState(!1),[q,F]=r.useState(b),[V,Y]=r.useState(b),[K,G]=r.useState(g),[X,J]=r.useState(v),Z=r.useRef(null),Q=r.useRef(null),ee=r.useRef(null),et=r.useRef(null),er=r.useRef(null),ea=r.useRef(null),en=r.useRef(null),es=r.useRef(null),eo=r.useRef(0),ei=r.useRef(0),el=r.useRef(0),ed=r.useRef(0),ec=r.useRef("vertical"),eu=r.useRef(x),eh=r.useRef(null);function ef(e){let t=e?H:O;t(!0),(e?M:I).start(500,()=>{t(!1)})}let ep=(0,a.useStableCallback)(e=>{let t=e.x-eu.current.x,r=e.y-eu.current.y;eu.current=e,0!==r&&ef(!0),0!==t&&ef(!1)}),em=(0,a.useStableCallback)(()=>{let e=Q.current;e&&null===eh.current&&(eh.current=e.style.scrollSnapType,e.style.scrollSnapType="none")}),ex=(0,a.useStableCallback)(e=>{if(0!==e.button)return;if(null!==es.current){let e="vertical"===ec.current?er.current:ea.current;if(e?.hasPointerCapture(es.current))return}es.current=e.pointerId,eo.current=e.clientY,ei.current=e.clientX,ec.current=e.currentTarget.getAttribute("data-orientation");let t=Q.current;t&&(el.current=t.scrollTop,ed.current=t.scrollLeft,em());let r="vertical"===ec.current?er.current:ea.current;r?.setPointerCapture(e.pointerId)}),eb=(0,a.useStableCallback)(e=>{if(e.pointerId!==es.current)return;es.current=null,("vertical"===ec.current?H:O)(!1),null!==eh.current&&(Q.current&&(Q.current.style.scrollSnapType=eh.current),eh.current=null);let t="vertical"===ec.current?er.current:ea.current;t?.hasPointerCapture(e.pointerId)&&t.releasePointerCapture(e.pointerId)}),eg=(0,a.useStableCallback)(e=>{if(e.pointerId!==es.current)return;if(e.buttons%2==0)return void eb(e);let t=Q.current;if(!t)return;let r="vertical"===ec.current,a=r?er.current:ea.current,n=r?ee.current:et.current;if(!a||!n)return;let s=r?"y":"x",o=d(n,"padding",s),i=d(a,"margin",s),l=r?a.offsetHeight:a.offsetWidth,c=(r?n.offsetHeight:n.offsetWidth)-l-o-i,u=r?e.clientY-eo.current:e.clientX-ei.current,h=r?t.scrollHeight:t.scrollWidth,f=r?t.clientHeight:t.clientWidth,p=(r?el.current:ed.current)+(c<=0?0:u/c)*(h-f);r?t.scrollTop=p:t.scrollLeft=p,e.preventDefault(),ef(r)});function ev(e){U("touch"===e.pointerType)}function ey(e){ev(e),"touch"!==e.pointerType&&P((0,p.contains)(Z.current,e.target))}let ej=r.useMemo(()=>({scrolling:D||z,hasOverflowX:!X.x,hasOverflowY:!X.y,overflowXStart:K.xStart,overflowXEnd:K.xEnd,overflowYStart:K.yStart,overflowYEnd:K.yEnd,cornerHidden:X.corner}),[D,z,X.x,X.y,X.corner,K]),ew={role:"presentation",onPointerEnter:ey,onPointerMove:ey,onPointerDown:ev,onPointerLeave(){P(!1)},style:{position:"relative","--scroll-area-corner-height":`${q.height}px`,"--scroll-area-corner-width":`${q.width}px`}},ek=(0,l.useRenderElement)("div",e,{state:ej,ref:[s,Z],props:[ew,N],stateAttributesMapping:f}),eN=r.useMemo(()=>({handlePointerDown:ex,handlePointerMove:eg,handlePointerUp:eb,handleScroll:ep,disableViewportSnap:em,cornerSize:q,setCornerSize:F,thumbSize:V,setThumbSize:Y,hasMeasuredScrollbar:W,setHasMeasuredScrollbar:_,touchModality:B,cornerRef:en,scrollingX:D,scrollingY:z,hovering:$,setHovering:P,viewportRef:Q,scrollbarYRef:ee,scrollbarXRef:et,thumbYRef:er,thumbXRef:ea,rootId:E,hiddenState:X,setHiddenState:J,overflowEdges:K,setOverflowEdges:G,viewportState:ej,overflowEdgeThreshold:{xStart:S,xEnd:C,yStart:T,yEnd:R}}),[ex,eg,eb,ep,em,q,V,W,B,D,z,$,E,X,K,ej,S,C,T,R]);return(0,t.jsxs)(o.Provider,{value:eN,children:[!L&&c.styleDisableScrollbar.getElement(A),ek]})});var j=e.i(61362),w=e.i(33858);let k=r.createContext(void 0);var N=e.i(21023),S=e.i(91338),C=e.i(98934);let T=["--scroll-area-overflow-x-start","--scroll-area-overflow-x-end","--scroll-area-overflow-y-start","--scroll-area-overflow-y-end"],R=!1,E=r.forwardRef(function(e,s){let{render:o,className:u,style:h,...p}=e,{viewportRef:m,scrollbarYRef:x,scrollbarXRef:b,thumbYRef:g,thumbXRef:v,cornerRef:y,cornerSize:S,setCornerSize:E,setThumbSize:A,rootId:L,setHiddenState:$,hiddenState:P,setHasMeasuredScrollbar:D,handleScroll:O,touchModality:z,setHovering:H,setOverflowEdges:B,overflowEdgeThreshold:U,viewportState:W}=i(),_=(0,N.useDirection)(),q=r.useRef(!0),F=r.useRef([NaN,NaN,NaN,NaN]),V=(0,n.useTimeout)(),Y=(0,n.useTimeout)(),K=(0,a.useStableCallback)(()=>{var e;let t,r,a=m.current,n=x.current,s=b.current,o=g.current,i=v.current,l=y.current;if(!a)return;let c=a.scrollHeight,u=a.scrollWidth,h=a.clientHeight,f=a.clientWidth,p=a.scrollTop,j=a.scrollLeft,w=F.current,k=Number.isNaN(w[0]);if(w[0]=h,w[1]=c,w[2]=f,w[3]=u,k&&D(!0),0===c||0===u)return;let N=(t=(e=a).clientHeight>=e.scrollHeight,{y:t,x:r=e.clientWidth>=e.scrollWidth,corner:t||r}),R=N.y,L=N.x,P=f/u,O=h/c,z=Math.max(0,u-f),H=Math.max(0,c-h),W=0,q=0;L||(W=(0,C.normalizeScrollOffset)("rtl"===_?-j:j,z),q=z-W);let V=R?0:(0,C.normalizeScrollOffset)(p,H),Y=R?0:H-V,K=L?0:f,G=R?0:h,X=0,J=0;L||R||(X=n?.offsetWidth||0,J=s?.offsetHeight||0);let Z=0===S.width&&0===S.height,Q=Z?X:0,ee=Z?J:0,et=d(s,"padding","x"),er=d(n,"padding","y"),ea=d(i,"margin","x"),en=d(o,"margin","y"),es=K-et-ea,eo=G-er-en,ei=s?Math.min(s.offsetWidth-Q,es):es,el=n?Math.min(n.offsetHeight-ee,eo):eo,ed=Math.max(16,ei*P),ec=Math.max(16,el*O);if(A(e=>M(e,{width:ed,height:ec})),n&&o){let e=n.offsetHeight-ec-er-en,t=I(o,"--scroll-area-thumb-height",p,H,c,ec,e);o.style.transform=`translate3d(0,${t}px,0)`}if(s&&i){let e=s.offsetWidth-ed-et-ea,t=I(i,"--scroll-area-thumb-width","rtl"===_?-j:j,z,u,ed,e);i.style.transform=`translate3d(${"rtl"===_?-t:t}px,0,0)`}let eu=[W,q,V,Y];T.forEach((e,t)=>{a.style.setProperty(e,`${eu[t]}px`)}),l&&E(e=>M(e,{width:X,height:J})),$(e=>M(e,N));let eh={xStart:!L&&W>U.xStart,xEnd:!L&&q>U.xEnd,yStart:!R&&V>U.yStart,yEnd:!R&&Y>U.yEnd};B(e=>M(e,eh))});function G(){q.current=!1}(0,j.useIsoLayoutEffect)(()=>{R||w.platform.engine.webkit||("u">typeof CSS&&"registerProperty"in CSS&&T.forEach(e=>{try{CSS.registerProperty({name:e,syntax:"<length>",inherits:!1,initialValue:"0px"})}catch{}}),R=!0)},[]),(0,j.useIsoLayoutEffect)(()=>{queueMicrotask(K)},[K,P,_,U.xStart,U.xEnd,U.yStart,U.yEnd]),(0,j.useIsoLayoutEffect)(()=>{m.current?.matches(":hover")&&H(!0)},[m,H]),(0,j.useIsoLayoutEffect)(()=>{let e=m.current;if("u"<typeof ResizeObserver||!e)return;let t=!1,r=new ResizeObserver(()=>{if(!t){t=!0;let r=F.current;if(r[0]===e.clientHeight&&r[1]===e.scrollHeight&&r[2]===e.clientWidth&&r[3]===e.scrollWidth)return}K()});return r.observe(e),Y.start(0,()=>{let t=e.getAnimations({subtree:!0});0!==t.length&&Promise.allSettled(t.map(e=>e.finished)).then(K).catch(()=>{})}),()=>{r.disconnect(),Y.clear()}},[K,m,Y]);let X={role:"presentation",...L&&{"data-id":`${L}-viewport`},tabIndex:P.x&&P.y?-1:0,className:c.styleDisableScrollbar.className,style:{overflow:"scroll"},onScroll(){m.current&&(K(),(z||!q.current)&&O({x:m.current.scrollLeft,y:m.current.scrollTop}),V.start(100,()=>{q.current=!0}))},onWheel:G,onPointerMove:G,onPointerEnter:G,onKeyDown:G},J=(0,l.useRenderElement)("div",e,{ref:[s,m],state:W,props:[X,p],stateAttributesMapping:f}),Z=r.useMemo(()=>({computeThumbPosition:K}),[K]);return(0,t.jsx)(k.Provider,{value:Z,children:J})});function M(e,t){for(let r in t)if(e[r]!==t[r])return t;return e}function I(e,t,r,a,n,s,o){let i=(0,S.clamp)(r,0,a),l=r-i,d=Math.max(16,s*n/(n+Math.abs(l)));return e.style.setProperty(t,l?`${d}px`:""),(a?i/a*o:0)+(l>0?s-d:0)}var A=e.i(78645);let L=r.createContext(void 0),$=r.forwardRef(function(e,a){let{render:n,className:s,orientation:o="vertical",keepMounted:c=!1,style:u,...h}=e,{hovering:m,scrollingX:x,scrollingY:b,hiddenState:g,scrollbarYRef:v,scrollbarXRef:y,viewportRef:j,thumbYRef:w,thumbXRef:k,handlePointerDown:S,handlePointerUp:C,handleScroll:T,disableViewportSnap:R,rootId:E,thumbSize:M,hasMeasuredScrollbar:I,viewportState:$}=i(),P="vertical"===o,D={...$,hovering:m,scrolling:P?b:x,orientation:o},O=(0,N.useDirection)(),z=!I&&!c,H=P?g.y:g.x,B=c||!H;r.useEffect(()=>{if(!B)return;let e=j.current,t=P?v.current:y.current;if(t)return(0,A.addEventListener)(t,"wheel",function(t){if(!e||t.ctrlKey)return;let r=!P,a=r?"scrollLeft":"scrollTop",n=r?t.deltaX:t.deltaY;if(0===n)return;let s=r?e.scrollWidth-e.clientWidth:e.scrollHeight-e.clientHeight,o=r&&"rtl"===O?-s:0,i=r&&"rtl"===O?0:s,l=e[a];l<=o&&n<0||l>=i&&n>0||(t.preventDefault(),e[a]=Math.min(i,Math.max(o,l+n)),T({x:e.scrollLeft,y:e.scrollTop}))},{passive:!1})},[O,T,P,y,v,B,j]);let U={...E&&{"data-id":`${E}-scrollbar`},onPointerDown(e){if(0!==e.button)return;let t=(0,p.getTarget)(e.nativeEvent),r=P?w.current:k.current;if(r&&(0,p.contains)(r,t))return;let a=j.current;if(!a)return;let n=P?v.current:y.current;if(!r||!n)return;let s=P?"y":"x",o=d(r,"margin",s),i=d(n,"padding",s),l=P?r.offsetHeight:r.offsetWidth,c=n.getBoundingClientRect(),u=P?e.clientY-c.top-l/2-i+o/2:e.clientX-c.left-l/2-i+o/2,h=P?a.scrollHeight:a.scrollWidth,f=P?a.clientHeight:a.clientWidth,m=(P?n.offsetHeight:n.offsetWidth)-l-i-o;if(m<=0)return;let x=u/m,b=h-f;R(),P?a.scrollTop=x*b:"rtl"===O?a.scrollLeft=-(1-x)*b:a.scrollLeft=x*b,T({x:a.scrollLeft,y:a.scrollTop}),S(e)},onPointerUp:C,onPointerCancel:C,style:{position:"absolute",touchAction:"none",WebkitUserSelect:"none",userSelect:"none",visibility:z?"hidden":void 0,...P?{top:0,bottom:"var(--scroll-area-corner-height)",insetInlineEnd:0,"--scroll-area-thumb-height":`${M.height}px`}:{insetInlineStart:0,insetInlineEnd:"var(--scroll-area-corner-width)",bottom:0,"--scroll-area-thumb-width":`${M.width}px`}}},W=(0,l.useRenderElement)("div",e,{ref:[a,P?v:y],state:D,props:[U,h],stateAttributesMapping:f});return B?(0,t.jsx)(L.Provider,{value:o,children:W}):null}),P=r.forwardRef(function(e,t){let{render:a,className:n,style:o,...d}=e,{computeThumbPosition:c}=function(){let e=r.useContext(k);if(void 0===e)throw Error((0,s.default)(55));return e}(),{hasMeasuredScrollbar:u,viewportState:h}=i(),p=r.useRef(null),m=r.useRef(u);return(0,j.useIsoLayoutEffect)(()=>{if("u"<typeof ResizeObserver)return;let e=!1,t=new ResizeObserver(()=>{(e||(e=!0,m.current))&&c()});return p.current&&t.observe(p.current),()=>{t.disconnect()}},[c]),(0,l.useRenderElement)("div",e,{ref:[t,p],state:h,stateAttributesMapping:f,props:[{role:"presentation",style:{minWidth:"fit-content"}},d]})}),D=r.forwardRef(function(e,t){let{render:a,className:n,style:o,...d}=e,{thumbYRef:c,thumbXRef:u,handlePointerDown:h,handlePointerMove:f,handlePointerUp:p,scrollingX:m,scrollingY:x,hasMeasuredScrollbar:b}=i(),g=function(){let e=r.useContext(L);if(void 0===e)throw Error((0,s.default)(54));return e}(),v="vertical"===g;return(0,l.useRenderElement)("div",e,{ref:[t,v?c:u],state:{scrolling:v?x:m,orientation:g},props:[{onPointerDown:h,onPointerMove:f,onPointerUp:p,onPointerCancel:p,style:{visibility:b?void 0:"hidden",...v?{height:"var(--scroll-area-thumb-height)"}:{width:"var(--scroll-area-thumb-width)"}}},d]})}),O=r.forwardRef(function(e,t){let{render:r,className:a,style:n,...s}=e,{cornerRef:o,cornerSize:d,hiddenState:c}=i(),u=(0,l.useRenderElement)("div",e,{ref:[t,o],props:[{style:{position:"absolute",bottom:0,insetInlineEnd:0,width:d.width,height:d.height}},s]});return c.corner?null:u});e.s(["Content",0,P,"Corner",0,O,"Root",0,y,"Scrollbar",0,$,"Thumb",0,D,"Viewport",0,E],55500);var z=e.i(55500),z=z,H=e.i(75157);function B({className:e,orientation:r="vertical",...a}){return(0,t.jsx)(z.Scrollbar,{"data-slot":"scroll-area-scrollbar","data-orientation":r,orientation:r,className:(0,H.cn)("flex touch-none p-px transition-colors select-none data-horizontal:h-2.5 data-horizontal:flex-col data-horizontal:border-t data-horizontal:border-t-transparent data-vertical:h-full data-vertical:w-2.5 data-vertical:border-l data-vertical:border-l-transparent",e),...a,children:(0,t.jsx)(z.Thumb,{"data-slot":"scroll-area-thumb",className:"relative flex-1 rounded-full bg-border"})})}e.s(["ScrollArea",0,function({className:e,children:r,...a}){return(0,t.jsxs)(z.Root,{"data-slot":"scroll-area",className:(0,H.cn)("relative",e),...a,children:[(0,t.jsx)(z.Viewport,{"data-slot":"scroll-area-viewport",className:"size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1",children:r}),(0,t.jsx)(B,{}),(0,t.jsx)(z.Corner,{})]})}],59684);var U=e.i(250),U=U;let W=(0,e.i(13496).default)("copy",[["rect",{width:"14",height:"14",x:"8",y:"8",rx:"2",ry:"2",key:"17jyea"}],["path",{d:"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2",key:"zix9uf"}]]);var _=e.i(98007),q=e.i(19455),F=e.i(46798);e.s(["CopyButton",0,function({value:e,label:a="Copy",size:n="xs",icon:s=W,className:o,children:i}){let[l,d]=(0,r.useState)("idle"),c=(0,r.useRef)(void 0);async function u(){try{await navigator.clipboard.writeText("function"==typeof e?e():e),d("copied")}catch{d("failed")}window.clearTimeout(c.current),c.current=window.setTimeout(()=>d("idle"),1600)}(0,r.useEffect)(()=>()=>window.clearTimeout(c.current),[]);let h="copied"===l?U.default:"failed"===l?_.X:s;return(0,t.jsxs)(F.Tooltip,{children:[(0,t.jsx)(F.TooltipTrigger,{render:(0,t.jsxs)(q.Button,{variant:"ghost",size:i?n:`icon-${n}`,onClick:u,"aria-label":a,className:(0,H.cn)("text-muted-foreground","copied"===l&&"text-emerald-600 dark:text-emerald-400","failed"===l&&"text-destructive",o),children:[(0,t.jsx)(h,{className:"size-3.5","aria-hidden":!0}),i]})}),(0,t.jsx)(F.TooltipContent,{children:"copied"===l?"Copied":"failed"===l?"Copy failed":a})]})}],34960)},84774,e=>{"use strict";var t=e.i(45650),r=e.i(75157);e.s(["Table",0,function({className:e,...a}){return(0,t.jsx)("div",{"data-slot":"table-container",className:"relative w-full overflow-x-auto",children:(0,t.jsx)("table",{"data-slot":"table",className:(0,r.cn)("w-full caption-bottom text-sm",e),...a})})},"TableBody",0,function({className:e,...a}){return(0,t.jsx)("tbody",{"data-slot":"table-body",className:(0,r.cn)("[&_tr:last-child]:border-0",e),...a})},"TableCell",0,function({className:e,...a}){return(0,t.jsx)("td",{"data-slot":"table-cell",className:(0,r.cn)("p-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0",e),...a})},"TableFooter",0,function({className:e,...a}){return(0,t.jsx)("tfoot",{"data-slot":"table-footer",className:(0,r.cn)("border-t bg-muted/50 font-medium [&>tr]:last:border-b-0",e),...a})},"TableHead",0,function({className:e,...a}){return(0,t.jsx)("th",{"data-slot":"table-head",className:(0,r.cn)("h-10 px-2 text-left align-middle font-medium whitespace-nowrap text-foreground [&:has([role=checkbox])]:pr-0",e),...a})},"TableHeader",0,function({className:e,...a}){return(0,t.jsx)("thead",{"data-slot":"table-header",className:(0,r.cn)("[&_tr]:border-b",e),...a})},"TableRow",0,function({className:e,...a}){return(0,t.jsx)("tr",{"data-slot":"table-row",className:(0,r.cn)("border-b transition-colors hover:bg-muted/50 has-aria-expanded:bg-muted/50 data-[state=selected]:bg-muted",e),...a})}])},77572,e=>{"use strict";var t,r=e.i(45650);e.s([],25931),e.i(25931);var a=e.i(10364),n=e.i(25587),s=e.i(61362),o=e.i(19458),i=e.i(50403),l=e.i(6385),d=e.i(82420);let c=a.createContext(void 0);function u(){let e=a.useContext(c);if(void 0===e)throw Error((0,d.default)(64));return e}let h={tabActivationDirection:e=>({"data-activation-direction":e})};var f=e.i(51068),p=e.i(99389);let m=a.forwardRef(function(e,t){let{className:d,defaultValue:u=0,onValueChange:m,orientation:g="horizontal",render:v,value:y,style:j,...w}=e,k=void 0!==e.defaultValue,N=a.useRef([]),[S,C]=a.useState(()=>new Map),[T,R]=(0,n.useControlled)({controlled:y,default:u,name:"Tabs",state:"value"}),E=void 0!==y,[M,I]=a.useState(()=>new Map),A=a.useRef(void 0),L=a.useCallback(e=>x(M,e),[M]),[$,P]=a.useState(()=>({previousValue:T,tabActivationDirection:"none"})),{previousValue:D,tabActivationDirection:O}=$,z=O,H=!1;D!==T&&(z=b(D,T,g,M),H=null!=D&&null!=T&&null==L(T));let B=H?D:T,U=D!==B||O!==z;(0,s.useIsoLayoutEffect)(()=>{U&&P({previousValue:B,tabActivationDirection:z})},[B,U,z]);let W=(0,o.useStableCallback)((e,t)=>{t.activationDirection=b(T,e,g,M),m?.(e,t),t.isCanceled||R(e)}),_=(0,o.useStableCallback)((e,t)=>{m?.(e,(0,f.createChangeEventDetails)(t,void 0,void 0,{activationDirection:"none"}))}),q=(0,o.useStableCallback)((e,t)=>(C(r=>{let a=new Map(r);return a.set(e,t),a}),()=>{C(r=>{if(r.get(e)!==t)return r;let a=new Map(r);return a.delete(e),a})})),F=a.useCallback(e=>S.get(e),[S]),V=a.useCallback(e=>{for(let t of M.values())if(e===t.value)return t.id},[M]),Y=a.useMemo(()=>({getTabElementBySelectedValue:L,getTabIdByPanelValue:V,getTabPanelIdByValue:F,onValueChange:W,orientation:g,registerMountedTabPanel:q,setTabMap:I,tabActivationDirection:z,value:T}),[L,V,F,W,g,q,I,z,T]),K=a.useMemo(()=>{for(let e of M.values())if(e.value===T)return e},[M,T]),G=a.useMemo(()=>{for(let e of M.values())if(!e.disabled)return e.value},[M]),X=a.useRef(!k),J=a.useRef(u),Z=a.useRef(k),Q=a.useRef(!1);(0,s.useIsoLayoutEffect)(()=>{if(E)return;function e(e,t){R(e),P({previousValue:e,tabActivationDirection:"none"}),_(e,t),X.current=!1}if(0===M.size){Q.current&&null!==T&&!A.current?.isConnected&&e(null,p.REASONS.missing);return}Q.current=!0,A.current=M.keys().next().value;let t=K?.disabled,r=null==K&&null!==T;if(t||T!==J.current||(Z.current=!1),Z.current&&t&&T===J.current)return;let a=X.current;if(t||r){let r=G??null;if(T===r){X.current=!1;return}let n=p.REASONS.missing;a?n=p.REASONS.initial:t&&(n=p.REASONS.disabled),e(r,n);return}a&&null!=K&&(_(T,p.REASONS.initial),X.current=!1)},[G,E,_,K,R,M,T]);let ee={orientation:g,tabActivationDirection:z},et=(0,i.useRenderElement)("div",e,{state:ee,ref:t,props:w,stateAttributesMapping:h});return(0,r.jsx)(c.Provider,{value:Y,children:(0,r.jsx)(l.CompositeList,{elementsRef:N,children:et})})});function x(e,t){for(let[r,a]of e.entries())if(t===a.value)return r;return null}function b(e,t,r,a){if(null==e||null==t)return"none";let[n,s,o]="horizontal"===r?["left","left","right"]:["top","up","down"],i=x(a,e),l=x(a,t);if(null==i||null==l)return i!==l&&("number"==typeof e||"string"==typeof e)&&typeof e==typeof t?t>e?o:s:"none";let d=i.getBoundingClientRect()[n],c=l.getBoundingClientRect()[n];return c<d?s:c>d?o:"none"}var g=e.i(52515),v=e.i(99281),y=e.i(45034),j=e.i(93901),w=e.i(1788),k=e.i(60857);let N=a.createContext(void 0);function S(){let e=a.useContext(N);if(void 0===e)throw Error((0,d.default)(65));return e}var C=e.i(29148);let T=a.forwardRef(function(e,t){let{className:r,disabled:n=!1,render:l,value:d,id:c,nativeButton:m=!0,style:x,...b}=e,{value:N,getTabPanelIdByValue:T,onValueChange:R,orientation:E,tabActivationDirection:M}=u(),{activateOnFocus:I,registerTabResizeObserverElement:A,tabsListElement:L}=S(),{highlightedIndex:$,onHighlightedIndexChange:P}=(0,k.useCompositeRootContext)(),D=(0,v.useBaseUiId)(c),O=a.useMemo(()=>({disabled:n,id:D,value:d}),[n,D,d]),{compositeProps:z,compositeRef:H,index:B}=(0,w.useCompositeItem)({metadata:O}),U=d===N,W=a.useRef(!1),_=a.useRef(null),q=(0,o.useStableCallback)(e=>{_.current?.(),_.current=e?A(e):null});(0,s.useIsoLayoutEffect)(()=>{if(W.current){W.current=!1;return}if(U&&B>-1&&$!==B){if(null!=L){let e=(0,C.activeElement)((0,g.ownerDocument)(L));if(e&&(0,C.contains)(L,e))return}n||P(B)}},[U,B,$,P,n,L]);let{getButtonProps:F,buttonRef:V}=(0,y.useButton)({disabled:n,native:m,focusableWhenDisabled:!0}),Y=T(d),K=a.useRef(!1),G=a.useRef(!1);function X(e){R(d,(0,f.createChangeEventDetails)(p.REASONS.none,e.nativeEvent,void 0,{activationDirection:"none"}))}return(0,i.useRenderElement)("button",e,{state:{disabled:n,active:U,orientation:E,tabActivationDirection:M},ref:[t,V,H,q],props:[z,{role:"tab","aria-controls":Y,"aria-selected":U,id:D,onClick:function(e){U||n||X(e)},onFocus:function(e){U||n||I&&(!K.current||G.current)&&X(e)},onPointerDown:function(e){if(U||n)return;K.current=!0,G.current=0===e.button;let t=(0,g.ownerDocument)(e.currentTarget);function r(){K.current=!1,G.current=!1,t.removeEventListener("pointerup",r),t.removeEventListener("pointercancel",r)}t.addEventListener("pointerup",r),t.addEventListener("pointercancel",r)},[j.ACTIVE_COMPOSITE_ITEM]:U?"":void 0,onKeyDownCapture(){W.current=!0}},b,F],stateAttributesMapping:h})});var R=e.i(16428),E=e.i(45549),M=e.i(53076);function I(){return M.NOOP}function A(){return!1}function L(){return!0}var $=e.i(63370);function P(e){let{script:t}=e,{nonce:a}=(0,$.useCSPContext)();return(0,E.useSyncExternalStore)(I,A,L)?(0,r.jsx)("script",{nonce:a,dangerouslySetInnerHTML:{__html:t},suppressHydrationWarning:!0}):null}let D={...h,activeTabPosition:()=>null,activeTabSize:()=>null},O=a.forwardRef(function(e,n){let{className:s,render:o,renderBeforeHydration:l=!1,style:d,...c}=e,{getTabElementBySelectedValue:h,orientation:f,tabActivationDirection:p,value:m}=u(),{tabsListElement:x,registerIndicatorUpdateListener:b}=S(),g=function(){let[,e]=a.useState({});return a.useCallback(()=>{e({})},[])}();a.useEffect(()=>b(g),[b,g]);let v=0,y=0,j=0,w=0,k=0,N=0,C=!1;if(null!=m&&null!=x){let e=h(m);if(null!=e){C=!0;let{width:t,height:r}=(0,R.getCssDimensions)(e),{width:a,height:n}=(0,R.getCssDimensions)(x),s=e.getBoundingClientRect(),o=x.getBoundingClientRect(),i=a>0?o.width/a:1,l=n>0?o.height/n:1;if(i>Number.EPSILON&&l>Number.EPSILON){let e=s.left-o.left,t=s.top-o.top;v=e/i+x.scrollLeft-x.clientLeft,j=t/l+x.scrollTop-x.clientTop}else v=e.offsetLeft,j=e.offsetTop;k=t,N=r,y=x.scrollWidth-v-k,w=x.scrollHeight-j-N}}let T=C?{left:v,right:y,top:j,bottom:w}:null,E=C?{width:k,height:N}:null,M=C?{"--active-tab-left":`${v}px`,"--active-tab-right":`${y}px`,"--active-tab-top":`${j}px`,"--active-tab-bottom":`${w}px`,"--active-tab-width":`${k}px`,"--active-tab-height":`${N}px`}:void 0,I=C&&k>0&&N>0,A=(0,i.useRenderElement)("span",e,{state:{orientation:f,activeTabPosition:T,activeTabSize:E,tabActivationDirection:p},ref:n,props:[{role:"presentation",style:M,hidden:!I},c,{suppressHydrationWarning:!0}],stateAttributesMapping:D});return null==m?null:(0,r.jsxs)(a.Fragment,{children:[A,l&&(t||(t=(0,r.jsx)(P,{script:""})))]})});var z=e.i(33262),H=e.i(53),B=e.i(11296),U=e.i(4678),W=e.i(68285);let _={...h,...H.transitionStatusMapping},q=a.forwardRef(function(e,t){let{className:r,value:n,render:o,keepMounted:l=!1,style:d,...c}=e,{value:h,getTabIdByPanelValue:f,orientation:p,tabActivationDirection:m,registerMountedTabPanel:x}=u(),b=(0,v.useBaseUiId)(),{ref:g,index:y}=(0,W.useCompositeListItem)(),j=n===h,{mounted:w,transitionStatus:k,setMounted:N}=(0,U.useTransitionStatus)(j),S=!w,C=f(n),T=a.useRef(null),R=(0,i.useRenderElement)("div",e,{state:{hidden:S,orientation:p,tabActivationDirection:m,transitionStatus:k},ref:[t,g,T],props:[{"aria-labelledby":C,hidden:S,id:b,role:"tabpanel",tabIndex:j?0:-1,inert:(0,z.inertValue)(!j),"data-index":y},c],stateAttributesMapping:_});return((0,B.useOpenChangeComplete)({open:j,ref:T,onComplete(){j||N(!1)}}),(0,s.useIsoLayoutEffect)(()=>{if(null!=b&&(!S||l))return x(n,b)},[S,l,n,b,x]),l||w)?R:null});var F=e.i(67149);let V=a.forwardRef(function(e,t){let{activateOnFocus:n=!1,className:i,loopFocus:l=!0,render:d,style:c,...f}=e,{orientation:p,setTabMap:m,tabActivationDirection:x}=u(),[b,g]=a.useState(0),[v,y]=a.useState(null),j=a.useRef(new Set),w=a.useRef(new Set),k=a.useRef(null);(0,s.useIsoLayoutEffect)(()=>{if("u"<typeof ResizeObserver)return;let e=new ResizeObserver(()=>{j.current.forEach(e=>{e()})});return k.current=e,v&&e.observe(v),w.current.forEach(t=>{e.observe(t)}),()=>{e.disconnect(),k.current=null}},[v]);let S=(0,o.useStableCallback)(e=>(j.current.add(e),()=>{j.current.delete(e)})),C=(0,o.useStableCallback)(e=>(w.current.add(e),k.current?.observe(e),()=>{w.current.delete(e),k.current?.unobserve(e)})),T=a.useMemo(()=>({activateOnFocus:n,registerIndicatorUpdateListener:S,registerTabResizeObserverElement:C,tabsListElement:v}),[n,S,C,v]);return(0,r.jsx)(N.Provider,{value:T,children:(0,r.jsx)(F.CompositeRoot,{render:d,className:i,style:c,state:{orientation:p,tabActivationDirection:x},refs:[t,y],props:[{"aria-orientation":"vertical"===p?"vertical":void 0,role:"tablist"},f],stateAttributesMapping:h,highlightedIndex:b,enableHomeAndEndKeys:!0,loopFocus:l,orientation:p,onHighlightedIndexChange:g,onMapChange:m,disabledIndices:M.EMPTY_ARRAY})})});e.s(["Indicator",0,O,"List",0,V,"Panel",0,q,"Root",0,m,"Tab",0,T],11037);var Y=e.i(11037),Y=Y,K=e.i(94237),G=e.i(75157);let X=(0,K.cva)("group/tabs-list inline-flex w-fit items-center justify-center rounded-lg p-[3px] text-muted-foreground group-data-horizontal/tabs:h-8 group-data-vertical/tabs:h-fit group-data-vertical/tabs:flex-col data-[variant=line]:rounded-none",{variants:{variant:{default:"bg-muted",line:"gap-1 bg-transparent"}},defaultVariants:{variant:"default"}});e.s(["Tabs",0,function({className:e,orientation:t="horizontal",...a}){return(0,r.jsx)(Y.Root,{"data-slot":"tabs","data-orientation":t,className:(0,G.cn)("group/tabs flex gap-2 data-horizontal:flex-col",e),...a})},"TabsContent",0,function({className:e,...t}){return(0,r.jsx)(Y.Panel,{"data-slot":"tabs-content",className:(0,G.cn)("flex-1 text-sm outline-none",e),...t})},"TabsList",0,function({className:e,variant:t="default",...a}){return(0,r.jsx)(Y.List,{"data-slot":"tabs-list","data-variant":t,className:(0,G.cn)(X({variant:t}),e),...a})},"TabsTrigger",0,function({className:e,...t}){return(0,r.jsx)(Y.Tab,{"data-slot":"tabs-trigger",className:(0,G.cn)("relative inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-1.5 py-0.5 text-sm font-medium whitespace-nowrap text-foreground/60 transition-all group-data-vertical/tabs:w-full group-data-vertical/tabs:justify-start hover:text-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1 focus-visible:outline-ring disabled:pointer-events-none disabled:opacity-50 has-data-[icon=inline-end]:pr-1 has-data-[icon=inline-start]:pl-1 aria-disabled:pointer-events-none aria-disabled:opacity-50 dark:text-muted-foreground dark:hover:text-foreground group-data-[variant=default]/tabs-list:data-active:shadow-sm group-data-[variant=line]/tabs-list:data-active:shadow-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4","group-data-[variant=line]/tabs-list:bg-transparent group-data-[variant=line]/tabs-list:data-active:bg-transparent dark:group-data-[variant=line]/tabs-list:data-active:border-transparent dark:group-data-[variant=line]/tabs-list:data-active:bg-transparent","data-active:bg-background data-active:text-foreground dark:data-active:border-input dark:data-active:bg-input/30 dark:data-active:text-foreground","after:absolute after:bg-foreground after:opacity-0 after:transition-opacity group-data-horizontal/tabs:after:inset-x-0 group-data-horizontal/tabs:after:bottom-[-5px] group-data-horizontal/tabs:after:h-0.5 group-data-vertical/tabs:after:inset-y-0 group-data-vertical/tabs:after:-right-1 group-data-vertical/tabs:after:w-0.5 group-data-[variant=line]/tabs-list:data-active:after:opacity-100",e),...t})}],77572)},42526,e=>{"use strict";var t=e.i(10364),r=e.i(57864);function a(e,a){return[(0,r.useSearchParams)().get(e)??a,(0,t.useCallback)(t=>{let r=new URL(window.location.href);t===a?r.searchParams.delete(e):r.searchParams.set(e,t),window.history.replaceState(null,"",r)},[e,a])]}e.s(["useQueryParam",0,a,"useTabParam",0,function(e,t){let[r,n]=a("tab",t);return[e.includes(r)?r:t,n]}])}]);
package/app/AGENTS.md ADDED
@@ -0,0 +1,9 @@
1
+ <!-- BEGIN:nextjs-agent-rules -->
2
+
3
+ # This is NOT the Next.js you know
4
+
5
+ This version has breaking changes — APIs, conventions, and file structure may all differ from your training data. Read the relevant guide in `node_modules/next/dist/docs/` (resolved from this file's directory; in monorepos the `next` package may not be visible from the repo root) before writing any code. Heed deprecation notices.
6
+
7
+ This block is written and re-added by `next dev` — verify at `node_modules/next/dist/server/lib/generate-agent-files.js`. Removing it from a diff only re-creates the uncommitted change; committing it with your work keeps the tree clean.
8
+
9
+ <!-- END:nextjs-agent-rules -->
package/app/CLAUDE.md ADDED
@@ -0,0 +1 @@
1
+ @AGENTS.md
@@ -0,0 +1,90 @@
1
+ # Contributing
2
+
3
+ Issues and pull requests are welcome. For a bug, include the agent, your OS and
4
+ Node version, and what the session looked like (never the transcript itself if
5
+ it holds anything private).
6
+
7
+ ## Running from source
8
+
9
+ ```bash
10
+ pnpm install
11
+ pnpm dev
12
+ ```
13
+
14
+ Open [http://localhost:4747](http://localhost:4747).
15
+
16
+ To run it in Docker with the transcript directories mounted read-only:
17
+
18
+ ```bash
19
+ pnpm deploy:docker
20
+ ```
21
+
22
+ CI runs `pnpm lint`, `pnpm build` (which also type-checks) and the report
23
+ commands' bundle on every pull request, so run them before opening one.
24
+
25
+ ## Terminal reports
26
+
27
+ The `usage`, `stats` and `sessions` commands live in `src/cli` and reuse the
28
+ providers and the aggregation in `src/lib`. They ship as one file that
29
+ `scripts/build-cli.mjs` bundles with esbuild. To build and run them from a
30
+ checkout:
31
+
32
+ ```bash
33
+ pnpm cli usage --days 7
34
+ ```
35
+
36
+ pnpm prints its own status lines to stdout before the report, which breaks a
37
+ pipe into `jq`. Pass `--silent` (the short `-s` is not enough) when piping
38
+ `--json` output:
39
+
40
+ ```bash
41
+ pnpm --silent cli usage --days 1 --json | jq '.total.costUSD'
42
+ ```
43
+
44
+ ## Demo data
45
+
46
+ To try the UI without your own transcripts (or to retake the screenshots),
47
+ generate a fake home directory with a few synthetic sessions and point the app
48
+ at it:
49
+
50
+ ```bash
51
+ node scripts/demo-data.mjs /tmp/asi-demo
52
+ HOME=/tmp/asi-demo pnpm dev
53
+ ```
54
+
55
+ ## Adding a provider
56
+
57
+ 1. Write `src/lib/providers/<name>.ts` exporting a `SessionProvider`: `info`,
58
+ `isAvailable`, `listSessions`, `getSession`, plus `listLogs`/`getLogContent`
59
+ (return empty when the agent has no log directory).
60
+ 2. Map its records onto the canonical event types; cap huge payloads before they
61
+ reach the client, and set `resultChars` on tool results so the token review
62
+ can size them. Attach `billedUsage` wherever the transcript reports usage so
63
+ the session can be priced.
64
+ 3. Register it in `src/lib/providers/index.ts` and add its id to
65
+ `ProviderId` in `types.ts`.
66
+ 4. Add its badge colours to `src/lib/provider-meta.ts`.
67
+
68
+ Routes are provider-scoped: `/sessions/<provider>/<id>` and
69
+ `/api/sessions/<provider>/<id>`.
70
+
71
+ ## Releasing
72
+
73
+ Change `version` in `package.json` and push to `main`. The
74
+ [release workflow](.github/workflows/release.yml) builds the app, publishes it
75
+ to npm, and creates the `vX.Y.Z` tag and GitHub release with
76
+ `agent-session-inspector.tar.gz` and `install.sh`, which is what the install
77
+ command downloads. A push that leaves the version alone releases nothing.
78
+
79
+ The workflow signs in to npm by
80
+ [trusted publishing](https://docs.npmjs.com/trusted-publishers), so the
81
+ repository holds no npm token. The package's settings on npmjs.com must list
82
+ this repository and `release.yml` as its trusted publisher.
83
+
84
+ `pnpm package` runs the same build locally into `dist/`. To try the result
85
+ without publishing:
86
+
87
+ ```bash
88
+ npx ./dist/agent-session-inspector
89
+ ASI_TARBALL_URL="file://$PWD/dist/agent-session-inspector.tar.gz" bash install.sh
90
+ ```
package/app/Dockerfile ADDED
@@ -0,0 +1,34 @@
1
+ # syntax=docker/dockerfile:1.7
2
+
3
+ FROM node:22-alpine AS base
4
+ ENV NEXT_TELEMETRY_DISABLED=1
5
+
6
+ FROM base AS deps
7
+ WORKDIR /app
8
+ RUN apk add --no-cache libc6-compat
9
+ COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./
10
+ RUN corepack enable && pnpm install --frozen-lockfile
11
+
12
+ FROM base AS builder
13
+ WORKDIR /app
14
+ RUN apk add --no-cache libc6-compat
15
+ COPY --from=deps /app/node_modules ./node_modules
16
+ COPY . .
17
+ RUN corepack enable && pnpm run build
18
+
19
+ FROM node:22-alpine AS runner
20
+ WORKDIR /app
21
+ ENV NODE_ENV=production
22
+ ENV NEXT_TELEMETRY_DISABLED=1
23
+
24
+ RUN addgroup -g 1001 -S nodejs && adduser -S nextjs -u 1001
25
+
26
+ COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
27
+ COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
28
+
29
+ USER nextjs
30
+
31
+ EXPOSE 4747
32
+ ENV PORT=4747
33
+
34
+ CMD ["node", "server.js"]
package/app/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Kishan Mundha
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.