@inkeep/agents-ui 0.15.21 → 0.15.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,3 +1,4 @@
1
- "use client";"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const He=require("@ai-sdk/react"),We=require("ai"),t=require("react"),$e=require("../modal/modal-provider.cjs"),je=require("../../providers/chat-bubble-provider.cjs"),ze=require("../../providers/sidebar-chat-provider.cjs"),Je=require("../../providers/config-provider.cjs"),Ke=require("./use-captcha.cjs"),Ge=require("../../hooks/use-media-query.cjs"),Qe=require("../../hooks/use-anonymous-session.cjs"),Ve=require("../../hooks/use-auth-token.cjs"),Ze=require("../../hooks/use-conversation-loader.cjs"),x=require("../../utils/generate-uid.cjs"),Xe=require("../../providers/base-events-provider.cjs"),Ye=require("../../providers/chat-form-provider.cjs"),et=require("../../providers/widget-provider.cjs"),tt=require("@radix-ui/react-use-controllable-state"),st=require("../../hooks/use-streaming-events.cjs"),rt=require("../../hooks/use-inkeep-api-client.cjs");function nt(f){const h=f.message??"";let s=Number(f.code)||Number(f.statusCode);if(Number.isNaN(s))try{s=Number(JSON.parse(h).status)}catch{}const l=rt.parseAuthError(s,{detail:h});return l!==null?l:s===401?"session":null}const P=`Hmm..
1
+ "use client";"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const Ke=require("@ai-sdk/react"),We=require("ai"),t=require("react"),ze=require("../modal/modal-provider.cjs"),Je=require("../../providers/chat-bubble-provider.cjs"),Ge=require("../../providers/sidebar-chat-provider.cjs"),Qe=require("../../providers/config-provider.cjs"),Ve=require("./use-captcha.cjs"),Ze=require("../../hooks/use-media-query.cjs"),Xe=require("../../hooks/use-anonymous-session.cjs"),Ye=require("../../hooks/use-auth-token.cjs"),et=require("../../hooks/use-conversation-loader.cjs"),N=require("../../utils/generate-uid.cjs"),tt=require("../../providers/base-events-provider.cjs"),st=require("../../providers/chat-form-provider.cjs"),rt=require("../../providers/widget-provider.cjs"),nt=require("@radix-ui/react-use-controllable-state"),at=require("../../hooks/use-streaming-events.cjs"),ot=require("../../hooks/use-inkeep-api-client.cjs");function it(f){const h=f.message??"";let s=Number(f.code)||Number(f.statusCode);if(Number.isNaN(s))try{s=Number(JSON.parse(h).status)}catch{}const l=ot.parseAuthError(s,{detail:h});return l!==null?l:s===401?"session":null}const O=`Hmm..
2
2
 
