@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 +109 -65
- package/dist/index.js.map +1 -1
- package/dist/widget/widget.global.js +32 -32
- package/dist/widget/widget.global.js.map +1 -1
- package/lib/components/ChatWidget.css +5 -0
- package/package.json +3 -1
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
|
|
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
|
|
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 =
|
|
23915
|
+
const recognitionRef = useRef2(null);
|
|
23913
23916
|
const [countdownActive, setCountdownActive] = useState4(false);
|
|
23914
|
-
const silenceTimer =
|
|
23915
|
-
const finalTimer =
|
|
23916
|
-
const finalTextRef =
|
|
23917
|
-
const countdownFrameRef =
|
|
23918
|
-
const countdownEndRef =
|
|
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 =
|
|
24434
|
+
const theme = useMemo2(
|
|
24429
24435
|
() => ({ ...defaultTheme, ...styleProps || {} }),
|
|
24430
24436
|
[styleProps]
|
|
24431
24437
|
);
|
|
24432
|
-
const themeVariables =
|
|
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 =
|
|
24456
|
-
const scrollContainerRef =
|
|
24457
|
-
const isAtBottomRef =
|
|
24458
|
-
const textareaRef =
|
|
24459
|
-
const suppressScrollRef =
|
|
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 =
|
|
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 =
|
|
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
|
|
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 =
|
|
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 =
|
|
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
|
-
|
|
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: "
|
|
24983
|
+
toolId: "CPgsswom7FkUYvplmy6H",
|
|
24978
24984
|
inputs: {
|
|
24979
|
-
|
|
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
|
-
|
|
24985
|
-
const
|
|
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
|
-
|
|
25004
|
-
" ",
|
|
25005
|
-
data?.name ?? `Vendor ${v.id}`
|
|
25019
|
+
v.rank ? `#${v.rank} ` : "",
|
|
25020
|
+
name17
|
|
25006
25021
|
] }),
|
|
25007
|
-
|
|
25008
|
-
"\u2B50 ",
|
|
25009
|
-
data.rating.toFixed(1)
|
|
25010
|
-
] })
|
|
25022
|
+
hours && /* @__PURE__ */ jsx8("span", { style: { fontSize: "0.75rem", color: "#6b7280" }, children: hours })
|
|
25011
25023
|
] }),
|
|
25012
|
-
|
|
25013
|
-
/* @__PURE__ */
|
|
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.
|
|
25065
|
+
v.vendor_id
|
|
25022
25066
|
);
|
|
25023
25067
|
}) });
|
|
25024
25068
|
}
|