@waniwani/sdk 0.20.0 → 0.20.2

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.
@@ -1,2 +1,2 @@
1
1
  /*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */
2
- @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-border-style:solid;--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-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial}}}@layer theme{:root,:host{--ww-font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--ww-spacing:.25rem;--ww-container-sm:24rem;--ww-container-md:28rem;--ww-container-3xl:48rem;--ww-text-xs:.75rem;--ww-text-xs--line-height:calc(1/.75);--ww-text-sm:.875rem;--ww-text-sm--line-height:calc(1.25/.875);--ww-text-base:1rem;--ww-text-base--line-height:calc(1.5/1);--ww-text-lg:1.125rem;--ww-text-lg--line-height:calc(1.75/1.125);--ww-font-weight-medium:500;--ww-font-weight-semibold:600;--ww-tracking-wide:.025em;--ww-tracking-wider:.05em;--ww-radius-md:.375rem;--ww-radius-lg:.5rem;--ww-radius-xl:.75rem;--ww-radius-2xl:1rem;--ww-ease-out:cubic-bezier(0,0,.2,1);--ww-animate-spin:spin 1s linear infinite;--ww-animate-pulse:pulse 2s cubic-bezier(.4,0,.6,1)infinite;--ww-blur-xl:24px;--ww-default-transition-duration:.15s;--ww-default-transition-timing-function:cubic-bezier(.4,0,.2,1);--ww-default-font-family:var(--ww-font-sans,system-ui,-apple-system,"Segoe UI",sans-serif);--ww-default-mono-font-family:var(--ww-font-mono)}}@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%;tab-size:4;line-height:1.5;font-family:var(--ww-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(--ww-default-font-feature-settings,normal);font-variation-settings:var(--ww-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;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--ww-default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--ww-default-mono-font-feature-settings,normal);font-variation-settings:var(--ww-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]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.ww\:pointer-events-auto{pointer-events:auto}.ww\:pointer-events-none{pointer-events:none}.ww\:absolute{position:absolute}.ww\:fixed{position:fixed}.ww\:relative{position:relative}.ww\:sticky{position:sticky}.ww\:inset-0{inset:calc(var(--ww-spacing)*0)}.ww\:top-2{top:calc(var(--ww-spacing)*2)}.ww\:top-full{top:100%}.ww\:right-0{right:calc(var(--ww-spacing)*0)}.ww\:right-2{right:calc(var(--ww-spacing)*2)}.ww\:bottom-2{bottom:calc(var(--ww-spacing)*2)}.ww\:bottom-3{bottom:calc(var(--ww-spacing)*3)}.ww\:bottom-4{bottom:calc(var(--ww-spacing)*4)}.ww\:left-0{left:calc(var(--ww-spacing)*0)}.ww\:left-\[50\%\]{left:50%}.ww\:isolate{isolation:isolate}.ww\:-z-\[1\]{z-index:calc(1*-1)}.ww\:z-10{z-index:10}.ww\:z-50{z-index:50}.ww\:z-\[1\]{z-index:1}.ww\:z-\[2147483002\]{z-index:2147483002}.ww\:mx-auto{margin-inline:auto}.ww\:mt-0\.5{margin-top:calc(var(--ww-spacing)*.5)}.ww\:mt-1{margin-top:calc(var(--ww-spacing)*1)}.ww\:mt-2{margin-top:calc(var(--ww-spacing)*2)}.ww\:mt-6{margin-top:calc(var(--ww-spacing)*6)}.ww\:mb-0{margin-bottom:calc(var(--ww-spacing)*0)}.ww\:mb-4{margin-bottom:calc(var(--ww-spacing)*4)}.ww\:mb-6{margin-bottom:calc(var(--ww-spacing)*6)}.ww\:ml-auto{margin-left:auto}.ww\:line-clamp-1{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.ww\:contents{display:contents}.ww\:flex{display:flex}.ww\:grid{display:grid}.ww\:hidden{display:none}.ww\:inline-block{display:inline-block}.ww\:inline-flex{display:inline-flex}.ww\:field-sizing-content{field-sizing:content}.ww\:size-2{width:calc(var(--ww-spacing)*2);height:calc(var(--ww-spacing)*2)}.ww\:size-3{width:calc(var(--ww-spacing)*3);height:calc(var(--ww-spacing)*3)}.ww\:size-3\.5{width:calc(var(--ww-spacing)*3.5);height:calc(var(--ww-spacing)*3.5)}.ww\:size-4{width:calc(var(--ww-spacing)*4);height:calc(var(--ww-spacing)*4)}.ww\:size-5{width:calc(var(--ww-spacing)*5);height:calc(var(--ww-spacing)*5)}.ww\:size-7{width:calc(var(--ww-spacing)*7);height:calc(var(--ww-spacing)*7)}.ww\:size-8{width:calc(var(--ww-spacing)*8);height:calc(var(--ww-spacing)*8)}.ww\:size-9{width:calc(var(--ww-spacing)*9);height:calc(var(--ww-spacing)*9)}.ww\:size-12{width:calc(var(--ww-spacing)*12);height:calc(var(--ww-spacing)*12)}.ww\:size-auto{width:auto;height:auto}.ww\:size-full{width:100%;height:100%}.ww\:h-2\.5{height:calc(var(--ww-spacing)*2.5)}.ww\:h-5{height:calc(var(--ww-spacing)*5)}.ww\:h-8{height:calc(var(--ww-spacing)*8)}.ww\:h-9{height:calc(var(--ww-spacing)*9)}.ww\:h-16{height:calc(var(--ww-spacing)*16)}.ww\:h-auto{height:auto}.ww\:h-full{height:100%}.ww\:max-h-48{max-height:calc(var(--ww-spacing)*48)}.ww\:max-h-80{max-height:calc(var(--ww-spacing)*80)}.ww\:min-h-0{min-height:calc(var(--ww-spacing)*0)}.ww\:min-h-5{min-height:calc(var(--ww-spacing)*5)}.ww\:min-h-full{min-height:100%}.ww\:w-72{width:calc(var(--ww-spacing)*72)}.ww\:w-\[calc\(100vw-2rem\)\]{width:calc(100vw - 2rem)}.ww\:w-auto{width:auto}.ww\:w-fit{width:fit-content}.ww\:w-full{width:100%}.ww\:w-px{width:1px}.ww\:\[max-width\:var\(--ww-msg-max-width\,80\%\)\]{max-width:var(--ww-msg-max-width,80%)}.ww\:max-w-3xl{max-width:var(--ww-container-3xl)}.ww\:max-w-24{max-width:calc(var(--ww-spacing)*24)}.ww\:max-w-32{max-width:calc(var(--ww-spacing)*32)}.ww\:max-w-\[440px\]{max-width:440px}.ww\:max-w-\[720px\]{max-width:720px}.ww\:max-w-full{max-width:100%}.ww\:max-w-md{max-width:var(--ww-container-md)}.ww\:max-w-sm{max-width:var(--ww-container-sm)}.ww\:min-w-0{min-width:calc(var(--ww-spacing)*0)}.ww\:flex-1{flex:1}.ww\:shrink-0{flex-shrink:0}.ww\:grow{flex-grow:1}.ww\:translate-x-\[-50\%\]{--tw-translate-x:-50%;translate:var(--tw-translate-x)var(--tw-translate-y)}.ww\:rotate-90{rotate:90deg}.ww\:rotate-180{rotate:180deg}.ww\:animate-\[ww-fade-in_0\.2s_ease-out_both\]{animation:.2s ease-out both ww-fade-in}.ww\:animate-pulse{animation:var(--ww-animate-pulse)}.ww\:animate-spin{animation:var(--ww-animate-spin)}.ww\:cursor-pointer{cursor:pointer}.ww\:resize-none{resize:none}.ww\:grid-rows-\[0fr\]{grid-template-rows:0fr}.ww\:grid-rows-\[1fr\]{grid-template-rows:1fr}.ww\:flex-col{flex-direction:column}.ww\:flex-nowrap{flex-wrap:nowrap}.ww\:flex-wrap{flex-wrap:wrap}.ww\:items-center{align-items:center}.ww\:items-end{align-items:flex-end}.ww\:items-start{align-items:flex-start}.ww\:justify-between{justify-content:space-between}.ww\:justify-center{justify-content:center}.ww\:gap-1{gap:calc(var(--ww-spacing)*1)}.ww\:gap-1\.5{gap:calc(var(--ww-spacing)*1.5)}.ww\:gap-2{gap:calc(var(--ww-spacing)*2)}.ww\:gap-3{gap:calc(var(--ww-spacing)*3)}.ww\:gap-6{gap:calc(var(--ww-spacing)*6)}:where(.ww\:space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--ww-spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--ww-spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.ww\:space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--ww-spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--ww-spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}.ww\:self-stretch{align-self:stretch}.ww\:truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.ww\:overflow-auto{overflow:auto}.ww\:overflow-hidden{overflow:hidden}.ww\:overflow-x-auto{overflow-x:auto}.ww\:overflow-y-auto{overflow-y:auto}.ww\:overflow-y-hidden{overflow-y:hidden}.ww\:\!rounded-full{border-radius:3.40282e38px!important}.ww\:rounded{border-radius:var(--ww-radius,16px)}.ww\:rounded-2xl{border-radius:var(--ww-radius-2xl)}.ww\:rounded-\[20px\]{border-radius:20px}.ww\:rounded-\[inherit\]{border-radius:inherit}.ww\:rounded-full{border-radius:3.40282e38px}.ww\:rounded-lg{border-radius:var(--ww-radius-lg)}.ww\:rounded-md{border-radius:var(--ww-radius-md)}.ww\:rounded-none{border-radius:0}.ww\:rounded-xl{border-radius:var(--ww-radius-xl)}.ww\:border{border-style:var(--tw-border-style);border-width:1px}.ww\:border-0{border-style:var(--tw-border-style);border-width:0}.ww\:border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.ww\:border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.ww\:border-border{border-color:var(--ww-color-border,#e5e7eb)}.ww\:border-muted-foreground\/50{border-color:var(--ww-color-muted-foreground,#6b7280)}@supports (color:color-mix(in lab, red, red)){.ww\:border-muted-foreground\/50{border-color:color-mix(in oklab,var(--ww-color-muted-foreground,#6b7280)50%,transparent)}}.ww\:border-transparent{border-color:#0000}.ww\:bg-accent{background-color:var(--ww-color-accent,#f3f4f6)}.ww\:bg-background,.ww\:bg-background\/20{background-color:var(--ww-color-background,#fff)}@supports (color:color-mix(in lab, red, red)){.ww\:bg-background\/20{background-color:color-mix(in oklab,var(--ww-color-background,#fff)20%,transparent)}}.ww\:bg-border{background-color:var(--ww-color-border,#e5e7eb)}.ww\:bg-foreground,.ww\:bg-foreground\/5{background-color:var(--ww-color-foreground,#1f2937)}@supports (color:color-mix(in lab, red, red)){.ww\:bg-foreground\/5{background-color:color-mix(in oklab,var(--ww-color-foreground,#1f2937)5%,transparent)}}.ww\:bg-input{background-color:var(--ww-color-input,#f9fafb)}.ww\:bg-muted{background-color:var(--ww-color-muted,#f1f5f9)}.ww\:bg-muted-foreground\/60{background-color:var(--ww-color-muted-foreground,#6b7280)}@supports (color:color-mix(in lab, red, red)){.ww\:bg-muted-foreground\/60{background-color:color-mix(in oklab,var(--ww-color-muted-foreground,#6b7280)60%,transparent)}}.ww\:bg-muted\/50{background-color:var(--ww-color-muted,#f1f5f9)}@supports (color:color-mix(in lab, red, red)){.ww\:bg-muted\/50{background-color:color-mix(in oklab,var(--ww-color-muted,#f1f5f9)50%,transparent)}}.ww\:bg-primary{background-color:var(--ww-color-primary,#6366f1)}.ww\:bg-tool-card{background-color:var(--ww-color-tool-card,#f4f4f5)}.ww\:bg-transparent{background-color:#0000}.ww\:object-cover{object-fit:cover}.ww\:p-0{padding:calc(var(--ww-spacing)*0)}.ww\:p-1{padding:calc(var(--ww-spacing)*1)}.ww\:p-1\.5{padding:calc(var(--ww-spacing)*1.5)}.ww\:p-2{padding:calc(var(--ww-spacing)*2)}.ww\:p-3{padding:calc(var(--ww-spacing)*3)}.ww\:px-0{padding-inline:calc(var(--ww-spacing)*0)}.ww\:px-1\.5{padding-inline:calc(var(--ww-spacing)*1.5)}.ww\:px-2{padding-inline:calc(var(--ww-spacing)*2)}.ww\:px-3{padding-inline:calc(var(--ww-spacing)*3)}.ww\:px-3\.5{padding-inline:calc(var(--ww-spacing)*3.5)}.ww\:px-4{padding-inline:calc(var(--ww-spacing)*4)}.ww\:px-6{padding-inline:calc(var(--ww-spacing)*6)}.ww\:\!py-0{padding-block:calc(var(--ww-spacing)*0)!important}.ww\:py-0\.5{padding-block:calc(var(--ww-spacing)*.5)}.ww\:py-1{padding-block:calc(var(--ww-spacing)*1)}.ww\:py-1\.5{padding-block:calc(var(--ww-spacing)*1.5)}.ww\:py-2{padding-block:calc(var(--ww-spacing)*2)}.ww\:py-2\.5{padding-block:calc(var(--ww-spacing)*2.5)}.ww\:py-3{padding-block:calc(var(--ww-spacing)*3)}.ww\:py-6{padding-block:calc(var(--ww-spacing)*6)}.ww\:py-12{padding-block:calc(var(--ww-spacing)*12)}.ww\:pt-1{padding-top:calc(var(--ww-spacing)*1)}.ww\:pt-2{padding-top:calc(var(--ww-spacing)*2)}.ww\:pt-2\.5{padding-top:calc(var(--ww-spacing)*2.5)}.ww\:pt-3{padding-top:calc(var(--ww-spacing)*3)}.ww\:pr-1\.5{padding-right:calc(var(--ww-spacing)*1.5)}.ww\:pr-3{padding-right:calc(var(--ww-spacing)*3)}.ww\:pr-9{padding-right:calc(var(--ww-spacing)*9)}.ww\:pb-1{padding-bottom:calc(var(--ww-spacing)*1)}.ww\:pb-1\.5{padding-bottom:calc(var(--ww-spacing)*1.5)}.ww\:pb-2{padding-bottom:calc(var(--ww-spacing)*2)}.ww\:pb-2\.5{padding-bottom:calc(var(--ww-spacing)*2.5)}.ww\:pb-3{padding-bottom:calc(var(--ww-spacing)*3)}.ww\:pl-1{padding-left:calc(var(--ww-spacing)*1)}.ww\:pl-3\.5{padding-left:calc(var(--ww-spacing)*3.5)}.ww\:pl-4{padding-left:calc(var(--ww-spacing)*4)}.ww\:text-center{text-align:center}.ww\:text-left{text-align:left}.ww\:font-\[family-name\:var\(--ww-font\)\]{font-family:var(--ww-font)}.ww\:font-\[family-name\:var\(--ww-font-sans\)\]{font-family:var(--ww-font-sans)}.ww\:font-mono{font-family:var(--ww-font-mono)}.ww\:text-base{font-size:var(--ww-text-base);line-height:var(--tw-leading,var(--ww-text-base--line-height))}.ww\:text-lg{font-size:var(--ww-text-lg);line-height:var(--tw-leading,var(--ww-text-lg--line-height))}.ww\:text-sm{font-size:var(--ww-text-sm);line-height:var(--tw-leading,var(--ww-text-sm--line-height))}.ww\:text-xs{font-size:var(--ww-text-xs);line-height:var(--tw-leading,var(--ww-text-xs--line-height))}.ww\:\[font-size\:var\(--ww-font-size\,1rem\)\]{font-size:var(--ww-font-size,1rem)}.ww\:text-\[10px\]{font-size:10px}.ww\:text-\[11px\]{font-size:11px}.ww\:\[line-height\:var\(--ww-line-height\,1\.5\)\]{line-height:var(--ww-line-height,1.5)}.ww\:font-medium{--tw-font-weight:var(--ww-font-weight-medium);font-weight:var(--ww-font-weight-medium)}.ww\:font-semibold{--tw-font-weight:var(--ww-font-weight-semibold);font-weight:var(--ww-font-weight-semibold)}.ww\:tracking-wide{--tw-tracking:var(--ww-tracking-wide);letter-spacing:var(--ww-tracking-wide)}.ww\:tracking-wider{--tw-tracking:var(--ww-tracking-wider);letter-spacing:var(--ww-tracking-wider)}.ww\:break-words{overflow-wrap:break-word}.ww\:break-all{word-break:break-all}.ww\:whitespace-nowrap{white-space:nowrap}.ww\:whitespace-pre-wrap{white-space:pre-wrap}.ww\:text-background{color:var(--ww-color-background,#fff)}.ww\:text-foreground,.ww\:text-foreground\/80{color:var(--ww-color-foreground,#1f2937)}@supports (color:color-mix(in lab, red, red)){.ww\:text-foreground\/80{color:color-mix(in oklab,var(--ww-color-foreground,#1f2937)80%,transparent)}}.ww\:text-muted-foreground{color:var(--ww-color-muted-foreground,#6b7280)}.ww\:text-primary{color:var(--ww-color-primary,#6366f1)}.ww\:text-primary-foreground{color:var(--ww-color-primary-foreground,#1f2937)}.ww\:uppercase{text-transform:uppercase}.ww\:italic{font-style:italic}.ww\:opacity-0{opacity:0}.ww\:opacity-70{opacity:.7}.ww\:opacity-100{opacity:1}.ww\:shadow{--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)}.ww\:shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px 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)}.ww\: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)}.ww\:ring-\[\#0a6c74\]{--tw-ring-color:#0a6c74}.ww\:backdrop-blur-xl{--tw-backdrop-blur:blur(var(--ww-blur-xl));-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,)}.ww\:backdrop-saturate-150{--tw-backdrop-saturate:saturate(150%);-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,)}.ww\:transition-\[grid-template-rows\,opacity\]{transition-property:grid-template-rows,opacity;transition-timing-function:var(--tw-ease,var(--ww-default-transition-timing-function));transition-duration:var(--tw-duration,var(--ww-default-transition-duration))}.ww\:transition-\[max-width\]{transition-property:max-width;transition-timing-function:var(--tw-ease,var(--ww-default-transition-timing-function));transition-duration:var(--tw-duration,var(--ww-default-transition-duration))}.ww\:transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--ww-default-transition-timing-function));transition-duration:var(--tw-duration,var(--ww-default-transition-duration))}.ww\: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(--ww-default-transition-timing-function));transition-duration:var(--tw-duration,var(--ww-default-transition-duration))}.ww\:transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--ww-default-transition-timing-function));transition-duration:var(--tw-duration,var(--ww-default-transition-duration))}.ww\:transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--ww-default-transition-timing-function));transition-duration:var(--tw-duration,var(--ww-default-transition-duration))}.ww\:duration-150{--tw-duration:.15s;transition-duration:.15s}.ww\:duration-200{--tw-duration:.2s;transition-duration:.2s}.ww\:duration-300{--tw-duration:.3s;transition-duration:.3s}.ww\:ease-out{--tw-ease:var(--ww-ease-out);transition-timing-function:var(--ww-ease-out)}.ww\:outline-none{--tw-outline-style:none;outline-style:none}@media (hover:hover){.ww\:group-hover\:opacity-0:is(:where(.ww\:group):hover *){opacity:0}.ww\:group-hover\:opacity-100:is(:where(.ww\:group):hover *){opacity:1}}.ww\:group-\[\.is-assistant\]\:text-foreground:is(:where(.ww\:group).is-assistant *){color:var(--ww-color-foreground,#1f2937)}.ww\:group-\[\.is-user\]\:ml-auto:is(:where(.ww\:group).is-user *){margin-left:auto}.ww\:group-\[\.is-user\]\:\[border-radius\:var\(--ww-msg-radius\,8px\)\]:is(:where(.ww\:group).is-user *){border-radius:var(--ww-msg-radius,8px)}.ww\:group-\[\.is-user\]\:bg-user-bubble:is(:where(.ww\:group).is-user *){background-color:var(--ww-color-user-bubble,#f4f4f4)}.ww\:group-\[\.is-user\]\:\[padding\:var\(--ww-msg-pad-y\,12px\)_var\(--ww-msg-pad-x\,16px\)\]:is(:where(.ww\:group).is-user *){padding:var(--ww-msg-pad-y,12px)var(--ww-msg-pad-x,16px)}.ww\:group-\[\.is-user\]\:\[color\:var\(--ww-color-user-bubble-text\)\]:is(:where(.ww\:group).is-user *){color:var(--ww-color-user-bubble-text)}.ww\:placeholder\:text-muted-foreground::placeholder{color:var(--ww-color-muted-foreground,#6b7280)}@media (hover:hover){.ww\:hover\:border-primary\/30:hover{border-color:var(--ww-color-primary,#6366f1)}@supports (color:color-mix(in lab, red, red)){.ww\:hover\:border-primary\/30:hover{border-color:color-mix(in oklab,var(--ww-color-primary,#6366f1)30%,transparent)}}.ww\:hover\:bg-accent:hover{background-color:var(--ww-color-accent,#f3f4f6)}.ww\:hover\:bg-border:hover{background-color:var(--ww-color-border,#e5e7eb)}.ww\:hover\:bg-foreground:hover{background-color:var(--ww-color-foreground,#1f2937)}.ww\:hover\:bg-muted:hover{background-color:var(--ww-color-muted,#f1f5f9)}.ww\:hover\:bg-muted-foreground\/10:hover{background-color:var(--ww-color-muted-foreground,#6b7280)}@supports (color:color-mix(in lab, red, red)){.ww\:hover\:bg-muted-foreground\/10:hover{background-color:color-mix(in oklab,var(--ww-color-muted-foreground,#6b7280)10%,transparent)}}.ww\:hover\:bg-primary\/90:hover{background-color:var(--ww-color-primary,#6366f1)}@supports (color:color-mix(in lab, red, red)){.ww\:hover\:bg-primary\/90:hover{background-color:color-mix(in oklab,var(--ww-color-primary,#6366f1)90%,transparent)}}.ww\:hover\:text-accent-foreground:hover{color:var(--ww-color-accent-foreground,#1f2937)}.ww\:hover\:text-foreground:hover{color:var(--ww-color-foreground,#1f2937)}.ww\:hover\:underline:hover{text-decoration-line:underline}}.ww\:disabled\:pointer-events-none:disabled{pointer-events:none}.ww\:disabled\:opacity-40:disabled{opacity:.4}.ww\:disabled\:opacity-50:disabled{opacity:.5}@media (min-width:40rem){.ww\:sm\:inset-auto{inset:auto}.ww\:sm\:right-0{right:calc(var(--ww-spacing)*0)}.ww\:sm\:bottom-4{bottom:calc(var(--ww-spacing)*4)}.ww\:sm\:left-0{left:calc(var(--ww-spacing)*0)}.ww\:sm\:mx-auto{margin-inline:auto}.ww\:sm\:h-\[720px\]{height:720px}.ww\:sm\:max-h-\[calc\(100dvh-2rem\)\]{max-height:calc(100dvh - 2rem)}.ww\:sm\:w-\[calc\(100vw-2rem\)\]{width:calc(100vw - 2rem)}.ww\:sm\:max-w-\[1000px\]{max-width:1000px}.ww\:sm\:rounded-2xl{border-radius:var(--ww-radius-2xl)}.ww\:sm\:border{border-style:var(--tw-border-style);border-width:1px}.ww\:sm\:border-border{border-color:var(--ww-color-border,#e5e7eb)}.ww\:sm\:py-2{padding-block:calc(var(--ww-spacing)*2)}.ww\:sm\:pr-2{padding-right:calc(var(--ww-spacing)*2)}.ww\:sm\:pl-4{padding-left:calc(var(--ww-spacing)*4)}.ww\:sm\:text-sm{font-size:var(--ww-text-sm);line-height:var(--tw-leading,var(--ww-text-sm--line-height))}.ww\:sm\:text-\[11px\]{font-size:11px}}.ww\:\[\&\>\*\:first-child\]\:mt-0>:first-child{margin-top:calc(var(--ww-spacing)*0)}.ww\:\[\&\>\*\:last-child\]\:mb-0>:last-child{margin-bottom:calc(var(--ww-spacing)*0)}}@keyframes ww-fade-in{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}@keyframes ww-fade-out{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(-4px)}}@keyframes ww-pulse{0%,80%,to{opacity:.3;transform:scale(.8)}40%{opacity:1;transform:scale(1)}}@keyframes ww-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}@media (prefers-reduced-motion:reduce){[data-waniwani-chat] [data-waniwani-shimmer]{color:var(--ww-color-muted-foreground)!important;animation:none!important}}[data-waniwani-floating=dock]{transition:opacity .32s,transform .42s cubic-bezier(.22,1,.36,1),max-width .3s,visibility 0s linear .42s}[data-waniwani-floating=dock][data-appeared=true][data-state=shown]{visibility:visible;opacity:1;pointer-events:auto;transition:opacity .32s,transform .42s cubic-bezier(.22,1,.36,1),max-width .3s,visibility;transform:translateY(0)}[data-waniwani-floating=dock][data-appeared=false],[data-waniwani-floating=dock][data-state=hidden]{opacity:0;visibility:hidden;pointer-events:none;transform:translateY(1rem)}[data-waniwani-floating=panel]{transition:clip-path .44s cubic-bezier(.22,1,.36,1),opacity .26s,visibility 0s linear .44s}[data-waniwani-floating=panel][data-state=shown]{visibility:visible;opacity:1;pointer-events:auto;clip-path:inset(-40px round 18px);transition:clip-path .44s cubic-bezier(.22,1,.36,1),opacity .26s,visibility}[data-waniwani-floating=panel][data-state=hidden]{opacity:0;visibility:hidden;pointer-events:none;clip-path:inset(calc(100% - 60px) 12% 0 round 24px)}@media (max-width:639px){[data-waniwani-floating=panel][data-state=shown]{clip-path:inset(0)}[data-waniwani-floating=panel][data-state=hidden]{clip-path:inset(calc(100% - 72px) 6% 0 round 22px)}}@media (prefers-reduced-motion:reduce){[data-waniwani-floating=dock],[data-waniwani-floating=panel]{clip-path:none;transition:visibility 0s linear 10ms}[data-waniwani-floating=dock][data-appeared=true][data-state=shown],[data-waniwani-floating=panel][data-state=shown]{transition:visibility}}[data-waniwani-chat] ::-webkit-scrollbar{width:8px}[data-waniwani-chat] ::-webkit-scrollbar-track{background:0 0}[data-waniwani-chat] ::-webkit-scrollbar-thumb{background:var(--ww-color-border);border-radius:9999px}[data-waniwani-chat] ::-webkit-scrollbar-thumb:hover{background:var(--ww-color-muted-foreground)}[data-waniwani-chat] *{scrollbar-width:thin;scrollbar-color:var(--ww-color-border)transparent}[data-waniwani-chat]{--ww-color-background:var(--ww-bg,#fff);--ww-color-foreground:var(--ww-text,#1f2937);--ww-color-primary:var(--ww-primary,#6366f1);--ww-color-primary-foreground:var(--ww-primary-fg,#1f2937);--ww-color-muted-foreground:var(--ww-muted,#6b7280);--ww-color-border:var(--ww-border,#e5e7eb);--ww-color-input:var(--ww-input-bg,#f9fafb);--ww-color-accent:var(--ww-assistant-bubble,#f3f4f6);--ww-color-accent-foreground:var(--ww-text,#1f2937);--ww-color-user-bubble:var(--ww-user-bubble,#f4f4f4);--ww-color-card:var(--ww-bg,#fff);--ww-color-card-foreground:var(--ww-text,#1f2937);--ww-color-card-header:var(--ww-header-bg,#fff);--ww-color-card-header-foreground:var(--ww-header-text,#1f2937);--ww-color-status:var(--ww-status,#22c55e);--ww-color-tool-card:var(--ww-tool-card,#f4f4f5);--ww-radius:var(--ww-radius,16px);--ww-font-sans:var(--ww-font,system-ui,-apple-system,"Segoe UI",sans-serif);--ww-color-user-bubble-text:var(--ww-user-bubble-text,var(--ww-color-primary-foreground));--ww-color-assistant-bubble-text:var(--ww-assistant-bubble-text,var(--ww-color-foreground));--ww-glass:var(--ww-glass-tint,transparent)}@supports (color:color-mix(in lab, red, red)){[data-waniwani-chat]{--ww-glass:color-mix(in srgb,var(--ww-glass-tint,transparent)calc(var(--ww-glass-tint-opacity,0)*100%),#eceef499)}}[data-waniwani-chat]{--ww-glass-border:#0000000f;border-style:solid;border-width:var(--ww-border-width,0);border-color:var(--ww-color-border);box-shadow:var(--ww-shadow,none)}[data-waniwani-chat][data-assistant-bubble=true] .ww-message-assistant .ww-bubble{background:var(--ww-color-accent);color:var(--ww-color-assistant-bubble-text);border-radius:var(--ww-msg-radius,8px);padding:var(--ww-msg-pad-y,12px)var(--ww-msg-pad-x,16px);width:fit-content;max-width:var(--ww-msg-max-width,80%)}.dark [data-waniwani-chat],[data-waniwani-chat].dark{--ww-color-background:var(--ww-bg,#212121);--ww-color-foreground:var(--ww-text,#ececec);--ww-color-primary:var(--ww-primary,#6366f1);--ww-color-primary-foreground:var(--ww-primary-fg,#fff);--ww-color-muted-foreground:var(--ww-muted,#8e8ea0);--ww-color-border:var(--ww-border,#444);--ww-color-input:var(--ww-input-bg,#2f2f2f);--ww-color-accent:var(--ww-assistant-bubble,#2f2f2f);--ww-color-accent-foreground:var(--ww-text,#ececec);--ww-color-user-bubble:var(--ww-user-bubble,#303030);--ww-color-card:var(--ww-bg,#212121);--ww-color-card-foreground:var(--ww-text,#ececec);--ww-color-card-header:var(--ww-header-bg,#1e1e1e);--ww-color-card-header-foreground:var(--ww-header-text,#ececec);--ww-color-status:var(--ww-status,#22c55e);--ww-color-tool-card:var(--ww-tool-card,#262626);--ww-color-user-bubble-text:var(--ww-user-bubble-text,#fff);--ww-color-assistant-bubble-text:var(--ww-assistant-bubble-text,var(--ww-color-foreground));--ww-glass:var(--ww-glass-tint,transparent)}@supports (color:color-mix(in lab, red, red)){.dark [data-waniwani-chat],[data-waniwani-chat].dark{--ww-glass:color-mix(in srgb,var(--ww-glass-tint,transparent)calc(var(--ww-glass-tint-opacity,0)*100%),#282a3480)}}.dark [data-waniwani-chat],[data-waniwani-chat].dark{--ww-glass-border:#ffffff1f}@media (prefers-color-scheme:dark){[data-waniwani-chat][data-color-scheme=auto]{--ww-color-background:var(--ww-bg,#212121);--ww-color-foreground:var(--ww-text,#ececec);--ww-color-primary:var(--ww-primary,#6366f1);--ww-color-primary-foreground:var(--ww-primary-fg,#fff);--ww-color-muted-foreground:var(--ww-muted,#8e8ea0);--ww-color-border:var(--ww-border,#444);--ww-color-input:var(--ww-input-bg,#2f2f2f);--ww-color-accent:var(--ww-assistant-bubble,#2f2f2f);--ww-color-accent-foreground:var(--ww-text,#ececec);--ww-color-user-bubble:var(--ww-user-bubble,#303030);--ww-color-card:var(--ww-bg,#212121);--ww-color-card-foreground:var(--ww-text,#ececec);--ww-color-card-header:var(--ww-header-bg,#1e1e1e);--ww-color-card-header-foreground:var(--ww-header-text,#ececec);--ww-color-status:var(--ww-status,#22c55e);--ww-color-tool-card:var(--ww-tool-card,#262626);--ww-color-user-bubble-text:var(--ww-user-bubble-text,#fff);--ww-color-assistant-bubble-text:var(--ww-assistant-bubble-text,var(--ww-color-foreground));--ww-glass:var(--ww-glass-tint,transparent)}@supports (color:color-mix(in lab, red, red)){[data-waniwani-chat][data-color-scheme=auto]{--ww-glass:color-mix(in srgb,var(--ww-glass-tint,transparent)calc(var(--ww-glass-tint-opacity,0)*100%),#282a3480)}}[data-waniwani-chat][data-color-scheme=auto]{--ww-glass-border:#ffffff1f}}[data-waniwani-chat] [data-streamdown=table-wrapper]{flex-direction:column;gap:.5rem;margin-top:1rem;margin-bottom:1rem;display:flex}[data-waniwani-chat] [data-streamdown=table-wrapper]>div:first-child:has(button){justify-content:flex-end;align-items:center;gap:.25rem;display:flex}[data-waniwani-chat] [data-streamdown=table-wrapper]>div:last-child{overflow-x:auto}[data-waniwani-chat] [data-streamdown=table]{border-collapse:collapse;border:1px solid var(--ww-color-border);border-radius:.75rem;width:100%;overflow:hidden}[data-waniwani-chat] [data-streamdown=table-header]{background-color:var(--ww-color-accent)}@supports (color:color-mix(in lab, red, red)){[data-waniwani-chat] [data-streamdown=table-header]{background-color:color-mix(in srgb,var(--ww-color-accent)80%,transparent)}}[data-waniwani-chat] [data-streamdown=table-body]{background-color:var(--ww-color-accent)}@supports (color:color-mix(in lab, red, red)){[data-waniwani-chat] [data-streamdown=table-body]{background-color:color-mix(in srgb,var(--ww-color-accent)40%,transparent)}}[data-waniwani-chat] [data-streamdown=table-body]>tr+tr{border-top:1px solid var(--ww-color-border)}[data-waniwani-chat] [data-streamdown=table-row]{border-bottom:1px solid var(--ww-color-border)}[data-waniwani-chat] [data-streamdown=table-header-cell]{white-space:nowrap;text-align:left;padding:.5rem 1rem;font-size:.875rem;font-weight:600}[data-waniwani-chat] [data-streamdown=table-cell]{padding:.5rem 1rem;font-size:.875rem}[data-waniwani-chat] [data-streamdown=link]{color:var(--ww-color-primary);overflow-wrap:anywhere;cursor:pointer;font-weight:500;text-decoration:underline}[data-waniwani-chat].dark [data-streamdown=link],.dark [data-waniwani-chat] [data-streamdown=link]{color:var(--ww-color-primary)}@supports (color:color-mix(in lab, red, red)){[data-waniwani-chat].dark [data-streamdown=link],.dark [data-waniwani-chat] [data-streamdown=link]{color:color-mix(in oklab,var(--ww-color-primary)55%,white)}}@media (prefers-color-scheme:dark){[data-waniwani-chat][data-color-scheme=auto] [data-streamdown=link]{color:var(--ww-color-primary)}@supports (color:color-mix(in lab, red, red)){[data-waniwani-chat][data-color-scheme=auto] [data-streamdown=link]{color:color-mix(in oklab,var(--ww-color-primary)55%,white)}}}[data-waniwani-chat].dark [data-waniwani-logo],.dark [data-waniwani-chat] [data-waniwani-logo]{filter:invert()}@media (prefers-color-scheme:dark){[data-waniwani-chat][data-color-scheme=auto] [data-waniwani-logo]{filter:invert()}}[data-waniwani-chat] [data-streamdown=link-safety-modal]{z-index:50;background-color:var(--ww-color-background);justify-content:center;align-items:center;display:flex;position:fixed;inset:0}@supports (color:color-mix(in lab, red, red)){[data-waniwani-chat] [data-streamdown=link-safety-modal]{background-color:color-mix(in srgb,var(--ww-color-background)50%,transparent)}}[data-waniwani-chat] [data-streamdown=link-safety-modal]{-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}[data-waniwani-chat] [data-streamdown=link-safety-modal]>div{border:1px solid var(--ww-color-border);background-color:var(--ww-color-background);width:100%;max-width:28rem;color:var(--ww-color-foreground);border-radius:.75rem;flex-direction:column;gap:1rem;margin:0 1rem;padding:1.5rem;display:flex;position:relative;box-shadow:0 10px 25px #0000001a}[data-waniwani-chat] [data-streamdown=link-safety-modal] button{cursor:pointer}[data-waniwani-chat] [data-streamdown=link-safety-modal]>div>button:first-child{color:var(--ww-color-muted-foreground);background:0 0;border:none;border-radius:.375rem;padding:.25rem;transition:background-color .15s,color .15s;position:absolute;top:1rem;right:1rem}[data-waniwani-chat] [data-streamdown=link-safety-modal]>div>button:first-child:hover{background-color:var(--ww-color-accent);color:var(--ww-color-foreground)}[data-waniwani-chat] [data-streamdown=link-safety-modal]>div>div:first-of-type{flex-direction:column;gap:.5rem;display:flex}[data-waniwani-chat] [data-streamdown=link-safety-modal]>div>div:first-of-type>div{align-items:center;gap:.5rem;font-size:1.125rem;font-weight:600;display:flex}[data-waniwani-chat] [data-streamdown=link-safety-modal]>div>div:first-of-type>p{color:var(--ww-color-muted-foreground);font-size:.875rem}[data-waniwani-chat] [data-streamdown=link-safety-modal]>div>div:nth-child(3){word-break:break-all;background-color:var(--ww-color-accent);border-radius:.375rem;max-height:8rem;padding:.75rem;font-family:ui-monospace,monospace;font-size:.875rem;overflow-y:auto}[data-waniwani-chat] [data-streamdown=link-safety-modal]>div>div:last-child{gap:.5rem;display:flex}[data-waniwani-chat] [data-streamdown=link-safety-modal]>div>div:last-child>button{border:none;border-radius:.375rem;flex:1;justify-content:center;align-items:center;gap:.5rem;padding:.5rem 1rem;font-size:.875rem;font-weight:500;transition:background-color .15s;display:flex}[data-waniwani-chat] [data-streamdown=link-safety-modal]>div>div:last-child>button:first-child{border:1px solid var(--ww-color-border);background-color:var(--ww-color-background);color:var(--ww-color-foreground)}[data-waniwani-chat] [data-streamdown=link-safety-modal]>div>div:last-child>button:first-child:hover{background-color:var(--ww-color-accent)}[data-waniwani-chat] [data-streamdown=link-safety-modal]>div>div:last-child>button:last-child{background-color:var(--ww-color-primary);color:#fff}[data-waniwani-chat] [data-streamdown=link-safety-modal]>div>div:last-child>button:last-child:hover{opacity:.9}[data-waniwani-chat] [data-streamdown=ordered-list]{white-space:normal;list-style-type:decimal;list-style-position:inside}[data-waniwani-chat] li [data-streamdown=ordered-list]{padding-left:1.5rem}[data-waniwani-chat] [data-streamdown=unordered-list]{white-space:normal;list-style-type:disc;list-style-position:inside}[data-waniwani-chat] li [data-streamdown=unordered-list]{padding-left:1.5rem}[data-waniwani-chat] [data-streamdown=list-item]{padding-top:.25rem;padding-bottom:.25rem}[data-waniwani-chat] [data-streamdown=list-item]>p{display:inline}[data-waniwani-chat] [data-streamdown=inline-code]{background-color:var(--ww-color-accent);border-radius:.25rem;padding:.125rem .375rem;font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,monospace;font-size:.875rem}[data-waniwani-chat] [data-streamdown=heading-1]{margin-top:1.5rem;margin-bottom:.5rem;font-size:1.875rem;font-weight:600;line-height:2.25rem}[data-waniwani-chat] [data-streamdown=heading-2]{margin-top:1.5rem;margin-bottom:.5rem;font-size:1.5rem;font-weight:600;line-height:2rem}[data-waniwani-chat] [data-streamdown=heading-3]{margin-top:1.5rem;margin-bottom:.5rem;font-size:1.25rem;font-weight:600;line-height:1.75rem}[data-waniwani-chat] [data-streamdown=heading-4]{margin-top:1.5rem;margin-bottom:.5rem;font-size:1.125rem;font-weight:600;line-height:1.75rem}[data-waniwani-chat] [data-streamdown=heading-5]{margin-top:1.5rem;margin-bottom:.5rem;font-size:1rem;font-weight:600;line-height:1.5rem}[data-waniwani-chat] [data-streamdown=heading-6]{margin-top:1.5rem;margin-bottom:.5rem;font-size:.875rem;font-weight:600;line-height:1.25rem}[data-waniwani-chat] [data-streamdown=blockquote]{border-left:4px solid var(--ww-color-muted-foreground);margin-top:1rem;margin-bottom:1rem}@supports (color:color-mix(in lab, red, red)){[data-waniwani-chat] [data-streamdown=blockquote]{border-left:4px solid color-mix(in srgb,var(--ww-color-muted-foreground)30%,transparent)}}[data-waniwani-chat] [data-streamdown=blockquote]{color:var(--ww-color-muted-foreground);padding-left:1rem;font-style:italic}[data-waniwani-chat] [data-streamdown=horizontal-rule]{border-color:var(--ww-color-border);margin-top:1.5rem;margin-bottom:1.5rem}[data-waniwani-chat] [data-streamdown=strong]{font-weight:600}[data-waniwani-chat] [data-streamdown=image-wrapper]{margin-top:1rem;margin-bottom:1rem;display:inline-block;position:relative}[data-waniwani-chat] [data-streamdown=image]{border-radius:.5rem;max-width:100%}[data-waniwani-chat] [data-streamdown=code-block]{border:1px solid var(--ww-color-border);border-radius:.75rem;width:100%;margin-top:1rem;margin-bottom:1rem;overflow:hidden}[data-waniwani-chat] [data-streamdown=code-block-header]{background-color:var(--ww-color-accent);justify-content:space-between;align-items:center;display:flex}@supports (color:color-mix(in lab, red, red)){[data-waniwani-chat] [data-streamdown=code-block-header]{background-color:color-mix(in srgb,var(--ww-color-accent)80%,transparent)}}[data-waniwani-chat] [data-streamdown=code-block-header]{color:var(--ww-color-muted-foreground);padding:.75rem;font-size:.75rem}[data-waniwani-chat] [data-streamdown=code-block-body]{padding:1rem;font-size:.875rem;overflow-x:auto}[data-waniwani-chat] [data-streamdown=code-block-copy-button],[data-waniwani-chat] [data-streamdown=code-block-download-button]{cursor:pointer;color:var(--ww-color-muted-foreground);background:0 0;border:none;padding:.25rem;transition:color .15s}[data-waniwani-chat] [data-streamdown=code-block-copy-button]:hover,[data-waniwani-chat] [data-streamdown=code-block-download-button]:hover{color:var(--ww-color-foreground)}[data-waniwani-chat] [data-streamdown=mermaid-block]{border:1px solid var(--ww-color-border);border-radius:.75rem;height:auto;margin-top:1rem;margin-bottom:1rem;padding:1rem;position:relative}[data-waniwani-chat] [data-streamdown=mermaid]{width:100%;height:100%}@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-border-style{syntax:"*";inherits:false;initial-value:solid}@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-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}
2
+ @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-border-style:solid;--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-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial}}}@layer theme{:root,:host{--ww-font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--ww-color-black:#000;--ww-spacing:.25rem;--ww-container-sm:24rem;--ww-container-md:28rem;--ww-container-3xl:48rem;--ww-text-xs:.75rem;--ww-text-xs--line-height:calc(1/.75);--ww-text-sm:.875rem;--ww-text-sm--line-height:calc(1.25/.875);--ww-text-base:1rem;--ww-text-base--line-height:calc(1.5/1);--ww-text-lg:1.125rem;--ww-text-lg--line-height:calc(1.75/1.125);--ww-font-weight-medium:500;--ww-font-weight-semibold:600;--ww-tracking-wide:.025em;--ww-tracking-wider:.05em;--ww-radius-md:.375rem;--ww-radius-lg:.5rem;--ww-radius-xl:.75rem;--ww-radius-2xl:1rem;--ww-ease-out:cubic-bezier(0,0,.2,1);--ww-animate-spin:spin 1s linear infinite;--ww-animate-pulse:pulse 2s cubic-bezier(.4,0,.6,1)infinite;--ww-blur-md:12px;--ww-blur-xl:24px;--ww-default-transition-duration:.15s;--ww-default-transition-timing-function:cubic-bezier(.4,0,.2,1);--ww-default-font-family:var(--ww-font-sans,system-ui,-apple-system,"Segoe UI",sans-serif);--ww-default-mono-font-family:var(--ww-font-mono)}}@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%;tab-size:4;line-height:1.5;font-family:var(--ww-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(--ww-default-font-feature-settings,normal);font-variation-settings:var(--ww-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;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--ww-default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--ww-default-mono-font-feature-settings,normal);font-variation-settings:var(--ww-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]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.ww\:pointer-events-auto{pointer-events:auto}.ww\:pointer-events-none{pointer-events:none}.ww\:absolute{position:absolute}.ww\:fixed{position:fixed}.ww\:relative{position:relative}.ww\:sticky{position:sticky}.ww\:inset-0{inset:calc(var(--ww-spacing)*0)}.ww\:top-2{top:calc(var(--ww-spacing)*2)}.ww\:top-full{top:100%}.ww\:right-0{right:calc(var(--ww-spacing)*0)}.ww\:right-2{right:calc(var(--ww-spacing)*2)}.ww\:bottom-0{bottom:calc(var(--ww-spacing)*0)}.ww\:bottom-2{bottom:calc(var(--ww-spacing)*2)}.ww\:bottom-3{bottom:calc(var(--ww-spacing)*3)}.ww\:bottom-4{bottom:calc(var(--ww-spacing)*4)}.ww\:left-0{left:calc(var(--ww-spacing)*0)}.ww\:left-\[50\%\]{left:50%}.ww\:isolate{isolation:isolate}.ww\:-z-\[1\]{z-index:calc(1*-1)}.ww\:z-10{z-index:10}.ww\:z-50{z-index:50}.ww\:z-\[1\]{z-index:1}.ww\:z-\[2147483000\]{z-index:2147483000}.ww\:z-\[2147483002\]{z-index:2147483002}.ww\:mx-auto{margin-inline:auto}.ww\:mt-0\.5{margin-top:calc(var(--ww-spacing)*.5)}.ww\:mt-1{margin-top:calc(var(--ww-spacing)*1)}.ww\:mt-2{margin-top:calc(var(--ww-spacing)*2)}.ww\:mt-6{margin-top:calc(var(--ww-spacing)*6)}.ww\:mb-0{margin-bottom:calc(var(--ww-spacing)*0)}.ww\:mb-4{margin-bottom:calc(var(--ww-spacing)*4)}.ww\:mb-6{margin-bottom:calc(var(--ww-spacing)*6)}.ww\:ml-auto{margin-left:auto}.ww\:line-clamp-1{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.ww\:block{display:block}.ww\:contents{display:contents}.ww\:flex{display:flex}.ww\:grid{display:grid}.ww\:hidden{display:none}.ww\:inline-block{display:inline-block}.ww\:inline-flex{display:inline-flex}.ww\:field-sizing-content{field-sizing:content}.ww\:size-2{width:calc(var(--ww-spacing)*2);height:calc(var(--ww-spacing)*2)}.ww\:size-3{width:calc(var(--ww-spacing)*3);height:calc(var(--ww-spacing)*3)}.ww\:size-3\.5{width:calc(var(--ww-spacing)*3.5);height:calc(var(--ww-spacing)*3.5)}.ww\:size-4{width:calc(var(--ww-spacing)*4);height:calc(var(--ww-spacing)*4)}.ww\:size-5{width:calc(var(--ww-spacing)*5);height:calc(var(--ww-spacing)*5)}.ww\:size-7{width:calc(var(--ww-spacing)*7);height:calc(var(--ww-spacing)*7)}.ww\:size-8{width:calc(var(--ww-spacing)*8);height:calc(var(--ww-spacing)*8)}.ww\:size-9{width:calc(var(--ww-spacing)*9);height:calc(var(--ww-spacing)*9)}.ww\:size-10{width:calc(var(--ww-spacing)*10);height:calc(var(--ww-spacing)*10)}.ww\:size-12{width:calc(var(--ww-spacing)*12);height:calc(var(--ww-spacing)*12)}.ww\:size-auto{width:auto;height:auto}.ww\:size-full{width:100%;height:100%}.ww\:h-0\.5{height:calc(var(--ww-spacing)*.5)}.ww\:h-2\.5{height:calc(var(--ww-spacing)*2.5)}.ww\:h-5{height:calc(var(--ww-spacing)*5)}.ww\:h-8{height:calc(var(--ww-spacing)*8)}.ww\:h-9{height:calc(var(--ww-spacing)*9)}.ww\:h-16{height:calc(var(--ww-spacing)*16)}.ww\:h-auto{height:auto}.ww\:h-full{height:100%}.ww\:max-h-36{max-height:calc(var(--ww-spacing)*36)}.ww\:max-h-48{max-height:calc(var(--ww-spacing)*48)}.ww\:max-h-80{max-height:calc(var(--ww-spacing)*80)}.ww\:min-h-0{min-height:calc(var(--ww-spacing)*0)}.ww\:min-h-5{min-height:calc(var(--ww-spacing)*5)}.ww\:min-h-full{min-height:100%}.ww\:w-60{width:calc(var(--ww-spacing)*60)}.ww\:w-72{width:calc(var(--ww-spacing)*72)}.ww\:w-\[calc\(100vw-2rem\)\]{width:calc(100vw - 2rem)}.ww\:w-auto{width:auto}.ww\:w-fit{width:fit-content}.ww\:w-full{width:100%}.ww\:w-px{width:1px}.ww\:\[max-width\:var\(--ww-msg-max-width\,80\%\)\]{max-width:var(--ww-msg-max-width,80%)}.ww\:max-w-3xl{max-width:var(--ww-container-3xl)}.ww\:max-w-24{max-width:calc(var(--ww-spacing)*24)}.ww\:max-w-32{max-width:calc(var(--ww-spacing)*32)}.ww\:max-w-72{max-width:calc(var(--ww-spacing)*72)}.ww\:max-w-\[440px\]{max-width:440px}.ww\:max-w-\[720px\]{max-width:720px}.ww\:max-w-full{max-width:100%}.ww\:max-w-md{max-width:var(--ww-container-md)}.ww\:max-w-sm{max-width:var(--ww-container-sm)}.ww\:min-w-0{min-width:calc(var(--ww-spacing)*0)}.ww\:flex-1{flex:1}.ww\:shrink-0{flex-shrink:0}.ww\:grow{flex-grow:1}.ww\:translate-x-\[-50\%\]{--tw-translate-x:-50%;translate:var(--tw-translate-x)var(--tw-translate-y)}.ww\:rotate-90{rotate:90deg}.ww\:rotate-180{rotate:180deg}.ww\:animate-\[ww-fade-in_0\.2s_ease-out_both\]{animation:.2s ease-out both ww-fade-in}.ww\:animate-pulse{animation:var(--ww-animate-pulse)}.ww\:animate-spin{animation:var(--ww-animate-spin)}.ww\:cursor-default{cursor:default}.ww\:cursor-pointer{cursor:pointer}.ww\:resize-none{resize:none}.ww\:list-none{list-style-type:none}.ww\:grid-rows-\[0fr\]{grid-template-rows:0fr}.ww\:grid-rows-\[1fr\]{grid-template-rows:1fr}.ww\:flex-col{flex-direction:column}.ww\:flex-nowrap{flex-wrap:nowrap}.ww\:flex-wrap{flex-wrap:wrap}.ww\:items-center{align-items:center}.ww\:items-end{align-items:flex-end}.ww\:items-start{align-items:flex-start}.ww\:justify-between{justify-content:space-between}.ww\:justify-center{justify-content:center}.ww\:justify-end{justify-content:flex-end}.ww\:gap-1{gap:calc(var(--ww-spacing)*1)}.ww\:gap-1\.5{gap:calc(var(--ww-spacing)*1.5)}.ww\:gap-2{gap:calc(var(--ww-spacing)*2)}.ww\:gap-2\.5{gap:calc(var(--ww-spacing)*2.5)}.ww\:gap-3{gap:calc(var(--ww-spacing)*3)}.ww\:gap-6{gap:calc(var(--ww-spacing)*6)}:where(.ww\:space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--ww-spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--ww-spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.ww\:space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--ww-spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--ww-spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}.ww\:self-stretch{align-self:stretch}.ww\:truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.ww\:overflow-auto{overflow:auto}.ww\:overflow-hidden{overflow:hidden}.ww\:overflow-x-auto{overflow-x:auto}.ww\:overflow-y-auto{overflow-y:auto}.ww\:overflow-y-hidden{overflow-y:hidden}.ww\:\!rounded-full{border-radius:3.40282e38px!important}.ww\:rounded{border-radius:var(--ww-radius,16px)}.ww\:rounded-2xl{border-radius:var(--ww-radius-2xl)}.ww\:rounded-\[20px\]{border-radius:20px}.ww\:rounded-\[inherit\]{border-radius:inherit}.ww\:rounded-full{border-radius:3.40282e38px}.ww\:rounded-lg{border-radius:var(--ww-radius-lg)}.ww\:rounded-md{border-radius:var(--ww-radius-md)}.ww\:rounded-none{border-radius:0}.ww\:rounded-xl{border-radius:var(--ww-radius-xl)}.ww\:border{border-style:var(--tw-border-style);border-width:1px}.ww\:border-0{border-style:var(--tw-border-style);border-width:0}.ww\:border-2{border-style:var(--tw-border-style);border-width:2px}.ww\:border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.ww\:border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.ww\:border-dashed{--tw-border-style:dashed;border-style:dashed}.ww\:border-none{--tw-border-style:none;border-style:none}.ww\:border-border{border-color:var(--ww-color-border,#e5e7eb)}.ww\:border-muted-foreground\/50{border-color:var(--ww-color-muted-foreground,#6b7280)}@supports (color:color-mix(in lab, red, red)){.ww\:border-muted-foreground\/50{border-color:color-mix(in oklab,var(--ww-color-muted-foreground,#6b7280)50%,transparent)}}.ww\:border-primary{border-color:var(--ww-color-primary,#6366f1)}.ww\:border-transparent{border-color:#0000}.ww\:bg-accent{background-color:var(--ww-color-accent,#f3f4f6)}.ww\:bg-background,.ww\:bg-background\/20{background-color:var(--ww-color-background,#fff)}@supports (color:color-mix(in lab, red, red)){.ww\:bg-background\/20{background-color:color-mix(in oklab,var(--ww-color-background,#fff)20%,transparent)}}.ww\:bg-background\/85{background-color:var(--ww-color-background,#fff)}@supports (color:color-mix(in lab, red, red)){.ww\:bg-background\/85{background-color:color-mix(in oklab,var(--ww-color-background,#fff)85%,transparent)}}.ww\:bg-black\/45{background-color:var(--ww-color-black)}@supports (color:color-mix(in lab, red, red)){.ww\:bg-black\/45{background-color:color-mix(in oklab,var(--ww-color-black)45%,transparent)}}.ww\:bg-border{background-color:var(--ww-color-border,#e5e7eb)}.ww\:bg-foreground,.ww\:bg-foreground\/5{background-color:var(--ww-color-foreground,#1f2937)}@supports (color:color-mix(in lab, red, red)){.ww\:bg-foreground\/5{background-color:color-mix(in oklab,var(--ww-color-foreground,#1f2937)5%,transparent)}}.ww\:bg-input{background-color:var(--ww-color-input,#f9fafb)}.ww\:bg-muted{background-color:var(--ww-color-muted,#f1f5f9)}.ww\:bg-muted-foreground\/60{background-color:var(--ww-color-muted-foreground,#6b7280)}@supports (color:color-mix(in lab, red, red)){.ww\:bg-muted-foreground\/60{background-color:color-mix(in oklab,var(--ww-color-muted-foreground,#6b7280)60%,transparent)}}.ww\:bg-muted\/50{background-color:var(--ww-color-muted,#f1f5f9)}@supports (color:color-mix(in lab, red, red)){.ww\:bg-muted\/50{background-color:color-mix(in oklab,var(--ww-color-muted,#f1f5f9)50%,transparent)}}.ww\:bg-primary{background-color:var(--ww-color-primary,#6366f1)}.ww\:bg-tool-card{background-color:var(--ww-color-tool-card,#f4f4f5)}.ww\:bg-transparent{background-color:#0000}.ww\:object-contain{object-fit:contain}.ww\:object-cover{object-fit:cover}.ww\:object-center{object-position:center}.ww\:p-0{padding:calc(var(--ww-spacing)*0)}.ww\:p-1{padding:calc(var(--ww-spacing)*1)}.ww\:p-1\.5{padding:calc(var(--ww-spacing)*1.5)}.ww\:p-2{padding:calc(var(--ww-spacing)*2)}.ww\:p-2\.5{padding:calc(var(--ww-spacing)*2.5)}.ww\:p-3{padding:calc(var(--ww-spacing)*3)}.ww\:px-0{padding-inline:calc(var(--ww-spacing)*0)}.ww\:px-0\.5{padding-inline:calc(var(--ww-spacing)*.5)}.ww\:px-1\.5{padding-inline:calc(var(--ww-spacing)*1.5)}.ww\:px-2{padding-inline:calc(var(--ww-spacing)*2)}.ww\:px-3{padding-inline:calc(var(--ww-spacing)*3)}.ww\:px-3\.5{padding-inline:calc(var(--ww-spacing)*3.5)}.ww\:px-4{padding-inline:calc(var(--ww-spacing)*4)}.ww\:px-6{padding-inline:calc(var(--ww-spacing)*6)}.ww\:\!py-0{padding-block:calc(var(--ww-spacing)*0)!important}.ww\:py-0\.5{padding-block:calc(var(--ww-spacing)*.5)}.ww\:py-1{padding-block:calc(var(--ww-spacing)*1)}.ww\:py-1\.5{padding-block:calc(var(--ww-spacing)*1.5)}.ww\:py-2{padding-block:calc(var(--ww-spacing)*2)}.ww\:py-2\.5{padding-block:calc(var(--ww-spacing)*2.5)}.ww\:py-3{padding-block:calc(var(--ww-spacing)*3)}.ww\:py-6{padding-block:calc(var(--ww-spacing)*6)}.ww\:py-12{padding-block:calc(var(--ww-spacing)*12)}.ww\:pt-1{padding-top:calc(var(--ww-spacing)*1)}.ww\:pt-1\.5{padding-top:calc(var(--ww-spacing)*1.5)}.ww\:pt-2{padding-top:calc(var(--ww-spacing)*2)}.ww\:pt-2\.5{padding-top:calc(var(--ww-spacing)*2.5)}.ww\:pt-3{padding-top:calc(var(--ww-spacing)*3)}.ww\:pr-1\.5{padding-right:calc(var(--ww-spacing)*1.5)}.ww\:pr-3{padding-right:calc(var(--ww-spacing)*3)}.ww\:pr-9{padding-right:calc(var(--ww-spacing)*9)}.ww\:pb-0{padding-bottom:calc(var(--ww-spacing)*0)}.ww\:pb-1{padding-bottom:calc(var(--ww-spacing)*1)}.ww\:pb-1\.5{padding-bottom:calc(var(--ww-spacing)*1.5)}.ww\:pb-2{padding-bottom:calc(var(--ww-spacing)*2)}.ww\:pb-2\.5{padding-bottom:calc(var(--ww-spacing)*2.5)}.ww\:pb-3{padding-bottom:calc(var(--ww-spacing)*3)}.ww\:pl-1{padding-left:calc(var(--ww-spacing)*1)}.ww\:pl-3\.5{padding-left:calc(var(--ww-spacing)*3.5)}.ww\:pl-4{padding-left:calc(var(--ww-spacing)*4)}.ww\:text-center{text-align:center}.ww\:text-left{text-align:left}.ww\:font-\[family-name\:var\(--ww-font\)\]{font-family:var(--ww-font)}.ww\:font-\[family-name\:var\(--ww-font-sans\)\]{font-family:var(--ww-font-sans)}.ww\:font-mono{font-family:var(--ww-font-mono)}.ww\:text-base{font-size:var(--ww-text-base);line-height:var(--tw-leading,var(--ww-text-base--line-height))}.ww\:text-lg{font-size:var(--ww-text-lg);line-height:var(--tw-leading,var(--ww-text-lg--line-height))}.ww\:text-sm{font-size:var(--ww-text-sm);line-height:var(--tw-leading,var(--ww-text-sm--line-height))}.ww\:text-xs{font-size:var(--ww-text-xs);line-height:var(--tw-leading,var(--ww-text-xs--line-height))}.ww\:\[font-size\:var\(--ww-font-size\,1rem\)\]{font-size:var(--ww-font-size,1rem)}.ww\:text-\[10px\]{font-size:10px}.ww\:text-\[11px\]{font-size:11px}.ww\:\[line-height\:var\(--ww-line-height\,1\.5\)\]{line-height:var(--ww-line-height,1.5)}.ww\:font-medium{--tw-font-weight:var(--ww-font-weight-medium);font-weight:var(--ww-font-weight-medium)}.ww\:font-semibold{--tw-font-weight:var(--ww-font-weight-semibold);font-weight:var(--ww-font-weight-semibold)}.ww\:tracking-wide{--tw-tracking:var(--ww-tracking-wide);letter-spacing:var(--ww-tracking-wide)}.ww\:tracking-wider{--tw-tracking:var(--ww-tracking-wider);letter-spacing:var(--ww-tracking-wider)}.ww\:break-words{overflow-wrap:break-word}.ww\:break-all{word-break:break-all}.ww\:whitespace-nowrap{white-space:nowrap}.ww\:whitespace-pre-wrap{white-space:pre-wrap}.ww\:text-background{color:var(--ww-color-background,#fff)}.ww\:text-foreground,.ww\:text-foreground\/80{color:var(--ww-color-foreground,#1f2937)}@supports (color:color-mix(in lab, red, red)){.ww\:text-foreground\/80{color:color-mix(in oklab,var(--ww-color-foreground,#1f2937)80%,transparent)}}.ww\:text-muted-foreground{color:var(--ww-color-muted-foreground,#6b7280)}.ww\:text-primary{color:var(--ww-color-primary,#6366f1)}.ww\:text-primary-foreground{color:var(--ww-color-primary-foreground,#1f2937)}.ww\:uppercase{text-transform:uppercase}.ww\:italic{font-style:italic}.ww\:underline{text-decoration-line:underline}.ww\:underline-offset-2{text-underline-offset:2px}.ww\:opacity-0{opacity:0}.ww\:opacity-60{opacity:.6}.ww\:opacity-70{opacity:.7}.ww\:opacity-100{opacity:1}.ww\:shadow{--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)}.ww\:shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ww\:shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px 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)}.ww\: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)}.ww\:ring-\[\#0a6c74\]{--tw-ring-color:#0a6c74}.ww\:backdrop-blur-md{--tw-backdrop-blur:blur(var(--ww-blur-md));-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,)}.ww\:backdrop-blur-xl{--tw-backdrop-blur:blur(var(--ww-blur-xl));-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,)}.ww\:backdrop-saturate-150{--tw-backdrop-saturate:saturate(150%);-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,)}.ww\:transition-\[grid-template-rows\,opacity\]{transition-property:grid-template-rows,opacity;transition-timing-function:var(--tw-ease,var(--ww-default-transition-timing-function));transition-duration:var(--tw-duration,var(--ww-default-transition-duration))}.ww\:transition-\[max-width\]{transition-property:max-width;transition-timing-function:var(--tw-ease,var(--ww-default-transition-timing-function));transition-duration:var(--tw-duration,var(--ww-default-transition-duration))}.ww\:transition-\[width\]{transition-property:width;transition-timing-function:var(--tw-ease,var(--ww-default-transition-timing-function));transition-duration:var(--tw-duration,var(--ww-default-transition-duration))}.ww\:transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--ww-default-transition-timing-function));transition-duration:var(--tw-duration,var(--ww-default-transition-duration))}.ww\: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(--ww-default-transition-timing-function));transition-duration:var(--tw-duration,var(--ww-default-transition-duration))}.ww\:transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--ww-default-transition-timing-function));transition-duration:var(--tw-duration,var(--ww-default-transition-duration))}.ww\:transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--ww-default-transition-timing-function));transition-duration:var(--tw-duration,var(--ww-default-transition-duration))}.ww\:duration-150{--tw-duration:.15s;transition-duration:.15s}.ww\:duration-200{--tw-duration:.2s;transition-duration:.2s}.ww\:duration-300{--tw-duration:.3s;transition-duration:.3s}.ww\:ease-out{--tw-ease:var(--ww-ease-out);transition-timing-function:var(--ww-ease-out)}.ww\:outline-none{--tw-outline-style:none;outline-style:none}@media (hover:hover){.ww\:group-hover\:opacity-0:is(:where(.ww\:group):hover *){opacity:0}.ww\:group-hover\:opacity-100:is(:where(.ww\:group):hover *){opacity:1}}.ww\:group-\[\.is-assistant\]\:text-foreground:is(:where(.ww\:group).is-assistant *){color:var(--ww-color-foreground,#1f2937)}.ww\:group-\[\.is-user\]\:ml-auto:is(:where(.ww\:group).is-user *){margin-left:auto}.ww\:group-\[\.is-user\]\:\[border-radius\:var\(--ww-msg-radius\,8px\)\]:is(:where(.ww\:group).is-user *){border-radius:var(--ww-msg-radius,8px)}.ww\:group-\[\.is-user\]\:bg-user-bubble:is(:where(.ww\:group).is-user *){background-color:var(--ww-color-user-bubble,#f4f4f4)}.ww\:group-\[\.is-user\]\:\[padding\:var\(--ww-msg-pad-y\,12px\)_var\(--ww-msg-pad-x\,16px\)\]:is(:where(.ww\:group).is-user *){padding:var(--ww-msg-pad-y,12px)var(--ww-msg-pad-x,16px)}.ww\:group-\[\.is-user\]\:\[color\:var\(--ww-color-user-bubble-text\)\]:is(:where(.ww\:group).is-user *){color:var(--ww-color-user-bubble-text)}.ww\:placeholder\:text-muted-foreground::placeholder{color:var(--ww-color-muted-foreground,#6b7280)}@media (hover:hover){.ww\:hover\:border-primary\/30:hover{border-color:var(--ww-color-primary,#6366f1)}@supports (color:color-mix(in lab, red, red)){.ww\:hover\:border-primary\/30:hover{border-color:color-mix(in oklab,var(--ww-color-primary,#6366f1)30%,transparent)}}.ww\:hover\:bg-accent:hover{background-color:var(--ww-color-accent,#f3f4f6)}.ww\:hover\:bg-border:hover{background-color:var(--ww-color-border,#e5e7eb)}.ww\:hover\:bg-foreground:hover{background-color:var(--ww-color-foreground,#1f2937)}.ww\:hover\:bg-muted:hover{background-color:var(--ww-color-muted,#f1f5f9)}.ww\:hover\:bg-muted-foreground\/10:hover{background-color:var(--ww-color-muted-foreground,#6b7280)}@supports (color:color-mix(in lab, red, red)){.ww\:hover\:bg-muted-foreground\/10:hover{background-color:color-mix(in oklab,var(--ww-color-muted-foreground,#6b7280)10%,transparent)}}.ww\:hover\:bg-primary\/90:hover{background-color:var(--ww-color-primary,#6366f1)}@supports (color:color-mix(in lab, red, red)){.ww\:hover\:bg-primary\/90:hover{background-color:color-mix(in oklab,var(--ww-color-primary,#6366f1)90%,transparent)}}.ww\:hover\:text-accent-foreground:hover{color:var(--ww-color-accent-foreground,#1f2937)}.ww\:hover\:text-foreground:hover{color:var(--ww-color-foreground,#1f2937)}.ww\:hover\:underline:hover{text-decoration-line:underline}}.ww\:disabled\:pointer-events-none:disabled{pointer-events:none}.ww\:disabled\:opacity-40:disabled{opacity:.4}.ww\:disabled\:opacity-50:disabled{opacity:.5}@media (min-width:40rem){.ww\:sm\:inset-auto{inset:auto}.ww\:sm\:right-0{right:calc(var(--ww-spacing)*0)}.ww\:sm\:bottom-4{bottom:calc(var(--ww-spacing)*4)}.ww\:sm\:left-0{left:calc(var(--ww-spacing)*0)}.ww\:sm\:mx-auto{margin-inline:auto}.ww\:sm\:h-\[720px\]{height:720px}.ww\:sm\:max-h-\[calc\(100dvh-2rem\)\]{max-height:calc(100dvh - 2rem)}.ww\:sm\:w-\[calc\(100vw-2rem\)\]{width:calc(100vw - 2rem)}.ww\:sm\:max-w-\[1000px\]{max-width:1000px}.ww\:sm\:rounded-2xl{border-radius:var(--ww-radius-2xl)}.ww\:sm\:border{border-style:var(--tw-border-style);border-width:1px}.ww\:sm\:border-border{border-color:var(--ww-color-border,#e5e7eb)}.ww\:sm\:py-2{padding-block:calc(var(--ww-spacing)*2)}.ww\:sm\:pr-2{padding-right:calc(var(--ww-spacing)*2)}.ww\:sm\:pl-4{padding-left:calc(var(--ww-spacing)*4)}.ww\:sm\:text-sm{font-size:var(--ww-text-sm);line-height:var(--tw-leading,var(--ww-text-sm--line-height))}.ww\:sm\:text-\[11px\]{font-size:11px}}.ww\:\[\&\>\*\:first-child\]\:mt-0>:first-child{margin-top:calc(var(--ww-spacing)*0)}.ww\:\[\&\>\*\:last-child\]\:mb-0>:last-child{margin-bottom:calc(var(--ww-spacing)*0)}}@keyframes ww-fade-in{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}@keyframes ww-fade-out{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(-4px)}}@keyframes ww-pulse{0%,80%,to{opacity:.3;transform:scale(.8)}40%{opacity:1;transform:scale(1)}}@keyframes ww-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}@media (prefers-reduced-motion:reduce){[data-waniwani-chat] [data-waniwani-shimmer]{color:var(--ww-color-muted-foreground)!important;animation:none!important}}[data-waniwani-floating=dock]{transition:opacity .32s,transform .42s cubic-bezier(.22,1,.36,1),max-width .3s,visibility 0s linear .42s}[data-waniwani-floating=dock][data-appeared=true][data-state=shown]{visibility:visible;opacity:1;pointer-events:auto;transition:opacity .32s,transform .42s cubic-bezier(.22,1,.36,1),max-width .3s,visibility;transform:translateY(0)}[data-waniwani-floating=dock][data-appeared=false],[data-waniwani-floating=dock][data-state=hidden]{opacity:0;visibility:hidden;pointer-events:none;transform:translateY(1rem)}[data-waniwani-floating=panel]{transition:clip-path .44s cubic-bezier(.22,1,.36,1),opacity .26s,visibility 0s linear .44s}[data-waniwani-floating=panel][data-state=shown]{visibility:visible;opacity:1;pointer-events:auto;clip-path:inset(-40px round 18px);transition:clip-path .44s cubic-bezier(.22,1,.36,1),opacity .26s,visibility}[data-waniwani-floating=panel][data-state=hidden]{opacity:0;visibility:hidden;pointer-events:none;clip-path:inset(calc(100% - 60px) 12% 0 round 24px)}@media (max-width:639px){[data-waniwani-floating=panel][data-state=shown]{clip-path:inset(0)}[data-waniwani-floating=panel][data-state=hidden]{clip-path:inset(calc(100% - 72px) 6% 0 round 22px)}}@media (prefers-reduced-motion:reduce){[data-waniwani-floating=dock],[data-waniwani-floating=panel]{clip-path:none;transition:visibility 0s linear 10ms}[data-waniwani-floating=dock][data-appeared=true][data-state=shown],[data-waniwani-floating=panel][data-state=shown]{transition:visibility}}[data-waniwani-chat] ::-webkit-scrollbar{width:8px}[data-waniwani-chat] ::-webkit-scrollbar-track{background:0 0}[data-waniwani-chat] ::-webkit-scrollbar-thumb{background:var(--ww-color-border);border-radius:9999px}[data-waniwani-chat] ::-webkit-scrollbar-thumb:hover{background:var(--ww-color-muted-foreground)}[data-waniwani-chat] *{scrollbar-width:thin;scrollbar-color:var(--ww-color-border)transparent}[data-waniwani-chat]{--ww-color-background:var(--ww-bg,#fff);--ww-color-foreground:var(--ww-text,#1f2937);--ww-color-primary:var(--ww-primary,#6366f1);--ww-color-primary-foreground:var(--ww-primary-fg,#1f2937);--ww-color-muted-foreground:var(--ww-muted,#6b7280);--ww-color-border:var(--ww-border,#e5e7eb);--ww-color-input:var(--ww-input-bg,#f9fafb);--ww-color-accent:var(--ww-assistant-bubble,#f3f4f6);--ww-color-accent-foreground:var(--ww-text,#1f2937);--ww-color-user-bubble:var(--ww-user-bubble,#f4f4f4);--ww-color-card:var(--ww-bg,#fff);--ww-color-card-foreground:var(--ww-text,#1f2937);--ww-color-card-header:var(--ww-header-bg,#fff);--ww-color-card-header-foreground:var(--ww-header-text,#1f2937);--ww-color-status:var(--ww-status,#22c55e);--ww-color-tool-card:var(--ww-tool-card,#f4f4f5);--ww-radius:var(--ww-radius,16px);--ww-font-sans:var(--ww-font,system-ui,-apple-system,"Segoe UI",sans-serif);--ww-color-user-bubble-text:var(--ww-user-bubble-text,var(--ww-color-primary-foreground));--ww-color-assistant-bubble-text:var(--ww-assistant-bubble-text,var(--ww-color-foreground));--ww-glass:var(--ww-glass-tint,transparent)}@supports (color:color-mix(in lab, red, red)){[data-waniwani-chat]{--ww-glass:color-mix(in srgb,var(--ww-glass-tint,transparent)calc(var(--ww-glass-tint-opacity,0)*100%),#eceef499)}}[data-waniwani-chat]{--ww-glass-border:#0000000f;border-style:solid;border-width:var(--ww-border-width,0);border-color:var(--ww-color-border);box-shadow:var(--ww-shadow,none)}[data-waniwani-chat][data-assistant-bubble=true] .ww-message-assistant .ww-bubble{background:var(--ww-color-accent);color:var(--ww-color-assistant-bubble-text);border-radius:var(--ww-msg-radius,8px);padding:var(--ww-msg-pad-y,12px)var(--ww-msg-pad-x,16px);width:fit-content;max-width:var(--ww-msg-max-width,80%)}.dark [data-waniwani-chat],[data-waniwani-chat].dark{--ww-color-background:var(--ww-bg,#212121);--ww-color-foreground:var(--ww-text,#ececec);--ww-color-primary:var(--ww-primary,#6366f1);--ww-color-primary-foreground:var(--ww-primary-fg,#fff);--ww-color-muted-foreground:var(--ww-muted,#8e8ea0);--ww-color-border:var(--ww-border,#444);--ww-color-input:var(--ww-input-bg,#2f2f2f);--ww-color-accent:var(--ww-assistant-bubble,#2f2f2f);--ww-color-accent-foreground:var(--ww-text,#ececec);--ww-color-user-bubble:var(--ww-user-bubble,#303030);--ww-color-card:var(--ww-bg,#212121);--ww-color-card-foreground:var(--ww-text,#ececec);--ww-color-card-header:var(--ww-header-bg,#1e1e1e);--ww-color-card-header-foreground:var(--ww-header-text,#ececec);--ww-color-status:var(--ww-status,#22c55e);--ww-color-tool-card:var(--ww-tool-card,#262626);--ww-color-user-bubble-text:var(--ww-user-bubble-text,#fff);--ww-color-assistant-bubble-text:var(--ww-assistant-bubble-text,var(--ww-color-foreground));--ww-glass:var(--ww-glass-tint,transparent)}@supports (color:color-mix(in lab, red, red)){.dark [data-waniwani-chat],[data-waniwani-chat].dark{--ww-glass:color-mix(in srgb,var(--ww-glass-tint,transparent)calc(var(--ww-glass-tint-opacity,0)*100%),#282a3480)}}.dark [data-waniwani-chat],[data-waniwani-chat].dark{--ww-glass-border:#ffffff1f}@media (prefers-color-scheme:dark){[data-waniwani-chat][data-color-scheme=auto]{--ww-color-background:var(--ww-bg,#212121);--ww-color-foreground:var(--ww-text,#ececec);--ww-color-primary:var(--ww-primary,#6366f1);--ww-color-primary-foreground:var(--ww-primary-fg,#fff);--ww-color-muted-foreground:var(--ww-muted,#8e8ea0);--ww-color-border:var(--ww-border,#444);--ww-color-input:var(--ww-input-bg,#2f2f2f);--ww-color-accent:var(--ww-assistant-bubble,#2f2f2f);--ww-color-accent-foreground:var(--ww-text,#ececec);--ww-color-user-bubble:var(--ww-user-bubble,#303030);--ww-color-card:var(--ww-bg,#212121);--ww-color-card-foreground:var(--ww-text,#ececec);--ww-color-card-header:var(--ww-header-bg,#1e1e1e);--ww-color-card-header-foreground:var(--ww-header-text,#ececec);--ww-color-status:var(--ww-status,#22c55e);--ww-color-tool-card:var(--ww-tool-card,#262626);--ww-color-user-bubble-text:var(--ww-user-bubble-text,#fff);--ww-color-assistant-bubble-text:var(--ww-assistant-bubble-text,var(--ww-color-foreground));--ww-glass:var(--ww-glass-tint,transparent)}@supports (color:color-mix(in lab, red, red)){[data-waniwani-chat][data-color-scheme=auto]{--ww-glass:color-mix(in srgb,var(--ww-glass-tint,transparent)calc(var(--ww-glass-tint-opacity,0)*100%),#282a3480)}}[data-waniwani-chat][data-color-scheme=auto]{--ww-glass-border:#ffffff1f}}[data-waniwani-chat] [data-streamdown=table-wrapper]{flex-direction:column;gap:.5rem;margin-top:1rem;margin-bottom:1rem;display:flex}[data-waniwani-chat] [data-streamdown=table-wrapper]>div:first-child:has(button){justify-content:flex-end;align-items:center;gap:.25rem;display:flex}[data-waniwani-chat] [data-streamdown=table-wrapper]>div:last-child{overflow-x:auto}[data-waniwani-chat] [data-streamdown=table]{border-collapse:collapse;border:1px solid var(--ww-color-border);border-radius:.75rem;width:100%;overflow:hidden}[data-waniwani-chat] [data-streamdown=table-header]{background-color:var(--ww-color-accent)}@supports (color:color-mix(in lab, red, red)){[data-waniwani-chat] [data-streamdown=table-header]{background-color:color-mix(in srgb,var(--ww-color-accent)80%,transparent)}}[data-waniwani-chat] [data-streamdown=table-body]{background-color:var(--ww-color-accent)}@supports (color:color-mix(in lab, red, red)){[data-waniwani-chat] [data-streamdown=table-body]{background-color:color-mix(in srgb,var(--ww-color-accent)40%,transparent)}}[data-waniwani-chat] [data-streamdown=table-body]>tr+tr{border-top:1px solid var(--ww-color-border)}[data-waniwani-chat] [data-streamdown=table-row]{border-bottom:1px solid var(--ww-color-border)}[data-waniwani-chat] [data-streamdown=table-header-cell]{white-space:nowrap;text-align:left;padding:.5rem 1rem;font-size:.875rem;font-weight:600}[data-waniwani-chat] [data-streamdown=table-cell]{padding:.5rem 1rem;font-size:.875rem}[data-waniwani-chat] [data-streamdown=link]{color:var(--ww-color-primary);overflow-wrap:anywhere;cursor:pointer;font-weight:500;text-decoration:underline}[data-waniwani-chat].dark [data-streamdown=link],.dark [data-waniwani-chat] [data-streamdown=link]{color:var(--ww-color-primary)}@supports (color:color-mix(in lab, red, red)){[data-waniwani-chat].dark [data-streamdown=link],.dark [data-waniwani-chat] [data-streamdown=link]{color:color-mix(in oklab,var(--ww-color-primary)55%,white)}}@media (prefers-color-scheme:dark){[data-waniwani-chat][data-color-scheme=auto] [data-streamdown=link]{color:var(--ww-color-primary)}@supports (color:color-mix(in lab, red, red)){[data-waniwani-chat][data-color-scheme=auto] [data-streamdown=link]{color:color-mix(in oklab,var(--ww-color-primary)55%,white)}}}[data-waniwani-chat].dark [data-waniwani-logo],.dark [data-waniwani-chat] [data-waniwani-logo]{filter:invert()}@media (prefers-color-scheme:dark){[data-waniwani-chat][data-color-scheme=auto] [data-waniwani-logo]{filter:invert()}}[data-waniwani-chat] [data-streamdown=link-safety-modal]{z-index:50;background-color:var(--ww-color-background);justify-content:center;align-items:center;display:flex;position:fixed;inset:0}@supports (color:color-mix(in lab, red, red)){[data-waniwani-chat] [data-streamdown=link-safety-modal]{background-color:color-mix(in srgb,var(--ww-color-background)50%,transparent)}}[data-waniwani-chat] [data-streamdown=link-safety-modal]{-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}[data-waniwani-chat] [data-streamdown=link-safety-modal]>div{border:1px solid var(--ww-color-border);background-color:var(--ww-color-background);width:100%;max-width:28rem;color:var(--ww-color-foreground);border-radius:.75rem;flex-direction:column;gap:1rem;margin:0 1rem;padding:1.5rem;display:flex;position:relative;box-shadow:0 10px 25px #0000001a}[data-waniwani-chat] [data-streamdown=link-safety-modal] button{cursor:pointer}[data-waniwani-chat] [data-streamdown=link-safety-modal]>div>button:first-child{color:var(--ww-color-muted-foreground);background:0 0;border:none;border-radius:.375rem;padding:.25rem;transition:background-color .15s,color .15s;position:absolute;top:1rem;right:1rem}[data-waniwani-chat] [data-streamdown=link-safety-modal]>div>button:first-child:hover{background-color:var(--ww-color-accent);color:var(--ww-color-foreground)}[data-waniwani-chat] [data-streamdown=link-safety-modal]>div>div:first-of-type{flex-direction:column;gap:.5rem;display:flex}[data-waniwani-chat] [data-streamdown=link-safety-modal]>div>div:first-of-type>div{align-items:center;gap:.5rem;font-size:1.125rem;font-weight:600;display:flex}[data-waniwani-chat] [data-streamdown=link-safety-modal]>div>div:first-of-type>p{color:var(--ww-color-muted-foreground);font-size:.875rem}[data-waniwani-chat] [data-streamdown=link-safety-modal]>div>div:nth-child(3){word-break:break-all;background-color:var(--ww-color-accent);border-radius:.375rem;max-height:8rem;padding:.75rem;font-family:ui-monospace,monospace;font-size:.875rem;overflow-y:auto}[data-waniwani-chat] [data-streamdown=link-safety-modal]>div>div:last-child{gap:.5rem;display:flex}[data-waniwani-chat] [data-streamdown=link-safety-modal]>div>div:last-child>button{border:none;border-radius:.375rem;flex:1;justify-content:center;align-items:center;gap:.5rem;padding:.5rem 1rem;font-size:.875rem;font-weight:500;transition:background-color .15s;display:flex}[data-waniwani-chat] [data-streamdown=link-safety-modal]>div>div:last-child>button:first-child{border:1px solid var(--ww-color-border);background-color:var(--ww-color-background);color:var(--ww-color-foreground)}[data-waniwani-chat] [data-streamdown=link-safety-modal]>div>div:last-child>button:first-child:hover{background-color:var(--ww-color-accent)}[data-waniwani-chat] [data-streamdown=link-safety-modal]>div>div:last-child>button:last-child{background-color:var(--ww-color-primary);color:#fff}[data-waniwani-chat] [data-streamdown=link-safety-modal]>div>div:last-child>button:last-child:hover{opacity:.9}[data-waniwani-chat] [data-streamdown=ordered-list]{white-space:normal;list-style-type:decimal;list-style-position:inside}[data-waniwani-chat] li [data-streamdown=ordered-list]{padding-left:1.5rem}[data-waniwani-chat] [data-streamdown=unordered-list]{white-space:normal;list-style-type:disc;list-style-position:inside}[data-waniwani-chat] li [data-streamdown=unordered-list]{padding-left:1.5rem}[data-waniwani-chat] [data-streamdown=list-item]{padding-top:.25rem;padding-bottom:.25rem}[data-waniwani-chat] [data-streamdown=list-item]>p{display:inline}[data-waniwani-chat] [data-streamdown=inline-code]{background-color:var(--ww-color-accent);border-radius:.25rem;padding:.125rem .375rem;font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,monospace;font-size:.875rem}[data-waniwani-chat] [data-streamdown=heading-1]{margin-top:1.5rem;margin-bottom:.5rem;font-size:1.875rem;font-weight:600;line-height:2.25rem}[data-waniwani-chat] [data-streamdown=heading-2]{margin-top:1.5rem;margin-bottom:.5rem;font-size:1.5rem;font-weight:600;line-height:2rem}[data-waniwani-chat] [data-streamdown=heading-3]{margin-top:1.5rem;margin-bottom:.5rem;font-size:1.25rem;font-weight:600;line-height:1.75rem}[data-waniwani-chat] [data-streamdown=heading-4]{margin-top:1.5rem;margin-bottom:.5rem;font-size:1.125rem;font-weight:600;line-height:1.75rem}[data-waniwani-chat] [data-streamdown=heading-5]{margin-top:1.5rem;margin-bottom:.5rem;font-size:1rem;font-weight:600;line-height:1.5rem}[data-waniwani-chat] [data-streamdown=heading-6]{margin-top:1.5rem;margin-bottom:.5rem;font-size:.875rem;font-weight:600;line-height:1.25rem}[data-waniwani-chat] [data-streamdown=blockquote]{border-left:4px solid var(--ww-color-muted-foreground);margin-top:1rem;margin-bottom:1rem}@supports (color:color-mix(in lab, red, red)){[data-waniwani-chat] [data-streamdown=blockquote]{border-left:4px solid color-mix(in srgb,var(--ww-color-muted-foreground)30%,transparent)}}[data-waniwani-chat] [data-streamdown=blockquote]{color:var(--ww-color-muted-foreground);padding-left:1rem;font-style:italic}[data-waniwani-chat] [data-streamdown=horizontal-rule]{border-color:var(--ww-color-border);margin-top:1.5rem;margin-bottom:1.5rem}[data-waniwani-chat] [data-streamdown=strong]{font-weight:600}[data-waniwani-chat] [data-streamdown=image-wrapper]{margin-top:1rem;margin-bottom:1rem;display:inline-block;position:relative}[data-waniwani-chat] [data-streamdown=image]{border-radius:.5rem;max-width:100%}[data-waniwani-chat] [data-streamdown=code-block]{border:1px solid var(--ww-color-border);border-radius:.75rem;width:100%;margin-top:1rem;margin-bottom:1rem;overflow:hidden}[data-waniwani-chat] [data-streamdown=code-block-header]{background-color:var(--ww-color-accent);justify-content:space-between;align-items:center;display:flex}@supports (color:color-mix(in lab, red, red)){[data-waniwani-chat] [data-streamdown=code-block-header]{background-color:color-mix(in srgb,var(--ww-color-accent)80%,transparent)}}[data-waniwani-chat] [data-streamdown=code-block-header]{color:var(--ww-color-muted-foreground);padding:.75rem;font-size:.75rem}[data-waniwani-chat] [data-streamdown=code-block-body]{padding:1rem;font-size:.875rem;overflow-x:auto}[data-waniwani-chat] [data-streamdown=code-block-copy-button],[data-waniwani-chat] [data-streamdown=code-block-download-button]{cursor:pointer;color:var(--ww-color-muted-foreground);background:0 0;border:none;padding:.25rem;transition:color .15s}[data-waniwani-chat] [data-streamdown=code-block-copy-button]:hover,[data-waniwani-chat] [data-streamdown=code-block-download-button]:hover{color:var(--ww-color-foreground)}[data-waniwani-chat] [data-streamdown=mermaid-block]{border:1px solid var(--ww-color-border);border-radius:.75rem;height:auto;margin-top:1rem;margin-bottom:1rem;padding:1rem;position:relative}[data-waniwani-chat] [data-streamdown=mermaid]{width:100%;height:100%}@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-border-style{syntax:"*";inherits:false;initial-value:solid}@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-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}
@@ -0,0 +1,104 @@
1
+ /**
2
+ * Structural stand-in for a Zod schema, so the package root's type graph does
3
+ * not reference `zod`, an optional peer. Pass a real Zod schema: `extract()`
4
+ * converts it with `z.toJSONSchema()`, which no other `parse`-shaped object
5
+ * survives.
6
+ */
7
+ interface DocumentSchema<T> {
8
+ parse(value: unknown): T;
9
+ }
10
+ interface DocumentExtractResult<T> {
11
+ /** The document's contents, parsed with the schema you passed. A null field is one the document did not legibly answer. */
12
+ fields: T;
13
+ /** Pages the vendor processed and billed */
14
+ pageCount: number;
15
+ /** Mean per-page OCR confidence, null when none was reported */
16
+ pageConfidence: number | null;
17
+ /** Handle for this extraction, valid for the 7-day retention window */
18
+ documentId: string;
19
+ }
20
+ /** A document the visitor uploaded through the chat widget, already stored by the platform. */
21
+ interface AttachedDocument {
22
+ /** Pass to `documents.extract({ documentId, schema })` to read it. */
23
+ documentId: string;
24
+ /** Name the visitor's file had */
25
+ filename: string;
26
+ /** MIME type the browser declared on upload */
27
+ mediaType: string;
28
+ }
29
+ interface DocumentExtractCommon<T> {
30
+ /** The shape to return. Extraction runs in strict mode, so mark anything a document may not answer `.nullable()`. */
31
+ schema: DocumentSchema<T>;
32
+ /** Zero-based page indexes to read: `[0]` is the first page. Omit to read every page. Ignored for images. Billing is per page processed, so a narrower selection costs less. */
33
+ pages?: number[];
34
+ /** Conversation this document arrived in */
35
+ sessionId?: string;
36
+ /** Ties the extraction to one tool call */
37
+ correlationId?: string;
38
+ }
39
+ /** Read a document the platform has never seen, by fetching it. */
40
+ interface DocumentExtractUrlInput<T> extends DocumentExtractCommon<T> {
41
+ /** A publicly fetchable URL; private and loopback addresses are refused */
42
+ url: string;
43
+ /** Name of the file, used to refuse an unsupported type before fetching it */
44
+ filename: string;
45
+ documentId?: never;
46
+ }
47
+ /** Read a document the platform already holds, uploaded by a visitor through the chat widget. */
48
+ interface DocumentExtractStoredInput<T> extends DocumentExtractCommon<T> {
49
+ /** From `context.waniwani.attachedDocuments`, or `readAttachedDocuments()` on your own chat route. The platform kept the filename, so there is none to pass. */
50
+ documentId: string;
51
+ }
52
+ type DocumentExtractInput<T> = DocumentExtractUrlInput<T> | DocumentExtractStoredInput<T>;
53
+ interface DocumentsClient {
54
+ /** Read one document and get its contents shaped by `schema`. Accepts PDF, PNG, JPEG, TIFF, BMP, GIF and WEBP up to 50 MB. */
55
+ extract<T>(input: DocumentExtractInput<T>): Promise<DocumentExtractResult<T>>;
56
+ }
57
+
58
+ interface TrackingConfig {
59
+ /** Events API V2 endpoint path. */
60
+ endpointPath?: string;
61
+ /** Periodic flush interval for buffered events. */
62
+ flushIntervalMs?: number;
63
+ /** Max events per HTTP batch send. */
64
+ maxBatchSize?: number;
65
+ /** Max in-memory buffer size before oldest items are dropped. */
66
+ maxBufferSize?: number;
67
+ /** Number of retries for retryable failures. */
68
+ maxRetries?: number;
69
+ /** Retry backoff base delay. */
70
+ retryBaseDelayMs?: number;
71
+ /** Retry backoff max delay. */
72
+ retryMaxDelayMs?: number;
73
+ /** Default shutdown timeout when none is provided. */
74
+ shutdownTimeoutMs?: number;
75
+ }
76
+
77
+ interface InternalConfig {
78
+ apiUrl: string;
79
+ apiKey: string | undefined;
80
+ tracking: Required<TrackingConfig>;
81
+ }
82
+
83
+ declare function createDocumentsClient(config: Pick<InternalConfig, "apiUrl" | "apiKey">): DocumentsClient;
84
+
85
+ /**
86
+ * The documents a visitor attached on the latest user turn, for a chat route you
87
+ * run yourself. Pass the parsed request body: the widget sends them in a
88
+ * top-level `documents` field, outside `messages`, so the bytes stay out of the
89
+ * transcript that is reposted on every later turn.
90
+ *
91
+ * ```ts
92
+ * const body = await request.json();
93
+ * for (const { documentId } of readAttachedDocuments(body)) {
94
+ * const { fields } = await wani.documents.extract({ documentId, schema });
95
+ * }
96
+ * ```
97
+ *
98
+ * Also accepts the `documents` array alone, or a `messages` array whose latest
99
+ * user message carries the ids in its parts. Unparseable input yields an empty
100
+ * array; repeated ids collapse to one.
101
+ */
102
+ declare function readAttachedDocuments(input: unknown): AttachedDocument[];
103
+
104
+ export { type AttachedDocument, type DocumentExtractInput, type DocumentExtractResult, type DocumentExtractStoredInput, type DocumentExtractUrlInput, type DocumentSchema, type DocumentsClient, createDocumentsClient, readAttachedDocuments };
@@ -0,0 +1,2 @@
1
+ var a=class extends Error{constructor(e,o){super(e);this.status=o;this.name="WaniWaniError"}};var E="@waniwani/sdk",h="/api/mcp/modules/documents/extract";function g(t,n){try{let e=JSON.parse(t);if(e!==null&&typeof e=="object"){let o="message"in e&&typeof e.message=="string"?e.message:"",r="detail"in e&&typeof e.detail=="string"?e.detail:"";if(o&&r)return`${o}: ${r}`;if(o)return o;if(r)return r}}catch{}return t||`Documents API error: HTTP ${n}`}function A(t){return"documentId"in t&&typeof t.documentId=="string"}function x(t){return A(t)?{documentId:t.documentId}:{url:t.url,filename:t.filename}}function w(t){let{apiUrl:n,apiKey:e}=t;return{async extract(o){if(!e)throw new Error("WANIWANI_API_KEY is not set");let{toJSONSchema:r}=await import("zod"),s=await fetch(`${n.replace(/\/$/,"")}${h}`,{method:"POST",headers:{Authorization:`Bearer ${e}`,"Content-Type":"application/json","X-WaniWani-SDK":E},body:JSON.stringify({...x(o),schema:r(o.schema),pages:o.pages,sessionId:o.sessionId,correlationId:o.correlationId})});if(!s.ok){let I=await s.text().catch(()=>"");throw new a(g(I,s.status),s.status)}let f=await s.json(),{fields:p,pageCount:l,pageConfidence:D,documentId:y}=f.data;return{fields:o.schema.parse(p),pageCount:l,pageConfidence:D??null,documentId:y}}}}var T=["documentId","document_id"],S=["filename","file_name","fileName","name"],k=["mediaType","media_type","mimeType","mime_type","contentType","content_type"],_="document",N="application/octet-stream";function c(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function d(t,n){for(let e of n){let o=t[e];if(typeof o=="string"&&o.length>0)return o}}function C(t){if(!c(t))return;let n=d(t,T);if(n)return{documentId:n,filename:d(t,S)??_,mediaType:d(t,k)??N}}function m(t){let n=[],e=new Set;for(let o of Array.isArray(t)?t:[t]){let r=C(o);r&&!e.has(r.documentId)&&(e.add(r.documentId),n.push(r))}return n}function M(t){if(!Array.isArray(t))return[];let n=[...t].reverse().find(e=>c(e)&&e.role==="user");return!c(n)||!Array.isArray(n.parts)?[]:m(n.parts.flatMap(e=>c(e)&&c(e.data)?[e,e.data]:[e]))}function R(t){let n=c(t)?t:void 0,e=m(n?n.documents:t);return e.length>0?e:M(n?n.messages:t)}export{w as createDocumentsClient,R as readAttachedDocuments};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/error.ts","../../src/documents/client.ts","../../src/documents/messages.ts"],"sourcesContent":["// Waniwani SDK - Errors\n\nexport class WaniWaniError extends Error {\n\tconstructor(\n\t\tmessage: string,\n\t\tpublic status: number,\n\t) {\n\t\tsuper(message);\n\t\tthis.name = \"WaniWaniError\";\n\t}\n}\n","import { WaniWaniError } from \"../error.js\";\nimport type { InternalConfig } from \"../types.js\";\nimport type {\n\tDocumentExtractInput,\n\tDocumentExtractResult,\n\tDocumentExtractStoredInput,\n\tDocumentSchema,\n\tDocumentsClient,\n} from \"./types.js\";\n\nconst SDK_NAME = \"@waniwani/sdk\";\nconst EXTRACT_PATH = \"/api/mcp/modules/documents/extract\";\n\n/** Method syntax makes the parameter bivariant, so a structural schema is accepted without an assertion. */\ninterface ZodModule {\n\ttoJSONSchema(schema: DocumentSchema<unknown>): Record<string, unknown>;\n}\n\ninterface ExtractWireResponse {\n\tfields: unknown;\n\tpageCount: number;\n\tpageConfidence: number | null;\n\tdocumentId: string;\n}\n\n/**\n * The platform puts the machine-readable code on `message` and the human reason\n * on `detail`, so a refusal reads as \"UNSUPPORTED_DOCUMENT_TYPE: photo.heic is\n * not one of ...\". The raw body is the fallback.\n */\nfunction refusalMessage(body: string, status: number): string {\n\ttry {\n\t\tconst parsed: unknown = JSON.parse(body);\n\t\tif (parsed !== null && typeof parsed === \"object\") {\n\t\t\tconst code =\n\t\t\t\t\"message\" in parsed && typeof parsed.message === \"string\"\n\t\t\t\t\t? parsed.message\n\t\t\t\t\t: \"\";\n\t\t\tconst detail =\n\t\t\t\t\"detail\" in parsed && typeof parsed.detail === \"string\"\n\t\t\t\t\t? parsed.detail\n\t\t\t\t\t: \"\";\n\t\t\tif (code && detail) {\n\t\t\t\treturn `${code}: ${detail}`;\n\t\t\t}\n\t\t\tif (code) {\n\t\t\t\treturn code;\n\t\t\t}\n\t\t\tif (detail) {\n\t\t\t\treturn detail;\n\t\t\t}\n\t\t}\n\t} catch {\n\t\t// A non-JSON body is surfaced as-is below.\n\t}\n\treturn body || `Documents API error: HTTP ${status}`;\n}\n\nfunction isStoredInput<T>(\n\tinput: DocumentExtractInput<T>,\n): input is DocumentExtractStoredInput<T> {\n\treturn \"documentId\" in input && typeof input.documentId === \"string\";\n}\n\n/** The platform's body is a union, so each branch's fields must travel alone. */\nfunction sourceFields<T>(\n\tinput: DocumentExtractInput<T>,\n): Record<string, string> {\n\tif (isStoredInput(input)) {\n\t\treturn { documentId: input.documentId };\n\t}\n\treturn { url: input.url, filename: input.filename };\n}\n\nexport function createDocumentsClient(\n\tconfig: Pick<InternalConfig, \"apiUrl\" | \"apiKey\">,\n): DocumentsClient {\n\tconst { apiUrl, apiKey } = config;\n\n\treturn {\n\t\tasync extract<T>(\n\t\t\tinput: DocumentExtractInput<T>,\n\t\t): Promise<DocumentExtractResult<T>> {\n\t\t\tif (!apiKey) {\n\t\t\t\tthrow new Error(\"WANIWANI_API_KEY is not set\");\n\t\t\t}\n\n\t\t\t// zod is an optional peer dependency and this module is reachable from the\n\t\t\t// package root, so a top-level import would break every consumer that only\n\t\t\t// uses tracking.\n\t\t\tconst { toJSONSchema }: ZodModule = await import(\"zod\");\n\n\t\t\tconst response = await fetch(\n\t\t\t\t`${apiUrl.replace(/\\/$/, \"\")}${EXTRACT_PATH}`,\n\t\t\t\t{\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\theaders: {\n\t\t\t\t\t\tAuthorization: `Bearer ${apiKey}`,\n\t\t\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\t\t\"X-WaniWani-SDK\": SDK_NAME,\n\t\t\t\t\t},\n\t\t\t\t\tbody: JSON.stringify({\n\t\t\t\t\t\t...sourceFields(input),\n\t\t\t\t\t\tschema: toJSONSchema(input.schema),\n\t\t\t\t\t\tpages: input.pages,\n\t\t\t\t\t\tsessionId: input.sessionId,\n\t\t\t\t\t\tcorrelationId: input.correlationId,\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t);\n\n\t\t\tif (!response.ok) {\n\t\t\t\tconst text = await response.text().catch(() => \"\");\n\t\t\t\tthrow new WaniWaniError(\n\t\t\t\t\trefusalMessage(text, response.status),\n\t\t\t\t\tresponse.status,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst json = (await response.json()) as { data: ExtractWireResponse };\n\t\t\tconst { fields, pageCount, pageConfidence, documentId } = json.data;\n\n\t\t\treturn {\n\t\t\t\tfields: input.schema.parse(fields),\n\t\t\t\tpageCount,\n\t\t\t\tpageConfidence: pageConfidence ?? null,\n\t\t\t\tdocumentId,\n\t\t\t};\n\t\t},\n\t};\n}\n","import type { AttachedDocument } from \"./types.js\";\n\nconst DOCUMENT_ID_KEYS = [\"documentId\", \"document_id\"] as const;\nconst FILENAME_KEYS = [\"filename\", \"file_name\", \"fileName\", \"name\"] as const;\nconst MEDIA_TYPE_KEYS = [\n\t\"mediaType\",\n\t\"media_type\",\n\t\"mimeType\",\n\t\"mime_type\",\n\t\"contentType\",\n\t\"content_type\",\n] as const;\n\nconst UNNAMED_FILENAME = \"document\";\nconst UNKNOWN_MEDIA_TYPE = \"application/octet-stream\";\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction pickFirst(\n\tsource: Record<string, unknown>,\n\tkeys: readonly string[],\n): string | undefined {\n\tfor (const key of keys) {\n\t\tconst value = source[key];\n\t\tif (typeof value === \"string\" && value.length > 0) {\n\t\t\treturn value;\n\t\t}\n\t}\n\treturn undefined;\n}\n\n/** Only the id is load-bearing: it is what `extract()` needs, so an entry missing the descriptive two is still usable. */\nfunction toAttachedDocument(entry: unknown): AttachedDocument | undefined {\n\tif (!isRecord(entry)) {\n\t\treturn undefined;\n\t}\n\n\tconst documentId = pickFirst(entry, DOCUMENT_ID_KEYS);\n\tif (!documentId) {\n\t\treturn undefined;\n\t}\n\n\treturn {\n\t\tdocumentId,\n\t\tfilename: pickFirst(entry, FILENAME_KEYS) ?? UNNAMED_FILENAME,\n\t\tmediaType: pickFirst(entry, MEDIA_TYPE_KEYS) ?? UNKNOWN_MEDIA_TYPE,\n\t};\n}\n\nfunction collect(candidate: unknown): AttachedDocument[] {\n\tconst documents: AttachedDocument[] = [];\n\tconst seen = new Set<string>();\n\n\tfor (const entry of Array.isArray(candidate) ? candidate : [candidate]) {\n\t\tconst document = toAttachedDocument(entry);\n\t\tif (document && !seen.has(document.documentId)) {\n\t\t\tseen.add(document.documentId);\n\t\t\tdocuments.push(document);\n\t\t}\n\t}\n\n\treturn documents;\n}\n\nfunction fromLatestUserTurn(messages: unknown): AttachedDocument[] {\n\tif (!Array.isArray(messages)) {\n\t\treturn [];\n\t}\n\n\tconst latest = [...messages]\n\t\t.reverse()\n\t\t.find((message) => isRecord(message) && message.role === \"user\");\n\tif (!isRecord(latest) || !Array.isArray(latest.parts)) {\n\t\treturn [];\n\t}\n\n\treturn collect(\n\t\tlatest.parts.flatMap((part: unknown) =>\n\t\t\tisRecord(part) && isRecord(part.data) ? [part, part.data] : [part],\n\t\t),\n\t);\n}\n\n/**\n * The documents a visitor attached on the latest user turn, for a chat route you\n * run yourself. Pass the parsed request body: the widget sends them in a\n * top-level `documents` field, outside `messages`, so the bytes stay out of the\n * transcript that is reposted on every later turn.\n *\n * ```ts\n * const body = await request.json();\n * for (const { documentId } of readAttachedDocuments(body)) {\n * const { fields } = await wani.documents.extract({ documentId, schema });\n * }\n * ```\n *\n * Also accepts the `documents` array alone, or a `messages` array whose latest\n * user message carries the ids in its parts. Unparseable input yields an empty\n * array; repeated ids collapse to one.\n */\nexport function readAttachedDocuments(input: unknown): AttachedDocument[] {\n\tconst body = isRecord(input) ? input : undefined;\n\n\tconst declared = collect(body ? body.documents : input);\n\tif (declared.length > 0) {\n\t\treturn declared;\n\t}\n\n\treturn fromLatestUserTurn(body ? body.messages : input);\n}\n"],"mappings":"AAEO,IAAMA,EAAN,cAA4B,KAAM,CACxC,YACCC,EACOC,EACN,CACD,MAAMD,CAAO,EAFN,YAAAC,EAGP,KAAK,KAAO,eACb,CACD,ECAA,IAAMC,EAAW,gBACXC,EAAe,qCAmBrB,SAASC,EAAeC,EAAcC,EAAwB,CAC7D,GAAI,CACH,IAAMC,EAAkB,KAAK,MAAMF,CAAI,EACvC,GAAIE,IAAW,MAAQ,OAAOA,GAAW,SAAU,CAClD,IAAMC,EACL,YAAaD,GAAU,OAAOA,EAAO,SAAY,SAC9CA,EAAO,QACP,GACEE,EACL,WAAYF,GAAU,OAAOA,EAAO,QAAW,SAC5CA,EAAO,OACP,GACJ,GAAIC,GAAQC,EACX,MAAO,GAAGD,CAAI,KAAKC,CAAM,GAE1B,GAAID,EACH,OAAOA,EAER,GAAIC,EACH,OAAOA,CAET,CACD,MAAQ,CAER,CACA,OAAOJ,GAAQ,6BAA6BC,CAAM,EACnD,CAEA,SAASI,EACRC,EACyC,CACzC,MAAO,eAAgBA,GAAS,OAAOA,EAAM,YAAe,QAC7D,CAGA,SAASC,EACRD,EACyB,CACzB,OAAID,EAAcC,CAAK,EACf,CAAE,WAAYA,EAAM,UAAW,EAEhC,CAAE,IAAKA,EAAM,IAAK,SAAUA,EAAM,QAAS,CACnD,CAEO,SAASE,EACfC,EACkB,CAClB,GAAM,CAAE,OAAAC,EAAQ,OAAAC,CAAO,EAAIF,EAE3B,MAAO,CACN,MAAM,QACLH,EACoC,CACpC,GAAI,CAACK,EACJ,MAAM,IAAI,MAAM,6BAA6B,EAM9C,GAAM,CAAE,aAAAC,CAAa,EAAe,KAAM,QAAO,KAAK,EAEhDC,EAAW,MAAM,MACtB,GAAGH,EAAO,QAAQ,MAAO,EAAE,CAAC,GAAGZ,CAAY,GAC3C,CACC,OAAQ,OACR,QAAS,CACR,cAAe,UAAUa,CAAM,GAC/B,eAAgB,mBAChB,iBAAkBd,CACnB,EACA,KAAM,KAAK,UAAU,CACpB,GAAGU,EAAaD,CAAK,EACrB,OAAQM,EAAaN,EAAM,MAAM,EACjC,MAAOA,EAAM,MACb,UAAWA,EAAM,UACjB,cAAeA,EAAM,aACtB,CAAC,CACF,CACD,EAEA,GAAI,CAACO,EAAS,GAAI,CACjB,IAAMC,EAAO,MAAMD,EAAS,KAAK,EAAE,MAAM,IAAM,EAAE,EACjD,MAAM,IAAIE,EACThB,EAAee,EAAMD,EAAS,MAAM,EACpCA,EAAS,MACV,CACD,CAEA,IAAMG,EAAQ,MAAMH,EAAS,KAAK,EAC5B,CAAE,OAAAI,EAAQ,UAAAC,EAAW,eAAAC,EAAgB,WAAAC,CAAW,EAAIJ,EAAK,KAE/D,MAAO,CACN,OAAQV,EAAM,OAAO,MAAMW,CAAM,EACjC,UAAAC,EACA,eAAgBC,GAAkB,KAClC,WAAAC,CACD,CACD,CACD,CACD,CChIA,IAAMC,EAAmB,CAAC,aAAc,aAAa,EAC/CC,EAAgB,CAAC,WAAY,YAAa,WAAY,MAAM,EAC5DC,EAAkB,CACvB,YACA,aACA,WACA,YACA,cACA,cACD,EAEMC,EAAmB,WACnBC,EAAqB,2BAE3B,SAASC,EAASC,EAAkD,CACnE,OAAO,OAAOA,GAAU,UAAYA,IAAU,MAAQ,CAAC,MAAM,QAAQA,CAAK,CAC3E,CAEA,SAASC,EACRC,EACAC,EACqB,CACrB,QAAWC,KAAOD,EAAM,CACvB,IAAMH,EAAQE,EAAOE,CAAG,EACxB,GAAI,OAAOJ,GAAU,UAAYA,EAAM,OAAS,EAC/C,OAAOA,CAET,CAED,CAGA,SAASK,EAAmBC,EAA8C,CACzE,GAAI,CAACP,EAASO,CAAK,EAClB,OAGD,IAAMC,EAAaN,EAAUK,EAAOZ,CAAgB,EACpD,GAAKa,EAIL,MAAO,CACN,WAAAA,EACA,SAAUN,EAAUK,EAAOX,CAAa,GAAKE,EAC7C,UAAWI,EAAUK,EAAOV,CAAe,GAAKE,CACjD,CACD,CAEA,SAASU,EAAQC,EAAwC,CACxD,IAAMC,EAAgC,CAAC,EACjCC,EAAO,IAAI,IAEjB,QAAWL,KAAS,MAAM,QAAQG,CAAS,EAAIA,EAAY,CAACA,CAAS,EAAG,CACvE,IAAMG,EAAWP,EAAmBC,CAAK,EACrCM,GAAY,CAACD,EAAK,IAAIC,EAAS,UAAU,IAC5CD,EAAK,IAAIC,EAAS,UAAU,EAC5BF,EAAU,KAAKE,CAAQ,EAEzB,CAEA,OAAOF,CACR,CAEA,SAASG,EAAmBC,EAAuC,CAClE,GAAI,CAAC,MAAM,QAAQA,CAAQ,EAC1B,MAAO,CAAC,EAGT,IAAMC,EAAS,CAAC,GAAGD,CAAQ,EACzB,QAAQ,EACR,KAAME,GAAYjB,EAASiB,CAAO,GAAKA,EAAQ,OAAS,MAAM,EAChE,MAAI,CAACjB,EAASgB,CAAM,GAAK,CAAC,MAAM,QAAQA,EAAO,KAAK,EAC5C,CAAC,EAGFP,EACNO,EAAO,MAAM,QAASE,GACrBlB,EAASkB,CAAI,GAAKlB,EAASkB,EAAK,IAAI,EAAI,CAACA,EAAMA,EAAK,IAAI,EAAI,CAACA,CAAI,CAClE,CACD,CACD,CAmBO,SAASC,EAAsBC,EAAoC,CACzE,IAAMC,EAAOrB,EAASoB,CAAK,EAAIA,EAAQ,OAEjCE,EAAWb,EAAQY,EAAOA,EAAK,UAAYD,CAAK,EACtD,OAAIE,EAAS,OAAS,EACdA,EAGDR,EAAmBO,EAAOA,EAAK,SAAWD,CAAK,CACvD","names":["WaniWaniError","message","status","SDK_NAME","EXTRACT_PATH","refusalMessage","body","status","parsed","code","detail","isStoredInput","input","sourceFields","createDocumentsClient","config","apiUrl","apiKey","toJSONSchema","response","text","WaniWaniError","json","fields","pageCount","pageConfidence","documentId","DOCUMENT_ID_KEYS","FILENAME_KEYS","MEDIA_TYPE_KEYS","UNNAMED_FILENAME","UNKNOWN_MEDIA_TYPE","isRecord","value","pickFirst","source","keys","key","toAttachedDocument","entry","documentId","collect","candidate","documents","seen","document","fromLatestUserTurn","messages","latest","message","part","readAttachedDocuments","input","body","declared"]}
package/dist/index.d.ts CHANGED
@@ -1,3 +1,79 @@
1
+ /**
2
+ * Structural stand-in for a Zod schema, so the package root's type graph does
3
+ * not reference `zod`, an optional peer. Pass a real Zod schema: `extract()`
4
+ * converts it with `z.toJSONSchema()`, which no other `parse`-shaped object
5
+ * survives.
6
+ */
7
+ interface DocumentSchema<T> {
8
+ parse(value: unknown): T;
9
+ }
10
+ interface DocumentExtractResult<T> {
11
+ /** The document's contents, parsed with the schema you passed. A null field is one the document did not legibly answer. */
12
+ fields: T;
13
+ /** Pages the vendor processed and billed */
14
+ pageCount: number;
15
+ /** Mean per-page OCR confidence, null when none was reported */
16
+ pageConfidence: number | null;
17
+ /** Handle for this extraction, valid for the 7-day retention window */
18
+ documentId: string;
19
+ }
20
+ /** A document the visitor uploaded through the chat widget, already stored by the platform. */
21
+ interface AttachedDocument {
22
+ /** Pass to `documents.extract({ documentId, schema })` to read it. */
23
+ documentId: string;
24
+ /** Name the visitor's file had */
25
+ filename: string;
26
+ /** MIME type the browser declared on upload */
27
+ mediaType: string;
28
+ }
29
+ interface DocumentExtractCommon<T> {
30
+ /** The shape to return. Extraction runs in strict mode, so mark anything a document may not answer `.nullable()`. */
31
+ schema: DocumentSchema<T>;
32
+ /** Zero-based page indexes to read: `[0]` is the first page. Omit to read every page. Ignored for images. Billing is per page processed, so a narrower selection costs less. */
33
+ pages?: number[];
34
+ /** Conversation this document arrived in */
35
+ sessionId?: string;
36
+ /** Ties the extraction to one tool call */
37
+ correlationId?: string;
38
+ }
39
+ /** Read a document the platform has never seen, by fetching it. */
40
+ interface DocumentExtractUrlInput<T> extends DocumentExtractCommon<T> {
41
+ /** A publicly fetchable URL; private and loopback addresses are refused */
42
+ url: string;
43
+ /** Name of the file, used to refuse an unsupported type before fetching it */
44
+ filename: string;
45
+ documentId?: never;
46
+ }
47
+ /** Read a document the platform already holds, uploaded by a visitor through the chat widget. */
48
+ interface DocumentExtractStoredInput<T> extends DocumentExtractCommon<T> {
49
+ /** From `context.waniwani.attachedDocuments`, or `readAttachedDocuments()` on your own chat route. The platform kept the filename, so there is none to pass. */
50
+ documentId: string;
51
+ }
52
+ type DocumentExtractInput<T> = DocumentExtractUrlInput<T> | DocumentExtractStoredInput<T>;
53
+ interface DocumentsClient {
54
+ /** Read one document and get its contents shaped by `schema`. Accepts PDF, PNG, JPEG, TIFF, BMP, GIF and WEBP up to 50 MB. */
55
+ extract<T>(input: DocumentExtractInput<T>): Promise<DocumentExtractResult<T>>;
56
+ }
57
+
58
+ /**
59
+ * The documents a visitor attached on the latest user turn, for a chat route you
60
+ * run yourself. Pass the parsed request body: the widget sends them in a
61
+ * top-level `documents` field, outside `messages`, so the bytes stay out of the
62
+ * transcript that is reposted on every later turn.
63
+ *
64
+ * ```ts
65
+ * const body = await request.json();
66
+ * for (const { documentId } of readAttachedDocuments(body)) {
67
+ * const { fields } = await wani.documents.extract({ documentId, schema });
68
+ * }
69
+ * ```
70
+ *
71
+ * Also accepts the `documents` array alone, or a `messages` array whose latest
72
+ * user message carries the ids in its parts. Unparseable input yields an empty
73
+ * array; repeated ids collapse to one.
74
+ */
75
+ declare function readAttachedDocuments(input: unknown): AttachedDocument[];
76
+
1
77
  declare class WaniWaniError extends Error {
2
78
  status: number;
3
79
  constructor(message: string, status: number);
@@ -491,6 +567,8 @@ interface WaniWaniClient extends TrackingClient {
491
567
  readonly _config: InternalConfig;
492
568
  /** Knowledge base client for ingestion, search, and source listing */
493
569
  readonly kb: KbClient;
570
+ /** Documents client for reading a file into typed fields */
571
+ readonly documents: DocumentsClient;
494
572
  }
495
573
  interface InternalConfig {
496
574
  apiUrl: string;
@@ -561,4 +639,4 @@ interface V2BatchResponse {
561
639
  */
562
640
  declare function waniwani(config?: WaniWaniConfig | WaniWaniProjectConfig): WaniWaniClient;
563
641
 
564
- export { type ComparedPriceOption, type ConvertedProperties, ERROR_CAUSES, EVENT_TYPES, type ErrorCauseType, type EventType, type FrontendClientOptions, type FrontendIdentity, type FrontendTrackingClient, type KbClient, type KbIngestFile, type KbIngestResult, type KbSearchOptions, type KbSource, type LeadQualifiedProperties, type LegacyTrackEvent, type LinkClickedProperties, type OptionSelectedProperties, type PriceShownProperties, type PricesComparedProperties, type RevenueConvertedInput, type RevenueLeadQualifiedInput, type RevenueOptionSelectedInput, type RevenuePriceShownInput, type RevenuePricesComparedInput, type RevenueTrackingApi, SESSION_ERROR_CODES, type SessionErrorCodeType, type SessionErrorProperties, type ToolCalledProperties, type TrackEvent, type TrackFn, type TrackInput, type TrackingConfig, type TrackingShutdownOptions, type TrackingShutdownResult, type V2BatchRejectedEvent, type V2BatchRequest, type V2BatchResponse, type V2CorrelationIds, type V2EnvelopeType, type V2EventEnvelope, type WaniWaniClient, type WaniWaniConfig, WaniWaniError, type WaniWaniProjectConfig, createFrontendClient, defineConfig, waniwani };
642
+ export { type AttachedDocument, type ComparedPriceOption, type ConvertedProperties, type DocumentExtractInput, type DocumentExtractResult, type DocumentExtractStoredInput, type DocumentExtractUrlInput, type DocumentSchema, type DocumentsClient, ERROR_CAUSES, EVENT_TYPES, type ErrorCauseType, type EventType, type FrontendClientOptions, type FrontendIdentity, type FrontendTrackingClient, type KbClient, type KbIngestFile, type KbIngestResult, type KbSearchOptions, type KbSource, type LeadQualifiedProperties, type LegacyTrackEvent, type LinkClickedProperties, type OptionSelectedProperties, type PriceShownProperties, type PricesComparedProperties, type RevenueConvertedInput, type RevenueLeadQualifiedInput, type RevenueOptionSelectedInput, type RevenuePriceShownInput, type RevenuePricesComparedInput, type RevenueTrackingApi, SESSION_ERROR_CODES, type SessionErrorCodeType, type SessionErrorProperties, type ToolCalledProperties, type TrackEvent, type TrackFn, type TrackInput, type TrackingConfig, type TrackingShutdownOptions, type TrackingShutdownResult, type V2BatchRejectedEvent, type V2BatchRequest, type V2BatchResponse, type V2CorrelationIds, type V2EnvelopeType, type V2EventEnvelope, type WaniWaniClient, type WaniWaniConfig, WaniWaniError, type WaniWaniProjectConfig, createFrontendClient, defineConfig, readAttachedDocuments, waniwani };
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- var y=class extends Error{constructor(n,r){super(n);this.status=r;this.name="WaniWaniError"}};import{existsSync as $,readFileSync as H}from"fs";import{resolve as G}from"path";var X="waniwani.json",m;function _(){if(m!==void 0)return m;try{let e=G(process.cwd(),X);if(!$(e))return m=null,null;let t=H(e,"utf-8");return m=JSON.parse(t),m}catch{return m=null,null}}var C="__waniwani_config__";function Q(e){return globalThis[C]=e,e}function b(){return globalThis[C]}var P=["session.started","page.viewed","tool.called","link.clicked","widget_render","user.identified","price_shown","prices_compared","option_selected","lead_qualified","converted","session.error"],M=["agent_failed","tool_failed","upstream_failed"],O=["timeout","rate_limited","upstream_4xx","upstream_5xx","network","invalid_output","flow_dead_end","flow_unknown_node","flow_loop","unknown"];function v(e,t){for(let n of t){let r=e[n];if(typeof r=="string"&&r.length>0)return r}}var J=["waniwani/sessionId","openai/sessionId","openai/session","sessionId","conversationId","mcp-session-id"],Z=["waniwani/requestId","openai/requestId","requestId","mcp/requestId"],ee=["waniwani/traceId","openai/traceId","traceId","mcp/traceId","openai/requestId","requestId"],te=["waniwani/userId","openai/userId","externalUserId","userId","actorId"],ne=["waniwani/visitorId","visitorId"],re=["correlationId","openai/requestId"];function A(e){return e?v(e,J):void 0}function B(e){return e?v(e,Z):void 0}function F(e){return e?v(e,ee):void 0}function D(e){return e?v(e,te):void 0}function U(e){return e?v(e,ne):void 0}function L(e){return e?v(e,re):void 0}var ie=[{key:"openai/sessionId",source:"chatgpt"},{key:"openai/session",source:"chatgpt"}],se=[{needle:"claude",source:"claude"},{needle:"chatgpt",source:"chatgpt"},{needle:"openai",source:"chatgpt"},{needle:"gemini",source:"gemini"}];function W(e,t){if(e){let r=e["waniwani/source"];if(typeof r=="string"&&r.length>0)return r;for(let{key:i,source:s}of ie){let a=e[i];if(typeof a=="string"&&a.length>0)return s}}let n=t?.name;if(typeof n=="string"&&n.length>0){let r=n.toLowerCase();for(let{needle:i,source:s}of se)if(r.includes(i))return s}}var oe="@waniwani/sdk";function T(e,t={}){let n=t.now??(()=>new Date),r=t.generateId??K,i=ue(e),s=I(e.meta),a=I(e.metadata),o=de(e,s),c=h(e.eventId)??r(),g=pe(e.timestamp,n),d=h(e.source)??W(s)??t.source??oe,u=x(e)?{...e}:void 0,f={...a};return Object.keys(s).length>0&&(f.meta=s),u&&(f.rawLegacy=u),{id:c,type:"mcp.event",name:i,source:d,timestamp:g,correlation:o,properties:ae(e,i),metadata:f,rawLegacy:u}}function K(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?`evt_${crypto.randomUUID()}`:`evt_${Math.random().toString(36).slice(2,10)}_${Date.now().toString(36)}`}function ae(e,t){if(!x(e))return I(e.properties);let n=ce(e,t),r=I(e.properties);return{...n,...r}}function ce(e,t){switch(t){case"tool.called":{let n={};return h(e.toolName)&&(n.name=e.toolName),h(e.toolType)&&(n.type=e.toolType),n}case"link.clicked":{let n={};return h(e.linkUrl)&&(n.url=e.linkUrl),n}default:return{}}}function ue(e){return x(e)?e.eventType:e.event}function de(e,t){let n=h(e.requestId)??B(t),r=h(e.sessionId)??A(t),i=h(e.traceId)??F(t),s=h(e.externalUserId)??D(t),a=h(e.visitorId)??U(t),o=h(e.correlationId)??L(t)??n,c={};return r&&(c.sessionId=r),i&&(c.traceId=i),n&&(c.requestId=n),o&&(c.correlationId=o),s&&(c.externalUserId=s),a&&(c.visitorId=a),c}function pe(e,t){if(e instanceof Date)return e.toISOString();if(typeof e=="string"){let n=new Date(e);if(!Number.isNaN(n.getTime()))return n.toISOString()}return t().toISOString()}function I(e){return!e||typeof e!="object"||Array.isArray(e)?{}:e}function h(e){if(typeof e=="string"&&e.trim().length!==0)return e}function x(e){return"eventType"in e}function E(e){return{priceShown:({amount:t,currency:n,itemId:r,label:i,...s})=>e({event:"price_shown",properties:{amount:t,currency:n,itemId:r,label:i},...s}),pricesCompared:({options:t,...n})=>e({event:"prices_compared",properties:{options:t},...n}),optionSelected:({id:t,amount:n,currency:r,...i})=>e({event:"option_selected",properties:{id:t,amount:n,currency:r},...i}),leadQualified:t=>{let{externalId:n,email:r,name:i,...s}=t??{};return e({event:"lead_qualified",properties:{externalId:n,email:r,name:i},...s})},converted:({amount:t,currency:n,occurredAt:r,...i})=>e({event:"converted",properties:{amount:t,currency:n,occurredAt:r},...i})}}var le="/api/mcp/events/v2/batch";var V="@waniwani/sdk";var fe=new Set([401,403]),he=new Set([408,425,429,500,502,503,504]),ge=(e,t)=>globalThis.fetch(e,t);function S(e){return new R(e)}var R=class{endpointUrl;flushIntervalMs;maxBatchSize;maxBufferSize;maxRetries;retryBaseDelayMs;retryMaxDelayMs;shutdownTimeoutMs;sdkVersion;fetchFn;logger;now;sleep;apiKey;buffer=[];flushTimer;flushScheduled=!1;flushScheduledTimer;flushInFlight;inFlightCount=0;isStopped=!1;isShuttingDown=!1;constructor(t){this.endpointUrl=Te(t.apiUrl,t.endpointPath??le),this.flushIntervalMs=t.flushIntervalMs??1e3,this.maxBatchSize=t.maxBatchSize??20,this.maxBufferSize=t.maxBufferSize??1e3,this.maxRetries=t.maxRetries??3,this.retryBaseDelayMs=t.retryBaseDelayMs??200,this.retryMaxDelayMs=t.retryMaxDelayMs??2e3,this.shutdownTimeoutMs=t.shutdownTimeoutMs??2e3,this.fetchFn=t.fetchFn??ge,this.logger=t.logger??console,this.now=t.now??(()=>new Date),this.sleep=t.sleep??(n=>new Promise(r=>setTimeout(r,n))),this.apiKey=t.apiKey,this.sdkVersion=t.sdkVersion,this.flushIntervalMs>0&&(this.flushTimer=setInterval(()=>{this.flush()},this.flushIntervalMs)),this.registerBrowserTeardown()}enqueue(t){if(this.isStopped||this.isShuttingDown){this.logger.warn("[Waniwani] Tracking transport is stopped, dropping event %s",t.id);return}if(this.buffer.length>=this.maxBufferSize){let n=this.buffer.length-this.maxBufferSize+1;this.buffer.splice(0,n),this.logger.warn("[Waniwani] Tracking buffer overflow, dropped %d oldest event(s)",n)}if(this.buffer.push(t),this.buffer.length>=this.maxBatchSize){this.flush();return}this.scheduleMicroFlush()}pendingEvents(){return this.buffer.length+this.inFlightCount}async flush(){return this.flushInFlight?this.flushInFlight:(this.flushInFlight=this.flushLoop().finally(()=>{this.flushInFlight=void 0}),this.flushInFlight)}async shutdown(t){this.isShuttingDown=!0,this.flushTimer&&(clearInterval(this.flushTimer),this.flushTimer=void 0),this.flushScheduledTimer&&(clearTimeout(this.flushScheduledTimer),this.flushScheduledTimer=void 0,this.flushScheduled=!1);let n=t?.timeoutMs??this.shutdownTimeoutMs,r=this.flush();if(!Number.isFinite(n)||n<=0)return await r,this.isStopped=!0,{timedOut:!1,pendingEvents:this.pendingEvents()};let i=Symbol("shutdown-timeout");return await Promise.race([r.then(()=>"flushed"),this.sleep(n).then(()=>i)])===i?(this.isStopped=!0,{timedOut:!0,pendingEvents:this.pendingEvents()}):(this.isStopped=!0,{timedOut:!1,pendingEvents:this.pendingEvents()})}registerBrowserTeardown(){if(typeof document>"u"||typeof window>"u")return;let t=()=>{document.visibilityState==="hidden"&&this.keepaliveFlush()};document.addEventListener("visibilitychange",t),window.addEventListener("pagehide",()=>this.keepaliveFlush())}keepaliveFlush(){if(this.isStopped||this.buffer.length===0)return;let t=this.buffer.splice(0,this.buffer.length);this.sendKeepaliveChunk(t)}sendKeepaliveChunk(t){let n=JSON.stringify(this.makeBatchRequest(t));if(n.length>6e4&&t.length>1){let r=Math.ceil(t.length/2);this.sendKeepaliveChunk(t.slice(0,r)),this.sendKeepaliveChunk(t.slice(r));return}try{this.fetchFn(this.endpointUrl,{method:"POST",headers:this.requestHeaders(),body:n,keepalive:!0}).catch(()=>{})}catch{}}requestHeaders(){let t={"Content-Type":"application/json","X-WaniWani-SDK":V};return this.apiKey&&(t.Authorization=`Bearer ${this.apiKey}`),t}scheduleMicroFlush(){this.flushScheduled||(this.flushScheduled=!0,this.flushScheduledTimer=setTimeout(()=>{this.flushScheduledTimer=void 0,this.flushScheduled=!1,this.flush()},0))}async flushLoop(){for(;this.buffer.length>0&&!this.isStopped;){let t=this.buffer.splice(0,this.maxBatchSize);await this.sendBatchWithRetry(t)}}async sendBatchWithRetry(t){let n=0,r=t;for(;r.length>0&&!this.isStopped;){this.inFlightCount=r.length;let i=await this.sendBatchOnce(r);switch(this.inFlightCount=0,i.kind){case"success":return;case"auth":this.stopTransportForAuthFailure(i.status,r.length);return;case"permanent":this.logger.error("[Waniwani] Dropping %d event(s) after permanent failure: %s",r.length,i.reason);return;case"retryable":if(n>=this.maxRetries){this.logger.error("[Waniwani] Dropping %d event(s) after retry exhaustion: %s",r.length,i.reason);return}await this.sleep(this.backoffDelayMs(n)),n+=1;continue;case"partial":if(i.permanent.length>0&&this.logger.error("[Waniwani] Dropping %d event(s) rejected as permanent",i.permanent.length),i.retryable.length===0)return;if(n>=this.maxRetries){this.logger.error("[Waniwani] Dropping %d retryable event(s) after retry exhaustion",i.retryable.length);return}r=i.retryable,await this.sleep(this.backoffDelayMs(n)),n+=1;continue}}}async sendBatchOnce(t){let n;try{n=await this.fetchFn(this.endpointUrl,{method:"POST",headers:this.requestHeaders(),body:JSON.stringify(this.makeBatchRequest(t))})}catch(s){return{kind:"retryable",reason:ye(s)}}if(fe.has(n.status))return{kind:"auth",status:n.status};if(he.has(n.status))return{kind:"retryable",reason:`HTTP ${n.status}`};if(!n.ok)return{kind:"permanent",reason:`HTTP ${n.status}`};let r=await ve(n);if(!r?.rejected||r.rejected.length===0)return{kind:"success"};let i=this.classifyRejectedEvents(t,r.rejected);return i.retryable.length===0&&i.permanent.length===0?{kind:"success"}:{kind:"partial",retryable:i.retryable,permanent:i.permanent}}makeBatchRequest(t){return{sentAt:this.now().toISOString(),source:{sdk:V,version:this.sdkVersion??"0.0.0"},events:t}}classifyRejectedEvents(t,n){let r=new Map(t.map(a=>[a.id,a])),i=[],s=[];for(let a of n){let o=r.get(a.eventId);if(o){if(me(a)){i.push(o);continue}s.push(o)}}return{retryable:i,permanent:s}}backoffDelayMs(t){let n=this.retryBaseDelayMs*2**t;return Math.min(n,this.retryMaxDelayMs)}stopTransportForAuthFailure(t,n){this.isStopped=!0;let r=this.buffer.length;this.buffer.splice(0,r),this.logger.error("[Waniwani] Auth failure (HTTP %d). Stopping tracking transport and dropping %d queued event(s)",t,n+r)}};function me(e){if(e.retryable===!0)return!0;let t=e.code.toLowerCase();return t.includes("timeout")||t.includes("temporary")||t.includes("unavailable")||t.includes("rate_limit")||t.includes("transient")||t.includes("server")}async function ve(e){let t=await e.text();if(t)try{return JSON.parse(t)}catch{return}}function Te(e,t){let n=e.endsWith("/")?e:`${e}/`,r=t.startsWith("/")?t.slice(1):t;return`${n}${r}`}function ye(e){return e instanceof Error?e.message:String(e)}function Ie(e){let{apiUrl:t,endpointPath:n}=Ee(e.endpoint),r=S({apiUrl:t,apiKey:e.token,endpointPath:n,flushIntervalMs:e.flushIntervalMs}),i,s=o=>typeof o=="function"?o():o,a=async o=>{let c=e.identity?.()??{},g=s(e.channelId),d=g===void 0?o.properties:{channelId:g,...o.properties},u=T({sessionId:c.sessionId,visitorId:c.visitorId,externalUserId:c.externalUserId??i,traceId:c.traceId,...o,properties:d,metadata:{...e.metadata,...o.metadata}},{source:s(e.source)});return r.enqueue(u),{eventId:u.id}};return{track:Object.assign(a,E(a)),identify(o,c){return i=o,a({event:"user.identified",externalUserId:o,properties:c})},flush:()=>r.flush(),shutdown:o=>r.shutdown(o)}}function Ee(e){let t=new URL(e);return{apiUrl:t.origin,endpointPath:`${t.pathname}${t.search}`}}import{AsyncLocalStorage as Se}from"async_hooks";var j=globalThis,k=j.__waniwaniKbRetrievalStore;k||(k=new Se,j.__waniwaniKbRetrievalStore=k);var ke=k;function N(e){try{ke.getStore()?.searches.push(e)}catch{}}var we="@waniwani/sdk";function q(e){let{apiUrl:t,apiKey:n}=e;function r(){if(!n)throw new Error("WANIWANI_API_KEY is not set");return n}async function i(s,a,o){let c=r(),g=`${t.replace(/\/$/,"")}${a}`,d={Authorization:`Bearer ${c}`,"X-WaniWani-SDK":we},u={method:s,headers:d};o!==void 0&&(d["Content-Type"]="application/json",u.body=JSON.stringify(o));let f=await fetch(g,u);if(!f.ok){let z=await f.text().catch(()=>"");throw new y(z||`KB API error: HTTP ${f.status}`,f.status)}return(await f.json()).data}return{async ingest(s){return i("POST","/api/mcp/kb/ingest",{files:s})},async search(s,a){let o=await i("POST","/api/mcp/kb/search",{query:s,...a});return N({query:s,resultCount:o.length,results:o.map(c=>({source:c.source,heading:c.heading,score:c.score}))}),o},async sources(){return i("GET","/api/mcp/kb/sources")}}}function Y(e){let{apiUrl:t,apiKey:n,tracking:r}=e;function i(){if(!n)throw new Error("WANIWANI_API_KEY is not set");return n}let s=n?S({apiUrl:t,apiKey:n,endpointPath:r.endpointPath,flushIntervalMs:r.flushIntervalMs,maxBatchSize:r.maxBatchSize,maxBufferSize:r.maxBufferSize,maxRetries:r.maxRetries,retryBaseDelayMs:r.retryBaseDelayMs,retryMaxDelayMs:r.retryMaxDelayMs,shutdownTimeoutMs:r.shutdownTimeoutMs}):void 0;function a(d){i();let u=T(d);return!u.correlation.sessionId&&!u.correlation.externalUserId&&!u.correlation.visitorId&&console.warn(`[waniwani] event "${u.name}" has no sessionId, externalUserId, or visitorId; the ingest API requires one and will reject it.`),s?.enqueue(u),{eventId:u.id}}let o=async d=>a(d),c=Object.assign(o,E(o)),g={async identify(d,u,f){i();let w=T({event:"user.identified",externalUserId:d,properties:u,meta:f});return s?.enqueue(w),{eventId:w.id}},track:c,async flush(){i(),await s?.flush()},async shutdown(d){return i(),await s?.shutdown({timeoutMs:d?.timeoutMs??r.shutdownTimeoutMs})??{timedOut:!1,pendingEvents:0}}};return s&&xe(g,r.shutdownTimeoutMs),g}function xe(e,t){if(typeof process>"u"||typeof process.once!="function"||typeof process.on!="function")return;let n=()=>{e.shutdown({timeoutMs:t})};process.once("beforeExit",n),process.once("SIGINT",n),process.once("SIGTERM",n)}function Re(e){let n=e??_()??b(),r=n?.apiUrl??process.env.WANIWANI_API_URL??"https://app.waniwani.ai",i=n?.apiKey??process.env.WANIWANI_API_KEY,s={endpointPath:n?.tracking?.endpointPath??"/api/mcp/events/v2/batch",flushIntervalMs:n?.tracking?.flushIntervalMs??1e3,maxBatchSize:n?.tracking?.maxBatchSize??20,maxBufferSize:n?.tracking?.maxBufferSize??1e3,maxRetries:n?.tracking?.maxRetries??3,retryBaseDelayMs:n?.tracking?.retryBaseDelayMs??200,retryMaxDelayMs:n?.tracking?.retryMaxDelayMs??2e3,shutdownTimeoutMs:n?.tracking?.shutdownTimeoutMs??2e3},a={apiUrl:r,apiKey:i,tracking:s},o=Y(a),c=q(a);return{...o,kb:c,_config:a}}export{O as ERROR_CAUSES,P as EVENT_TYPES,M as SESSION_ERROR_CODES,y as WaniWaniError,Ie as createFrontendClient,Q as defineConfig,Re as waniwani};
1
+ var Z=["documentId","document_id"],ee=["filename","file_name","fileName","name"],te=["mediaType","media_type","mimeType","mime_type","contentType","content_type"],ne="document",re="application/octet-stream";function y(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function R(e,t){for(let n of t){let r=e[n];if(typeof r=="string"&&r.length>0)return r}}function ie(e){if(!y(e))return;let t=R(e,Z);if(t)return{documentId:t,filename:R(e,ee)??ne,mediaType:R(e,te)??re}}function b(e){let t=[],n=new Set;for(let r of Array.isArray(e)?e:[e]){let i=ie(r);i&&!n.has(i.documentId)&&(n.add(i.documentId),t.push(i))}return t}function oe(e){if(!Array.isArray(e))return[];let t=[...e].reverse().find(n=>y(n)&&n.role==="user");return!y(t)||!Array.isArray(t.parts)?[]:b(t.parts.flatMap(n=>y(n)&&y(n.data)?[n,n.data]:[n]))}function P(e){let t=y(e)?e:void 0,n=b(t?t.documents:e);return n.length>0?n:oe(t?t.messages:e)}var m=class extends Error{constructor(n,r){super(n);this.status=r;this.name="WaniWaniError"}};import{existsSync as se,readFileSync as ae}from"fs";import{resolve as ce}from"path";var ue="waniwani.json",T;function A(){if(T!==void 0)return T;try{let e=ce(process.cwd(),ue);if(!se(e))return T=null,null;let t=ae(e,"utf-8");return T=JSON.parse(t),T}catch{return T=null,null}}var D="__waniwani_config__";function de(e){return globalThis[D]=e,e}function M(){return globalThis[D]}var O=["session.started","page.viewed","tool.called","link.clicked","widget_render","user.identified","price_shown","prices_compared","option_selected","lead_qualified","converted","session.error"],F=["agent_failed","tool_failed","upstream_failed"],U=["timeout","rate_limited","upstream_4xx","upstream_5xx","network","invalid_output","flow_dead_end","flow_unknown_node","flow_loop","unknown"];function v(e,t){for(let n of t){let r=e[n];if(typeof r=="string"&&r.length>0)return r}}var pe=["waniwani/sessionId","openai/sessionId","openai/session","sessionId","conversationId","mcp-session-id"],le=["waniwani/requestId","openai/requestId","requestId","mcp/requestId"],fe=["waniwani/traceId","openai/traceId","traceId","mcp/traceId","openai/requestId","requestId"],ge=["waniwani/userId","openai/userId","externalUserId","userId","actorId"],he=["waniwani/visitorId","visitorId"],me=["correlationId","openai/requestId"];function B(e){return e?v(e,pe):void 0}function K(e){return e?v(e,le):void 0}function L(e){return e?v(e,fe):void 0}function W(e){return e?v(e,ge):void 0}function j(e){return e?v(e,he):void 0}function N(e){return e?v(e,me):void 0}var ye=[{key:"openai/sessionId",source:"chatgpt"},{key:"openai/session",source:"chatgpt"}],Te=[{needle:"claude",source:"claude"},{needle:"chatgpt",source:"chatgpt"},{needle:"openai",source:"chatgpt"},{needle:"gemini",source:"gemini"}];function V(e,t){if(e){let r=e["waniwani/source"];if(typeof r=="string"&&r.length>0)return r;for(let{key:i,source:o}of ye){let a=e[i];if(typeof a=="string"&&a.length>0)return o}}let n=t?.name;if(typeof n=="string"&&n.length>0){let r=n.toLowerCase();for(let{needle:i,source:o}of Te)if(r.includes(i))return o}}var ve="@waniwani/sdk";function I(e,t={}){let n=t.now??(()=>new Date),r=t.generateId??Y,i=ke(e),o=E(e.meta),a=E(e.metadata),s=Se(e,o),c=h(e.eventId)??r(),f=we(e.timestamp,n),d=h(e.source)??V(o)??t.source??ve,u=_(e)?{...e}:void 0,g={...a};return Object.keys(o).length>0&&(g.meta=o),u&&(g.rawLegacy=u),{id:c,type:"mcp.event",name:i,source:d,timestamp:f,correlation:s,properties:Ie(e,i),metadata:g,rawLegacy:u}}function Y(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?`evt_${crypto.randomUUID()}`:`evt_${Math.random().toString(36).slice(2,10)}_${Date.now().toString(36)}`}function Ie(e,t){if(!_(e))return E(e.properties);let n=Ee(e,t),r=E(e.properties);return{...n,...r}}function Ee(e,t){switch(t){case"tool.called":{let n={};return h(e.toolName)&&(n.name=e.toolName),h(e.toolType)&&(n.type=e.toolType),n}case"link.clicked":{let n={};return h(e.linkUrl)&&(n.url=e.linkUrl),n}default:return{}}}function ke(e){return _(e)?e.eventType:e.event}function Se(e,t){let n=h(e.requestId)??K(t),r=h(e.sessionId)??B(t),i=h(e.traceId)??L(t),o=h(e.externalUserId)??W(t),a=h(e.visitorId)??j(t),s=h(e.correlationId)??N(t)??n,c={};return r&&(c.sessionId=r),i&&(c.traceId=i),n&&(c.requestId=n),s&&(c.correlationId=s),o&&(c.externalUserId=o),a&&(c.visitorId=a),c}function we(e,t){if(e instanceof Date)return e.toISOString();if(typeof e=="string"){let n=new Date(e);if(!Number.isNaN(n.getTime()))return n.toISOString()}return t().toISOString()}function E(e){return!e||typeof e!="object"||Array.isArray(e)?{}:e}function h(e){if(typeof e=="string"&&e.trim().length!==0)return e}function _(e){return"eventType"in e}function k(e){return{priceShown:({amount:t,currency:n,itemId:r,label:i,...o})=>e({event:"price_shown",properties:{amount:t,currency:n,itemId:r,label:i},...o}),pricesCompared:({options:t,...n})=>e({event:"prices_compared",properties:{options:t},...n}),optionSelected:({id:t,amount:n,currency:r,...i})=>e({event:"option_selected",properties:{id:t,amount:n,currency:r},...i}),leadQualified:t=>{let{externalId:n,email:r,name:i,...o}=t??{};return e({event:"lead_qualified",properties:{externalId:n,email:r,name:i},...o})},converted:({amount:t,currency:n,occurredAt:r,...i})=>e({event:"converted",properties:{amount:t,currency:n,occurredAt:r},...i})}}var xe="/api/mcp/events/v2/batch";var q="@waniwani/sdk";var Re=new Set([401,403]),_e=new Set([408,425,429,500,502,503,504]),Ce=(e,t)=>globalThis.fetch(e,t);function S(e){return new C(e)}var C=class{endpointUrl;flushIntervalMs;maxBatchSize;maxBufferSize;maxRetries;retryBaseDelayMs;retryMaxDelayMs;shutdownTimeoutMs;sdkVersion;fetchFn;logger;now;sleep;apiKey;buffer=[];flushTimer;flushScheduled=!1;flushScheduledTimer;flushInFlight;inFlightCount=0;isStopped=!1;isShuttingDown=!1;constructor(t){this.endpointUrl=Ae(t.apiUrl,t.endpointPath??xe),this.flushIntervalMs=t.flushIntervalMs??1e3,this.maxBatchSize=t.maxBatchSize??20,this.maxBufferSize=t.maxBufferSize??1e3,this.maxRetries=t.maxRetries??3,this.retryBaseDelayMs=t.retryBaseDelayMs??200,this.retryMaxDelayMs=t.retryMaxDelayMs??2e3,this.shutdownTimeoutMs=t.shutdownTimeoutMs??2e3,this.fetchFn=t.fetchFn??Ce,this.logger=t.logger??console,this.now=t.now??(()=>new Date),this.sleep=t.sleep??(n=>new Promise(r=>setTimeout(r,n))),this.apiKey=t.apiKey,this.sdkVersion=t.sdkVersion,this.flushIntervalMs>0&&(this.flushTimer=setInterval(()=>{this.flush()},this.flushIntervalMs)),this.registerBrowserTeardown()}enqueue(t){if(this.isStopped||this.isShuttingDown){this.logger.warn("[Waniwani] Tracking transport is stopped, dropping event %s",t.id);return}if(this.buffer.length>=this.maxBufferSize){let n=this.buffer.length-this.maxBufferSize+1;this.buffer.splice(0,n),this.logger.warn("[Waniwani] Tracking buffer overflow, dropped %d oldest event(s)",n)}if(this.buffer.push(t),this.buffer.length>=this.maxBatchSize){this.flush();return}this.scheduleMicroFlush()}pendingEvents(){return this.buffer.length+this.inFlightCount}async flush(){return this.flushInFlight?this.flushInFlight:(this.flushInFlight=this.flushLoop().finally(()=>{this.flushInFlight=void 0}),this.flushInFlight)}async shutdown(t){this.isShuttingDown=!0,this.flushTimer&&(clearInterval(this.flushTimer),this.flushTimer=void 0),this.flushScheduledTimer&&(clearTimeout(this.flushScheduledTimer),this.flushScheduledTimer=void 0,this.flushScheduled=!1);let n=t?.timeoutMs??this.shutdownTimeoutMs,r=this.flush();if(!Number.isFinite(n)||n<=0)return await r,this.isStopped=!0,{timedOut:!1,pendingEvents:this.pendingEvents()};let i=Symbol("shutdown-timeout");return await Promise.race([r.then(()=>"flushed"),this.sleep(n).then(()=>i)])===i?(this.isStopped=!0,{timedOut:!0,pendingEvents:this.pendingEvents()}):(this.isStopped=!0,{timedOut:!1,pendingEvents:this.pendingEvents()})}registerBrowserTeardown(){if(typeof document>"u"||typeof window>"u")return;let t=()=>{document.visibilityState==="hidden"&&this.keepaliveFlush()};document.addEventListener("visibilitychange",t),window.addEventListener("pagehide",()=>this.keepaliveFlush())}keepaliveFlush(){if(this.isStopped||this.buffer.length===0)return;let t=this.buffer.splice(0,this.buffer.length);this.sendKeepaliveChunk(t)}sendKeepaliveChunk(t){let n=JSON.stringify(this.makeBatchRequest(t));if(n.length>6e4&&t.length>1){let r=Math.ceil(t.length/2);this.sendKeepaliveChunk(t.slice(0,r)),this.sendKeepaliveChunk(t.slice(r));return}try{this.fetchFn(this.endpointUrl,{method:"POST",headers:this.requestHeaders(),body:n,keepalive:!0}).catch(()=>{})}catch{}}requestHeaders(){let t={"Content-Type":"application/json","X-WaniWani-SDK":q};return this.apiKey&&(t.Authorization=`Bearer ${this.apiKey}`),t}scheduleMicroFlush(){this.flushScheduled||(this.flushScheduled=!0,this.flushScheduledTimer=setTimeout(()=>{this.flushScheduledTimer=void 0,this.flushScheduled=!1,this.flush()},0))}async flushLoop(){for(;this.buffer.length>0&&!this.isStopped;){let t=this.buffer.splice(0,this.maxBatchSize);await this.sendBatchWithRetry(t)}}async sendBatchWithRetry(t){let n=0,r=t;for(;r.length>0&&!this.isStopped;){this.inFlightCount=r.length;let i=await this.sendBatchOnce(r);switch(this.inFlightCount=0,i.kind){case"success":return;case"auth":this.stopTransportForAuthFailure(i.status,r.length);return;case"permanent":this.logger.error("[Waniwani] Dropping %d event(s) after permanent failure: %s",r.length,i.reason);return;case"retryable":if(n>=this.maxRetries){this.logger.error("[Waniwani] Dropping %d event(s) after retry exhaustion: %s",r.length,i.reason);return}await this.sleep(this.backoffDelayMs(n)),n+=1;continue;case"partial":if(i.permanent.length>0&&this.logger.error("[Waniwani] Dropping %d event(s) rejected as permanent",i.permanent.length),i.retryable.length===0)return;if(n>=this.maxRetries){this.logger.error("[Waniwani] Dropping %d retryable event(s) after retry exhaustion",i.retryable.length);return}r=i.retryable,await this.sleep(this.backoffDelayMs(n)),n+=1;continue}}}async sendBatchOnce(t){let n;try{n=await this.fetchFn(this.endpointUrl,{method:"POST",headers:this.requestHeaders(),body:JSON.stringify(this.makeBatchRequest(t))})}catch(o){return{kind:"retryable",reason:De(o)}}if(Re.has(n.status))return{kind:"auth",status:n.status};if(_e.has(n.status))return{kind:"retryable",reason:`HTTP ${n.status}`};if(!n.ok)return{kind:"permanent",reason:`HTTP ${n.status}`};let r=await Pe(n);if(!r?.rejected||r.rejected.length===0)return{kind:"success"};let i=this.classifyRejectedEvents(t,r.rejected);return i.retryable.length===0&&i.permanent.length===0?{kind:"success"}:{kind:"partial",retryable:i.retryable,permanent:i.permanent}}makeBatchRequest(t){return{sentAt:this.now().toISOString(),source:{sdk:q,version:this.sdkVersion??"0.0.0"},events:t}}classifyRejectedEvents(t,n){let r=new Map(t.map(a=>[a.id,a])),i=[],o=[];for(let a of n){let s=r.get(a.eventId);if(s){if(be(a)){i.push(s);continue}o.push(s)}}return{retryable:i,permanent:o}}backoffDelayMs(t){let n=this.retryBaseDelayMs*2**t;return Math.min(n,this.retryMaxDelayMs)}stopTransportForAuthFailure(t,n){this.isStopped=!0;let r=this.buffer.length;this.buffer.splice(0,r),this.logger.error("[Waniwani] Auth failure (HTTP %d). Stopping tracking transport and dropping %d queued event(s)",t,n+r)}};function be(e){if(e.retryable===!0)return!0;let t=e.code.toLowerCase();return t.includes("timeout")||t.includes("temporary")||t.includes("unavailable")||t.includes("rate_limit")||t.includes("transient")||t.includes("server")}async function Pe(e){let t=await e.text();if(t)try{return JSON.parse(t)}catch{return}}function Ae(e,t){let n=e.endsWith("/")?e:`${e}/`,r=t.startsWith("/")?t.slice(1):t;return`${n}${r}`}function De(e){return e instanceof Error?e.message:String(e)}function Me(e){let{apiUrl:t,endpointPath:n}=Oe(e.endpoint),r=S({apiUrl:t,apiKey:e.token,endpointPath:n,flushIntervalMs:e.flushIntervalMs}),i,o=s=>typeof s=="function"?s():s,a=async s=>{let c=e.identity?.()??{},f=o(e.channelId),d=f===void 0?s.properties:{channelId:f,...s.properties},u=I({sessionId:c.sessionId,visitorId:c.visitorId,externalUserId:c.externalUserId??i,traceId:c.traceId,...s,properties:d,metadata:{...e.metadata,...s.metadata}},{source:o(e.source)});return r.enqueue(u),{eventId:u.id}};return{track:Object.assign(a,k(a)),identify(s,c){return i=s,a({event:"user.identified",externalUserId:s,properties:c})},flush:()=>r.flush(),shutdown:s=>r.shutdown(s)}}function Oe(e){let t=new URL(e);return{apiUrl:t.origin,endpointPath:`${t.pathname}${t.search}`}}var Fe="@waniwani/sdk",Ue="/api/mcp/modules/documents/extract";function Be(e,t){try{let n=JSON.parse(e);if(n!==null&&typeof n=="object"){let r="message"in n&&typeof n.message=="string"?n.message:"",i="detail"in n&&typeof n.detail=="string"?n.detail:"";if(r&&i)return`${r}: ${i}`;if(r)return r;if(i)return i}}catch{}return e||`Documents API error: HTTP ${t}`}function Ke(e){return"documentId"in e&&typeof e.documentId=="string"}function Le(e){return Ke(e)?{documentId:e.documentId}:{url:e.url,filename:e.filename}}function z(e){let{apiUrl:t,apiKey:n}=e;return{async extract(r){if(!n)throw new Error("WANIWANI_API_KEY is not set");let{toJSONSchema:i}=await import("zod"),o=await fetch(`${t.replace(/\/$/,"")}${Ue}`,{method:"POST",headers:{Authorization:`Bearer ${n}`,"Content-Type":"application/json","X-WaniWani-SDK":Fe},body:JSON.stringify({...Le(r),schema:i(r.schema),pages:r.pages,sessionId:r.sessionId,correlationId:r.correlationId})});if(!o.ok){let u=await o.text().catch(()=>"");throw new m(Be(u,o.status),o.status)}let a=await o.json(),{fields:s,pageCount:c,pageConfidence:f,documentId:d}=a.data;return{fields:r.schema.parse(s),pageCount:c,pageConfidence:f??null,documentId:d}}}}import{AsyncLocalStorage as We}from"async_hooks";var $=globalThis,w=$.__waniwaniKbRetrievalStore;w||(w=new We,$.__waniwaniKbRetrievalStore=w);var je=w;function H(e){try{je.getStore()?.searches.push(e)}catch{}}var Ne="@waniwani/sdk";function X(e){let{apiUrl:t,apiKey:n}=e;function r(){if(!n)throw new Error("WANIWANI_API_KEY is not set");return n}async function i(o,a,s){let c=r(),f=`${t.replace(/\/$/,"")}${a}`,d={Authorization:`Bearer ${c}`,"X-WaniWani-SDK":Ne},u={method:o,headers:d};s!==void 0&&(d["Content-Type"]="application/json",u.body=JSON.stringify(s));let g=await fetch(f,u);if(!g.ok){let J=await g.text().catch(()=>"");throw new m(J||`KB API error: HTTP ${g.status}`,g.status)}return(await g.json()).data}return{async ingest(o){return i("POST","/api/mcp/kb/ingest",{files:o})},async search(o,a){let s=await i("POST","/api/mcp/kb/search",{query:o,...a});return H({query:o,resultCount:s.length,results:s.map(c=>({source:c.source,heading:c.heading,score:c.score}))}),s},async sources(){return i("GET","/api/mcp/kb/sources")}}}function G(e){let{apiUrl:t,apiKey:n,tracking:r}=e;function i(){if(!n)throw new Error("WANIWANI_API_KEY is not set");return n}let o=n?S({apiUrl:t,apiKey:n,endpointPath:r.endpointPath,flushIntervalMs:r.flushIntervalMs,maxBatchSize:r.maxBatchSize,maxBufferSize:r.maxBufferSize,maxRetries:r.maxRetries,retryBaseDelayMs:r.retryBaseDelayMs,retryMaxDelayMs:r.retryMaxDelayMs,shutdownTimeoutMs:r.shutdownTimeoutMs}):void 0;function a(d){i();let u=I(d);return!u.correlation.sessionId&&!u.correlation.externalUserId&&!u.correlation.visitorId&&console.warn(`[waniwani] event "${u.name}" has no sessionId, externalUserId, or visitorId; the ingest API requires one and will reject it.`),o?.enqueue(u),{eventId:u.id}}let s=async d=>a(d),c=Object.assign(s,k(s)),f={async identify(d,u,g){i();let x=I({event:"user.identified",externalUserId:d,properties:u,meta:g});return o?.enqueue(x),{eventId:x.id}},track:c,async flush(){i(),await o?.flush()},async shutdown(d){return i(),await o?.shutdown({timeoutMs:d?.timeoutMs??r.shutdownTimeoutMs})??{timedOut:!1,pendingEvents:0}}};return o&&Ve(f,r.shutdownTimeoutMs),f}function Ve(e,t){if(typeof process>"u"||typeof process.once!="function"||typeof process.on!="function")return;let n=()=>{e.shutdown({timeoutMs:t})};process.once("beforeExit",n),process.once("SIGINT",n),process.once("SIGTERM",n)}var Q="https://app.waniwani.ai";function Ye(e){let n=e??A()??M(),r=n?.apiUrl??process.env.WANIWANI_API_URL??Q,i=n?.apiKey??process.env.WANIWANI_API_KEY,o={endpointPath:n?.tracking?.endpointPath??"/api/mcp/events/v2/batch",flushIntervalMs:n?.tracking?.flushIntervalMs??1e3,maxBatchSize:n?.tracking?.maxBatchSize??20,maxBufferSize:n?.tracking?.maxBufferSize??1e3,maxRetries:n?.tracking?.maxRetries??3,retryBaseDelayMs:n?.tracking?.retryBaseDelayMs??200,retryMaxDelayMs:n?.tracking?.retryMaxDelayMs??2e3,shutdownTimeoutMs:n?.tracking?.shutdownTimeoutMs??2e3},a={apiUrl:r,apiKey:i,tracking:o},s=G(a),c=X(a),f=z(a);return{...s,kb:c,documents:f,_config:a}}export{U as ERROR_CAUSES,O as EVENT_TYPES,F as SESSION_ERROR_CODES,m as WaniWaniError,Me as createFrontendClient,de as defineConfig,P as readAttachedDocuments,Ye as waniwani};
2
2
  //# sourceMappingURL=index.js.map