tokentracker-cli 0.4.1 → 0.5.0

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.
@@ -0,0 +1 @@
1
+ @font-face{font-family:Geist Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/geist-mono-cyrillic-400-normal-Ce5q_31Z.woff2) format("woff2"),url(/assets/geist-mono-cyrillic-400-normal-BPBWmzPh.woff) format("woff");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Geist Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/geist-mono-latin-ext-400-normal-Cgks_Qgx.woff2) format("woff2"),url(/assets/geist-mono-latin-ext-400-normal-CxNRRMGd.woff) format("woff");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Geist Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/geist-mono-latin-400-normal-LC9RFr9I.woff2) format("woff2"),url(/assets/geist-mono-latin-400-normal-CoULgQGM.woff) format("woff");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Geist Mono;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/geist-mono-cyrillic-500-normal-CJBLNVQT.woff2) format("woff2"),url(/assets/geist-mono-cyrillic-500-normal-mNhfPmgl.woff) format("woff");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Geist Mono;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/geist-mono-latin-ext-500-normal-CQcGuCNt.woff2) format("woff2"),url(/assets/geist-mono-latin-ext-500-normal-diTenJ8L.woff) format("woff");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Geist Mono;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/geist-mono-latin-500-normal-D3o2eNa9.woff2) format("woff2"),url(/assets/geist-mono-latin-500-normal-DOxI7kZ4.woff) format("woff");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Geist Mono;font-style:normal;font-display:swap;font-weight:700;src:url(/assets/geist-mono-cyrillic-700-normal-VCNRadI3.woff2) format("woff2"),url(/assets/geist-mono-cyrillic-700-normal-DH5Q319x.woff) format("woff");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Geist Mono;font-style:normal;font-display:swap;font-weight:700;src:url(/assets/geist-mono-latin-ext-700-normal-YOllDaLV.woff2) format("woff2"),url(/assets/geist-mono-latin-ext-700-normal-BX9f1BHp.woff) format("woff");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Geist Mono;font-style:normal;font-display:swap;font-weight:700;src:url(/assets/geist-mono-latin-700-normal-D6izGJRP.woff2) format("woff2"),url(/assets/geist-mono-latin-700-normal-QGw08Lff.woff) format("woff");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Geist Mono;font-style:normal;font-display:swap;font-weight:900;src:url(/assets/geist-mono-cyrillic-900-normal-DdrQ8KBw.woff2) format("woff2"),url(/assets/geist-mono-cyrillic-900-normal-BKC3PZkM.woff) format("woff");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Geist Mono;font-style:normal;font-display:swap;font-weight:900;src:url(/assets/geist-mono-latin-ext-900-normal-CrmBTzU2.woff2) format("woff2"),url(/assets/geist-mono-latin-ext-900-normal-Br6WNUGb.woff) format("woff");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Geist Mono;font-style:normal;font-display:swap;font-weight:900;src:url(/assets/geist-mono-latin-900-normal-Cu5MFKsu.woff2) format("woff2"),url(/assets/geist-mono-latin-900-normal-CmoKXrdK.woff) format("woff");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:SF Mono,SFMono-Regular,ui-monospace,Menlo,Monaco,Consolas,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.container{width:100%}@media(min-width:640px){.container{max-width:640px}}@media(min-width:768px){.container{max-width:768px}}@media(min-width:1024px){.container{max-width:1024px}}@media(min-width:1280px){.container{max-width:1280px}}@media(min-width:1536px){.container{max-width:1536px}}.oai-button-ghost{display:inline-flex;align-items:center;justify-content:center;height:40px;padding:0 var(--space-4);background:transparent;color:var(--oai-gray-600);border:none;border-radius:var(--radius-md);font-family:var(--oai-font-sans);font-size:var(--text-body-sm);font-weight:500;cursor:pointer;transition:color .15s ease}.oai-button-ghost:hover{color:var(--oai-black)}.oai-button-sm{height:36px;padding:0 var(--space-3)}:root.dark .oai-panel{background:linear-gradient(180deg,#1a1b1a,#151615);border-color:var(--oai-gray-800)}:root.dark .oai-panel--strong{background:linear-gradient(180deg,#282928,#1e201e);border-color:var(--oai-gray-700)}:root.dark .oai-card{background:linear-gradient(180deg,#1a1b1a,#151615);border-color:var(--oai-gray-800)}:root.dark .oai-card:hover{border-color:var(--oai-gray-700)}:root.dark .oai-card--accent{background:linear-gradient(180deg,#282928,#1e201e);border-color:var(--oai-gray-700)}:root.dark .oai-button-primary{background:var(--oai-gray-100);color:var(--oai-gray-950)}:root.dark .oai-button-primary:hover{background:var(--oai-gray-200)}:root.dark .oai-button-primary:active{background:var(--oai-gray-100)}:root.dark .oai-button-secondary{color:var(--oai-gray-100);border-color:var(--oai-gray-700)}:root.dark .oai-button-secondary:hover{background:var(--oai-gray-800)}:root.dark .oai-button-ghost{color:var(--oai-gray-500)}:root.dark .oai-button-ghost:hover{color:var(--oai-gray-100)}:root.dark .oai-input{background:var(--oai-gray-900);color:var(--oai-gray-100);border-color:var(--oai-gray-700)}:root.dark .oai-input::-moz-placeholder{color:var(--oai-gray-600)}:root.dark .oai-input::placeholder{color:var(--oai-gray-600)}:root.dark .oai-input:focus{border-color:var(--oai-blue)}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.invisible{visibility:hidden}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.inset-x-0{left:0;right:0}.-bottom-1{bottom:-4px}.-right-1{right:-4px}.bottom-0{bottom:0}.bottom-4{bottom:16px}.bottom-full{bottom:100%}.left-0{left:0}.left-1\/2{left:50%}.right-0{right:0}.right-4{right:16px}.right-6{right:24px}.top-0{top:0}.top-6{top:24px}.\!z-\[9999\]{z-index:9999!important}.z-0{z-index:0}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.z-\[100\]{z-index:100}.z-\[101\]{z-index:101}.z-\[200\]{z-index:200}.-mx-4{margin-left:-16px;margin-right:-16px}.mx-1{margin-left:4px;margin-right:4px}.mx-3{margin-left:12px;margin-right:12px}.mx-auto{margin-left:auto;margin-right:auto}.-ml-1\.5{margin-left:-.375rem}.mb-0\.5{margin-bottom:.125rem}.mb-1{margin-bottom:4px}.mb-1\.5{margin-bottom:.375rem}.mb-2{margin-bottom:8px}.mb-3{margin-bottom:12px}.mb-4{margin-bottom:16px}.mb-6{margin-bottom:24px}.mb-8{margin-bottom:32px}.ml-1{margin-left:4px}.ml-1\.5{margin-left:.375rem}.mr-1{margin-right:4px}.mr-2{margin-right:8px}.mr-auto{margin-right:auto}.mt-0{margin-top:0}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:4px}.mt-1\.5{margin-top:.375rem}.mt-3{margin-top:12px}.mt-4{margin-top:16px}.mt-6{margin-top:24px}.mt-auto{margin-top:auto}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.h-1{height:4px}.h-1\.5{height:.375rem}.h-10{height:40px}.h-12{height:48px}.h-2{height:8px}.h-20{height:80px}.h-24{height:6rem}.h-3{height:12px}.h-4{height:16px}.h-40{height:10rem}.h-44{height:11rem}.h-5{height:20px}.h-7{height:1.75rem}.h-8{height:32px}.h-9{height:2.25rem}.h-\[1px\]{height:1px}.h-full{height:100%}.max-h-\[384px\]{max-height:384px}.max-h-\[45vh\]{max-height:45vh}.min-h-0{min-height:0}.min-h-screen{min-height:100vh}.w-1\.5{width:.375rem}.w-10{width:40px}.w-12{width:48px}.w-2{width:8px}.w-20{width:80px}.w-3{width:12px}.w-32{width:8rem}.w-4{width:16px}.w-5{width:20px}.w-7{width:1.75rem}.w-8{width:32px}.w-9{width:2.25rem}.w-\[10px\]{width:10px}.w-full{width:100%}.min-w-0{min-width:0}.min-w-\[140px\]{min-width:140px}.max-w-3xl{max-width:48rem}.max-w-7xl{max-width:80rem}.max-w-lg{max-width:32rem}.max-w-xl{max-width:36rem}.flex-1{flex:1 1 0%}.flex-shrink-0,.shrink-0{flex-shrink:0}.border-collapse{border-collapse:collapse}.-translate-x-1\/2{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-0{--tw-translate-y: 0;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-4{--tw-translate-y: 16px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-5{--tw-translate-y: 20px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.skew-x-\[-10deg\]{--tw-skew-x: -10deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-100{--tw-scale-x: 1;--tw-scale-y: 1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-95{--tw-scale-x: .95;--tw-scale-y: .95;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.animate-\[scanner_2s_linear_infinite\]{animation:scanner 2s linear infinite}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}.animate-fade-in{animation:fadeIn .5s ease-out}@keyframes ping{75%,to{transform:scale(2);opacity:0}}.animate-ping{animation:ping 1s cubic-bezier(0,0,.2,1) infinite}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize{resize:both}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0\.5{gap:.125rem}.gap-1{gap:4px}.gap-1\.5{gap:.375rem}.gap-2{gap:8px}.gap-2\.5{gap:.625rem}.gap-3{gap:12px}.gap-4{gap:16px}.gap-5{gap:20px}.gap-6{gap:24px}.gap-x-4{-moz-column-gap:16px;column-gap:16px}.gap-y-2{row-gap:8px}.space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(4px * var(--tw-space-x-reverse));margin-left:calc(4px * calc(1 - var(--tw-space-x-reverse)))}.space-x-10>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(40px * var(--tw-space-x-reverse));margin-left:calc(40px * calc(1 - var(--tw-space-x-reverse)))}.space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(12px * var(--tw-space-x-reverse));margin-left:calc(12px * calc(1 - var(--tw-space-x-reverse)))}.space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(16px * var(--tw-space-x-reverse));margin-left:calc(16px * calc(1 - var(--tw-space-x-reverse)))}.space-x-6>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(24px * var(--tw-space-x-reverse));margin-left:calc(24px * calc(1 - var(--tw-space-x-reverse)))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(4px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(4px * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(8px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(8px * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(12px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(12px * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(16px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(16px * var(--tw-space-y-reverse))}.space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(20px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(20px * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(24px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(24px * var(--tw-space-y-reverse))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(32px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(32px * var(--tw-space-y-reverse))}.self-stretch{align-self:stretch}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-y-hidden{overflow-y:hidden}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.rounded{border-radius:.25rem}.rounded-\[1px\]{border-radius:1px}.rounded-\[2px\]{border-radius:2px}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:12px}.rounded-md{border-radius:8px}.rounded-sm{border-radius:4px}.rounded-xl{border-radius:16px}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-l{border-left-width:1px}.border-l-2{border-left-width:2px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-none{border-style:none}.border-\[\#00FF41\]{--tw-border-opacity: 1;border-color:rgb(0 255 65 / var(--tw-border-opacity, 1))}.border-\[\#00FF41\]\/25{border-color:#00ff4140}.border-\[\#00FF41\]\/30{border-color:#00ff414d}.border-\[\#00FF41\]\/45{border-color:#00ff4173}.border-oai-error{--tw-border-opacity: 1;border-color:rgb(239 68 68 / var(--tw-border-opacity, 1))}.border-oai-gray-100{--tw-border-opacity: 1;border-color:rgb(245 245 245 / var(--tw-border-opacity, 1))}.border-oai-gray-200{--tw-border-opacity: 1;border-color:rgb(229 229 229 / var(--tw-border-opacity, 1))}.border-oai-gray-300{--tw-border-opacity: 1;border-color:rgb(212 212 212 / var(--tw-border-opacity, 1))}.border-oai-gray-50{--tw-border-opacity: 1;border-color:rgb(250 250 250 / var(--tw-border-opacity, 1))}.border-red-500\/20{border-color:#ef444433}.border-transparent{border-color:transparent}.border-yellow-500\/50{border-color:#eab30880}.bg-\[\#050505\]{--tw-bg-opacity: 1;background-color:rgb(5 5 5 / var(--tw-bg-opacity, 1))}.bg-black{--tw-bg-opacity: 1;background-color:rgb(0 0 0 / var(--tw-bg-opacity, 1))}.bg-black\/70{background-color:#000000b3}.bg-oai-amber-50{--tw-bg-opacity: 1;background-color:rgb(255 251 235 / var(--tw-bg-opacity, 1))}.bg-oai-black{--tw-bg-opacity: 1;background-color:rgb(10 10 10 / var(--tw-bg-opacity, 1))}.bg-oai-brand{--tw-bg-opacity: 1;background-color:rgb(5 150 105 / var(--tw-bg-opacity, 1))}.bg-oai-brand-100{--tw-bg-opacity: 1;background-color:rgb(209 250 229 / var(--tw-bg-opacity, 1))}.bg-oai-gray-100{--tw-bg-opacity: 1;background-color:rgb(245 245 245 / var(--tw-bg-opacity, 1))}.bg-oai-gray-100\/80{background-color:#f5f5f5cc}.bg-oai-gray-200{--tw-bg-opacity: 1;background-color:rgb(229 229 229 / var(--tw-bg-opacity, 1))}.bg-oai-gray-300{--tw-bg-opacity: 1;background-color:rgb(212 212 212 / var(--tw-bg-opacity, 1))}.bg-oai-gray-50{--tw-bg-opacity: 1;background-color:rgb(250 250 250 / var(--tw-bg-opacity, 1))}.bg-oai-gray-50\/30{background-color:#fafafa4d}.bg-oai-gray-900{--tw-bg-opacity: 1;background-color:rgb(23 23 23 / var(--tw-bg-opacity, 1))}.bg-oai-white{--tw-bg-opacity: 1;background-color:rgb(250 250 250 / var(--tw-bg-opacity, 1))}.bg-red-50{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))}.bg-red-500\/10{background-color:#ef44441a}.bg-transparent{background-color:transparent}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-yellow-900\/20{background-color:#713f1233}.bg-\[linear-gradient\(rgba\(0\,255\,65\,0\)_50\%\,rgba\(0\,255\,65\,0\.16\)_50\%\)\]{background-image:linear-gradient(#00ff4100 50%,#00ff4129 50%)}.bg-\[linear-gradient\(rgba\(18\,16\,16\,0\)_50\%\,rgba\(0\,0\,0\,0\.1\)_50\%\)\]{background-image:linear-gradient(#12101000 50%,#0000001a 50%)}.bg-\[linear-gradient\(rgba\(255\,215\,0\,0\)_50\%\,rgba\(255\,215\,0\,0\.1\)_50\%\)\]{background-image:linear-gradient(#ffd70000 50%,#ffd7001a 50%)}.bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.from-oai-gray-100{--tw-gradient-from: #f5f5f5 var(--tw-gradient-from-position);--tw-gradient-to: rgb(245 245 245 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.via-oai-gray-50{--tw-gradient-to: rgb(250 250 250 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), #fafafa var(--tw-gradient-via-position), var(--tw-gradient-to)}.to-oai-gray-100{--tw-gradient-to: #f5f5f5 var(--tw-gradient-to-position)}.bg-\[length\:100\%_4px\]{background-size:100% 4px}.bg-\[length\:200\%_100\%\]{background-size:200% 100%}.fill-oai-gray-700{fill:#404040}.fill-oai-gray-900{fill:#171717}.object-cover{-o-object-fit:cover;object-fit:cover}.p-0{padding:0}.p-1{padding:4px}.p-1\.5{padding:.375rem}.p-2{padding:8px}.p-3{padding:12px}.p-4{padding:16px}.p-5{padding:20px}.p-6{padding:24px}.p-8{padding:32px}.px-0\.5{padding-left:.125rem;padding-right:.125rem}.px-1{padding-left:4px;padding-right:4px}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:8px;padding-right:8px}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:12px;padding-right:12px}.px-4{padding-left:16px;padding-right:16px}.px-5{padding-left:20px;padding-right:20px}.px-6{padding-left:24px;padding-right:24px}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:4px;padding-bottom:4px}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-2{padding-top:8px;padding-bottom:8px}.py-3{padding-top:12px;padding-bottom:12px}.py-4{padding-top:16px;padding-bottom:16px}.py-5{padding-top:20px;padding-bottom:20px}.py-6{padding-top:24px;padding-bottom:24px}.py-8{padding-top:32px;padding-bottom:32px}.pb-2{padding-bottom:8px}.pb-3{padding-bottom:12px}.pl-2{padding-left:8px}.pl-3{padding-left:12px}.pr-2{padding-right:8px}.pt-2{padding-top:8px}.pt-3{padding-top:12px}.text-left{text-align:left}.text-center{text-align:center}.font-mono{font-family:SF Mono,SFMono-Regular,ui-monospace,Menlo,Monaco,Consolas,monospace}.font-sans{font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji"}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-6xl{font-size:3.75rem;line-height:1}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-base{font-size:1rem;line-height:1.5rem}.text-body{font-size:16px;line-height:1.5;font-weight:400}.text-caption{font-size:12px;line-height:1.4;letter-spacing:.01em;font-weight:500}.text-display-sm{font-size:56px;line-height:1.05;letter-spacing:-.02em;font-weight:700}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-black{font-weight:900}.font-bold{font-weight:700}.font-extralight{font-weight:200}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-none{line-height:1}.leading-tight{line-height:1.25}.tracking-\[0\.16em\]{letter-spacing:.16em}.tracking-\[0\.2em\]{letter-spacing:.2em}.tracking-\[0\.3em\]{letter-spacing:.3em}.tracking-\[0\.4em\]{letter-spacing:.4em}.tracking-\[0\.6em\]{letter-spacing:.6em}.tracking-normal{letter-spacing:0em}.tracking-tight{letter-spacing:-.025em}.tracking-tighter{letter-spacing:-.05em}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.tracking-widest{letter-spacing:.1em}.text-\[\#00FF41\]{--tw-text-opacity: 1;color:rgb(0 255 65 / var(--tw-text-opacity, 1))}.text-\[\#00FF41\]\/80{color:#00ff41cc}.text-black{--tw-text-opacity: 1;color:rgb(0 0 0 / var(--tw-text-opacity, 1))}.text-gray-300{--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity, 1))}.text-oai-amber-dark{--tw-text-opacity: 1;color:rgb(217 119 6 / var(--tw-text-opacity, 1))}.text-oai-black{--tw-text-opacity: 1;color:rgb(10 10 10 / var(--tw-text-opacity, 1))}.text-oai-brand{--tw-text-opacity: 1;color:rgb(5 150 105 / var(--tw-text-opacity, 1))}.text-oai-brand-700{--tw-text-opacity: 1;color:rgb(4 120 87 / var(--tw-text-opacity, 1))}.text-oai-error{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.text-oai-gray-300{--tw-text-opacity: 1;color:rgb(212 212 212 / var(--tw-text-opacity, 1))}.text-oai-gray-400{--tw-text-opacity: 1;color:rgb(163 163 163 / var(--tw-text-opacity, 1))}.text-oai-gray-500{--tw-text-opacity: 1;color:rgb(115 115 115 / var(--tw-text-opacity, 1))}.text-oai-gray-600{--tw-text-opacity: 1;color:rgb(82 82 82 / var(--tw-text-opacity, 1))}.text-oai-gray-700{--tw-text-opacity: 1;color:rgb(64 64 64 / var(--tw-text-opacity, 1))}.text-oai-gray-900{--tw-text-opacity: 1;color:rgb(23 23 23 / var(--tw-text-opacity, 1))}.text-oai-white{--tw-text-opacity: 1;color:rgb(250 250 250 / var(--tw-text-opacity, 1))}.text-red-400{--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.text-red-500\/90{color:#ef4444e6}.text-red-600{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.text-yellow-400{--tw-text-opacity: 1;color:rgb(250 204 21 / var(--tw-text-opacity, 1))}.no-underline{text-decoration-line:none}.placeholder-oai-gray-400::-moz-placeholder{--tw-placeholder-opacity: 1;color:rgb(163 163 163 / var(--tw-placeholder-opacity, 1))}.placeholder-oai-gray-400::placeholder{--tw-placeholder-opacity: 1;color:rgb(163 163 163 / var(--tw-placeholder-opacity, 1))}.opacity-0{opacity:0}.opacity-10{opacity:.1}.opacity-100{opacity:1}.opacity-20{opacity:.2}.opacity-25{opacity:.25}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-75{opacity:.75}.opacity-80{opacity:.8}.mix-blend-overlay{mix-blend-mode:overlay}.shadow-\[0_0_10px_\#00FF41\]{--tw-shadow: 0 0 10px #00FF41;--tw-shadow-colored: 0 0 10px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_0_10px_rgba\(0\,255\,65\,0\.2\)\]{--tw-shadow: 0 0 10px rgba(0,255,65,.2);--tw-shadow-colored: 0 0 10px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_0_12px_rgba\(0\,255\,65\,0\.08\)\]{--tw-shadow: 0 0 12px rgba(0,255,65,.08);--tw-shadow-colored: 0 0 12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_0_12px_rgba\(0\,255\,65\,0\.35\)\]{--tw-shadow: 0 0 12px rgba(0,255,65,.35);--tw-shadow-colored: 0 0 12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_0_15px_rgba\(0\,255\,65\,0\.1\)\]{--tw-shadow: 0 0 15px rgba(0,255,65,.1);--tw-shadow-colored: 0 0 15px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_0_20px_rgba\(255\,215\,0\,0\.1\)\]{--tw-shadow: 0 0 20px rgba(255,215,0,.1);--tw-shadow-colored: 0 0 20px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-oai-lg{--tw-shadow: 0 10px 15px -3px rgba(0, 0, 0, .1), 0 4px 6px -4px rgba(0, 0, 0, .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline-none{outline:2px solid transparent;outline-offset:2px}.ring-2{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-white{--tw-ring-opacity: 1;--tw-ring-color: rgb(255 255 255 / var(--tw-ring-opacity, 1))}.drop-shadow{--tw-drop-shadow: drop-shadow(0 1px 2px rgb(0 0 0 / .1)) drop-shadow(0 1px 1px rgb(0 0 0 / .06));filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.drop-shadow-\[0_0_10px_rgba\(0\,255\,65\,0\.22\)\]{--tw-drop-shadow: drop-shadow(0 0 10px rgba(0,255,65,.22));filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-md{--tw-backdrop-blur: blur(12px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-500{transition-duration:.5s}.duration-700{transition-duration:.7s}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.oai-text-body-sm{font-size:var(--text-body-sm);line-height:1.5;font-weight:400}.oai-text-caption{font-size:var(--text-caption);line-height:1.4;font-weight:500;letter-spacing:.01em}.oai-text-muted{color:var(--oai-gray-500)}.oai-bg-elevated{background:var(--oai-gray-50)}.oai-scrollbar{scrollbar-width:thin;scrollbar-color:var(--oai-gray-300) transparent;scrollbar-gutter:stable both-edges}.oai-scrollbar::-webkit-scrollbar{height:8px;width:8px}.oai-scrollbar::-webkit-scrollbar-track{background:transparent}.oai-scrollbar::-webkit-scrollbar-thumb{background:var(--oai-gray-300);border-radius:var(--radius-full)}.oai-scrollbar::-webkit-scrollbar-thumb:hover{background:var(--oai-gray-400)}:root.dark .oai-text-muted{color:var(--oai-gray-500)}:root.dark .oai-text-secondary{color:var(--oai-gray-400)}:root.dark .oai-bg-surface{background:var(--oai-gray-900)}:root.dark .oai-bg-elevated{background:var(--oai-gray-100)}:root.dark .oai-scrollbar{scrollbar-color:var(--oai-gray-400) transparent}:root.dark .oai-scrollbar::-webkit-scrollbar-thumb{background:var(--oai-gray-400)}:root.dark .oai-scrollbar::-webkit-scrollbar-thumb:hover{background:var(--oai-gray-500)}@keyframes fadeInUp{to{opacity:1;transform:translateY(0)}}@keyframes countPulse{0%{transform:scale(1)}50%{transform:scale(1.02)}to{transform:scale(1)}}.shimmer{background:linear-gradient(90deg,var(--oai-gray-100) 25%,var(--oai-gray-50) 50%,var(--oai-gray-100) 75%);background-size:200% 100%;animation:shimmer 1.5s infinite}@keyframes shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}:root.dark .shimmer{background:linear-gradient(90deg,var(--oai-gray-800) 25%,var(--oai-gray-700) 50%,var(--oai-gray-800) 75%);background-size:200% 100%}:root.dark .hover-lift:hover{box-shadow:0 12px 32px -8px #0006}.cost-modal-backdrop{position:fixed;inset:0;z-index:100;background:#0006;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);animation:costBackdropIn .2s ease-out forwards}.cost-modal-popup{animation:costPopupIn .25s cubic-bezier(.16,1,.3,1) forwards}@keyframes costBackdropIn{0%{opacity:0}to{opacity:1}}@keyframes costPopupIn{0%{opacity:0;transform:scale(.95) translateY(8px)}to{opacity:1;transform:scale(1) translateY(0)}}:root.dark .cost-modal-backdrop{background:#0009}:root{color-scheme:light;--oai-black: #0a0a0a;--oai-white: #fafafa;--oai-gray-50: oklch(98% .005 145);--oai-gray-100: oklch(96% .01 145);--oai-gray-200: oklch(90% .015 145);--oai-gray-300: oklch(83% .02 145);--oai-gray-400: oklch(70% .025 145);--oai-gray-500: oklch(55% .03 145);--oai-gray-600: oklch(45% .025 145);--oai-gray-700: oklch(35% .02 145);--oai-gray-800: oklch(25% .015 145);--oai-gray-900: oklch(18% .01 145);--oai-gray-950: oklch(12% .005 145);--brand-primary: #059669;--brand-primary-dark: #047857;--brand-primary-light: #10b981;--brand-50: #ecfdf5;--brand-100: #d1fae5;--brand-200: #a7f3d0;--brand-300: #6ee7b7;--brand-400: #34d399;--brand-500: #10b981;--brand-600: #059669;--brand-700: #047857;--brand-800: #065f46;--brand-900: #064e3b;--brand-950: #022c22;--forest: #10b981;--forest-dark: #059669;--forest-light: #34d399;--amber: #f59e0b;--amber-dark: #d97706;--amber-light: #fbbf24;--oai-blue: #059669;--oai-blue-dark: #047857;--oai-blue-light: #10b981;--oai-success: #10b981;--oai-warning: #f59e0b;--oai-error: #ef4444;--oai-info: #059669;--oai-font-sans: -apple-system, blinkmacsystemfont, "Segoe UI", roboto, oxygen, ubuntu, sans-serif;--oai-font-mono: "SF Mono", sfmono-regular, ui-monospace, menlo, monaco, consolas, monospace;--text-hero: 48px;--text-h1: 36px;--text-h2: 28px;--text-h3: 22px;--text-h4: 18px;--text-body: 16px;--text-body-sm: 14px;--text-caption: 12px;--text-label: 11px;--space-0: 0;--space-1: 4px;--space-2: 8px;--space-3: 12px;--space-4: 16px;--space-5: 20px;--space-6: 24px;--space-8: 32px;--space-10: 40px;--space-12: 48px;--space-16: 64px;--space-20: 80px;--radius-sm: 4px;--radius-md: 8px;--radius-lg: 12px;--radius-xl: 16px;--radius-full: 9999px}:root.dark{color-scheme:dark;--oai-black: #fafafa;--oai-white: #0a0a0a;--oai-gray-50: oklch(20% .002 145);--oai-gray-100: oklch(24% .003 145);--oai-gray-200: oklch(30% .004 145);--oai-gray-300: oklch(40% .005 145);--oai-gray-400: oklch(55% .006 145);--oai-gray-500: oklch(65% .005 145);--oai-gray-600: oklch(75% .004 145);--oai-gray-700: oklch(85% .003 145);--oai-gray-800: oklch(92% .002 145);--oai-gray-900: oklch(96% .001 145);--oai-gray-950: oklch(98% .001 145);--brand-primary: #10b981;--brand-primary-dark: #059669;--brand-primary-light: #34d399;--forest: #34d399;--forest-dark: #10b981;--forest-light: #6ee7b7;--oai-blue: #10b981;--oai-blue-dark: #059669;--oai-blue-light: #34d399;--oai-success: #34d399;--oai-warning: #fbbf24;--oai-error: #f87171;--oai-info: #10b981}html,body{height:100%}body{margin:0;background:var(--oai-white);color:var(--oai-black);font-family:var(--oai-font-sans);font-size:var(--text-body);line-height:1.5;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.heatmap-scroll-thin{scrollbar-width:thin;scrollbar-color:var(--oai-gray-200) transparent}.heatmap-scroll-thin::-webkit-scrollbar{height:4px}.heatmap-scroll-thin::-webkit-scrollbar-track{background:transparent}.heatmap-scroll-thin::-webkit-scrollbar-thumb{background:var(--oai-gray-200);border-radius:2px}.heatmap-scroll-thin::-webkit-scrollbar-thumb:hover{background:var(--oai-gray-400)}:root.dark .heatmap-scroll-thin{scrollbar-color:var(--oai-gray-600) transparent}:root.dark .heatmap-scroll-thin::-webkit-scrollbar-thumb{background:var(--oai-gray-600)}:root.dark .heatmap-scroll-thin::-webkit-scrollbar-thumb:hover{background:var(--oai-gray-500)}.rdp-selected{background:var(--oai-black)!important;border-radius:0!important}.rdp-selected .rdp-day-btn{background:transparent!important;color:#fff!important;border-radius:0!important}.rdp-range-start{border-radius:8px 0 0 8px!important}.rdp-range-end{border-radius:0 8px 8px 0!important}.rdp-range-start.rdp-range-end{border-radius:8px!important}:root.dark .rdp-selected{background:var(--oai-white)!important}:root.dark .rdp-selected .rdp-day-btn{background:transparent!important;color:var(--oai-black)!important}:root.dark .rdp-oai svg.rdp-chevron{fill:var(--oai-gray-400)}.selection\:text-black *::-moz-selection{--tw-text-opacity: 1;color:rgb(0 0 0 / var(--tw-text-opacity, 1))}.selection\:text-black *::selection{--tw-text-opacity: 1;color:rgb(0 0 0 / var(--tw-text-opacity, 1))}.selection\:text-black::-moz-selection{--tw-text-opacity: 1;color:rgb(0 0 0 / var(--tw-text-opacity, 1))}.selection\:text-black::selection{--tw-text-opacity: 1;color:rgb(0 0 0 / var(--tw-text-opacity, 1))}.last\:border-b-0:last-child{border-bottom-width:0px}.hover\:z-10:hover{z-index:10}.hover\:scale-105:hover{--tw-scale-x: 1.05;--tw-scale-y: 1.05;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:scale-125:hover{--tw-scale-x: 1.25;--tw-scale-y: 1.25;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:border-oai-brand:hover{--tw-border-opacity: 1;border-color:rgb(5 150 105 / var(--tw-border-opacity, 1))}.hover\:border-oai-gray-300:hover{--tw-border-opacity: 1;border-color:rgb(212 212 212 / var(--tw-border-opacity, 1))}.hover\:border-white:hover{--tw-border-opacity: 1;border-color:rgb(255 255 255 / var(--tw-border-opacity, 1))}.hover\:bg-\[\#00FF41\]:hover{--tw-bg-opacity: 1;background-color:rgb(0 255 65 / var(--tw-bg-opacity, 1))}.hover\:bg-oai-brand-50\/50:hover{background-color:#ecfdf580}.hover\:bg-oai-gray-100:hover{--tw-bg-opacity: 1;background-color:rgb(245 245 245 / var(--tw-bg-opacity, 1))}.hover\:bg-oai-gray-50:hover{--tw-bg-opacity: 1;background-color:rgb(250 250 250 / var(--tw-bg-opacity, 1))}.hover\:bg-oai-gray-50\/50:hover{background-color:#fafafa80}.hover\:bg-oai-gray-800:hover{--tw-bg-opacity: 1;background-color:rgb(38 38 38 / var(--tw-bg-opacity, 1))}.hover\:bg-white:hover{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.hover\:text-black:hover{--tw-text-opacity: 1;color:rgb(0 0 0 / var(--tw-text-opacity, 1))}.hover\:text-oai-black:hover{--tw-text-opacity: 1;color:rgb(10 10 10 / var(--tw-text-opacity, 1))}.hover\:text-oai-brand:hover{--tw-text-opacity: 1;color:rgb(5 150 105 / var(--tw-text-opacity, 1))}.hover\:text-oai-brand-dark:hover{--tw-text-opacity: 1;color:rgb(4 120 87 / var(--tw-text-opacity, 1))}.hover\:text-oai-gray-600:hover{--tw-text-opacity: 1;color:rgb(82 82 82 / var(--tw-text-opacity, 1))}.hover\:opacity-80:hover{opacity:.8}.hover\:opacity-90:hover{opacity:.9}.hover\:oai-bg-elevated:hover{background:var(--oai-gray-50)}:root.dark .hover\:oai-bg-elevated:hover{background:var(--oai-gray-100)}.focus\:border-oai-brand:focus{--tw-border-opacity: 1;border-color:rgb(5 150 105 / var(--tw-border-opacity, 1))}.focus\:border-oai-error:focus{--tw-border-opacity: 1;border-color:rgb(239 68 68 / var(--tw-border-opacity, 1))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-1:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-2:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-oai-blue\/30:focus{--tw-ring-color: rgb(5 150 105 / .3)}.focus\:ring-oai-brand\/30:focus{--tw-ring-color: rgb(5 150 105 / .3)}.focus\:ring-oai-error\/30:focus{--tw-ring-color: rgb(239 68 68 / .3)}.active\:scale-\[0\.98\]:active{--tw-scale-x: .98;--tw-scale-y: .98;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.active\:border-oai-brand-dark:active{--tw-border-opacity: 1;border-color:rgb(4 120 87 / var(--tw-border-opacity, 1))}.active\:bg-oai-brand-50:active{--tw-bg-opacity: 1;background-color:rgb(236 253 245 / var(--tw-bg-opacity, 1))}.active\:bg-oai-gray-50:active{--tw-bg-opacity: 1;background-color:rgb(250 250 250 / var(--tw-bg-opacity, 1))}.active\:bg-oai-gray-900:active{--tw-bg-opacity: 1;background-color:rgb(23 23 23 / var(--tw-bg-opacity, 1))}.active\:duration-100:active{transition-duration:.1s}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:border-oai-gray-200:disabled{--tw-border-opacity: 1;border-color:rgb(229 229 229 / var(--tw-border-opacity, 1))}.disabled\:bg-oai-gray-300:disabled{--tw-bg-opacity: 1;background-color:rgb(212 212 212 / var(--tw-bg-opacity, 1))}.disabled\:text-oai-gray-300:disabled{--tw-text-opacity: 1;color:rgb(212 212 212 / var(--tw-text-opacity, 1))}.disabled\:text-oai-gray-400:disabled{--tw-text-opacity: 1;color:rgb(163 163 163 / var(--tw-text-opacity, 1))}.disabled\:text-oai-gray-500:disabled{--tw-text-opacity: 1;color:rgb(115 115 115 / var(--tw-text-opacity, 1))}.disabled\:opacity-50:disabled{opacity:.5}.group:hover .group-hover\:scale-110{--tw-scale-x: 1.1;--tw-scale-y: 1.1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group:hover .group-hover\:text-oai-black{--tw-text-opacity: 1;color:rgb(10 10 10 / var(--tw-text-opacity, 1))}.group:hover .group-hover\:opacity-100{opacity:1}.group:hover .group-hover\:brightness-110{--tw-brightness: brightness(1.1);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.group:hover .group-hover\:drop-shadow-\[0_0_8px_rgba\(0\,255\,65\,0\.8\)\]{--tw-drop-shadow: drop-shadow(0 0 8px rgba(0,255,65,.8));filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.dark\:border-oai-gray-600:is(.dark *){--tw-border-opacity: 1;border-color:rgb(82 82 82 / var(--tw-border-opacity, 1))}.dark\:border-oai-gray-700:is(.dark *){--tw-border-opacity: 1;border-color:rgb(64 64 64 / var(--tw-border-opacity, 1))}.dark\:border-oai-gray-800:is(.dark *){--tw-border-opacity: 1;border-color:rgb(38 38 38 / var(--tw-border-opacity, 1))}.dark\:bg-oai-brand-900\/30:is(.dark *){background-color:#064e3b4d}.dark\:bg-oai-gray-600:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(82 82 82 / var(--tw-bg-opacity, 1))}.dark\:bg-oai-gray-700:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(64 64 64 / var(--tw-bg-opacity, 1))}.dark\:bg-oai-gray-800:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(38 38 38 / var(--tw-bg-opacity, 1))}.dark\:bg-oai-gray-800\/30:is(.dark *){background-color:#2626264d}.dark\:bg-oai-gray-800\/80:is(.dark *){background-color:#262626cc}.dark\:bg-oai-gray-900:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(23 23 23 / var(--tw-bg-opacity, 1))}.dark\:bg-oai-gray-950:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(10 10 10 / var(--tw-bg-opacity, 1))}.dark\:bg-oai-white:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(250 250 250 / var(--tw-bg-opacity, 1))}.dark\:bg-red-900\/30:is(.dark *){background-color:#7f1d1d4d}.dark\:fill-oai-gray-300:is(.dark *){fill:#d4d4d4}.dark\:fill-oai-white:is(.dark *){fill:#fafafa}.dark\:text-oai-black:is(.dark *){--tw-text-opacity: 1;color:rgb(10 10 10 / var(--tw-text-opacity, 1))}.dark\:text-oai-brand-400:is(.dark *){--tw-text-opacity: 1;color:rgb(52 211 153 / var(--tw-text-opacity, 1))}.dark\:text-oai-gray-100:is(.dark *){--tw-text-opacity: 1;color:rgb(245 245 245 / var(--tw-text-opacity, 1))}.dark\:text-oai-gray-300:is(.dark *){--tw-text-opacity: 1;color:rgb(212 212 212 / var(--tw-text-opacity, 1))}.dark\:text-oai-gray-400:is(.dark *){--tw-text-opacity: 1;color:rgb(163 163 163 / var(--tw-text-opacity, 1))}.dark\:text-oai-gray-500:is(.dark *){--tw-text-opacity: 1;color:rgb(115 115 115 / var(--tw-text-opacity, 1))}.dark\:text-oai-gray-600:is(.dark *){--tw-text-opacity: 1;color:rgb(82 82 82 / var(--tw-text-opacity, 1))}.dark\:text-oai-gray-900:is(.dark *){--tw-text-opacity: 1;color:rgb(23 23 23 / var(--tw-text-opacity, 1))}.dark\:text-oai-white:is(.dark *){--tw-text-opacity: 1;color:rgb(250 250 250 / var(--tw-text-opacity, 1))}.dark\:text-red-400:is(.dark *){--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.dark\:placeholder-oai-gray-500:is(.dark *)::-moz-placeholder{--tw-placeholder-opacity: 1;color:rgb(115 115 115 / var(--tw-placeholder-opacity, 1))}.dark\:placeholder-oai-gray-500:is(.dark *)::placeholder{--tw-placeholder-opacity: 1;color:rgb(115 115 115 / var(--tw-placeholder-opacity, 1))}.dark\:ring-oai-gray-900:is(.dark *){--tw-ring-opacity: 1;--tw-ring-color: rgb(23 23 23 / var(--tw-ring-opacity, 1))}.dark\:hover\:border-oai-gray-600:hover:is(.dark *){--tw-border-opacity: 1;border-color:rgb(82 82 82 / var(--tw-border-opacity, 1))}.dark\:hover\:border-oai-gray-700:hover:is(.dark *){--tw-border-opacity: 1;border-color:rgb(64 64 64 / var(--tw-border-opacity, 1))}.dark\:hover\:bg-oai-brand-950\/30:hover:is(.dark *){background-color:#022c224d}.dark\:hover\:bg-oai-gray-200:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(229 229 229 / var(--tw-bg-opacity, 1))}.dark\:hover\:bg-oai-gray-700:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(64 64 64 / var(--tw-bg-opacity, 1))}.dark\:hover\:bg-oai-gray-800:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(38 38 38 / var(--tw-bg-opacity, 1))}.dark\:hover\:bg-oai-gray-800\/50:hover:is(.dark *){background-color:#26262680}.dark\:hover\:text-oai-brand-light:hover:is(.dark *){--tw-text-opacity: 1;color:rgb(16 185 129 / var(--tw-text-opacity, 1))}.dark\:hover\:text-oai-gray-300:hover:is(.dark *){--tw-text-opacity: 1;color:rgb(212 212 212 / var(--tw-text-opacity, 1))}.dark\:hover\:text-oai-white:hover:is(.dark *){--tw-text-opacity: 1;color:rgb(250 250 250 / var(--tw-text-opacity, 1))}.dark\:focus\:border-oai-brand:focus:is(.dark *){--tw-border-opacity: 1;border-color:rgb(5 150 105 / var(--tw-border-opacity, 1))}.dark\:active\:bg-oai-brand-900\/50:active:is(.dark *){background-color:#064e3b80}.dark\:active\:bg-oai-gray-300:active:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(212 212 212 / var(--tw-bg-opacity, 1))}.dark\:active\:bg-oai-gray-800:active:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(38 38 38 / var(--tw-bg-opacity, 1))}.dark\:disabled\:border-oai-gray-700:disabled:is(.dark *){--tw-border-opacity: 1;border-color:rgb(64 64 64 / var(--tw-border-opacity, 1))}.dark\:disabled\:bg-oai-gray-700:disabled:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(64 64 64 / var(--tw-bg-opacity, 1))}.dark\:disabled\:text-oai-gray-400:disabled:is(.dark *){--tw-text-opacity: 1;color:rgb(163 163 163 / var(--tw-text-opacity, 1))}.dark\:disabled\:text-oai-gray-500:disabled:is(.dark *){--tw-text-opacity: 1;color:rgb(115 115 115 / var(--tw-text-opacity, 1))}.dark\:disabled\:text-oai-gray-600:disabled:is(.dark *){--tw-text-opacity: 1;color:rgb(82 82 82 / var(--tw-text-opacity, 1))}.group:hover .dark\:group-hover\:text-oai-white:is(.dark *){--tw-text-opacity: 1;color:rgb(250 250 250 / var(--tw-text-opacity, 1))}@media(min-width:640px){.sm\:inline{display:inline}.sm\:flex{display:flex}.sm\:h-8{height:32px}.sm\:w-8{width:32px}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:text-2xl{font-size:1.5rem;line-height:2rem}}@media(min-width:768px){.md\:col-span-2{grid-column:span 2 / span 2}.md\:ml-4{margin-left:16px}.md\:h-9{height:2.25rem}.md\:w-9{width:2.25rem}.md\:w-auto{width:auto}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:flex-row{flex-direction:row}.md\:items-center{align-items:center}.md\:justify-between{justify-content:space-between}.md\:gap-3{gap:12px}.md\:gap-6{gap:24px}.md\:p-8{padding:32px}.md\:text-2xl{font-size:1.5rem;line-height:2rem}.md\:text-3xl{font-size:1.875rem;line-height:2.25rem}.md\:text-4xl{font-size:2.25rem;line-height:2.5rem}.md\:text-7xl{font-size:4.5rem;line-height:1}.md\:text-base{font-size:1rem;line-height:1.5rem}.md\:text-display{font-size:72px;line-height:1;letter-spacing:-.03em;font-weight:700}}@media(min-width:1024px){.lg\:col-span-4{grid-column:span 4 / span 4}.lg\:col-span-8{grid-column:span 8 / span 8}.lg\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}
@@ -107,8 +107,8 @@
107
107
  ]
108
108
  }