3
- It seems I might be having some issues right now. Please clear the chat and try again.`,at=()=>{const{baseSettings:f,aiChatSettings:h}=Je.useInkeepConfig(),[s="",l]=tt.useControllableState({prop:h.conversationId,defaultProp:h.conversationId??""}),ve=$e.useModal(),ye=je.useOptionalChatBubble(),be=ze.useOptionalSidebarChat(),{logEvent:g}=Xe.useBaseEvents(),{setConversationId:Ce,emitToParent:k}=st.useStreamingEvents(),Q=t.useRef(s);t.useEffect(()=>{const e=Q.current;Q.current=s,e!==s&&g({eventName:"chat_conversation_changed",properties:{conversationId:s,previousConversationId:e}})},[s,g]);const[y,A]=t.useState(""),Se=e=>A(e.target.value),{shouldBypassCaptcha:V,filters:Z,privacyPreferences:Re,userProperties:N}=f,{authToken:I,refreshToken:X}=Ve.useAuthToken(),Y=!!f.getAuthToken,d=!!I,{onInputMessageChange:ke,filters:ee,baseUrl:E,agentUrl:Ae,context:te,headers:se,appId:b,apiKey:m}=h,Ie=ve?.isOpen??ye?.isOpen??be?.isOpen??!0,{getCaptchaHeader:C,invalidate:c}=Ke.useCaptcha({baseUrl:E,shouldBypassCaptcha:V||!!m,shouldMakeInitialRequest:Ie}),re=t.useRef(C);re.current=C;const ne=Ae||`${E}/run/api/chat`,{sessionToken:O,refreshSession:_}=Qe.useAnonymousSession({baseUrl:E,appId:b,getCaptchaHeader:C,invalidateCaptcha:c,optOutAllAnalytics:Re?.optOutAllAnalytics,enabled:!d}),{loadConversation:ae}=Ze.useConversationLoader({baseUrl:E,appId:b,authToken:m??(d?I:O),getCaptchaHeader:C,invalidateCaptcha:c,refreshSession:m||d?void 0:_}),[Ee,oe]=t.useState(!1),F=t.useRef(null);F.current=O;const U=t.useRef(null);U.current=I;const D=t.useRef(void 0);D.current=N&&Object.keys(N).length>0?JSON.stringify(N):void 0;const v=t.useRef(0),ie=t.useRef(null),B=t.useRef(null),ue=t.useRef(se);ue.current=se;const L=t.useRef(void 0);L.current=Z||ee?JSON.stringify({...Z,...ee}):void 0;const we=e=>{switch(e.code){case 400:return e.message;case 401:return Y?"Authentication failed. Please try again.":P;case 403:return`There seems to be a configuration error. Please contact ${f.organizationDisplayName??"Administrator"}`;default:return P}},[Te,S]=t.useState([]),[Me,w]=t.useState(null),qe=t.useMemo(()=>new We.DefaultChatTransport({api:ne,headers:()=>{const e=m??U.current??F.current;return{"x-inkeep-client-timezone":Intl.DateTimeFormat().resolvedOptions().timeZone,"x-inkeep-client-timestamp":new Date().toISOString(),...b?{"x-inkeep-app-id":b}:{},...e?{Authorization:`Bearer ${e}`}:{},...L.current?{"inkeep-filters":L.current}:{},...D.current?{"x-inkeep-user-properties":D.current}:{},...ue.current}},prepareSendMessagesRequest:async e=>{const r=await re.current();return{body:{...e.body,id:e.id,messages:e.messages,trigger:e.trigger,messageId:e.messageId},headers:{...e.headers,...r}}},body:{requestContext:te}}),[ne,te,b,m]),{messages:T,sendMessage:H,addToolApprovalResponse:W,status:ce,setMessages:p,stop:M,error:$}=He.useChat({transport:qe,onData(e){k(e.type,e.data)},async onFinish(){k("completion",{conversationId:s}),await g({eventName:"assistant_message_received",properties:{conversationId:s}}),g({eventName:"assistant_answer_displayed",properties:{conversationId:s}})},onError(e){console.error("onError",{code:e.code,message:e.message});const r=V||m?null:nt(e);if(r!==null&&v.current<1){v.current++;const o=B.current,a=ie.current;(async()=>{if(r==="session"&&Y){const n=await X();if(!n)throw new Error("Auth token refresh failed");U.current=n}else if(r==="session"){const n=await _();n&&(F.current=n)}else c();if(o){W(o);return}a&&(p(n=>{let u=[...n];return u.at(-1)?.role==="assistant"&&(u=u.slice(0,-1)),u.at(-1)?.role==="user"&&(u=u.slice(0,-1)),u}),H({text:a.content},{body:a.body}))})().catch(()=>{v.current=0,c(),p(n=>{const u=[...n],G=u[u.length-1];if(!G)return u;const me=P;return G.role==="user"?u.push({id:x.generateUid(16),role:"assistant",parts:[{type:"text",text:me}]}):G.parts=[{type:"text",text:me}],u})});return}v.current=0,r!==null&&c(),g({eventName:"chat_error",properties:{conversationId:s,error:e.message}}),p(o=>{const a=[...o],i=a[a.length-1];if(i){const n=we(e);i.role==="user"?a.push({id:x.generateUid(16),role:"assistant",parts:[{type:"text",text:n}]}):i.parts=[{type:"text",text:n}]}return a})}}),le=t.useRef(d);t.useEffect(()=>{const e=le.current;le.current=d,e!==d&&(M(),R(null),p([]),l(""),A(""),S([]),w(null),c())},[d,M,p,l,c]);const de=ce==="submitted",j=ce==="streaming",xe=t.useMemo(()=>{const e=i=>{if(!i||typeof i!="object")return!1;const n=i;return typeof n.type=="string"&&n.type.startsWith("tool-")},o=[...T??[]].reverse().find(i=>i.role==="assistant");if(!o)return!1;const a=o.parts?.at(-1);return!(!e(a)||a.state!=="output-available"||!a.approval?.id||j)},[T,j]),pe=j||xe,fe=de||pe,Pe=T.length===0,z=!y.trim()||fe,Ne=Ge.useMediaQuery("(max-width: 768px)"),[Oe,R]=t.useState(null);t.useEffect(()=>{$&&R($)},[$]);const _e=()=>R(null),he=t.useRef(null);t.useEffect(()=>{ke?.(y)},[y]);const Fe=e=>{e.key==="Enter"&&!e.shiftKey&&!z&&!e.nativeEvent.isComposing&&(e.preventDefault(),J())},J=async(e=y)=>{if(z&&(!e||e.trim().length===0))return;S([]),A(""),v.current=0,B.current=null,await g({eventName:"user_message_submitted",properties:{conversationId:s}});let r=s;r||(r=`conv_${x.generateUid(16)}`,l(r)),Ce(r),ie.current={content:e,body:{conversationId:r}},H({text:e},{body:{conversationId:r}})},Ue=t.useCallback(e=>{v.current=0,B.current=e,W(e)},[W]),K=t.useCallback(()=>{M().then(()=>{k("aborted",{conversationId:s})})},[M,s,k]),ge=()=>{_e(),p([]),l(""),S([]),w(null),c(),g({eventName:"chat_clear_button_clicked",properties:{conversationId:s}})},q=t.useCallback((e,r)=>{R(null),p(r),l(e),S([]),w(null),c()},[p,l,c]),De=t.useCallback(async(e,r)=>{K(),q(e,[]),oe(!0);try{const o=await ae(e,r),a=o?.[o.length-1],i=o!==null&&a?.role==="user"?[...o,{id:x.generateUid(16),role:"assistant",parts:[{type:"text",text:"This session was interrupted. Please check back in a few minutes or start a new conversation."}]}]:o;i!==null&&q(e,i)}finally{r?.aborted||oe(!1)}},[q,ae,K]),{openForm:Be}=Ye.useChatForm(),Le=et.useWidget();return t.useImperativeHandle(h.chatFunctionsRef,()=>({submitMessage:J,updateInputMessage(e){A(e)},clearChat:ge,openForm:e=>{Le?.setView("chat"),Be(e,void 0)},focusInput:()=>{he.current?.focus()}})),{messages:T,sendMessage:H,addToolApprovalResponse:Ue,isLoading:de,isStreaming:pe,isBusy:fe,error:Oe,setError:R,isSubmitDisabled:z,input:y,handleInputChange:Se,handleInputKeyDown:Fe,handleSubmit:J,stop:K,clear:ge,inputRef:he,isMobile:Ne,messageAttachments:Te,setMessageAttachments:S,selectedWorkflow:Me,setSelectedWorkflow:w,isNewChat:Pe,conversationId:s,restoreSession:q,loadAndRestoreSession:De,isSessionLoading:Ee,sessionToken:d?I:O,refreshSession:d?X:_,getCaptchaHeader:C,invalidateCaptcha:c}};exports.DEFAULT_ERROR_MESSAGE=P;exports.useInkeepChat=at;
3
+ It seems I might be having some issues right now. Please clear the chat and try again.`,ut=()=>{const{baseSettings:f,aiChatSettings:h}=Qe.useInkeepConfig(),[s="",l]=nt.useControllableState({prop:h.conversationId,defaultProp:h.conversationId??""}),be=ze.useModal(),Ce=Je.useOptionalChatBubble(),Se=Ge.useOptionalSidebarChat(),{logEvent:g}=tt.useBaseEvents(),{setConversationId:Re,emitToParent:I}=at.useStreamingEvents(),Z=t.useRef(s);t.useEffect(()=>{const e=Z.current;Z.current=s,e!==s&&g({eventName:"chat_conversation_changed",properties:{conversationId:s,previousConversationId:e}})},[s,g]);const[y,E]=t.useState(""),Ae=e=>E(e.target.value),{shouldBypassCaptcha:X,filters:Y,privacyPreferences:ke,userProperties:_}=f,{authToken:T,refreshToken:ee}=Ye.useAuthToken(),te=!!f.getAuthToken,d=!!T,{onInputMessageChange:Ie,filters:se,baseUrl:w,agentUrl:Ee,context:re,headers:ne,appId:b,apiKey:m,files:C}=h,Te=be?.isOpen??Ce?.isOpen??Se?.isOpen??!0,{getCaptchaHeader:S,invalidate:c}=Ve.useCaptcha({baseUrl:w,shouldBypassCaptcha:X||!!m,shouldMakeInitialRequest:Te}),ae=t.useRef(S);ae.current=S;const oe=Ee||`${w}/run/api/chat`,{sessionToken:F,refreshSession:U}=Xe.useAnonymousSession({baseUrl:w,appId:b,getCaptchaHeader:S,invalidateCaptcha:c,optOutAllAnalytics:ke?.optOutAllAnalytics,enabled:!d}),{loadConversation:ie}=et.useConversationLoader({baseUrl:w,appId:b,authToken:m??(d?T:F),getCaptchaHeader:S,invalidateCaptcha:c,refreshSession:m||d?void 0:U}),[we,ue]=t.useState(!1),D=t.useRef(null);D.current=F;const B=t.useRef(null);B.current=T;const $=t.useRef(void 0);$.current=_&&Object.keys(_).length>0?JSON.stringify(_):void 0;const v=t.useRef(0),ce=t.useRef(null),L=t.useRef(null),R=t.useRef(void 0),Me=C?.map(e=>`${e.filename??""}:${e.mediaType}:${e.url.length}:${e.url.slice(0,64)}:${e.url.slice(-32)}`).join(`
4
+ `)??"";t.useEffect(()=>{R.current=C?.length?C:void 0},[Me]);const le=t.useRef(ne);le.current=ne;const H=t.useRef(void 0);H.current=Y||se?JSON.stringify({...Y,...se}):void 0;const xe=e=>{switch(e.code){case 400:return e.message;case 401:return te?"Authentication failed. Please try again.":O;case 403:return`There seems to be a configuration error. Please contact ${f.organizationDisplayName??"Administrator"}`;default:return O}},[qe,A]=t.useState([]),[Pe,M]=t.useState(null),Ne=t.useMemo(()=>new We.DefaultChatTransport({api:oe,headers:()=>{const e=m??B.current??D.current;return{"x-inkeep-client-timezone":Intl.DateTimeFormat().resolvedOptions().timeZone,"x-inkeep-client-timestamp":new Date().toISOString(),...b?{"x-inkeep-app-id":b}:{},...e?{Authorization:`Bearer ${e}`}:{},...H.current?{"inkeep-filters":H.current}:{},...$.current?{"x-inkeep-user-properties":$.current}:{},...le.current}},prepareSendMessagesRequest:async e=>{const r=await ae.current();return{body:{...e.body,id:e.id,messages:e.messages,trigger:e.trigger,messageId:e.messageId},headers:{...e.headers,...r}}},body:{requestContext:re}}),[oe,re,b,m]),{messages:x,sendMessage:j,addToolApprovalResponse:K,status:de,setMessages:p,stop:q,error:W}=Ke.useChat({transport:Ne,onData(e){I(e.type,e.data)},async onFinish(){I("completion",{conversationId:s}),await g({eventName:"assistant_message_received",properties:{conversationId:s}}),g({eventName:"assistant_answer_displayed",properties:{conversationId:s}})},onError(e){console.error("onError",{code:e.code,message:e.message});const r=X||m?null:it(e);if(r!==null&&v.current<1){v.current++;const n=L.current,a=ce.current;(async()=>{if(r==="session"&&te){const o=await ee();if(!o)throw new Error("Auth token refresh failed");B.current=o}else if(r==="session"){const o=await U();o&&(D.current=o)}else c();if(n){K(n);return}a&&(p(o=>{let u=[...o];return u.at(-1)?.role==="assistant"&&(u=u.slice(0,-1)),u.at(-1)?.role==="user"&&(u=u.slice(0,-1)),u}),j(a.files?.length?{parts:[{type:"text",text:a.content},...a.files]}:{text:a.content},{body:a.body}))})().catch(()=>{v.current=0,c(),p(o=>{const u=[...o],V=u[u.length-1];if(!V)return u;const ye=O;return V.role==="user"?u.push({id:N.generateUid(16),role:"assistant",parts:[{type:"text",text:ye}]}):V.parts=[{type:"text",text:ye}],u})});return}v.current=0,r!==null&&c(),g({eventName:"chat_error",properties:{conversationId:s,error:e.message}}),p(n=>{const a=[...n],i=a[a.length-1];if(i){const o=xe(e);i.role==="user"?a.push({id:N.generateUid(16),role:"assistant",parts:[{type:"text",text:o}]}):i.parts=[{type:"text",text:o}]}return a})}}),pe=t.useRef(d);t.useEffect(()=>{const e=pe.current;pe.current=d,e!==d&&(q(),k(null),p([]),l(""),E(""),A([]),M(null),c())},[d,q,p,l,c]);const fe=de==="submitted",z=de==="streaming",Oe=t.useMemo(()=>{const e=i=>{if(!i||typeof i!="object")return!1;const o=i;return typeof o.type=="string"&&o.type.startsWith("tool-")},n=[...x??[]].reverse().find(i=>i.role==="assistant");if(!n)return!1;const a=n.parts?.at(-1);return!(!e(a)||a.state!=="output-available"||!a.approval?.id||z)},[x,z]),he=z||Oe,ge=fe||he,_e=x.length===0,J=!y.trim()||ge,Fe=Ze.useMediaQuery("(max-width: 768px)"),[Ue,k]=t.useState(null);t.useEffect(()=>{W&&k(W)},[W]);const De=()=>k(null),me=t.useRef(null);t.useEffect(()=>{Ie?.(y)},[y]);const Be=e=>{e.key==="Enter"&&!e.shiftKey&&!J&&!e.nativeEvent.isComposing&&(e.preventDefault(),G())},G=async(e=y)=>{if(J&&(!e||e.trim().length===0))return;A([]),E(""),v.current=0,L.current=null,await g({eventName:"user_message_submitted",properties:{conversationId:s}});let r=s;r||(r=`conv_${N.generateUid(16)}`,l(r)),Re(r);const n=R.current;R.current=void 0,ce.current={content:e,body:{conversationId:r},files:n},j(n?{parts:[{type:"text",text:e},...n]}:{text:e},{body:{conversationId:r}})},$e=t.useCallback(e=>{v.current=0,L.current=e,K(e)},[K]),Q=t.useCallback(()=>{q().then(()=>{I("aborted",{conversationId:s})})},[q,s,I]),ve=()=>{De(),p([]),l(""),A([]),M(null),c(),R.current=C?.length?C:void 0,g({eventName:"chat_clear_button_clicked",properties:{conversationId:s}})},P=t.useCallback((e,r)=>{k(null),p(r),l(e),A([]),M(null),c(),R.current=void 0},[p,l,c]),Le=t.useCallback(async(e,r)=>{Q(),P(e,[]),ue(!0);try{const n=await ie(e,r),a=n?.[n.length-1],i=n!==null&&a?.role==="user"?[...n,{id:N.generateUid(16),role:"assistant",parts:[{type:"text",text:"This session was interrupted. Please check back in a few minutes or start a new conversation."}]}]:n;i!==null&&P(e,i)}finally{r?.aborted||ue(!1)}},[P,ie,Q]),{openForm:He}=st.useChatForm(),je=rt.useWidget();return t.useImperativeHandle(h.chatFunctionsRef,()=>({submitMessage:G,updateInputMessage(e){E(e)},clearChat:ve,openForm:e=>{je?.setView("chat"),He(e,void 0)},focusInput:()=>{me.current?.focus()}})),{messages:x,sendMessage:j,addToolApprovalResponse:$e,isLoading:fe,isStreaming:he,isBusy:ge,error:Ue,setError:k,isSubmitDisabled:J,input:y,handleInputChange:Ae,handleInputKeyDown:Be,handleSubmit:G,stop:Q,clear:ve,inputRef:me,isMobile:Fe,messageAttachments:qe,setMessageAttachments:A,selectedWorkflow:Pe,setSelectedWorkflow:M,isNewChat:_e,conversationId:s,restoreSession:P,loadAndRestoreSession:Le,isSessionLoading:we,sessionToken:d?T:F,refreshSession:d?ee:U,getCaptchaHeader:S,invalidateCaptcha:c}};exports.DEFAULT_ERROR_MESSAGE=O;exports.useInkeepChat=ut;
@@ -1,6 +1,6 @@
1
1
  import { KeyboardEvent, Dispatch, SetStateAction, RefObject } from 'react';
