@waniwani/sdk 0.14.20 → 0.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -8,6 +8,11 @@ interface SearchResult {
8
8
  score: number;
9
9
  metadata?: Record<string, string>;
10
10
  }
11
+ interface KbSearchTrace {
12
+ query: string;
13
+ resultCount: number;
14
+ results: Array<Pick<SearchResult, "source" | "heading" | "score">>;
15
+ }
11
16
  /** A file to ingest into the knowledge base */
12
17
  interface KbIngestFile {
13
18
  /** Filename (used as chunk source identifier) */
@@ -57,7 +62,7 @@ interface KbClient {
57
62
  sources(): Promise<KbSource[]>;
58
63
  }
59
64
 
60
- type EventType = "session.started" | "page.viewed" | "tool.called" | "quote.requested" | "quote.succeeded" | "quote.failed" | "link.clicked" | "purchase.completed" | "widget_render" | "widget_click" | "widget_link_click" | "widget_error" | "widget_scroll" | "widget_form_field" | "widget_form_submit" | "user.identified" | "price_shown" | "prices_compared" | "option_selected" | "lead" | "converted";
65
+ type EventType = "session.started" | "page.viewed" | "tool.called" | "quote.requested" | "quote.succeeded" | "quote.failed" | "link.clicked" | "purchase.completed" | "widget_render" | "widget_click" | "widget_link_click" | "widget_error" | "widget_scroll" | "widget_form_field" | "widget_form_submit" | "user.identified" | "price_shown" | "prices_compared" | "option_selected" | "lead_qualified" | "converted";
61
66
  /**
62
67
  * Properties for `page.viewed` — emitted once when the chat widget initializes
63
68
  * on a host page (the top of the funnel). Attributed to the anonymous
@@ -82,6 +87,8 @@ interface PageViewedProperties {
82
87
  interface ToolCalledProperties {
83
88
  name?: string;
84
89
  type?: "pricing" | "product_info" | "availability" | "support" | "other";
90
+ /** Retrieval traces for kb.search() calls made inside this tool handler. */
91
+ kbSearch?: KbSearchTrace[];
85
92
  }