109
109
  </script>
110
- <script type="module" crossorigin src="/assets/main-DGPBnxuf.js"></script>
111
- <link rel="stylesheet" crossorigin href="/assets/main-CmTD1xm_.css">
110
+ <script type="module" crossorigin src="/assets/main-BbLvM6ng.js"></script>
111
+ <link rel="stylesheet" crossorigin href="/assets/main-_qTSxSnU.css">
112
112
  </head>
113
113
  <body>
114
114
  <main class="aeo-seed-content" aria-label="Token Tracker AI-readable summary">
@@ -51,8 +51,8 @@
51
51
  "description": "Shareable Token Tracker dashboard snapshot."
52
52
  }
53
53
  </script>
54
- <script type="module" crossorigin src="/assets/main-DGPBnxuf.js"></script>
55
- <link rel="stylesheet" crossorigin href="/assets/main-CmTD1xm_.css">
54
+ <script type="module" crossorigin src="/assets/main-BbLvM6ng.js"></script>
55
+ <link rel="stylesheet" crossorigin href="/assets/main-_qTSxSnU.css">
56
56
  </head>
57
57
  <body>
58
58
  <main class="aeo-seed-content" aria-label="Token Tracker share page summary">
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tokentracker-cli",
3
- "version": "0.4.1",
3
+ "version": "0.5.0",
4
4
  "description": "Token usage tracker for AI agent CLIs (Claude Code, Codex, Cursor, Kiro, Gemini, OpenCode, OpenClaw)",