2
- import { Message, MessageAttachment, Workflow } from '../../../types/index.ts';
3
2
  import { FileUIPart, ChatRequestOptions } from 'ai';
3
+ import { Message, MessageAttachment, Workflow } from '../../../types/index.ts';
4
4
  export declare const DEFAULT_ERROR_MESSAGE = "Hmm.. \n\nIt seems I might be having some issues right now. Please clear the chat and try again.";
5
5
  export declare const useInkeepChat: () => {
6
6
  messages: Message[];
@@ -1,24 +1,24 @@
1
1
  "use client";
2
- import { useChat as Je } from "@ai-sdk/react";
3
- import { DefaultChatTransport as Ke } from "ai";
4
- import { useRef as c, useEffect as O, useState as A, useMemo as Ce, useCallback as _, useImperativeHandle as je } from "react";
5
- import { useModal as Ge } from "../modal/modal-provider.js";
6
- import { useOptionalChatBubble as Qe } from "../../providers/chat-bubble-provider.js";
7
- import { useOptionalSidebarChat as Ve } from "../../providers/sidebar-chat-provider.js";
8
- import { useInkeepConfig as Ze } from "../../providers/config-provider.js";
9
- import { useCaptcha as Xe } from "./use-captcha.js";
10
- import { useMediaQuery as Ye } from "../../hooks/use-media-query.js";
11
- import { useAnonymousSession as et } from "../../hooks/use-anonymous-session.js";
12
- import { useAuthToken as tt } from "../../hooks/use-auth-token.js";
13
- import { useConversationLoader as st } from "../../hooks/use-conversation-loader.js";
14
- import { generateUid as F } from "../../utils/generate-uid.js";
15
- import { useBaseEvents as rt } from "../../providers/base-events-provider.js";
16
- import { useChatForm as nt } from "../../providers/chat-form-provider.js";
17
- import { useWidget as ot } from "../../providers/widget-provider.js";
18
- import { useControllableState as at } from "@radix-ui/react-use-controllable-state";
19
- import { useStreamingEvents as it } from "../../hooks/use-streaming-events.js";
20
- import { parseAuthError as ct } from "../../hooks/use-inkeep-api-client.js";
21
- function ut(m) {
2
+ import { useChat as Ge } from "@ai-sdk/react";
3
+ import { DefaultChatTransport as Qe } from "ai";
4
+ import { useRef as c, useEffect as w, useState as R, useMemo as Ae, useCallback as P, useImperativeHandle as Ve } from "react";
5
+ import { useModal as Ze } from "../modal/modal-provider.js";
6
+ import { useOptionalChatBubble as Xe } from "../../providers/chat-bubble-provider.js";
7
+ import { useOptionalSidebarChat as Ye } from "../../providers/sidebar-chat-provider.js";
8
+ import { useInkeepConfig as et } from "../../providers/config-provider.js";
9
+ import { useCaptcha as tt } from "./use-captcha.js";
10
+ import { useMediaQuery as st } from "../../hooks/use-media-query.js";
11
+ import { useAnonymousSession as rt } from "../../hooks/use-anonymous-session.js";
12
+ import { useAuthToken as nt } from "../../hooks/use-auth-token.js";
13
+ import { useConversationLoader as ot } from "../../hooks/use-conversation-loader.js";
14
+ import { generateUid as D } from "../../utils/generate-uid.js";
15
+ import { useBaseEvents as at } from "../../providers/base-events-provider.js";
16
+ import { useChatForm as it } from "../../providers/chat-form-provider.js";
17
+ import { useWidget as ct } from "../../providers/widget-provider.js";
18
+ import { useControllableState as lt } from "@radix-ui/react-use-controllable-state";
19
+ import { useStreamingEvents as ut } from "../../hooks/use-streaming-events.js";
20
+ import { parseAuthError as pt } from "../../hooks/use-inkeep-api-client.js";
21
+ function dt(m) {
22
22
  const f = m.message ?? "";
23
23
  let t = Number(m.code) || Number(m.statusCode);
24
24
  if (Number.isNaN(t))
@@ -26,19 +26,19 @@ function ut(m) {
26
26
  t = Number(JSON.parse(f).status);
27
27
  } catch {
28
28
  }
29
- const l = ct(t, { detail: f });
30
- return l !== null ? l : t === 401 ? "session" : null;
29
+ const u = pt(t, { detail: f });
30
+ return u !== null ? u : t === 401 ? "session" : null;
31
31
  }
32
- const Z = `Hmm..
32
+ const Y = `Hmm..
33
33
 
34
- It seems I might be having some issues right now. Please clear the chat and try again.`, xt = () => {
35
- const { baseSettings: m, aiChatSettings: f } = Ze(), [t = "", l] = at({
34
+ It seems I might be having some issues right now. Please clear the chat and try again.`, Ot = () => {
35
+ const { baseSettings: m, aiChatSettings: f } = et(), [t = "", u] = lt({
36
36
  prop: f.conversationId,
37
37
  defaultProp: f.conversationId ?? ""
38
- }), Se = Ge(), ke = Qe(), Ae = Ve(), { logEvent: h } = rt(), { setConversationId: Ie, emitToParent: I } = it(), X = c(t);
39
- O(() => {
40
- const e = X.current;
41
- X.current = t, e !== t && h({
38
+ }), ke = Ze(), Ie = Xe(), we = Ye(), { logEvent: h } = at(), { setConversationId: Re, emitToParent: T } = ut(), ee = c(t);
39
+ w(() => {
40
+ const e = ee.current;
41
+ ee.current = t, e !== t && h({
42
42
  eventName: "chat_conversation_changed",
43
43
  properties: {
44
44
  conversationId: t,
@@ -46,73 +46,79 @@ It seems I might be having some issues right now. Please clear the chat and try
46
46
  }
47
47
  });
48
48
  }, [t, h]);
49
- const [y, w] = A(""), we = (e) => w(e.target.value), { shouldBypassCaptcha: Y, filters: ee, privacyPreferences: Re, userProperties: P } = m, { authToken: R, refreshToken: te } = tt(), se = !!m.getAuthToken, p = !!R, {
50
- onInputMessageChange: Te,
51
- filters: re,
52
- baseUrl: T,
53
- agentUrl: Me,
54
- context: ne,
55
- headers: oe,
49
+ const [y, x] = R(""), Te = (e) => x(e.target.value), { shouldBypassCaptcha: te, filters: se, privacyPreferences: xe, userProperties: $ } = m, { authToken: M, refreshToken: re } = nt(), ne = !!m.getAuthToken, p = !!M, {
50
+ onInputMessageChange: Me,
51
+ filters: oe,
52
+ baseUrl: E,
53
+ agentUrl: Ee,
54
+ context: ae,
55
+ headers: ie,
56
56
  appId: b,
57
- apiKey: g
58
- } = f, xe = Se?.isOpen ?? ke?.isOpen ?? Ae?.isOpen ?? !0, { getCaptchaHeader: C, invalidate: u } = Xe({
59
- baseUrl: T,
60
- shouldBypassCaptcha: Y || !!g,
61
- shouldMakeInitialRequest: xe
62
- }), ae = c(C);
63
- ae.current = C;
64
- const ie = Me || `${T}/run/api/chat`, { sessionToken: D, refreshSession: B } = et({
65
- baseUrl: T,
57
+ apiKey: g,
58
+ files: C
59
+ } = f, Ne = ke?.isOpen ?? Ie?.isOpen ?? we?.isOpen ?? !0, { getCaptchaHeader: S, invalidate: l } = tt({
60
+ baseUrl: E,
61
+ shouldBypassCaptcha: te || !!g,
62
+ shouldMakeInitialRequest: Ne
63
+ }), ce = c(S);
64
+ ce.current = S;
65
+ const le = Ee || `${E}/run/api/chat`, { sessionToken: B, refreshSession: H } = rt({
66
+ baseUrl: E,
66
67
  appId: b,
67
- getCaptchaHeader: C,
68
- invalidateCaptcha: u,
69
- optOutAllAnalytics: Re?.optOutAllAnalytics,
68
+ getCaptchaHeader: S,
69
+ invalidateCaptcha: l,
70
+ optOutAllAnalytics: xe?.optOutAllAnalytics,
70
71
  enabled: !p
71
- }), { loadConversation: ce } = st({
72
- baseUrl: T,
72
+ }), { loadConversation: ue } = ot({
73
+ baseUrl: E,
73
74
  appId: b,
74
- authToken: g ?? (p ? R : D),
75
- getCaptchaHeader: C,
76
- invalidateCaptcha: u,
77
- refreshSession: g || p ? void 0 : B
78
- }), [Ee, ue] = A(!1), H = c(null);
79
- H.current = D;
80
- const L = c(null);
81
- L.current = R;
82
- const U = c(void 0);
83
- U.current = P && Object.keys(P).length > 0 ? JSON.stringify(P) : void 0;
84
- const v = c(0), le = c(null), W = c(null), pe = c(oe);
85
- pe.current = oe;
86
- const $ = c(void 0);
87
- $.current = ee || re ? JSON.stringify({ ...ee, ...re }) : void 0;
88
- const Ne = (e) => {
75
+ authToken: g ?? (p ? M : B),
76
+ getCaptchaHeader: S,
77
+ invalidateCaptcha: l,
78
+ refreshSession: g || p ? void 0 : H
79
+ }), [Oe, pe] = R(!1), L = c(null);
80
+ L.current = B;
81
+ const U = c(null);
82
+ U.current = M;
83
+ const K = c(void 0);
84
+ K.current = $ && Object.keys($).length > 0 ? JSON.stringify($) : void 0;
85
+ const v = c(0), de = c(null), W = c(null), A = c(void 0), _e = C?.map((e) => `${e.filename ?? ""}:${e.mediaType}:${e.url.length}:${e.url.slice(0, 64)}:${e.url.slice(-32)}`).join(`
86
+ `) ?? "";
87
+ w(() => {
88
+ A.current = C?.length ? C : void 0;
89
+ }, [_e]);
90
+ const me = c(ie);
91
+ me.current = ie;
92
+ const j = c(void 0);
93
+ j.current = se || oe ? JSON.stringify({ ...se, ...oe }) : void 0;
94
+ const Fe = (e) => {
89
95
  switch (e.code) {
90
96
  case 400:
91
97
  return e.message;
92
98
  case 401:
93
- return se ? "Authentication failed. Please try again." : Z;
99
+ return ne ? "Authentication failed. Please try again." : Y;
94
100
  case 403:
95
101
  return `There seems to be a configuration error. Please contact ${m.organizationDisplayName ?? "Administrator"}`;
96
102
  default:
97
- return Z;
103
+ return Y;
98
104
  }
99
- }, [Oe, S] = A([]), [_e, M] = A(null), Fe = Ce(
100
- () => new Ke({
101
- api: ie,
105
+ }, [Pe, k] = R([]), [De, N] = R(null), $e = Ae(
106
+ () => new Qe({
107
+ api: le,
102
108
  headers: () => {
103
- const e = g ?? L.current ?? H.current;
109
+ const e = g ?? U.current ?? L.current;
104
110
  return {
105
111
  "x-inkeep-client-timezone": Intl.DateTimeFormat().resolvedOptions().timeZone,
106
112
  "x-inkeep-client-timestamp": (/* @__PURE__ */ new Date()).toISOString(),
107
113
  ...b ? { "x-inkeep-app-id": b } : {},
108
114
  ...e ? { Authorization: `Bearer ${e}` } : {},
109
- ...$.current ? { "inkeep-filters": $.current } : {},
110
- ...U.current ? { "x-inkeep-user-properties": U.current } : {},
111
- ...pe.current
115
+ ...j.current ? { "inkeep-filters": j.current } : {},
116
+ ...K.current ? { "x-inkeep-user-properties": K.current } : {},
117
+ ...me.current
112
118
  };
113
119
  },
114
120
  prepareSendMessagesRequest: async (e) => {
115
- const s = await ae.current();
121
+ const s = await ce.current();
116
122
  return {
117
123
  body: {
118
124
  ...e.body,
@@ -128,25 +134,25 @@ It seems I might be having some issues right now. Please clear the chat and try
128
134
  };
129
135
  },
130
136
  body: {
131
- requestContext: ne
137
+ requestContext: ae
132
138
  }
133
139
  }),
134
- [ie, ne, b, g]
140
+ [le, ae, b, g]
135
141
  ), {
136
- messages: x,
142
+ messages: O,
137
143
  sendMessage: q,
138
144
  addToolApprovalResponse: z,
139
- status: de,
145
+ status: fe,
140
146
  setMessages: d,
141
- stop: E,
147
+ stop: _,
142
148
  error: J
143
- } = Je({
144
- transport: Fe,
149
+ } = Ge({
150
+ transport: $e,
145
151
  onData(e) {
146
- I(e.type, e.data);
152
+ T(e.type, e.data);
147
153
  },
148
154
  async onFinish() {
149
- I("completion", { conversationId: t }), await h({
155
+ T("completion", { conversationId: t }), await h({
150
156
  eventName: "assistant_message_received",
151
157
  properties: {
152
158
  conversationId: t
@@ -160,187 +166,193 @@ It seems I might be having some issues right now. Please clear the chat and try
160
166
  },
161
167
  onError(e) {
162
168
  console.error("onError", { code: e.code, message: e.message });
163
- const s = Y || g ? null : ut(e);
169
+ const s = te || g ? null : dt(e);
164
170
  if (s !== null && v.current < 1) {
165
171
  v.current++;
166
- const o = W.current, n = le.current;
172
+ const r = W.current, n = de.current;
167
173
  (async () => {
168
- if (s === "session" && se) {
169
- const r = await te();
170
- if (!r) throw new Error("Auth token refresh failed");
171
- L.current = r;
174
+ if (s === "session" && ne) {
175
+ const o = await re();
176
+ if (!o) throw new Error("Auth token refresh failed");
177
+ U.current = o;
172
178
  } else if (s === "session") {
173
- const r = await B();
174
- r && (H.current = r);
179
+ const o = await H();
180
+ o && (L.current = o);
175
181
  } else
176
- u();
177
- if (o) {
178
- z(o);
182
+ l();
183
+ if (r) {
184
+ z(r);
179
185
  return;
180
186
  }
181
- n && (d((r) => {
182
- let i = [...r];
187
+ n && (d((o) => {
188
+ let i = [...o];
183
189
  return i.at(-1)?.role === "assistant" && (i = i.slice(0, -1)), i.at(-1)?.role === "user" && (i = i.slice(0, -1)), i;
184
- }), q({ text: n.content }, { body: n.body }));
190
+ }), q(
191
+ n.files?.length ? { parts: [{ type: "text", text: n.content }, ...n.files] } : { text: n.content },
192
+ { body: n.body }
193
+ ));
185
194
  })().catch(() => {
186
- v.current = 0, u(), d((r) => {
187
- const i = [...r], V = i[i.length - 1];
188
- if (!V) return i;
189
- const be = Z;
190
- return V.role === "user" ? i.push({
191
- id: F(16),
195
+ v.current = 0, l(), d((o) => {
196
+ const i = [...o], X = i[i.length - 1];
197
+ if (!X) return i;
198
+ const Se = Y;
199
+ return X.role === "user" ? i.push({
200
+ id: D(16),
192
201
  role: "assistant",
193
- parts: [{ type: "text", text: be }]
194
- }) : V.parts = [{ type: "text", text: be }], i;
202
+ parts: [{ type: "text", text: Se }]
203
+ }) : X.parts = [{ type: "text", text: Se }], i;
195
204
  });
196
205
  });
197
206
  return;
198
207
  }
199
- v.current = 0, s !== null && u(), h({
208
+ v.current = 0, s !== null && l(), h({
200
209
  eventName: "chat_error",
201
210
  properties: {
202
211
  conversationId: t,
203
212
  error: e.message
204
213
  }
205
- }), d((o) => {
206
- const n = [...o], a = n[n.length - 1];
214
+ }), d((r) => {
215
+ const n = [...r], a = n[n.length - 1];
207
216
  if (a) {
208
- const r = Ne(e);
217
+ const o = Fe(e);
209
218
  a.role === "user" ? n.push({
210
- id: F(16),
219
+ id: D(16),
211
220
  role: "assistant",
212
- parts: [{ type: "text", text: r }]
213
- }) : a.parts = [{ type: "text", text: r }];
221
+ parts: [{ type: "text", text: o }]
222
+ }) : a.parts = [{ type: "text", text: o }];
214
223
  }
215
224
  return n;
216
225
  });
217
226
  }
218
- }), me = c(p);
219
- O(() => {
220
- const e = me.current;
221
- me.current = p, e !== p && (E(), k(null), d([]), l(""), w(""), S([]), M(null), u());
222
- }, [p, E, d, l, u]);
223
- const fe = de === "submitted", K = de === "streaming", Pe = Ce(() => {
227
+ }), he = c(p);
228
+ w(() => {
229
+ const e = he.current;
230
+ he.current = p, e !== p && (_(), I(null), d([]), u(""), x(""), k([]), N(null), l());
231
+ }, [p, _, d, u, l]);
232
+ const ge = fe === "submitted", G = fe === "streaming", Be = Ae(() => {
224
233
  const e = (a) => {
225
234
  if (!a || typeof a != "object") return !1;
226
- const r = a;
227
- return typeof r.type == "string" && r.type.startsWith("tool-");
228
- }, o = [...x ?? []].reverse().find((a) => a.role === "assistant");
229
- if (!o) return !1;
230
- const n = o.parts?.at(-1);
231
- return !(!e(n) || n.state !== "output-available" || !n.approval?.id || K);
232
- }, [x, K]), he = K || Pe, ge = fe || he, De = x.length === 0, j = !y.trim() || ge, Be = Ye("(max-width: 768px)"), [He, k] = A(null);
233
- O(() => {
234
- J && k(J);
235
+ const o = a;
236
+ return typeof o.type == "string" && o.type.startsWith("tool-");
237
+ }, r = [...O ?? []].reverse().find((a) => a.role === "assistant");
238
+ if (!r) return !1;
239
+ const n = r.parts?.at(-1);
240
+ return !(!e(n) || n.state !== "output-available" || !n.approval?.id || G);
241
+ }, [O, G]), ve = G || Be, ye = ge || ve, He = O.length === 0, Q = !y.trim() || ye, Le = st("(max-width: 768px)"), [Ue, I] = R(null);
242
+ w(() => {
243
+ J && I(J);
235
244
  }, [J]);
236
- const Le = () => k(null), ve = c(null);
237
- O(() => {
238
- Te?.(y);
245
+ const Ke = () => I(null), be = c(null);
246
+ w(() => {
247
+ Me?.(y);
239
248
  }, [y]);
240
- const Ue = (e) => {
241
- e.key === "Enter" && !e.shiftKey && !j && !e.nativeEvent.isComposing && (e.preventDefault(), G());
242
- }, G = async (e = y) => {
243
- if (j && (!e || e.trim().length === 0)) return;
244
- S([]), w(""), v.current = 0, W.current = null, await h({
249
+ const We = (e) => {
250
+ e.key === "Enter" && !e.shiftKey && !Q && !e.nativeEvent.isComposing && (e.preventDefault(), V());
251
+ }, V = async (e = y) => {
252
+ if (Q && (!e || e.trim().length === 0)) return;
253
+ k([]), x(""), v.current = 0, W.current = null, await h({
245
254
  eventName: "user_message_submitted",
246
255
  properties: {
247
256
  conversationId: t
248
257
  }
249
258
  });
250
259
  let s = t;
251
- s || (s = `conv_${F(16)}`, l(s)), Ie(s), le.current = {
260
+ s || (s = `conv_${D(16)}`, u(s)), Re(s);
261
+ const r = A.current;
262
+ A.current = void 0, de.current = {
252
263
  content: e,
253
- body: { conversationId: s }
264
+ body: { conversationId: s },
265
+ files: r
254
266
  }, q(
255
- { text: e },
267
+ r ? { parts: [{ type: "text", text: e }, ...r] } : { text: e },
256
268
  {
257
269
  body: { conversationId: s }
258
270
  }
259
271
  );
260
- }, We = _(
272
+ }, je = P(
261
273
  (e) => {
262
274
  v.current = 0, W.current = e, z(e);
263
275
  },
264
276
  [z]
265
- ), Q = _(() => {
266
- E().then(() => {
267
- I("aborted", { conversationId: t });
277
+ ), Z = P(() => {
278
+ _().then(() => {
279
+ T("aborted", { conversationId: t });
268
280
  });
269
- }, [E, t, I]), ye = () => {
270
- Le(), d([]), l(""), S([]), M(null), u(), h({
281
+ }, [_, t, T]), Ce = () => {
282
+ Ke(), d([]), u(""), k([]), N(null), l(), A.current = C?.length ? C : void 0, h({
271
283
  eventName: "chat_clear_button_clicked",
272
284
  properties: {
273
285
  conversationId: t
274
286
  }
275
287
  });
276
- }, N = _(
288
+ }, F = P(
277
289
  (e, s) => {
278
- k(null), d(s), l(e), S([]), M(null), u();
290
+ I(null), d(s), u(e), k([]), N(null), l(), A.current = void 0;
279
291
  },
280
- [d, l, u]
281
- ), $e = _(
292
+ [d, u, l]
293
+ ), qe = P(
282
294
  async (e, s) => {
283
- Q(), N(e, []), ue(!0);
295
+ Z(), F(e, []), pe(!0);
284
296
  try {
285
- const o = await ce(e, s), n = o?.[o.length - 1], a = o !== null && n?.role === "user" ? [...o, {
286
- id: F(16),
297
+ const r = await ue(e, s), n = r?.[r.length - 1], a = r !== null && n?.role === "user" ? [...r, {
298
+ id: D(16),
287
299
  role: "assistant",
288
300
  parts: [{ type: "text", text: "This session was interrupted. Please check back in a few minutes or start a new conversation." }]
289
- }] : o;
290
- a !== null && N(e, a);
301
+ }] : r;
302
+ a !== null && F(e, a);
291
303
  } finally {
292
- s?.aborted || ue(!1);
304
+ s?.aborted || pe(!1);
293
305
  }
294
306
  },
295
- [N, ce, Q]
296
- ), { openForm: qe } = nt(), ze = ot();
297
- return je(f.chatFunctionsRef, () => ({
298
- submitMessage: G,
307
+ [F, ue, Z]
308
+ ), { openForm: ze } = it(), Je = ct();
309
+ return Ve(f.chatFunctionsRef, () => ({
310
+ submitMessage: V,
299
311
  updateInputMessage(e) {
300
- w(e);
312
+ x(e);
301
313
  },
302
- clearChat: ye,
314
+ clearChat: Ce,
303
315
  openForm: (e) => {
304
- ze?.setView("chat"), qe(e, void 0);
316
+ Je?.setView("chat"), ze(e, void 0);
305
317
  },
306
318
  focusInput: () => {
307
- ve.current?.focus();
319
+ be.current?.focus();
308
320
  }
309
321
  })), {
310
- messages: x,
322
+ messages: O,
311
323
  sendMessage: q,
312
- addToolApprovalResponse: We,
313
- isLoading: fe,
314
- isStreaming: he,
315
- isBusy: ge,
316
- error: He,
317
- setError: k,
318
- isSubmitDisabled: j,
324
+ addToolApprovalResponse: je,
325
+ isLoading: ge,
326
+ isStreaming: ve,
327
+ isBusy: ye,
328
+ error: Ue,
329
+ setError: I,
330
+ isSubmitDisabled: Q,
319
331
  input: y,
320
- handleInputChange: we,
321
- handleInputKeyDown: Ue,
322
- handleSubmit: G,
323
- stop: Q,
324
- clear: ye,
325
- inputRef: ve,
326
- isMobile: Be,
332
+ handleInputChange: Te,
333
+ handleInputKeyDown: We,
334
+ handleSubmit: V,
335
+ stop: Z,
336
+ clear: Ce,
337
+ inputRef: be,
338
+ isMobile: Le,
327
339
  // Additional state for attachments and workflow
328
- messageAttachments: Oe,
329
- setMessageAttachments: S,
330
- selectedWorkflow: _e,
331
- setSelectedWorkflow: M,
332
- isNewChat: De,
340
+ messageAttachments: Pe,
341
+ setMessageAttachments: k,
342
+ selectedWorkflow: De,
343
+ setSelectedWorkflow: N,
344
+ isNewChat: He,
333
345
  conversationId: t,
334
- restoreSession: N,
335
- loadAndRestoreSession: $e,
336
- isSessionLoading: Ee,
337
- sessionToken: p ? R : D,
338
- refreshSession: p ? te : B,
339
- getCaptchaHeader: C,
340
- invalidateCaptcha: u
346
+ restoreSession: F,
347
+ loadAndRestoreSession: qe,
348
+ isSessionLoading: Oe,
349
+ sessionToken: p ? M : B,
350
+ refreshSession: p ? re : H,
351
+ getCaptchaHeader: S,
352
+ invalidateCaptcha: l
341
353
  };
342
354
  };
343
355
  export {
344
- Z as DEFAULT_ERROR_MESSAGE,
345
- xt as useInkeepChat
356
+ Y as DEFAULT_ERROR_MESSAGE,
357
+ Ot as useInkeepChat
346
358
  };