@ai-sdk/devtools 1.0.5 → 1.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -2
- package/dist/client/assets/index-Beo4T2zg.js +200 -0
- package/dist/client/assets/index-CIZI8r26.css +1 -0
- package/dist/client/index.html +2 -2
- package/dist/viewer/server.js +4 -2
- package/package.json +5 -3
- package/src/viewer/client/app.tsx +24 -5
- package/src/viewer/client/components/message-components.tsx +1 -1
- package/src/viewer/client/components/output-components.tsx +7 -7
- package/src/viewer/client/components/shared-components.tsx +21 -21
- package/src/viewer/client/components/step-card.tsx +10 -12
- package/src/viewer/client/components/theme-toggle.tsx +33 -0
- package/src/viewer/client/components/trace-timeline.tsx +18 -18
- package/src/viewer/client/components/ui/badge.tsx +1 -1
- package/src/viewer/client/components/ui/button.tsx +1 -1
- package/src/viewer/client/components/ui/scroll-area.tsx +1 -1
- package/src/viewer/client/main.tsx +16 -1
- package/src/viewer/client/styles.css +60 -18
- package/src/viewer/client/theme.ts +59 -0
- package/src/viewer/client/utils.ts +12 -12
- package/src/viewer/server.ts +3 -1
- package/dist/client/assets/index-BVPj3Knk.css +0 -1
- package/dist/client/assets/index-DKzNaLaQ.js +0 -190
|
@@ -0,0 +1 @@
|
|
|
1
|
+
/*! tailwindcss v4.3.0 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-space-y-reverse:0;--tw-divide-x-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-animation-delay:0s;--tw-animation-direction:normal;--tw-animation-duration:initial;--tw-animation-fill-mode:none;--tw-animation-iteration-count:1;--tw-enter-blur:0;--tw-enter-opacity:1;--tw-enter-rotate:0;--tw-enter-scale:1;--tw-enter-translate-x:0;--tw-enter-translate-y:0;--tw-exit-blur:0;--tw-exit-opacity:1;--tw-exit-rotate:0;--tw-exit-scale:1;--tw-exit-translate-x:0;--tw-exit-translate-y:0}}}@layer theme{:root,:host{--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-sm:24rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--font-weight-medium:500;--font-weight-semibold:600;--tracking-wider:.05em;--leading-tight:1.25;--leading-relaxed:1.625;--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:"Geist Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;--default-mono-font-family:"Geist Mono", ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}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;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}*{border-color:var(--border);outline-color:var(--ring)}body{background-color:var(--background);color:var(--foreground);font-family:Geist Sans,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}code,pre,kbd{font-family:Geist Mono,ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,monospace}*{scrollbar-width:thin;scrollbar-color:var(--border) transparent}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background-color:var(--border);border-radius:4px}::-webkit-scrollbar-thumb:hover{background-color:var(--muted-foreground)}::-webkit-scrollbar-corner{background:0 0}}@layer components;@layer utilities{.\@container\/card-header{container:card-header/inline-size}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.inset-0{inset:calc(var(--spacing) * 0)}.top-0{top:calc(var(--spacing) * 0)}.top-1{top:calc(var(--spacing) * 1)}.top-1\.5{top:calc(var(--spacing) * 1.5)}.right-1\.5{right:calc(var(--spacing) * 1.5)}.bottom-0{bottom:calc(var(--spacing) * 0)}.bottom-1{bottom:calc(var(--spacing) * 1)}.z-10{z-index:10}.z-50{z-index:50}.col-start-2{grid-column-start:2}.row-span-2{grid-row:span 2/span 2}.row-start-1{grid-row-start:1}.mx-1{margin-inline:calc(var(--spacing) * 1)}.mx-auto{margin-inline:auto}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-auto{margin-top:auto}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-5{margin-bottom:calc(var(--spacing) * 5)}.ml-1{margin-left:calc(var(--spacing) * 1)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-5\.5{margin-left:calc(var(--spacing) * 5.5)}.ml-auto{margin-left:auto}.line-clamp-1{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.line-clamp-3{-webkit-line-clamp:3;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.line-clamp-6{-webkit-line-clamp:6;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline-flex{display:inline-flex}.size-2\.5{width:calc(var(--spacing) * 2.5);height:calc(var(--spacing) * 2.5)}.size-3{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.size-3\.5{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.size-9{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9)}.size-10{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10)}.size-full{width:100%;height:100%}.h-2{height:calc(var(--spacing) * 2)}.h-2\.5{height:calc(var(--spacing) * 2.5)}.h-5{height:calc(var(--spacing) * 5)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-auto{height:auto}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-20{max-height:calc(var(--spacing) * 20)}.max-h-40{max-height:calc(var(--spacing) * 40)}.max-h-60{max-height:calc(var(--spacing) * 60)}.max-h-\[400px\]{max-height:400px}.min-h-\[calc\(100vh-57px\)\]{min-height:calc(100vh - 57px)}.min-h-full{min-height:100%}.w-1{width:calc(var(--spacing) * 1)}.w-2\.5{width:calc(var(--spacing) * 2.5)}.w-4{width:calc(var(--spacing) * 4)}.w-\[100px\]{width:100px}.w-\[300px\]{width:300px}.w-\[800px\]{width:800px}.w-fit{width:fit-content}.w-full{width:100%}.max-w-\[200px\]{max-width:200px}.max-w-sm{max-width:var(--container-sm)}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:calc(var(--spacing) * 0)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.origin-\(--radix-tooltip-content-transform-origin\){transform-origin:var(--radix-tooltip-content-transform-origin)}.-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.rotate-90{rotate:90deg}.rotate-180{rotate:180deg}.animate-in{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-col-resize{cursor:col-resize}.cursor-help{cursor:help}.cursor-pointer{cursor:pointer}.touch-none{touch-action:none}.auto-rows-min{grid-auto-rows:min-content}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-rows-\[auto_auto\]{grid-template-rows:auto auto}.flex-col{flex-direction:column}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-start{justify-content:flex-start}.gap-0{gap:calc(var(--spacing) * 0)}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-6{gap:calc(var(--spacing) * 6)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}:where(.divide-x>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px * var(--tw-divide-x-reverse));border-inline-end-width:calc(1px * calc(1 - var(--tw-divide-x-reverse)))}:where(.divide-border>:not(:last-child)){border-color:var(--border)}.self-start{align-self:flex-start}.self-stretch{align-self:stretch}.justify-self-end{justify-self:flex-end}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-\[inherit\]{border-radius:inherit}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-sm{border-radius:calc(var(--radius) - 4px)}.rounded-xl{border-radius:calc(var(--radius) + 4px)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-agent\/20{border-color:var(--agent)}@supports (color:color-mix(in lab,red,red)){.border-agent\/20{border-color:color-mix(in oklab,var(--agent) 20%,transparent)}}.border-agent\/30{border-color:var(--agent)}@supports (color:color-mix(in lab,red,red)){.border-agent\/30{border-color:color-mix(in oklab,var(--agent) 30%,transparent)}}.border-border,.border-border\/20{border-color:var(--border)}@supports (color:color-mix(in lab,red,red)){.border-border\/20{border-color:color-mix(in oklab,var(--border) 20%,transparent)}}.border-border\/30{border-color:var(--border)}@supports (color:color-mix(in lab,red,red)){.border-border\/30{border-color:color-mix(in oklab,var(--border) 30%,transparent)}}.border-border\/50{border-color:var(--border)}@supports (color:color-mix(in lab,red,red)){.border-border\/50{border-color:color-mix(in oklab,var(--border) 50%,transparent)}}.border-destructive\/30{border-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.border-destructive\/30{border-color:color-mix(in oklab,var(--destructive) 30%,transparent)}}.border-info\/30{border-color:var(--info)}@supports (color:color-mix(in lab,red,red)){.border-info\/30{border-color:color-mix(in oklab,var(--info) 30%,transparent)}}.border-success\/30{border-color:var(--success)}@supports (color:color-mix(in lab,red,red)){.border-success\/30{border-color:color-mix(in oklab,var(--success) 30%,transparent)}}.border-tool\/30{border-color:var(--tool)}@supports (color:color-mix(in lab,red,red)){.border-tool\/30{border-color:color-mix(in oklab,var(--tool) 30%,transparent)}}.border-transparent{border-color:#0000}.border-warning\/20{border-color:var(--warning)}@supports (color:color-mix(in lab,red,red)){.border-warning\/20{border-color:color-mix(in oklab,var(--warning) 20%,transparent)}}.border-warning\/30{border-color:var(--warning)}@supports (color:color-mix(in lab,red,red)){.border-warning\/30{border-color:color-mix(in oklab,var(--warning) 30%,transparent)}}.border-t-transparent{border-top-color:#0000}.border-l-transparent{border-left-color:#0000}.bg-accent{background-color:var(--accent)}.bg-agent,.bg-agent\/10{background-color:var(--agent)}@supports (color:color-mix(in lab,red,red)){.bg-agent\/10{background-color:color-mix(in oklab,var(--agent) 10%,transparent)}}.bg-agent\/20{background-color:var(--agent)}@supports (color:color-mix(in lab,red,red)){.bg-agent\/20{background-color:color-mix(in oklab,var(--agent) 20%,transparent)}}.bg-background,.bg-background\/50{background-color:var(--background)}@supports (color:color-mix(in lab,red,red)){.bg-background\/50{background-color:color-mix(in oklab,var(--background) 50%,transparent)}}.bg-black\/50{background-color:#00000080}@supports (color:color-mix(in lab,red,red)){.bg-black\/50{background-color:color-mix(in oklab,var(--color-black) 50%,transparent)}}.bg-border{background-color:var(--border)}.bg-card,.bg-card\/50{background-color:var(--card)}@supports (color:color-mix(in lab,red,red)){.bg-card\/50{background-color:color-mix(in oklab,var(--card) 50%,transparent)}}.bg-danger,.bg-danger\/20{background-color:var(--danger)}@supports (color:color-mix(in lab,red,red)){.bg-danger\/20{background-color:color-mix(in oklab,var(--danger) 20%,transparent)}}.bg-destructive,.bg-destructive\/10{background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.bg-destructive\/10{background-color:color-mix(in oklab,var(--destructive) 10%,transparent)}}.bg-info,.bg-info\/10{background-color:var(--info)}@supports (color:color-mix(in lab,red,red)){.bg-info\/10{background-color:color-mix(in oklab,var(--info) 10%,transparent)}}.bg-info\/15{background-color:var(--info)}@supports (color:color-mix(in lab,red,red)){.bg-info\/15{background-color:color-mix(in oklab,var(--info) 15%,transparent)}}.bg-info\/20{background-color:var(--info)}@supports (color:color-mix(in lab,red,red)){.bg-info\/20{background-color:color-mix(in oklab,var(--info) 20%,transparent)}}.bg-muted,.bg-muted\/10{background-color:var(--muted)}@supports (color:color-mix(in lab,red,red)){.bg-muted\/10{background-color:color-mix(in oklab,var(--muted) 10%,transparent)}}.bg-muted\/20{background-color:var(--muted)}@supports (color:color-mix(in lab,red,red)){.bg-muted\/20{background-color:color-mix(in oklab,var(--muted) 20%,transparent)}}.bg-muted\/30{background-color:var(--muted)}@supports (color:color-mix(in lab,red,red)){.bg-muted\/30{background-color:color-mix(in oklab,var(--muted) 30%,transparent)}}.bg-primary{background-color:var(--primary)}.bg-secondary{background-color:var(--secondary)}.bg-sidebar{background-color:var(--sidebar)}.bg-sidebar-primary\/10{background-color:var(--sidebar-primary)}@supports (color:color-mix(in lab,red,red)){.bg-sidebar-primary\/10{background-color:color-mix(in oklab,var(--sidebar-primary) 10%,transparent)}}.bg-success,.bg-success\/5{background-color:var(--success)}@supports (color:color-mix(in lab,red,red)){.bg-success\/5{background-color:color-mix(in oklab,var(--success) 5%,transparent)}}.bg-success\/10{background-color:var(--success)}@supports (color:color-mix(in lab,red,red)){.bg-success\/10{background-color:color-mix(in oklab,var(--success) 10%,transparent)}}.bg-success\/15{background-color:var(--success)}@supports (color:color-mix(in lab,red,red)){.bg-success\/15{background-color:color-mix(in oklab,var(--success) 15%,transparent)}}.bg-success\/20{background-color:var(--success)}@supports (color:color-mix(in lab,red,red)){.bg-success\/20{background-color:color-mix(in oklab,var(--success) 20%,transparent)}}.bg-tool,.bg-tool\/10{background-color:var(--tool)}@supports (color:color-mix(in lab,red,red)){.bg-tool\/10{background-color:color-mix(in oklab,var(--tool) 10%,transparent)}}.bg-tool\/20{background-color:var(--tool)}@supports (color:color-mix(in lab,red,red)){.bg-tool\/20{background-color:color-mix(in oklab,var(--tool) 20%,transparent)}}.bg-warning,.bg-warning\/5{background-color:var(--warning)}@supports (color:color-mix(in lab,red,red)){.bg-warning\/5{background-color:color-mix(in oklab,var(--warning) 5%,transparent)}}.bg-warning\/10{background-color:var(--warning)}@supports (color:color-mix(in lab,red,red)){.bg-warning\/10{background-color:color-mix(in oklab,var(--warning) 10%,transparent)}}.bg-warning\/20{background-color:var(--warning)}@supports (color:color-mix(in lab,red,red)){.bg-warning\/20{background-color:color-mix(in oklab,var(--warning) 20%,transparent)}}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-2\.5{padding:calc(var(--spacing) * 2.5)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-px{padding:1px}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-0{padding-block:calc(var(--spacing) * 0)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-6{padding-block:calc(var(--spacing) * 6)}.pt-0\.5{padding-top:calc(var(--spacing) * .5)}.pt-1{padding-top:calc(var(--spacing) * 1)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-2\.5{padding-bottom:calc(var(--spacing) * 2.5)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pl-1{padding-left:calc(var(--spacing) * 1)}.text-center{text-align:center}.text-left{text-align:left}.font-mono{font-family:Geist Mono,ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,monospace}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[13px\]{font-size:13px}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.text-balance{text-wrap:balance}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-agent{color:var(--agent)}.text-card-foreground{color:var(--card-foreground)}.text-danger{color:var(--danger)}.text-destructive{color:var(--destructive)}.text-destructive-foreground{color:var(--destructive-foreground)}.text-foreground,.text-foreground\/80{color:var(--foreground)}@supports (color:color-mix(in lab,red,red)){.text-foreground\/80{color:color-mix(in oklab,var(--foreground) 80%,transparent)}}.text-foreground\/90{color:var(--foreground)}@supports (color:color-mix(in lab,red,red)){.text-foreground\/90{color:color-mix(in oklab,var(--foreground) 90%,transparent)}}.text-info{color:var(--info)}.text-muted-foreground,.text-muted-foreground\/30{color:var(--muted-foreground)}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/30{color:color-mix(in oklab,var(--muted-foreground) 30%,transparent)}}.text-muted-foreground\/50{color:var(--muted-foreground)}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/50{color:color-mix(in oklab,var(--muted-foreground) 50%,transparent)}}.text-muted-foreground\/60{color:var(--muted-foreground)}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/60{color:color-mix(in oklab,var(--muted-foreground) 60%,transparent)}}.text-muted-foreground\/70{color:var(--muted-foreground)}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/70{color:color-mix(in oklab,var(--muted-foreground) 70%,transparent)}}.text-primary{color:var(--primary)}.text-primary-foreground{color:var(--primary-foreground)}.text-secondary-foreground{color:var(--secondary-foreground)}.text-sidebar-primary{color:var(--sidebar-primary)}.text-success{color:var(--success)}.text-tool{color:var(--tool)}.text-warning{color:var(--warning)}.text-white{color:var(--color-white)}.capitalize{text-transform:capitalize}.uppercase{text-transform:uppercase}.italic{font-style:italic}.underline-offset-4{text-underline-offset:4px}.opacity-0{opacity:0}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-foreground\/50{--tw-ring-color:var(--foreground)}@supports (color:color-mix(in lab,red,red)){.ring-foreground\/50{--tw-ring-color:color-mix(in oklab, var(--foreground) 50%, transparent)}}.ring-info\/50{--tw-ring-color:var(--info)}@supports (color:color-mix(in lab,red,red)){.ring-info\/50{--tw-ring-color:color-mix(in oklab, var(--info) 50%, transparent)}}.ring-offset-1{--tw-ring-offset-width:1px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.ring-offset-background{--tw-ring-offset-color:var(--background)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.transition-\[color\,box-shadow\]{transition-property:color,box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.fade-in-0{--tw-enter-opacity:0}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.zoom-in-95{--tw-enter-scale:.95}@media(hover:hover){.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}}.group-data-\[vaul-drawer-direction\=bottom\]\/drawer-content\:block:is(:where(.group\/drawer-content)[data-vaul-drawer-direction=bottom] *){display:block}.group-data-\[vaul-drawer-direction\=bottom\]\/drawer-content\:text-center:is(:where(.group\/drawer-content)[data-vaul-drawer-direction=bottom] *),.group-data-\[vaul-drawer-direction\=top\]\/drawer-content\:text-center:is(:where(.group\/drawer-content)[data-vaul-drawer-direction=top] *){text-align:center}@media(hover:hover){.hover\:bg-accent:hover,.hover\:bg-accent\/30:hover{background-color:var(--accent)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-accent\/30:hover{background-color:color-mix(in oklab,var(--accent) 30%,transparent)}}.hover\:bg-accent\/50:hover{background-color:var(--accent)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-accent\/50:hover{background-color:color-mix(in oklab,var(--accent) 50%,transparent)}}.hover\:bg-agent\/15:hover{background-color:var(--agent)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-agent\/15:hover{background-color:color-mix(in oklab,var(--agent) 15%,transparent)}}.hover\:bg-destructive\/20:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-destructive\/20:hover{background-color:color-mix(in oklab,var(--destructive) 20%,transparent)}}.hover\:bg-destructive\/90:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-destructive\/90:hover{background-color:color-mix(in oklab,var(--destructive) 90%,transparent)}}.hover\:bg-info\/20:hover{background-color:var(--info)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-info\/20:hover{background-color:color-mix(in oklab,var(--info) 20%,transparent)}}.hover\:bg-muted\/50:hover{background-color:var(--muted)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-muted\/50:hover{background-color:color-mix(in oklab,var(--muted) 50%,transparent)}}.hover\:bg-primary\/30:hover{background-color:var(--primary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/30:hover{background-color:color-mix(in oklab,var(--primary) 30%,transparent)}}.hover\:bg-primary\/90:hover{background-color:var(--primary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab,var(--primary) 90%,transparent)}}.hover\:bg-secondary\/80:hover{background-color:var(--secondary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-secondary\/80:hover{background-color:color-mix(in oklab,var(--secondary) 80%,transparent)}}.hover\:bg-success\/20:hover{background-color:var(--success)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-success\/20:hover{background-color:color-mix(in oklab,var(--success) 20%,transparent)}}.hover\:bg-tool\/20:hover{background-color:var(--tool)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-tool\/20:hover{background-color:color-mix(in oklab,var(--tool) 20%,transparent)}}.hover\:bg-warning\/20:hover{background-color:var(--warning)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-warning\/20:hover{background-color:color-mix(in oklab,var(--warning) 20%,transparent)}}.hover\:text-accent-foreground:hover{color:var(--accent-foreground)}.hover\:text-foreground:hover{color:var(--foreground)}.hover\:underline:hover{text-decoration-line:underline}}.focus-visible\:border-ring:focus-visible{border-color:var(--ring)}.focus-visible\:ring-\[3px\]:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.focus-visible\:ring-ring:focus-visible{--tw-ring-color:var(--ring)}.focus-visible\:outline-1:focus-visible{outline-style:var(--tw-outline-style);outline-width:1px}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:opacity-50:disabled{opacity:.5}.has-data-\[slot\=card-action\]\:grid-cols-\[1fr_auto\]:has([data-slot=card-action]){grid-template-columns:1fr auto}.has-\[\>svg\]\:px-2\.5:has(>svg){padding-inline:calc(var(--spacing) * 2.5)}.has-\[\>svg\]\:px-3:has(>svg){padding-inline:calc(var(--spacing) * 3)}.has-\[\>svg\]\:px-4:has(>svg){padding-inline:calc(var(--spacing) * 4)}.aria-invalid\:border-destructive[aria-invalid=true]{border-color:var(--destructive)}.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.data-\[side\=bottom\]\:slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y:calc(2*var(--spacing)*-1)}.data-\[side\=left\]\:slide-in-from-right-2[data-side=left]{--tw-enter-translate-x:calc(2*var(--spacing))}.data-\[side\=right\]\:slide-in-from-left-2[data-side=right]{--tw-enter-translate-x:calc(2*var(--spacing)*-1)}.data-\[side\=top\]\:slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y:calc(2*var(--spacing))}.data-\[state\=closed\]\:animate-out[data-state=closed]{animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-\[state\=closed\]\:fade-out-0[data-state=closed]{--tw-exit-opacity:0}.data-\[state\=closed\]\:zoom-out-95[data-state=closed]{--tw-exit-scale:.95}.data-\[state\=open\]\:animate-in[data-state=open]{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-\[state\=open\]\:fade-in-0[data-state=open]{--tw-enter-opacity:0}.data-\[vaul-drawer-direction\=bottom\]\:inset-x-0[data-vaul-drawer-direction=bottom]{inset-inline:calc(var(--spacing) * 0)}.data-\[vaul-drawer-direction\=bottom\]\:bottom-0[data-vaul-drawer-direction=bottom]{bottom:calc(var(--spacing) * 0)}.data-\[vaul-drawer-direction\=bottom\]\:mt-24[data-vaul-drawer-direction=bottom]{margin-top:calc(var(--spacing) * 24)}.data-\[vaul-drawer-direction\=bottom\]\:max-h-\[80vh\][data-vaul-drawer-direction=bottom]{max-height:80vh}.data-\[vaul-drawer-direction\=bottom\]\:rounded-t-lg[data-vaul-drawer-direction=bottom]{border-top-left-radius:var(--radius);border-top-right-radius:var(--radius)}.data-\[vaul-drawer-direction\=bottom\]\:border-t[data-vaul-drawer-direction=bottom]{border-top-style:var(--tw-border-style);border-top-width:1px}.data-\[vaul-drawer-direction\=left\]\:inset-y-0[data-vaul-drawer-direction=left]{inset-block:calc(var(--spacing) * 0)}.data-\[vaul-drawer-direction\=left\]\:left-0[data-vaul-drawer-direction=left]{left:calc(var(--spacing) * 0)}.data-\[vaul-drawer-direction\=left\]\:w-3\/4[data-vaul-drawer-direction=left]{width:75%}.data-\[vaul-drawer-direction\=left\]\:border-r[data-vaul-drawer-direction=left]{border-right-style:var(--tw-border-style);border-right-width:1px}.data-\[vaul-drawer-direction\=right\]\:inset-y-0[data-vaul-drawer-direction=right]{inset-block:calc(var(--spacing) * 0)}.data-\[vaul-drawer-direction\=right\]\:right-0[data-vaul-drawer-direction=right]{right:calc(var(--spacing) * 0)}.data-\[vaul-drawer-direction\=right\]\:border-l[data-vaul-drawer-direction=right]{border-left-style:var(--tw-border-style);border-left-width:1px}.data-\[vaul-drawer-direction\=top\]\:inset-x-0[data-vaul-drawer-direction=top]{inset-inline:calc(var(--spacing) * 0)}.data-\[vaul-drawer-direction\=top\]\:top-0[data-vaul-drawer-direction=top]{top:calc(var(--spacing) * 0)}.data-\[vaul-drawer-direction\=top\]\:mb-24[data-vaul-drawer-direction=top]{margin-bottom:calc(var(--spacing) * 24)}.data-\[vaul-drawer-direction\=top\]\:max-h-\[80vh\][data-vaul-drawer-direction=top]{max-height:80vh}.data-\[vaul-drawer-direction\=top\]\:rounded-b-lg[data-vaul-drawer-direction=top]{border-bottom-right-radius:var(--radius);border-bottom-left-radius:var(--radius)}.data-\[vaul-drawer-direction\=top\]\:border-b[data-vaul-drawer-direction=top]{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}@media(min-width:40rem){.sm\:max-w-\[800px\]{max-width:800px}.data-\[vaul-drawer-direction\=left\]\:sm\:max-w-sm[data-vaul-drawer-direction=left]{max-width:var(--container-sm)}}@media(min-width:48rem){.md\:gap-1\.5{gap:calc(var(--spacing) * 1.5)}.md\:text-left{text-align:left}}.dark\:border-input:is(.dark *){border-color:var(--input)}.dark\:bg-destructive\/60:is(.dark *){background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-destructive\/60:is(.dark *){background-color:color-mix(in oklab,var(--destructive) 60%,transparent)}}.dark\:bg-input\/30:is(.dark *){background-color:var(--input)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-input\/30:is(.dark *){background-color:color-mix(in oklab,var(--input) 30%,transparent)}}@media(hover:hover){.dark\:hover\:bg-accent\/50:is(.dark *):hover{background-color:var(--accent)}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-accent\/50:is(.dark *):hover{background-color:color-mix(in oklab,var(--accent) 50%,transparent)}}.dark\:hover\:bg-input\/50:is(.dark *):hover{background-color:var(--input)}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-input\/50:is(.dark *):hover{background-color:color-mix(in oklab,var(--input) 50%,transparent)}}}.dark\:focus-visible\:ring-destructive\/40:is(.dark *):focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.dark\:focus-visible\:ring-destructive\/40:is(.dark *):focus-visible{--tw-ring-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.dark\:aria-invalid\:ring-destructive\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.dark\:aria-invalid\:ring-destructive\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-4 svg:not([class*=size-]){width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\.border-b\]\:pb-6.border-b{padding-bottom:calc(var(--spacing) * 6)}.\[\.border-t\]\:pt-6.border-t{padding-top:calc(var(--spacing) * 6)}.\[\&\>svg\]\:pointer-events-none>svg{pointer-events:none}.\[\&\>svg\]\:size-3>svg{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}@media(hover:hover){a.\[a\&\]\:hover\:bg-accent:hover{background-color:var(--accent)}a.\[a\&\]\:hover\:bg-destructive\/90:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){a.\[a\&\]\:hover\:bg-destructive\/90:hover{background-color:color-mix(in oklab,var(--destructive) 90%,transparent)}}a.\[a\&\]\:hover\:bg-primary\/90:hover{background-color:var(--primary)}@supports (color:color-mix(in lab,red,red)){a.\[a\&\]\:hover\:bg-primary\/90:hover{background-color:color-mix(in oklab,var(--primary) 90%,transparent)}}a.\[a\&\]\:hover\:bg-secondary\/90:hover{background-color:var(--secondary)}@supports (color:color-mix(in lab,red,red)){a.\[a\&\]\:hover\:bg-secondary\/90:hover{background-color:color-mix(in oklab,var(--secondary) 90%,transparent)}}a.\[a\&\]\:hover\:text-accent-foreground:hover{color:var(--accent-foreground)}}}@property --tw-animation-delay{syntax:"*";inherits:false;initial-value:0s}@property --tw-animation-direction{syntax:"*";inherits:false;initial-value:normal}@property --tw-animation-duration{syntax:"*";inherits:false}@property --tw-animation-fill-mode{syntax:"*";inherits:false;initial-value:none}@property --tw-animation-iteration-count{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-translate-y{syntax:"*";inherits:false;initial-value:0}:root,:root[data-theme=dark]{--background:oklch(14.5% 0 0);--foreground:oklch(98.5% 0 0);--card:oklch(17% 0 0);--card-foreground:oklch(98.5% 0 0);--popover:oklch(14.5% 0 0);--popover-foreground:oklch(98.5% 0 0);--primary:oklch(98.5% 0 0);--primary-foreground:oklch(20.5% 0 0);--secondary:oklch(26.9% 0 0);--secondary-foreground:oklch(98.5% 0 0);--muted:oklch(26.9% 0 0);--muted-foreground:oklch(70.8% 0 0);--accent:oklch(26.9% 0 0);--accent-foreground:oklch(98.5% 0 0);--destructive:oklch(39.6% .141 25.723);--destructive-foreground:oklch(63.7% .237 25.331);--border:oklch(26.9% 0 0);--input:oklch(26.9% 0 0);--ring:oklch(60% 0 0);--chart-1:oklch(48.8% .243 264.376);--chart-2:oklch(69.6% .17 162.48);--chart-3:oklch(76.9% .188 70.08);--chart-4:oklch(62.7% .265 303.9);--chart-5:oklch(64.5% .246 16.439);--radius:.625rem;--sidebar:oklch(20.5% 0 0);--sidebar-foreground:oklch(98.5% 0 0);--sidebar-primary:oklch(48.8% .243 264.376);--sidebar-primary-foreground:oklch(98.5% 0 0);--sidebar-accent:oklch(26.9% 0 0);--sidebar-accent-foreground:oklch(98.5% 0 0);--sidebar-border:oklch(26.9% 0 0);--sidebar-ring:oklch(60% 0 0);--info:#60a5fa;--success:#4ade80;--warning:#fbbf24;--tool:#c084fc;--agent:#22d3ee;--danger:#f87171;color-scheme:dark}:root[data-theme=light]{--background:#fff;--foreground:#171717;--card:#fafafa;--card-foreground:#171717;--popover:#fff;--popover-foreground:#171717;--primary:#171717;--primary-foreground:#fafafa;--secondary:#f1f1f1;--secondary-foreground:#262626;--muted:#f1f1f1;--muted-foreground:#525252;--accent:#e5e5e5;--accent-foreground:#171717;--destructive:#dc2626;--destructive-foreground:#b91c1c;--border:#8a8a8a;--input:#8a8a8a;--ring:#737373;--chart-1:#1d4ed8;--chart-2:#15803d;--chart-3:#a16207;--chart-4:#7e22ce;--chart-5:#be123c;--sidebar:#f7f7f7;--sidebar-foreground:#171717;--sidebar-primary:#1d4ed8;--sidebar-primary-foreground:#fff;--sidebar-accent:#e5e5e5;--sidebar-accent-foreground:#171717;--sidebar-border:#8a8a8a;--sidebar-ring:#737373;--info:#1d4ed8;--success:#166534;--warning:#92400e;--tool:#7e22ce;--agent:#0e7490;--danger:#b91c1c;color-scheme:light}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0)scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1))rotate(var(--tw-enter-rotate,0));filter:blur(var(--tw-enter-blur,0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity,1);transform:translate3d(var(--tw-exit-translate-x,0),var(--tw-exit-translate-y,0),0)scale3d(var(--tw-exit-scale,1),var(--tw-exit-scale,1),var(--tw-exit-scale,1))rotate(var(--tw-exit-rotate,0));filter:blur(var(--tw-exit-blur,0))}}
|
package/dist/client/index.html
CHANGED
|
@@ -10,8 +10,8 @@
|
|
|
10
10
|
href="https://fonts.googleapis.com/css2?family=Geist:wght@400;500;600;700&family=Geist+Mono:wght@400;500;600;700&display=swap"
|
|
11
11
|
rel="stylesheet"
|
|
12
12
|
/>
|
|
13
|
-
<script type="module" crossorigin src="/assets/index-
|
|
14
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
13
|
+
<script type="module" crossorigin src="/assets/index-Beo4T2zg.js"></script>
|
|
14
|
+
<link rel="stylesheet" crossorigin href="/assets/index-CIZI8r26.css">
|
|
15
15
|
</head>
|
|
16
16
|
<body>
|
|
17
17
|
<div id="root"></div>
|
package/dist/viewer/server.js
CHANGED
|
@@ -390,8 +390,10 @@ var startViewer = (port = 4983) => {
|
|
|
390
390
|
`);
|
|
391
391
|
console.error(` To use a different port, set AI_SDK_DEVTOOLS_PORT:
|
|
392
392
|
`);
|
|
393
|
-
console.error(
|
|
394
|
-
`
|
|
393
|
+
console.error(
|
|
394
|
+
` AI_SDK_DEVTOOLS_PORT=4984 npx @ai-sdk/devtools@latest
|
|
395
|
+
`
|
|
396
|
+
);
|
|
395
397
|
process.exit(1);
|
|
396
398
|
}
|
|
397
399
|
throw err;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ai-sdk/devtools",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.7",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
"vite": "^6.4.3",
|
|
56
56
|
"vitest": "^4.1.6",
|
|
57
57
|
"zod": "3.25.76",
|
|
58
|
-
"ai": "7.0.
|
|
58
|
+
"ai": "7.0.35"
|
|
59
59
|
},
|
|
60
60
|
"publishConfig": {
|
|
61
61
|
"access": "public",
|
|
@@ -87,7 +87,9 @@
|
|
|
87
87
|
"build": "pnpm build:client && pnpm build:server",
|
|
88
88
|
"build:client": "vite build",
|
|
89
89
|
"build:server": "tsup --tsconfig tsconfig.build.json",
|
|
90
|
-
"test": "
|
|
90
|
+
"test": "pnpm test:unit",
|
|
91
|
+
"test:e2e": "pnpm build:client && playwright test",
|
|
92
|
+
"test:unit": "vitest --config vitest.node.config.js --run",
|
|
91
93
|
"test:watch": "vitest --config vitest.node.config.js"
|
|
92
94
|
}
|
|
93
95
|
}
|
|
@@ -36,13 +36,31 @@ import {
|
|
|
36
36
|
import { TokenBreakdownTooltip } from './components/shared-components';
|
|
37
37
|
import { StepCard } from './components/step-card';
|
|
38
38
|
import { TraceTimeline } from './components/trace-timeline';
|
|
39
|
+
import { ThemeToggle } from './components/theme-toggle';
|
|
40
|
+
import { setTheme, type Theme } from './theme';
|
|
39
41
|
|
|
40
|
-
function App(
|
|
42
|
+
function App({
|
|
43
|
+
initialTheme,
|
|
44
|
+
storage,
|
|
45
|
+
}: {
|
|
46
|
+
initialTheme: Theme;
|
|
47
|
+
storage?: Pick<Storage, 'setItem'>;
|
|
48
|
+
}) {
|
|
41
49
|
const [runs, setRuns] = useState<Run[]>([]);
|
|
42
50
|
const [selectedRun, setSelectedRun] = useState<RunDetail | null>(null);
|
|
43
51
|
const [expandedSteps, setExpandedSteps] = useState<Set<string>>(new Set());
|
|
44
52
|
const [loading, setLoading] = useState(true);
|
|
45
53
|
const [showTimeline, setShowTimeline] = useState(false);
|
|
54
|
+
const [theme, updateTheme] = useState<Theme>(initialTheme);
|
|
55
|
+
|
|
56
|
+
const handleThemeChange = (nextTheme: Theme) => {
|
|
57
|
+
setTheme({
|
|
58
|
+
theme: nextTheme,
|
|
59
|
+
root: document.documentElement,
|
|
60
|
+
storage,
|
|
61
|
+
});
|
|
62
|
+
updateTheme(nextTheme);
|
|
63
|
+
};
|
|
46
64
|
|
|
47
65
|
const fetchRuns = async () => {
|
|
48
66
|
try {
|
|
@@ -245,6 +263,7 @@ function App() {
|
|
|
245
263
|
</span>
|
|
246
264
|
</div>
|
|
247
265
|
<div className="flex gap-2">
|
|
266
|
+
<ThemeToggle theme={theme} onThemeChange={handleThemeChange} />
|
|
248
267
|
<Button
|
|
249
268
|
variant="ghost"
|
|
250
269
|
size="sm"
|
|
@@ -293,7 +312,7 @@ function App() {
|
|
|
293
312
|
>
|
|
294
313
|
<div className="flex items-start gap-2 mb-1.5 min-w-0">
|
|
295
314
|
{run.isInProgress ? (
|
|
296
|
-
<Loader2 className="size-3.5 text-
|
|
315
|
+
<Loader2 className="size-3.5 text-info mt-0.5 shrink-0 animate-spin" />
|
|
297
316
|
) : run.hasError ? (
|
|
298
317
|
<AlertCircle className="size-3.5 text-destructive-foreground mt-0.5 shrink-0" />
|
|
299
318
|
) : (
|
|
@@ -315,8 +334,8 @@ function App() {
|
|
|
315
334
|
<span
|
|
316
335
|
className={`flex items-center gap-1 px-1.5 py-0.5 rounded text-[10px] font-medium ${
|
|
317
336
|
run.type === 'stream'
|
|
318
|
-
? 'bg-
|
|
319
|
-
: 'bg-
|
|
337
|
+
? 'bg-info/15 text-info'
|
|
338
|
+
: 'bg-success/15 text-success'
|
|
320
339
|
}`}
|
|
321
340
|
>
|
|
322
341
|
{run.type === 'stream' && (
|
|
@@ -363,7 +382,7 @@ function App() {
|
|
|
363
382
|
{selectedRun.run.isInProgress && (
|
|
364
383
|
<Badge
|
|
365
384
|
variant="secondary"
|
|
366
|
-
className="text-[10px] h-5 gap-1.5 bg-
|
|
385
|
+
className="text-[10px] h-5 gap-1.5 bg-info/15 text-info border-info/30"
|
|
367
386
|
>
|
|
368
387
|
<Loader2 className="size-3 animate-spin" />
|
|
369
388
|
In Progress
|
|
@@ -97,25 +97,25 @@ function ToolCallCard({
|
|
|
97
97
|
typeof result === 'string' ? safeParseJson(result) : result;
|
|
98
98
|
|
|
99
99
|
return (
|
|
100
|
-
<div className="rounded-md border border-
|
|
100
|
+
<div className="rounded-md border border-tool/30 overflow-hidden">
|
|
101
101
|
<button
|
|
102
|
-
className="w-full flex items-center gap-2 px-3 py-2 bg-
|
|
102
|
+
className="w-full flex items-center gap-2 px-3 py-2 bg-tool/10 hover:bg-tool/20 transition-colors"
|
|
103
103
|
onClick={() => setExpanded(!expanded)}
|
|
104
104
|
>
|
|
105
105
|
<ChevronRight
|
|
106
|
-
className={`size-3 text-
|
|
106
|
+
className={`size-3 text-tool transition-transform shrink-0 ${
|
|
107
107
|
expanded ? 'rotate-90' : ''
|
|
108
108
|
}`}
|
|
109
109
|
/>
|
|
110
|
-
<Wrench className="size-3 text-
|
|
111
|
-
<span className="text-xs font-mono font-medium text-
|
|
110
|
+
<Wrench className="size-3 text-tool shrink-0" />
|
|
111
|
+
<span className="text-xs font-mono font-medium text-tool">
|
|
112
112
|
{toolName}
|
|
113
113
|
</span>
|
|
114
114
|
{!expanded &&
|
|
115
115
|
parsedArgs &&
|
|
116
116
|
typeof parsedArgs === 'object' &&
|
|
117
117
|
!Array.isArray(parsedArgs) && (
|
|
118
|
-
<span className="text-[11px] font-mono text-
|
|
118
|
+
<span className="text-[11px] font-mono text-tool truncate">
|
|
119
119
|
{formatToolParams(parsedArgs)}
|
|
120
120
|
</span>
|
|
121
121
|
)}
|
|
@@ -123,7 +123,7 @@ function ToolCallCard({
|
|
|
123
123
|
|
|
124
124
|
{expanded && (
|
|
125
125
|
<>
|
|
126
|
-
<div className="p-3 bg-card/50 border-t border-
|
|
126
|
+
<div className="p-3 bg-card/50 border-t border-tool/30">
|
|
127
127
|
<div className="text-[10px] font-medium uppercase tracking-wider text-muted-foreground mb-2">
|
|
128
128
|
Input
|
|
129
129
|
</div>
|
|
@@ -326,27 +326,27 @@ export function ReasoningBlock({ content }: { content: string }) {
|
|
|
326
326
|
content.length > 200 ? content.slice(0, 200) + '…' : content;
|
|
327
327
|
|
|
328
328
|
return (
|
|
329
|
-
<div className="overflow-hidden rounded-md border border-
|
|
329
|
+
<div className="overflow-hidden rounded-md border border-warning/30">
|
|
330
330
|
<button
|
|
331
|
-
className="flex gap-2 items-center px-3 py-2 w-full transition-colors bg-
|
|
331
|
+
className="flex gap-2 items-center px-3 py-2 w-full transition-colors bg-warning/10 hover:bg-warning/20"
|
|
332
332
|
onClick={() => setExpanded(!expanded)}
|
|
333
333
|
>
|
|
334
334
|
<ChevronRight
|
|
335
|
-
className={`size-3 text-
|
|
335
|
+
className={`size-3 text-warning transition-transform shrink-0 ${
|
|
336
336
|
expanded ? 'rotate-90' : ''
|
|
337
337
|
}`}
|
|
338
338
|
/>
|
|
339
|
-
<Brain className="text-
|
|
340
|
-
<span className="text-xs font-medium text-
|
|
339
|
+
<Brain className="text-warning size-3 shrink-0" />
|
|
340
|
+
<span className="text-xs font-medium text-warning">Thinking</span>
|
|
341
341
|
{!expanded && (
|
|
342
|
-
<span className="text-[11px] text-
|
|
342
|
+
<span className="text-[11px] text-warning truncate ml-1">
|
|
343
343
|
{previewContent}
|
|
344
344
|
</span>
|
|
345
345
|
)}
|
|
346
346
|
</button>
|
|
347
347
|
|
|
348
348
|
{expanded && (
|
|
349
|
-
<div className="p-3 border-t bg-card/50 border-
|
|
349
|
+
<div className="p-3 border-t bg-card/50 border-warning/30">
|
|
350
350
|
<div className="text-xs leading-relaxed whitespace-pre-wrap text-foreground/80">
|
|
351
351
|
{content}
|
|
352
352
|
</div>
|
|
@@ -371,11 +371,11 @@ export function TextBlock({
|
|
|
371
371
|
const previewContent =
|
|
372
372
|
content.length > 200 ? content.slice(0, 200) + '…' : content;
|
|
373
373
|
|
|
374
|
-
const borderColor = isSystem ? 'border-
|
|
375
|
-
const bgColor = isSystem ? 'bg-
|
|
376
|
-
const hoverBgColor = isSystem ? 'hover:bg-
|
|
377
|
-
const iconColor = isSystem ? 'text-
|
|
378
|
-
const labelColor = isSystem ? 'text-
|
|
374
|
+
const borderColor = isSystem ? 'border-info/30' : 'border-border';
|
|
375
|
+
const bgColor = isSystem ? 'bg-info/10' : 'bg-muted/30';
|
|
376
|
+
const hoverBgColor = isSystem ? 'hover:bg-info/20' : 'hover:bg-muted/50';
|
|
377
|
+
const iconColor = isSystem ? 'text-info' : 'text-muted-foreground';
|
|
378
|
+
const labelColor = isSystem ? 'text-info' : 'text-foreground';
|
|
379
379
|
|
|
380
380
|
const handleCopy = async (e: React.MouseEvent) => {
|
|
381
381
|
e.stopPropagation();
|
|
@@ -399,7 +399,7 @@ export function TextBlock({
|
|
|
399
399
|
<span className={`text-xs font-medium ${labelColor}`}>Text</span>
|
|
400
400
|
{!expanded && (
|
|
401
401
|
<span
|
|
402
|
-
className={`text-[11px] ${isSystem ? 'text-
|
|
402
|
+
className={`text-[11px] ${isSystem ? 'text-info' : 'text-muted-foreground'} truncate ml-1`}
|
|
403
403
|
>
|
|
404
404
|
{previewContent}
|
|
405
405
|
</span>
|
|
@@ -441,7 +441,7 @@ export function ToolItem({ tool }: { tool: ToolDefinition }) {
|
|
|
441
441
|
className="w-full flex items-center justify-between p-2.5 hover:bg-accent/50 transition-colors"
|
|
442
442
|
onClick={() => setExpanded(!expanded)}
|
|
443
443
|
>
|
|
444
|
-
<span className="font-mono text-sm text-
|
|
444
|
+
<span className="font-mono text-sm text-tool">{tool.name}</span>
|
|
445
445
|
{hasExpandableContent && (
|
|
446
446
|
<ChevronRight
|
|
447
447
|
className={`size-3 text-muted-foreground transition-transform ${
|
|
@@ -486,25 +486,25 @@ export function CollapsibleToolCall({
|
|
|
486
486
|
const parsedData = typeof data === 'string' ? safeParseJson(data) : data;
|
|
487
487
|
|
|
488
488
|
return (
|
|
489
|
-
<div className="overflow-hidden rounded-md border border-
|
|
489
|
+
<div className="overflow-hidden rounded-md border border-tool/30">
|
|
490
490
|
<button
|
|
491
|
-
className="flex gap-2 items-center px-3 py-2 w-full transition-colors bg-
|
|
491
|
+
className="flex gap-2 items-center px-3 py-2 w-full transition-colors bg-tool/10 hover:bg-tool/20"
|
|
492
492
|
onClick={() => setExpanded(!expanded)}
|
|
493
493
|
>
|
|
494
494
|
<ChevronRight
|
|
495
|
-
className={`size-3 text-
|
|
495
|
+
className={`size-3 text-tool transition-transform shrink-0 ${
|
|
496
496
|
expanded ? 'rotate-90' : ''
|
|
497
497
|
}`}
|
|
498
498
|
/>
|
|
499
|
-
<Wrench className="size-3 text-
|
|
500
|
-
<span className="font-mono text-xs font-medium text-
|
|
499
|
+
<Wrench className="size-3 text-tool shrink-0" />
|
|
500
|
+
<span className="font-mono text-xs font-medium text-tool">
|
|
501
501
|
{toolName}
|
|
502
502
|
</span>
|
|
503
503
|
{!expanded &&
|
|
504
504
|
parsedData != null &&
|
|
505
505
|
typeof parsedData === 'object' &&
|
|
506
506
|
!Array.isArray(parsedData) && (
|
|
507
|
-
<span className="text-[11px] font-mono text-
|
|
507
|
+
<span className="text-[11px] font-mono text-tool truncate">
|
|
508
508
|
{formatToolParams(parsedData as Record<string, unknown>)}
|
|
509
509
|
</span>
|
|
510
510
|
)}
|
|
@@ -515,7 +515,7 @@ export function CollapsibleToolCall({
|
|
|
515
515
|
)}
|
|
516
516
|
</button>
|
|
517
517
|
{expanded && (
|
|
518
|
-
<div className="p-3 border-t bg-card/50 border-
|
|
518
|
+
<div className="p-3 border-t bg-card/50 border-tool/30">
|
|
519
519
|
<JsonBlock data={parsedData} />
|
|
520
520
|
</div>
|
|
521
521
|
)}
|
|
@@ -82,7 +82,7 @@ export function StepCard({
|
|
|
82
82
|
return (
|
|
83
83
|
<Collapsible open={isExpanded} onOpenChange={() => toggleStep(step.id)}>
|
|
84
84
|
<Card
|
|
85
|
-
className={`overflow-hidden py-0 gap-0 ${isActiveStep ? 'ring-2 ring-
|
|
85
|
+
className={`overflow-hidden py-0 gap-0 ${isActiveStep ? 'ring-2 ring-info/50 ring-offset-1 ring-offset-background' : ''}`}
|
|
86
86
|
>
|
|
87
87
|
<CollapsibleTrigger asChild>
|
|
88
88
|
<button
|
|
@@ -164,7 +164,7 @@ export function StepCard({
|
|
|
164
164
|
|
|
165
165
|
<div className="flex items-center gap-4">
|
|
166
166
|
{isActiveStep ? (
|
|
167
|
-
<span className="text-[11px] text-
|
|
167
|
+
<span className="text-[11px] text-info font-medium flex items-center gap-1.5">
|
|
168
168
|
<Loader2 className="size-3 animate-spin" />
|
|
169
169
|
streaming
|
|
170
170
|
</span>
|
|
@@ -292,7 +292,7 @@ export function StepDetailContent({
|
|
|
292
292
|
) : output ? (
|
|
293
293
|
<OutputDisplay output={output} toolResults={toolResults} />
|
|
294
294
|
) : isActiveStep ? (
|
|
295
|
-
<div className="flex items-center gap-2 text-sm text-
|
|
295
|
+
<div className="flex items-center gap-2 text-sm text-info">
|
|
296
296
|
<Loader2 className="size-4 animate-spin" />
|
|
297
297
|
<span>Waiting for response...</span>
|
|
298
298
|
</div>
|
|
@@ -410,20 +410,18 @@ function NestedRunCard({
|
|
|
410
410
|
const modelId = firstStep?.model_id;
|
|
411
411
|
|
|
412
412
|
return (
|
|
413
|
-
<div className="rounded-md border border-
|
|
413
|
+
<div className="rounded-md border border-agent/30 overflow-hidden">
|
|
414
414
|
<button
|
|
415
|
-
className="w-full flex items-center gap-2 px-3 py-2 bg-
|
|
415
|
+
className="w-full flex items-center gap-2 px-3 py-2 bg-agent/10 hover:bg-agent/15 transition-colors"
|
|
416
416
|
onClick={() => setExpanded(!expanded)}
|
|
417
417
|
>
|
|
418
418
|
<ChevronRight
|
|
419
|
-
className={`size-3 text-
|
|
419
|
+
className={`size-3 text-agent transition-transform shrink-0 ${
|
|
420
420
|
expanded ? 'rotate-90' : ''
|
|
421
421
|
}`}
|
|
422
422
|
/>
|
|
423
|
-
<Brain className="size-3 text-
|
|
424
|
-
<span className="text-xs font-medium text-
|
|
425
|
-
{label}
|
|
426
|
-
</span>
|
|
423
|
+
<Brain className="size-3 text-agent shrink-0" />
|
|
424
|
+
<span className="text-xs font-medium text-agent truncate">{label}</span>
|
|
427
425
|
<span className="ml-auto flex items-center gap-3 shrink-0">
|
|
428
426
|
{modelId && (
|
|
429
427
|
<span className="text-[10px] font-mono text-muted-foreground">
|
|
@@ -438,13 +436,13 @@ function NestedRunCard({
|
|
|
438
436
|
{formatDuration(totalDuration)}
|
|
439
437
|
</span>
|
|
440
438
|
{childRun.run.isInProgress && (
|
|
441
|
-
<Loader2 className="size-3 text-
|
|
439
|
+
<Loader2 className="size-3 text-info animate-spin" />
|
|
442
440
|
)}
|
|
443
441
|
</span>
|
|
444
442
|
</button>
|
|
445
443
|
|
|
446
444
|
{expanded && (
|
|
447
|
-
<div className="border-t border-
|
|
445
|
+
<div className="border-t border-agent/20 bg-background/50 p-3 flex flex-col gap-2">
|
|
448
446
|
{childRun.steps.map((step, index) => {
|
|
449
447
|
const nestedChildRuns = (childRun.childRuns ?? []).filter(
|
|
450
448
|
cr => cr.run.parent_step_id === step.id,
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { Moon, Sun } from 'lucide-react';
|
|
2
|
+
import type { Theme } from '../theme';
|
|
3
|
+
import { Button } from './ui/button';
|
|
4
|
+
|
|
5
|
+
export function ThemeToggle({
|
|
6
|
+
theme,
|
|
7
|
+
onThemeChange,
|
|
8
|
+
}: {
|
|
9
|
+
theme: Theme;
|
|
10
|
+
onThemeChange: (theme: Theme) => void;
|
|
11
|
+
}) {
|
|
12
|
+
const nextTheme = theme === 'dark' ? 'light' : 'dark';
|
|
13
|
+
const title = `Switch to ${nextTheme} theme`;
|
|
14
|
+
|
|
15
|
+
return (
|
|
16
|
+
<Button
|
|
17
|
+
variant="ghost"
|
|
18
|
+
size="icon-sm"
|
|
19
|
+
type="button"
|
|
20
|
+
aria-label="Use light theme"
|
|
21
|
+
aria-pressed={theme === 'light'}
|
|
22
|
+
title={title}
|
|
23
|
+
onClick={() => onThemeChange(nextTheme)}
|
|
24
|
+
>
|
|
25
|
+
{theme === 'dark' ? (
|
|
26
|
+
<Sun className="size-3.5" />
|
|
27
|
+
) : (
|
|
28
|
+
<Moon className="size-3.5" />
|
|
29
|
+
)}
|
|
30
|
+
<span className="sr-only">Use light theme</span>
|
|
31
|
+
</Button>
|
|
32
|
+
);
|
|
33
|
+
}
|
|
@@ -166,17 +166,17 @@ export function TraceTimeline({
|
|
|
166
166
|
const spanIcon = (kind: SpanKind) => {
|
|
167
167
|
switch (kind) {
|
|
168
168
|
case 'child-run':
|
|
169
|
-
return <Brain className="size-3 text-
|
|
169
|
+
return <Brain className="size-3 text-agent shrink-0" />;
|
|
170
170
|
case 'thinking':
|
|
171
|
-
return <Brain className="size-3 text-
|
|
171
|
+
return <Brain className="size-3 text-warning shrink-0" />;
|
|
172
172
|
case 'tool-call':
|
|
173
|
-
return <Wrench className="size-3 text-
|
|
173
|
+
return <Wrench className="size-3 text-tool shrink-0" />;
|
|
174
174
|
case 'text':
|
|
175
|
-
return <MessageSquare className="size-3 text-
|
|
175
|
+
return <MessageSquare className="size-3 text-success shrink-0" />;
|
|
176
176
|
case 'error':
|
|
177
|
-
return <AlertCircle className="size-3 text-
|
|
177
|
+
return <AlertCircle className="size-3 text-danger shrink-0" />;
|
|
178
178
|
default:
|
|
179
|
-
return <Zap className="size-3 text-
|
|
179
|
+
return <Zap className="size-3 text-info shrink-0" />;
|
|
180
180
|
}
|
|
181
181
|
};
|
|
182
182
|
|
|
@@ -211,7 +211,7 @@ export function TraceTimeline({
|
|
|
211
211
|
{ticks.map((tick, i) => (
|
|
212
212
|
<span
|
|
213
213
|
key={i}
|
|
214
|
-
className="absolute text-[9px] font-mono text-muted-foreground
|
|
214
|
+
className="absolute text-[9px] font-mono text-muted-foreground -translate-x-1/2"
|
|
215
215
|
style={{
|
|
216
216
|
left: `${(tick.ms / totalDurationMs) * 100}%`,
|
|
217
217
|
top: 5,
|
|
@@ -263,7 +263,7 @@ export function TraceTimeline({
|
|
|
263
263
|
{formatDuration(span.durationMs || null)}
|
|
264
264
|
</span>
|
|
265
265
|
{span.tokens && (
|
|
266
|
-
<span className="text-[9px] font-mono text-muted-foreground
|
|
266
|
+
<span className="text-[9px] font-mono text-muted-foreground shrink-0">
|
|
267
267
|
{span.tokens.input}→{span.tokens.output}
|
|
268
268
|
</span>
|
|
269
269
|
)}
|
|
@@ -331,7 +331,7 @@ export function TraceTimeline({
|
|
|
331
331
|
</span>
|
|
332
332
|
)}
|
|
333
333
|
</div>
|
|
334
|
-
<div className="text-muted-foreground
|
|
334
|
+
<div className="text-muted-foreground pt-0.5">
|
|
335
335
|
Click to {isSelected ? 'deselect' : 'view details'}
|
|
336
336
|
</div>
|
|
337
337
|
</div>
|
|
@@ -440,8 +440,8 @@ function SpanDetailPanel({
|
|
|
440
440
|
return (
|
|
441
441
|
<div className="p-4 space-y-4">
|
|
442
442
|
<div className="flex items-center gap-2 mb-1">
|
|
443
|
-
<Wrench className="size-4 text-
|
|
444
|
-
<span className="text-sm font-mono font-medium text-
|
|
443
|
+
<Wrench className="size-4 text-tool" />
|
|
444
|
+
<span className="text-sm font-mono font-medium text-tool">
|
|
445
445
|
{span.label}
|
|
446
446
|
</span>
|
|
447
447
|
</div>
|
|
@@ -474,10 +474,10 @@ function SpanDetailPanel({
|
|
|
474
474
|
return (
|
|
475
475
|
<div className="p-4 space-y-2">
|
|
476
476
|
<div className="flex items-center gap-2 mb-1">
|
|
477
|
-
<Brain className="size-4 text-
|
|
478
|
-
<span className="text-sm font-medium text-
|
|
477
|
+
<Brain className="size-4 text-warning" />
|
|
478
|
+
<span className="text-sm font-medium text-warning">Thinking</span>
|
|
479
479
|
</div>
|
|
480
|
-
<div className="text-sm text-foreground/80 leading-relaxed whitespace-pre-wrap rounded-md border border-
|
|
480
|
+
<div className="text-sm text-foreground/80 leading-relaxed whitespace-pre-wrap rounded-md border border-warning/20 bg-warning/5 p-3">
|
|
481
481
|
{span.thinkingText}
|
|
482
482
|
</div>
|
|
483
483
|
</div>
|
|
@@ -488,8 +488,8 @@ function SpanDetailPanel({
|
|
|
488
488
|
return (
|
|
489
489
|
<div className="p-4 space-y-2">
|
|
490
490
|
<div className="flex items-center gap-2 mb-1">
|
|
491
|
-
<MessageSquare className="size-4 text-
|
|
492
|
-
<span className="text-sm font-medium text-
|
|
491
|
+
<MessageSquare className="size-4 text-success" />
|
|
492
|
+
<span className="text-sm font-medium text-success">
|
|
493
493
|
Text Response
|
|
494
494
|
</span>
|
|
495
495
|
</div>
|
|
@@ -504,8 +504,8 @@ function SpanDetailPanel({
|
|
|
504
504
|
return (
|
|
505
505
|
<div className="p-4 space-y-2">
|
|
506
506
|
<div className="flex items-center gap-2 mb-1">
|
|
507
|
-
<AlertCircle className="size-4 text-
|
|
508
|
-
<span className="text-sm font-medium text-
|
|
507
|
+
<AlertCircle className="size-4 text-danger" />
|
|
508
|
+
<span className="text-sm font-medium text-danger">Error</span>
|
|
509
509
|
</div>
|
|
510
510
|
<div className="text-sm text-destructive-foreground font-mono whitespace-pre-wrap rounded-md border border-destructive/30 bg-destructive/10 p-3">
|
|
511
511
|
{step.error}
|
|
@@ -4,7 +4,7 @@ import { cva, type VariantProps } from 'class-variance-authority';
|
|
|
4
4
|
import { cn } from '@/lib/utils';
|
|
5
5
|
|
|
6
6
|
const badgeVariants = cva(
|
|
7
|
-
'inline-flex items-center justify-center rounded-full border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring
|
|
7
|
+
'inline-flex items-center justify-center rounded-full border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden',
|
|
8
8
|
{
|
|
9
9
|
variants: {
|
|
10
10
|
variant: {
|
|
@@ -4,7 +4,7 @@ import { cva, type VariantProps } from 'class-variance-authority';
|
|
|
4
4
|
import { cn } from '@/lib/utils';
|
|
5
5
|
|
|
6
6
|
const buttonVariants = cva(
|
|
7
|
-
"inline-flex cursor-pointer items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring
|
|
7
|
+
"inline-flex cursor-pointer items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
|
|
8
8
|
{
|
|
9
9
|
variants: {
|
|
10
10
|
variant: {
|
|
@@ -18,7 +18,7 @@ function ScrollArea({
|
|
|
18
18
|
>
|
|
19
19
|
<ScrollAreaPrimitive.Viewport
|
|
20
20
|
data-slot="scroll-area-viewport"
|
|
21
|
-
className="focus-visible:ring-ring
|
|
21
|
+
className="focus-visible:ring-ring size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:outline-1"
|
|
22
22
|
>
|
|
23
23
|
{children}
|
|
24
24
|
</ScrollAreaPrimitive.Viewport>
|