@ensembleapp/client-sdk 0.0.12 → 0.0.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -18627,7 +18627,7 @@ var DefaultChatTransport = class extends HttpChatTransport {
18627
18627
  };
18628
18628
 
18629
18629
  // lib/hooks/useChat.ts
18630
- import { useEffect, useState } from "react";
18630
+ import { useEffect, useMemo, useRef, useState } from "react";
18631
18631
  function useChat({
18632
18632
  api,
18633
18633
  threadId,
@@ -18641,6 +18641,29 @@ function useChat({
18641
18641
  onMessage
18642
18642
  }) {
18643
18643
  const { baseUrl, token, headers: customHeaders = {} } = api;
18644
+ const dataContextRef = useRef(dataContext);
18645
+ dataContextRef.current = dataContext;
18646
+ const transport = useMemo(() => new DefaultChatTransport({
18647
+ api: `${baseUrl}/chat`,
18648
+ headers: {
18649
+ "Content-Type": "application/json",
18650
+ Authorization: `Bearer ${token}`,
18651
+ "thread-id": threadId,
18652
+ ...agentId ? { "agent-id": agentId } : {},
18653
+ ...agentExecutionId ? { "agent-execution-id": agentExecutionId } : {},
18654
+ ...customHeaders
18655
+ },
18656
+ // only send last message to server
18657
+ prepareSendMessagesRequest({ messages: messages2, id }) {
18658
+ return {
18659
+ body: {
18660
+ id,
18661
+ message: messages2[messages2.length - 1],
18662
+ dataContext: dataContextRef.current
18663
+ }
18664
+ };
18665
+ }
18666
+ }), [baseUrl, token, threadId, agentId, agentExecutionId, customHeaders]);
18644
18667
  const {
18645
18668
  messages,
18646
18669
  status,
@@ -18649,27 +18672,7 @@ function useChat({
18649
18672
  setMessages
18650
18673
  } = useAIChat({
18651
18674
  id: threadId,
18652
- transport: new DefaultChatTransport({
18653
- api: `${baseUrl}/chat`,
18654
- headers: {
18655
- "Content-Type": "application/json",
18656
- Authorization: `Bearer ${token}`,
18657
- "thread-id": threadId,
18658
- ...agentId ? { "agent-id": agentId } : {},
18659
- ...agentExecutionId ? { "agent-execution-id": agentExecutionId } : {},
18660
- ...customHeaders
18661
- },
18662
- // only send last message to server
18663
- prepareSendMessagesRequest({ messages: messages2, id }) {
18664
- return {
18665
- body: {
18666
- id,
18667
- message: messages2[messages2.length - 1],
18668
- dataContext
18669
- }
18670
- };
18671
- }
18672
- }),
18675
+ transport,
18673
18676
  onError: (error40) => {
18674
18677
  console.error("Chat error:", error40);
18675
18678
  onError?.(error40);
@@ -18751,7 +18754,7 @@ function useChat({
18751
18754
  } else if (part.type === "data-ui") {
18752
18755
  part.data.forEach((widget) => addContent(widget));
18753
18756
  } else if (part.type === "data-thoughts") {
18754
- const thoughtOutputs = part.data.map((t) => t.output);
18757
+ const thoughtOutputs = part.data.map((t) => t.output).filter((output) => output != null);
18755
18758
  thoughts.push(...thoughtOutputs);
18756
18759
  } else if (part.type === "data-transfer") {
18757
18760
  } else if (part.type === "step-start") {
@@ -18909,11 +18912,11 @@ function styleInject(css, { insertAt } = {}) {
18909
18912
  }
18910
18913
 
18911
18914
  // lib/components/ChatWidget.css
18912
- styleInject(':root[data-chat-widget],\n[data-chat-widget] {\n --chat-primary: #3b82f6;\n --chat-primary-text: #ffffff;\n --chat-primary-hover: #2563eb;\n --chat-background: #ffffff;\n --chat-border: #e5e7eb;\n --chat-header-text: #ffffff;\n --chat-user-text: #ffffff;\n --chat-assistant-bg: transparent;\n --chat-assistant-text: #111827;\n --chat-font-family:\n "Inter",\n system-ui,\n -apple-system,\n BlinkMacSystemFont,\n sans-serif;\n --chat-radius: 0.75rem;\n --chat-input-bg: #ffffff;\n --chat-input-text: #111827;\n --chat-input-placeholder: #6b7280;\n --chat-thought-border: #d1d5db;\n --chat-font-size: 0.925rem;\n --chat-thought-font-size: 0.75rem;\n}\n.chat-widget {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n min-height: 24rem;\n background: var(--chat-background);\n border: 1px solid var(--chat-border);\n border-radius: var(--chat-radius);\n box-shadow: 0 20px 45px rgba(15, 23, 42, 0.12);\n overflow: hidden;\n font-family: var(--chat-font-family);\n color: var(--chat-assistant-text);\n}\n.chat-widget__header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n height: 40px;\n padding: 0.75rem 1rem;\n background: var(--chat-primary);\n color: var(--chat-header-text);\n}\n.chat-widget__title {\n margin: 0;\n font-size: 0.875rem;\n font-weight: 600;\n}\n.chat-widget__messages {\n flex: 1;\n overflow-y: auto;\n padding: 1rem;\n display: flex;\n flex-direction: column;\n gap: 1rem;\n}\n.chat-widget__message {\n display: flex;\n flex-direction: column;\n gap: 0;\n}\n.chat-widget__message-row {\n display: flex;\n}\n.chat-widget__message-row--user {\n justify-content: flex-end;\n}\n.chat-widget__message-row--assistant {\n justify-content: flex-start;\n}\n.chat-widget__bubble {\n max-width: 90%;\n padding: 0.5rem 0.25rem;\n border-radius: calc(var(--chat-radius) * 0.65);\n font-size: var(--chat-font-size);\n}\n.chat-widget__bubble--user {\n background: var(--chat-primary);\n color: var(--chat-user-text);\n border-bottom-right-radius: 0.35rem;\n}\n.chat-widget__bubble--assistant {\n background: var(--chat-assistant-bg);\n color: var(--chat-assistant-text);\n border-bottom-left-radius: 0.35rem;\n}\n.chat-widget__markdown {\n white-space: normal;\n font-size: var(--chat-font-size);\n}\n.chat-widget__markdown h1 {\n font-size: calc(var(--chat-font-size) * 1.4);\n}\n.chat-widget__markdown h2 {\n font-size: calc(var(--chat-font-size) * 1.25);\n}\n.chat-widget__markdown h3 {\n font-size: calc(var(--chat-font-size) * 1.1);\n}\n.chat-widget__markdown h4 {\n font-size: calc(var(--chat-font-size) * 1.05);\n}\n.chat-widget__markdown h5 {\n font-size: calc(var(--chat-font-size) * 1);\n}\n.chat-widget__markdown h6 {\n font-size: calc(var(--chat-font-size) * 0.95);\n}\n.chat-widget__anchor-button {\n position: fixed;\n bottom: 20px;\n right: 20px;\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.65rem 0.85rem;\n background: var(--chat-primary);\n color: var(--chat-primary-text);\n border: none;\n border-radius: 999px;\n box-shadow: 0 10px 25px rgba(15, 23, 42, 0.2);\n cursor: pointer;\n font-weight: 600;\n z-index: 99999;\n}\n.chat-widget__anchor-button:hover {\n background: var(--chat-primary-hover);\n}\n.chat-widget__anchor--left {\n right: auto;\n left: 20px;\n}\n.chat-widget__anchor-icon {\n width: 1.1rem;\n height: 1.1rem;\n}\n.chat-widget__popup {\n position: fixed;\n bottom: 80px;\n right: 20px;\n z-index: 99998;\n}\n.chat-widget__anchor--left.chat-widget__popup {\n right: auto;\n left: 20px;\n}\n.chat-widget__popup-inner {\n width: 384px;\n max-width: calc(100vw - 40px);\n height: 500px;\n max-height: calc(100vh - 140px);\n box-shadow: 0 20px 45px rgba(15, 23, 42, 0.12);\n border-radius: 12px;\n overflow: hidden;\n}\n.chat-widget__markdown table {\n width: 100%;\n border-collapse: collapse;\n margin: 0.5rem 0;\n}\n.chat-widget__markdown th,\n.chat-widget__markdown td {\n border: 1px solid var(--chat-border);\n padding: 0.5rem;\n text-align: left;\n vertical-align: top;\n}\n.chat-widget__markdown thead th {\n background: var(--chat-assistant-bg);\n color: var(--chat-assistant-text);\n font-weight: 600;\n}\n.chat-widget__thoughts {\n min-width: 0;\n --chat-font-size: var(--chat-thought-font-size);\n}\n.chat-widget__details {\n border: 0;\n}\n.chat-widget__thoughts-summary {\n list-style: none;\n display: flex;\n align-items: center;\n gap: 0.35rem;\n cursor: pointer;\n color: #6b7280;\n font-size: 0.8125rem;\n}\n.chat-widget__thoughts-summary:hover {\n color: var(--chat-assistant-text);\n}\n.chat-widget__thoughts-icon-container {\n display: flex;\n border: 1px solid #d1d5db;\n border-radius: 999px;\n align-items: center;\n justify-content: center;\n width: 1rem;\n height: 1rem;\n}\n.chat-widget__thoughts-icon {\n width: 0.75rem;\n height: 0.75rem;\n transition: transform 0.2s ease;\n}\n.chat-widget__details[open] .chat-widget__thoughts-icon {\n transform: rotate(90deg);\n}\n.chat-widget__thoughts-content {\n margin-top: 0.5rem;\n margin-left: 0.4rem;\n padding: 0.75rem;\n border-left: 2px solid var(--chat-thought-border);\n border-color: var(--chat-primary);\n max-width: 100%;\n overflow-x: auto;\n}\n.chat-widget__thoughts-text {\n margin: 0;\n line-height: 1.5;\n color: #4b5563;\n font-family:\n ui-monospace,\n SFMono-Regular,\n Menlo,\n Monaco,\n Consolas,\n "Liberation Mono",\n "Courier New",\n monospace;\n white-space: pre-wrap;\n word-break: break-word;\n overflow-wrap: anywhere;\n display: block;\n}\n.chat-widget__loading {\n display: flex;\n justify-content: flex-start;\n}\n.chat-widget__loading-bubble {\n background: var(--chat-assistant-bg);\n color: var(--chat-assistant-text);\n border-radius: calc(var(--chat-radius) * 0.65);\n border-bottom-left-radius: 0.35rem;\n padding: 0.5rem 0.75rem;\n}\n.chat-widget__loading-dots {\n display: flex;\n gap: 0.35rem;\n}\n.chat-widget__loading-dot {\n width: 0.5rem;\n height: 0.5rem;\n border-radius: 999px;\n background: #9ca3af;\n animation: chat-widget-bounce 1s infinite ease-in-out;\n}\n.chat-widget__loading-dot[data-delay="1"] {\n animation-delay: 0.1s;\n}\n.chat-widget__loading-dot[data-delay="2"] {\n animation-delay: 0.2s;\n}\n@keyframes chat-widget-bounce {\n 0%, 80%, 100% {\n transform: scale(0.6);\n opacity: 0.4;\n }\n 40% {\n transform: scale(1);\n opacity: 1;\n }\n}\n.chat-widget__input {\n border-top: 1px solid var(--chat-border);\n padding: 0.25rem 0 0.75rem;\n background: var(--chat-input-bg);\n}\n.chat-widget__form {\n position: relative;\n}\n.chat-widget__textarea {\n width: 100%;\n border: 0;\n padding: 0.75rem 5.25rem 0.75rem 0.75rem;\n background: transparent;\n font-size: 0.925rem;\n resize: none;\n color: var(--chat-input-text);\n font-family: inherit;\n}\n.chat-widget__textarea::-moz-placeholder {\n color: var(--chat-input-placeholder);\n}\n.chat-widget__textarea::placeholder {\n color: var(--chat-input-placeholder);\n}\n.chat-widget__textarea:focus-visible {\n outline: none;\n}\n.chat-widget__textarea:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n.chat-widget__toolbar {\n position: absolute;\n top: 0;\n right: 3.75rem;\n height: 100%;\n display: flex;\n align-items: center;\n padding: 0 0.5rem;\n border-right: 1px solid var(--chat-border);\n}\n.chat-widget__submit {\n position: absolute;\n top: 50%;\n right: 0.75rem;\n transform: translateY(-50%);\n background: transparent;\n border: 0;\n width: 2.5rem;\n height: 2.5rem;\n display: grid;\n place-items: center;\n color: var(--chat-primary);\n cursor: pointer;\n}\n.chat-widget__submit:disabled {\n color: #9ca3af;\n cursor: not-allowed;\n}\n.chat-widget__submit:not(:disabled):hover {\n color: var(--chat-primary-hover);\n}\n.chat-widget__send-icon {\n width: 1.2rem;\n height: 1.2rem;\n}\n.chat-widget__mic-button {\n position: relative;\n border: none;\n background: transparent;\n width: 2.25rem;\n height: 2.25rem;\n display: grid;\n place-items: center;\n color: var(--chat-primary);\n cursor: pointer;\n border-radius: 999px;\n}\n.chat-widget__mic-button:disabled {\n color: #9ca3af;\n cursor: not-allowed;\n}\n.chat-widget__mic-button--active {\n color: var(--chat-primary-hover);\n background: rgba(59, 130, 246, 0.08);\n}\n.chat-widget__mic-icon {\n width: 1rem;\n height: 1rem;\n}\n.chat-widget__mic-bar {\n position: absolute;\n bottom: 0.1rem;\n left: 50%;\n width: 16px;\n height: 2px;\n border-radius: 999px;\n background: rgba(148, 163, 184, 0.4);\n overflow: hidden;\n display: block;\n transform: translateX(-50%);\n pointer-events: none;\n}\n.chat-widget__mic-bar-fill {\n display: block;\n width: 100%;\n height: 100%;\n background: currentColor;\n transform-origin: left;\n transition: transform 0.12s linear;\n}\n.chat-widget__voice {\n display: flex;\n margin-top: 0.25rem;\n}\n.chat-widget__voice-button {\n border: none;\n background: none;\n display: inline-flex;\n align-items: center;\n gap: 0.35rem;\n padding: 0.1rem 0;\n font-size: 0.8rem;\n font-weight: 500;\n color: var(--chat-primary);\n cursor: pointer;\n}\n.chat-widget__voice-button:disabled {\n color: #9ca3af;\n cursor: not-allowed;\n}\n.chat-widget__voice-button--active {\n color: var(--chat-primary-hover);\n}\n.chat-widget__voice-icon {\n width: 0.95rem;\n height: 0.95rem;\n}\n.chat-widget__voice-icon--spin {\n animation: chat-widget-spin 1s linear infinite;\n}\n@keyframes chat-widget-spin {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n}\n');
18915
+ styleInject(':root[data-chat-widget],\n[data-chat-widget] {\n --chat-primary: #3b82f6;\n --chat-primary-text: #ffffff;\n --chat-primary-hover: #2563eb;\n --chat-background: #ffffff;\n --chat-border: #e5e7eb;\n --chat-header-text: #ffffff;\n --chat-user-text: #ffffff;\n --chat-assistant-bg: transparent;\n --chat-assistant-text: #111827;\n --chat-font-family:\n "Inter",\n system-ui,\n -apple-system,\n BlinkMacSystemFont,\n sans-serif;\n --chat-radius: 0.75rem;\n --chat-input-bg: #ffffff;\n --chat-input-text: #111827;\n --chat-input-placeholder: #6b7280;\n --chat-thought-border: #d1d5db;\n --chat-font-size: 0.925rem;\n --chat-thought-font-size: 0.75rem;\n}\n.chat-widget {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n min-height: 24rem;\n background: var(--chat-background);\n border: 1px solid var(--chat-border);\n border-radius: var(--chat-radius);\n box-shadow: 0 20px 45px rgba(15, 23, 42, 0.12);\n overflow: hidden;\n font-family: var(--chat-font-family);\n color: var(--chat-assistant-text);\n}\n.chat-widget__header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n height: 40px;\n padding: 0.75rem 1rem;\n background: var(--chat-primary);\n color: var(--chat-header-text);\n}\n.chat-widget__title {\n margin: 0;\n font-size: 0.875rem;\n font-weight: 600;\n}\n.chat-widget__messages {\n flex: 1;\n overflow-y: auto;\n padding: 1rem;\n display: flex;\n flex-direction: column;\n gap: 1rem;\n}\n.chat-widget__message {\n display: flex;\n flex-direction: column;\n gap: 0;\n}\n.chat-widget__message-row {\n display: flex;\n}\n.chat-widget__message-row--user {\n justify-content: flex-end;\n}\n.chat-widget__message-row--assistant {\n justify-content: flex-start;\n}\n.chat-widget__bubble {\n max-width: 90%;\n padding: 0.5rem 0.25rem;\n border-radius: calc(var(--chat-radius) * 0.65);\n font-size: var(--chat-font-size);\n}\n.chat-widget__bubble--user {\n background: var(--chat-primary);\n color: var(--chat-user-text);\n border-bottom-right-radius: 0.35rem;\n}\n.chat-widget__bubble--assistant {\n width: 90%;\n background: var(--chat-assistant-bg);\n color: var(--chat-assistant-text);\n border-bottom-left-radius: 0.35rem;\n}\n.chat-widget__widget {\n width: 100%;\n}\n.chat-widget__markdown {\n white-space: normal;\n font-size: var(--chat-font-size);\n}\n.chat-widget__markdown h1 {\n font-size: calc(var(--chat-font-size) * 1.4);\n}\n.chat-widget__markdown h2 {\n font-size: calc(var(--chat-font-size) * 1.25);\n}\n.chat-widget__markdown h3 {\n font-size: calc(var(--chat-font-size) * 1.1);\n}\n.chat-widget__markdown h4 {\n font-size: calc(var(--chat-font-size) * 1.05);\n}\n.chat-widget__markdown h5 {\n font-size: calc(var(--chat-font-size) * 1);\n}\n.chat-widget__markdown h6 {\n font-size: calc(var(--chat-font-size) * 0.95);\n}\n.chat-widget__anchor-button {\n position: fixed;\n bottom: 20px;\n right: 20px;\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.65rem 0.85rem;\n background: var(--chat-primary);\n color: var(--chat-primary-text);\n border: none;\n border-radius: 999px;\n box-shadow: 0 10px 25px rgba(15, 23, 42, 0.2);\n cursor: pointer;\n font-weight: 600;\n z-index: 99999;\n}\n.chat-widget__anchor-button:hover {\n background: var(--chat-primary-hover);\n}\n.chat-widget__anchor--left {\n right: auto;\n left: 20px;\n}\n.chat-widget__anchor-icon {\n width: 1.1rem;\n height: 1.1rem;\n}\n.chat-widget__popup {\n position: fixed;\n bottom: 80px;\n right: 20px;\n z-index: 99998;\n}\n.chat-widget__anchor--left.chat-widget__popup {\n right: auto;\n left: 20px;\n}\n.chat-widget__popup-inner {\n width: 384px;\n max-width: calc(100vw - 40px);\n height: 500px;\n max-height: calc(100vh - 140px);\n box-shadow: 0 20px 45px rgba(15, 23, 42, 0.12);\n border-radius: 12px;\n overflow: hidden;\n}\n.chat-widget__markdown table {\n width: 100%;\n border-collapse: collapse;\n margin: 0.5rem 0;\n}\n.chat-widget__markdown th,\n.chat-widget__markdown td {\n border: 1px solid var(--chat-border);\n padding: 0.5rem;\n text-align: left;\n vertical-align: top;\n}\n.chat-widget__markdown thead th {\n background: var(--chat-assistant-bg);\n color: var(--chat-assistant-text);\n font-weight: 600;\n}\n.chat-widget__thoughts {\n min-width: 0;\n --chat-font-size: var(--chat-thought-font-size);\n}\n.chat-widget__details {\n border: 0;\n}\n.chat-widget__thoughts-summary {\n list-style: none;\n display: flex;\n align-items: center;\n gap: 0.35rem;\n cursor: pointer;\n color: #6b7280;\n font-size: 0.8125rem;\n}\n.chat-widget__thoughts-summary:hover {\n color: var(--chat-assistant-text);\n}\n.chat-widget__thoughts-icon-container {\n display: flex;\n border: 1px solid #d1d5db;\n border-radius: 999px;\n align-items: center;\n justify-content: center;\n width: 1rem;\n height: 1rem;\n}\n.chat-widget__thoughts-icon {\n width: 0.75rem;\n height: 0.75rem;\n transition: transform 0.2s ease;\n}\n.chat-widget__details[open] .chat-widget__thoughts-icon {\n transform: rotate(90deg);\n}\n.chat-widget__thoughts-content {\n margin-top: 0.5rem;\n margin-left: 0.4rem;\n padding: 0.75rem;\n border-left: 2px solid var(--chat-thought-border);\n border-color: var(--chat-primary);\n max-width: 100%;\n overflow-x: auto;\n}\n.chat-widget__thoughts-text {\n margin: 0;\n line-height: 1.5;\n color: #4b5563;\n font-family:\n ui-monospace,\n SFMono-Regular,\n Menlo,\n Monaco,\n Consolas,\n "Liberation Mono",\n "Courier New",\n monospace;\n white-space: pre-wrap;\n word-break: break-word;\n overflow-wrap: anywhere;\n display: block;\n}\n.chat-widget__loading {\n display: flex;\n justify-content: flex-start;\n}\n.chat-widget__loading-bubble {\n background: var(--chat-assistant-bg);\n color: var(--chat-assistant-text);\n border-radius: calc(var(--chat-radius) * 0.65);\n border-bottom-left-radius: 0.35rem;\n padding: 0.5rem 0.75rem;\n}\n.chat-widget__loading-dots {\n display: flex;\n gap: 0.35rem;\n}\n.chat-widget__loading-dot {\n width: 0.5rem;\n height: 0.5rem;\n border-radius: 999px;\n background: #9ca3af;\n animation: chat-widget-bounce 1s infinite ease-in-out;\n}\n.chat-widget__loading-dot[data-delay="1"] {\n animation-delay: 0.1s;\n}\n.chat-widget__loading-dot[data-delay="2"] {\n animation-delay: 0.2s;\n}\n@keyframes chat-widget-bounce {\n 0%, 80%, 100% {\n transform: scale(0.6);\n opacity: 0.4;\n }\n 40% {\n transform: scale(1);\n opacity: 1;\n }\n}\n.chat-widget__input {\n border-top: 1px solid var(--chat-border);\n padding: 0.25rem 0 0.75rem;\n background: var(--chat-input-bg);\n}\n.chat-widget__form {\n position: relative;\n}\n.chat-widget__textarea {\n width: 100%;\n border: 0;\n padding: 0.75rem 5.25rem 0.75rem 0.75rem;\n background: transparent;\n font-size: 0.925rem;\n resize: none;\n color: var(--chat-input-text);\n font-family: inherit;\n}\n.chat-widget__textarea::-moz-placeholder {\n color: var(--chat-input-placeholder);\n}\n.chat-widget__textarea::placeholder {\n color: var(--chat-input-placeholder);\n}\n.chat-widget__textarea:focus-visible {\n outline: none;\n}\n.chat-widget__textarea:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n.chat-widget__toolbar {\n position: absolute;\n top: 0;\n right: 3.75rem;\n height: 100%;\n display: flex;\n align-items: center;\n padding: 0 0.5rem;\n border-right: 1px solid var(--chat-border);\n}\n.chat-widget__submit {\n position: absolute;\n top: 50%;\n right: 0.75rem;\n transform: translateY(-50%);\n background: transparent;\n border: 0;\n width: 2.5rem;\n height: 2.5rem;\n display: grid;\n place-items: center;\n color: var(--chat-primary);\n cursor: pointer;\n}\n.chat-widget__submit:disabled {\n color: #9ca3af;\n cursor: not-allowed;\n}\n.chat-widget__submit:not(:disabled):hover {\n color: var(--chat-primary-hover);\n}\n.chat-widget__send-icon {\n width: 1.2rem;\n height: 1.2rem;\n}\n.chat-widget__mic-button {\n position: relative;\n border: none;\n background: transparent;\n width: 2.25rem;\n height: 2.25rem;\n display: grid;\n place-items: center;\n color: var(--chat-primary);\n cursor: pointer;\n border-radius: 999px;\n}\n.chat-widget__mic-button:disabled {\n color: #9ca3af;\n cursor: not-allowed;\n}\n.chat-widget__mic-button--active {\n color: var(--chat-primary-hover);\n background: rgba(59, 130, 246, 0.08);\n}\n.chat-widget__mic-icon {\n width: 1rem;\n height: 1rem;\n}\n.chat-widget__mic-bar {\n position: absolute;\n bottom: 0.1rem;\n left: 50%;\n width: 16px;\n height: 2px;\n border-radius: 999px;\n background: rgba(148, 163, 184, 0.4);\n overflow: hidden;\n display: block;\n transform: translateX(-50%);\n pointer-events: none;\n}\n.chat-widget__mic-bar-fill {\n display: block;\n width: 100%;\n height: 100%;\n background: currentColor;\n transform-origin: left;\n transition: transform 0.12s linear;\n}\n.chat-widget__voice {\n display: flex;\n margin-top: 0.25rem;\n}\n.chat-widget__voice-button {\n border: none;\n background: none;\n display: inline-flex;\n align-items: center;\n gap: 0.35rem;\n padding: 0.1rem 0;\n font-size: 0.8rem;\n font-weight: 500;\n color: var(--chat-primary);\n cursor: pointer;\n}\n.chat-widget__voice-button:disabled {\n color: #9ca3af;\n cursor: not-allowed;\n}\n.chat-widget__voice-button--active {\n color: var(--chat-primary-hover);\n}\n.chat-widget__voice-icon {\n width: 0.95rem;\n height: 0.95rem;\n}\n.chat-widget__voice-icon--spin {\n animation: chat-widget-spin 1s linear infinite;\n}\n@keyframes chat-widget-spin {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n}\n');
18913
18916
 
18914
18917
  // lib/components/ChatWidget.tsx
18915
18918
  import { ChevronRight as ChevronRight2, Send, StopCircle } from "lucide-react";
18916
- import React3, { useCallback as useCallback4, useEffect as useEffect4, useMemo, useRef as useRef2, useState as useState6 } from "react";
18919
+ import React3, { useCallback as useCallback4, useEffect as useEffect4, useMemo as useMemo2, useRef as useRef3, useState as useState6 } from "react";
18917
18920
  import ReactMarkdown from "react-markdown";
18918
18921
 
18919
18922
  // ../../node_modules/ccount/index.js
@@ -23884,7 +23887,7 @@ import { Mic, MicOff } from "lucide-react";
23884
23887
  import {
23885
23888
  useCallback as useCallback3,
23886
23889
  useEffect as useEffect3,
23887
- useRef,
23890
+ useRef as useRef2,
23888
23891
  useState as useState4
23889
23892
  } from "react";
23890
23893
  import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
@@ -23909,13 +23912,13 @@ function SpeechToTextButton({
23909
23912
  const [isListening, setIsListening] = useState4(false);
23910
23913
  const [isSupported, setIsSupported] = useState4(false);
23911
23914
  const [countdown, setCountdown] = useState4(0);
23912
- const recognitionRef = useRef(null);
23915
+ const recognitionRef = useRef2(null);
23913
23916
  const [countdownActive, setCountdownActive] = useState4(false);
23914
- const silenceTimer = useRef(null);
23915
- const finalTimer = useRef(null);
23916
- const finalTextRef = useRef("");
23917
- const countdownFrameRef = useRef(null);
23918
- const countdownEndRef = useRef(0);
23917
+ const silenceTimer = useRef2(null);
23918
+ const finalTimer = useRef2(null);
23919
+ const finalTextRef = useRef2("");
23920
+ const countdownFrameRef = useRef2(null);
23921
+ const countdownEndRef = useRef2(0);
23919
23922
  const recognitionLanguage = language ?? "en-US";
23920
23923
  const clearSilenceTimer = useCallback3(() => {
23921
23924
  if (silenceTimer.current) {
@@ -24251,6 +24254,9 @@ function MessageItemComponent({
24251
24254
  onFeedbackSubmit
24252
24255
  }) {
24253
24256
  const renderContentItem = (item, key) => {
24257
+ if (item == null) {
24258
+ return null;
24259
+ }
24254
24260
  if (typeof item === "string") {
24255
24261
  return /* @__PURE__ */ jsx5("div", { className: "chat-widget__markdown", children: /* @__PURE__ */ jsx5(FormattedMarkdown, { children: item }) }, key);
24256
24262
  }
@@ -24425,11 +24431,11 @@ function ChatWidget({
24425
24431
  widgets,
24426
24432
  feedback
24427
24433
  }) {
24428
- const theme = useMemo(
24434
+ const theme = useMemo2(
24429
24435
  () => ({ ...defaultTheme, ...styleProps || {} }),
24430
24436
  [styleProps]
24431
24437
  );
24432
- const themeVariables = useMemo(
24438
+ const themeVariables = useMemo2(
24433
24439
  () => ({
24434
24440
  "--chat-primary": theme.primaryColor,
24435
24441
  "--chat-primary-text": theme.primaryTextColor,
@@ -24452,11 +24458,11 @@ function ChatWidget({
24452
24458
  const [input, setInput] = useState6("");
24453
24459
  const [isMicActive, setIsMicActive] = useState6(false);
24454
24460
  const [isSpeechPending, setIsSpeechPending] = useState6(false);
24455
- const messagesEndRef = useRef2(null);
24456
- const scrollContainerRef = useRef2(null);
24457
- const isAtBottomRef = useRef2(true);
24458
- const textareaRef = useRef2(null);
24459
- const suppressScrollRef = useRef2(false);
24461
+ const messagesEndRef = useRef3(null);
24462
+ const scrollContainerRef = useRef3(null);
24463
+ const isAtBottomRef = useRef3(true);
24464
+ const textareaRef = useRef3(null);
24465
+ const suppressScrollRef = useRef3(false);
24460
24466
  const {
24461
24467
  messages,
24462
24468
  status,
@@ -24501,7 +24507,7 @@ function ChatWidget({
24501
24507
  return next;
24502
24508
  });
24503
24509
  }, []);
24504
- const voiceConfig = useMemo(() => {
24510
+ const voiceConfig = useMemo2(() => {
24505
24511
  if (!voice || voice.enabled === false || !voice.url) {
24506
24512
  return null;
24507
24513
  }
@@ -24603,7 +24609,7 @@ function ChatWidget({
24603
24609
  setIsMicActive(false);
24604
24610
  }
24605
24611
  }, [speechEnabled]);
24606
- const lastRegisteredRef = useRef2({
24612
+ const lastRegisteredRef = useRef3({
24607
24613
  threadId: "",
24608
24614
  widgets: null
24609
24615
  });
@@ -24712,7 +24718,7 @@ styleInject(".chat-popup__anchor {\n position: fixed;\n inset-block-end: 20px;
24712
24718
 
24713
24719
  // lib/components/PopupChatWidget.tsx
24714
24720
  import { MessageSquare as MessageSquare2, X } from "lucide-react";
24715
- import { useEffect as useEffect5, useMemo as useMemo2, useState as useState7 } from "react";
24721
+ import { useEffect as useEffect5, useMemo as useMemo3, useState as useState7 } from "react";
24716
24722
  import { jsx as jsx6, jsxs as jsxs6 } from "react/jsx-runtime";
24717
24723
  function PopupChatWidget({ anchor, ...props }) {
24718
24724
  const [isOpen, setIsOpen] = useState7(anchor?.initiallyOpen ?? false);
@@ -24737,7 +24743,7 @@ function PopupChatWidget({ anchor, ...props }) {
24737
24743
  const anchorPositionClass = anchor?.position === "bottom-start" ? "chat-popup--start" : "chat-popup--end";
24738
24744
  const closeConfig = anchor?.closeButton ?? props.closeButton;
24739
24745
  const showClose = closeConfig?.show !== false;
24740
- const themeStyle = useMemo2(() => {
24746
+ const themeStyle = useMemo3(() => {
24741
24747
  const primary = props.styles?.primaryColor ?? "#3b82f6";
24742
24748
  const primaryText = props.styles?.primaryTextColor ?? "#ffffff";
24743
24749
  const background = props.styles?.backgroundColor ?? "#ffffff";
@@ -24761,7 +24767,7 @@ function PopupChatWidget({ anchor, ...props }) {
24761
24767
  "--chat-header-text": headerText
24762
24768
  };
24763
24769
  }, [props.styles]);
24764
- const popupStyle = useMemo2(() => {
24770
+ const popupStyle = useMemo3(() => {
24765
24771
  const size = props.popupSize ?? {};
24766
24772
  return {
24767
24773
  width: size.width ?? "600px",
@@ -24968,21 +24974,32 @@ var defaultChatWidgets = [
24968
24974
  widgetType: "vendor-cards",
24969
24975
  schema: zod_default.object({
24970
24976
  vendors: zod_default.array(zod_default.object({
24971
- id: zod_default.string(),
24972
- rank: zod_default.number().describe("ranking position of the vendor from 1 to N"),
24973
- reason: zod_default.string().describe("reason for the vendor ranking")
24977
+ vendor_id: zod_default.string(),
24978
+ rank: zod_default.number().optional().describe("ranking position of the vendor from 1 to N when applicable"),
24979
+ reason: zod_default.string().optional().describe("reason for the vendor ranking when applicable")
24974
24980
  }))
24975
- }).describe("displaying a list of vendor cards with rankings and reasons"),
24981
+ }).describe("displaying a list of vendor cards with rankings and reasons. Only use this widget when calling Care Network vendor search tools."),
24976
24982
  enrich: {
24977
- toolId: "LEsUueB52QpakvN1n5HG",
24983
+ toolId: "CPgsswom7FkUYvplmy6H",
24978
24984
  inputs: {
24979
- ids: "${vendors|map('id')|join(',')}"
24985
+ vendorIds: "${vendors|map('vendor_id')|join(',')}"
24980
24986
  }
24981
24987
  },
24982
24988
  render: ({ payload, enrichedResult }) => {
24989
+ const typedPayload = payload;
24983
24990
  const vendorData = enrichedResult?.data ?? {};
24984
- return /* @__PURE__ */ jsx8("div", { style: { display: "flex", flexDirection: "column", gap: "0.75rem" }, children: payload.vendors.map((v) => {
24985
- const data = vendorData[v.id];
24991
+ const formatLanguage = (code3) => {
24992
+ const langMap = { en: "English", es: "Spanish", zh: "Chinese", fr: "French" };
24993
+ return langMap[code3.trim()] || code3.trim();
24994
+ };
24995
+ return /* @__PURE__ */ jsx8("div", { style: { display: "flex", flexDirection: "column", gap: "0.75rem" }, children: typedPayload.vendors.map((v) => {
24996
+ const data = vendorData[v.vendor_id];
24997
+ const name17 = data?.names?.find((n) => n.type === "org")?.value ?? "Care Provider";
24998
+ const languages = data?.languages ?? [];
24999
+ const ageGroups = data?.details?.age_groups ?? [];
25000
+ const services = data?.details?.services ?? [];
25001
+ const address = data?.location?.formatted_address;
25002
+ const hours = data?.scheduling?.hours;
24986
25003
  return /* @__PURE__ */ jsxs7(
24987
25004
  "div",
24988
25005
  {
@@ -24999,26 +25016,53 @@ var defaultChatWidgets = [
24999
25016
  children: [
25000
25017
  /* @__PURE__ */ jsxs7("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "center" }, children: [
25001
25018
  /* @__PURE__ */ jsxs7("span", { style: { fontWeight: 600, fontSize: "1rem", color: "#111827" }, children: [
25002
- "#",
25003
- v.rank,
25004
- " ",
25005
- data?.name ?? `Vendor ${v.id}`
25019
+ v.rank ? `#${v.rank} ` : "",
25020
+ name17
25006
25021
  ] }),
25007
- data?.rating && /* @__PURE__ */ jsxs7("span", { style: { fontSize: "0.875rem", color: "#6b7280" }, children: [
25008
- "\u2B50 ",
25009
- data.rating.toFixed(1)
25010
- ] })
25022
+ hours && /* @__PURE__ */ jsx8("span", { style: { fontSize: "0.75rem", color: "#6b7280" }, children: hours })
25011
25023
  ] }),
25012
- data?.description && /* @__PURE__ */ jsx8("div", { style: { fontSize: "0.875rem", color: "#6b7280" }, children: data.description }),
25013
- /* @__PURE__ */ jsxs7("div", { style: { fontSize: "0.875rem", color: "#374151" }, children: [
25024
+ address && /* @__PURE__ */ jsx8("div", { style: { fontSize: "0.875rem", color: "#6b7280" }, children: address }),
25025
+ services.length > 0 && /* @__PURE__ */ jsx8("div", { style: { display: "flex", flexWrap: "wrap", gap: "0.375rem" }, children: services.map((service) => /* @__PURE__ */ jsx8(
25026
+ "span",
25027
+ {
25028
+ style: {
25029
+ fontSize: "0.75rem",
25030
+ padding: "0.125rem 0.5rem",
25031
+ background: "#dbeafe",
25032
+ color: "#1e40af",
25033
+ borderRadius: "9999px"
25034
+ },
25035
+ children: service
25036
+ },
25037
+ service
25038
+ )) }),
25039
+ languages.length > 0 && /* @__PURE__ */ jsx8("div", { style: { display: "flex", flexWrap: "wrap", gap: "0.375rem" }, children: languages.map((lang) => /* @__PURE__ */ jsx8(
25040
+ "span",
25041
+ {
25042
+ style: {
25043
+ fontSize: "0.75rem",
25044
+ padding: "0.125rem 0.5rem",
25045
+ background: "#f3e8ff",
25046
+ color: "#7c3aed",
25047
+ borderRadius: "9999px"
25048
+ },
25049
+ children: formatLanguage(lang)
25050
+ },
25051
+ lang
25052
+ )) }),
25053
+ ageGroups.length > 0 && /* @__PURE__ */ jsxs7("div", { style: { fontSize: "0.75rem", color: "#6b7280" }, children: [
25054
+ /* @__PURE__ */ jsx8("strong", { children: "Ages:" }),
25055
+ " ",
25056
+ ageGroups.join(", ")
25057
+ ] }),
25058
+ v.reason && /* @__PURE__ */ jsxs7("div", { style: { fontSize: "0.875rem", color: "#374151" }, children: [
25014
25059
  /* @__PURE__ */ jsx8("strong", { children: "Why:" }),
25015
25060
  " ",
25016
25061
  v.reason
25017
- ] }),
25018
- data?.address && /* @__PURE__ */ jsx8("div", { style: { fontSize: "0.75rem", color: "#9ca3af" }, children: data.address })
25062
+ ] })
25019
25063
  ]
25020
25064
  },
25021
- v.id
25065
+ v.vendor_id
25022
25066
  );
25023
25067
  }) });
25024
25068
  }