open-ask-ai 0.2.8 → 0.3.1
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.cjs.js +26 -10
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.esm.js +26 -10
- package/dist/index.esm.js.map +1 -1
- package/dist/types/core/api/client.d.ts +3 -2
- package/dist/types/core/types/index.d.ts +1 -0
- package/package.json +1 -1
package/dist/index.cjs.js
CHANGED
|
@@ -32,23 +32,33 @@ var DialogPrimitive__namespace = /*#__PURE__*/_interopNamespaceDefault(DialogPri
|
|
|
32
32
|
|
|
33
33
|
/**
|
|
34
34
|
* API client for Ask AI widget
|
|
35
|
-
* Supports dynamic API URL configuration
|
|
35
|
+
* Supports dynamic API URL configuration and optional project-scoped API
|
|
36
36
|
*/
|
|
37
37
|
class APIClient {
|
|
38
|
-
constructor(baseUrl) {
|
|
38
|
+
constructor(baseUrl, projectId) {
|
|
39
39
|
Object.defineProperty(this, "baseUrl", {
|
|
40
40
|
enumerable: true,
|
|
41
41
|
configurable: true,
|
|
42
42
|
writable: true,
|
|
43
43
|
value: void 0
|
|
44
44
|
});
|
|
45
|
+
Object.defineProperty(this, "projectId", {
|
|
46
|
+
enumerable: true,
|
|
47
|
+
configurable: true,
|
|
48
|
+
writable: true,
|
|
49
|
+
value: void 0
|
|
50
|
+
});
|
|
45
51
|
this.baseUrl = baseUrl.replace(/\/$/, ''); // Remove trailing slash
|
|
52
|
+
this.projectId = projectId;
|
|
46
53
|
}
|
|
47
54
|
/**
|
|
48
55
|
* Create a new session
|
|
49
56
|
*/
|
|
50
57
|
async createSession() {
|
|
51
|
-
const
|
|
58
|
+
const url = this.projectId
|
|
59
|
+
? `${this.baseUrl}/api/projects/${this.projectId}/session`
|
|
60
|
+
: `${this.baseUrl}/api/session`;
|
|
61
|
+
const response = await fetch(url, {
|
|
52
62
|
method: 'POST',
|
|
53
63
|
headers: {
|
|
54
64
|
'Content-Type': 'application/json',
|
|
@@ -63,7 +73,10 @@ class APIClient {
|
|
|
63
73
|
* Delete a session
|
|
64
74
|
*/
|
|
65
75
|
async deleteSession(sessionId) {
|
|
66
|
-
const
|
|
76
|
+
const url = this.projectId
|
|
77
|
+
? `${this.baseUrl}/api/projects/${this.projectId}/session/${sessionId}`
|
|
78
|
+
: `${this.baseUrl}/api/session/${sessionId}`;
|
|
79
|
+
const response = await fetch(url, {
|
|
67
80
|
method: 'DELETE',
|
|
68
81
|
});
|
|
69
82
|
if (!response.ok) {
|
|
@@ -74,7 +87,10 @@ class APIClient {
|
|
|
74
87
|
* Ask a question and return the SSE stream response
|
|
75
88
|
*/
|
|
76
89
|
async askQuestion(sessionId, question, system, signal) {
|
|
77
|
-
const
|
|
90
|
+
const url = this.projectId
|
|
91
|
+
? `${this.baseUrl}/api/projects/${this.projectId}/ask`
|
|
92
|
+
: `${this.baseUrl}/api/ask`;
|
|
93
|
+
const response = await fetch(url, {
|
|
78
94
|
method: 'POST',
|
|
79
95
|
headers: {
|
|
80
96
|
'Content-Type': 'application/json',
|
|
@@ -507,8 +523,8 @@ function Trigger({ onClick, text = 'Ask AI', ariaLabel = 'Open AI assistant', cl
|
|
|
507
523
|
return (jsxRuntime.jsxs(Button, { onClick: onClick, variant: "outline", "aria-label": ariaLabel, className: classNames, children: [jsxRuntime.jsx(lucideReact.Sparkles, { className: styles$1.icon }), text && jsxRuntime.jsx("span", { children: text })] }));
|
|
508
524
|
}
|
|
509
525
|
|
|
510
|
-
var css_248z$2 = "/* ChatContainer 组件样式 */\n\n.container_FRFCj {\n flex: 1;\n min-height: 0;\n display: flex;\n flex-direction: column;\n}\n\n.messagesArea_Hi-49 {\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n/* Welcome Screen */\n.welcomeScreen_fJ8-E {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n text-align: center;\n}\n\n.welcomeMessage_unMIK {\n font-size: 18px;\n color: var(--ask-ai-foreground);\n margin-bottom: 16px;\n}\n\n.exampleQuestionsContainer_RBWq6 {\n margin-top: 24px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.exampleQuestionsTitle_Vurj8 {\n font-size: 14px;\n color: var(--ask-ai-muted);\n margin-bottom: 8px;\n}\n\n.exampleButton_6sOzR {\n display: block;\n width: 100%;\n text-align: left;\n padding: 8px 16px;\n font-size: 14px;\n color: var(--ask-ai-foreground);\n background-color: var(--ask-ai-button-bg);\n border: none;\n border-radius: var(--ask-ai-radius-md);\n cursor: pointer;\n transition: background-color var(--ask-ai-transition);\n}\n\n.exampleButton_6sOzR:hover {\n background-color: var(--ask-ai-border);\n}\n\n/* Messages */\n.messageWrapper_nsQr8 {\n display: flex;\n}\n\n.messageWrapper_nsQr8.user_s1Gzu {\n justify-content: flex-end;\n}\n\n.messageWrapper_nsQr8.assistant_xU0-H {\n justify-content: flex-start;\n}\n\n.message_jxpo4 {\n border-radius: var(--ask-ai-radius-lg);\n padding: 8px 16px;\n}\n\n.message_jxpo4.user_s1Gzu {\n max-width: 85%;\n background-color: var(--ask-ai-user-message-bg);\n color: var(--ask-ai-user-message-text);\n}\n\n.message_jxpo4.assistant_xU0-H {\n width: 100%;\n background-color: var(--ask-ai-ai-message-bg);\n color: var(--ask-ai-ai-message-text);\n}\n\n.messageText_neW3m {\n font-size: 14px;\n white-space: pre-wrap;\n}\n\n/* Markdown Styles */\n.markdown_mNC3q {\n font-size: 14px;\n line-height: 1.6;\n}\n\n.markdown_mNC3q > *:first-child {\n margin-top: 0;\n}\n\n.markdown_mNC3q > *:last-child {\n margin-bottom: 0;\n}\n\n/* Tool Calls */\n.toolCallsContainer_1nUsV {\n display: flex;\n flex-direction: column;\n align-items: start;\n gap: 8px;\n margin-bottom: 8px;\n}\n\n.toolCall_gEKn0 {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 12px;\n font-size: 12px;\n background-color: var(--ask-ai-border);\n border-radius: 12px;\n white-space: nowrap;\n}\n\n.toolCall_gEKn0.
|
|
511
|
-
var styles = {"container":"container_FRFCj","messagesArea":"messagesArea_Hi-49","welcomeScreen":"welcomeScreen_fJ8-E","welcomeMessage":"welcomeMessage_unMIK","exampleQuestionsContainer":"exampleQuestionsContainer_RBWq6","exampleQuestionsTitle":"exampleQuestionsTitle_Vurj8","exampleButton":"exampleButton_6sOzR","messageWrapper":"messageWrapper_nsQr8","user":"user_s1Gzu","assistant":"assistant_xU0-H","message":"message_jxpo4","messageText":"messageText_neW3m","markdown":"markdown_mNC3q","toolCallsContainer":"toolCallsContainer_1nUsV","toolCall":"toolCall_gEKn0","completed":"
|
|
526
|
+
var css_248z$2 = "/* ChatContainer 组件样式 */\n\n.container_FRFCj {\n flex: 1;\n min-height: 0;\n display: flex;\n flex-direction: column;\n}\n\n.messagesArea_Hi-49 {\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n/* Welcome Screen */\n.welcomeScreen_fJ8-E {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n text-align: center;\n}\n\n.welcomeMessage_unMIK {\n font-size: 18px;\n color: var(--ask-ai-foreground);\n margin-bottom: 16px;\n}\n\n.exampleQuestionsContainer_RBWq6 {\n margin-top: 24px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.exampleQuestionsTitle_Vurj8 {\n font-size: 14px;\n color: var(--ask-ai-muted);\n margin-bottom: 8px;\n}\n\n.exampleButton_6sOzR {\n display: block;\n width: 100%;\n text-align: left;\n padding: 8px 16px;\n font-size: 14px;\n color: var(--ask-ai-foreground);\n background-color: var(--ask-ai-button-bg);\n border: none;\n border-radius: var(--ask-ai-radius-md);\n cursor: pointer;\n transition: background-color var(--ask-ai-transition);\n}\n\n.exampleButton_6sOzR:hover {\n background-color: var(--ask-ai-border);\n}\n\n/* Messages */\n.messageWrapper_nsQr8 {\n display: flex;\n}\n\n.messageWrapper_nsQr8.user_s1Gzu {\n justify-content: flex-end;\n}\n\n.messageWrapper_nsQr8.assistant_xU0-H {\n justify-content: flex-start;\n}\n\n.message_jxpo4 {\n border-radius: var(--ask-ai-radius-lg);\n padding: 8px 16px;\n}\n\n.message_jxpo4.user_s1Gzu {\n max-width: 85%;\n background-color: var(--ask-ai-user-message-bg);\n color: var(--ask-ai-user-message-text);\n}\n\n.message_jxpo4.assistant_xU0-H {\n width: 100%;\n background-color: var(--ask-ai-ai-message-bg);\n color: var(--ask-ai-ai-message-text);\n}\n\n.messageText_neW3m {\n font-size: 14px;\n white-space: pre-wrap;\n}\n\n/* Markdown Styles */\n.markdown_mNC3q {\n font-size: 14px;\n line-height: 1.6;\n}\n\n.markdown_mNC3q > *:first-child {\n margin-top: 0;\n}\n\n.markdown_mNC3q > *:last-child {\n margin-bottom: 0;\n}\n\n/* Tool Calls */\n.toolCallsContainer_1nUsV {\n display: flex;\n flex-direction: column;\n align-items: start;\n gap: 8px;\n margin-bottom: 8px;\n}\n\n.toolCall_gEKn0 {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 12px;\n font-size: 12px;\n background-color: var(--ask-ai-border);\n border-radius: 12px;\n white-space: nowrap;\n}\n\n.toolCall_gEKn0.tool-completed_5Utl8 {\n opacity: 0.7;\n}\n\n.toolCall_gEKn0.tool-pending_hifHC,\n.toolCall_gEKn0.tool-running_D0dCg {\n animation: pulse_STM-e 1.5s ease-in-out infinite;\n}\n\n.toolCall_gEKn0.tool-error_eqjRM {\n color: var(--ask-ai-error);\n}\n\n@keyframes pulse_STM-e {\n 0%, 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0.6;\n }\n}\n\n/* 段落 */\n.markdown_mNC3q p {\n display: block;\n margin: 0.5em 0;\n}\n\n/* 标题 */\n.markdown_mNC3q h1,\n.markdown_mNC3q h2,\n.markdown_mNC3q h3,\n.markdown_mNC3q h4,\n.markdown_mNC3q h5,\n.markdown_mNC3q h6 {\n display: block;\n margin: 1em 0 0.5em;\n font-weight: 600;\n line-height: 1.3;\n}\n\n.markdown_mNC3q h1 {\n font-size: 1.5em;\n}\n\n.markdown_mNC3q h2 {\n font-size: 1.3em;\n}\n\n.markdown_mNC3q h3 {\n font-size: 1.1em;\n}\n\n/* 无序列表 */\n.markdown_mNC3q ul {\n display: block;\n margin: 0.5em 0;\n padding-left: 1.5em;\n list-style-type: disc;\n list-style-position: outside;\n}\n\n/* 有序列表 */\n.markdown_mNC3q ol {\n display: block;\n margin: 0.5em 0;\n padding-left: 1.5em;\n list-style-type: decimal;\n list-style-position: outside;\n}\n\n/* 嵌套列表 */\n.markdown_mNC3q ul ul {\n list-style-type: circle;\n}\n\n.markdown_mNC3q ul ul ul {\n list-style-type: square;\n}\n\n.markdown_mNC3q ol ol {\n list-style-type: lower-alpha;\n}\n\n.markdown_mNC3q ol ol ol {\n list-style-type: lower-roman;\n}\n\n/* 列表项 */\n.markdown_mNC3q li {\n display: list-item;\n margin: 0.25em 0;\n}\n\n/* 文本样式 */\n.markdown_mNC3q strong,\n.markdown_mNC3q b {\n font-weight: bold;\n}\n\n.markdown_mNC3q em,\n.markdown_mNC3q i {\n font-style: italic;\n}\n\n.markdown_mNC3q u {\n text-decoration: underline;\n}\n\n.markdown_mNC3q s,\n.markdown_mNC3q del {\n text-decoration: line-through;\n}\n\n.markdown_mNC3q code {\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n font-size: 0.9em;\n padding: 0.15em 0.4em;\n background-color: var(--ask-ai-border);\n border-radius: 4px;\n}\n\n/* 代码块容器 */\n.markdown_mNC3q pre {\n margin: 0.75em 0;\n padding: 0.75em 1em;\n background-color: var(--ask-ai-code-bg);\n border-radius: var(--ask-ai-radius-md);\n overflow-x: auto;\n line-height: 1.5;\n}\n\n.markdown_mNC3q pre code {\n padding: 0;\n background-color: transparent;\n border-radius: 0;\n font-size: 0.85em;\n color: var(--ask-ai-code-text);\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n}\n\n/* Highlight.js 语法高亮样式 */\n.markdown_mNC3q .hljs-keyword,\n.markdown_mNC3q .hljs-selector-tag,\n.markdown_mNC3q .hljs-literal,\n.markdown_mNC3q .hljs-section,\n.markdown_mNC3q .hljs-link {\n color: var(--ask-ai-code-keyword);\n font-weight: bold;\n}\n\n.markdown_mNC3q .hljs-string,\n.markdown_mNC3q .hljs-regexp,\n.markdown_mNC3q .hljs-addition,\n.markdown_mNC3q .hljs-attribute,\n.markdown_mNC3q .hljs-meta-string {\n color: var(--ask-ai-code-string);\n}\n\n.markdown_mNC3q .hljs-number,\n.markdown_mNC3q .hljs-meta .hljs-keyword {\n color: var(--ask-ai-code-number);\n}\n\n.markdown_mNC3q .hljs-comment,\n.markdown_mNC3q .hljs-quote {\n color: var(--ask-ai-code-comment);\n font-style: italic;\n}\n\n.markdown_mNC3q .hljs-function,\n.markdown_mNC3q .hljs-title {\n color: var(--ask-ai-code-function);\n}\n\n.markdown_mNC3q .hljs-operator,\n.markdown_mNC3q .hljs-punctuation {\n color: var(--ask-ai-code-operator);\n}\n\n.markdown_mNC3q .hljs-variable,\n.markdown_mNC3q .hljs-property,\n.markdown_mNC3q .hljs-params {\n color: var(--ask-ai-code-variable);\n}\n\n.markdown_mNC3q .hljs-type,\n.markdown_mNC3q .hljs-class,\n.markdown_mNC3q .hljs-built_in {\n color: var(--ask-ai-code-type);\n}\n\n.markdown_mNC3q .hljs-builtin,\n.markdown_mNC3q .hljs-name {\n color: var(--ask-ai-code-builtin);\n}\n\n.markdown_mNC3q .hljs-tag {\n color: var(--ask-ai-code-tag);\n}\n\n.markdown_mNC3q .hljs-attr {\n color: var(--ask-ai-code-attr);\n}\n\n.markdown_mNC3q .hljs-deletion {\n color: var(--ask-ai-error);\n}\n\n.markdown_mNC3q .hljs-emphasis {\n font-style: italic;\n}\n\n.markdown_mNC3q .hljs-strong {\n font-weight: bold;\n}\n\n.markdown_mNC3q blockquote {\n margin: 0.5em 0;\n padding: 0.5em 1em;\n border-left: 3px solid var(--ask-ai-primary);\n background-color: var(--ask-ai-border);\n border-radius: 0 var(--ask-ai-radius-sm) var(--ask-ai-radius-sm) 0;\n}\n\n.markdown_mNC3q blockquote p {\n margin: 0;\n}\n\n.markdown_mNC3q a {\n color: var(--ask-ai-primary);\n text-decoration: none;\n}\n\n.markdown_mNC3q a:hover {\n text-decoration: underline;\n}\n\n.markdown_mNC3q table {\n width: 100%;\n margin: 0.75em 0;\n border-collapse: collapse;\n font-size: 0.9em;\n}\n\n.markdown_mNC3q th,\n.markdown_mNC3q td {\n padding: 0.5em 0.75em;\n border: 1px solid var(--ask-ai-border);\n text-align: left;\n}\n\n.markdown_mNC3q th {\n background-color: var(--ask-ai-border);\n font-weight: 600;\n}\n\n.markdown_mNC3q hr {\n margin: 1em 0;\n border: none;\n border-top: 1px solid var(--ask-ai-border);\n}\n\n.markdown_mNC3q img {\n max-width: 100%;\n height: auto;\n border-radius: var(--ask-ai-radius-md);\n}\n\n.cursor_9Dhwg {\n display: inline-block;\n width: 6px;\n height: 16px;\n background-color: currentColor;\n animation: blink_-4y-x 1s step-end infinite;\n}\n\n@keyframes blink_-4y-x {\n 0%, 50% {\n opacity: 0.75;\n }\n 50.01%, 100% {\n opacity: 0;\n }\n}\n\n/* Error */\n.error_uFX9a {\n padding: 16px;\n background-color: rgba(220, 38, 38, 0.1);\n color: var(--ask-ai-error);\n border-radius: var(--ask-ai-radius-md);\n font-size: 14px;\n}\n\n/* Input Area */\n.inputForm_nC0l- {\n border-top: 1px solid var(--ask-ai-border);\n padding: 16px;\n margin: 0;\n}\n\n.inputWrapper_zGeKy {\n display: flex;\n gap: 8px;\n align-items: flex-end;\n}\n\n.input_7lMOc {\n flex: 1;\n padding: 8px 16px;\n font-size: 14px;\n background-color: var(--ask-ai-background);\n border: 1px solid var(--ask-ai-border);\n border-radius: var(--ask-ai-radius-md);\n color: var(--ask-ai-foreground);\n font-family: inherit;\n resize: none;\n min-height: 40px;\n max-height: 200px;\n line-height: 1.5;\n overflow-y: auto;\n}\n\n.input_7lMOc:focus {\n outline: none;\n box-shadow: 0 0 0 2px var(--ask-ai-primary);\n}\n\n.input_7lMOc:disabled {\n opacity: 0.5;\n}\n\n.submitButton_2XrPY {\n height: 40px;\n padding: 8px;\n font-size: 14px;\n background-color: var(--ask-ai-primary);\n color: #ffffff;\n border: none;\n border-radius: var(--ask-ai-radius-md);\n cursor: pointer;\n transition: all var(--ask-ai-transition);\n}\n\n.submitButton_2XrPY:hover:not(:disabled) {\n background-color: var(--ask-ai-primary-hover);\n}\n\n.submitButton_2XrPY:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n";
|
|
527
|
+
var styles = {"container":"container_FRFCj","messagesArea":"messagesArea_Hi-49","welcomeScreen":"welcomeScreen_fJ8-E","welcomeMessage":"welcomeMessage_unMIK","exampleQuestionsContainer":"exampleQuestionsContainer_RBWq6","exampleQuestionsTitle":"exampleQuestionsTitle_Vurj8","exampleButton":"exampleButton_6sOzR","messageWrapper":"messageWrapper_nsQr8","user":"user_s1Gzu","assistant":"assistant_xU0-H","message":"message_jxpo4","messageText":"messageText_neW3m","markdown":"markdown_mNC3q","toolCallsContainer":"toolCallsContainer_1nUsV","toolCall":"toolCall_gEKn0","tool-completed":"tool-completed_5Utl8","tool-pending":"tool-pending_hifHC","tool-running":"tool-running_D0dCg","pulse":"pulse_STM-e","tool-error":"tool-error_eqjRM","cursor":"cursor_9Dhwg","blink":"blink_-4y-x","error":"error_uFX9a","inputForm":"inputForm_nC0l-","inputWrapper":"inputWrapper_zGeKy","input":"input_7lMOc","submitButton":"submitButton_2XrPY"};
|
|
512
528
|
styleInject(css_248z$2);
|
|
513
529
|
|
|
514
530
|
function ChatContainer({ texts, exampleQuestions, onMessage, onError, messages, isStreaming, error, sendMessage, input, setInput, }) {
|
|
@@ -616,16 +632,16 @@ function ChatContainer({ texts, exampleQuestions, onMessage, onError, messages,
|
|
|
616
632
|
// Welcome Screen
|
|
617
633
|
jsxRuntime.jsxs("div", { className: styles.welcomeScreen, children: [jsxRuntime.jsx("p", { className: styles.welcomeMessage, children: welcomeMessage }), exampleQuestions && exampleQuestions.length > 0 && (jsxRuntime.jsxs("div", { className: styles.exampleQuestionsContainer, children: [jsxRuntime.jsx("p", { className: styles.exampleQuestionsTitle, children: exampleQuestionsTitle }), exampleQuestions.map((question, index) => (jsxRuntime.jsx("button", { onClick: () => handleExampleClick(question), className: styles.exampleButton, children: question }, index)))] }))] })) : (
|
|
618
634
|
// Messages
|
|
619
|
-
jsxRuntime.jsx(jsxRuntime.Fragment, { children: messages.map((message) => (jsxRuntime.jsx("div", { className: `${styles.messageWrapper} ${styles[message.role]}`, children: jsxRuntime.jsx("div", { className: `${styles.message} ${styles[message.role]}`, children: message.role === 'assistant' ? (jsxRuntime.jsxs("div", { className: styles.markdown, children: [message.toolCalls && message.toolCalls.length > 0 && (jsxRuntime.jsx("div", { className: styles.toolCallsContainer, children: message.toolCalls.map((toolCall) => (jsxRuntime.jsxs("span", { className: `${styles.toolCall} ${styles[toolCall.status]}`, children: [getToolDisplayName(toolCall.tool), (toolCall.status === 'completed' || toolCall.status === 'error') ? '' : '...'] }, toolCall.callID))) })), jsxRuntime.jsx(ReactMarkdown, { remarkPlugins: [remarkGfm], rehypePlugins: [[rehypeHighlight, {
|
|
635
|
+
jsxRuntime.jsx(jsxRuntime.Fragment, { children: messages.map((message) => (jsxRuntime.jsx("div", { className: `${styles.messageWrapper} ${styles[message.role]}`, children: jsxRuntime.jsx("div", { className: `${styles.message} ${styles[message.role]}`, children: message.role === 'assistant' ? (jsxRuntime.jsxs("div", { className: styles.markdown, children: [message.toolCalls && message.toolCalls.length > 0 && (jsxRuntime.jsx("div", { className: styles.toolCallsContainer, children: message.toolCalls.map((toolCall) => (jsxRuntime.jsxs("span", { className: `${styles.toolCall} ${styles[`tool-${toolCall.status}`]}`, children: [getToolDisplayName(toolCall.tool), (toolCall.status === 'completed' || toolCall.status === 'error') ? '' : '...'] }, toolCall.callID))) })), jsxRuntime.jsx(ReactMarkdown, { remarkPlugins: [remarkGfm], rehypePlugins: [[rehypeHighlight, {
|
|
620
636
|
languages: lowlight.common,
|
|
621
637
|
prefix: 'hljs-'
|
|
622
638
|
}]], children: message.content }), message.isStreaming && (jsxRuntime.jsx("span", { className: styles.cursor }))] })) : (jsxRuntime.jsx("div", { className: styles.messageText, children: message.content })) }) }, message.id))) })), error && (jsxRuntime.jsx("div", { className: styles.error, children: error.message }))] }), jsxRuntime.jsx("form", { onSubmit: handleSubmit, className: styles.inputForm, children: jsxRuntime.jsxs("div", { className: styles.inputWrapper, children: [jsxRuntime.jsx("textarea", { ref: textareaRef, value: input, onChange: handleInputChange, onKeyDown: handleKeyDown, placeholder: inputPlaceholder, className: styles.input, rows: 1 }), jsxRuntime.jsx("button", { type: "submit", disabled: !input.trim() || isStreaming, className: styles.submitButton, children: jsxRuntime.jsx(lucideReact.ArrowUp, {}) })] }) })] }));
|
|
623
639
|
}
|
|
624
640
|
|
|
625
641
|
function Widget(props) {
|
|
626
|
-
const { apiUrl, drawerPosition = 'right', drawerWidth = 600, theme = 'light', texts, exampleQuestions, systemPrompt, hotkey, enableHotkey = true, onOpen, onClose, onMessage, onError, className, style, children, } = props;
|
|
642
|
+
const { apiUrl, projectId, drawerPosition = 'right', drawerWidth = 600, theme = 'light', texts, exampleQuestions, systemPrompt, hotkey, enableHotkey = true, onOpen, onClose, onMessage, onError, className, style, children, } = props;
|
|
627
643
|
const [isOpen, setIsOpen] = React__namespace.useState(false);
|
|
628
|
-
const [apiClient] = React__namespace.useState(() => new APIClient(apiUrl));
|
|
644
|
+
const [apiClient] = React__namespace.useState(() => new APIClient(apiUrl, projectId));
|
|
629
645
|
// Lift chat state to Widget level to persist across drawer open/close
|
|
630
646
|
const { messages, isStreaming, error, sendMessage, resetChat } = useChat({ apiClient, systemPrompt, texts });
|
|
631
647
|
// Input state also needs to persist
|
package/dist/index.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs.js","sources":["../src/core/api/client.ts","../src/core/hooks/useSession.ts","../src/core/hooks/useSSE.ts","../src/core/hooks/useChat.ts","../node_modules/style-inject/dist/style-inject.es.js","../src/components/ui/Button.tsx","../src/components/widget/Drawer.tsx","../src/components/widget/Trigger.tsx","../src/components/chat/ChatContainer.tsx","../src/components/widget/Widget.tsx"],"sourcesContent":["import type { SessionResponse } from '../types/index.js';\n\n/**\n * API client for Ask AI widget\n * Supports dynamic API URL configuration\n */\nexport class APIClient {\n private baseUrl: string;\n\n constructor(baseUrl: string) {\n this.baseUrl = baseUrl.replace(/\\/$/, ''); // Remove trailing slash\n }\n\n /**\n * Create a new session\n */\n async createSession(): Promise<SessionResponse> {\n const response = await fetch(`${this.baseUrl}/api/session`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to create session: ${response.statusText}`);\n }\n\n return response.json();\n }\n\n /**\n * Delete a session\n */\n async deleteSession(sessionId: string): Promise<void> {\n const response = await fetch(`${this.baseUrl}/api/session/${sessionId}`, {\n method: 'DELETE',\n });\n\n if (!response.ok) {\n throw new Error(`Failed to delete session: ${response.statusText}`);\n }\n }\n\n /**\n * Ask a question and return the SSE stream response\n */\n async askQuestion(\n sessionId: string,\n question: string,\n system?: string,\n signal?: AbortSignal\n ): Promise<Response> {\n const response = await fetch(`${this.baseUrl}/api/ask`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n sessionId,\n question,\n system,\n }),\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to ask question: ${response.statusText}`);\n }\n\n return response;\n }\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport type { APIClient } from '../api/client.js';\n\ninterface UseSessionOptions {\n apiClient: APIClient;\n}\n\ninterface UseSessionReturn {\n sessionId: string | null;\n isCreating: boolean;\n error: Error | null;\n initializeSession: () => Promise<string>;\n clearSession: () => Promise<void>;\n}\n\nexport function useSession({ apiClient }: UseSessionOptions): UseSessionReturn {\n const [sessionId, setSessionId] = useState<string | null>(null);\n const [isCreating, setIsCreating] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const initializeSession = useCallback(async () => {\n setIsCreating(true);\n setError(null);\n\n try {\n const { sessionId: newSessionId } = await apiClient.createSession();\n setSessionId(newSessionId);\n return newSessionId;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to create session');\n setError(error);\n console.error('Failed to create session:', error);\n throw error;\n } finally {\n setIsCreating(false);\n }\n }, [apiClient]);\n\n const clearSession = useCallback(async () => {\n setSessionId(null);\n setIsCreating(false);\n setError(null);\n }, [sessionId, apiClient, initializeSession]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (sessionId) {\n apiClient.deleteSession(sessionId).catch((err) => {\n console.error('Failed to cleanup session on unmount:', err);\n });\n }\n };\n }, [sessionId, apiClient]);\n\n return {\n sessionId,\n isCreating,\n error,\n initializeSession,\n clearSession,\n };\n}\n","import { useCallback } from 'react';\nimport type { SSEData } from '../types/index.js';\n\ninterface UseSSEOptions {\n onConnected?: () => void;\n onMessage?: (data: SSEData) => void;\n onDone?: () => void;\n onError?: (error: Error) => void;\n}\n\ninterface UseSSEReturn {\n handleSSEStream: (response: Response) => Promise<void>;\n}\n\n/**\n * Parse SSE chunk format: \"event: type\\ndata: json\\n\\n\"\n */\nfunction parseSSEChunk(chunk: string): Array<{ event: string; data: any }> {\n const events: Array<{ event: string; data: any }> = [];\n const lines = chunk.split('\\n');\n let currentEvent = '';\n let currentData = '';\n\n for (const line of lines) {\n if (line.startsWith('event: ')) {\n currentEvent = line.slice(7).trim();\n } else if (line.startsWith('data: ')) {\n currentData = line.slice(6).trim();\n } else if (line === '') {\n // Empty line marks end of event\n if (currentEvent && currentData) {\n try {\n const parsedData = JSON.parse(currentData);\n events.push({\n event: currentEvent,\n data: parsedData,\n });\n } catch (err) {\n console.error('Failed to parse SSE data:', currentData, err);\n }\n currentEvent = '';\n currentData = '';\n }\n }\n }\n\n return events;\n}\n\nexport function useSSE(options: UseSSEOptions = {}): UseSSEReturn {\n const { onConnected, onMessage, onDone, onError } = options;\n\n const handleSSEStream = useCallback(\n async (response: Response) => {\n const reader = response.body?.getReader();\n const decoder = new TextDecoder();\n\n if (!reader) {\n onError?.(new Error('No response body'));\n return;\n }\n\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n\n // Process complete events\n const events = parseSSEChunk(buffer);\n\n for (const { event, data } of events) {\n if (event === 'connected') {\n onConnected?.();\n onMessage?.(data);\n } else if (event === 'answer' || event === 'tool') {\n onMessage?.(data);\n } else if (event === 'done') {\n onDone?.();\n onMessage?.(data);\n } else if (event === 'error') {\n onError?.(new Error(data.error || 'Unknown error'));\n onMessage?.(data);\n }\n }\n\n // Clear processed events from buffer (keep incomplete data)\n const lastEventEnd = buffer.lastIndexOf('\\n\\n');\n if (lastEventEnd !== -1) {\n buffer = buffer.slice(lastEventEnd + 2);\n }\n }\n } catch (err) {\n // Don't report AbortError as it's an intentional cancellation\n if (err instanceof Error && err.name === 'AbortError') {\n return;\n }\n const error = err instanceof Error ? err : new Error('SSE stream error');\n onError?.(error);\n } finally {\n reader.releaseLock();\n }\n },\n [onConnected, onMessage, onDone, onError]\n );\n\n return {\n handleSSEStream,\n };\n}\n","import { useState, useCallback, useRef } from 'react';\nimport { useSession } from './useSession.js';\nimport { useSSE } from './useSSE.js';\nimport type { Message, WidgetTexts } from '../types/index.js';\nimport type { APIClient } from '../api/client.js';\n\ninterface UseChatOptions {\n apiClient: APIClient;\n systemPrompt?: string;\n texts?: WidgetTexts;\n}\n\ninterface UseChatReturn {\n messages: Message[];\n isStreaming: boolean;\n error: Error | null;\n sessionError: Error | null;\n isCreatingSession: boolean;\n sendMessage: (text: string) => Promise<void>;\n resetChat: () => Promise<void>;\n}\n\nlet idCounter = 0;\n\nfunction getMessageId() {\n idCounter += 1;\n return `msg-${idCounter}`; \n}\n\nexport function useChat({ apiClient, systemPrompt, texts }: UseChatOptions): UseChatReturn {\n const [messages, setMessages] = useState<Message[]>([]);\n const [isStreaming, setIsStreaming] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const abortControllerRef = useRef<AbortController | null>(null);\n\n const { sessionId, isCreating: isCreatingSession, error: sessionError, initializeSession, clearSession } = useSession({ apiClient });\n\n const { handleSSEStream } = useSSE({\n onConnected: () => {\n console.log('SSE connected');\n },\n onMessage: (data) => {\n if (data.type === 'answer' && data.text) {\n // Accumulate the answer text\n setMessages((prev) => {\n const lastMessage = prev[prev.length - 1];\n if (lastMessage && lastMessage.role === 'assistant' && lastMessage.isStreaming) {\n // Update the last assistant message\n return prev.slice(0, -1).concat({\n ...lastMessage,\n content: lastMessage.content + data.text,\n });\n }\n return prev;\n });\n } else if (data.type === 'tool') {\n // Handle tool updates\n setMessages((prev) => {\n const lastMessage = prev[prev.length - 1];\n if (lastMessage && lastMessage.role === 'assistant' && lastMessage.isStreaming) {\n // Get existing tool calls or create new array\n const existingToolCalls = lastMessage.toolCalls || [];\n\n // Find the tool call with this callID\n const toolIndex = existingToolCalls.findIndex(tc => tc.callID === data.callID);\n\n let updatedToolCalls;\n if (toolIndex >= 0) {\n // Update existing tool call\n updatedToolCalls = [...existingToolCalls];\n updatedToolCalls[toolIndex] = {\n callID: data.callID,\n tool: data.tool,\n status: data.status,\n };\n } else {\n // Add new tool call\n updatedToolCalls = [...existingToolCalls, {\n callID: data.callID,\n tool: data.tool,\n status: data.status,\n }];\n }\n\n return prev.slice(0, -1).concat({\n ...lastMessage,\n toolCalls: updatedToolCalls,\n });\n }\n return prev;\n });\n }\n },\n onDone: () => {\n // Mark streaming complete\n setMessages((prev) => {\n const lastMessage = prev[prev.length - 1];\n if (lastMessage && lastMessage.role === 'assistant') {\n // If AI didn't send any content, show a fallback message\n const emptyResponseText = texts?.emptyResponseText || 'Something went wrong. Please try again later.';\n const content = lastMessage.content.trim() || emptyResponseText;\n return prev.slice(0, -1).concat({\n ...lastMessage,\n content,\n isStreaming: false,\n });\n }\n return prev;\n });\n setIsStreaming(false);\n },\n onError: (err) => {\n setError(err);\n setIsStreaming(false);\n // Remove the failed assistant message\n setMessages((prev) => {\n const lastMessage = prev[prev.length - 1];\n if (lastMessage && lastMessage.role === 'assistant' && lastMessage.isStreaming) {\n return prev.slice(0, -1);\n }\n return prev;\n });\n },\n });\n\n const sendMessage = useCallback(\n async (text: string) => {\n if (!text.trim()) {\n return;\n }\n\n // Abort any ongoing request\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n\n // Create new AbortController for this request\n const abortController = new AbortController();\n abortControllerRef.current = abortController;\n\n setError(null);\n\n setIsStreaming(true);\n\n // Add user message immediately (optimistic UI)\n const userMessage: Message = {\n id: getMessageId(),\n role: 'user',\n content: text,\n timestamp: Date.now(),\n };\n setMessages((prev) => [...prev, userMessage]);\n\n // Add placeholder for assistant response\n const assistantMessage: Message = {\n id: getMessageId(),\n role: 'assistant',\n content: '',\n timestamp: Date.now(),\n isStreaming: true,\n };\n setMessages((prev) => [...prev, assistantMessage]);\n\n // Create session if it doesn't exist yet\n let currentSessionId = sessionId;\n if (!currentSessionId && !isCreatingSession) {\n try {\n currentSessionId = await initializeSession();\n } catch (err) {\n setError(new Error('Failed to create session'));\n setIsStreaming(false);\n return;\n }\n }\n\n // Wait for session to be created if it's currently being created\n if (isCreatingSession) {\n setError(new Error('Session is being created, please try again'));\n return;\n }\n\n if (!currentSessionId) {\n setError(new Error('No active session'));\n return;\n }\n\n try {\n const response = await apiClient.askQuestion(\n currentSessionId,\n text,\n systemPrompt,\n abortController.signal\n );\n await handleSSEStream(response);\n } catch (err) {\n // Don't treat aborted requests as errors\n if (err instanceof Error && err.name === 'AbortError') {\n return;\n }\n\n const error = err instanceof Error ? err : new Error('Failed to send message');\n setError(error);\n setIsStreaming(false);\n\n // Remove the failed messages\n setMessages((prev) => prev.slice(0, -2));\n } finally {\n // Clear the abort controller reference if this was the current one\n if (abortControllerRef.current === abortController) {\n abortControllerRef.current = null;\n }\n }\n },\n [sessionId, isCreatingSession, initializeSession, apiClient, handleSSEStream, systemPrompt]\n );\n\n const resetChat = useCallback(async () => {\n // Abort any ongoing request\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n abortControllerRef.current = null;\n }\n\n setMessages([]);\n setError(null);\n setIsStreaming(false);\n await clearSession();\n }, [clearSession]);\n\n return {\n messages,\n isStreaming,\n error,\n sessionError,\n isCreatingSession,\n sendMessage,\n resetChat,\n };\n}\n","function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","import * as React from 'react';\nimport { Slot } from '@radix-ui/react-slot';\nimport styles from './Button.module.css';\n\ntype ButtonVariant = 'default' | 'outline' | 'ghost' | 'icon';\ntype ButtonSize = 'default' | 'sm' | 'lg' | 'icon';\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n asChild?: boolean;\n variant?: ButtonVariant;\n size?: ButtonSize;\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant = 'default', size = 'default', asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : 'button';\n\n const classNames = [\n styles.button,\n styles[`variant-${variant}`],\n styles[`size-${size}`],\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <Comp\n className={classNames}\n ref={ref}\n {...props}\n />\n );\n }\n);\n\nButton.displayName = 'Button';\n\nexport { Button };\n","import * as React from 'react';\nimport * as DialogPrimitive from '@radix-ui/react-dialog';\nimport { Sparkles, X, RotateCcw } from 'lucide-react';\nimport { Button } from '../ui/Button.js';\nimport styles from './Drawer.module.css';\n\ninterface DrawerProps {\n isOpen: boolean;\n onClose: () => void;\n onNewSession?: () => void;\n hasMessages?: boolean;\n position?: 'right' | 'left';\n width?: number | string;\n title?: string;\n closeAriaLabel?: string;\n newSessionAriaLabel?: string;\n children?: React.ReactNode;\n theme?: 'light' | 'dark';\n}\n\nexport function Drawer({\n isOpen,\n onClose,\n onNewSession,\n hasMessages,\n position = 'right',\n width = 600,\n title = 'Ask AI',\n closeAriaLabel = 'Close',\n newSessionAriaLabel = 'New session',\n children,\n theme = 'light',\n}: DrawerProps) {\n const widthStyle = typeof width === 'number' ? `${width}px` : width;\n\n const contentClasses = [\n styles.content,\n styles[`position-${position}`],\n ].join(' ');\n\n // Create a portal container that inherits theme from the nearest .ask-ai ancestor\n const [portalContainer, setPortalContainer] = React.useState<HTMLElement | null>(null);\n\n React.useEffect(() => {\n if (typeof document === 'undefined') return;\n\n // Create a portal container with ask-ai class\n const container = document.createElement('div');\n container.className = `ask-ai${theme === 'dark' ? ' dark' : ''}`;\n document.body.appendChild(container);\n setPortalContainer(container);\n\n return () => {\n document.body.removeChild(container);\n };\n }, [theme]);\n\n return (\n <DialogPrimitive.Root open={isOpen} onOpenChange={(open) => !open && onClose()}>\n <DialogPrimitive.Portal container={portalContainer}>\n {/* Overlay */}\n <DialogPrimitive.Overlay className={styles.overlay} />\n\n {/* Drawer Content */}\n <DialogPrimitive.Content\n className={contentClasses}\n style={{ maxWidth: widthStyle }}\n >\n {/* Header */}\n <div className={styles.header}>\n <DialogPrimitive.Title className={styles.title}>\n <Sparkles className={styles.icon} />\n {title}\n </DialogPrimitive.Title>\n <div className={styles.headerActions}>\n {onNewSession && hasMessages && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label={newSessionAriaLabel}\n className={styles.newSessionButton}\n onClick={onNewSession}\n >\n <RotateCcw className={styles.newSessionIcon} />\n </Button>\n )}\n <DialogPrimitive.Close asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label={closeAriaLabel}\n className={styles.closeButton}\n >\n <X className={styles.closeIcon} />\n </Button>\n </DialogPrimitive.Close>\n </div>\n </div>\n\n {/* Content */}\n <div className={styles.body}>\n {children}\n </div>\n </DialogPrimitive.Content>\n </DialogPrimitive.Portal>\n </DialogPrimitive.Root>\n );\n}\n","import { Sparkles } from 'lucide-react';\nimport { Button } from '../ui/Button.js';\nimport styles from './Trigger.module.css';\n\ninterface TriggerProps {\n onClick: () => void;\n text?: string;\n ariaLabel?: string;\n className?: string;\n}\n\nexport function Trigger({\n onClick,\n text = 'Ask AI',\n ariaLabel = 'Open AI assistant',\n className,\n}: TriggerProps) {\n const classNames = [styles.trigger, className].filter(Boolean).join(' ');\n\n return (\n <Button\n onClick={onClick}\n variant=\"outline\"\n aria-label={ariaLabel}\n className={classNames}\n >\n <Sparkles className={styles.icon} />\n {text && <span>{text}</span>}\n </Button>\n );\n}\n","import * as React from 'react';\nimport ReactMarkdown from 'react-markdown';\nimport remarkGfm from 'remark-gfm';\nimport rehypeHighlight from 'rehype-highlight';\nimport { common } from 'lowlight';\nimport type { WidgetTexts, Message } from '../../core/types/index.js';\nimport styles from './ChatContainer.module.css';\nimport { ArrowUp } from 'lucide-react';\n\ninterface ChatContainerProps {\n texts?: WidgetTexts;\n exampleQuestions?: string[];\n onMessage?: (message: any) => void;\n onError?: (error: Error) => void;\n // Lifted state from parent\n messages: Message[];\n isStreaming: boolean;\n error: Error | null;\n sendMessage: (text: string) => Promise<void>;\n input: string;\n setInput: React.Dispatch<React.SetStateAction<string>>;\n}\n\nexport function ChatContainer({\n texts,\n exampleQuestions,\n onMessage,\n onError,\n messages,\n isStreaming,\n error,\n sendMessage,\n input,\n setInput,\n}: ChatContainerProps) {\n const textareaRef = React.useRef<HTMLTextAreaElement>(null);\n const messagesAreaRef = React.useRef<HTMLDivElement>(null);\n const shouldAutoScrollRef = React.useRef(true); // Track if auto-scroll is enabled\n\n // Check if user is at the bottom of the messages area\n const isAtBottom = React.useCallback(() => {\n const messagesArea = messagesAreaRef.current;\n if (!messagesArea) return true;\n\n const threshold = 50; // pixels from bottom to consider \"at bottom\"\n const scrollBottom = messagesArea.scrollHeight - messagesArea.scrollTop - messagesArea.clientHeight;\n return scrollBottom < threshold;\n }, []);\n\n // Scroll to bottom of messages area\n const scrollToBottom = React.useCallback(() => {\n const messagesArea = messagesAreaRef.current;\n if (messagesArea) {\n messagesArea.scrollTop = messagesArea.scrollHeight;\n }\n }, []);\n\n // Handle user scroll events\n const handleScroll = React.useCallback(() => {\n const atBottom = isAtBottom();\n shouldAutoScrollRef.current = atBottom;\n }, [isAtBottom]);\n\n // Auto-scroll when messages change (if enabled)\n React.useEffect(() => {\n if (shouldAutoScrollRef.current) {\n scrollToBottom();\n }\n }, [messages, scrollToBottom]);\n\n // Auto-resize textarea based on content\n const adjustTextareaHeight = React.useCallback(() => {\n const textarea = textareaRef.current;\n if (textarea) {\n textarea.style.height = 'auto';\n textarea.style.height = `${textarea.scrollHeight}px`;\n }\n }, []);\n\n // Call onError callback when error occurs\n React.useEffect(() => {\n if (error && onError) {\n onError(error);\n }\n }, [error, onError]);\n\n // Call onMessage callback when new message arrives\n React.useEffect(() => {\n if (messages.length > 0 && onMessage) {\n onMessage(messages[messages.length - 1]);\n }\n }, [messages, onMessage]);\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n const inputValue = input.trim();\n if (!inputValue || isStreaming) return;\n\n // Enable auto-scroll for new user message\n shouldAutoScrollRef.current = true;\n\n setInput('');\n await sendMessage(inputValue);\n // Reset textarea height after submission\n setTimeout(() => {\n if (textareaRef.current) {\n textareaRef.current.style.height = 'auto';\n }\n }, 0);\n };\n\n const handleInputChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n setInput(e.target.value);\n adjustTextareaHeight();\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n // Submit on Enter (without Shift)\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n if (input.trim() && !isStreaming) {\n handleSubmit(e as any);\n }\n }\n // Allow Shift+Enter for new line (default textarea behavior)\n };\n\n const handleExampleClick = async (question: string) => {\n if (isStreaming) return;\n // Enable auto-scroll for new user message\n shouldAutoScrollRef.current = true;\n await sendMessage(question);\n };\n\n const inputPlaceholder = texts?.inputPlaceholder || 'Ask a question...';\n const welcomeMessage = texts?.welcomeMessage || 'Hi! How can I help you today?';\n const exampleQuestionsTitle = texts?.exampleQuestionsTitle || 'Example questions:';\n\n // Helper function to format tool name\n const getToolDisplayName = (toolName: string) => {\n if (toolName.toLowerCase() === 'read') {\n return 'Reading docs';\n }\n if (toolName.toLowerCase() === 'task') {\n return 'Exploring docs';\n }\n return 'Searching docs';\n };\n\n return (\n <div className={styles.container}>\n {/* Messages Area */}\n <div\n ref={messagesAreaRef}\n onScroll={handleScroll}\n className={styles.messagesArea}\n >\n {messages.length === 0 ? (\n // Welcome Screen\n <div className={styles.welcomeScreen}>\n <p className={styles.welcomeMessage}>\n {welcomeMessage}\n </p>\n\n {exampleQuestions && exampleQuestions.length > 0 && (\n <div className={styles.exampleQuestionsContainer}>\n <p className={styles.exampleQuestionsTitle}>\n {exampleQuestionsTitle}\n </p>\n {exampleQuestions.map((question, index) => (\n <button\n key={index}\n onClick={() => handleExampleClick(question)}\n className={styles.exampleButton}\n >\n {question}\n </button>\n ))}\n </div>\n )}\n </div>\n ) : (\n // Messages\n <>\n {messages.map((message) => (\n <div\n key={message.id}\n className={`${styles.messageWrapper} ${styles[message.role]}`}\n >\n <div className={`${styles.message} ${styles[message.role]}`}>\n {message.role === 'assistant' ? (\n <div className={styles.markdown}>\n {/* Display tool calls if present */}\n {message.toolCalls && message.toolCalls.length > 0 && (\n <div className={styles.toolCallsContainer}>\n {message.toolCalls.map((toolCall) => (\n <span\n key={toolCall.callID}\n className={`${styles.toolCall} ${styles[toolCall.status]}`}\n >\n {getToolDisplayName(toolCall.tool)}\n {(toolCall.status === 'completed' || toolCall.status === 'error') ? '' : '...'}\n </span>\n ))}\n </div>\n )}\n <ReactMarkdown\n remarkPlugins={[remarkGfm]}\n rehypePlugins={[[rehypeHighlight, {\n languages: common,\n prefix: 'hljs-'\n }]]}\n >\n {message.content}\n </ReactMarkdown>\n {message.isStreaming && (\n <span className={styles.cursor} />\n )}\n </div>\n ) : (\n <div className={styles.messageText}>\n {message.content}\n </div>\n )}\n </div>\n </div>\n ))}\n </>\n )}\n\n {error && (\n <div className={styles.error}>\n {error.message}\n </div>\n )}\n </div>\n\n {/* Input Area */}\n <form onSubmit={handleSubmit} className={styles.inputForm}>\n <div className={styles.inputWrapper}>\n <textarea\n ref={textareaRef}\n value={input}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n placeholder={inputPlaceholder}\n className={styles.input}\n rows={1}\n />\n <button\n type=\"submit\"\n disabled={!input.trim() || isStreaming}\n className={styles.submitButton}\n >\n <ArrowUp />\n </button>\n </div>\n </form>\n </div>\n );\n}\n","import * as React from 'react';\nimport { APIClient } from '../../core/api/client.js';\nimport { useChat } from '../../core/hooks/useChat.js';\nimport type { WidgetProps } from '../../core/types/index.js';\nimport { Drawer } from './Drawer.js';\nimport { Trigger } from './Trigger.js';\nimport { ChatContainer } from '../chat/ChatContainer.js';\n\nexport function Widget(props: WidgetProps) {\n const {\n apiUrl,\n drawerPosition = 'right',\n drawerWidth = 600,\n theme = 'light',\n texts,\n exampleQuestions,\n systemPrompt,\n hotkey,\n enableHotkey = true,\n onOpen,\n onClose,\n onMessage,\n onError,\n className,\n style,\n children,\n } = props;\n\n const [isOpen, setIsOpen] = React.useState(false);\n const [apiClient] = React.useState(() => new APIClient(apiUrl));\n\n // Lift chat state to Widget level to persist across drawer open/close\n const { messages, isStreaming, error, sendMessage, resetChat } = useChat({ apiClient, systemPrompt, texts });\n\n // Input state also needs to persist\n const [input, setInput] = React.useState('');\n\n // Handle drawer open\n const handleOpen = React.useCallback(() => {\n setIsOpen(true);\n onOpen?.();\n }, [onOpen]);\n\n // Handle drawer close\n const handleClose = React.useCallback(() => {\n setIsOpen(false);\n onClose?.();\n }, [onClose]);\n\n // Handle new session\n const handleNewSession = React.useCallback(async () => {\n setInput('');\n await resetChat();\n }, [resetChat]);\n\n // Handle keyboard shortcut\n React.useEffect(() => {\n if (!enableHotkey || !hotkey) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n const keys = hotkey.toLowerCase().split('+');\n const ctrl = keys.includes('ctrl') || keys.includes('control');\n const cmd = keys.includes('cmd') || keys.includes('command') || keys.includes('meta');\n const shift = keys.includes('shift');\n const alt = keys.includes('alt');\n const key = keys[keys.length - 1];\n\n const ctrlPressed = ctrl && (e.ctrlKey || e.metaKey);\n const cmdPressed = cmd && (e.metaKey || e.ctrlKey);\n const shiftPressed = !shift || e.shiftKey;\n const altPressed = !alt || e.altKey;\n\n if ((ctrlPressed || cmdPressed) && shiftPressed && altPressed && e.key.toLowerCase() === key) {\n e.preventDefault();\n setIsOpen((prev) => !prev);\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [enableHotkey, hotkey]);\n\n return (\n <div className={`ask-ai ${className || ''} ${theme === 'dark' ? 'dark' : ''}`} style={style}>\n {/* Trigger Button - Custom or Default */}\n {children && React.isValidElement(children) ? (\n React.cloneElement(children, {\n ...children.props,\n onClick: (e: React.MouseEvent) => {\n // Call existing onClick if present\n const existingOnClick = children.props?.onClick;\n if (existingOnClick) {\n existingOnClick(e);\n }\n // Then call our handleOpen\n handleOpen();\n },\n })\n ) : (\n <Trigger\n onClick={handleOpen}\n text={texts?.triggerButtonText}\n ariaLabel={texts?.triggerButtonAriaLabel}\n />\n )}\n\n {/* Drawer with Chat */}\n <Drawer\n isOpen={isOpen}\n onClose={handleClose}\n onNewSession={handleNewSession}\n hasMessages={messages.length > 0}\n position={drawerPosition}\n width={drawerWidth}\n title={texts?.drawerTitle}\n closeAriaLabel={texts?.drawerCloseAriaLabel}\n newSessionAriaLabel={texts?.drawerNewSessionAriaLabel}\n theme={theme}\n >\n <ChatContainer\n texts={texts}\n exampleQuestions={exampleQuestions}\n onMessage={onMessage}\n onError={onError}\n messages={messages}\n isStreaming={isStreaming}\n error={error}\n sendMessage={sendMessage}\n input={input}\n setInput={setInput}\n />\n </Drawer>\n </div>\n );\n}\n"],"names":["useState","useCallback","useEffect","useRef","React","Slot","styles","_jsx","DialogPrimitive","_jsxs","Sparkles","RotateCcw","X","_Fragment","common","ArrowUp"],"mappings":"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","x_google_ignoreList":[4]}
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":["../src/core/api/client.ts","../src/core/hooks/useSession.ts","../src/core/hooks/useSSE.ts","../src/core/hooks/useChat.ts","../node_modules/style-inject/dist/style-inject.es.js","../src/components/ui/Button.tsx","../src/components/widget/Drawer.tsx","../src/components/widget/Trigger.tsx","../src/components/chat/ChatContainer.tsx","../src/components/widget/Widget.tsx"],"sourcesContent":["import type { SessionResponse } from '../types/index.js';\n\n/**\n * API client for Ask AI widget\n * Supports dynamic API URL configuration and optional project-scoped API\n */\nexport class APIClient {\n private baseUrl: string;\n private projectId?: string;\n\n constructor(baseUrl: string, projectId?: string) {\n this.baseUrl = baseUrl.replace(/\\/$/, ''); // Remove trailing slash\n this.projectId = projectId;\n }\n\n /**\n * Create a new session\n */\n async createSession(): Promise<SessionResponse> {\n const url = this.projectId\n ? `${this.baseUrl}/api/projects/${this.projectId}/session`\n : `${this.baseUrl}/api/session`;\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to create session: ${response.statusText}`);\n }\n\n return response.json();\n }\n\n /**\n * Delete a session\n */\n async deleteSession(sessionId: string): Promise<void> {\n const url = this.projectId\n ? `${this.baseUrl}/api/projects/${this.projectId}/session/${sessionId}`\n : `${this.baseUrl}/api/session/${sessionId}`;\n\n const response = await fetch(url, {\n method: 'DELETE',\n });\n\n if (!response.ok) {\n throw new Error(`Failed to delete session: ${response.statusText}`);\n }\n }\n\n /**\n * Ask a question and return the SSE stream response\n */\n async askQuestion(\n sessionId: string,\n question: string,\n system?: string,\n signal?: AbortSignal\n ): Promise<Response> {\n const url = this.projectId\n ? `${this.baseUrl}/api/projects/${this.projectId}/ask`\n : `${this.baseUrl}/api/ask`;\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n sessionId,\n question,\n system,\n }),\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to ask question: ${response.statusText}`);\n }\n\n return response;\n }\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport type { APIClient } from '../api/client.js';\n\ninterface UseSessionOptions {\n apiClient: APIClient;\n}\n\ninterface UseSessionReturn {\n sessionId: string | null;\n isCreating: boolean;\n error: Error | null;\n initializeSession: () => Promise<string>;\n clearSession: () => Promise<void>;\n}\n\nexport function useSession({ apiClient }: UseSessionOptions): UseSessionReturn {\n const [sessionId, setSessionId] = useState<string | null>(null);\n const [isCreating, setIsCreating] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const initializeSession = useCallback(async () => {\n setIsCreating(true);\n setError(null);\n\n try {\n const { sessionId: newSessionId } = await apiClient.createSession();\n setSessionId(newSessionId);\n return newSessionId;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to create session');\n setError(error);\n console.error('Failed to create session:', error);\n throw error;\n } finally {\n setIsCreating(false);\n }\n }, [apiClient]);\n\n const clearSession = useCallback(async () => {\n setSessionId(null);\n setIsCreating(false);\n setError(null);\n }, [sessionId, apiClient, initializeSession]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (sessionId) {\n apiClient.deleteSession(sessionId).catch((err) => {\n console.error('Failed to cleanup session on unmount:', err);\n });\n }\n };\n }, [sessionId, apiClient]);\n\n return {\n sessionId,\n isCreating,\n error,\n initializeSession,\n clearSession,\n };\n}\n","import { useCallback } from 'react';\nimport type { SSEData } from '../types/index.js';\n\ninterface UseSSEOptions {\n onConnected?: () => void;\n onMessage?: (data: SSEData) => void;\n onDone?: () => void;\n onError?: (error: Error) => void;\n}\n\ninterface UseSSEReturn {\n handleSSEStream: (response: Response) => Promise<void>;\n}\n\n/**\n * Parse SSE chunk format: \"event: type\\ndata: json\\n\\n\"\n */\nfunction parseSSEChunk(chunk: string): Array<{ event: string; data: any }> {\n const events: Array<{ event: string; data: any }> = [];\n const lines = chunk.split('\\n');\n let currentEvent = '';\n let currentData = '';\n\n for (const line of lines) {\n if (line.startsWith('event: ')) {\n currentEvent = line.slice(7).trim();\n } else if (line.startsWith('data: ')) {\n currentData = line.slice(6).trim();\n } else if (line === '') {\n // Empty line marks end of event\n if (currentEvent && currentData) {\n try {\n const parsedData = JSON.parse(currentData);\n events.push({\n event: currentEvent,\n data: parsedData,\n });\n } catch (err) {\n console.error('Failed to parse SSE data:', currentData, err);\n }\n currentEvent = '';\n currentData = '';\n }\n }\n }\n\n return events;\n}\n\nexport function useSSE(options: UseSSEOptions = {}): UseSSEReturn {\n const { onConnected, onMessage, onDone, onError } = options;\n\n const handleSSEStream = useCallback(\n async (response: Response) => {\n const reader = response.body?.getReader();\n const decoder = new TextDecoder();\n\n if (!reader) {\n onError?.(new Error('No response body'));\n return;\n }\n\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n\n // Process complete events\n const events = parseSSEChunk(buffer);\n\n for (const { event, data } of events) {\n if (event === 'connected') {\n onConnected?.();\n onMessage?.(data);\n } else if (event === 'answer' || event === 'tool') {\n onMessage?.(data);\n } else if (event === 'done') {\n onDone?.();\n onMessage?.(data);\n } else if (event === 'error') {\n onError?.(new Error(data.error || 'Unknown error'));\n onMessage?.(data);\n }\n }\n\n // Clear processed events from buffer (keep incomplete data)\n const lastEventEnd = buffer.lastIndexOf('\\n\\n');\n if (lastEventEnd !== -1) {\n buffer = buffer.slice(lastEventEnd + 2);\n }\n }\n } catch (err) {\n // Don't report AbortError as it's an intentional cancellation\n if (err instanceof Error && err.name === 'AbortError') {\n return;\n }\n const error = err instanceof Error ? err : new Error('SSE stream error');\n onError?.(error);\n } finally {\n reader.releaseLock();\n }\n },\n [onConnected, onMessage, onDone, onError]\n );\n\n return {\n handleSSEStream,\n };\n}\n","import { useState, useCallback, useRef } from 'react';\nimport { useSession } from './useSession.js';\nimport { useSSE } from './useSSE.js';\nimport type { Message, WidgetTexts } from '../types/index.js';\nimport type { APIClient } from '../api/client.js';\n\ninterface UseChatOptions {\n apiClient: APIClient;\n systemPrompt?: string;\n texts?: WidgetTexts;\n}\n\ninterface UseChatReturn {\n messages: Message[];\n isStreaming: boolean;\n error: Error | null;\n sessionError: Error | null;\n isCreatingSession: boolean;\n sendMessage: (text: string) => Promise<void>;\n resetChat: () => Promise<void>;\n}\n\nlet idCounter = 0;\n\nfunction getMessageId() {\n idCounter += 1;\n return `msg-${idCounter}`; \n}\n\nexport function useChat({ apiClient, systemPrompt, texts }: UseChatOptions): UseChatReturn {\n const [messages, setMessages] = useState<Message[]>([]);\n const [isStreaming, setIsStreaming] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const abortControllerRef = useRef<AbortController | null>(null);\n\n const { sessionId, isCreating: isCreatingSession, error: sessionError, initializeSession, clearSession } = useSession({ apiClient });\n\n const { handleSSEStream } = useSSE({\n onConnected: () => {\n console.log('SSE connected');\n },\n onMessage: (data) => {\n if (data.type === 'answer' && data.text) {\n // Accumulate the answer text\n setMessages((prev) => {\n const lastMessage = prev[prev.length - 1];\n if (lastMessage && lastMessage.role === 'assistant' && lastMessage.isStreaming) {\n // Update the last assistant message\n return prev.slice(0, -1).concat({\n ...lastMessage,\n content: lastMessage.content + data.text,\n });\n }\n return prev;\n });\n } else if (data.type === 'tool') {\n // Handle tool updates\n setMessages((prev) => {\n const lastMessage = prev[prev.length - 1];\n if (lastMessage && lastMessage.role === 'assistant' && lastMessage.isStreaming) {\n // Get existing tool calls or create new array\n const existingToolCalls = lastMessage.toolCalls || [];\n\n // Find the tool call with this callID\n const toolIndex = existingToolCalls.findIndex(tc => tc.callID === data.callID);\n\n let updatedToolCalls;\n if (toolIndex >= 0) {\n // Update existing tool call\n updatedToolCalls = [...existingToolCalls];\n updatedToolCalls[toolIndex] = {\n callID: data.callID,\n tool: data.tool,\n status: data.status,\n };\n } else {\n // Add new tool call\n updatedToolCalls = [...existingToolCalls, {\n callID: data.callID,\n tool: data.tool,\n status: data.status,\n }];\n }\n\n return prev.slice(0, -1).concat({\n ...lastMessage,\n toolCalls: updatedToolCalls,\n });\n }\n return prev;\n });\n }\n },\n onDone: () => {\n // Mark streaming complete\n setMessages((prev) => {\n const lastMessage = prev[prev.length - 1];\n if (lastMessage && lastMessage.role === 'assistant') {\n // If AI didn't send any content, show a fallback message\n const emptyResponseText = texts?.emptyResponseText || 'Something went wrong. Please try again later.';\n const content = lastMessage.content.trim() || emptyResponseText;\n return prev.slice(0, -1).concat({\n ...lastMessage,\n content,\n isStreaming: false,\n });\n }\n return prev;\n });\n setIsStreaming(false);\n },\n onError: (err) => {\n setError(err);\n setIsStreaming(false);\n // Remove the failed assistant message\n setMessages((prev) => {\n const lastMessage = prev[prev.length - 1];\n if (lastMessage && lastMessage.role === 'assistant' && lastMessage.isStreaming) {\n return prev.slice(0, -1);\n }\n return prev;\n });\n },\n });\n\n const sendMessage = useCallback(\n async (text: string) => {\n if (!text.trim()) {\n return;\n }\n\n // Abort any ongoing request\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n\n // Create new AbortController for this request\n const abortController = new AbortController();\n abortControllerRef.current = abortController;\n\n setError(null);\n\n setIsStreaming(true);\n\n // Add user message immediately (optimistic UI)\n const userMessage: Message = {\n id: getMessageId(),\n role: 'user',\n content: text,\n timestamp: Date.now(),\n };\n setMessages((prev) => [...prev, userMessage]);\n\n // Add placeholder for assistant response\n const assistantMessage: Message = {\n id: getMessageId(),\n role: 'assistant',\n content: '',\n timestamp: Date.now(),\n isStreaming: true,\n };\n setMessages((prev) => [...prev, assistantMessage]);\n\n // Create session if it doesn't exist yet\n let currentSessionId = sessionId;\n if (!currentSessionId && !isCreatingSession) {\n try {\n currentSessionId = await initializeSession();\n } catch (err) {\n setError(new Error('Failed to create session'));\n setIsStreaming(false);\n return;\n }\n }\n\n // Wait for session to be created if it's currently being created\n if (isCreatingSession) {\n setError(new Error('Session is being created, please try again'));\n return;\n }\n\n if (!currentSessionId) {\n setError(new Error('No active session'));\n return;\n }\n\n try {\n const response = await apiClient.askQuestion(\n currentSessionId,\n text,\n systemPrompt,\n abortController.signal\n );\n await handleSSEStream(response);\n } catch (err) {\n // Don't treat aborted requests as errors\n if (err instanceof Error && err.name === 'AbortError') {\n return;\n }\n\n const error = err instanceof Error ? err : new Error('Failed to send message');\n setError(error);\n setIsStreaming(false);\n\n // Remove the failed messages\n setMessages((prev) => prev.slice(0, -2));\n } finally {\n // Clear the abort controller reference if this was the current one\n if (abortControllerRef.current === abortController) {\n abortControllerRef.current = null;\n }\n }\n },\n [sessionId, isCreatingSession, initializeSession, apiClient, handleSSEStream, systemPrompt]\n );\n\n const resetChat = useCallback(async () => {\n // Abort any ongoing request\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n abortControllerRef.current = null;\n }\n\n setMessages([]);\n setError(null);\n setIsStreaming(false);\n await clearSession();\n }, [clearSession]);\n\n return {\n messages,\n isStreaming,\n error,\n sessionError,\n isCreatingSession,\n sendMessage,\n resetChat,\n };\n}\n","function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","import * as React from 'react';\nimport { Slot } from '@radix-ui/react-slot';\nimport styles from './Button.module.css';\n\ntype ButtonVariant = 'default' | 'outline' | 'ghost' | 'icon';\ntype ButtonSize = 'default' | 'sm' | 'lg' | 'icon';\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n asChild?: boolean;\n variant?: ButtonVariant;\n size?: ButtonSize;\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant = 'default', size = 'default', asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : 'button';\n\n const classNames = [\n styles.button,\n styles[`variant-${variant}`],\n styles[`size-${size}`],\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <Comp\n className={classNames}\n ref={ref}\n {...props}\n />\n );\n }\n);\n\nButton.displayName = 'Button';\n\nexport { Button };\n","import * as React from 'react';\nimport * as DialogPrimitive from '@radix-ui/react-dialog';\nimport { Sparkles, X, RotateCcw } from 'lucide-react';\nimport { Button } from '../ui/Button.js';\nimport styles from './Drawer.module.css';\n\ninterface DrawerProps {\n isOpen: boolean;\n onClose: () => void;\n onNewSession?: () => void;\n hasMessages?: boolean;\n position?: 'right' | 'left';\n width?: number | string;\n title?: string;\n closeAriaLabel?: string;\n newSessionAriaLabel?: string;\n children?: React.ReactNode;\n theme?: 'light' | 'dark';\n}\n\nexport function Drawer({\n isOpen,\n onClose,\n onNewSession,\n hasMessages,\n position = 'right',\n width = 600,\n title = 'Ask AI',\n closeAriaLabel = 'Close',\n newSessionAriaLabel = 'New session',\n children,\n theme = 'light',\n}: DrawerProps) {\n const widthStyle = typeof width === 'number' ? `${width}px` : width;\n\n const contentClasses = [\n styles.content,\n styles[`position-${position}`],\n ].join(' ');\n\n // Create a portal container that inherits theme from the nearest .ask-ai ancestor\n const [portalContainer, setPortalContainer] = React.useState<HTMLElement | null>(null);\n\n React.useEffect(() => {\n if (typeof document === 'undefined') return;\n\n // Create a portal container with ask-ai class\n const container = document.createElement('div');\n container.className = `ask-ai${theme === 'dark' ? ' dark' : ''}`;\n document.body.appendChild(container);\n setPortalContainer(container);\n\n return () => {\n document.body.removeChild(container);\n };\n }, [theme]);\n\n return (\n <DialogPrimitive.Root open={isOpen} onOpenChange={(open) => !open && onClose()}>\n <DialogPrimitive.Portal container={portalContainer}>\n {/* Overlay */}\n <DialogPrimitive.Overlay className={styles.overlay} />\n\n {/* Drawer Content */}\n <DialogPrimitive.Content\n className={contentClasses}\n style={{ maxWidth: widthStyle }}\n >\n {/* Header */}\n <div className={styles.header}>\n <DialogPrimitive.Title className={styles.title}>\n <Sparkles className={styles.icon} />\n {title}\n </DialogPrimitive.Title>\n <div className={styles.headerActions}>\n {onNewSession && hasMessages && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label={newSessionAriaLabel}\n className={styles.newSessionButton}\n onClick={onNewSession}\n >\n <RotateCcw className={styles.newSessionIcon} />\n </Button>\n )}\n <DialogPrimitive.Close asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label={closeAriaLabel}\n className={styles.closeButton}\n >\n <X className={styles.closeIcon} />\n </Button>\n </DialogPrimitive.Close>\n </div>\n </div>\n\n {/* Content */}\n <div className={styles.body}>\n {children}\n </div>\n </DialogPrimitive.Content>\n </DialogPrimitive.Portal>\n </DialogPrimitive.Root>\n );\n}\n","import { Sparkles } from 'lucide-react';\nimport { Button } from '../ui/Button.js';\nimport styles from './Trigger.module.css';\n\ninterface TriggerProps {\n onClick: () => void;\n text?: string;\n ariaLabel?: string;\n className?: string;\n}\n\nexport function Trigger({\n onClick,\n text = 'Ask AI',\n ariaLabel = 'Open AI assistant',\n className,\n}: TriggerProps) {\n const classNames = [styles.trigger, className].filter(Boolean).join(' ');\n\n return (\n <Button\n onClick={onClick}\n variant=\"outline\"\n aria-label={ariaLabel}\n className={classNames}\n >\n <Sparkles className={styles.icon} />\n {text && <span>{text}</span>}\n </Button>\n );\n}\n","import * as React from 'react';\nimport ReactMarkdown from 'react-markdown';\nimport remarkGfm from 'remark-gfm';\nimport rehypeHighlight from 'rehype-highlight';\nimport { common } from 'lowlight';\nimport type { WidgetTexts, Message } from '../../core/types/index.js';\nimport styles from './ChatContainer.module.css';\nimport { ArrowUp } from 'lucide-react';\n\ninterface ChatContainerProps {\n texts?: WidgetTexts;\n exampleQuestions?: string[];\n onMessage?: (message: any) => void;\n onError?: (error: Error) => void;\n // Lifted state from parent\n messages: Message[];\n isStreaming: boolean;\n error: Error | null;\n sendMessage: (text: string) => Promise<void>;\n input: string;\n setInput: React.Dispatch<React.SetStateAction<string>>;\n}\n\nexport function ChatContainer({\n texts,\n exampleQuestions,\n onMessage,\n onError,\n messages,\n isStreaming,\n error,\n sendMessage,\n input,\n setInput,\n}: ChatContainerProps) {\n const textareaRef = React.useRef<HTMLTextAreaElement>(null);\n const messagesAreaRef = React.useRef<HTMLDivElement>(null);\n const shouldAutoScrollRef = React.useRef(true); // Track if auto-scroll is enabled\n\n // Check if user is at the bottom of the messages area\n const isAtBottom = React.useCallback(() => {\n const messagesArea = messagesAreaRef.current;\n if (!messagesArea) return true;\n\n const threshold = 50; // pixels from bottom to consider \"at bottom\"\n const scrollBottom = messagesArea.scrollHeight - messagesArea.scrollTop - messagesArea.clientHeight;\n return scrollBottom < threshold;\n }, []);\n\n // Scroll to bottom of messages area\n const scrollToBottom = React.useCallback(() => {\n const messagesArea = messagesAreaRef.current;\n if (messagesArea) {\n messagesArea.scrollTop = messagesArea.scrollHeight;\n }\n }, []);\n\n // Handle user scroll events\n const handleScroll = React.useCallback(() => {\n const atBottom = isAtBottom();\n shouldAutoScrollRef.current = atBottom;\n }, [isAtBottom]);\n\n // Auto-scroll when messages change (if enabled)\n React.useEffect(() => {\n if (shouldAutoScrollRef.current) {\n scrollToBottom();\n }\n }, [messages, scrollToBottom]);\n\n // Auto-resize textarea based on content\n const adjustTextareaHeight = React.useCallback(() => {\n const textarea = textareaRef.current;\n if (textarea) {\n textarea.style.height = 'auto';\n textarea.style.height = `${textarea.scrollHeight}px`;\n }\n }, []);\n\n // Call onError callback when error occurs\n React.useEffect(() => {\n if (error && onError) {\n onError(error);\n }\n }, [error, onError]);\n\n // Call onMessage callback when new message arrives\n React.useEffect(() => {\n if (messages.length > 0 && onMessage) {\n onMessage(messages[messages.length - 1]);\n }\n }, [messages, onMessage]);\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n const inputValue = input.trim();\n if (!inputValue || isStreaming) return;\n\n // Enable auto-scroll for new user message\n shouldAutoScrollRef.current = true;\n\n setInput('');\n await sendMessage(inputValue);\n // Reset textarea height after submission\n setTimeout(() => {\n if (textareaRef.current) {\n textareaRef.current.style.height = 'auto';\n }\n }, 0);\n };\n\n const handleInputChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n setInput(e.target.value);\n adjustTextareaHeight();\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n // Submit on Enter (without Shift)\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n if (input.trim() && !isStreaming) {\n handleSubmit(e as any);\n }\n }\n // Allow Shift+Enter for new line (default textarea behavior)\n };\n\n const handleExampleClick = async (question: string) => {\n if (isStreaming) return;\n // Enable auto-scroll for new user message\n shouldAutoScrollRef.current = true;\n await sendMessage(question);\n };\n\n const inputPlaceholder = texts?.inputPlaceholder || 'Ask a question...';\n const welcomeMessage = texts?.welcomeMessage || 'Hi! How can I help you today?';\n const exampleQuestionsTitle = texts?.exampleQuestionsTitle || 'Example questions:';\n\n // Helper function to format tool name\n const getToolDisplayName = (toolName: string) => {\n if (toolName.toLowerCase() === 'read') {\n return 'Reading docs';\n }\n if (toolName.toLowerCase() === 'task') {\n return 'Exploring docs';\n }\n return 'Searching docs';\n };\n\n return (\n <div className={styles.container}>\n {/* Messages Area */}\n <div\n ref={messagesAreaRef}\n onScroll={handleScroll}\n className={styles.messagesArea}\n >\n {messages.length === 0 ? (\n // Welcome Screen\n <div className={styles.welcomeScreen}>\n <p className={styles.welcomeMessage}>\n {welcomeMessage}\n </p>\n\n {exampleQuestions && exampleQuestions.length > 0 && (\n <div className={styles.exampleQuestionsContainer}>\n <p className={styles.exampleQuestionsTitle}>\n {exampleQuestionsTitle}\n </p>\n {exampleQuestions.map((question, index) => (\n <button\n key={index}\n onClick={() => handleExampleClick(question)}\n className={styles.exampleButton}\n >\n {question}\n </button>\n ))}\n </div>\n )}\n </div>\n ) : (\n // Messages\n <>\n {messages.map((message) => (\n <div\n key={message.id}\n className={`${styles.messageWrapper} ${styles[message.role]}`}\n >\n <div className={`${styles.message} ${styles[message.role]}`}>\n {message.role === 'assistant' ? (\n <div className={styles.markdown}>\n {/* Display tool calls if present */}\n {message.toolCalls && message.toolCalls.length > 0 && (\n <div className={styles.toolCallsContainer}>\n {message.toolCalls.map((toolCall) => (\n <span\n key={toolCall.callID}\n className={`${styles.toolCall} ${styles[`tool-${toolCall.status}`]}`}\n >\n {getToolDisplayName(toolCall.tool)}\n {(toolCall.status === 'completed' || toolCall.status === 'error') ? '' : '...'}\n </span>\n ))}\n </div>\n )}\n <ReactMarkdown\n remarkPlugins={[remarkGfm]}\n rehypePlugins={[[rehypeHighlight, {\n languages: common,\n prefix: 'hljs-'\n }]]}\n >\n {message.content}\n </ReactMarkdown>\n {message.isStreaming && (\n <span className={styles.cursor} />\n )}\n </div>\n ) : (\n <div className={styles.messageText}>\n {message.content}\n </div>\n )}\n </div>\n </div>\n ))}\n </>\n )}\n\n {error && (\n <div className={styles.error}>\n {error.message}\n </div>\n )}\n </div>\n\n {/* Input Area */}\n <form onSubmit={handleSubmit} className={styles.inputForm}>\n <div className={styles.inputWrapper}>\n <textarea\n ref={textareaRef}\n value={input}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n placeholder={inputPlaceholder}\n className={styles.input}\n rows={1}\n />\n <button\n type=\"submit\"\n disabled={!input.trim() || isStreaming}\n className={styles.submitButton}\n >\n <ArrowUp />\n </button>\n </div>\n </form>\n </div>\n );\n}\n","import * as React from 'react';\nimport { APIClient } from '../../core/api/client.js';\nimport { useChat } from '../../core/hooks/useChat.js';\nimport type { WidgetProps } from '../../core/types/index.js';\nimport { Drawer } from './Drawer.js';\nimport { Trigger } from './Trigger.js';\nimport { ChatContainer } from '../chat/ChatContainer.js';\n\nexport function Widget(props: WidgetProps) {\n const {\n apiUrl,\n projectId,\n drawerPosition = 'right',\n drawerWidth = 600,\n theme = 'light',\n texts,\n exampleQuestions,\n systemPrompt,\n hotkey,\n enableHotkey = true,\n onOpen,\n onClose,\n onMessage,\n onError,\n className,\n style,\n children,\n } = props;\n\n const [isOpen, setIsOpen] = React.useState(false);\n const [apiClient] = React.useState(() => new APIClient(apiUrl, projectId));\n\n // Lift chat state to Widget level to persist across drawer open/close\n const { messages, isStreaming, error, sendMessage, resetChat } = useChat({ apiClient, systemPrompt, texts });\n\n // Input state also needs to persist\n const [input, setInput] = React.useState('');\n\n // Handle drawer open\n const handleOpen = React.useCallback(() => {\n setIsOpen(true);\n onOpen?.();\n }, [onOpen]);\n\n // Handle drawer close\n const handleClose = React.useCallback(() => {\n setIsOpen(false);\n onClose?.();\n }, [onClose]);\n\n // Handle new session\n const handleNewSession = React.useCallback(async () => {\n setInput('');\n await resetChat();\n }, [resetChat]);\n\n // Handle keyboard shortcut\n React.useEffect(() => {\n if (!enableHotkey || !hotkey) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n const keys = hotkey.toLowerCase().split('+');\n const ctrl = keys.includes('ctrl') || keys.includes('control');\n const cmd = keys.includes('cmd') || keys.includes('command') || keys.includes('meta');\n const shift = keys.includes('shift');\n const alt = keys.includes('alt');\n const key = keys[keys.length - 1];\n\n const ctrlPressed = ctrl && (e.ctrlKey || e.metaKey);\n const cmdPressed = cmd && (e.metaKey || e.ctrlKey);\n const shiftPressed = !shift || e.shiftKey;\n const altPressed = !alt || e.altKey;\n\n if ((ctrlPressed || cmdPressed) && shiftPressed && altPressed && e.key.toLowerCase() === key) {\n e.preventDefault();\n setIsOpen((prev) => !prev);\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [enableHotkey, hotkey]);\n\n return (\n <div className={`ask-ai ${className || ''} ${theme === 'dark' ? 'dark' : ''}`} style={style}>\n {/* Trigger Button - Custom or Default */}\n {children && React.isValidElement(children) ? (\n React.cloneElement(children, {\n ...children.props,\n onClick: (e: React.MouseEvent) => {\n // Call existing onClick if present\n const existingOnClick = children.props?.onClick;\n if (existingOnClick) {\n existingOnClick(e);\n }\n // Then call our handleOpen\n handleOpen();\n },\n })\n ) : (\n <Trigger\n onClick={handleOpen}\n text={texts?.triggerButtonText}\n ariaLabel={texts?.triggerButtonAriaLabel}\n />\n )}\n\n {/* Drawer with Chat */}\n <Drawer\n isOpen={isOpen}\n onClose={handleClose}\n onNewSession={handleNewSession}\n hasMessages={messages.length > 0}\n position={drawerPosition}\n width={drawerWidth}\n title={texts?.drawerTitle}\n closeAriaLabel={texts?.drawerCloseAriaLabel}\n newSessionAriaLabel={texts?.drawerNewSessionAriaLabel}\n theme={theme}\n >\n <ChatContainer\n texts={texts}\n exampleQuestions={exampleQuestions}\n onMessage={onMessage}\n onError={onError}\n messages={messages}\n isStreaming={isStreaming}\n error={error}\n sendMessage={sendMessage}\n input={input}\n setInput={setInput}\n />\n </Drawer>\n </div>\n );\n}\n"],"names":["useState","useCallback","useEffect","useRef","React","Slot","styles","_jsx","DialogPrimitive","_jsxs","Sparkles","RotateCcw","X","_Fragment","common","ArrowUp"],"mappings":"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","x_google_ignoreList":[4]}
|
package/dist/index.esm.js
CHANGED
|
@@ -11,23 +11,33 @@ import { common } from 'lowlight';
|
|
|
11
11
|
|
|
12
12
|
/**
|
|
13
13
|
* API client for Ask AI widget
|
|
14
|
-
* Supports dynamic API URL configuration
|
|
14
|
+
* Supports dynamic API URL configuration and optional project-scoped API
|
|
15
15
|
*/
|
|
16
16
|
class APIClient {
|
|
17
|
-
constructor(baseUrl) {
|
|
17
|
+
constructor(baseUrl, projectId) {
|
|
18
18
|
Object.defineProperty(this, "baseUrl", {
|
|
19
19
|
enumerable: true,
|
|
20
20
|
configurable: true,
|
|
21
21
|
writable: true,
|
|
22
22
|
value: void 0
|
|
23
23
|
});
|
|
24
|
+
Object.defineProperty(this, "projectId", {
|
|
25
|
+
enumerable: true,
|
|
26
|
+
configurable: true,
|
|
27
|
+
writable: true,
|
|
28
|
+
value: void 0
|
|
29
|
+
});
|
|
24
30
|
this.baseUrl = baseUrl.replace(/\/$/, ''); // Remove trailing slash
|
|
31
|
+
this.projectId = projectId;
|
|
25
32
|
}
|
|
26
33
|
/**
|
|
27
34
|
* Create a new session
|
|
28
35
|
*/
|
|
29
36
|
async createSession() {
|
|
30
|
-
const
|
|
37
|
+
const url = this.projectId
|
|
38
|
+
? `${this.baseUrl}/api/projects/${this.projectId}/session`
|
|
39
|
+
: `${this.baseUrl}/api/session`;
|
|
40
|
+
const response = await fetch(url, {
|
|
31
41
|
method: 'POST',
|
|
32
42
|
headers: {
|
|
33
43
|
'Content-Type': 'application/json',
|
|
@@ -42,7 +52,10 @@ class APIClient {
|
|
|
42
52
|
* Delete a session
|
|
43
53
|
*/
|
|
44
54
|
async deleteSession(sessionId) {
|
|
45
|
-
const
|
|
55
|
+
const url = this.projectId
|
|
56
|
+
? `${this.baseUrl}/api/projects/${this.projectId}/session/${sessionId}`
|
|
57
|
+
: `${this.baseUrl}/api/session/${sessionId}`;
|
|
58
|
+
const response = await fetch(url, {
|
|
46
59
|
method: 'DELETE',
|
|
47
60
|
});
|
|
48
61
|
if (!response.ok) {
|
|
@@ -53,7 +66,10 @@ class APIClient {
|
|
|
53
66
|
* Ask a question and return the SSE stream response
|
|
54
67
|
*/
|
|
55
68
|
async askQuestion(sessionId, question, system, signal) {
|
|
56
|
-
const
|
|
69
|
+
const url = this.projectId
|
|
70
|
+
? `${this.baseUrl}/api/projects/${this.projectId}/ask`
|
|
71
|
+
: `${this.baseUrl}/api/ask`;
|
|
72
|
+
const response = await fetch(url, {
|
|
57
73
|
method: 'POST',
|
|
58
74
|
headers: {
|
|
59
75
|
'Content-Type': 'application/json',
|
|
@@ -486,8 +502,8 @@ function Trigger({ onClick, text = 'Ask AI', ariaLabel = 'Open AI assistant', cl
|
|
|
486
502
|
return (jsxs(Button, { onClick: onClick, variant: "outline", "aria-label": ariaLabel, className: classNames, children: [jsx(Sparkles, { className: styles$1.icon }), text && jsx("span", { children: text })] }));
|
|
487
503
|
}
|
|
488
504
|
|
|
489
|
-
var css_248z$2 = "/* ChatContainer 组件样式 */\n\n.container_FRFCj {\n flex: 1;\n min-height: 0;\n display: flex;\n flex-direction: column;\n}\n\n.messagesArea_Hi-49 {\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n/* Welcome Screen */\n.welcomeScreen_fJ8-E {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n text-align: center;\n}\n\n.welcomeMessage_unMIK {\n font-size: 18px;\n color: var(--ask-ai-foreground);\n margin-bottom: 16px;\n}\n\n.exampleQuestionsContainer_RBWq6 {\n margin-top: 24px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.exampleQuestionsTitle_Vurj8 {\n font-size: 14px;\n color: var(--ask-ai-muted);\n margin-bottom: 8px;\n}\n\n.exampleButton_6sOzR {\n display: block;\n width: 100%;\n text-align: left;\n padding: 8px 16px;\n font-size: 14px;\n color: var(--ask-ai-foreground);\n background-color: var(--ask-ai-button-bg);\n border: none;\n border-radius: var(--ask-ai-radius-md);\n cursor: pointer;\n transition: background-color var(--ask-ai-transition);\n}\n\n.exampleButton_6sOzR:hover {\n background-color: var(--ask-ai-border);\n}\n\n/* Messages */\n.messageWrapper_nsQr8 {\n display: flex;\n}\n\n.messageWrapper_nsQr8.user_s1Gzu {\n justify-content: flex-end;\n}\n\n.messageWrapper_nsQr8.assistant_xU0-H {\n justify-content: flex-start;\n}\n\n.message_jxpo4 {\n border-radius: var(--ask-ai-radius-lg);\n padding: 8px 16px;\n}\n\n.message_jxpo4.user_s1Gzu {\n max-width: 85%;\n background-color: var(--ask-ai-user-message-bg);\n color: var(--ask-ai-user-message-text);\n}\n\n.message_jxpo4.assistant_xU0-H {\n width: 100%;\n background-color: var(--ask-ai-ai-message-bg);\n color: var(--ask-ai-ai-message-text);\n}\n\n.messageText_neW3m {\n font-size: 14px;\n white-space: pre-wrap;\n}\n\n/* Markdown Styles */\n.markdown_mNC3q {\n font-size: 14px;\n line-height: 1.6;\n}\n\n.markdown_mNC3q > *:first-child {\n margin-top: 0;\n}\n\n.markdown_mNC3q > *:last-child {\n margin-bottom: 0;\n}\n\n/* Tool Calls */\n.toolCallsContainer_1nUsV {\n display: flex;\n flex-direction: column;\n align-items: start;\n gap: 8px;\n margin-bottom: 8px;\n}\n\n.toolCall_gEKn0 {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 12px;\n font-size: 12px;\n background-color: var(--ask-ai-border);\n border-radius: 12px;\n white-space: nowrap;\n}\n\n.toolCall_gEKn0.
|
|
490
|
-
var styles = {"container":"container_FRFCj","messagesArea":"messagesArea_Hi-49","welcomeScreen":"welcomeScreen_fJ8-E","welcomeMessage":"welcomeMessage_unMIK","exampleQuestionsContainer":"exampleQuestionsContainer_RBWq6","exampleQuestionsTitle":"exampleQuestionsTitle_Vurj8","exampleButton":"exampleButton_6sOzR","messageWrapper":"messageWrapper_nsQr8","user":"user_s1Gzu","assistant":"assistant_xU0-H","message":"message_jxpo4","messageText":"messageText_neW3m","markdown":"markdown_mNC3q","toolCallsContainer":"toolCallsContainer_1nUsV","toolCall":"toolCall_gEKn0","completed":"
|
|
505
|
+
var css_248z$2 = "/* ChatContainer 组件样式 */\n\n.container_FRFCj {\n flex: 1;\n min-height: 0;\n display: flex;\n flex-direction: column;\n}\n\n.messagesArea_Hi-49 {\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n/* Welcome Screen */\n.welcomeScreen_fJ8-E {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n text-align: center;\n}\n\n.welcomeMessage_unMIK {\n font-size: 18px;\n color: var(--ask-ai-foreground);\n margin-bottom: 16px;\n}\n\n.exampleQuestionsContainer_RBWq6 {\n margin-top: 24px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.exampleQuestionsTitle_Vurj8 {\n font-size: 14px;\n color: var(--ask-ai-muted);\n margin-bottom: 8px;\n}\n\n.exampleButton_6sOzR {\n display: block;\n width: 100%;\n text-align: left;\n padding: 8px 16px;\n font-size: 14px;\n color: var(--ask-ai-foreground);\n background-color: var(--ask-ai-button-bg);\n border: none;\n border-radius: var(--ask-ai-radius-md);\n cursor: pointer;\n transition: background-color var(--ask-ai-transition);\n}\n\n.exampleButton_6sOzR:hover {\n background-color: var(--ask-ai-border);\n}\n\n/* Messages */\n.messageWrapper_nsQr8 {\n display: flex;\n}\n\n.messageWrapper_nsQr8.user_s1Gzu {\n justify-content: flex-end;\n}\n\n.messageWrapper_nsQr8.assistant_xU0-H {\n justify-content: flex-start;\n}\n\n.message_jxpo4 {\n border-radius: var(--ask-ai-radius-lg);\n padding: 8px 16px;\n}\n\n.message_jxpo4.user_s1Gzu {\n max-width: 85%;\n background-color: var(--ask-ai-user-message-bg);\n color: var(--ask-ai-user-message-text);\n}\n\n.message_jxpo4.assistant_xU0-H {\n width: 100%;\n background-color: var(--ask-ai-ai-message-bg);\n color: var(--ask-ai-ai-message-text);\n}\n\n.messageText_neW3m {\n font-size: 14px;\n white-space: pre-wrap;\n}\n\n/* Markdown Styles */\n.markdown_mNC3q {\n font-size: 14px;\n line-height: 1.6;\n}\n\n.markdown_mNC3q > *:first-child {\n margin-top: 0;\n}\n\n.markdown_mNC3q > *:last-child {\n margin-bottom: 0;\n}\n\n/* Tool Calls */\n.toolCallsContainer_1nUsV {\n display: flex;\n flex-direction: column;\n align-items: start;\n gap: 8px;\n margin-bottom: 8px;\n}\n\n.toolCall_gEKn0 {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 12px;\n font-size: 12px;\n background-color: var(--ask-ai-border);\n border-radius: 12px;\n white-space: nowrap;\n}\n\n.toolCall_gEKn0.tool-completed_5Utl8 {\n opacity: 0.7;\n}\n\n.toolCall_gEKn0.tool-pending_hifHC,\n.toolCall_gEKn0.tool-running_D0dCg {\n animation: pulse_STM-e 1.5s ease-in-out infinite;\n}\n\n.toolCall_gEKn0.tool-error_eqjRM {\n color: var(--ask-ai-error);\n}\n\n@keyframes pulse_STM-e {\n 0%, 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0.6;\n }\n}\n\n/* 段落 */\n.markdown_mNC3q p {\n display: block;\n margin: 0.5em 0;\n}\n\n/* 标题 */\n.markdown_mNC3q h1,\n.markdown_mNC3q h2,\n.markdown_mNC3q h3,\n.markdown_mNC3q h4,\n.markdown_mNC3q h5,\n.markdown_mNC3q h6 {\n display: block;\n margin: 1em 0 0.5em;\n font-weight: 600;\n line-height: 1.3;\n}\n\n.markdown_mNC3q h1 {\n font-size: 1.5em;\n}\n\n.markdown_mNC3q h2 {\n font-size: 1.3em;\n}\n\n.markdown_mNC3q h3 {\n font-size: 1.1em;\n}\n\n/* 无序列表 */\n.markdown_mNC3q ul {\n display: block;\n margin: 0.5em 0;\n padding-left: 1.5em;\n list-style-type: disc;\n list-style-position: outside;\n}\n\n/* 有序列表 */\n.markdown_mNC3q ol {\n display: block;\n margin: 0.5em 0;\n padding-left: 1.5em;\n list-style-type: decimal;\n list-style-position: outside;\n}\n\n/* 嵌套列表 */\n.markdown_mNC3q ul ul {\n list-style-type: circle;\n}\n\n.markdown_mNC3q ul ul ul {\n list-style-type: square;\n}\n\n.markdown_mNC3q ol ol {\n list-style-type: lower-alpha;\n}\n\n.markdown_mNC3q ol ol ol {\n list-style-type: lower-roman;\n}\n\n/* 列表项 */\n.markdown_mNC3q li {\n display: list-item;\n margin: 0.25em 0;\n}\n\n/* 文本样式 */\n.markdown_mNC3q strong,\n.markdown_mNC3q b {\n font-weight: bold;\n}\n\n.markdown_mNC3q em,\n.markdown_mNC3q i {\n font-style: italic;\n}\n\n.markdown_mNC3q u {\n text-decoration: underline;\n}\n\n.markdown_mNC3q s,\n.markdown_mNC3q del {\n text-decoration: line-through;\n}\n\n.markdown_mNC3q code {\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n font-size: 0.9em;\n padding: 0.15em 0.4em;\n background-color: var(--ask-ai-border);\n border-radius: 4px;\n}\n\n/* 代码块容器 */\n.markdown_mNC3q pre {\n margin: 0.75em 0;\n padding: 0.75em 1em;\n background-color: var(--ask-ai-code-bg);\n border-radius: var(--ask-ai-radius-md);\n overflow-x: auto;\n line-height: 1.5;\n}\n\n.markdown_mNC3q pre code {\n padding: 0;\n background-color: transparent;\n border-radius: 0;\n font-size: 0.85em;\n color: var(--ask-ai-code-text);\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n}\n\n/* Highlight.js 语法高亮样式 */\n.markdown_mNC3q .hljs-keyword,\n.markdown_mNC3q .hljs-selector-tag,\n.markdown_mNC3q .hljs-literal,\n.markdown_mNC3q .hljs-section,\n.markdown_mNC3q .hljs-link {\n color: var(--ask-ai-code-keyword);\n font-weight: bold;\n}\n\n.markdown_mNC3q .hljs-string,\n.markdown_mNC3q .hljs-regexp,\n.markdown_mNC3q .hljs-addition,\n.markdown_mNC3q .hljs-attribute,\n.markdown_mNC3q .hljs-meta-string {\n color: var(--ask-ai-code-string);\n}\n\n.markdown_mNC3q .hljs-number,\n.markdown_mNC3q .hljs-meta .hljs-keyword {\n color: var(--ask-ai-code-number);\n}\n\n.markdown_mNC3q .hljs-comment,\n.markdown_mNC3q .hljs-quote {\n color: var(--ask-ai-code-comment);\n font-style: italic;\n}\n\n.markdown_mNC3q .hljs-function,\n.markdown_mNC3q .hljs-title {\n color: var(--ask-ai-code-function);\n}\n\n.markdown_mNC3q .hljs-operator,\n.markdown_mNC3q .hljs-punctuation {\n color: var(--ask-ai-code-operator);\n}\n\n.markdown_mNC3q .hljs-variable,\n.markdown_mNC3q .hljs-property,\n.markdown_mNC3q .hljs-params {\n color: var(--ask-ai-code-variable);\n}\n\n.markdown_mNC3q .hljs-type,\n.markdown_mNC3q .hljs-class,\n.markdown_mNC3q .hljs-built_in {\n color: var(--ask-ai-code-type);\n}\n\n.markdown_mNC3q .hljs-builtin,\n.markdown_mNC3q .hljs-name {\n color: var(--ask-ai-code-builtin);\n}\n\n.markdown_mNC3q .hljs-tag {\n color: var(--ask-ai-code-tag);\n}\n\n.markdown_mNC3q .hljs-attr {\n color: var(--ask-ai-code-attr);\n}\n\n.markdown_mNC3q .hljs-deletion {\n color: var(--ask-ai-error);\n}\n\n.markdown_mNC3q .hljs-emphasis {\n font-style: italic;\n}\n\n.markdown_mNC3q .hljs-strong {\n font-weight: bold;\n}\n\n.markdown_mNC3q blockquote {\n margin: 0.5em 0;\n padding: 0.5em 1em;\n border-left: 3px solid var(--ask-ai-primary);\n background-color: var(--ask-ai-border);\n border-radius: 0 var(--ask-ai-radius-sm) var(--ask-ai-radius-sm) 0;\n}\n\n.markdown_mNC3q blockquote p {\n margin: 0;\n}\n\n.markdown_mNC3q a {\n color: var(--ask-ai-primary);\n text-decoration: none;\n}\n\n.markdown_mNC3q a:hover {\n text-decoration: underline;\n}\n\n.markdown_mNC3q table {\n width: 100%;\n margin: 0.75em 0;\n border-collapse: collapse;\n font-size: 0.9em;\n}\n\n.markdown_mNC3q th,\n.markdown_mNC3q td {\n padding: 0.5em 0.75em;\n border: 1px solid var(--ask-ai-border);\n text-align: left;\n}\n\n.markdown_mNC3q th {\n background-color: var(--ask-ai-border);\n font-weight: 600;\n}\n\n.markdown_mNC3q hr {\n margin: 1em 0;\n border: none;\n border-top: 1px solid var(--ask-ai-border);\n}\n\n.markdown_mNC3q img {\n max-width: 100%;\n height: auto;\n border-radius: var(--ask-ai-radius-md);\n}\n\n.cursor_9Dhwg {\n display: inline-block;\n width: 6px;\n height: 16px;\n background-color: currentColor;\n animation: blink_-4y-x 1s step-end infinite;\n}\n\n@keyframes blink_-4y-x {\n 0%, 50% {\n opacity: 0.75;\n }\n 50.01%, 100% {\n opacity: 0;\n }\n}\n\n/* Error */\n.error_uFX9a {\n padding: 16px;\n background-color: rgba(220, 38, 38, 0.1);\n color: var(--ask-ai-error);\n border-radius: var(--ask-ai-radius-md);\n font-size: 14px;\n}\n\n/* Input Area */\n.inputForm_nC0l- {\n border-top: 1px solid var(--ask-ai-border);\n padding: 16px;\n margin: 0;\n}\n\n.inputWrapper_zGeKy {\n display: flex;\n gap: 8px;\n align-items: flex-end;\n}\n\n.input_7lMOc {\n flex: 1;\n padding: 8px 16px;\n font-size: 14px;\n background-color: var(--ask-ai-background);\n border: 1px solid var(--ask-ai-border);\n border-radius: var(--ask-ai-radius-md);\n color: var(--ask-ai-foreground);\n font-family: inherit;\n resize: none;\n min-height: 40px;\n max-height: 200px;\n line-height: 1.5;\n overflow-y: auto;\n}\n\n.input_7lMOc:focus {\n outline: none;\n box-shadow: 0 0 0 2px var(--ask-ai-primary);\n}\n\n.input_7lMOc:disabled {\n opacity: 0.5;\n}\n\n.submitButton_2XrPY {\n height: 40px;\n padding: 8px;\n font-size: 14px;\n background-color: var(--ask-ai-primary);\n color: #ffffff;\n border: none;\n border-radius: var(--ask-ai-radius-md);\n cursor: pointer;\n transition: all var(--ask-ai-transition);\n}\n\n.submitButton_2XrPY:hover:not(:disabled) {\n background-color: var(--ask-ai-primary-hover);\n}\n\n.submitButton_2XrPY:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n";
|
|
506
|
+
var styles = {"container":"container_FRFCj","messagesArea":"messagesArea_Hi-49","welcomeScreen":"welcomeScreen_fJ8-E","welcomeMessage":"welcomeMessage_unMIK","exampleQuestionsContainer":"exampleQuestionsContainer_RBWq6","exampleQuestionsTitle":"exampleQuestionsTitle_Vurj8","exampleButton":"exampleButton_6sOzR","messageWrapper":"messageWrapper_nsQr8","user":"user_s1Gzu","assistant":"assistant_xU0-H","message":"message_jxpo4","messageText":"messageText_neW3m","markdown":"markdown_mNC3q","toolCallsContainer":"toolCallsContainer_1nUsV","toolCall":"toolCall_gEKn0","tool-completed":"tool-completed_5Utl8","tool-pending":"tool-pending_hifHC","tool-running":"tool-running_D0dCg","pulse":"pulse_STM-e","tool-error":"tool-error_eqjRM","cursor":"cursor_9Dhwg","blink":"blink_-4y-x","error":"error_uFX9a","inputForm":"inputForm_nC0l-","inputWrapper":"inputWrapper_zGeKy","input":"input_7lMOc","submitButton":"submitButton_2XrPY"};
|
|
491
507
|
styleInject(css_248z$2);
|
|
492
508
|
|
|
493
509
|
function ChatContainer({ texts, exampleQuestions, onMessage, onError, messages, isStreaming, error, sendMessage, input, setInput, }) {
|
|
@@ -595,16 +611,16 @@ function ChatContainer({ texts, exampleQuestions, onMessage, onError, messages,
|
|
|
595
611
|
// Welcome Screen
|
|
596
612
|
jsxs("div", { className: styles.welcomeScreen, children: [jsx("p", { className: styles.welcomeMessage, children: welcomeMessage }), exampleQuestions && exampleQuestions.length > 0 && (jsxs("div", { className: styles.exampleQuestionsContainer, children: [jsx("p", { className: styles.exampleQuestionsTitle, children: exampleQuestionsTitle }), exampleQuestions.map((question, index) => (jsx("button", { onClick: () => handleExampleClick(question), className: styles.exampleButton, children: question }, index)))] }))] })) : (
|
|
597
613
|
// Messages
|
|
598
|
-
jsx(Fragment, { children: messages.map((message) => (jsx("div", { className: `${styles.messageWrapper} ${styles[message.role]}`, children: jsx("div", { className: `${styles.message} ${styles[message.role]}`, children: message.role === 'assistant' ? (jsxs("div", { className: styles.markdown, children: [message.toolCalls && message.toolCalls.length > 0 && (jsx("div", { className: styles.toolCallsContainer, children: message.toolCalls.map((toolCall) => (jsxs("span", { className: `${styles.toolCall} ${styles[toolCall.status]}`, children: [getToolDisplayName(toolCall.tool), (toolCall.status === 'completed' || toolCall.status === 'error') ? '' : '...'] }, toolCall.callID))) })), jsx(ReactMarkdown, { remarkPlugins: [remarkGfm], rehypePlugins: [[rehypeHighlight, {
|
|
614
|
+
jsx(Fragment, { children: messages.map((message) => (jsx("div", { className: `${styles.messageWrapper} ${styles[message.role]}`, children: jsx("div", { className: `${styles.message} ${styles[message.role]}`, children: message.role === 'assistant' ? (jsxs("div", { className: styles.markdown, children: [message.toolCalls && message.toolCalls.length > 0 && (jsx("div", { className: styles.toolCallsContainer, children: message.toolCalls.map((toolCall) => (jsxs("span", { className: `${styles.toolCall} ${styles[`tool-${toolCall.status}`]}`, children: [getToolDisplayName(toolCall.tool), (toolCall.status === 'completed' || toolCall.status === 'error') ? '' : '...'] }, toolCall.callID))) })), jsx(ReactMarkdown, { remarkPlugins: [remarkGfm], rehypePlugins: [[rehypeHighlight, {
|
|
599
615
|
languages: common,
|
|
600
616
|
prefix: 'hljs-'
|
|
601
617
|
}]], children: message.content }), message.isStreaming && (jsx("span", { className: styles.cursor }))] })) : (jsx("div", { className: styles.messageText, children: message.content })) }) }, message.id))) })), error && (jsx("div", { className: styles.error, children: error.message }))] }), jsx("form", { onSubmit: handleSubmit, className: styles.inputForm, children: jsxs("div", { className: styles.inputWrapper, children: [jsx("textarea", { ref: textareaRef, value: input, onChange: handleInputChange, onKeyDown: handleKeyDown, placeholder: inputPlaceholder, className: styles.input, rows: 1 }), jsx("button", { type: "submit", disabled: !input.trim() || isStreaming, className: styles.submitButton, children: jsx(ArrowUp, {}) })] }) })] }));
|
|
602
618
|
}
|
|
603
619
|
|
|
604
620
|
function Widget(props) {
|
|
605
|
-
const { apiUrl, drawerPosition = 'right', drawerWidth = 600, theme = 'light', texts, exampleQuestions, systemPrompt, hotkey, enableHotkey = true, onOpen, onClose, onMessage, onError, className, style, children, } = props;
|
|
621
|
+
const { apiUrl, projectId, drawerPosition = 'right', drawerWidth = 600, theme = 'light', texts, exampleQuestions, systemPrompt, hotkey, enableHotkey = true, onOpen, onClose, onMessage, onError, className, style, children, } = props;
|
|
606
622
|
const [isOpen, setIsOpen] = React.useState(false);
|
|
607
|
-
const [apiClient] = React.useState(() => new APIClient(apiUrl));
|
|
623
|
+
const [apiClient] = React.useState(() => new APIClient(apiUrl, projectId));
|
|
608
624
|
// Lift chat state to Widget level to persist across drawer open/close
|
|
609
625
|
const { messages, isStreaming, error, sendMessage, resetChat } = useChat({ apiClient, systemPrompt, texts });
|
|
610
626
|
// Input state also needs to persist
|
package/dist/index.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.esm.js","sources":["../src/core/api/client.ts","../src/core/hooks/useSession.ts","../src/core/hooks/useSSE.ts","../src/core/hooks/useChat.ts","../node_modules/style-inject/dist/style-inject.es.js","../src/components/ui/Button.tsx","../src/components/widget/Drawer.tsx","../src/components/widget/Trigger.tsx","../src/components/chat/ChatContainer.tsx","../src/components/widget/Widget.tsx"],"sourcesContent":["import type { SessionResponse } from '../types/index.js';\n\n/**\n * API client for Ask AI widget\n * Supports dynamic API URL configuration\n */\nexport class APIClient {\n private baseUrl: string;\n\n constructor(baseUrl: string) {\n this.baseUrl = baseUrl.replace(/\\/$/, ''); // Remove trailing slash\n }\n\n /**\n * Create a new session\n */\n async createSession(): Promise<SessionResponse> {\n const response = await fetch(`${this.baseUrl}/api/session`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to create session: ${response.statusText}`);\n }\n\n return response.json();\n }\n\n /**\n * Delete a session\n */\n async deleteSession(sessionId: string): Promise<void> {\n const response = await fetch(`${this.baseUrl}/api/session/${sessionId}`, {\n method: 'DELETE',\n });\n\n if (!response.ok) {\n throw new Error(`Failed to delete session: ${response.statusText}`);\n }\n }\n\n /**\n * Ask a question and return the SSE stream response\n */\n async askQuestion(\n sessionId: string,\n question: string,\n system?: string,\n signal?: AbortSignal\n ): Promise<Response> {\n const response = await fetch(`${this.baseUrl}/api/ask`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n sessionId,\n question,\n system,\n }),\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to ask question: ${response.statusText}`);\n }\n\n return response;\n }\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport type { APIClient } from '../api/client.js';\n\ninterface UseSessionOptions {\n apiClient: APIClient;\n}\n\ninterface UseSessionReturn {\n sessionId: string | null;\n isCreating: boolean;\n error: Error | null;\n initializeSession: () => Promise<string>;\n clearSession: () => Promise<void>;\n}\n\nexport function useSession({ apiClient }: UseSessionOptions): UseSessionReturn {\n const [sessionId, setSessionId] = useState<string | null>(null);\n const [isCreating, setIsCreating] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const initializeSession = useCallback(async () => {\n setIsCreating(true);\n setError(null);\n\n try {\n const { sessionId: newSessionId } = await apiClient.createSession();\n setSessionId(newSessionId);\n return newSessionId;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to create session');\n setError(error);\n console.error('Failed to create session:', error);\n throw error;\n } finally {\n setIsCreating(false);\n }\n }, [apiClient]);\n\n const clearSession = useCallback(async () => {\n setSessionId(null);\n setIsCreating(false);\n setError(null);\n }, [sessionId, apiClient, initializeSession]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (sessionId) {\n apiClient.deleteSession(sessionId).catch((err) => {\n console.error('Failed to cleanup session on unmount:', err);\n });\n }\n };\n }, [sessionId, apiClient]);\n\n return {\n sessionId,\n isCreating,\n error,\n initializeSession,\n clearSession,\n };\n}\n","import { useCallback } from 'react';\nimport type { SSEData } from '../types/index.js';\n\ninterface UseSSEOptions {\n onConnected?: () => void;\n onMessage?: (data: SSEData) => void;\n onDone?: () => void;\n onError?: (error: Error) => void;\n}\n\ninterface UseSSEReturn {\n handleSSEStream: (response: Response) => Promise<void>;\n}\n\n/**\n * Parse SSE chunk format: \"event: type\\ndata: json\\n\\n\"\n */\nfunction parseSSEChunk(chunk: string): Array<{ event: string; data: any }> {\n const events: Array<{ event: string; data: any }> = [];\n const lines = chunk.split('\\n');\n let currentEvent = '';\n let currentData = '';\n\n for (const line of lines) {\n if (line.startsWith('event: ')) {\n currentEvent = line.slice(7).trim();\n } else if (line.startsWith('data: ')) {\n currentData = line.slice(6).trim();\n } else if (line === '') {\n // Empty line marks end of event\n if (currentEvent && currentData) {\n try {\n const parsedData = JSON.parse(currentData);\n events.push({\n event: currentEvent,\n data: parsedData,\n });\n } catch (err) {\n console.error('Failed to parse SSE data:', currentData, err);\n }\n currentEvent = '';\n currentData = '';\n }\n }\n }\n\n return events;\n}\n\nexport function useSSE(options: UseSSEOptions = {}): UseSSEReturn {\n const { onConnected, onMessage, onDone, onError } = options;\n\n const handleSSEStream = useCallback(\n async (response: Response) => {\n const reader = response.body?.getReader();\n const decoder = new TextDecoder();\n\n if (!reader) {\n onError?.(new Error('No response body'));\n return;\n }\n\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n\n // Process complete events\n const events = parseSSEChunk(buffer);\n\n for (const { event, data } of events) {\n if (event === 'connected') {\n onConnected?.();\n onMessage?.(data);\n } else if (event === 'answer' || event === 'tool') {\n onMessage?.(data);\n } else if (event === 'done') {\n onDone?.();\n onMessage?.(data);\n } else if (event === 'error') {\n onError?.(new Error(data.error || 'Unknown error'));\n onMessage?.(data);\n }\n }\n\n // Clear processed events from buffer (keep incomplete data)\n const lastEventEnd = buffer.lastIndexOf('\\n\\n');\n if (lastEventEnd !== -1) {\n buffer = buffer.slice(lastEventEnd + 2);\n }\n }\n } catch (err) {\n // Don't report AbortError as it's an intentional cancellation\n if (err instanceof Error && err.name === 'AbortError') {\n return;\n }\n const error = err instanceof Error ? err : new Error('SSE stream error');\n onError?.(error);\n } finally {\n reader.releaseLock();\n }\n },\n [onConnected, onMessage, onDone, onError]\n );\n\n return {\n handleSSEStream,\n };\n}\n","import { useState, useCallback, useRef } from 'react';\nimport { useSession } from './useSession.js';\nimport { useSSE } from './useSSE.js';\nimport type { Message, WidgetTexts } from '../types/index.js';\nimport type { APIClient } from '../api/client.js';\n\ninterface UseChatOptions {\n apiClient: APIClient;\n systemPrompt?: string;\n texts?: WidgetTexts;\n}\n\ninterface UseChatReturn {\n messages: Message[];\n isStreaming: boolean;\n error: Error | null;\n sessionError: Error | null;\n isCreatingSession: boolean;\n sendMessage: (text: string) => Promise<void>;\n resetChat: () => Promise<void>;\n}\n\nlet idCounter = 0;\n\nfunction getMessageId() {\n idCounter += 1;\n return `msg-${idCounter}`; \n}\n\nexport function useChat({ apiClient, systemPrompt, texts }: UseChatOptions): UseChatReturn {\n const [messages, setMessages] = useState<Message[]>([]);\n const [isStreaming, setIsStreaming] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const abortControllerRef = useRef<AbortController | null>(null);\n\n const { sessionId, isCreating: isCreatingSession, error: sessionError, initializeSession, clearSession } = useSession({ apiClient });\n\n const { handleSSEStream } = useSSE({\n onConnected: () => {\n console.log('SSE connected');\n },\n onMessage: (data) => {\n if (data.type === 'answer' && data.text) {\n // Accumulate the answer text\n setMessages((prev) => {\n const lastMessage = prev[prev.length - 1];\n if (lastMessage && lastMessage.role === 'assistant' && lastMessage.isStreaming) {\n // Update the last assistant message\n return prev.slice(0, -1).concat({\n ...lastMessage,\n content: lastMessage.content + data.text,\n });\n }\n return prev;\n });\n } else if (data.type === 'tool') {\n // Handle tool updates\n setMessages((prev) => {\n const lastMessage = prev[prev.length - 1];\n if (lastMessage && lastMessage.role === 'assistant' && lastMessage.isStreaming) {\n // Get existing tool calls or create new array\n const existingToolCalls = lastMessage.toolCalls || [];\n\n // Find the tool call with this callID\n const toolIndex = existingToolCalls.findIndex(tc => tc.callID === data.callID);\n\n let updatedToolCalls;\n if (toolIndex >= 0) {\n // Update existing tool call\n updatedToolCalls = [...existingToolCalls];\n updatedToolCalls[toolIndex] = {\n callID: data.callID,\n tool: data.tool,\n status: data.status,\n };\n } else {\n // Add new tool call\n updatedToolCalls = [...existingToolCalls, {\n callID: data.callID,\n tool: data.tool,\n status: data.status,\n }];\n }\n\n return prev.slice(0, -1).concat({\n ...lastMessage,\n toolCalls: updatedToolCalls,\n });\n }\n return prev;\n });\n }\n },\n onDone: () => {\n // Mark streaming complete\n setMessages((prev) => {\n const lastMessage = prev[prev.length - 1];\n if (lastMessage && lastMessage.role === 'assistant') {\n // If AI didn't send any content, show a fallback message\n const emptyResponseText = texts?.emptyResponseText || 'Something went wrong. Please try again later.';\n const content = lastMessage.content.trim() || emptyResponseText;\n return prev.slice(0, -1).concat({\n ...lastMessage,\n content,\n isStreaming: false,\n });\n }\n return prev;\n });\n setIsStreaming(false);\n },\n onError: (err) => {\n setError(err);\n setIsStreaming(false);\n // Remove the failed assistant message\n setMessages((prev) => {\n const lastMessage = prev[prev.length - 1];\n if (lastMessage && lastMessage.role === 'assistant' && lastMessage.isStreaming) {\n return prev.slice(0, -1);\n }\n return prev;\n });\n },\n });\n\n const sendMessage = useCallback(\n async (text: string) => {\n if (!text.trim()) {\n return;\n }\n\n // Abort any ongoing request\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n\n // Create new AbortController for this request\n const abortController = new AbortController();\n abortControllerRef.current = abortController;\n\n setError(null);\n\n setIsStreaming(true);\n\n // Add user message immediately (optimistic UI)\n const userMessage: Message = {\n id: getMessageId(),\n role: 'user',\n content: text,\n timestamp: Date.now(),\n };\n setMessages((prev) => [...prev, userMessage]);\n\n // Add placeholder for assistant response\n const assistantMessage: Message = {\n id: getMessageId(),\n role: 'assistant',\n content: '',\n timestamp: Date.now(),\n isStreaming: true,\n };\n setMessages((prev) => [...prev, assistantMessage]);\n\n // Create session if it doesn't exist yet\n let currentSessionId = sessionId;\n if (!currentSessionId && !isCreatingSession) {\n try {\n currentSessionId = await initializeSession();\n } catch (err) {\n setError(new Error('Failed to create session'));\n setIsStreaming(false);\n return;\n }\n }\n\n // Wait for session to be created if it's currently being created\n if (isCreatingSession) {\n setError(new Error('Session is being created, please try again'));\n return;\n }\n\n if (!currentSessionId) {\n setError(new Error('No active session'));\n return;\n }\n\n try {\n const response = await apiClient.askQuestion(\n currentSessionId,\n text,\n systemPrompt,\n abortController.signal\n );\n await handleSSEStream(response);\n } catch (err) {\n // Don't treat aborted requests as errors\n if (err instanceof Error && err.name === 'AbortError') {\n return;\n }\n\n const error = err instanceof Error ? err : new Error('Failed to send message');\n setError(error);\n setIsStreaming(false);\n\n // Remove the failed messages\n setMessages((prev) => prev.slice(0, -2));\n } finally {\n // Clear the abort controller reference if this was the current one\n if (abortControllerRef.current === abortController) {\n abortControllerRef.current = null;\n }\n }\n },\n [sessionId, isCreatingSession, initializeSession, apiClient, handleSSEStream, systemPrompt]\n );\n\n const resetChat = useCallback(async () => {\n // Abort any ongoing request\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n abortControllerRef.current = null;\n }\n\n setMessages([]);\n setError(null);\n setIsStreaming(false);\n await clearSession();\n }, [clearSession]);\n\n return {\n messages,\n isStreaming,\n error,\n sessionError,\n isCreatingSession,\n sendMessage,\n resetChat,\n };\n}\n","function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","import * as React from 'react';\nimport { Slot } from '@radix-ui/react-slot';\nimport styles from './Button.module.css';\n\ntype ButtonVariant = 'default' | 'outline' | 'ghost' | 'icon';\ntype ButtonSize = 'default' | 'sm' | 'lg' | 'icon';\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n asChild?: boolean;\n variant?: ButtonVariant;\n size?: ButtonSize;\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant = 'default', size = 'default', asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : 'button';\n\n const classNames = [\n styles.button,\n styles[`variant-${variant}`],\n styles[`size-${size}`],\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <Comp\n className={classNames}\n ref={ref}\n {...props}\n />\n );\n }\n);\n\nButton.displayName = 'Button';\n\nexport { Button };\n","import * as React from 'react';\nimport * as DialogPrimitive from '@radix-ui/react-dialog';\nimport { Sparkles, X, RotateCcw } from 'lucide-react';\nimport { Button } from '../ui/Button.js';\nimport styles from './Drawer.module.css';\n\ninterface DrawerProps {\n isOpen: boolean;\n onClose: () => void;\n onNewSession?: () => void;\n hasMessages?: boolean;\n position?: 'right' | 'left';\n width?: number | string;\n title?: string;\n closeAriaLabel?: string;\n newSessionAriaLabel?: string;\n children?: React.ReactNode;\n theme?: 'light' | 'dark';\n}\n\nexport function Drawer({\n isOpen,\n onClose,\n onNewSession,\n hasMessages,\n position = 'right',\n width = 600,\n title = 'Ask AI',\n closeAriaLabel = 'Close',\n newSessionAriaLabel = 'New session',\n children,\n theme = 'light',\n}: DrawerProps) {\n const widthStyle = typeof width === 'number' ? `${width}px` : width;\n\n const contentClasses = [\n styles.content,\n styles[`position-${position}`],\n ].join(' ');\n\n // Create a portal container that inherits theme from the nearest .ask-ai ancestor\n const [portalContainer, setPortalContainer] = React.useState<HTMLElement | null>(null);\n\n React.useEffect(() => {\n if (typeof document === 'undefined') return;\n\n // Create a portal container with ask-ai class\n const container = document.createElement('div');\n container.className = `ask-ai${theme === 'dark' ? ' dark' : ''}`;\n document.body.appendChild(container);\n setPortalContainer(container);\n\n return () => {\n document.body.removeChild(container);\n };\n }, [theme]);\n\n return (\n <DialogPrimitive.Root open={isOpen} onOpenChange={(open) => !open && onClose()}>\n <DialogPrimitive.Portal container={portalContainer}>\n {/* Overlay */}\n <DialogPrimitive.Overlay className={styles.overlay} />\n\n {/* Drawer Content */}\n <DialogPrimitive.Content\n className={contentClasses}\n style={{ maxWidth: widthStyle }}\n >\n {/* Header */}\n <div className={styles.header}>\n <DialogPrimitive.Title className={styles.title}>\n <Sparkles className={styles.icon} />\n {title}\n </DialogPrimitive.Title>\n <div className={styles.headerActions}>\n {onNewSession && hasMessages && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label={newSessionAriaLabel}\n className={styles.newSessionButton}\n onClick={onNewSession}\n >\n <RotateCcw className={styles.newSessionIcon} />\n </Button>\n )}\n <DialogPrimitive.Close asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label={closeAriaLabel}\n className={styles.closeButton}\n >\n <X className={styles.closeIcon} />\n </Button>\n </DialogPrimitive.Close>\n </div>\n </div>\n\n {/* Content */}\n <div className={styles.body}>\n {children}\n </div>\n </DialogPrimitive.Content>\n </DialogPrimitive.Portal>\n </DialogPrimitive.Root>\n );\n}\n","import { Sparkles } from 'lucide-react';\nimport { Button } from '../ui/Button.js';\nimport styles from './Trigger.module.css';\n\ninterface TriggerProps {\n onClick: () => void;\n text?: string;\n ariaLabel?: string;\n className?: string;\n}\n\nexport function Trigger({\n onClick,\n text = 'Ask AI',\n ariaLabel = 'Open AI assistant',\n className,\n}: TriggerProps) {\n const classNames = [styles.trigger, className].filter(Boolean).join(' ');\n\n return (\n <Button\n onClick={onClick}\n variant=\"outline\"\n aria-label={ariaLabel}\n className={classNames}\n >\n <Sparkles className={styles.icon} />\n {text && <span>{text}</span>}\n </Button>\n );\n}\n","import * as React from 'react';\nimport ReactMarkdown from 'react-markdown';\nimport remarkGfm from 'remark-gfm';\nimport rehypeHighlight from 'rehype-highlight';\nimport { common } from 'lowlight';\nimport type { WidgetTexts, Message } from '../../core/types/index.js';\nimport styles from './ChatContainer.module.css';\nimport { ArrowUp } from 'lucide-react';\n\ninterface ChatContainerProps {\n texts?: WidgetTexts;\n exampleQuestions?: string[];\n onMessage?: (message: any) => void;\n onError?: (error: Error) => void;\n // Lifted state from parent\n messages: Message[];\n isStreaming: boolean;\n error: Error | null;\n sendMessage: (text: string) => Promise<void>;\n input: string;\n setInput: React.Dispatch<React.SetStateAction<string>>;\n}\n\nexport function ChatContainer({\n texts,\n exampleQuestions,\n onMessage,\n onError,\n messages,\n isStreaming,\n error,\n sendMessage,\n input,\n setInput,\n}: ChatContainerProps) {\n const textareaRef = React.useRef<HTMLTextAreaElement>(null);\n const messagesAreaRef = React.useRef<HTMLDivElement>(null);\n const shouldAutoScrollRef = React.useRef(true); // Track if auto-scroll is enabled\n\n // Check if user is at the bottom of the messages area\n const isAtBottom = React.useCallback(() => {\n const messagesArea = messagesAreaRef.current;\n if (!messagesArea) return true;\n\n const threshold = 50; // pixels from bottom to consider \"at bottom\"\n const scrollBottom = messagesArea.scrollHeight - messagesArea.scrollTop - messagesArea.clientHeight;\n return scrollBottom < threshold;\n }, []);\n\n // Scroll to bottom of messages area\n const scrollToBottom = React.useCallback(() => {\n const messagesArea = messagesAreaRef.current;\n if (messagesArea) {\n messagesArea.scrollTop = messagesArea.scrollHeight;\n }\n }, []);\n\n // Handle user scroll events\n const handleScroll = React.useCallback(() => {\n const atBottom = isAtBottom();\n shouldAutoScrollRef.current = atBottom;\n }, [isAtBottom]);\n\n // Auto-scroll when messages change (if enabled)\n React.useEffect(() => {\n if (shouldAutoScrollRef.current) {\n scrollToBottom();\n }\n }, [messages, scrollToBottom]);\n\n // Auto-resize textarea based on content\n const adjustTextareaHeight = React.useCallback(() => {\n const textarea = textareaRef.current;\n if (textarea) {\n textarea.style.height = 'auto';\n textarea.style.height = `${textarea.scrollHeight}px`;\n }\n }, []);\n\n // Call onError callback when error occurs\n React.useEffect(() => {\n if (error && onError) {\n onError(error);\n }\n }, [error, onError]);\n\n // Call onMessage callback when new message arrives\n React.useEffect(() => {\n if (messages.length > 0 && onMessage) {\n onMessage(messages[messages.length - 1]);\n }\n }, [messages, onMessage]);\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n const inputValue = input.trim();\n if (!inputValue || isStreaming) return;\n\n // Enable auto-scroll for new user message\n shouldAutoScrollRef.current = true;\n\n setInput('');\n await sendMessage(inputValue);\n // Reset textarea height after submission\n setTimeout(() => {\n if (textareaRef.current) {\n textareaRef.current.style.height = 'auto';\n }\n }, 0);\n };\n\n const handleInputChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n setInput(e.target.value);\n adjustTextareaHeight();\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n // Submit on Enter (without Shift)\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n if (input.trim() && !isStreaming) {\n handleSubmit(e as any);\n }\n }\n // Allow Shift+Enter for new line (default textarea behavior)\n };\n\n const handleExampleClick = async (question: string) => {\n if (isStreaming) return;\n // Enable auto-scroll for new user message\n shouldAutoScrollRef.current = true;\n await sendMessage(question);\n };\n\n const inputPlaceholder = texts?.inputPlaceholder || 'Ask a question...';\n const welcomeMessage = texts?.welcomeMessage || 'Hi! How can I help you today?';\n const exampleQuestionsTitle = texts?.exampleQuestionsTitle || 'Example questions:';\n\n // Helper function to format tool name\n const getToolDisplayName = (toolName: string) => {\n if (toolName.toLowerCase() === 'read') {\n return 'Reading docs';\n }\n if (toolName.toLowerCase() === 'task') {\n return 'Exploring docs';\n }\n return 'Searching docs';\n };\n\n return (\n <div className={styles.container}>\n {/* Messages Area */}\n <div\n ref={messagesAreaRef}\n onScroll={handleScroll}\n className={styles.messagesArea}\n >\n {messages.length === 0 ? (\n // Welcome Screen\n <div className={styles.welcomeScreen}>\n <p className={styles.welcomeMessage}>\n {welcomeMessage}\n </p>\n\n {exampleQuestions && exampleQuestions.length > 0 && (\n <div className={styles.exampleQuestionsContainer}>\n <p className={styles.exampleQuestionsTitle}>\n {exampleQuestionsTitle}\n </p>\n {exampleQuestions.map((question, index) => (\n <button\n key={index}\n onClick={() => handleExampleClick(question)}\n className={styles.exampleButton}\n >\n {question}\n </button>\n ))}\n </div>\n )}\n </div>\n ) : (\n // Messages\n <>\n {messages.map((message) => (\n <div\n key={message.id}\n className={`${styles.messageWrapper} ${styles[message.role]}`}\n >\n <div className={`${styles.message} ${styles[message.role]}`}>\n {message.role === 'assistant' ? (\n <div className={styles.markdown}>\n {/* Display tool calls if present */}\n {message.toolCalls && message.toolCalls.length > 0 && (\n <div className={styles.toolCallsContainer}>\n {message.toolCalls.map((toolCall) => (\n <span\n key={toolCall.callID}\n className={`${styles.toolCall} ${styles[toolCall.status]}`}\n >\n {getToolDisplayName(toolCall.tool)}\n {(toolCall.status === 'completed' || toolCall.status === 'error') ? '' : '...'}\n </span>\n ))}\n </div>\n )}\n <ReactMarkdown\n remarkPlugins={[remarkGfm]}\n rehypePlugins={[[rehypeHighlight, {\n languages: common,\n prefix: 'hljs-'\n }]]}\n >\n {message.content}\n </ReactMarkdown>\n {message.isStreaming && (\n <span className={styles.cursor} />\n )}\n </div>\n ) : (\n <div className={styles.messageText}>\n {message.content}\n </div>\n )}\n </div>\n </div>\n ))}\n </>\n )}\n\n {error && (\n <div className={styles.error}>\n {error.message}\n </div>\n )}\n </div>\n\n {/* Input Area */}\n <form onSubmit={handleSubmit} className={styles.inputForm}>\n <div className={styles.inputWrapper}>\n <textarea\n ref={textareaRef}\n value={input}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n placeholder={inputPlaceholder}\n className={styles.input}\n rows={1}\n />\n <button\n type=\"submit\"\n disabled={!input.trim() || isStreaming}\n className={styles.submitButton}\n >\n <ArrowUp />\n </button>\n </div>\n </form>\n </div>\n );\n}\n","import * as React from 'react';\nimport { APIClient } from '../../core/api/client.js';\nimport { useChat } from '../../core/hooks/useChat.js';\nimport type { WidgetProps } from '../../core/types/index.js';\nimport { Drawer } from './Drawer.js';\nimport { Trigger } from './Trigger.js';\nimport { ChatContainer } from '../chat/ChatContainer.js';\n\nexport function Widget(props: WidgetProps) {\n const {\n apiUrl,\n drawerPosition = 'right',\n drawerWidth = 600,\n theme = 'light',\n texts,\n exampleQuestions,\n systemPrompt,\n hotkey,\n enableHotkey = true,\n onOpen,\n onClose,\n onMessage,\n onError,\n className,\n style,\n children,\n } = props;\n\n const [isOpen, setIsOpen] = React.useState(false);\n const [apiClient] = React.useState(() => new APIClient(apiUrl));\n\n // Lift chat state to Widget level to persist across drawer open/close\n const { messages, isStreaming, error, sendMessage, resetChat } = useChat({ apiClient, systemPrompt, texts });\n\n // Input state also needs to persist\n const [input, setInput] = React.useState('');\n\n // Handle drawer open\n const handleOpen = React.useCallback(() => {\n setIsOpen(true);\n onOpen?.();\n }, [onOpen]);\n\n // Handle drawer close\n const handleClose = React.useCallback(() => {\n setIsOpen(false);\n onClose?.();\n }, [onClose]);\n\n // Handle new session\n const handleNewSession = React.useCallback(async () => {\n setInput('');\n await resetChat();\n }, [resetChat]);\n\n // Handle keyboard shortcut\n React.useEffect(() => {\n if (!enableHotkey || !hotkey) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n const keys = hotkey.toLowerCase().split('+');\n const ctrl = keys.includes('ctrl') || keys.includes('control');\n const cmd = keys.includes('cmd') || keys.includes('command') || keys.includes('meta');\n const shift = keys.includes('shift');\n const alt = keys.includes('alt');\n const key = keys[keys.length - 1];\n\n const ctrlPressed = ctrl && (e.ctrlKey || e.metaKey);\n const cmdPressed = cmd && (e.metaKey || e.ctrlKey);\n const shiftPressed = !shift || e.shiftKey;\n const altPressed = !alt || e.altKey;\n\n if ((ctrlPressed || cmdPressed) && shiftPressed && altPressed && e.key.toLowerCase() === key) {\n e.preventDefault();\n setIsOpen((prev) => !prev);\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [enableHotkey, hotkey]);\n\n return (\n <div className={`ask-ai ${className || ''} ${theme === 'dark' ? 'dark' : ''}`} style={style}>\n {/* Trigger Button - Custom or Default */}\n {children && React.isValidElement(children) ? (\n React.cloneElement(children, {\n ...children.props,\n onClick: (e: React.MouseEvent) => {\n // Call existing onClick if present\n const existingOnClick = children.props?.onClick;\n if (existingOnClick) {\n existingOnClick(e);\n }\n // Then call our handleOpen\n handleOpen();\n },\n })\n ) : (\n <Trigger\n onClick={handleOpen}\n text={texts?.triggerButtonText}\n ariaLabel={texts?.triggerButtonAriaLabel}\n />\n )}\n\n {/* Drawer with Chat */}\n <Drawer\n isOpen={isOpen}\n onClose={handleClose}\n onNewSession={handleNewSession}\n hasMessages={messages.length > 0}\n position={drawerPosition}\n width={drawerWidth}\n title={texts?.drawerTitle}\n closeAriaLabel={texts?.drawerCloseAriaLabel}\n newSessionAriaLabel={texts?.drawerNewSessionAriaLabel}\n theme={theme}\n >\n <ChatContainer\n texts={texts}\n exampleQuestions={exampleQuestions}\n onMessage={onMessage}\n onError={onError}\n messages={messages}\n isStreaming={isStreaming}\n error={error}\n sendMessage={sendMessage}\n input={input}\n setInput={setInput}\n />\n </Drawer>\n </div>\n );\n}\n"],"names":["styles","_jsx","_jsxs","_Fragment"],"mappings":";;;;;;;;;;;AAEA;;;AAGG;MACU,SAAS,CAAA;AAGpB,IAAA,WAAA,CAAY,OAAe,EAAA;AAFnB,QAAA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,SAAA,EAAA;;;;;AAAgB,SAAA,CAAA;AAGtB,QAAA,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC5C;AAEA;;AAEG;AACH,IAAA,MAAM,aAAa,GAAA;QACjB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,CAAA,YAAA,CAAc,EAAE;AAC1D,YAAA,MAAM,EAAE,MAAM;AACd,YAAA,OAAO,EAAE;AACP,gBAAA,cAAc,EAAE,kBAAkB;AACnC,aAAA;AACF,SAAA,CAAC;AAEF,QAAA,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;YAChB,MAAM,IAAI,KAAK,CAAC,CAAA,0BAAA,EAA6B,QAAQ,CAAC,UAAU,CAAA,CAAE,CAAC;QACrE;AAEA,QAAA,OAAO,QAAQ,CAAC,IAAI,EAAE;IACxB;AAEA;;AAEG;IACH,MAAM,aAAa,CAAC,SAAiB,EAAA;AACnC,QAAA,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,CAAA,EAAG,IAAI,CAAC,OAAO,CAAA,aAAA,EAAgB,SAAS,CAAA,CAAE,EAAE;AACvE,YAAA,MAAM,EAAE,QAAQ;AACjB,SAAA,CAAC;AAEF,QAAA,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;YAChB,MAAM,IAAI,KAAK,CAAC,CAAA,0BAAA,EAA6B,QAAQ,CAAC,UAAU,CAAA,CAAE,CAAC;QACrE;IACF;AAEA;;AAEG;IACH,MAAM,WAAW,CACf,SAAiB,EACjB,QAAgB,EAChB,MAAe,EACf,MAAoB,EAAA;QAEpB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,CAAA,QAAA,CAAU,EAAE;AACtD,YAAA,MAAM,EAAE,MAAM;AACd,YAAA,OAAO,EAAE;AACP,gBAAA,cAAc,EAAE,kBAAkB;AACnC,aAAA;AACD,YAAA,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,SAAS;gBACT,QAAQ;gBACR,MAAM;aACP,CAAC;YACF,MAAM;AACP,SAAA,CAAC;AAEF,QAAA,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;YAChB,MAAM,IAAI,KAAK,CAAC,CAAA,wBAAA,EAA2B,QAAQ,CAAC,UAAU,CAAA,CAAE,CAAC;QACnE;AAEA,QAAA,OAAO,QAAQ;IACjB;AACD;;ACzDK,SAAU,UAAU,CAAC,EAAE,SAAS,EAAqB,EAAA;IACzD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC;IAC/D,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC;IACnD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAe,IAAI,CAAC;AAEtD,IAAA,MAAM,iBAAiB,GAAG,WAAW,CAAC,YAAW;QAC/C,aAAa,CAAC,IAAI,CAAC;QACnB,QAAQ,CAAC,IAAI,CAAC;AAEd,QAAA,IAAI;YACF,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,MAAM,SAAS,CAAC,aAAa,EAAE;YACnE,YAAY,CAAC,YAAY,CAAC;AAC1B,YAAA,OAAO,YAAY;QACrB;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,MAAM,KAAK,GAAG,GAAG,YAAY,KAAK,GAAG,GAAG,GAAG,IAAI,KAAK,CAAC,0BAA0B,CAAC;YAChF,QAAQ,CAAC,KAAK,CAAC;AACf,YAAA,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,KAAK,CAAC;AACjD,YAAA,MAAM,KAAK;QACb;gBAAU;YACR,aAAa,CAAC,KAAK,CAAC;QACtB;AACF,IAAA,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;AAEf,IAAA,MAAM,YAAY,GAAG,WAAW,CAAC,YAAW;QAC1C,YAAY,CAAC,IAAI,CAAC;QAClB,aAAa,CAAC,KAAK,CAAC;QACpB,QAAQ,CAAC,IAAI,CAAC;IAChB,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,iBAAiB,CAAC,CAAC;;IAG7C,SAAS,CAAC,MAAK;AACb,QAAA,OAAO,MAAK;YACV,IAAI,SAAS,EAAE;gBACb,SAAS,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,KAAI;AAC/C,oBAAA,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,GAAG,CAAC;AAC7D,gBAAA,CAAC,CAAC;YACJ;AACF,QAAA,CAAC;AACH,IAAA,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAE1B,OAAO;QACL,SAAS;QACT,UAAU;QACV,KAAK;QACL,iBAAiB;QACjB,YAAY;KACb;AACH;;AChDA;;AAEG;AACH,SAAS,aAAa,CAAC,KAAa,EAAA;IAClC,MAAM,MAAM,GAAwC,EAAE;IACtD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;IAC/B,IAAI,YAAY,GAAG,EAAE;IACrB,IAAI,WAAW,GAAG,EAAE;AAEpB,IAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AACxB,QAAA,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE;YAC9B,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;QACrC;AAAO,aAAA,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE;YACpC,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;QACpC;AAAO,aAAA,IAAI,IAAI,KAAK,EAAE,EAAE;;AAEtB,YAAA,IAAI,YAAY,IAAI,WAAW,EAAE;AAC/B,gBAAA,IAAI;oBACF,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;oBAC1C,MAAM,CAAC,IAAI,CAAC;AACV,wBAAA,KAAK,EAAE,YAAY;AACnB,wBAAA,IAAI,EAAE,UAAU;AACjB,qBAAA,CAAC;gBACJ;gBAAE,OAAO,GAAG,EAAE;oBACZ,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,WAAW,EAAE,GAAG,CAAC;gBAC9D;gBACA,YAAY,GAAG,EAAE;gBACjB,WAAW,GAAG,EAAE;YAClB;QACF;IACF;AAEA,IAAA,OAAO,MAAM;AACf;AAEM,SAAU,MAAM,CAAC,OAAA,GAAyB,EAAE,EAAA;IAChD,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO;IAE3D,MAAM,eAAe,GAAG,WAAW,CACjC,OAAO,QAAkB,KAAI;QAC3B,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE;AACzC,QAAA,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE;QAEjC,IAAI,CAAC,MAAM,EAAE;YACX,OAAO,GAAG,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;YACxC;QACF;QAEA,IAAI,MAAM,GAAG,EAAE;AAEf,QAAA,IAAI;YACF,OAAO,IAAI,EAAE;gBACX,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE;gBAE3C,IAAI,IAAI,EAAE;oBACR;gBACF;AAEA,gBAAA,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;;AAGjD,gBAAA,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC;gBAEpC,KAAK,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,MAAM,EAAE;AACpC,oBAAA,IAAI,KAAK,KAAK,WAAW,EAAE;wBACzB,WAAW,IAAI;AACf,wBAAA,SAAS,GAAG,IAAI,CAAC;oBACnB;yBAAO,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,MAAM,EAAE;AACjD,wBAAA,SAAS,GAAG,IAAI,CAAC;oBACnB;AAAO,yBAAA,IAAI,KAAK,KAAK,MAAM,EAAE;wBAC3B,MAAM,IAAI;AACV,wBAAA,SAAS,GAAG,IAAI,CAAC;oBACnB;AAAO,yBAAA,IAAI,KAAK,KAAK,OAAO,EAAE;AAC5B,wBAAA,OAAO,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,eAAe,CAAC,CAAC;AACnD,wBAAA,SAAS,GAAG,IAAI,CAAC;oBACnB;gBACF;;gBAGA,MAAM,YAAY,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC;AAC/C,gBAAA,IAAI,YAAY,KAAK,CAAC,CAAC,EAAE;oBACvB,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC;gBACzC;YACF;QACF;QAAE,OAAO,GAAG,EAAE;;YAEZ,IAAI,GAAG,YAAY,KAAK,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,EAAE;gBACrD;YACF;AACA,YAAA,MAAM,KAAK,GAAG,GAAG,YAAY,KAAK,GAAG,GAAG,GAAG,IAAI,KAAK,CAAC,kBAAkB,CAAC;AACxE,YAAA,OAAO,GAAG,KAAK,CAAC;QAClB;gBAAU;YACR,MAAM,CAAC,WAAW,EAAE;QACtB;IACF,CAAC,EACD,CAAC,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,CAC1C;IAED,OAAO;QACL,eAAe;KAChB;AACH;;AC7FA,IAAI,SAAS,GAAG,CAAC;AAEjB,SAAS,YAAY,GAAA;IACnB,SAAS,IAAI,CAAC;IACd,OAAO,CAAA,IAAA,EAAO,SAAS,CAAA,CAAE;AAC3B;AAEM,SAAU,OAAO,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAkB,EAAA;IACxE,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAY,EAAE,CAAC;IACvD,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC;IACrD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAe,IAAI,CAAC;AACtD,IAAA,MAAM,kBAAkB,GAAG,MAAM,CAAyB,IAAI,CAAC;IAE/D,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,iBAAiB,EAAE,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,YAAY,EAAE,GAAG,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;AAEpI,IAAA,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,CAAC;QACjC,WAAW,EAAE,MAAK;AAChB,YAAA,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;QAC9B,CAAC;AACD,QAAA,SAAS,EAAE,CAAC,IAAI,KAAI;YAClB,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE;;AAEvC,gBAAA,WAAW,CAAC,CAAC,IAAI,KAAI;oBACnB,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;AACzC,oBAAA,IAAI,WAAW,IAAI,WAAW,CAAC,IAAI,KAAK,WAAW,IAAI,WAAW,CAAC,WAAW,EAAE;;wBAE9E,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC;AAC9B,4BAAA,GAAG,WAAW;AACd,4BAAA,OAAO,EAAE,WAAW,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI;AACzC,yBAAA,CAAC;oBACJ;AACA,oBAAA,OAAO,IAAI;AACb,gBAAA,CAAC,CAAC;YACJ;AAAO,iBAAA,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE;;AAE/B,gBAAA,WAAW,CAAC,CAAC,IAAI,KAAI;oBACnB,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;AACzC,oBAAA,IAAI,WAAW,IAAI,WAAW,CAAC,IAAI,KAAK,WAAW,IAAI,WAAW,CAAC,WAAW,EAAE;;AAE9E,wBAAA,MAAM,iBAAiB,GAAG,WAAW,CAAC,SAAS,IAAI,EAAE;;AAGrD,wBAAA,MAAM,SAAS,GAAG,iBAAiB,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,CAAC;AAE9E,wBAAA,IAAI,gBAAgB;AACpB,wBAAA,IAAI,SAAS,IAAI,CAAC,EAAE;;AAElB,4BAAA,gBAAgB,GAAG,CAAC,GAAG,iBAAiB,CAAC;4BACzC,gBAAgB,CAAC,SAAS,CAAC,GAAG;gCAC5B,MAAM,EAAE,IAAI,CAAC,MAAM;gCACnB,IAAI,EAAE,IAAI,CAAC,IAAI;gCACf,MAAM,EAAE,IAAI,CAAC,MAAM;6BACpB;wBACH;6BAAO;;AAEL,4BAAA,gBAAgB,GAAG,CAAC,GAAG,iBAAiB,EAAE;oCACxC,MAAM,EAAE,IAAI,CAAC,MAAM;oCACnB,IAAI,EAAE,IAAI,CAAC,IAAI;oCACf,MAAM,EAAE,IAAI,CAAC,MAAM;AACpB,iCAAA,CAAC;wBACJ;wBAEA,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC;AAC9B,4BAAA,GAAG,WAAW;AACd,4BAAA,SAAS,EAAE,gBAAgB;AAC5B,yBAAA,CAAC;oBACJ;AACA,oBAAA,OAAO,IAAI;AACb,gBAAA,CAAC,CAAC;YACJ;QACF,CAAC;QACD,MAAM,EAAE,MAAK;;AAEX,YAAA,WAAW,CAAC,CAAC,IAAI,KAAI;gBACnB,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;gBACzC,IAAI,WAAW,IAAI,WAAW,CAAC,IAAI,KAAK,WAAW,EAAE;;AAEnD,oBAAA,MAAM,iBAAiB,GAAG,KAAK,EAAE,iBAAiB,IAAI,+CAA+C;oBACrG,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,iBAAiB;oBAC/D,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC;AAC9B,wBAAA,GAAG,WAAW;wBACd,OAAO;AACP,wBAAA,WAAW,EAAE,KAAK;AACnB,qBAAA,CAAC;gBACJ;AACA,gBAAA,OAAO,IAAI;AACb,YAAA,CAAC,CAAC;YACF,cAAc,CAAC,KAAK,CAAC;QACvB,CAAC;AACD,QAAA,OAAO,EAAE,CAAC,GAAG,KAAI;YACf,QAAQ,CAAC,GAAG,CAAC;YACb,cAAc,CAAC,KAAK,CAAC;;AAErB,YAAA,WAAW,CAAC,CAAC,IAAI,KAAI;gBACnB,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;AACzC,gBAAA,IAAI,WAAW,IAAI,WAAW,CAAC,IAAI,KAAK,WAAW,IAAI,WAAW,CAAC,WAAW,EAAE;oBAC9E,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;gBAC1B;AACA,gBAAA,OAAO,IAAI;AACb,YAAA,CAAC,CAAC;QACJ,CAAC;AACF,KAAA,CAAC;IAEF,MAAM,WAAW,GAAG,WAAW,CAC7B,OAAO,IAAY,KAAI;AACrB,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE;YAChB;QACF;;AAGA,QAAA,IAAI,kBAAkB,CAAC,OAAO,EAAE;AAC9B,YAAA,kBAAkB,CAAC,OAAO,CAAC,KAAK,EAAE;QACpC;;AAGA,QAAA,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE;AAC7C,QAAA,kBAAkB,CAAC,OAAO,GAAG,eAAe;QAE5C,QAAQ,CAAC,IAAI,CAAC;QAEd,cAAc,CAAC,IAAI,CAAC;;AAGpB,QAAA,MAAM,WAAW,GAAY;YAC3B,EAAE,EAAE,YAAY,EAAE;AAClB,YAAA,IAAI,EAAE,MAAM;AACZ,YAAA,OAAO,EAAE,IAAI;AACb,YAAA,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB;AACD,QAAA,WAAW,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,IAAI,EAAE,WAAW,CAAC,CAAC;;AAG7C,QAAA,MAAM,gBAAgB,GAAY;YAChC,EAAE,EAAE,YAAY,EAAE;AAClB,YAAA,IAAI,EAAE,WAAW;AACjB,YAAA,OAAO,EAAE,EAAE;AACX,YAAA,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;AACrB,YAAA,WAAW,EAAE,IAAI;SAClB;AACD,QAAA,WAAW,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,IAAI,EAAE,gBAAgB,CAAC,CAAC;;QAGlD,IAAI,gBAAgB,GAAG,SAAS;AAChC,QAAA,IAAI,CAAC,gBAAgB,IAAI,CAAC,iBAAiB,EAAE;AAC3C,YAAA,IAAI;AACF,gBAAA,gBAAgB,GAAG,MAAM,iBAAiB,EAAE;YAC9C;YAAE,OAAO,GAAG,EAAE;AACZ,gBAAA,QAAQ,CAAC,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;gBAC/C,cAAc,CAAC,KAAK,CAAC;gBACrB;YACF;QACF;;QAGA,IAAI,iBAAiB,EAAE;AACrB,YAAA,QAAQ,CAAC,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;YACjE;QACF;QAEA,IAAI,CAAC,gBAAgB,EAAE;AACrB,YAAA,QAAQ,CAAC,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;YACxC;QACF;AAEA,QAAA,IAAI;AACF,YAAA,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,WAAW,CAC1C,gBAAgB,EAChB,IAAI,EACJ,YAAY,EACZ,eAAe,CAAC,MAAM,CACvB;AACD,YAAA,MAAM,eAAe,CAAC,QAAQ,CAAC;QACjC;QAAE,OAAO,GAAG,EAAE;;YAEZ,IAAI,GAAG,YAAY,KAAK,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,EAAE;gBACrD;YACF;AAEA,YAAA,MAAM,KAAK,GAAG,GAAG,YAAY,KAAK,GAAG,GAAG,GAAG,IAAI,KAAK,CAAC,wBAAwB,CAAC;YAC9E,QAAQ,CAAC,KAAK,CAAC;YACf,cAAc,CAAC,KAAK,CAAC;;AAGrB,YAAA,WAAW,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC1C;gBAAU;;AAER,YAAA,IAAI,kBAAkB,CAAC,OAAO,KAAK,eAAe,EAAE;AAClD,gBAAA,kBAAkB,CAAC,OAAO,GAAG,IAAI;YACnC;QACF;AACF,IAAA,CAAC,EACD,CAAC,SAAS,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,SAAS,EAAE,eAAe,EAAE,YAAY,CAAC,CAC5F;AAED,IAAA,MAAM,SAAS,GAAG,WAAW,CAAC,YAAW;;AAEvC,QAAA,IAAI,kBAAkB,CAAC,OAAO,EAAE;AAC9B,YAAA,kBAAkB,CAAC,OAAO,CAAC,KAAK,EAAE;AAClC,YAAA,kBAAkB,CAAC,OAAO,GAAG,IAAI;QACnC;QAEA,WAAW,CAAC,EAAE,CAAC;QACf,QAAQ,CAAC,IAAI,CAAC;QACd,cAAc,CAAC,KAAK,CAAC;QACrB,MAAM,YAAY,EAAE;AACtB,IAAA,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC;IAElB,OAAO;QACL,QAAQ;QACR,WAAW;QACX,KAAK;QACL,YAAY;QACZ,iBAAiB;QACjB,WAAW;QACX,SAAS;KACV;AACH;;AC9OA,SAAS,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE;AAC/B,EAAE,KAAK,GAAG,KAAK,MAAM,GAAG,GAAG,GAAG,EAAE;AAChC,EAAE,IAAI,QAAQ,GAAG,GAAG,CAAC,QAAQ;;AAE7B,EAAE,IAAI,CAAC,GAAG,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE,EAAE,OAAO,CAAC;;AAEzD,EAAE,IAAI,IAAI,GAAG,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACtE,EAAE,IAAI,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC;AAC7C,EAAE,KAAK,CAAC,IAAI,GAAG,UAAU;;AAEzB,EAAE,IAAI,QAAQ,KAAK,KAAK,EAAE;AAC1B,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE;AACzB,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC;AAC/C,IAAI,CAAC,MAAM;AACX,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AAC7B,IAAI;AACJ,EAAE,CAAC,MAAM;AACT,IAAI,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AAC3B,EAAE;;AAEF,EAAE,IAAI,KAAK,CAAC,UAAU,EAAE;AACxB,IAAI,KAAK,CAAC,UAAU,CAAC,OAAO,GAAG,GAAG;AAClC,EAAE,CAAC,MAAM;AACT,IAAI,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;AACnD,EAAE;AACF;;;;;;ACZA,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,CAC7B,CAAC,EAAE,SAAS,EAAE,OAAO,GAAG,SAAS,EAAE,IAAI,GAAG,SAAS,EAAE,OAAO,GAAG,KAAK,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,KAAI;IACvF,MAAM,IAAI,GAAG,OAAO,GAAG,IAAI,GAAG,QAAQ;AAEtC,IAAA,MAAM,UAAU,GAAG;AACjB,QAAAA,QAAM,CAAC,MAAM;AACb,QAAAA,QAAM,CAAC,CAAA,QAAA,EAAW,OAAO,CAAA,CAAE,CAAC;AAC5B,QAAAA,QAAM,CAAC,CAAA,KAAA,EAAQ,IAAI,CAAA,CAAE,CAAC;QACtB,SAAS;AACV;SACE,MAAM,CAAC,OAAO;SACd,IAAI,CAAC,GAAG,CAAC;AAEZ,IAAA,QACEC,GAAA,CAAC,IAAI,EAAA,EACH,SAAS,EAAE,UAAU,EACrB,GAAG,EAAE,GAAG,EAAA,GACJ,KAAK,EAAA,CACT;AAEN,CAAC,CACF;AAED,MAAM,CAAC,WAAW,GAAG,QAAQ;;;;;;SChBb,MAAM,CAAC,EACrB,MAAM,EACN,OAAO,EACP,YAAY,EACZ,WAAW,EACX,QAAQ,GAAG,OAAO,EAClB,KAAK,GAAG,GAAG,EACX,KAAK,GAAG,QAAQ,EAChB,cAAc,GAAG,OAAO,EACxB,mBAAmB,GAAG,aAAa,EACnC,QAAQ,EACR,KAAK,GAAG,OAAO,GACH,EAAA;AACZ,IAAA,MAAM,UAAU,GAAG,OAAO,KAAK,KAAK,QAAQ,GAAG,CAAA,EAAG,KAAK,CAAA,EAAA,CAAI,GAAG,KAAK;AAEnE,IAAA,MAAM,cAAc,GAAG;AACrB,QAAAD,QAAM,CAAC,OAAO;AACd,QAAAA,QAAM,CAAC,CAAA,SAAA,EAAY,QAAQ,CAAA,CAAE,CAAC;AAC/B,KAAA,CAAC,IAAI,CAAC,GAAG,CAAC;;AAGX,IAAA,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAqB,IAAI,CAAC;AAEtF,IAAA,KAAK,CAAC,SAAS,CAAC,MAAK;QACnB,IAAI,OAAO,QAAQ,KAAK,WAAW;YAAE;;QAGrC,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AAC/C,QAAA,SAAS,CAAC,SAAS,GAAG,CAAA,MAAA,EAAS,KAAK,KAAK,MAAM,GAAG,OAAO,GAAG,EAAE,EAAE;AAChE,QAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC;QACpC,kBAAkB,CAAC,SAAS,CAAC;AAE7B,QAAA,OAAO,MAAK;AACV,YAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC;AACtC,QAAA,CAAC;AACH,IAAA,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;IAEX,QACEC,IAAC,eAAe,CAAC,IAAI,EAAA,EAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,IAAI,KAAK,CAAC,IAAI,IAAI,OAAO,EAAE,YAC5EC,IAAA,CAAC,eAAe,CAAC,MAAM,EAAA,EAAC,SAAS,EAAE,eAAe,aAEhDD,GAAA,CAAC,eAAe,CAAC,OAAO,EAAA,EAAC,SAAS,EAAED,QAAM,CAAC,OAAO,EAAA,CAAI,EAGtDE,IAAA,CAAC,eAAe,CAAC,OAAO,EAAA,EACtB,SAAS,EAAE,cAAc,EACzB,KAAK,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAA,QAAA,EAAA,CAG/BA,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAEF,QAAM,CAAC,MAAM,EAAA,QAAA,EAAA,CAC3BE,KAAC,eAAe,CAAC,KAAK,EAAA,EAAC,SAAS,EAAEF,QAAM,CAAC,KAAK,EAAA,QAAA,EAAA,CAC5CC,GAAA,CAAC,QAAQ,EAAA,EAAC,SAAS,EAAED,QAAM,CAAC,IAAI,EAAA,CAAI,EACnC,KAAK,CAAA,EAAA,CACgB,EACxBE,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAEF,QAAM,CAAC,aAAa,EAAA,QAAA,EAAA,CACjC,YAAY,IAAI,WAAW,KAC1BC,GAAA,CAAC,MAAM,EAAA,EACL,OAAO,EAAC,OAAO,EACf,IAAI,EAAC,MAAM,gBACC,mBAAmB,EAC/B,SAAS,EAAED,QAAM,CAAC,gBAAgB,EAClC,OAAO,EAAE,YAAY,YAErBC,GAAA,CAAC,SAAS,IAAC,SAAS,EAAED,QAAM,CAAC,cAAc,GAAI,EAAA,CACxC,CACV,EACDC,GAAA,CAAC,eAAe,CAAC,KAAK,EAAA,EAAC,OAAO,kBAC5BA,GAAA,CAAC,MAAM,IACL,OAAO,EAAC,OAAO,EACf,IAAI,EAAC,MAAM,EAAA,YAAA,EACC,cAAc,EAC1B,SAAS,EAAED,QAAM,CAAC,WAAW,EAAA,QAAA,EAE7BC,GAAA,CAAC,CAAC,EAAA,EAAC,SAAS,EAAED,QAAM,CAAC,SAAS,EAAA,CAAI,EAAA,CAC3B,GACa,CAAA,EAAA,CACpB,CAAA,EAAA,CACF,EAGNC,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAED,QAAM,CAAC,IAAI,EAAA,QAAA,EACxB,QAAQ,GACL,CAAA,EAAA,CACkB,CAAA,EAAA,CACH,EAAA,CACJ;AAE3B;;;;;;AChGM,SAAU,OAAO,CAAC,EACtB,OAAO,EACP,IAAI,GAAG,QAAQ,EACf,SAAS,GAAG,mBAAmB,EAC/B,SAAS,GACI,EAAA;AACb,IAAA,MAAM,UAAU,GAAG,CAACA,QAAM,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;AAExE,IAAA,QACEE,IAAA,CAAC,MAAM,EAAA,EACL,OAAO,EAAE,OAAO,EAChB,OAAO,EAAC,SAAS,EAAA,YAAA,EACL,SAAS,EACrB,SAAS,EAAE,UAAU,EAAA,QAAA,EAAA,CAErBD,GAAA,CAAC,QAAQ,EAAA,EAAC,SAAS,EAAED,QAAM,CAAC,IAAI,EAAA,CAAI,EACnC,IAAI,IAAIC,GAAA,CAAA,MAAA,EAAA,EAAA,QAAA,EAAO,IAAI,EAAA,CAAQ,CAAA,EAAA,CACrB;AAEb;;;;;;ACPM,SAAU,aAAa,CAAC,EAC5B,KAAK,EACL,gBAAgB,EAChB,SAAS,EACT,OAAO,EACP,QAAQ,EACR,WAAW,EACX,KAAK,EACL,WAAW,EACX,KAAK,EACL,QAAQ,GACW,EAAA;IACnB,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAsB,IAAI,CAAC;IAC3D,MAAM,eAAe,GAAG,KAAK,CAAC,MAAM,CAAiB,IAAI,CAAC;IAC1D,MAAM,mBAAmB,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;;AAG/C,IAAA,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,CAAC,MAAK;AACxC,QAAA,MAAM,YAAY,GAAG,eAAe,CAAC,OAAO;AAC5C,QAAA,IAAI,CAAC,YAAY;AAAE,YAAA,OAAO,IAAI;AAE9B,QAAA,MAAM,SAAS,GAAG,EAAE,CAAC;AACrB,QAAA,MAAM,YAAY,GAAG,YAAY,CAAC,YAAY,GAAG,YAAY,CAAC,SAAS,GAAG,YAAY,CAAC,YAAY;QACnG,OAAO,YAAY,GAAG,SAAS;IACjC,CAAC,EAAE,EAAE,CAAC;;AAGN,IAAA,MAAM,cAAc,GAAG,KAAK,CAAC,WAAW,CAAC,MAAK;AAC5C,QAAA,MAAM,YAAY,GAAG,eAAe,CAAC,OAAO;QAC5C,IAAI,YAAY,EAAE;AAChB,YAAA,YAAY,CAAC,SAAS,GAAG,YAAY,CAAC,YAAY;QACpD;IACF,CAAC,EAAE,EAAE,CAAC;;AAGN,IAAA,MAAM,YAAY,GAAG,KAAK,CAAC,WAAW,CAAC,MAAK;AAC1C,QAAA,MAAM,QAAQ,GAAG,UAAU,EAAE;AAC7B,QAAA,mBAAmB,CAAC,OAAO,GAAG,QAAQ;AACxC,IAAA,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC;;AAGhB,IAAA,KAAK,CAAC,SAAS,CAAC,MAAK;AACnB,QAAA,IAAI,mBAAmB,CAAC,OAAO,EAAE;AAC/B,YAAA,cAAc,EAAE;QAClB;AACF,IAAA,CAAC,EAAE,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;;AAG9B,IAAA,MAAM,oBAAoB,GAAG,KAAK,CAAC,WAAW,CAAC,MAAK;AAClD,QAAA,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO;QACpC,IAAI,QAAQ,EAAE;AACZ,YAAA,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM;YAC9B,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,QAAQ,CAAC,YAAY,CAAA,EAAA,CAAI;QACtD;IACF,CAAC,EAAE,EAAE,CAAC;;AAGN,IAAA,KAAK,CAAC,SAAS,CAAC,MAAK;AACnB,QAAA,IAAI,KAAK,IAAI,OAAO,EAAE;YACpB,OAAO,CAAC,KAAK,CAAC;QAChB;AACF,IAAA,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;;AAGpB,IAAA,KAAK,CAAC,SAAS,CAAC,MAAK;QACnB,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,EAAE;YACpC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC1C;AACF,IAAA,CAAC,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;AAEzB,IAAA,MAAM,YAAY,GAAG,OAAO,CAAkB,KAAI;QAChD,CAAC,CAAC,cAAc,EAAE;AAClB,QAAA,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE;QAC/B,IAAI,CAAC,UAAU,IAAI,WAAW;YAAE;;AAGhC,QAAA,mBAAmB,CAAC,OAAO,GAAG,IAAI;QAElC,QAAQ,CAAC,EAAE,CAAC;AACZ,QAAA,MAAM,WAAW,CAAC,UAAU,CAAC;;QAE7B,UAAU,CAAC,MAAK;AACd,YAAA,IAAI,WAAW,CAAC,OAAO,EAAE;gBACvB,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM;YAC3C;QACF,CAAC,EAAE,CAAC,CAAC;AACP,IAAA,CAAC;AAED,IAAA,MAAM,iBAAiB,GAAG,CAAC,CAAyC,KAAI;AACtE,QAAA,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;AACxB,QAAA,oBAAoB,EAAE;AACxB,IAAA,CAAC;AAED,IAAA,MAAM,aAAa,GAAG,CAAC,CAA2C,KAAI;;QAEpE,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE;YACpC,CAAC,CAAC,cAAc,EAAE;YAClB,IAAI,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE;gBAChC,YAAY,CAAC,CAAQ,CAAC;YACxB;QACF;;AAEF,IAAA,CAAC;AAED,IAAA,MAAM,kBAAkB,GAAG,OAAO,QAAgB,KAAI;AACpD,QAAA,IAAI,WAAW;YAAE;;AAEjB,QAAA,mBAAmB,CAAC,OAAO,GAAG,IAAI;AAClC,QAAA,MAAM,WAAW,CAAC,QAAQ,CAAC;AAC7B,IAAA,CAAC;AAED,IAAA,MAAM,gBAAgB,GAAG,KAAK,EAAE,gBAAgB,IAAI,mBAAmB;AACvE,IAAA,MAAM,cAAc,GAAG,KAAK,EAAE,cAAc,IAAI,+BAA+B;AAC/E,IAAA,MAAM,qBAAqB,GAAG,KAAK,EAAE,qBAAqB,IAAI,oBAAoB;;AAGlF,IAAA,MAAM,kBAAkB,GAAG,CAAC,QAAgB,KAAI;AAC9C,QAAA,IAAI,QAAQ,CAAC,WAAW,EAAE,KAAK,MAAM,EAAE;AACrC,YAAA,OAAO,cAAc;QACvB;AACA,QAAA,IAAI,QAAQ,CAAC,WAAW,EAAE,KAAK,MAAM,EAAE;AACrC,YAAA,OAAO,gBAAgB;QACzB;AACA,QAAA,OAAO,gBAAgB;AACzB,IAAA,CAAC;AAED,IAAA,QACEC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,MAAM,CAAC,SAAS,EAAA,QAAA,EAAA,CAE9BA,IAAA,CAAA,KAAA,EAAA,EACE,GAAG,EAAE,eAAe,EACpB,QAAQ,EAAE,YAAY,EACtB,SAAS,EAAE,MAAM,CAAC,YAAY,EAAA,QAAA,EAAA,CAE7B,QAAQ,CAAC,MAAM,KAAK,CAAC;;AAEpB,oBAAAA,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,MAAM,CAAC,aAAa,aAClCD,GAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAE,MAAM,CAAC,cAAc,EAAA,QAAA,EAChC,cAAc,EAAA,CACb,EAEH,gBAAgB,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,KAC9CC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,MAAM,CAAC,yBAAyB,EAAA,QAAA,EAAA,CAC9CD,WAAG,SAAS,EAAE,MAAM,CAAC,qBAAqB,YACvC,qBAAqB,EAAA,CACpB,EACH,gBAAgB,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,KAAK,MACpCA,gBAEE,OAAO,EAAE,MAAM,kBAAkB,CAAC,QAAQ,CAAC,EAC3C,SAAS,EAAE,MAAM,CAAC,aAAa,EAAA,QAAA,EAE9B,QAAQ,EAAA,EAJJ,KAAK,CAKH,CACV,CAAC,CAAA,EAAA,CACE,CACP,IACG;;AAGN,oBAAAA,GAAA,CAAAE,QAAA,EAAA,EAAA,QAAA,EACG,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,MACpBF,aAEE,SAAS,EAAE,CAAA,EAAG,MAAM,CAAC,cAAc,CAAA,CAAA,EAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA,CAAE,YAE7DA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,CAAA,EAAG,MAAM,CAAC,OAAO,CAAA,CAAA,EAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAA,QAAA,EACxD,OAAO,CAAC,IAAI,KAAK,WAAW,IAC3BC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,MAAM,CAAC,QAAQ,EAAA,QAAA,EAAA,CAE5B,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,KAChDD,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,MAAM,CAAC,kBAAkB,EAAA,QAAA,EACtC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,MAC9BC,IAAA,CAAA,MAAA,EAAA,EAEE,SAAS,EAAE,CAAA,EAAG,MAAM,CAAC,QAAQ,CAAA,CAAA,EAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA,CAAE,EAAA,QAAA,EAAA,CAEzD,kBAAkB,CAAC,QAAQ,CAAC,IAAI,CAAC,EACjC,CAAC,QAAQ,CAAC,MAAM,KAAK,WAAW,IAAI,QAAQ,CAAC,MAAM,KAAK,OAAO,IAAI,EAAE,GAAG,KAAK,CAAA,EAAA,EAJzE,QAAQ,CAAC,MAAM,CAKf,CACR,CAAC,GACE,CACP,EACDD,GAAA,CAAC,aAAa,IACZ,aAAa,EAAE,CAAC,SAAS,CAAC,EAC1B,aAAa,EAAE,CAAC,CAAC,eAAe,EAAE;AAChC,wDAAA,SAAS,EAAE,MAAM;AACjB,wDAAA,MAAM,EAAE;AACT,qDAAA,CAAC,CAAC,EAAA,QAAA,EAEF,OAAO,CAAC,OAAO,EAAA,CACF,EACf,OAAO,CAAC,WAAW,KAClBA,GAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAE,MAAM,CAAC,MAAM,EAAA,CAAI,CACnC,CAAA,EAAA,CACG,KAENA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,MAAM,CAAC,WAAW,YAC/B,OAAO,CAAC,OAAO,EAAA,CACZ,CACP,EAAA,CACG,EAAA,EAtCD,OAAO,CAAC,EAAE,CAuCX,CACP,CAAC,EAAA,CACD,CACJ,EAEA,KAAK,KACJA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,MAAM,CAAC,KAAK,EAAA,QAAA,EACzB,KAAK,CAAC,OAAO,EAAA,CACV,CACP,IACG,EAGNA,GAAA,CAAA,MAAA,EAAA,EAAM,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAA,QAAA,EACvDC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,MAAM,CAAC,YAAY,EAAA,QAAA,EAAA,CACjCD,GAAA,CAAA,UAAA,EAAA,EACE,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,iBAAiB,EAC3B,SAAS,EAAE,aAAa,EACxB,WAAW,EAAE,gBAAgB,EAC7B,SAAS,EAAE,MAAM,CAAC,KAAK,EACvB,IAAI,EAAE,CAAC,EAAA,CACP,EACFA,GAAA,CAAA,QAAA,EAAA,EACE,IAAI,EAAC,QAAQ,EACb,QAAQ,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,WAAW,EACtC,SAAS,EAAE,MAAM,CAAC,YAAY,EAAA,QAAA,EAE9BA,GAAA,CAAC,OAAO,KAAG,EAAA,CACJ,CAAA,EAAA,CACL,EAAA,CACD,CAAA,EAAA,CACH;AAEV;;AC5PM,SAAU,MAAM,CAAC,KAAkB,EAAA;AACvC,IAAA,MAAM,EACJ,MAAM,EACN,cAAc,GAAG,OAAO,EACxB,WAAW,GAAG,GAAG,EACjB,KAAK,GAAG,OAAO,EACf,KAAK,EACL,gBAAgB,EAChB,YAAY,EACZ,MAAM,EACN,YAAY,GAAG,IAAI,EACnB,MAAM,EACN,OAAO,EACP,SAAS,EACT,OAAO,EACP,SAAS,EACT,KAAK,EACL,QAAQ,GACT,GAAG,KAAK;AAET,IAAA,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;AACjD,IAAA,MAAM,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC;;IAG/D,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;;AAG5G,IAAA,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;;AAG5C,IAAA,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,CAAC,MAAK;QACxC,SAAS,CAAC,IAAI,CAAC;QACf,MAAM,IAAI;AACZ,IAAA,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;;AAGZ,IAAA,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC,MAAK;QACzC,SAAS,CAAC,KAAK,CAAC;QAChB,OAAO,IAAI;AACb,IAAA,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;;IAGb,MAAM,gBAAgB,GAAG,KAAK,CAAC,WAAW,CAAC,YAAW;QACpD,QAAQ,CAAC,EAAE,CAAC;QACZ,MAAM,SAAS,EAAE;AACnB,IAAA,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;;AAGf,IAAA,KAAK,CAAC,SAAS,CAAC,MAAK;AACnB,QAAA,IAAI,CAAC,YAAY,IAAI,CAAC,MAAM;YAAE;AAE9B,QAAA,MAAM,aAAa,GAAG,CAAC,CAAgB,KAAI;YACzC,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC;AAC5C,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;YAC9D,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;YACrF,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;YACpC,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YAChC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;AAEjC,YAAA,MAAM,WAAW,GAAG,IAAI,KAAK,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC;AACpD,YAAA,MAAM,UAAU,GAAG,GAAG,KAAK,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC;YAClD,MAAM,YAAY,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC,QAAQ;YACzC,MAAM,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,MAAM;AAEnC,YAAA,IAAI,CAAC,WAAW,IAAI,UAAU,KAAK,YAAY,IAAI,UAAU,IAAI,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,GAAG,EAAE;gBAC5F,CAAC,CAAC,cAAc,EAAE;gBAClB,SAAS,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC;YAC5B;AACF,QAAA,CAAC;AAED,QAAA,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,aAAa,CAAC;QACnD,OAAO,MAAM,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,aAAa,CAAC;AACrE,IAAA,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;AAE1B,IAAA,QACEC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,CAAA,OAAA,EAAU,SAAS,IAAI,EAAE,CAAA,CAAA,EAAI,KAAK,KAAK,MAAM,GAAG,MAAM,GAAG,EAAE,CAAA,CAAE,EAAE,KAAK,EAAE,KAAK,EAAA,QAAA,EAAA,CAExF,QAAQ,IAAK,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,IAC1C,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE;gBAC3B,GAAG,QAAQ,CAAC,KAAK;AACjB,gBAAA,OAAO,EAAE,CAAC,CAAmB,KAAI;;AAE/B,oBAAA,MAAM,eAAe,GAAG,QAAQ,CAAC,KAAK,EAAE,OAAO;oBAC/C,IAAI,eAAe,EAAE;wBACnB,eAAe,CAAC,CAAC,CAAC;oBACpB;;AAEA,oBAAA,UAAU,EAAE;gBACd,CAAC;AACF,aAAA,CAAC,KAEFD,GAAA,CAAC,OAAO,EAAA,EACN,OAAO,EAAE,UAAU,EACnB,IAAI,EAAE,KAAK,EAAE,iBAAiB,EAC9B,SAAS,EAAE,KAAK,EAAE,sBAAsB,EAAA,CACxC,CACH,EAGDA,GAAA,CAAC,MAAM,EAAA,EACL,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,WAAW,EACpB,YAAY,EAAE,gBAAgB,EAC9B,WAAW,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,EAChC,QAAQ,EAAE,cAAc,EACxB,KAAK,EAAE,WAAW,EAClB,KAAK,EAAE,KAAK,EAAE,WAAW,EACzB,cAAc,EAAE,KAAK,EAAE,oBAAoB,EAC3C,mBAAmB,EAAE,KAAK,EAAE,yBAAyB,EACrD,KAAK,EAAE,KAAK,EAAA,QAAA,EAEZA,GAAA,CAAC,aAAa,EAAA,EACZ,KAAK,EAAE,KAAK,EACZ,gBAAgB,EAAE,gBAAgB,EAClC,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,WAAW,EACxB,KAAK,EAAE,KAAK,EACZ,WAAW,EAAE,WAAW,EACxB,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,QAAQ,EAAA,CAClB,EAAA,CACK,CAAA,EAAA,CACL;AAEV;;;;;;;;;;","x_google_ignoreList":[4]}
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../src/core/api/client.ts","../src/core/hooks/useSession.ts","../src/core/hooks/useSSE.ts","../src/core/hooks/useChat.ts","../node_modules/style-inject/dist/style-inject.es.js","../src/components/ui/Button.tsx","../src/components/widget/Drawer.tsx","../src/components/widget/Trigger.tsx","../src/components/chat/ChatContainer.tsx","../src/components/widget/Widget.tsx"],"sourcesContent":["import type { SessionResponse } from '../types/index.js';\n\n/**\n * API client for Ask AI widget\n * Supports dynamic API URL configuration and optional project-scoped API\n */\nexport class APIClient {\n private baseUrl: string;\n private projectId?: string;\n\n constructor(baseUrl: string, projectId?: string) {\n this.baseUrl = baseUrl.replace(/\\/$/, ''); // Remove trailing slash\n this.projectId = projectId;\n }\n\n /**\n * Create a new session\n */\n async createSession(): Promise<SessionResponse> {\n const url = this.projectId\n ? `${this.baseUrl}/api/projects/${this.projectId}/session`\n : `${this.baseUrl}/api/session`;\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to create session: ${response.statusText}`);\n }\n\n return response.json();\n }\n\n /**\n * Delete a session\n */\n async deleteSession(sessionId: string): Promise<void> {\n const url = this.projectId\n ? `${this.baseUrl}/api/projects/${this.projectId}/session/${sessionId}`\n : `${this.baseUrl}/api/session/${sessionId}`;\n\n const response = await fetch(url, {\n method: 'DELETE',\n });\n\n if (!response.ok) {\n throw new Error(`Failed to delete session: ${response.statusText}`);\n }\n }\n\n /**\n * Ask a question and return the SSE stream response\n */\n async askQuestion(\n sessionId: string,\n question: string,\n system?: string,\n signal?: AbortSignal\n ): Promise<Response> {\n const url = this.projectId\n ? `${this.baseUrl}/api/projects/${this.projectId}/ask`\n : `${this.baseUrl}/api/ask`;\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n sessionId,\n question,\n system,\n }),\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to ask question: ${response.statusText}`);\n }\n\n return response;\n }\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport type { APIClient } from '../api/client.js';\n\ninterface UseSessionOptions {\n apiClient: APIClient;\n}\n\ninterface UseSessionReturn {\n sessionId: string | null;\n isCreating: boolean;\n error: Error | null;\n initializeSession: () => Promise<string>;\n clearSession: () => Promise<void>;\n}\n\nexport function useSession({ apiClient }: UseSessionOptions): UseSessionReturn {\n const [sessionId, setSessionId] = useState<string | null>(null);\n const [isCreating, setIsCreating] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const initializeSession = useCallback(async () => {\n setIsCreating(true);\n setError(null);\n\n try {\n const { sessionId: newSessionId } = await apiClient.createSession();\n setSessionId(newSessionId);\n return newSessionId;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to create session');\n setError(error);\n console.error('Failed to create session:', error);\n throw error;\n } finally {\n setIsCreating(false);\n }\n }, [apiClient]);\n\n const clearSession = useCallback(async () => {\n setSessionId(null);\n setIsCreating(false);\n setError(null);\n }, [sessionId, apiClient, initializeSession]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (sessionId) {\n apiClient.deleteSession(sessionId).catch((err) => {\n console.error('Failed to cleanup session on unmount:', err);\n });\n }\n };\n }, [sessionId, apiClient]);\n\n return {\n sessionId,\n isCreating,\n error,\n initializeSession,\n clearSession,\n };\n}\n","import { useCallback } from 'react';\nimport type { SSEData } from '../types/index.js';\n\ninterface UseSSEOptions {\n onConnected?: () => void;\n onMessage?: (data: SSEData) => void;\n onDone?: () => void;\n onError?: (error: Error) => void;\n}\n\ninterface UseSSEReturn {\n handleSSEStream: (response: Response) => Promise<void>;\n}\n\n/**\n * Parse SSE chunk format: \"event: type\\ndata: json\\n\\n\"\n */\nfunction parseSSEChunk(chunk: string): Array<{ event: string; data: any }> {\n const events: Array<{ event: string; data: any }> = [];\n const lines = chunk.split('\\n');\n let currentEvent = '';\n let currentData = '';\n\n for (const line of lines) {\n if (line.startsWith('event: ')) {\n currentEvent = line.slice(7).trim();\n } else if (line.startsWith('data: ')) {\n currentData = line.slice(6).trim();\n } else if (line === '') {\n // Empty line marks end of event\n if (currentEvent && currentData) {\n try {\n const parsedData = JSON.parse(currentData);\n events.push({\n event: currentEvent,\n data: parsedData,\n });\n } catch (err) {\n console.error('Failed to parse SSE data:', currentData, err);\n }\n currentEvent = '';\n currentData = '';\n }\n }\n }\n\n return events;\n}\n\nexport function useSSE(options: UseSSEOptions = {}): UseSSEReturn {\n const { onConnected, onMessage, onDone, onError } = options;\n\n const handleSSEStream = useCallback(\n async (response: Response) => {\n const reader = response.body?.getReader();\n const decoder = new TextDecoder();\n\n if (!reader) {\n onError?.(new Error('No response body'));\n return;\n }\n\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n\n // Process complete events\n const events = parseSSEChunk(buffer);\n\n for (const { event, data } of events) {\n if (event === 'connected') {\n onConnected?.();\n onMessage?.(data);\n } else if (event === 'answer' || event === 'tool') {\n onMessage?.(data);\n } else if (event === 'done') {\n onDone?.();\n onMessage?.(data);\n } else if (event === 'error') {\n onError?.(new Error(data.error || 'Unknown error'));\n onMessage?.(data);\n }\n }\n\n // Clear processed events from buffer (keep incomplete data)\n const lastEventEnd = buffer.lastIndexOf('\\n\\n');\n if (lastEventEnd !== -1) {\n buffer = buffer.slice(lastEventEnd + 2);\n }\n }\n } catch (err) {\n // Don't report AbortError as it's an intentional cancellation\n if (err instanceof Error && err.name === 'AbortError') {\n return;\n }\n const error = err instanceof Error ? err : new Error('SSE stream error');\n onError?.(error);\n } finally {\n reader.releaseLock();\n }\n },\n [onConnected, onMessage, onDone, onError]\n );\n\n return {\n handleSSEStream,\n };\n}\n","import { useState, useCallback, useRef } from 'react';\nimport { useSession } from './useSession.js';\nimport { useSSE } from './useSSE.js';\nimport type { Message, WidgetTexts } from '../types/index.js';\nimport type { APIClient } from '../api/client.js';\n\ninterface UseChatOptions {\n apiClient: APIClient;\n systemPrompt?: string;\n texts?: WidgetTexts;\n}\n\ninterface UseChatReturn {\n messages: Message[];\n isStreaming: boolean;\n error: Error | null;\n sessionError: Error | null;\n isCreatingSession: boolean;\n sendMessage: (text: string) => Promise<void>;\n resetChat: () => Promise<void>;\n}\n\nlet idCounter = 0;\n\nfunction getMessageId() {\n idCounter += 1;\n return `msg-${idCounter}`; \n}\n\nexport function useChat({ apiClient, systemPrompt, texts }: UseChatOptions): UseChatReturn {\n const [messages, setMessages] = useState<Message[]>([]);\n const [isStreaming, setIsStreaming] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const abortControllerRef = useRef<AbortController | null>(null);\n\n const { sessionId, isCreating: isCreatingSession, error: sessionError, initializeSession, clearSession } = useSession({ apiClient });\n\n const { handleSSEStream } = useSSE({\n onConnected: () => {\n console.log('SSE connected');\n },\n onMessage: (data) => {\n if (data.type === 'answer' && data.text) {\n // Accumulate the answer text\n setMessages((prev) => {\n const lastMessage = prev[prev.length - 1];\n if (lastMessage && lastMessage.role === 'assistant' && lastMessage.isStreaming) {\n // Update the last assistant message\n return prev.slice(0, -1).concat({\n ...lastMessage,\n content: lastMessage.content + data.text,\n });\n }\n return prev;\n });\n } else if (data.type === 'tool') {\n // Handle tool updates\n setMessages((prev) => {\n const lastMessage = prev[prev.length - 1];\n if (lastMessage && lastMessage.role === 'assistant' && lastMessage.isStreaming) {\n // Get existing tool calls or create new array\n const existingToolCalls = lastMessage.toolCalls || [];\n\n // Find the tool call with this callID\n const toolIndex = existingToolCalls.findIndex(tc => tc.callID === data.callID);\n\n let updatedToolCalls;\n if (toolIndex >= 0) {\n // Update existing tool call\n updatedToolCalls = [...existingToolCalls];\n updatedToolCalls[toolIndex] = {\n callID: data.callID,\n tool: data.tool,\n status: data.status,\n };\n } else {\n // Add new tool call\n updatedToolCalls = [...existingToolCalls, {\n callID: data.callID,\n tool: data.tool,\n status: data.status,\n }];\n }\n\n return prev.slice(0, -1).concat({\n ...lastMessage,\n toolCalls: updatedToolCalls,\n });\n }\n return prev;\n });\n }\n },\n onDone: () => {\n // Mark streaming complete\n setMessages((prev) => {\n const lastMessage = prev[prev.length - 1];\n if (lastMessage && lastMessage.role === 'assistant') {\n // If AI didn't send any content, show a fallback message\n const emptyResponseText = texts?.emptyResponseText || 'Something went wrong. Please try again later.';\n const content = lastMessage.content.trim() || emptyResponseText;\n return prev.slice(0, -1).concat({\n ...lastMessage,\n content,\n isStreaming: false,\n });\n }\n return prev;\n });\n setIsStreaming(false);\n },\n onError: (err) => {\n setError(err);\n setIsStreaming(false);\n // Remove the failed assistant message\n setMessages((prev) => {\n const lastMessage = prev[prev.length - 1];\n if (lastMessage && lastMessage.role === 'assistant' && lastMessage.isStreaming) {\n return prev.slice(0, -1);\n }\n return prev;\n });\n },\n });\n\n const sendMessage = useCallback(\n async (text: string) => {\n if (!text.trim()) {\n return;\n }\n\n // Abort any ongoing request\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n\n // Create new AbortController for this request\n const abortController = new AbortController();\n abortControllerRef.current = abortController;\n\n setError(null);\n\n setIsStreaming(true);\n\n // Add user message immediately (optimistic UI)\n const userMessage: Message = {\n id: getMessageId(),\n role: 'user',\n content: text,\n timestamp: Date.now(),\n };\n setMessages((prev) => [...prev, userMessage]);\n\n // Add placeholder for assistant response\n const assistantMessage: Message = {\n id: getMessageId(),\n role: 'assistant',\n content: '',\n timestamp: Date.now(),\n isStreaming: true,\n };\n setMessages((prev) => [...prev, assistantMessage]);\n\n // Create session if it doesn't exist yet\n let currentSessionId = sessionId;\n if (!currentSessionId && !isCreatingSession) {\n try {\n currentSessionId = await initializeSession();\n } catch (err) {\n setError(new Error('Failed to create session'));\n setIsStreaming(false);\n return;\n }\n }\n\n // Wait for session to be created if it's currently being created\n if (isCreatingSession) {\n setError(new Error('Session is being created, please try again'));\n return;\n }\n\n if (!currentSessionId) {\n setError(new Error('No active session'));\n return;\n }\n\n try {\n const response = await apiClient.askQuestion(\n currentSessionId,\n text,\n systemPrompt,\n abortController.signal\n );\n await handleSSEStream(response);\n } catch (err) {\n // Don't treat aborted requests as errors\n if (err instanceof Error && err.name === 'AbortError') {\n return;\n }\n\n const error = err instanceof Error ? err : new Error('Failed to send message');\n setError(error);\n setIsStreaming(false);\n\n // Remove the failed messages\n setMessages((prev) => prev.slice(0, -2));\n } finally {\n // Clear the abort controller reference if this was the current one\n if (abortControllerRef.current === abortController) {\n abortControllerRef.current = null;\n }\n }\n },\n [sessionId, isCreatingSession, initializeSession, apiClient, handleSSEStream, systemPrompt]\n );\n\n const resetChat = useCallback(async () => {\n // Abort any ongoing request\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n abortControllerRef.current = null;\n }\n\n setMessages([]);\n setError(null);\n setIsStreaming(false);\n await clearSession();\n }, [clearSession]);\n\n return {\n messages,\n isStreaming,\n error,\n sessionError,\n isCreatingSession,\n sendMessage,\n resetChat,\n };\n}\n","function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","import * as React from 'react';\nimport { Slot } from '@radix-ui/react-slot';\nimport styles from './Button.module.css';\n\ntype ButtonVariant = 'default' | 'outline' | 'ghost' | 'icon';\ntype ButtonSize = 'default' | 'sm' | 'lg' | 'icon';\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n asChild?: boolean;\n variant?: ButtonVariant;\n size?: ButtonSize;\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant = 'default', size = 'default', asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : 'button';\n\n const classNames = [\n styles.button,\n styles[`variant-${variant}`],\n styles[`size-${size}`],\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <Comp\n className={classNames}\n ref={ref}\n {...props}\n />\n );\n }\n);\n\nButton.displayName = 'Button';\n\nexport { Button };\n","import * as React from 'react';\nimport * as DialogPrimitive from '@radix-ui/react-dialog';\nimport { Sparkles, X, RotateCcw } from 'lucide-react';\nimport { Button } from '../ui/Button.js';\nimport styles from './Drawer.module.css';\n\ninterface DrawerProps {\n isOpen: boolean;\n onClose: () => void;\n onNewSession?: () => void;\n hasMessages?: boolean;\n position?: 'right' | 'left';\n width?: number | string;\n title?: string;\n closeAriaLabel?: string;\n newSessionAriaLabel?: string;\n children?: React.ReactNode;\n theme?: 'light' | 'dark';\n}\n\nexport function Drawer({\n isOpen,\n onClose,\n onNewSession,\n hasMessages,\n position = 'right',\n width = 600,\n title = 'Ask AI',\n closeAriaLabel = 'Close',\n newSessionAriaLabel = 'New session',\n children,\n theme = 'light',\n}: DrawerProps) {\n const widthStyle = typeof width === 'number' ? `${width}px` : width;\n\n const contentClasses = [\n styles.content,\n styles[`position-${position}`],\n ].join(' ');\n\n // Create a portal container that inherits theme from the nearest .ask-ai ancestor\n const [portalContainer, setPortalContainer] = React.useState<HTMLElement | null>(null);\n\n React.useEffect(() => {\n if (typeof document === 'undefined') return;\n\n // Create a portal container with ask-ai class\n const container = document.createElement('div');\n container.className = `ask-ai${theme === 'dark' ? ' dark' : ''}`;\n document.body.appendChild(container);\n setPortalContainer(container);\n\n return () => {\n document.body.removeChild(container);\n };\n }, [theme]);\n\n return (\n <DialogPrimitive.Root open={isOpen} onOpenChange={(open) => !open && onClose()}>\n <DialogPrimitive.Portal container={portalContainer}>\n {/* Overlay */}\n <DialogPrimitive.Overlay className={styles.overlay} />\n\n {/* Drawer Content */}\n <DialogPrimitive.Content\n className={contentClasses}\n style={{ maxWidth: widthStyle }}\n >\n {/* Header */}\n <div className={styles.header}>\n <DialogPrimitive.Title className={styles.title}>\n <Sparkles className={styles.icon} />\n {title}\n </DialogPrimitive.Title>\n <div className={styles.headerActions}>\n {onNewSession && hasMessages && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label={newSessionAriaLabel}\n className={styles.newSessionButton}\n onClick={onNewSession}\n >\n <RotateCcw className={styles.newSessionIcon} />\n </Button>\n )}\n <DialogPrimitive.Close asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label={closeAriaLabel}\n className={styles.closeButton}\n >\n <X className={styles.closeIcon} />\n </Button>\n </DialogPrimitive.Close>\n </div>\n </div>\n\n {/* Content */}\n <div className={styles.body}>\n {children}\n </div>\n </DialogPrimitive.Content>\n </DialogPrimitive.Portal>\n </DialogPrimitive.Root>\n );\n}\n","import { Sparkles } from 'lucide-react';\nimport { Button } from '../ui/Button.js';\nimport styles from './Trigger.module.css';\n\ninterface TriggerProps {\n onClick: () => void;\n text?: string;\n ariaLabel?: string;\n className?: string;\n}\n\nexport function Trigger({\n onClick,\n text = 'Ask AI',\n ariaLabel = 'Open AI assistant',\n className,\n}: TriggerProps) {\n const classNames = [styles.trigger, className].filter(Boolean).join(' ');\n\n return (\n <Button\n onClick={onClick}\n variant=\"outline\"\n aria-label={ariaLabel}\n className={classNames}\n >\n <Sparkles className={styles.icon} />\n {text && <span>{text}</span>}\n </Button>\n );\n}\n","import * as React from 'react';\nimport ReactMarkdown from 'react-markdown';\nimport remarkGfm from 'remark-gfm';\nimport rehypeHighlight from 'rehype-highlight';\nimport { common } from 'lowlight';\nimport type { WidgetTexts, Message } from '../../core/types/index.js';\nimport styles from './ChatContainer.module.css';\nimport { ArrowUp } from 'lucide-react';\n\ninterface ChatContainerProps {\n texts?: WidgetTexts;\n exampleQuestions?: string[];\n onMessage?: (message: any) => void;\n onError?: (error: Error) => void;\n // Lifted state from parent\n messages: Message[];\n isStreaming: boolean;\n error: Error | null;\n sendMessage: (text: string) => Promise<void>;\n input: string;\n setInput: React.Dispatch<React.SetStateAction<string>>;\n}\n\nexport function ChatContainer({\n texts,\n exampleQuestions,\n onMessage,\n onError,\n messages,\n isStreaming,\n error,\n sendMessage,\n input,\n setInput,\n}: ChatContainerProps) {\n const textareaRef = React.useRef<HTMLTextAreaElement>(null);\n const messagesAreaRef = React.useRef<HTMLDivElement>(null);\n const shouldAutoScrollRef = React.useRef(true); // Track if auto-scroll is enabled\n\n // Check if user is at the bottom of the messages area\n const isAtBottom = React.useCallback(() => {\n const messagesArea = messagesAreaRef.current;\n if (!messagesArea) return true;\n\n const threshold = 50; // pixels from bottom to consider \"at bottom\"\n const scrollBottom = messagesArea.scrollHeight - messagesArea.scrollTop - messagesArea.clientHeight;\n return scrollBottom < threshold;\n }, []);\n\n // Scroll to bottom of messages area\n const scrollToBottom = React.useCallback(() => {\n const messagesArea = messagesAreaRef.current;\n if (messagesArea) {\n messagesArea.scrollTop = messagesArea.scrollHeight;\n }\n }, []);\n\n // Handle user scroll events\n const handleScroll = React.useCallback(() => {\n const atBottom = isAtBottom();\n shouldAutoScrollRef.current = atBottom;\n }, [isAtBottom]);\n\n // Auto-scroll when messages change (if enabled)\n React.useEffect(() => {\n if (shouldAutoScrollRef.current) {\n scrollToBottom();\n }\n }, [messages, scrollToBottom]);\n\n // Auto-resize textarea based on content\n const adjustTextareaHeight = React.useCallback(() => {\n const textarea = textareaRef.current;\n if (textarea) {\n textarea.style.height = 'auto';\n textarea.style.height = `${textarea.scrollHeight}px`;\n }\n }, []);\n\n // Call onError callback when error occurs\n React.useEffect(() => {\n if (error && onError) {\n onError(error);\n }\n }, [error, onError]);\n\n // Call onMessage callback when new message arrives\n React.useEffect(() => {\n if (messages.length > 0 && onMessage) {\n onMessage(messages[messages.length - 1]);\n }\n }, [messages, onMessage]);\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n const inputValue = input.trim();\n if (!inputValue || isStreaming) return;\n\n // Enable auto-scroll for new user message\n shouldAutoScrollRef.current = true;\n\n setInput('');\n await sendMessage(inputValue);\n // Reset textarea height after submission\n setTimeout(() => {\n if (textareaRef.current) {\n textareaRef.current.style.height = 'auto';\n }\n }, 0);\n };\n\n const handleInputChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n setInput(e.target.value);\n adjustTextareaHeight();\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n // Submit on Enter (without Shift)\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n if (input.trim() && !isStreaming) {\n handleSubmit(e as any);\n }\n }\n // Allow Shift+Enter for new line (default textarea behavior)\n };\n\n const handleExampleClick = async (question: string) => {\n if (isStreaming) return;\n // Enable auto-scroll for new user message\n shouldAutoScrollRef.current = true;\n await sendMessage(question);\n };\n\n const inputPlaceholder = texts?.inputPlaceholder || 'Ask a question...';\n const welcomeMessage = texts?.welcomeMessage || 'Hi! How can I help you today?';\n const exampleQuestionsTitle = texts?.exampleQuestionsTitle || 'Example questions:';\n\n // Helper function to format tool name\n const getToolDisplayName = (toolName: string) => {\n if (toolName.toLowerCase() === 'read') {\n return 'Reading docs';\n }\n if (toolName.toLowerCase() === 'task') {\n return 'Exploring docs';\n }\n return 'Searching docs';\n };\n\n return (\n <div className={styles.container}>\n {/* Messages Area */}\n <div\n ref={messagesAreaRef}\n onScroll={handleScroll}\n className={styles.messagesArea}\n >\n {messages.length === 0 ? (\n // Welcome Screen\n <div className={styles.welcomeScreen}>\n <p className={styles.welcomeMessage}>\n {welcomeMessage}\n </p>\n\n {exampleQuestions && exampleQuestions.length > 0 && (\n <div className={styles.exampleQuestionsContainer}>\n <p className={styles.exampleQuestionsTitle}>\n {exampleQuestionsTitle}\n </p>\n {exampleQuestions.map((question, index) => (\n <button\n key={index}\n onClick={() => handleExampleClick(question)}\n className={styles.exampleButton}\n >\n {question}\n </button>\n ))}\n </div>\n )}\n </div>\n ) : (\n // Messages\n <>\n {messages.map((message) => (\n <div\n key={message.id}\n className={`${styles.messageWrapper} ${styles[message.role]}`}\n >\n <div className={`${styles.message} ${styles[message.role]}`}>\n {message.role === 'assistant' ? (\n <div className={styles.markdown}>\n {/* Display tool calls if present */}\n {message.toolCalls && message.toolCalls.length > 0 && (\n <div className={styles.toolCallsContainer}>\n {message.toolCalls.map((toolCall) => (\n <span\n key={toolCall.callID}\n className={`${styles.toolCall} ${styles[`tool-${toolCall.status}`]}`}\n >\n {getToolDisplayName(toolCall.tool)}\n {(toolCall.status === 'completed' || toolCall.status === 'error') ? '' : '...'}\n </span>\n ))}\n </div>\n )}\n <ReactMarkdown\n remarkPlugins={[remarkGfm]}\n rehypePlugins={[[rehypeHighlight, {\n languages: common,\n prefix: 'hljs-'\n }]]}\n >\n {message.content}\n </ReactMarkdown>\n {message.isStreaming && (\n <span className={styles.cursor} />\n )}\n </div>\n ) : (\n <div className={styles.messageText}>\n {message.content}\n </div>\n )}\n </div>\n </div>\n ))}\n </>\n )}\n\n {error && (\n <div className={styles.error}>\n {error.message}\n </div>\n )}\n </div>\n\n {/* Input Area */}\n <form onSubmit={handleSubmit} className={styles.inputForm}>\n <div className={styles.inputWrapper}>\n <textarea\n ref={textareaRef}\n value={input}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n placeholder={inputPlaceholder}\n className={styles.input}\n rows={1}\n />\n <button\n type=\"submit\"\n disabled={!input.trim() || isStreaming}\n className={styles.submitButton}\n >\n <ArrowUp />\n </button>\n </div>\n </form>\n </div>\n );\n}\n","import * as React from 'react';\nimport { APIClient } from '../../core/api/client.js';\nimport { useChat } from '../../core/hooks/useChat.js';\nimport type { WidgetProps } from '../../core/types/index.js';\nimport { Drawer } from './Drawer.js';\nimport { Trigger } from './Trigger.js';\nimport { ChatContainer } from '../chat/ChatContainer.js';\n\nexport function Widget(props: WidgetProps) {\n const {\n apiUrl,\n projectId,\n drawerPosition = 'right',\n drawerWidth = 600,\n theme = 'light',\n texts,\n exampleQuestions,\n systemPrompt,\n hotkey,\n enableHotkey = true,\n onOpen,\n onClose,\n onMessage,\n onError,\n className,\n style,\n children,\n } = props;\n\n const [isOpen, setIsOpen] = React.useState(false);\n const [apiClient] = React.useState(() => new APIClient(apiUrl, projectId));\n\n // Lift chat state to Widget level to persist across drawer open/close\n const { messages, isStreaming, error, sendMessage, resetChat } = useChat({ apiClient, systemPrompt, texts });\n\n // Input state also needs to persist\n const [input, setInput] = React.useState('');\n\n // Handle drawer open\n const handleOpen = React.useCallback(() => {\n setIsOpen(true);\n onOpen?.();\n }, [onOpen]);\n\n // Handle drawer close\n const handleClose = React.useCallback(() => {\n setIsOpen(false);\n onClose?.();\n }, [onClose]);\n\n // Handle new session\n const handleNewSession = React.useCallback(async () => {\n setInput('');\n await resetChat();\n }, [resetChat]);\n\n // Handle keyboard shortcut\n React.useEffect(() => {\n if (!enableHotkey || !hotkey) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n const keys = hotkey.toLowerCase().split('+');\n const ctrl = keys.includes('ctrl') || keys.includes('control');\n const cmd = keys.includes('cmd') || keys.includes('command') || keys.includes('meta');\n const shift = keys.includes('shift');\n const alt = keys.includes('alt');\n const key = keys[keys.length - 1];\n\n const ctrlPressed = ctrl && (e.ctrlKey || e.metaKey);\n const cmdPressed = cmd && (e.metaKey || e.ctrlKey);\n const shiftPressed = !shift || e.shiftKey;\n const altPressed = !alt || e.altKey;\n\n if ((ctrlPressed || cmdPressed) && shiftPressed && altPressed && e.key.toLowerCase() === key) {\n e.preventDefault();\n setIsOpen((prev) => !prev);\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [enableHotkey, hotkey]);\n\n return (\n <div className={`ask-ai ${className || ''} ${theme === 'dark' ? 'dark' : ''}`} style={style}>\n {/* Trigger Button - Custom or Default */}\n {children && React.isValidElement(children) ? (\n React.cloneElement(children, {\n ...children.props,\n onClick: (e: React.MouseEvent) => {\n // Call existing onClick if present\n const existingOnClick = children.props?.onClick;\n if (existingOnClick) {\n existingOnClick(e);\n }\n // Then call our handleOpen\n handleOpen();\n },\n })\n ) : (\n <Trigger\n onClick={handleOpen}\n text={texts?.triggerButtonText}\n ariaLabel={texts?.triggerButtonAriaLabel}\n />\n )}\n\n {/* Drawer with Chat */}\n <Drawer\n isOpen={isOpen}\n onClose={handleClose}\n onNewSession={handleNewSession}\n hasMessages={messages.length > 0}\n position={drawerPosition}\n width={drawerWidth}\n title={texts?.drawerTitle}\n closeAriaLabel={texts?.drawerCloseAriaLabel}\n newSessionAriaLabel={texts?.drawerNewSessionAriaLabel}\n theme={theme}\n >\n <ChatContainer\n texts={texts}\n exampleQuestions={exampleQuestions}\n onMessage={onMessage}\n onError={onError}\n messages={messages}\n isStreaming={isStreaming}\n error={error}\n sendMessage={sendMessage}\n input={input}\n setInput={setInput}\n />\n </Drawer>\n </div>\n );\n}\n"],"names":["styles","_jsx","_jsxs","_Fragment"],"mappings":"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","x_google_ignoreList":[4]}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import type { SessionResponse } from '../types/index.js';
|
|
2
2
|
/**
|
|
3
3
|
* API client for Ask AI widget
|
|
4
|
-
* Supports dynamic API URL configuration
|
|
4
|
+
* Supports dynamic API URL configuration and optional project-scoped API
|
|
5
5
|
*/
|
|
6
6
|
export declare class APIClient {
|
|
7
7
|
private baseUrl;
|
|
8
|
-
|
|
8
|
+
private projectId?;
|
|
9
|
+
constructor(baseUrl: string, projectId?: string);
|
|
9
10
|
/**
|
|
10
11
|
* Create a new session
|
|
11
12
|
*/
|