5
5
  "main": "src/cli.js",
6
6
  "bin": {
@@ -30,6 +30,7 @@
30
30
  "copy:push": "node scripts/copy-sync.cjs push",
31
31
  "dashboard:build": "npm --prefix dashboard run build",
32
32
  "dashboard:dev": "npm --prefix dashboard run dev",
33
+ "dashboard:open": "bash scripts/open-dashboard.sh",
33
34
  "dashboard:preview": "npm --prefix dashboard run preview",
34
35
  "dev:shim": "node scripts/dev-bin-shim.cjs",
35
36
  "graph:auto-index": "node scripts/graph/auto-index.cjs",
@@ -52,6 +53,28 @@
52
53
  "bundledDependencies": [
53
54
  "@insforge/sdk"
54
55
  ],
56
+ "repository": {
57
+ "type": "git",
58
+ "url": "git+https://github.com/mm7894215/TokenTracker.git"
59
+ },
60
+ "homepage": "https://github.com/mm7894215/TokenTracker#readme",
61
+ "bugs": {
62
+ "url": "https://github.com/mm7894215/TokenTracker/issues"
63
+ },
64
+ "keywords": [
65
+ "token",
66
+ "tracker",
67
+ "ai",
68
+ "claude",
69
+ "codex",
70
+ "cursor",
71
+ "gemini",
72
+ "kiro",
73
+ "opencode",
74
+ "usage",
75
+ "cost"
76
+ ],
77
+ "license": "MIT",
55
78
  "engines": {
56
79
  "node": ">=20"
57
80
  }
@@ -12,6 +12,7 @@ const {
12
12
  listOpencodeMessageFiles,
13
13
  readOpencodeDbMessages,
14
14
  resolveKiroDbPath,
15
+ resolveKiroJsonlPath,
15
16
  parseRolloutIncremental,
16
17
  parseClaudeIncremental,
17
18
  parseGeminiIncremental,
@@ -302,15 +303,17 @@ async function cmdSync(argv) {
302
303
  }
303
304
  }
304
305
 
305
- // ── Kiro (SQLite-based) ──
306
+ // ── Kiro (SQLite-based, with JSONL fallback) ──
306
307
  let kiroResult = { recordsProcessed: 0, eventsAggregated: 0, bucketsQueued: 0 };
307
308
  const kiroDbPath = resolveKiroDbPath();
308
- if (fssync.existsSync(kiroDbPath)) {
309
+ const kiroJsonlPath = resolveKiroJsonlPath();
310
+ if (fssync.existsSync(kiroDbPath) || fssync.existsSync(kiroJsonlPath)) {
309
311
  if (progress?.enabled) {
310
312
  progress.start(`Parsing Kiro ${renderBar(0)} | buckets 0`);
311
313
  }
312
314
  kiroResult = await parseKiroIncremental({
313
315
  dbPath: kiroDbPath,
316
+ jsonlPath: kiroJsonlPath,
314
317
  cursors,
315
318
  queuePath,
316
319
  onProgress: (p) => {
@@ -133,16 +133,120 @@ async function startLocalCallbackServer({ callbackPath, timeoutMs, redirectUrl }
133
133
  return { callbackUrl, waitForCallback };
134
134
  }
135
135
 
136
+ function detectDefaultBrowser() {
137
+ try {
138
+ const raw = cp.execFileSync("defaults", [
139
+ "read", "com.apple.LaunchServices/com.apple.launchservices.secure", "LSHandlers",
140
+ ], { encoding: "utf8", timeout: 3000 });
141
+ const match = raw.match(/https[\s\S]*?LSHandlerRoleAll\s*=\s*"([^"]+)"/);
142
+ if (!match) return null;
143
+ const bundleId = match[1].toLowerCase();
144
+ if (bundleId.includes("chrome")) return "Google Chrome";
145
+ if (bundleId.includes("safari")) return "Safari";
146
+ if (bundleId.includes("edgemac")) return "Microsoft Edge";
147
+ if (bundleId.includes("thebrowser") || bundleId.includes("arc")) return "Arc";
148
+ return null;
149
+ } catch (_e) {
150
+ return null;
151
+ }
152
+ }
153
+
154
+ function buildBrowserList() {
155
+ const all = ["Google Chrome", "Safari", "Microsoft Edge", "Arc"];
156
+ const def = detectDefaultBrowser();
157
+ if (!def) return all;
158
+ return [def, ...all.filter((b) => b !== def)];
159
+ }
160
+
136
161
  function openInBrowser(url) {
137
162
  const platform = process.platform;
138
163
 
164
+ if (platform === "darwin") {
165
+ // On macOS, prefer reusing a matching tab in a supported running browser.
166
+ // Supported browsers are checked with the user's default browser first.
167
+ const browsers = buildBrowserList();
168
+ const listLiteral = browsers.map((b) => `"${b}"`).join(", ");
169
+ const script = `
170
+ tell application "System Events"
171
+ set browserList to {${listLiteral}}
172
+ set runningBrowser to ""
173
+ repeat with b in browserList
174
+ if (exists process (b as text)) then
175
+ set runningBrowser to (b as text)
176
+ exit repeat
177
+ end if
178
+ end repeat
179
+ end tell
180
+
181
+ if runningBrowser is "" then
182
+ open location "${url}"
183
+ else if runningBrowser is "Google Chrome" then
184
+ tell application "Google Chrome"
185
+ set found to false
186
+ repeat with w in windows
187
+ set tabIndex to 0
188
+ repeat with t in tabs of w
189
+ set tabIndex to tabIndex + 1
190
+ if URL of t starts with "${url}" then
191
+ set active tab index of w to tabIndex
192
+ set index of w to 1
193
+ reload t
194
+ activate
195
+ set found to true
196
+ exit repeat
197
+ end if
198
+ end repeat
199
+ if found then exit repeat
200
+ end repeat
201
+ if not found then
202
+ open location "${url}"
203
+ activate
204
+ end if
205
+ end tell
206
+ else if runningBrowser is "Safari" then
207
+ tell application "Safari"
208
+ set found to false
209
+ repeat with w in windows
210
+ set tabIndex to 0
211
+ repeat with t in tabs of w
212
+ set tabIndex to tabIndex + 1
213
+ if URL of t starts with "${url}" then
214
+ set current tab of w to t
215
+ set index of w to 1
216
+ do JavaScript "location.reload()" in t
217
+ activate
218
+ set found to true
219
+ exit repeat
220
+ end if
221
+ end repeat
222
+ if found then exit repeat
223
+ end repeat
224
+ if not found then
225
+ open location "${url}"
226
+ activate
227
+ end if
228
+ end tell
229
+ else
230
+ open location "${url}"
231
+ end if
232
+ `;
233
+ try {
234
+ const child = cp.spawn("osascript", ["-e", script], { stdio: "ignore", detached: true });
235
+ child.unref();
236
+ } catch (_e) {
237
+ // Fallback to plain open
238
+ try {
239
+ const child = cp.spawn("open", [url], { stdio: "ignore", detached: true });
240
+ child.unref();
241
+ } catch (_e2) {}
242
+ }
243
+ return;
244
+ }
245
+
139
246
  let cmd = null;
140
247
  let args = [];
141
248
 
142
- if (platform === "darwin") {
143
- cmd = "open";
144
- args = [url];
145
- } else if (platform === "win32") {
249
+ if (platform === "win32") {
146
250
  cmd = "cmd";
147
251
  args = ["/c", "start", "", url];
148
252
  } else {
@@ -2604,7 +2604,7 @@ async function parseCursorApiIncremental({
2604
2604
  }
2605
2605
 
2606
2606
  // ---------------------------------------------------------------------------
2607
- // Kiro token tracking (reads from devdata.sqlite)
2607
+ // Kiro token tracking (reads from devdata.sqlite or tokens_generated.jsonl)
2608
2608
  // ---------------------------------------------------------------------------
2609
2609
 
2610
2610
  function resolveKiroBasePath() {
@@ -2624,6 +2624,10 @@ function resolveKiroDbPath() {
2624
2624
  return path.join(resolveKiroBasePath(), "dev_data", "devdata.sqlite");
2625
2625
  }
2626
2626
 
2627
+ function resolveKiroJsonlPath() {
2628
+ return path.join(resolveKiroBasePath(), "dev_data", "tokens_generated.jsonl");
2629
+ }
2630
+
2627
2631
  function readKiroDbTokens(dbPath, sinceId) {
2628
2632
  if (!dbPath || !fssync.existsSync(dbPath)) return [];
2629
2633
  const minId = Number.isFinite(sinceId) && sinceId > 0 ? sinceId : 0;
@@ -2648,6 +2652,53 @@ function readKiroDbTokens(dbPath, sinceId) {
2648
2652
  return Array.isArray(rows) ? rows : [];
2649
2653
  }
2650
2654
 
2655
+ // Read Kiro token data from JSONL fallback (tokens_generated.jsonl).
2656
+ // Each line: {"model":"agent","provider":"kiro","promptTokens":N,"generatedTokens":N}
2657
+ // The fallback file does not include per-row timestamps, so newly appended rows are
2658
+ // bucketed using the file mtime observed during this sync. We track a separate JSONL
2659
+ // cursor so it never shares state with the SQLite path.
2660
+ function readKiroJsonlTokens(jsonlPath, sinceLineIndex) {
2661
+ if (!jsonlPath || !fssync.existsSync(jsonlPath)) {
2662
+ return { rows: [], lineCount: 0, reset: false };
2663
+ }
2664
+ const startLine = Number.isFinite(sinceLineIndex) && sinceLineIndex > 0 ? sinceLineIndex : 0;
2665
+ let raw;
2666
+ try {
2667
+ raw = fssync.readFileSync(jsonlPath, "utf8");
2668
+ } catch (_e) {
2669
+ return { rows: [], lineCount: 0, reset: false };
2670
+ }
2671
+ const lines = raw.split("\n").filter((l) => l.trim());
2672
+ const lineCount = lines.length;
2673
+ if (startLine > lineCount) {
2674
+ return { rows: [], lineCount, reset: true };
2675
+ }
2676
+ let mtime;
2677
+ try {
2678
+ mtime = fssync.statSync(jsonlPath).mtime.toISOString();
2679
+ } catch (_e) {
2680
+ mtime = new Date().toISOString();
2681
+ }
2682
+ const timestamp = mtime.replace("T", " ").replace("Z", "").slice(0, 19);
2683
+ const rows = [];
2684
+ for (let i = startLine; i < lines.length; i++) {
2685
+ try {
2686
+ const obj = JSON.parse(lines[i]);
2687
+ rows.push({
2688
+ id: i + 1,
2689
+ model: obj.model || "agent",
2690
+ provider: obj.provider || "kiro",
2691
+ tokens_prompt: obj.promptTokens || 0,
2692
+ tokens_generated: obj.generatedTokens || 0,
2693
+ timestamp,
2694
+ });
2695
+ } catch (_e) {
2696
+ // skip malformed lines
2697
+ }
2698
+ }
2699
+ return { rows, lineCount, reset: false };
2700
+ }
2701
+
2651
2702
  // Build a sorted timeline of model usage from Kiro .chat metadata files
2652
2703
  function buildKiroModelTimeline(basePath) {
2653
2704
  const timeline = []; // [{ startMs, endMs, model }]
@@ -2730,14 +2781,49 @@ function normalizeKiroModelName(raw) {
2730
2781
  return name || null;
2731
2782
  }
2732
2783
 
2733
- async function parseKiroIncremental({ dbPath, cursors, queuePath, onProgress }) {
2784
+ async function parseKiroIncremental({ dbPath, jsonlPath, cursors, queuePath, onProgress }) {
2734
2785
  await ensureDir(path.dirname(queuePath));
2735
2786
  const kiroState = cursors.kiro && typeof cursors.kiro === "object" ? cursors.kiro : {};
2736
- const lastId = typeof kiroState.lastId === "number" ? kiroState.lastId : 0;
2787
+ const lastDbId = typeof kiroState.lastDbId === "number"
2788
+ ? kiroState.lastDbId
2789
+ : (typeof kiroState.lastId === "number" ? kiroState.lastId : 0);
2790
+ const jsonlState = kiroState.jsonl && typeof kiroState.jsonl === "object" ? kiroState.jsonl : {};
2791
+ const lastJsonlLine = typeof jsonlState.lastLine === "number" ? jsonlState.lastLine : 0;
2737
2792
 
2738
2793
  const resolvedDbPath = dbPath || resolveKiroDbPath();
2739
- const rows = readKiroDbTokens(resolvedDbPath, lastId);
2794
+ const resolvedJsonlPath = jsonlPath || resolveKiroJsonlPath();
2795
+
2796
+ // Try SQLite first, fall back to JSONL.
2797
+ let rows = [];
2798
+ let nextDbId = lastDbId;
2799
+ let nextJsonlLine = lastJsonlLine;
2800
+ let usingDb = false;
2801
+ if (fssync.existsSync(resolvedDbPath)) {
2802
+ rows = readKiroDbTokens(resolvedDbPath, lastDbId);
2803
+ usingDb = true;
2804
+ } else if (fssync.existsSync(resolvedJsonlPath)) {
2805
+ const jsonlResult = readKiroJsonlTokens(resolvedJsonlPath, lastJsonlLine);
2806
+ rows = jsonlResult.rows;
2807
+ nextJsonlLine = jsonlResult.lineCount;
2808
+ if (jsonlResult.reset) {
2809
+ cursors.kiro = {
2810
+ ...kiroState,
2811
+ lastDbId,
2812
+ jsonl: { lastLine: jsonlResult.lineCount, updatedAt: new Date().toISOString() },
2813
+ updatedAt: new Date().toISOString(),
2814
+ };
2815
+ return { recordsProcessed: 0, eventsAggregated: 0, bucketsQueued: 0 };
2816
+ }
2817
+ } else {
2818
+ return { recordsProcessed: 0, eventsAggregated: 0, bucketsQueued: 0 };
2819
+ }
2740
2820
  if (rows.length === 0) {
2821
+ cursors.kiro = {
2822
+ ...kiroState,
2823
+ lastDbId,
2824
+ jsonl: { lastLine: nextJsonlLine, updatedAt: new Date().toISOString() },
2825
+ updatedAt: new Date().toISOString(),
2826
+ };
2741
2827
  return { recordsProcessed: 0, eventsAggregated: 0, bucketsQueued: 0 };
2742
2828
  }
2743
2829
 
@@ -2749,7 +2835,7 @@ async function parseKiroIncremental({ dbPath, cursors, queuePath, onProgress })
2749
2835
  const touchedBuckets = new Set();
2750
2836
  const cb = typeof onProgress === "function" ? onProgress : null;
2751
2837
  let eventsAggregated = 0;
2752
- let maxId = lastId;
2838
+ let maxId = lastDbId;
2753
2839
 
2754
2840
  for (let i = 0; i < rows.length; i++) {
2755
2841
  const row = rows[i];
@@ -2780,7 +2866,7 @@ async function parseKiroIncremental({ dbPath, cursors, queuePath, onProgress })
2780
2866
  touchedBuckets.add(bucketKey("kiro", model, bucketStart));
2781
2867
  eventsAggregated++;
2782
2868
 
2783
- if (row.id && row.id > maxId) maxId = row.id;
2869
+ if (usingDb && row.id && row.id > maxId) maxId = row.id;
2784
2870
 
2785
2871
  if (cb) {
2786
2872
  cb({
@@ -2794,9 +2880,16 @@ async function parseKiroIncremental({ dbPath, cursors, queuePath, onProgress })
2794
2880
  }
2795
2881
 
2796
2882
  const bucketsQueued = await enqueueTouchedBuckets({ queuePath, hourlyState, touchedBuckets });
2797
- hourlyState.updatedAt = new Date().toISOString();
2883
+ const updatedAt = new Date().toISOString();
2884
+ hourlyState.updatedAt = updatedAt;
2798
2885
  cursors.hourly = hourlyState;
2799
- cursors.kiro = { lastId: maxId, updatedAt: new Date().toISOString() };
2886
+ cursors.kiro = {
2887
+ ...kiroState,
2888
+ lastId: maxId,
2889
+ lastDbId: maxId,
2890
+ jsonl: { lastLine: nextJsonlLine, updatedAt },
2891
+ updatedAt,
2892
+ };
2800
2893
 
2801
2894
  return { recordsProcessed: rows.length, eventsAggregated, bucketsQueued };
2802
2895
  }
@@ -2808,6 +2901,7 @@ module.exports = {
2808
2901
  listOpencodeMessageFiles,
2809
2902
  readOpencodeDbMessages,
2810
2903
  resolveKiroDbPath,
2904
+ resolveKiroJsonlPath,
2811
2905
  parseRolloutIncremental,
2812
2906
  parseClaudeIncremental,
2813
2907
  parseGeminiIncremental,