@inkeep/agents-ui 0.15.18 → 0.15.19

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 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("react/jsx-runtime"),a=require("react"),e=require("../factory.cjs"),s=require("../../providers/chat-history-provider.cjs"),x=require("../../utils/misc.cjs"),m=require("../../utils/compose-event-handlers.cjs"),E=require("../../atoms/icons/custom-icon.cjs"),T=e.ikp("div",{_id:"aiChatHistory"}),H=t=>{const{isOpen:i}=s.useChatHistory();return r.jsx(T,{"data-hidden":x.dataAttr(!i),...t})},d=e.ikp("div",{_id:"aiChatHistory__Header"}),w=e.ikp(E.CustomIcon,{_id:"aiChatHistory__BackButtonIcon"}),_=a.memo(t=>r.jsx(w,{...t,iconKey:"backToChat"})),R=e.ikp("button",{_id:"aiChatHistory__BackButton"}),l=({onClick:t,...i})=>{const{setIsOpen:o}=s.useChatHistory();return r.jsx(R,{type:"button",onClick:m.composeEventHandlers(t,()=>o(!1)),...i})},P=e.ikp("h2",{_id:"aiChatHistory__Title"}),q=e.ikp("div",{_id:"aiChatHistory__List"}),p=a.forwardRef(({children:t,...i},o)=>{const{hasMore:n,loadMore:h,isLoading:u,sessions:b}=s.useChatHistory(),y=a.useRef(null),c=b.length>0&&n;return a.useEffect(()=>{const C=y.current;if(!C||!c)return;const v=new IntersectionObserver(j=>{j[0]?.isIntersecting&&n&&!u&&h()},{threshold:.1});return v.observe(C),()=>v.disconnect()},[n,u,h,c]),r.jsxs(q,{ref:o,...i,children:[t,c&&r.jsx("div",{ref:y,"data-part":"sentinel","aria-hidden":"true",style:{height:1}})]})}),N=e.ikp("button",{_id:"aiChatHistory__Item"}),k=a.memo(({sessionId:t,onClick:i,...o})=>{const{loadSession:n}=s.useChatHistory();return r.jsx(N,{type:"button",onClick:m.composeEventHandlers(i,()=>n(t)),...o})}),B=e.ikp("span",{_id:"aiChatHistory__ItemTitle"}),I=e.ikp("span",{_id:"aiChatHistory__ItemDate"}),D=e.ikp("div",{_id:"aiChatHistory__EmptyState"}),f=t=>{const{sessions:i,isLoading:o}=s.useChatHistory();return i.length>0||o?null:r.jsx(D,{...t})},F=e.ikp("div",{_id:"aiChatHistory__LoadingState"}),g=t=>{const{isLoading:i}=s.useChatHistory();return i?r.jsx(F,{...t}):null},S=e.ikp("div",{_id:"aiChatHistory__Footer"}),O=e.ikp("button",{_id:"aiChatHistory__NewConversationButton"}),L=({onClick:t,...i})=>{const{startNewConversation:o}=s.useChatHistory();return r.jsx(O,{type:"button",onClick:m.composeEventHandlers(t,o),...i})};exports.BackButton=l;exports.BackButtonIcon=_;exports.ChatHistoryPrimitiveBackButton=l;exports.ChatHistoryPrimitiveBackButtonIcon=_;exports.ChatHistoryPrimitiveEmptyState=f;exports.ChatHistoryPrimitiveFooter=S;exports.ChatHistoryPrimitiveHeader=d;exports.ChatHistoryPrimitiveItem=k;exports.ChatHistoryPrimitiveItemDate=I;exports.ChatHistoryPrimitiveItemTitle=B;exports.ChatHistoryPrimitiveList=p;exports.ChatHistoryPrimitiveLoadingState=g;exports.ChatHistoryPrimitiveNewConversationButton=L;exports.ChatHistoryPrimitiveRoot=H;exports.ChatHistoryPrimitiveTitle=P;exports.EmptyState=f;exports.Footer=S;exports.Header=d;exports.Item=k;exports.ItemDate=I;exports.ItemTitle=B;exports.List=p;exports.LoadingState=g;exports.NewConversationButton=L;exports.Root=H;exports.Title=P;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("react/jsx-runtime"),a=require("react"),e=require("../factory.cjs"),s=require("../../providers/chat-history-provider.cjs"),x=require("../../providers/chat-form-provider.cjs"),E=require("../../utils/misc.cjs"),m=require("../../utils/compose-event-handlers.cjs"),T=require("../../atoms/icons/custom-icon.cjs"),w=e.ikp("div",{_id:"aiChatHistory"}),H=t=>{const{isOpen:i}=s.useChatHistory(),{form:o}=x.useChatForm();return o?null:r.jsx(w,{"data-hidden":E.dataAttr(!i),...t})},d=e.ikp("div",{_id:"aiChatHistory__Header"}),R=e.ikp(T.CustomIcon,{_id:"aiChatHistory__BackButtonIcon"}),l=a.memo(t=>r.jsx(R,{...t,iconKey:"backToChat"})),q=e.ikp("button",{_id:"aiChatHistory__BackButton"}),P=({onClick:t,...i})=>{const{setIsOpen:o}=s.useChatHistory();return r.jsx(q,{type:"button",onClick:m.composeEventHandlers(t,()=>o(!1)),...i})},_=e.ikp("h2",{_id:"aiChatHistory__Title"}),F=e.ikp("div",{_id:"aiChatHistory__List"}),p=a.forwardRef(({children:t,...i},o)=>{const{hasMore:n,loadMore:u,isLoading:h,sessions:b}=s.useChatHistory(),y=a.useRef(null),c=b.length>0&&n;return a.useEffect(()=>{const C=y.current;if(!C||!c)return;const v=new IntersectionObserver(j=>{j[0]?.isIntersecting&&n&&!h&&u()},{threshold:.1});return v.observe(C),()=>v.disconnect()},[n,h,u,c]),r.jsxs(F,{ref:o,...i,children:[t,c&&r.jsx("div",{ref:y,"data-part":"sentinel","aria-hidden":"true",style:{height:1}})]})}),N=e.ikp("button",{_id:"aiChatHistory__Item"}),k=a.memo(({sessionId:t,onClick:i,...o})=>{const{loadSession:n}=s.useChatHistory();return r.jsx(N,{type:"button",onClick:m.composeEventHandlers(i,()=>n(t)),...o})}),B=e.ikp("span",{_id:"aiChatHistory__ItemTitle"}),I=e.ikp("span",{_id:"aiChatHistory__ItemDate"}),D=e.ikp("div",{_id:"aiChatHistory__EmptyState"}),f=t=>{const{sessions:i,isLoading:o}=s.useChatHistory();return i.length>0||o?null:r.jsx(D,{...t})},O=e.ikp("div",{_id:"aiChatHistory__LoadingState"}),g=t=>{const{isLoading:i}=s.useChatHistory();return i?r.jsx(O,{...t}):null},S=e.ikp("div",{_id:"aiChatHistory__Footer"}),M=e.ikp("button",{_id:"aiChatHistory__NewConversationButton"}),L=({onClick:t,...i})=>{const{startNewConversation:o}=s.useChatHistory();return r.jsx(M,{type:"button",onClick:m.composeEventHandlers(t,o),...i})};exports.BackButton=P;exports.BackButtonIcon=l;exports.ChatHistoryPrimitiveBackButton=P;exports.ChatHistoryPrimitiveBackButtonIcon=l;exports.ChatHistoryPrimitiveEmptyState=f;exports.ChatHistoryPrimitiveFooter=S;exports.ChatHistoryPrimitiveHeader=d;exports.ChatHistoryPrimitiveItem=k;exports.ChatHistoryPrimitiveItemDate=I;exports.ChatHistoryPrimitiveItemTitle=B;exports.ChatHistoryPrimitiveList=p;exports.ChatHistoryPrimitiveLoadingState=g;exports.ChatHistoryPrimitiveNewConversationButton=L;exports.ChatHistoryPrimitiveRoot=H;exports.ChatHistoryPrimitiveTitle=_;exports.EmptyState=f;exports.Footer=S;exports.Header=d;exports.Item=k;exports.ItemDate=I;exports.ItemTitle=B;exports.List=p;exports.LoadingState=g;exports.NewConversationButton=L;exports.Root=H;exports.Title=_;
@@ -2,7 +2,7 @@ import { ComponentPropsWithRef, ForwardRefExoticComponent, DetailedHTMLProps, HT
2
2
  import { PolymorphicProps } from '..';
3
3
  import { CustomIconProps } from '../..';
4
4
  declare const PrimitiveRoot: ForwardRefExoticComponent< PolymorphicProps & Omit< DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "_id"> & Partial<Pick< DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "_id">>>;
5
- export declare const ChatHistoryPrimitiveRoot: (props: ComponentPropsWithRef<typeof PrimitiveRoot>) => import("react/jsx-runtime").JSX.Element;
5
+ export declare const ChatHistoryPrimitiveRoot: (props: ComponentPropsWithRef<typeof PrimitiveRoot>) => import("react/jsx-runtime").JSX.Element | null;
6
6
  export declare const ChatHistoryPrimitiveHeader: ForwardRefExoticComponent< PolymorphicProps & Omit< DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "_id"> & Partial<Pick< DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "_id">>>;
7
7
  declare const PrimitiveBackButtonIcon: ForwardRefExoticComponent< PolymorphicProps & Omit< CustomIconProps, "_id"> & Partial<Pick< CustomIconProps, "_id">>>;
8
8
  export declare const ChatHistoryPrimitiveBackButtonIcon: MemoExoticComponent<(props: ComponentPropsWithRef<typeof PrimitiveBackButtonIcon>) => import("react/jsx-runtime").JSX.Element>;
@@ -1,51 +1,52 @@
1
- import { jsx as s, jsxs as H } from "react/jsx-runtime";
2
- import { memo as C, forwardRef as l, useRef as p, useEffect as P } from "react";
1
+ import { jsx as r, jsxs as H } from "react/jsx-runtime";
2
+ import { memo as v, forwardRef as l, useRef as p, useEffect as f } from "react";
3
3
  import { ikp as o } from "../factory.js";
4
- import { useChatHistory as r } from "../../providers/chat-history-provider.js";
4
+ import { useChatHistory as s } from "../../providers/chat-history-provider.js";
5
+ import { useChatForm as P } from "../../providers/chat-form-provider.js";
5
6
  import { dataAttr as B } from "../../utils/misc.js";
6
7
  import { composeEventHandlers as c } from "../../utils/compose-event-handlers.js";
7
- import { CustomIcon as f } from "../../atoms/icons/custom-icon.js";
8
- const I = o("div", { _id: "aiChatHistory" }), j = (t) => {
9
- const { isOpen: i } = r();
10
- return /* @__PURE__ */ s(I, { "data-hidden": B(!i), ...t });
11
- }, M = o("div", { _id: "aiChatHistory__Header" }), k = o(f, {
8
+ import { CustomIcon as I } from "../../atoms/icons/custom-icon.js";
9
+ const k = o("div", { _id: "aiChatHistory" }), A = (t) => {
10
+ const { isOpen: i } = s(), { form: e } = P();
11
+ return e ? null : /* @__PURE__ */ r(k, { "data-hidden": B(!i), ...t });
12
+ }, K = o("div", { _id: "aiChatHistory__Header" }), g = o(I, {
12
13
  _id: "aiChatHistory__BackButtonIcon"
13
- }), A = C(
14
- (t) => /* @__PURE__ */ s(k, { ...t, iconKey: "backToChat" })
15
- ), g = o("button", { _id: "aiChatHistory__BackButton" }), K = ({
14
+ }), q = v(
15
+ (t) => /* @__PURE__ */ r(g, { ...t, iconKey: "backToChat" })
16
+ ), L = o("button", { _id: "aiChatHistory__BackButton" }), z = ({
16
17
  onClick: t,
17
18
  ...i
18
19
  }) => {
19
- const { setIsOpen: e } = r();
20
- return /* @__PURE__ */ s(
21
- g,
20
+ const { setIsOpen: e } = s();
21
+ return /* @__PURE__ */ r(
22
+ L,
22
23
  {
23
24
  type: "button",
24
25
  onClick: c(t, () => e(!1)),
25
26
  ...i
26
27
  }
27
28
  );
28
- }, q = o("h2", { _id: "aiChatHistory__Title" }), L = o("div", { _id: "aiChatHistory__List" }), z = l(({ children: t, ...i }, e) => {
29
- const { hasMore: n, loadMore: m, isLoading: d, sessions: _ } = r(), h = p(null), a = _.length > 0 && n;
30
- return P(() => {
31
- const u = h.current;
32
- if (!u || !a) return;
33
- const v = new IntersectionObserver(
29
+ }, G = o("h2", { _id: "aiChatHistory__Title" }), b = o("div", { _id: "aiChatHistory__List" }), J = l(({ children: t, ...i }, e) => {
30
+ const { hasMore: n, loadMore: m, isLoading: d, sessions: _ } = s(), u = p(null), a = _.length > 0 && n;
31
+ return f(() => {
32
+ const h = u.current;
33
+ if (!h || !a) return;
34
+ const C = new IntersectionObserver(
34
35
  (y) => {
35
36
  y[0]?.isIntersecting && n && !d && m();
36
37
  },
37
38
  { threshold: 0.1 }
38
39
  );
39
- return v.observe(u), () => v.disconnect();
40
- }, [n, d, m, a]), /* @__PURE__ */ H(L, { ref: e, ...i, children: [
40
+ return C.observe(h), () => C.disconnect();
41
+ }, [n, d, m, a]), /* @__PURE__ */ H(b, { ref: e, ...i, children: [
41
42
  t,
42
- a && /* @__PURE__ */ s("div", { ref: h, "data-part": "sentinel", "aria-hidden": "true", style: { height: 1 } })
43
+ a && /* @__PURE__ */ r("div", { ref: u, "data-part": "sentinel", "aria-hidden": "true", style: { height: 1 } })
43
44
  ] });
44
- }), b = o("button", { _id: "aiChatHistory__Item" }), G = C(
45
+ }), S = o("button", { _id: "aiChatHistory__Item" }), Q = v(
45
46
  ({ sessionId: t, onClick: i, ...e }) => {
46
- const { loadSession: n } = r();
47
- return /* @__PURE__ */ s(
48
- b,
47
+ const { loadSession: n } = s();
48
+ return /* @__PURE__ */ r(
49
+ S,
49
50
  {
50
51
  type: "button",
51
52
  onClick: c(i, () => n(t)),
@@ -53,21 +54,21 @@ const I = o("div", { _id: "aiChatHistory" }), j = (t) => {
53
54
  }
54
55
  );
55
56
  }
56
- ), J = o("span", { _id: "aiChatHistory__ItemTitle" }), Q = o("span", { _id: "aiChatHistory__ItemDate" }), S = o("div", { _id: "aiChatHistory__EmptyState" }), U = (t) => {
57
- const { sessions: i, isLoading: e } = r();
58
- return i.length > 0 || e ? null : /* @__PURE__ */ s(S, { ...t });
59
- }, w = o("div", { _id: "aiChatHistory__LoadingState" }), V = (t) => {
60
- const { isLoading: i } = r();
61
- return i ? /* @__PURE__ */ s(w, { ...t }) : null;
62
- }, W = o("div", { _id: "aiChatHistory__Footer" }), T = o("button", {
57
+ ), U = o("span", { _id: "aiChatHistory__ItemTitle" }), V = o("span", { _id: "aiChatHistory__ItemDate" }), w = o("div", { _id: "aiChatHistory__EmptyState" }), W = (t) => {
58
+ const { sessions: i, isLoading: e } = s();
59
+ return i.length > 0 || e ? null : /* @__PURE__ */ r(w, { ...t });
60
+ }, T = o("div", { _id: "aiChatHistory__LoadingState" }), X = (t) => {
61
+ const { isLoading: i } = s();
62
+ return i ? /* @__PURE__ */ r(T, { ...t }) : null;
63
+ }, Y = o("div", { _id: "aiChatHistory__Footer" }), E = o("button", {
63
64
  _id: "aiChatHistory__NewConversationButton"
64
- }), X = ({
65
+ }), Z = ({
65
66
  onClick: t,
66
67
  ...i
67
68
  }) => {
68
- const { startNewConversation: e } = r();
69
- return /* @__PURE__ */ s(
70
- T,
69
+ const { startNewConversation: e } = s();
70
+ return /* @__PURE__ */ r(
71
+ E,
71
72
  {
72
73
  type: "button",
73
74
  onClick: c(t, e),
@@ -76,30 +77,30 @@ const I = o("div", { _id: "aiChatHistory" }), j = (t) => {
76
77
  );
77
78
  };
78
79
  export {
79
- K as BackButton,
80
- A as BackButtonIcon,
81
- K as ChatHistoryPrimitiveBackButton,
82
- A as ChatHistoryPrimitiveBackButtonIcon,
83
- U as ChatHistoryPrimitiveEmptyState,
84
- W as ChatHistoryPrimitiveFooter,
85
- M as ChatHistoryPrimitiveHeader,
86
- G as ChatHistoryPrimitiveItem,
87
- Q as ChatHistoryPrimitiveItemDate,
88
- J as ChatHistoryPrimitiveItemTitle,
89
- z as ChatHistoryPrimitiveList,
90
- V as ChatHistoryPrimitiveLoadingState,
91
- X as ChatHistoryPrimitiveNewConversationButton,
92
- j as ChatHistoryPrimitiveRoot,
93
- q as ChatHistoryPrimitiveTitle,
94
- U as EmptyState,
95
- W as Footer,
96
- M as Header,
97
- G as Item,
98
- Q as ItemDate,
99
- J as ItemTitle,
100
- z as List,
101
- V as LoadingState,
102
- X as NewConversationButton,
103
- j as Root,
104
- q as Title
80
+ z as BackButton,
81
+ q as BackButtonIcon,
82
+ z as ChatHistoryPrimitiveBackButton,
83
+ q as ChatHistoryPrimitiveBackButtonIcon,
84
+ W as ChatHistoryPrimitiveEmptyState,
85
+ Y as ChatHistoryPrimitiveFooter,
86
+ K as ChatHistoryPrimitiveHeader,
87
+ Q as ChatHistoryPrimitiveItem,
88
+ V as ChatHistoryPrimitiveItemDate,
89
+ U as ChatHistoryPrimitiveItemTitle,
90
+ J as ChatHistoryPrimitiveList,
91
+ X as ChatHistoryPrimitiveLoadingState,
92
+ Z as ChatHistoryPrimitiveNewConversationButton,
93
+ A as ChatHistoryPrimitiveRoot,
94
+ G as ChatHistoryPrimitiveTitle,
95
+ W as EmptyState,
96
+ Y as Footer,
97
+ K as Header,
98
+ Q as Item,
99
+ V as ItemDate,
100
+ U as ItemTitle,
101
+ J as List,
102
+ X as LoadingState,
103
+ Z as NewConversationButton,
104
+ A as Root,
105
+ G as Title
105
106
  };
@@ -1,3 +1,3 @@
1
- "use client";"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const Pe=require("@ai-sdk/react"),Ne=require("ai"),t=require("react"),Oe=require("../modal/modal-provider.cjs"),_e=require("../../providers/chat-bubble-provider.cjs"),Fe=require("../../providers/sidebar-chat-provider.cjs"),Ue=require("../../providers/config-provider.cjs"),Be=require("./use-captcha.cjs"),De=require("../../hooks/use-media-query.cjs"),Le=require("../../hooks/use-anonymous-session.cjs"),He=require("../../hooks/use-conversation-loader.cjs"),w=require("../../utils/generate-uid.cjs"),$e=require("../../providers/base-events-provider.cjs"),ze=require("../../providers/chat-form-provider.cjs"),We=require("../../providers/widget-provider.cjs"),Ke=require("@radix-ui/react-use-controllable-state"),je=require("../../hooks/use-streaming-events.cjs"),Ge=require("../../hooks/use-inkeep-api-client.cjs");function Je(g){const l=g.message??"";let r=Number(g.code)||Number(g.statusCode);if(Number.isNaN(r))try{r=Number(JSON.parse(l).status)}catch{}const d=Ge.parseAuthError(r,{detail:l});return d!==null?d:r===401?"session":null}const $=`Hmm..
1
+ "use client";"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const Ne=require("@ai-sdk/react"),Pe=require("ai"),t=require("react"),Oe=require("../modal/modal-provider.cjs"),Fe=require("../../providers/chat-bubble-provider.cjs"),Ue=require("../../providers/sidebar-chat-provider.cjs"),Be=require("../../providers/config-provider.cjs"),De=require("./use-captcha.cjs"),Le=require("../../hooks/use-media-query.cjs"),He=require("../../hooks/use-anonymous-session.cjs"),$e=require("../../hooks/use-conversation-loader.cjs"),w=require("../../utils/generate-uid.cjs"),ze=require("../../providers/base-events-provider.cjs"),We=require("../../providers/chat-form-provider.cjs"),Ke=require("../../providers/widget-provider.cjs"),je=require("@radix-ui/react-use-controllable-state"),Ge=require("../../hooks/use-streaming-events.cjs"),Je=require("../../hooks/use-inkeep-api-client.cjs");function Qe(g){const l=g.message??"";let s=Number(g.code)||Number(g.statusCode);if(Number.isNaN(s))try{s=Number(JSON.parse(l).status)}catch{}const d=Je.parseAuthError(s,{detail:l});return d!==null?d:s===401?"session":null}const $=`Hmm..
2
2
 
3
- It seems I might be having some issues right now. Please clear the chat and try again.`,Qe=()=>{const{baseSettings:g,aiChatSettings:l}=Ue.useInkeepConfig(),[r="",d]=Ke.useControllableState({prop:l.conversationId,defaultProp:l.conversationId??""}),ce=Oe.useModal(),ue=_e.useOptionalChatBubble(),le=Fe.useOptionalSidebarChat(),{logEvent:m}=$e.useBaseEvents(),{setConversationId:de,emitToParent:C}=je.useStreamingEvents(),[v,k]=t.useState(""),pe=e=>k(e.target.value),{shouldBypassCaptcha:z,filters:W,privacyPreferences:ge}=g,{onInputMessageChange:fe,filters:K,baseUrl:S,agentUrl:he,context:j,headers:G,appId:y,apiKey:p}=l,me=ce?.isOpen??ue?.isOpen??le?.isOpen??!0,{getCaptchaHeader:b,invalidate:u}=Be.useCaptcha({baseUrl:S,shouldBypassCaptcha:z||!!p,shouldMakeInitialRequest:me}),J=t.useRef(b);J.current=b;const Q=he||`${S}/run/api/chat`,{sessionToken:q,refreshSession:x}=Le.useAnonymousSession({baseUrl:S,appId:y,getCaptchaHeader:b,invalidateCaptcha:u,optOutAllAnalytics:ge?.optOutAllAnalytics}),{loadConversation:V}=He.useConversationLoader({baseUrl:S,appId:y,authToken:p??q,getCaptchaHeader:b,invalidateCaptcha:u,refreshSession:p?void 0:x}),[ve,Z]=t.useState(!1),R=t.useRef(null);R.current=q;const f=t.useRef(0),X=t.useRef(null),T=t.useRef(null),Y=t.useRef(G);Y.current=G;const P=t.useRef(void 0);P.current=W||K?JSON.stringify({...W,...K}):void 0;const ye=e=>{switch(e.code){case 400:return e.message;case 403:return`There seems to be a configuration error. Please contact ${g.organizationDisplayName??"Administrator"}`;default:return $}},[be,I]=t.useState([]),[Ce,N]=t.useState(null),Se=t.useMemo(()=>new Ne.DefaultChatTransport({api:Q,headers:()=>({"x-inkeep-client-timezone":Intl.DateTimeFormat().resolvedOptions().timeZone,"x-inkeep-client-timestamp":new Date().toISOString(),...y?{"x-inkeep-app-id":y}:{},...R.current?{Authorization:`Bearer ${R.current}`}:{},...p?{Authorization:`Bearer ${p}`}:{},...P.current?{"inkeep-filters":P.current}:{},...Y.current}),prepareSendMessagesRequest:async e=>{const s=await J.current();return{body:{...e.body,id:e.id,messages:e.messages,trigger:e.trigger,messageId:e.messageId},headers:{...e.headers,...s}}},body:{requestContext:j}}),[Q,j,y,p]),{messages:A,sendMessage:O,addToolApprovalResponse:_,status:ee,setMessages:h,stop:te,error:F}=Pe.useChat({transport:Se,onData(e){C(e.type,e.data)},async onFinish(){C("completion",{conversationId:r}),await m({eventName:"assistant_message_received",properties:{conversationId:r}}),m({eventName:"assistant_answer_displayed",properties:{conversationId:r}})},onError(e){console.error("onError",{code:e.code,message:e.message});const s=z||p?null:Je(e);if(s!==null&&f.current<1){f.current++;const a=T.current,n=X.current;(async()=>{if(s==="session"){const c=await x();c&&(R.current=c)}else u();if(a){_(a);return}n&&(h(c=>{let i=[...c];return i.at(-1)?.role==="assistant"&&(i=i.slice(0,-1)),i.at(-1)?.role==="user"&&(i=i.slice(0,-1)),i}),O({text:n.content},{body:n.body}))})().catch(()=>{f.current=0,u(),h(c=>{const i=[...c],H=i[i.length-1];if(!H)return i;const ie=$;return H.role==="user"?i.push({id:w.generateUid(16),role:"assistant",parts:[{type:"text",text:ie}]}):H.parts=[{type:"text",text:ie}],i})});return}f.current=0,s!==null&&u(),m({eventName:"chat_error",properties:{conversationId:r,error:e.message}}),h(a=>{const n=[...a],o=n[n.length-1];if(o){const c=ye(e);o.role==="user"?n.push({id:w.generateUid(16),role:"assistant",parts:[{type:"text",text:c}]}):o.parts=[{type:"text",text:c}]}return n})}}),se=ee==="submitted",U=ee==="streaming",Re=t.useMemo(()=>{const e=o=>{if(!o||typeof o!="object")return!1;const c=o;return typeof c.type=="string"&&c.type.startsWith("tool-")},a=[...A??[]].reverse().find(o=>o.role==="assistant");if(!a)return!1;const n=a.parts?.at(-1);return!(!e(n)||n.state!=="output-available"||!n.approval?.id||U)},[A,U]),re=U||Re,ne=se||re,Ie=A.length===0,B=!v.trim()||ne,Ae=De.useMediaQuery("(max-width: 768px)"),[Ee,E]=t.useState(null);t.useEffect(()=>{F&&E(F)},[F]);const Me=()=>E(null),ae=t.useRef(null);t.useEffect(()=>{fe?.(v)},[v]);const we=e=>{e.key==="Enter"&&!e.shiftKey&&!B&&!e.nativeEvent.isComposing&&(e.preventDefault(),D())},D=async(e=v)=>{if(B&&(!e||e.trim().length===0))return;I([]),k(""),f.current=0,T.current=null,await m({eventName:"user_message_submitted",properties:{conversationId:r}});let s=r;s||(s=`conv_${w.generateUid(16)}`,d(s)),de(s),X.current={content:e,body:{conversationId:s}},O({text:e},{body:{conversationId:s}})},ke=t.useCallback(e=>{f.current=0,T.current=e,_(e)},[_]),L=t.useCallback(()=>{te().then(()=>{C("aborted",{conversationId:r})})},[te,r,C]),oe=()=>{Me(),h([]),d(""),I([]),N(null),u(),m({eventName:"chat_clear_button_clicked",properties:{conversationId:r}})},M=t.useCallback((e,s)=>{E(null),h(s),d(e),I([]),N(null),u()},[h,d,u]),qe=t.useCallback(async(e,s)=>{L(),M(e,[]),Z(!0);try{const a=await V(e,s),n=a?.[a.length-1],o=a!==null&&n?.role==="user"?[...a,{id:w.generateUid(16),role:"assistant",parts:[{type:"text",text:"This session was interrupted. Please check back in a few minutes or start a new conversation."}]}]:a;o!==null&&M(e,o)}finally{s?.aborted||Z(!1)}},[M,V,L]),{openForm:xe}=ze.useChatForm(),Te=We.useWidget();return t.useImperativeHandle(l.chatFunctionsRef,()=>({submitMessage:D,updateInputMessage(e){k(e)},clearChat:oe,openForm:e=>{Te?.setView("chat"),xe(e,void 0)},focusInput:()=>{ae.current?.focus()}})),{messages:A,sendMessage:O,addToolApprovalResponse:ke,isLoading:se,isStreaming:re,isBusy:ne,error:Ee,setError:E,isSubmitDisabled:B,input:v,handleInputChange:pe,handleInputKeyDown:we,handleSubmit:D,stop:L,clear:oe,inputRef:ae,isMobile:Ae,messageAttachments:be,setMessageAttachments:I,selectedWorkflow:Ce,setSelectedWorkflow:N,isNewChat:Ie,conversationId:r,restoreSession:M,loadAndRestoreSession:qe,isSessionLoading:ve,sessionToken:q,refreshSession:x,getCaptchaHeader:b,invalidateCaptcha:u}};exports.DEFAULT_ERROR_MESSAGE=$;exports.useInkeepChat=Qe;
3
+ It seems I might be having some issues right now. Please clear the chat and try again.`,Ve=()=>{const{baseSettings:g,aiChatSettings:l}=Be.useInkeepConfig(),[s="",d]=je.useControllableState({prop:l.conversationId,defaultProp:l.conversationId??""}),ue=Oe.useModal(),le=Fe.useOptionalChatBubble(),de=Ue.useOptionalSidebarChat(),{logEvent:p}=ze.useBaseEvents(),{setConversationId:pe,emitToParent:C}=Ge.useStreamingEvents(),z=t.useRef(s);t.useEffect(()=>{const e=z.current;z.current=s,e!==s&&p({eventName:"chat_conversation_changed",properties:{conversationId:s,previousConversationId:e}})},[s,p]);const[v,k]=t.useState(""),fe=e=>k(e.target.value),{shouldBypassCaptcha:W,filters:K,privacyPreferences:ge}=g,{onInputMessageChange:he,filters:j,baseUrl:S,agentUrl:me,context:G,headers:J,appId:y,apiKey:f}=l,ve=ue?.isOpen??le?.isOpen??de?.isOpen??!0,{getCaptchaHeader:b,invalidate:u}=De.useCaptcha({baseUrl:S,shouldBypassCaptcha:W||!!f,shouldMakeInitialRequest:ve}),Q=t.useRef(b);Q.current=b;const V=me||`${S}/run/api/chat`,{sessionToken:q,refreshSession:x}=He.useAnonymousSession({baseUrl:S,appId:y,getCaptchaHeader:b,invalidateCaptcha:u,optOutAllAnalytics:ge?.optOutAllAnalytics}),{loadConversation:Z}=$e.useConversationLoader({baseUrl:S,appId:y,authToken:f??q,getCaptchaHeader:b,invalidateCaptcha:u,refreshSession:f?void 0:x}),[ye,X]=t.useState(!1),R=t.useRef(null);R.current=q;const h=t.useRef(0),Y=t.useRef(null),T=t.useRef(null),ee=t.useRef(J);ee.current=J;const _=t.useRef(void 0);_.current=K||j?JSON.stringify({...K,...j}):void 0;const be=e=>{switch(e.code){case 400:return e.message;case 403:return`There seems to be a configuration error. Please contact ${g.organizationDisplayName??"Administrator"}`;default:return $}},[Ce,I]=t.useState([]),[Se,N]=t.useState(null),Re=t.useMemo(()=>new Pe.DefaultChatTransport({api:V,headers:()=>({"x-inkeep-client-timezone":Intl.DateTimeFormat().resolvedOptions().timeZone,"x-inkeep-client-timestamp":new Date().toISOString(),...y?{"x-inkeep-app-id":y}:{},...R.current?{Authorization:`Bearer ${R.current}`}:{},...f?{Authorization:`Bearer ${f}`}:{},..._.current?{"inkeep-filters":_.current}:{},...ee.current}),prepareSendMessagesRequest:async e=>{const r=await Q.current();return{body:{...e.body,id:e.id,messages:e.messages,trigger:e.trigger,messageId:e.messageId},headers:{...e.headers,...r}}},body:{requestContext:G}}),[V,G,y,f]),{messages:A,sendMessage:P,addToolApprovalResponse:O,status:te,setMessages:m,stop:se,error:F}=Ne.useChat({transport:Re,onData(e){C(e.type,e.data)},async onFinish(){C("completion",{conversationId:s}),await p({eventName:"assistant_message_received",properties:{conversationId:s}}),p({eventName:"assistant_answer_displayed",properties:{conversationId:s}})},onError(e){console.error("onError",{code:e.code,message:e.message});const r=W||f?null:Qe(e);if(r!==null&&h.current<1){h.current++;const a=T.current,n=Y.current;(async()=>{if(r==="session"){const c=await x();c&&(R.current=c)}else u();if(a){O(a);return}n&&(m(c=>{let i=[...c];return i.at(-1)?.role==="assistant"&&(i=i.slice(0,-1)),i.at(-1)?.role==="user"&&(i=i.slice(0,-1)),i}),P({text:n.content},{body:n.body}))})().catch(()=>{h.current=0,u(),m(c=>{const i=[...c],H=i[i.length-1];if(!H)return i;const ce=$;return H.role==="user"?i.push({id:w.generateUid(16),role:"assistant",parts:[{type:"text",text:ce}]}):H.parts=[{type:"text",text:ce}],i})});return}h.current=0,r!==null&&u(),p({eventName:"chat_error",properties:{conversationId:s,error:e.message}}),m(a=>{const n=[...a],o=n[n.length-1];if(o){const c=be(e);o.role==="user"?n.push({id:w.generateUid(16),role:"assistant",parts:[{type:"text",text:c}]}):o.parts=[{type:"text",text:c}]}return n})}}),re=te==="submitted",U=te==="streaming",Ie=t.useMemo(()=>{const e=o=>{if(!o||typeof o!="object")return!1;const c=o;return typeof c.type=="string"&&c.type.startsWith("tool-")},a=[...A??[]].reverse().find(o=>o.role==="assistant");if(!a)return!1;const n=a.parts?.at(-1);return!(!e(n)||n.state!=="output-available"||!n.approval?.id||U)},[A,U]),ne=U||Ie,ae=re||ne,Ae=A.length===0,B=!v.trim()||ae,Ee=Le.useMediaQuery("(max-width: 768px)"),[Me,E]=t.useState(null);t.useEffect(()=>{F&&E(F)},[F]);const we=()=>E(null),oe=t.useRef(null);t.useEffect(()=>{he?.(v)},[v]);const ke=e=>{e.key==="Enter"&&!e.shiftKey&&!B&&!e.nativeEvent.isComposing&&(e.preventDefault(),D())},D=async(e=v)=>{if(B&&(!e||e.trim().length===0))return;I([]),k(""),h.current=0,T.current=null,await p({eventName:"user_message_submitted",properties:{conversationId:s}});let r=s;r||(r=`conv_${w.generateUid(16)}`,d(r)),pe(r),Y.current={content:e,body:{conversationId:r}},P({text:e},{body:{conversationId:r}})},qe=t.useCallback(e=>{h.current=0,T.current=e,O(e)},[O]),L=t.useCallback(()=>{se().then(()=>{C("aborted",{conversationId:s})})},[se,s,C]),ie=()=>{we(),m([]),d(""),I([]),N(null),u(),p({eventName:"chat_clear_button_clicked",properties:{conversationId:s}})},M=t.useCallback((e,r)=>{E(null),m(r),d(e),I([]),N(null),u()},[m,d,u]),xe=t.useCallback(async(e,r)=>{L(),M(e,[]),X(!0);try{const a=await Z(e,r),n=a?.[a.length-1],o=a!==null&&n?.role==="user"?[...a,{id:w.generateUid(16),role:"assistant",parts:[{type:"text",text:"This session was interrupted. Please check back in a few minutes or start a new conversation."}]}]:a;o!==null&&M(e,o)}finally{r?.aborted||X(!1)}},[M,Z,L]),{openForm:Te}=We.useChatForm(),_e=Ke.useWidget();return t.useImperativeHandle(l.chatFunctionsRef,()=>({submitMessage:D,updateInputMessage(e){k(e)},clearChat:ie,openForm:e=>{_e?.setView("chat"),Te(e,void 0)},focusInput:()=>{oe.current?.focus()}})),{messages:A,sendMessage:P,addToolApprovalResponse:qe,isLoading:re,isStreaming:ne,isBusy:ae,error:Me,setError:E,isSubmitDisabled:B,input:v,handleInputChange:fe,handleInputKeyDown:ke,handleSubmit:D,stop:L,clear:ie,inputRef:oe,isMobile:Ee,messageAttachments:Ce,setMessageAttachments:I,selectedWorkflow:Se,setSelectedWorkflow:N,isNewChat:Ae,conversationId:s,restoreSession:M,loadAndRestoreSession:xe,isSessionLoading:ye,sessionToken:q,refreshSession:x,getCaptchaHeader:b,invalidateCaptcha:u}};exports.DEFAULT_ERROR_MESSAGE=$;exports.useInkeepChat=Ve;
@@ -1,97 +1,108 @@
1
1
  "use client";
2
- import { useChat as De } from "@ai-sdk/react";
3
- import { DefaultChatTransport as Pe } from "ai";
4
- import { useState as C, useRef as l, useMemo as le, useEffect as ue, useCallback as E, useImperativeHandle as He } from "react";
5
- import { useModal as Le } from "../modal/modal-provider.js";
6
- import { useOptionalChatBubble as Ue } from "../../providers/chat-bubble-provider.js";
7
- import { useOptionalSidebarChat as $e } from "../../providers/sidebar-chat-provider.js";
8
- import { useInkeepConfig as ze } from "../../providers/config-provider.js";
9
- import { useCaptcha as We } from "./use-captcha.js";
10
- import { useMediaQuery as qe } from "../../hooks/use-media-query.js";
11
- import { useAnonymousSession as Ke } from "../../hooks/use-anonymous-session.js";
12
- import { useConversationLoader as Je } from "../../hooks/use-conversation-loader.js";
2
+ import { useChat as Pe } from "@ai-sdk/react";
3
+ import { DefaultChatTransport as He } from "ai";
4
+ import { useRef as l, useEffect as q, useState as C, useMemo as pe, useCallback as E, useImperativeHandle as Le } from "react";
5
+ import { useModal as Ue } from "../modal/modal-provider.js";
6
+ import { useOptionalChatBubble as $e } from "../../providers/chat-bubble-provider.js";
7
+ import { useOptionalSidebarChat as ze } from "../../providers/sidebar-chat-provider.js";
8
+ import { useInkeepConfig as We } from "../../providers/config-provider.js";
9
+ import { useCaptcha as qe } from "./use-captcha.js";
10
+ import { useMediaQuery as Ke } from "../../hooks/use-media-query.js";
11
+ import { useAnonymousSession as Je } from "../../hooks/use-anonymous-session.js";
12
+ import { useConversationLoader as je } from "../../hooks/use-conversation-loader.js";
13
13
  import { generateUid as k } from "../../utils/generate-uid.js";
14
- import { useBaseEvents as je } from "../../providers/base-events-provider.js";
15
- import { useChatForm as Ge } from "../../providers/chat-form-provider.js";
16
- import { useWidget as Qe } from "../../providers/widget-provider.js";
17
- import { useControllableState as Ve } from "@radix-ui/react-use-controllable-state";
18
- import { useStreamingEvents as Ze } from "../../hooks/use-streaming-events.js";
19
- import { parseAuthError as Xe } from "../../hooks/use-inkeep-api-client.js";
20
- function Ye(d) {
21
- const u = d.message ?? "";
22
- let s = Number(d.code) || Number(d.statusCode);
23
- if (Number.isNaN(s))
14
+ import { useBaseEvents as Ge } from "../../providers/base-events-provider.js";
15
+ import { useChatForm as Qe } from "../../providers/chat-form-provider.js";
16
+ import { useWidget as Ve } from "../../providers/widget-provider.js";
17
+ import { useControllableState as Ze } from "@radix-ui/react-use-controllable-state";
18
+ import { useStreamingEvents as Xe } from "../../hooks/use-streaming-events.js";
19
+ import { parseAuthError as Ye } from "../../hooks/use-inkeep-api-client.js";
20
+ function et(f) {
21
+ const u = f.message ?? "";
22
+ let t = Number(f.code) || Number(f.statusCode);
23
+ if (Number.isNaN(t))
24
24
  try {
25
- s = Number(JSON.parse(u).status);
25
+ t = Number(JSON.parse(u).status);
26
26
  } catch {
27
27
  }
28
- const p = Xe(s, { detail: u });
29
- return p !== null ? p : s === 401 ? "session" : null;
28
+ const p = Ye(t, { detail: u });
29
+ return p !== null ? p : t === 401 ? "session" : null;
30
30
  }
31
- const pe = `Hmm..
31
+ const me = `Hmm..
32
32
 
33
- It seems I might be having some issues right now. Please clear the chat and try again.`, vt = () => {
34
- const { baseSettings: d, aiChatSettings: u } = ze(), [s = "", p] = Ve({
33
+ It seems I might be having some issues right now. Please clear the chat and try again.`, bt = () => {
34
+ const { baseSettings: f, aiChatSettings: u } = We(), [t = "", p] = Ze({
35
35
  prop: u.conversationId,
36
36
  defaultProp: u.conversationId ?? ""
37
- }), me = Le(), de = Ue(), fe = $e(), { logEvent: h } = je(), { setConversationId: ge, emitToParent: S } = Ze(), [y, N] = C(""), he = (e) => N(e.target.value), { shouldBypassCaptcha: q, filters: K, privacyPreferences: ye } = d, {
38
- onInputMessageChange: ve,
39
- filters: J,
37
+ }), de = Ue(), fe = $e(), ge = ze(), { logEvent: m } = Ge(), { setConversationId: he, emitToParent: S } = Xe(), K = l(t);
38
+ q(() => {
39
+ const e = K.current;
40
+ K.current = t, e !== t && m({
41
+ eventName: "chat_conversation_changed",
42
+ properties: {
43
+ conversationId: t,
44
+ previousConversationId: e
45
+ }
46
+ });
47
+ }, [t, m]);
48
+ const [v, N] = C(""), ve = (e) => N(e.target.value), { shouldBypassCaptcha: J, filters: j, privacyPreferences: ye } = f, {
49
+ onInputMessageChange: be,
50
+ filters: G,
40
51
  baseUrl: I,
41
- agentUrl: be,
42
- context: j,
43
- headers: G,
44
- appId: v,
45
- apiKey: m
46
- } = u, Ce = me?.isOpen ?? de?.isOpen ?? fe?.isOpen ?? !0, { getCaptchaHeader: b, invalidate: c } = We({
52
+ agentUrl: Ce,
53
+ context: Q,
54
+ headers: V,
55
+ appId: y,
56
+ apiKey: d
57
+ } = u, Se = de?.isOpen ?? fe?.isOpen ?? ge?.isOpen ?? !0, { getCaptchaHeader: b, invalidate: c } = qe({
47
58
  baseUrl: I,
48
- shouldBypassCaptcha: q || !!m,
49
- shouldMakeInitialRequest: Ce
50
- }), Q = l(b);
51
- Q.current = b;
52
- const V = be || `${I}/run/api/chat`, { sessionToken: T, refreshSession: O } = Ke({
59
+ shouldBypassCaptcha: J || !!d,
60
+ shouldMakeInitialRequest: Se
61
+ }), Z = l(b);
62
+ Z.current = b;
63
+ const X = Ce || `${I}/run/api/chat`, { sessionToken: T, refreshSession: _ } = Je({
53
64
  baseUrl: I,
54
- appId: v,
65
+ appId: y,
55
66
  getCaptchaHeader: b,
56
67
  invalidateCaptcha: c,
57
68
  optOutAllAnalytics: ye?.optOutAllAnalytics
58
- }), { loadConversation: Z } = Je({
69
+ }), { loadConversation: Y } = je({
59
70
  baseUrl: I,
60
- appId: v,
61
- authToken: m ?? T,
71
+ appId: y,
72
+ authToken: d ?? T,
62
73
  getCaptchaHeader: b,
63
74
  invalidateCaptcha: c,
64
75
  // Only pass refreshSession for anonymous-session flows; API key auth has no token to refresh.
65
- refreshSession: m ? void 0 : O
66
- }), [Se, X] = C(!1), w = l(null);
76
+ refreshSession: d ? void 0 : _
77
+ }), [Ie, ee] = C(!1), w = l(null);
67
78
  w.current = T;
68
- const f = l(0), Y = l(null), _ = l(null), ee = l(G);
69
- ee.current = G;
79
+ const g = l(0), te = l(null), O = l(null), se = l(V);
80
+ se.current = V;
70
81
  const F = l(void 0);
71
- F.current = K || J ? JSON.stringify({ ...K, ...J }) : void 0;
72
- const Ie = (e) => {
82
+ F.current = j || G ? JSON.stringify({ ...j, ...G }) : void 0;
83
+ const we = (e) => {
73
84
  switch (e.code) {
74
85
  case 400:
75
86
  return e.message;
76
87
  case 403:
77
- return `There seems to be a configuration error. Please contact ${d.organizationDisplayName ?? "Administrator"}`;
88
+ return `There seems to be a configuration error. Please contact ${f.organizationDisplayName ?? "Administrator"}`;
78
89
  default:
79
- return pe;
90
+ return me;
80
91
  }
81
- }, [we, A] = C([]), [Ae, B] = C(null), Me = le(
82
- () => new Pe({
83
- api: V,
92
+ }, [Ae, A] = C([]), [Re, B] = C(null), Me = pe(
93
+ () => new He({
94
+ api: X,
84
95
  headers: () => ({
85
96
  "x-inkeep-client-timezone": Intl.DateTimeFormat().resolvedOptions().timeZone,
86
97
  "x-inkeep-client-timestamp": (/* @__PURE__ */ new Date()).toISOString(),
87
- ...v ? { "x-inkeep-app-id": v } : {},
98
+ ...y ? { "x-inkeep-app-id": y } : {},
88
99
  ...w.current ? { Authorization: `Bearer ${w.current}` } : {},
89
- ...m ? { Authorization: `Bearer ${m}` } : {},
100
+ ...d ? { Authorization: `Bearer ${d}` } : {},
90
101
  ...F.current ? { "inkeep-filters": F.current } : {},
91
- ...ee.current
102
+ ...se.current
92
103
  }),
93
104
  prepareSendMessagesRequest: async (e) => {
94
- const t = await Q.current();
105
+ const s = await Z.current();
95
106
  return {
96
107
  body: {
97
108
  ...e.body,
@@ -102,50 +113,50 @@ It seems I might be having some issues right now. Please clear the chat and try
102
113
  },
103
114
  headers: {
104
115
  ...e.headers,
105
- ...t
116
+ ...s
106
117
  }
107
118
  };
108
119
  },
109
120
  body: {
110
- requestContext: j
121
+ requestContext: Q
111
122
  }
112
123
  }),
113
- [V, j, v, m]
124
+ [X, Q, y, d]
114
125
  ), {
115
- messages: M,
126
+ messages: R,
116
127
  sendMessage: D,
117
128
  addToolApprovalResponse: P,
118
- status: te,
119
- setMessages: g,
120
- stop: se,
129
+ status: re,
130
+ setMessages: h,
131
+ stop: ne,
121
132
  error: H
122
- } = De({
133
+ } = Pe({
123
134
  transport: Me,
124
135
  onData(e) {
125
136
  S(e.type, e.data);
126
137
  },
127
138
  async onFinish() {
128
- S("completion", { conversationId: s }), await h({
139
+ S("completion", { conversationId: t }), await m({
129
140
  eventName: "assistant_message_received",
130
141
  properties: {
131
- conversationId: s
142
+ conversationId: t
132
143
  }
133
- }), h({
144
+ }), m({
134
145
  eventName: "assistant_answer_displayed",
135
146
  properties: {
136
- conversationId: s
147
+ conversationId: t
137
148
  }
138
149
  });
139
150
  },
140
151
  onError(e) {
141
152
  console.error("onError", { code: e.code, message: e.message });
142
- const t = q || m ? null : Ye(e);
143
- if (t !== null && f.current < 1) {
144
- f.current++;
145
- const n = _.current, r = Y.current;
153
+ const s = J || d ? null : et(e);
154
+ if (s !== null && g.current < 1) {
155
+ g.current++;
156
+ const n = O.current, r = te.current;
146
157
  (async () => {
147
- if (t === "session") {
148
- const i = await O();
158
+ if (s === "session") {
159
+ const i = await _();
149
160
  i && (w.current = i);
150
161
  } else
151
162
  c();
@@ -153,34 +164,34 @@ It seems I might be having some issues right now. Please clear the chat and try
153
164
  P(n);
154
165
  return;
155
166
  }
156
- r && (g((i) => {
167
+ r && (h((i) => {
157
168
  let a = [...i];
158
169
  return a.at(-1)?.role === "assistant" && (a = a.slice(0, -1)), a.at(-1)?.role === "user" && (a = a.slice(0, -1)), a;
159
170
  }), D({ text: r.content }, { body: r.body }));
160
171
  })().catch(() => {
161
- f.current = 0, c(), g((i) => {
172
+ g.current = 0, c(), h((i) => {
162
173
  const a = [...i], W = a[a.length - 1];
163
174
  if (!W) return a;
164
- const ce = pe;
175
+ const ue = me;
165
176
  return W.role === "user" ? a.push({
166
177
  id: k(16),
167
178
  role: "assistant",
168
- parts: [{ type: "text", text: ce }]
169
- }) : W.parts = [{ type: "text", text: ce }], a;
179
+ parts: [{ type: "text", text: ue }]
180
+ }) : W.parts = [{ type: "text", text: ue }], a;
170
181
  });
171
182
  });
172
183
  return;
173
184
  }
174
- f.current = 0, t !== null && c(), h({
185
+ g.current = 0, s !== null && c(), m({
175
186
  eventName: "chat_error",
176
187
  properties: {
177
- conversationId: s,
188
+ conversationId: t,
178
189
  error: e.message
179
190
  }
180
- }), g((n) => {
191
+ }), h((n) => {
181
192
  const r = [...n], o = r[r.length - 1];
182
193
  if (o) {
183
- const i = Ie(e);
194
+ const i = we(e);
184
195
  o.role === "user" ? r.push({
185
196
  id: k(16),
186
197
  role: "assistant",
@@ -190,127 +201,127 @@ It seems I might be having some issues right now. Please clear the chat and try
190
201
  return r;
191
202
  });
192
203
  }
193
- }), re = te === "submitted", L = te === "streaming", Re = le(() => {
204
+ }), oe = re === "submitted", L = re === "streaming", xe = pe(() => {
194
205
  const e = (o) => {
195
206
  if (!o || typeof o != "object") return !1;
196
207
  const i = o;
197
208
  return typeof i.type == "string" && i.type.startsWith("tool-");
198
- }, n = [...M ?? []].reverse().find((o) => o.role === "assistant");
209
+ }, n = [...R ?? []].reverse().find((o) => o.role === "assistant");
199
210
  if (!n) return !1;
200
211
  const r = n.parts?.at(-1);
201
212
  return !(!e(r) || r.state !== "output-available" || !r.approval?.id || L);
202
- }, [M, L]), ne = L || Re, oe = re || ne, xe = M.length === 0, U = !y.trim() || oe, Ee = qe("(max-width: 768px)"), [ke, R] = C(null);
203
- ue(() => {
204
- H && R(H);
213
+ }, [R, L]), ae = L || xe, ie = oe || ae, Ee = R.length === 0, U = !v.trim() || ie, ke = Ke("(max-width: 768px)"), [Ne, M] = C(null);
214
+ q(() => {
215
+ H && M(H);
205
216
  }, [H]);
206
- const Ne = () => R(null), ae = l(null);
207
- ue(() => {
208
- ve?.(y);
209
- }, [y]);
210
- const Te = (e) => {
217
+ const Te = () => M(null), ce = l(null);
218
+ q(() => {
219
+ be?.(v);
220
+ }, [v]);
221
+ const _e = (e) => {
211
222
  e.key === "Enter" && !e.shiftKey && !U && !e.nativeEvent.isComposing && (e.preventDefault(), $());
212
- }, $ = async (e = y) => {
223
+ }, $ = async (e = v) => {
213
224
  if (U && (!e || e.trim().length === 0)) return;
214
- A([]), N(""), f.current = 0, _.current = null, await h({
225
+ A([]), N(""), g.current = 0, O.current = null, await m({
215
226
  eventName: "user_message_submitted",
216
227
  properties: {
217
- conversationId: s
228
+ conversationId: t
218
229
  }
219
230
  });
220
- let t = s;
221
- t || (t = `conv_${k(16)}`, p(t)), ge(t), Y.current = {
231
+ let s = t;
232
+ s || (s = `conv_${k(16)}`, p(s)), he(s), te.current = {
222
233
  content: e,
223
- body: { conversationId: t }
234
+ body: { conversationId: s }
224
235
  }, D(
225
236
  { text: e },
226
237
  {
227
- body: { conversationId: t }
238
+ body: { conversationId: s }
228
239
  }
229
240
  );
230
241
  }, Oe = E(
231
242
  (e) => {
232
- f.current = 0, _.current = e, P(e);
243
+ g.current = 0, O.current = e, P(e);
233
244
  },
234
245
  [P]
235
246
  ), z = E(() => {
236
- se().then(() => {
237
- S("aborted", { conversationId: s });
247
+ ne().then(() => {
248
+ S("aborted", { conversationId: t });
238
249
  });
239
- }, [se, s, S]), ie = () => {
240
- Ne(), g([]), p(""), A([]), B(null), c(), h({
250
+ }, [ne, t, S]), le = () => {
251
+ Te(), h([]), p(""), A([]), B(null), c(), m({
241
252
  eventName: "chat_clear_button_clicked",
242
253
  properties: {
243
- conversationId: s
254
+ conversationId: t
244
255
  }
245
256
  });
246
257
  }, x = E(
247
- (e, t) => {
248
- R(null), g(t), p(e), A([]), B(null), c();
258
+ (e, s) => {
259
+ M(null), h(s), p(e), A([]), B(null), c();
249
260
  },
250
- [g, p, c]
251
- ), _e = E(
252
- async (e, t) => {
253
- z(), x(e, []), X(!0);
261
+ [h, p, c]
262
+ ), Fe = E(
263
+ async (e, s) => {
264
+ z(), x(e, []), ee(!0);
254
265
  try {
255
- const n = await Z(e, t), r = n?.[n.length - 1], o = n !== null && r?.role === "user" ? [...n, {
266
+ const n = await Y(e, s), r = n?.[n.length - 1], o = n !== null && r?.role === "user" ? [...n, {
256
267
  id: k(16),
257
268
  role: "assistant",
258
269
  parts: [{ type: "text", text: "This session was interrupted. Please check back in a few minutes or start a new conversation." }]
259
270
  }] : n;
260
271
  o !== null && x(e, o);
261
272
  } finally {
262
- t?.aborted || X(!1);
273
+ s?.aborted || ee(!1);
263
274
  }
264
275
  },
265
- [x, Z, z]
266
- ), { openForm: Fe } = Ge(), Be = Qe();
267
- return He(u.chatFunctionsRef, () => ({
276
+ [x, Y, z]
277
+ ), { openForm: Be } = Qe(), De = Ve();
278
+ return Le(u.chatFunctionsRef, () => ({
268
279
  submitMessage: $,
269
280
  updateInputMessage(e) {
270
281
  N(e);
271
282
  },
272
- clearChat: ie,
283
+ clearChat: le,
273
284
  openForm: (e) => {
274
- Be?.setView("chat"), Fe(e, void 0);
285
+ De?.setView("chat"), Be(e, void 0);
275
286
  },
276
287
  focusInput: () => {
277
- ae.current?.focus();
288
+ ce.current?.focus();
278
289
  }
279
290
  })), {
280
- messages: M,
291
+ messages: R,
281
292
  sendMessage: D,
282
293
  addToolApprovalResponse: Oe,
283
- isLoading: re,
284
- isStreaming: ne,
285
- isBusy: oe,
286
- error: ke,
287
- setError: R,
294
+ isLoading: oe,
295
+ isStreaming: ae,
296
+ isBusy: ie,
297
+ error: Ne,
298
+ setError: M,
288
299
  isSubmitDisabled: U,
289
- input: y,
290
- handleInputChange: he,
291
- handleInputKeyDown: Te,
300
+ input: v,
301
+ handleInputChange: ve,
302
+ handleInputKeyDown: _e,
292
303
  handleSubmit: $,
293
304
  stop: z,
294
- clear: ie,
295
- inputRef: ae,
296
- isMobile: Ee,
305
+ clear: le,
306
+ inputRef: ce,
307
+ isMobile: ke,
297
308
  // Additional state for attachments and workflow
298
- messageAttachments: we,
309
+ messageAttachments: Ae,
299
310
  setMessageAttachments: A,
300
- selectedWorkflow: Ae,
311
+ selectedWorkflow: Re,
301
312
  setSelectedWorkflow: B,
302
- isNewChat: xe,
303
- conversationId: s,
313
+ isNewChat: Ee,
314
+ conversationId: t,
304
315
  restoreSession: x,
305
- loadAndRestoreSession: _e,
306
- isSessionLoading: Se,
316
+ loadAndRestoreSession: Fe,
317
+ isSessionLoading: Ie,
307
318
  sessionToken: T,
308
- refreshSession: O,
319
+ refreshSession: _,
309
320
  getCaptchaHeader: b,
310
321
  invalidateCaptcha: c
311
322
  };
312
323
  };
313
324
  export {
314
- pe as DEFAULT_ERROR_MESSAGE,
315
- vt as useInkeepChat
325
+ me as DEFAULT_ERROR_MESSAGE,
326
+ bt as useInkeepChat
316
327
  };
@@ -1 +1 @@
1
- "use client";"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const E=require("react/jsx-runtime"),t=require("react"),l=require("./config-provider.cjs"),a=t.createContext(void 0),p=({children:e})=>{const{baseSettings:s,componentType:n}=l.useInkeepConfig(),{tags:o,analyticsProperties:r}=s,i=t.useMemo(()=>({widgetLibraryVersion:"0.15.18",componentType:n,tags:o}),[n,o]),u={logEvent:t.useCallback(async c=>{const v={...i,...c.properties,...r},d={eventName:c.eventName,properties:v};return s.onEvent?.(d)},[s,i,r])};return E.jsx(a.Provider,{value:u,children:e})},g=()=>{const e=t.useContext(a);if(!e)throw new Error("useBaseEvents must be used within a BaseEventsProvider");return e};exports.BaseEventsProvider=p;exports.useBaseEvents=g;
1
+ "use client";"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const E=require("react/jsx-runtime"),t=require("react"),l=require("./config-provider.cjs"),a=t.createContext(void 0),p=({children:e})=>{const{baseSettings:s,componentType:n}=l.useInkeepConfig(),{tags:o,analyticsProperties:r}=s,i=t.useMemo(()=>({widgetLibraryVersion:"0.15.19",componentType:n,tags:o}),[n,o]),u={logEvent:t.useCallback(async c=>{const v={...i,...c.properties,...r},d={eventName:c.eventName,properties:v};return s.onEvent?.(d)},[s,i,r])};return E.jsx(a.Provider,{value:u,children:e})},g=()=>{const e=t.useContext(a);if(!e)throw new Error("useBaseEvents must be used within a BaseEventsProvider");return e};exports.BaseEventsProvider=p;exports.useBaseEvents=g;
@@ -5,7 +5,7 @@ import { useInkeepConfig as g } from "./config-provider.js";
5
5
  const a = d(void 0), P = ({ children: e }) => {
6
6
  const { baseSettings: t, componentType: o } = g(), { tags: s, analyticsProperties: n } = t, r = u(
7
7
  () => ({
8
- widgetLibraryVersion: "0.15.18",
8
+ widgetLibraryVersion: "0.15.19",
9
9
  componentType: o,
10
10
  tags: s
11
11
  }),
@@ -43,7 +43,7 @@ type ExtendPropertiesWithCommon<T> = T extends {
43
43
  export type InkeepEventWithCommon = ExtendPropertiesWithCommon<InkeepEvent>;
44
44
  export type InkeepCallbackEvent = InkeepEventWithCommon;
45
45
  export type SearchEvent = SearchQueryResponseReceivedEvent | SearchQuerySubmittedEvent | SearchResultClickedEvent;
46
- export type ChatEvent = AssistantMessageReceivedEvent | AssistantAnswerDisplayedEvent | UserMessageSubmittedEvent | UserEscalationIndicatedEvent | SharedChatLoadedEvent | AssistantPositiveFeedbackSubmittedEvent | AssistantNegativeFeedbackSubmittedEvent | ChatClearButtonClickedEvent | AssistantMessageCopiedEvent | GetHelpOptionClickedEvent | ChatShareButtonClickedEvent | AssistantSourceItemClickedEvent | AssistantMessageLinkOpenedEvent | AssistantCodeBlockCopiedEvent | ChatErrorEvent;
46
+ export type ChatEvent = AssistantMessageReceivedEvent | AssistantAnswerDisplayedEvent | UserMessageSubmittedEvent | UserEscalationIndicatedEvent | SharedChatLoadedEvent | AssistantPositiveFeedbackSubmittedEvent | AssistantNegativeFeedbackSubmittedEvent | ChatClearButtonClickedEvent | ChatConversationChangedEvent | AssistantMessageCopiedEvent | GetHelpOptionClickedEvent | ChatShareButtonClickedEvent | AssistantSourceItemClickedEvent | AssistantMessageLinkOpenedEvent | AssistantCodeBlockCopiedEvent | ChatErrorEvent;
47
47
  export type WidgetEvent = ModalOpenedEvent | ModalClosedEvent | ChatBubbleOpenedEvent | ChatBubbleClosedEvent;
48
48
  export type InkeepEvent = SearchEvent | ChatEvent | WidgetEvent;
49
49
  export interface AssistantMessageReceivedEvent {
@@ -104,6 +104,13 @@ export interface ChatClearButtonClickedEvent {
104
104
  conversationId: string;
105
105
  };
106
106
  }
107
+ export interface ChatConversationChangedEvent {
108
+ eventName: 'chat_conversation_changed';
109
+ properties: {
110
+ conversationId: string;
111
+ previousConversationId: string;
112
+ };
113
+ }
107
114
  export interface ChatShareButtonClickedEvent {
108
115
  eventName: 'chat_share_button_clicked';
109
116
  properties: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@inkeep/agents-ui",
3
- "version": "0.15.18",
3
+ "version": "0.15.19",
4
4
  "description": "",
5
5
  "homepage": "",
6
6
  "repository": {