86
93
  interface QuoteSucceededProperties {
87
94
  amount?: number;
@@ -113,7 +120,23 @@ interface OptionSelectedProperties {
113
120
  amount: number;
114
121
  currency: string;
115
122
  }
116
- interface LeadProperties {
123
+ /**
124
+ * Properties for `lead_qualified` — your code declaring that a person met your
125
+ * qualification bar (finished the qualifying questions, requested a demo,
126
+ * matched your target profile). Sharing an email mid-conversation is
127
+ * `identify(userId, { email })`, not a qualified lead.
128
+ */
129
+ interface LeadQualifiedProperties {
130
+ /**
131
+ * Your own lead id (e.g. the record id your lead-gen API returns). The
132
+ * strongest dedup key and the stable reference back to your system.
133
+ */
134
+ externalId?: string;
135
+ /** The lead's email, if known. */
136
+ email?: string;
137
+ /** The lead's name, if known. */
138
+ name?: string;
139
+ /** Acquisition source of the lead (e.g. "newsletter"). */
117
140
  source?: string;
118
141
  }
119
142
  interface ConvertedProperties {
@@ -184,8 +207,8 @@ type TrackEvent = ({
184
207
  event: "option_selected";
185
208
  properties?: OptionSelectedProperties;
186
209
  } & BaseTrackEvent) | ({
187
- event: "lead";
188
- properties?: LeadProperties;
210
+ event: "lead_qualified";
211
+ properties?: LeadQualifiedProperties;
189
212
  } & BaseTrackEvent) | ({
190
213
  event: "converted";
191
214
  properties?: ConvertedProperties;
@@ -215,12 +238,12 @@ interface RevenuePricesComparedInput extends TrackingContext, PricesComparedProp
215
238
  interface RevenueOptionSelectedInput extends TrackingContext, OptionSelectedProperties {
216
239
  }
217
240
  /**
218
- * Input for `track.lead()`. `source` is the lead's acquisition source
219
- * (the `lead` event property, e.g. "newsletter") — on this helper it shadows
220
- * the envelope `source` from the tracking context. To set a custom envelope
221
- * source on a lead, use the generic `track({ event: "lead", … })`.
241
+ * Input for `track.leadQualified()`. `source` is the lead's acquisition source
242
+ * (the event property, e.g. "newsletter") — on this helper it shadows the
243
+ * envelope `source` from the tracking context. To set a custom envelope source
244
+ * on a lead, use the generic `track({ event: "lead_qualified", … })`.
222
245
  */
223
- interface RevenueLeadInput extends TrackingContext, LeadProperties {
246
+ interface RevenueLeadQualifiedInput extends TrackingContext, LeadQualifiedProperties {
224
247
  }
225
248
  interface RevenueConvertedInput extends TrackingContext, ConvertedProperties {
226
249
  }
@@ -239,7 +262,7 @@ interface RevenueTrackingApi {
239
262
  optionSelected: (input: RevenueOptionSelectedInput) => Promise<{
240
263
  eventId: string;
241
264
  }>;
242
- lead: (input?: RevenueLeadInput) => Promise<{
265
+ leadQualified: (input?: RevenueLeadQualifiedInput) => Promise<{
243
266
  eventId: string;
244
267
  }>;
245
268
  converted: (input: RevenueConvertedInput) => Promise<{
@@ -248,7 +271,7 @@ interface RevenueTrackingApi {
248
271
  }
249
272
  /**
250
273
  * `client.track` — callable for generic events (`track(event)`), with the
251
- * revenue helpers attached flat: `track.priceShown()`, `track.lead()`,
274
+ * revenue helpers attached flat: `track.priceShown()`, `track.leadQualified()`,
252
275
  * `track.converted()`, etc.
253
276
  */
254
277
  interface TrackFn extends RevenueTrackingApi {
@@ -297,7 +320,7 @@ interface TrackingClient {
297
320
  * Returns a deterministic event id immediately after enqueue.
298
321
  *
299
322
  * Also exposes the revenue helpers flat: `client.track.priceShown()`,
300
- * `client.track.lead()`, `client.track.converted()`, etc.
323
+ * `client.track.leadQualified()`, `client.track.converted()`, etc.
301
324
  */
302
325
  track: TrackFn;
303
326
  /**
@@ -8,6 +8,11 @@ interface SearchResult {
8
8
  score: number;
9
9
  metadata?: Record<string, string>;
10
10
  }
11
+ interface KbSearchTrace {
12
+ query: string;
13
+ resultCount: number;
14
+ results: Array<Pick<SearchResult, "source" | "heading" | "score">>;
15
+ }
11
16
  /** A file to ingest into the knowledge base */
12
17
  interface KbIngestFile {
13
18
  /** Filename (used as chunk source identifier) */
@@ -57,7 +62,7 @@ interface KbClient {
57
62
  sources(): Promise<KbSource[]>;
58
63
  }
59
64
 
60
- type EventType = "session.started" | "page.viewed" | "tool.called" | "quote.requested" | "quote.succeeded" | "quote.failed" | "link.clicked" | "purchase.completed" | "widget_render" | "widget_click" | "widget_link_click" | "widget_error" | "widget_scroll" | "widget_form_field" | "widget_form_submit" | "user.identified" | "price_shown" | "prices_compared" | "option_selected" | "lead" | "converted";
65
+ type EventType = "session.started" | "page.viewed" | "tool.called" | "quote.requested" | "quote.succeeded" | "quote.failed" | "link.clicked" | "purchase.completed" | "widget_render" | "widget_click" | "widget_link_click" | "widget_error" | "widget_scroll" | "widget_form_field" | "widget_form_submit" | "user.identified" | "price_shown" | "prices_compared" | "option_selected" | "lead_qualified" | "converted";
61
66
  /**
62
67
  * Properties for `page.viewed` — emitted once when the chat widget initializes
63
68
  * on a host page (the top of the funnel). Attributed to the anonymous
@@ -82,6 +87,8 @@ interface PageViewedProperties {
82
87
  interface ToolCalledProperties {
83
88
  name?: string;
84
89
  type?: "pricing" | "product_info" | "availability" | "support" | "other";
90
+ /** Retrieval traces for kb.search() calls made inside this tool handler. */
91
+ kbSearch?: KbSearchTrace[];
85
92
  }
86
93
  interface QuoteSucceededProperties {
87
94
  amount?: number;
@@ -113,7 +120,23 @@ interface OptionSelectedProperties {
113
120
  amount: number;
114
121
  currency: string;
115
122
  }
116
- interface LeadProperties {
123
+ /**
124
+ * Properties for `lead_qualified` — your code declaring that a person met your
125
+ * qualification bar (finished the qualifying questions, requested a demo,
126
+ * matched your target profile). Sharing an email mid-conversation is
127
+ * `identify(userId, { email })`, not a qualified lead.
128
+ */
129
+ interface LeadQualifiedProperties {
130
+ /**
131
+ * Your own lead id (e.g. the record id your lead-gen API returns). The
132
+ * strongest dedup key and the stable reference back to your system.
133
+ */
134
+ externalId?: string;
135
+ /** The lead's email, if known. */
136
+ email?: string;
137
+ /** The lead's name, if known. */
138
+ name?: string;
139
+ /** Acquisition source of the lead (e.g. "newsletter"). */
117
140
  source?: string;
118
141
  }
119
142
  interface ConvertedProperties {
@@ -184,8 +207,8 @@ type TrackEvent = ({
184
207
  event: "option_selected";
185
208
  properties?: OptionSelectedProperties;
186
209
  } & BaseTrackEvent) | ({
187
- event: "lead";
188
- properties?: LeadProperties;
210
+ event: "lead_qualified";
211
+ properties?: LeadQualifiedProperties;
189
212
  } & BaseTrackEvent) | ({
190
213
  event: "converted";
191
214
  properties?: ConvertedProperties;
@@ -215,12 +238,12 @@ interface RevenuePricesComparedInput extends TrackingContext, PricesComparedProp
215
238
  interface RevenueOptionSelectedInput extends TrackingContext, OptionSelectedProperties {
216
239
  }
217
240
  /**
218
- * Input for `track.lead()`. `source` is the lead's acquisition source
219
- * (the `lead` event property, e.g. "newsletter") — on this helper it shadows
220
- * the envelope `source` from the tracking context. To set a custom envelope
221
- * source on a lead, use the generic `track({ event: "lead", … })`.
241
+ * Input for `track.leadQualified()`. `source` is the lead's acquisition source
242
+ * (the event property, e.g. "newsletter") — on this helper it shadows the
243
+ * envelope `source` from the tracking context. To set a custom envelope source
244
+ * on a lead, use the generic `track({ event: "lead_qualified", … })`.
222
245
  */
223
- interface RevenueLeadInput extends TrackingContext, LeadProperties {
246
+ interface RevenueLeadQualifiedInput extends TrackingContext, LeadQualifiedProperties {
224
247
  }
225
248
  interface RevenueConvertedInput extends TrackingContext, ConvertedProperties {
226
249
  }
@@ -239,7 +262,7 @@ interface RevenueTrackingApi {
239
262
  optionSelected: (input: RevenueOptionSelectedInput) => Promise<{
240
263
  eventId: string;
241
264
  }>;
242
- lead: (input?: RevenueLeadInput) => Promise<{
265
+ leadQualified: (input?: RevenueLeadQualifiedInput) => Promise<{
243
266
  eventId: string;
244
267
  }>;
245
268
  converted: (input: RevenueConvertedInput) => Promise<{
@@ -248,7 +271,7 @@ interface RevenueTrackingApi {
248
271
  }
249
272
  /**
250
273
  * `client.track` — callable for generic events (`track(event)`), with the
251
- * revenue helpers attached flat: `track.priceShown()`, `track.lead()`,
274
+ * revenue helpers attached flat: `track.priceShown()`, `track.leadQualified()`,
252
275
  * `track.converted()`, etc.
253
276
  */
254
277
  interface TrackFn extends RevenueTrackingApi {
@@ -297,7 +320,7 @@ interface TrackingClient {
297
320
  * Returns a deterministic event id immediately after enqueue.
298
321
  *
299
322
  * Also exposes the revenue helpers flat: `client.track.priceShown()`,
300
- * `client.track.lead()`, `client.track.converted()`, etc.
323
+ * `client.track.leadQualified()`, `client.track.converted()`, etc.
301
324
  */
302
325
  track: TrackFn;
303
326
  /**
@@ -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-color-blue-400:oklch(70.7% .165 254.624);--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\:\!relative{position:relative!important}.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-full{top:100%}.ww\:right-0{right: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-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-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-\[80\%\]{max-width:80%}.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-hidden{overflow:hidden!important}.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-\[var\(--ww-radius\)\]{border-radius:var(--ww-radius)}.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{padding-inline:calc(var(--ww-spacing)*1)}.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\: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\:pb-8{padding-bottom:calc(var(--ww-spacing)*8)}.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\:text-\[10px\]{font-size:10px}.ww\:text-\[11px\]{font-size:11px}.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-blue-400\/70{--tw-ring-color:var(--ww-color-blue-400)}@supports (color:color-mix(in lab, red, red)){.ww\:ring-blue-400\/70{--tw-ring-color:color-mix(in oklab,var(--ww-color-blue-400)70%,transparent)}}.ww\:ring-offset-2{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.ww\:ring-offset-background{--tw-ring-offset-color:var(--ww-color-background,#fff)}.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\]\:rounded-lg:is(:where(.ww\:group).is-user *){border-radius:var(--ww-radius-lg)}.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\]\:px-4:is(:where(.ww\:group).is-user *){padding-inline:calc(var(--ww-spacing)*4)}.ww\:group-\[\.is-user\]\:py-3:is(:where(.ww\:group).is-user *){padding-block:calc(var(--ww-spacing)*3)}.ww\:group-\[\.is-user\]\:text-primary-foreground:is(:where(.ww\:group).is-user *){color:var(--ww-color-primary-foreground,#1f2937)}.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-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-glass:#eceef499;--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)}.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-glass:#282a3480;--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-glass:#282a3480;--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-blue-400:oklch(70.7% .165 254.624);--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\:\!relative{position:relative!important}.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-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-\[80\%\]{max-width:80%}.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-hidden{overflow:hidden!important}.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-\[var\(--ww-radius\)\]{border-radius:var(--ww-radius)}.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\:pb-8{padding-bottom:calc(var(--ww-spacing)*8)}.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\:text-\[10px\]{font-size:10px}.ww\:text-\[11px\]{font-size:11px}.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-blue-400\/70{--tw-ring-color:var(--ww-color-blue-400)}@supports (color:color-mix(in lab, red, red)){.ww\:ring-blue-400\/70{--tw-ring-color:color-mix(in oklab,var(--ww-color-blue-400)70%,transparent)}}.ww\:ring-offset-2{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.ww\:ring-offset-background{--tw-ring-offset-color:var(--ww-color-background,#fff)}.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\]\:rounded-lg:is(:where(.ww\:group).is-user *){border-radius:var(--ww-radius-lg)}.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\]\:px-4:is(:where(.ww\:group).is-user *){padding-inline:calc(var(--ww-spacing)*4)}.ww\:group-\[\.is-user\]\:py-3:is(:where(.ww\:group).is-user *){padding-block:calc(var(--ww-spacing)*3)}.ww\:group-\[\.is-user\]\:text-primary-foreground:is(:where(.ww\:group).is-user *){color:var(--ww-color-primary-foreground,#1f2937)}.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-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-glass:#eceef499;--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)}.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-glass:#282a3480;--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-glass:#282a3480;--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}}
package/dist/index.d.ts CHANGED
@@ -10,6 +10,11 @@ interface SearchResult {
10
10
  score: number;
11
11
  metadata?: Record<string, string>;
12
12
  }
13
+ interface KbSearchTrace {
14
+ query: string;
15
+ resultCount: number;
16
+ results: Array<Pick<SearchResult, "source" | "heading" | "score">>;
17
+ }
13
18
  /** A file to ingest into the knowledge base */
14
19
  interface KbIngestFile {
15
20
  /** Filename (used as chunk source identifier) */
@@ -104,7 +109,7 @@ interface WaniWaniProjectConfig {
104
109
  */
105
110
  declare function defineConfig(config: WaniWaniProjectConfig): WaniWaniProjectConfig;
106
111
 
107
- type EventType = "session.started" | "page.viewed" | "tool.called" | "quote.requested" | "quote.succeeded" | "quote.failed" | "link.clicked" | "purchase.completed" | "widget_render" | "widget_click" | "widget_link_click" | "widget_error" | "widget_scroll" | "widget_form_field" | "widget_form_submit" | "user.identified" | "price_shown" | "prices_compared" | "option_selected" | "lead" | "converted";
112
+ type EventType = "session.started" | "page.viewed" | "tool.called" | "quote.requested" | "quote.succeeded" | "quote.failed" | "link.clicked" | "purchase.completed" | "widget_render" | "widget_click" | "widget_link_click" | "widget_error" | "widget_scroll" | "widget_form_field" | "widget_form_submit" | "user.identified" | "price_shown" | "prices_compared" | "option_selected" | "lead_qualified" | "converted";
108
113
  /**
109
114
  * Properties for `page.viewed` — emitted once when the chat widget initializes
110
115
  * on a host page (the top of the funnel). Attributed to the anonymous
@@ -129,6 +134,8 @@ interface PageViewedProperties {
129
134
  interface ToolCalledProperties {
130
135
  name?: string;
131
136
  type?: "pricing" | "product_info" | "availability" | "support" | "other";
137
+ /** Retrieval traces for kb.search() calls made inside this tool handler. */
138
+ kbSearch?: KbSearchTrace[];
132
139
  }
133
140
  interface QuoteSucceededProperties {
134
141
  amount?: number;
@@ -160,7 +167,23 @@ interface OptionSelectedProperties {
160
167
  amount: number;
161
168
  currency: string;
162
169
  }
163
- interface LeadProperties {
170
+ /**
171
+ * Properties for `lead_qualified` — your code declaring that a person met your
172
+ * qualification bar (finished the qualifying questions, requested a demo,
173
+ * matched your target profile). Sharing an email mid-conversation is
174
+ * `identify(userId, { email })`, not a qualified lead.
175
+ */
176
+ interface LeadQualifiedProperties {
177
+ /**
178
+ * Your own lead id (e.g. the record id your lead-gen API returns). The
179
+ * strongest dedup key and the stable reference back to your system.
180
+ */
181
+ externalId?: string;
182
+ /** The lead's email, if known. */
183
+ email?: string;
184
+ /** The lead's name, if known. */
185
+ name?: string;
186
+ /** Acquisition source of the lead (e.g. "newsletter"). */
164
187
  source?: string;
165
188
  }
166
189
  interface ConvertedProperties {
@@ -231,8 +254,8 @@ type TrackEvent = ({
231
254
  event: "option_selected";
232
255
  properties?: OptionSelectedProperties;
233
256
  } & BaseTrackEvent) | ({
234
- event: "lead";
235
- properties?: LeadProperties;
257
+ event: "lead_qualified";
258
+ properties?: LeadQualifiedProperties;
236
259
  } & BaseTrackEvent) | ({
237
260
  event: "converted";
238
261
  properties?: ConvertedProperties;
@@ -262,12 +285,12 @@ interface RevenuePricesComparedInput extends TrackingContext, PricesComparedProp
262
285
  interface RevenueOptionSelectedInput extends TrackingContext, OptionSelectedProperties {
263
286
  }
264
287
  /**
265
- * Input for `track.lead()`. `source` is the lead's acquisition source
266
- * (the `lead` event property, e.g. "newsletter") — on this helper it shadows
267
- * the envelope `source` from the tracking context. To set a custom envelope
268
- * source on a lead, use the generic `track({ event: "lead", … })`.
288
+ * Input for `track.leadQualified()`. `source` is the lead's acquisition source
289
+ * (the event property, e.g. "newsletter") — on this helper it shadows the
290
+ * envelope `source` from the tracking context. To set a custom envelope source
291
+ * on a lead, use the generic `track({ event: "lead_qualified", … })`.
269
292
  */
270
- interface RevenueLeadInput extends TrackingContext, LeadProperties {
293
+ interface RevenueLeadQualifiedInput extends TrackingContext, LeadQualifiedProperties {
271
294
  }
272
295
  interface RevenueConvertedInput extends TrackingContext, ConvertedProperties {
273
296
  }
@@ -286,7 +309,7 @@ interface RevenueTrackingApi {
286
309
  optionSelected: (input: RevenueOptionSelectedInput) => Promise<{
287
310
  eventId: string;
288
311
  }>;
289
- lead: (input?: RevenueLeadInput) => Promise<{
312
+ leadQualified: (input?: RevenueLeadQualifiedInput) => Promise<{
290
313
  eventId: string;
291
314
  }>;
292
315
  converted: (input: RevenueConvertedInput) => Promise<{
@@ -295,7 +318,7 @@ interface RevenueTrackingApi {
295
318
  }
296
319
  /**
297
320
  * `client.track` — callable for generic events (`track(event)`), with the
298
- * revenue helpers attached flat: `track.priceShown()`, `track.lead()`,
321
+ * revenue helpers attached flat: `track.priceShown()`, `track.leadQualified()`,
299
322
  * `track.converted()`, etc.
300
323
  */
301
324
  interface TrackFn extends RevenueTrackingApi {
@@ -344,7 +367,7 @@ interface TrackingClient {
344
367
  * Returns a deterministic event id immediately after enqueue.
345
368
  *
346
369
  * Also exposes the revenue helpers flat: `client.track.priceShown()`,
347
- * `client.track.lead()`, `client.track.converted()`, etc.
370
+ * `client.track.leadQualified()`, `client.track.converted()`, etc.
348
371
  */
349
372
  track: TrackFn;
350
373
  /**
@@ -463,4 +486,4 @@ interface V2BatchResponse {
463
486
  */
464
487
  declare function waniwani(config?: WaniWaniConfig | WaniWaniProjectConfig): WaniWaniClient;
465
488
 
466
- export { type ComparedPriceOption, type ConvertedProperties, type EventType, type KbClient, type KbIngestFile, type KbIngestResult, type KbSearchOptions, type KbSource, type LeadProperties, type LegacyTrackEvent, type LinkClickedProperties, type OptionSelectedProperties, type PriceShownProperties, type PricesComparedProperties, type PurchaseCompletedProperties, type QuoteSucceededProperties, type RevenueConvertedInput, type RevenueLeadInput, type RevenueOptionSelectedInput, type RevenuePriceShownInput, type RevenuePricesComparedInput, type RevenueTrackingApi, 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, defineConfig, waniwani };
489
+ export { type ComparedPriceOption, type ConvertedProperties, type EventType, type KbClient, type KbIngestFile, type KbIngestResult, type KbSearchOptions, type KbSource, type LeadQualifiedProperties, type LegacyTrackEvent, type LinkClickedProperties, type OptionSelectedProperties, type PriceShownProperties, type PricesComparedProperties, type PurchaseCompletedProperties, type QuoteSucceededProperties, type RevenueConvertedInput, type RevenueLeadQualifiedInput, type RevenueOptionSelectedInput, type RevenuePriceShownInput, type RevenuePricesComparedInput, type RevenueTrackingApi, 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, defineConfig, waniwani };
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- var y=class extends Error{constructor(t,r){super(t);this.status=r;this.name="WaniWaniError"}};import{existsSync as L,readFileSync as V}from"fs";import{resolve as K}from"path";var N="waniwani.json",m;function k(){if(m!==void 0)return m;try{let e=K(process.cwd(),N);if(!L(e))return m=null,null;let n=V(e,"utf-8");return m=JSON.parse(n),m}catch{return m=null,null}}var R="__waniwani_config__";function q(e){return globalThis[R]=e,e}function x(){return globalThis[R]}var z="@waniwani/sdk";function b(e){let{apiUrl:n,apiKey:t}=e;function r(){if(!t)throw new Error("WANIWANI_API_KEY is not set");return t}async function i(s,o,a){let h=r(),g=`${n.replace(/\/$/,"")}${o}`,u={Authorization:`Bearer ${h}`,"X-WaniWani-SDK":z},c={method:s,headers:u};a!==void 0&&(u["Content-Type"]="application/json",c.body=JSON.stringify(a));let p=await fetch(g,c);if(!p.ok){let j=await p.text().catch(()=>"");throw new y(j||`KB API error: HTTP ${p.status}`,p.status)}return(await p.json()).data}return{async ingest(s){return i("POST","/api/mcp/kb/ingest",{files:s})},async search(s,o){return i("POST","/api/mcp/kb/search",{query:s,...o})},async sources(){return i("GET","/api/mcp/kb/sources")}}}function v(e,n){for(let t of n){let r=e[t];if(typeof r=="string"&&r.length>0)return r}}var Y=["waniwani/sessionId","openai/sessionId","openai/session","sessionId","conversationId","mcp-session-id"],$=["waniwani/requestId","openai/requestId","requestId","mcp/requestId"],H=["waniwani/traceId","openai/traceId","traceId","mcp/traceId","openai/requestId","requestId"],X=["waniwani/userId","openai/userId","externalUserId","userId","actorId"],G=["correlationId","openai/requestId"];function C(e){return e?v(e,Y):void 0}function _(e){return e?v(e,$):void 0}function P(e){return e?v(e,H):void 0}function M(e){return e?v(e,X):void 0}function A(e){return e?v(e,G):void 0}var J=[{key:"openai/sessionId",source:"chatgpt"},{key:"openai/session",source:"chatgpt"}],Z=[{needle:"claude",source:"claude"},{needle:"chatgpt",source:"chatgpt"},{needle:"openai",source:"chatgpt"},{needle:"gemini",source:"gemini"}];function D(e,n){if(e){let r=e["waniwani/source"];if(typeof r=="string"&&r.length>0)return r;for(let{key:i,source:s}of J){let o=e[i];if(typeof o=="string"&&o.length>0)return s}}let t=n?.name;if(typeof t=="string"&&t.length>0){let r=t.toLowerCase();for(let{needle:i,source:s}of Z)if(r.includes(i))return s}}var Q="@waniwani/sdk";function I(e,n={}){let t=n.now??(()=>new Date),r=n.generateId??W,i=ne(e),s=T(e.meta),o=T(e.metadata),a=re(e,s),h=d(e.eventId)??r(),g=ie(e.timestamp,t),u=d(e.source)??D(s)??n.source??Q,c=w(e)?{...e}:void 0,p={...o};return Object.keys(s).length>0&&(p.meta=s),c&&(p.rawLegacy=c),{id:h,type:"mcp.event",name:i,source:u,timestamp:g,correlation:a,properties:ee(e,i),metadata:p,rawLegacy:c}}function W(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?`evt_${crypto.randomUUID()}`:`evt_${Math.random().toString(36).slice(2,10)}_${Date.now().toString(36)}`}function ee(e,n){if(!w(e))return T(e.properties);let t=te(e,n),r=T(e.properties);return{...t,...r}}function te(e,n){switch(n){case"tool.called":{let t={};return d(e.toolName)&&(t.name=e.toolName),d(e.toolType)&&(t.type=e.toolType),t}case"quote.succeeded":{let t={};return typeof e.quoteAmount=="number"&&(t.amount=e.quoteAmount),d(e.quoteCurrency)&&(t.currency=e.quoteCurrency),t}case"link.clicked":{let t={};return d(e.linkUrl)&&(t.url=e.linkUrl),t}case"purchase.completed":{let t={};return typeof e.purchaseAmount=="number"&&(t.amount=e.purchaseAmount),d(e.purchaseCurrency)&&(t.currency=e.purchaseCurrency),t}default:return{}}}function ne(e){return w(e)?e.eventType:e.event}function re(e,n){let t=d(e.requestId)??_(n),r=d(e.sessionId)??C(n),i=d(e.traceId)??P(n),s=d(e.externalUserId)??M(n),o=d(e.correlationId)??A(n)??t,a={};return r&&(a.sessionId=r),i&&(a.traceId=i),t&&(a.requestId=t),o&&(a.correlationId=o),s&&(a.externalUserId=s),a}function ie(e,n){if(e instanceof Date)return e.toISOString();if(typeof e=="string"){let t=new Date(e);if(!Number.isNaN(t.getTime()))return t.toISOString()}return n().toISOString()}function T(e){return!e||typeof e!="object"||Array.isArray(e)?{}:e}function d(e){if(typeof e=="string"&&e.trim().length!==0)return e}function w(e){return"eventType"in e}function B(e){return{priceShown:({amount:n,currency:t,itemId:r,label:i,...s})=>e({event:"price_shown",properties:{amount:n,currency:t,itemId:r,label:i},...s}),pricesCompared:({options:n,...t})=>e({event:"prices_compared",properties:{options:n},...t}),optionSelected:({id:n,amount:t,currency:r,...i})=>e({event:"option_selected",properties:{id:n,amount:t,currency:r},...i}),lead:n=>{let{source:t,...r}=n??{};return e({event:"lead",properties:{source:t},...r})},converted:({amount:n,currency:t,occurredAt:r,...i})=>e({event:"converted",properties:{amount:n,currency:t,occurredAt:r},...i})}}var se="/api/mcp/events/v2/batch";var F="@waniwani/sdk",oe=new Set([401,403]),ae=new Set([408,425,429,500,502,503,504]);function U(e){return new S(e)}var S=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(n){this.endpointUrl=de(n.apiUrl,n.endpointPath??se),this.flushIntervalMs=n.flushIntervalMs??1e3,this.maxBatchSize=n.maxBatchSize??20,this.maxBufferSize=n.maxBufferSize??1e3,this.maxRetries=n.maxRetries??3,this.retryBaseDelayMs=n.retryBaseDelayMs??200,this.retryMaxDelayMs=n.retryMaxDelayMs??2e3,this.shutdownTimeoutMs=n.shutdownTimeoutMs??2e3,this.fetchFn=n.fetchFn??fetch,this.logger=n.logger??console,this.now=n.now??(()=>new Date),this.sleep=n.sleep??(t=>new Promise(r=>setTimeout(r,t))),this.apiKey=n.apiKey,this.sdkVersion=n.sdkVersion,this.flushIntervalMs>0&&(this.flushTimer=setInterval(()=>{this.flush()},this.flushIntervalMs))}enqueue(n){if(this.isStopped||this.isShuttingDown){this.logger.warn("[Waniwani] Tracking transport is stopped, dropping event %s",n.id);return}if(this.buffer.length>=this.maxBufferSize){let t=this.buffer.length-this.maxBufferSize+1;this.buffer.splice(0,t),this.logger.warn("[Waniwani] Tracking buffer overflow, dropped %d oldest event(s)",t)}if(this.buffer.push(n),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(n){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 t=n?.timeoutMs??this.shutdownTimeoutMs,r=this.flush();if(!Number.isFinite(t)||t<=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(t).then(()=>i)])===i?(this.isStopped=!0,{timedOut:!0,pendingEvents:this.pendingEvents()}):(this.isStopped=!0,{timedOut:!1,pendingEvents:this.pendingEvents()})}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 n=this.buffer.splice(0,this.maxBatchSize);await this.sendBatchWithRetry(n)}}async sendBatchWithRetry(n){let t=0,r=n;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(t>=this.maxRetries){this.logger.error("[Waniwani] Dropping %d event(s) after retry exhaustion: %s",r.length,i.reason);return}await this.sleep(this.backoffDelayMs(t)),t+=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(t>=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(t)),t+=1;continue}}}async sendBatchOnce(n){let t;try{t=await this.fetchFn(this.endpointUrl,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.apiKey}`,"X-WaniWani-SDK":F},body:JSON.stringify(this.makeBatchRequest(n))})}catch(s){return{kind:"retryable",reason:pe(s)}}if(oe.has(t.status))return{kind:"auth",status:t.status};if(ae.has(t.status))return{kind:"retryable",reason:`HTTP ${t.status}`};if(!t.ok)return{kind:"permanent",reason:`HTTP ${t.status}`};let r=await ue(t);if(!r?.rejected||r.rejected.length===0)return{kind:"success"};let i=this.classifyRejectedEvents(n,r.rejected);return i.retryable.length===0&&i.permanent.length===0?{kind:"success"}:{kind:"partial",retryable:i.retryable,permanent:i.permanent}}makeBatchRequest(n){return{sentAt:this.now().toISOString(),source:{sdk:F,version:this.sdkVersion??"0.0.0"},events:n}}classifyRejectedEvents(n,t){let r=new Map(n.map(o=>[o.id,o])),i=[],s=[];for(let o of t){let a=r.get(o.eventId);if(a){if(ce(o)){i.push(a);continue}s.push(a)}}return{retryable:i,permanent:s}}backoffDelayMs(n){let t=this.retryBaseDelayMs*2**n;return Math.min(t,this.retryMaxDelayMs)}stopTransportForAuthFailure(n,t){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)",n,t+r)}};function ce(e){if(e.retryable===!0)return!0;let n=e.code.toLowerCase();return n.includes("timeout")||n.includes("temporary")||n.includes("unavailable")||n.includes("rate_limit")||n.includes("transient")||n.includes("server")}async function ue(e){let n=await e.text();if(n)try{return JSON.parse(n)}catch{return}}function de(e,n){let t=e.endsWith("/")?e:`${e}/`,r=n.startsWith("/")?n.slice(1):n;return`${t}${r}`}function pe(e){return e instanceof Error?e.message:String(e)}function O(e){let{apiUrl:n,apiKey:t,tracking:r}=e;function i(){if(!t)throw new Error("WANIWANI_API_KEY is not set");return t}let s=t?U({apiUrl:n,apiKey:t,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 o(u){i();let c=I(u);return!c.correlation.sessionId&&!c.correlation.externalUserId&&console.warn(`[waniwani] event "${c.name}" has no sessionId or externalUserId; the ingest API requires one and will reject it.`),s?.enqueue(c),{eventId:c.id}}let a=async u=>o(u),h=Object.assign(a,B(a)),g={async identify(u,c,p){i();let E=I({event:"user.identified",externalUserId:u,properties:c,meta:p});return s?.enqueue(E),{eventId:E.id}},track:h,async flush(){i(),await s?.flush()},async shutdown(u){return i(),await s?.shutdown({timeoutMs:u?.timeoutMs??r.shutdownTimeoutMs})??{timedOut:!1,pendingEvents:0}}};return s&&le(g,r.shutdownTimeoutMs),g}function le(e,n){if(typeof process>"u"||typeof process.once!="function"||typeof process.on!="function")return;let t=()=>{e.shutdown({timeoutMs:n})};process.once("beforeExit",t),process.once("SIGINT",t),process.once("SIGTERM",t)}function fe(e){let t=e??k()??x(),r=t?.apiUrl??process.env.WANIWANI_API_URL??"https://app.waniwani.ai",i=t?.apiKey??process.env.WANIWANI_API_KEY,s={endpointPath:t?.tracking?.endpointPath??"/api/mcp/events/v2/batch",flushIntervalMs:t?.tracking?.flushIntervalMs??1e3,maxBatchSize:t?.tracking?.maxBatchSize??20,maxBufferSize:t?.tracking?.maxBufferSize??1e3,maxRetries:t?.tracking?.maxRetries??3,retryBaseDelayMs:t?.tracking?.retryBaseDelayMs??200,retryMaxDelayMs:t?.tracking?.retryMaxDelayMs??2e3,shutdownTimeoutMs:t?.tracking?.shutdownTimeoutMs??2e3},o={apiUrl:r,apiKey:i,tracking:s},a=O(o),h=b(o);return{...a,kb:h,_config:o}}export{y as WaniWaniError,q as defineConfig,fe as waniwani};
1
+ var y=class extends Error{constructor(t,r){super(t);this.status=r;this.name="WaniWaniError"}};import{existsSync as N,readFileSync as q}from"fs";import{resolve as z}from"path";var Y="waniwani.json",m;function R(){if(m!==void 0)return m;try{let e=z(process.cwd(),Y);if(!N(e))return m=null,null;let n=q(e,"utf-8");return m=JSON.parse(n),m}catch{return m=null,null}}var b="__waniwani_config__";function $(e){return globalThis[b]=e,e}function x(){return globalThis[b]}import{AsyncLocalStorage as H}from"async_hooks";var C=globalThis,T=C.__waniwaniKbRetrievalStore;T||(T=new H,C.__waniwaniKbRetrievalStore=T);var X=T;function _(e){try{X.getStore()?.searches.push(e)}catch{}}var G="@waniwani/sdk";function P(e){let{apiUrl:n,apiKey:t}=e;function r(){if(!t)throw new Error("WANIWANI_API_KEY is not set");return t}async function i(s,o,a){let p=r(),g=`${n.replace(/\/$/,"")}${o}`,u={Authorization:`Bearer ${p}`,"X-WaniWani-SDK":G},c={method:s,headers:u};a!==void 0&&(u["Content-Type"]="application/json",c.body=JSON.stringify(a));let l=await fetch(g,c);if(!l.ok){let V=await l.text().catch(()=>"");throw new y(V||`KB API error: HTTP ${l.status}`,l.status)}return(await l.json()).data}return{async ingest(s){return i("POST","/api/mcp/kb/ingest",{files:s})},async search(s,o){let a=await i("POST","/api/mcp/kb/search",{query:s,...o});return _({query:s,resultCount:a.length,results:a.map(p=>({source:p.source,heading:p.heading,score:p.score}))}),a},async sources(){return i("GET","/api/mcp/kb/sources")}}}function v(e,n){for(let t of n){let r=e[t];if(typeof r=="string"&&r.length>0)return r}}var Q=["waniwani/sessionId","openai/sessionId","openai/session","sessionId","conversationId","mcp-session-id"],J=["waniwani/requestId","openai/requestId","requestId","mcp/requestId"],Z=["waniwani/traceId","openai/traceId","traceId","mcp/traceId","openai/requestId","requestId"],ee=["waniwani/userId","openai/userId","externalUserId","userId","actorId"],te=["correlationId","openai/requestId"];function M(e){return e?v(e,Q):void 0}function A(e){return e?v(e,J):void 0}function D(e){return e?v(e,Z):void 0}function W(e){return e?v(e,ee):void 0}function B(e){return e?v(e,te):void 0}var ne=[{key:"openai/sessionId",source:"chatgpt"},{key:"openai/session",source:"chatgpt"}],re=[{needle:"claude",source:"claude"},{needle:"chatgpt",source:"chatgpt"},{needle:"openai",source:"chatgpt"},{needle:"gemini",source:"gemini"}];function F(e,n){if(e){let r=e["waniwani/source"];if(typeof r=="string"&&r.length>0)return r;for(let{key:i,source:s}of ne){let o=e[i];if(typeof o=="string"&&o.length>0)return s}}let t=n?.name;if(typeof t=="string"&&t.length>0){let r=t.toLowerCase();for(let{needle:i,source:s}of re)if(r.includes(i))return s}}var ie="@waniwani/sdk";function w(e,n={}){let t=n.now??(()=>new Date),r=n.generateId??L,i=ae(e),s=I(e.meta),o=I(e.metadata),a=ce(e,s),p=d(e.eventId)??r(),g=ue(e.timestamp,t),u=d(e.source)??F(s)??n.source??ie,c=E(e)?{...e}:void 0,l={...o};return Object.keys(s).length>0&&(l.meta=s),c&&(l.rawLegacy=c),{id:p,type:"mcp.event",name:i,source:u,timestamp:g,correlation:a,properties:se(e,i),metadata:l,rawLegacy:c}}function L(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?`evt_${crypto.randomUUID()}`:`evt_${Math.random().toString(36).slice(2,10)}_${Date.now().toString(36)}`}function se(e,n){if(!E(e))return I(e.properties);let t=oe(e,n),r=I(e.properties);return{...t,...r}}function oe(e,n){switch(n){case"tool.called":{let t={};return d(e.toolName)&&(t.name=e.toolName),d(e.toolType)&&(t.type=e.toolType),t}case"quote.succeeded":{let t={};return typeof e.quoteAmount=="number"&&(t.amount=e.quoteAmount),d(e.quoteCurrency)&&(t.currency=e.quoteCurrency),t}case"link.clicked":{let t={};return d(e.linkUrl)&&(t.url=e.linkUrl),t}case"purchase.completed":{let t={};return typeof e.purchaseAmount=="number"&&(t.amount=e.purchaseAmount),d(e.purchaseCurrency)&&(t.currency=e.purchaseCurrency),t}default:return{}}}function ae(e){return E(e)?e.eventType:e.event}function ce(e,n){let t=d(e.requestId)??A(n),r=d(e.sessionId)??M(n),i=d(e.traceId)??D(n),s=d(e.externalUserId)??W(n),o=d(e.correlationId)??B(n)??t,a={};return r&&(a.sessionId=r),i&&(a.traceId=i),t&&(a.requestId=t),o&&(a.correlationId=o),s&&(a.externalUserId=s),a}function ue(e,n){if(e instanceof Date)return e.toISOString();if(typeof e=="string"){let t=new Date(e);if(!Number.isNaN(t.getTime()))return t.toISOString()}return n().toISOString()}function I(e){return!e||typeof e!="object"||Array.isArray(e)?{}:e}function d(e){if(typeof e=="string"&&e.trim().length!==0)return e}function E(e){return"eventType"in e}function U(e){return{priceShown:({amount:n,currency:t,itemId:r,label:i,...s})=>e({event:"price_shown",properties:{amount:n,currency:t,itemId:r,label:i},...s}),pricesCompared:({options:n,...t})=>e({event:"prices_compared",properties:{options:n},...t}),optionSelected:({id:n,amount:t,currency:r,...i})=>e({event:"option_selected",properties:{id:n,amount:t,currency:r},...i}),leadQualified:n=>{let{externalId:t,email:r,name:i,source:s,...o}=n??{};return e({event:"lead_qualified",properties:{externalId:t,email:r,name:i,source:s},...o})},converted:({amount:n,currency:t,occurredAt:r,...i})=>e({event:"converted",properties:{amount:n,currency:t,occurredAt:r},...i})}}var de="/api/mcp/events/v2/batch";var j="@waniwani/sdk",pe=new Set([401,403]),le=new Set([408,425,429,500,502,503,504]);function O(e){return new k(e)}var k=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(n){this.endpointUrl=ge(n.apiUrl,n.endpointPath??de),this.flushIntervalMs=n.flushIntervalMs??1e3,this.maxBatchSize=n.maxBatchSize??20,this.maxBufferSize=n.maxBufferSize??1e3,this.maxRetries=n.maxRetries??3,this.retryBaseDelayMs=n.retryBaseDelayMs??200,this.retryMaxDelayMs=n.retryMaxDelayMs??2e3,this.shutdownTimeoutMs=n.shutdownTimeoutMs??2e3,this.fetchFn=n.fetchFn??fetch,this.logger=n.logger??console,this.now=n.now??(()=>new Date),this.sleep=n.sleep??(t=>new Promise(r=>setTimeout(r,t))),this.apiKey=n.apiKey,this.sdkVersion=n.sdkVersion,this.flushIntervalMs>0&&(this.flushTimer=setInterval(()=>{this.flush()},this.flushIntervalMs))}enqueue(n){if(this.isStopped||this.isShuttingDown){this.logger.warn("[Waniwani] Tracking transport is stopped, dropping event %s",n.id);return}if(this.buffer.length>=this.maxBufferSize){let t=this.buffer.length-this.maxBufferSize+1;this.buffer.splice(0,t),this.logger.warn("[Waniwani] Tracking buffer overflow, dropped %d oldest event(s)",t)}if(this.buffer.push(n),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(n){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 t=n?.timeoutMs??this.shutdownTimeoutMs,r=this.flush();if(!Number.isFinite(t)||t<=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(t).then(()=>i)])===i?(this.isStopped=!0,{timedOut:!0,pendingEvents:this.pendingEvents()}):(this.isStopped=!0,{timedOut:!1,pendingEvents:this.pendingEvents()})}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 n=this.buffer.splice(0,this.maxBatchSize);await this.sendBatchWithRetry(n)}}async sendBatchWithRetry(n){let t=0,r=n;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(t>=this.maxRetries){this.logger.error("[Waniwani] Dropping %d event(s) after retry exhaustion: %s",r.length,i.reason);return}await this.sleep(this.backoffDelayMs(t)),t+=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(t>=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(t)),t+=1;continue}}}async sendBatchOnce(n){let t;try{t=await this.fetchFn(this.endpointUrl,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.apiKey}`,"X-WaniWani-SDK":j},body:JSON.stringify(this.makeBatchRequest(n))})}catch(s){return{kind:"retryable",reason:me(s)}}if(pe.has(t.status))return{kind:"auth",status:t.status};if(le.has(t.status))return{kind:"retryable",reason:`HTTP ${t.status}`};if(!t.ok)return{kind:"permanent",reason:`HTTP ${t.status}`};let r=await he(t);if(!r?.rejected||r.rejected.length===0)return{kind:"success"};let i=this.classifyRejectedEvents(n,r.rejected);return i.retryable.length===0&&i.permanent.length===0?{kind:"success"}:{kind:"partial",retryable:i.retryable,permanent:i.permanent}}makeBatchRequest(n){return{sentAt:this.now().toISOString(),source:{sdk:j,version:this.sdkVersion??"0.0.0"},events:n}}classifyRejectedEvents(n,t){let r=new Map(n.map(o=>[o.id,o])),i=[],s=[];for(let o of t){let a=r.get(o.eventId);if(a){if(fe(o)){i.push(a);continue}s.push(a)}}return{retryable:i,permanent:s}}backoffDelayMs(n){let t=this.retryBaseDelayMs*2**n;return Math.min(t,this.retryMaxDelayMs)}stopTransportForAuthFailure(n,t){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)",n,t+r)}};function fe(e){if(e.retryable===!0)return!0;let n=e.code.toLowerCase();return n.includes("timeout")||n.includes("temporary")||n.includes("unavailable")||n.includes("rate_limit")||n.includes("transient")||n.includes("server")}async function he(e){let n=await e.text();if(n)try{return JSON.parse(n)}catch{return}}function ge(e,n){let t=e.endsWith("/")?e:`${e}/`,r=n.startsWith("/")?n.slice(1):n;return`${t}${r}`}function me(e){return e instanceof Error?e.message:String(e)}function K(e){let{apiUrl:n,apiKey:t,tracking:r}=e;function i(){if(!t)throw new Error("WANIWANI_API_KEY is not set");return t}let s=t?O({apiUrl:n,apiKey:t,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 o(u){i();let c=w(u);return!c.correlation.sessionId&&!c.correlation.externalUserId&&console.warn(`[waniwani] event "${c.name}" has no sessionId or externalUserId; the ingest API requires one and will reject it.`),s?.enqueue(c),{eventId:c.id}}let a=async u=>o(u),p=Object.assign(a,U(a)),g={async identify(u,c,l){i();let S=w({event:"user.identified",externalUserId:u,properties:c,meta:l});return s?.enqueue(S),{eventId:S.id}},track:p,async flush(){i(),await s?.flush()},async shutdown(u){return i(),await s?.shutdown({timeoutMs:u?.timeoutMs??r.shutdownTimeoutMs})??{timedOut:!1,pendingEvents:0}}};return s&&ye(g,r.shutdownTimeoutMs),g}function ye(e,n){if(typeof process>"u"||typeof process.once!="function"||typeof process.on!="function")return;let t=()=>{e.shutdown({timeoutMs:n})};process.once("beforeExit",t),process.once("SIGINT",t),process.once("SIGTERM",t)}function ve(e){let t=e??R()??x(),r=t?.apiUrl??process.env.WANIWANI_API_URL??"https://app.waniwani.ai",i=t?.apiKey??process.env.WANIWANI_API_KEY,s={endpointPath:t?.tracking?.endpointPath??"/api/mcp/events/v2/batch",flushIntervalMs:t?.tracking?.flushIntervalMs??1e3,maxBatchSize:t?.tracking?.maxBatchSize??20,maxBufferSize:t?.tracking?.maxBufferSize??1e3,maxRetries:t?.tracking?.maxRetries??3,retryBaseDelayMs:t?.tracking?.retryBaseDelayMs??200,retryMaxDelayMs:t?.tracking?.retryMaxDelayMs??2e3,shutdownTimeoutMs:t?.tracking?.shutdownTimeoutMs??2e3},o={apiUrl:r,apiKey:i,tracking:s},a=K(o),p=P(o);return{...a,kb:p,_config:o}}export{y as WaniWaniError,$ as defineConfig,ve as waniwani};
2
2
  //# sourceMappingURL=index.js.map