@inkeep/agents-ui 0.15.17 → 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 Ne=require("@ai-sdk/react"),Oe=require("ai"),t=require("react"),Pe=require("../modal/modal-provider.cjs"),_e=require("../../providers/chat-bubble-provider.cjs"),Fe=require("../../providers/sidebar-chat-provider.cjs"),Be=require("../../providers/config-provider.cjs"),De=require("./use-captcha.cjs"),Ue=require("../../hooks/use-media-query.cjs"),Le=require("../../hooks/use-anonymous-session.cjs"),He=require("../../hooks/use-conversation-loader.cjs"),H=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(f){const l=f.message??"";let r=Number(f.code)||Number(f.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:f,aiChatSettings:l}=Be.useInkeepConfig(),[r="",d]=Ke.useControllableState({prop:l.conversationId,defaultProp:l.conversationId??""}),ce=Pe.useModal(),ue=_e.useOptionalChatBubble(),le=Fe.useOptionalSidebarChat(),{logEvent:h}=$e.useBaseEvents(),{setConversationId:de,emitToParent:C}=je.useStreamingEvents(),[v,k]=t.useState(""),pe=e=>k(e.target.value),{shouldBypassCaptcha:z,filters:W,privacyPreferences:fe}=f,{onInputMessageChange:ge,filters:K,baseUrl:S,agentUrl:me,context:j,headers:G,appId:y,apiKey:p}=l,he=ce?.isOpen??ue?.isOpen??le?.isOpen??!0,{getCaptchaHeader:b,invalidate:u}=De.useCaptcha({baseUrl:S,shouldBypassCaptcha:z||!!p,shouldMakeInitialRequest:he}),J=t.useRef(b);J.current=b;const Q=me||`${S}/run/api/chat`,{sessionToken:q,refreshSession:w}=Le.useAnonymousSession({baseUrl:S,appId:y,getCaptchaHeader:b,invalidateCaptcha:u,optOutAllAnalytics:fe?.optOutAllAnalytics}),{loadConversation:V}=He.useConversationLoader({baseUrl:S,appId:y,authToken:p??q,getCaptchaHeader:b,invalidateCaptcha:u,refreshSession:p?void 0:w}),[ve,Z]=t.useState(!1),R=t.useRef(null);R.current=q;const g=t.useRef(0),X=t.useRef(null),x=t.useRef(null),Y=t.useRef(G);Y.current=G;const T=t.useRef(void 0);T.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 ${f.organizationDisplayName??"Administrator"}`;default:return $}},[be,I]=t.useState([]),[Ce,N]=t.useState(null),Se=t.useMemo(()=>new Oe.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}`}:{},...T.current?{"inkeep-filters":T.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:P,status:ee,setMessages:m,stop:te,error:_}=Ne.useChat({transport:Se,onData(e){C(e.type,e.data)},async onFinish(){C("completion",{conversationId:r}),await h({eventName:"assistant_message_received",properties:{conversationId:r}}),h({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&&g.current<1){g.current++;const i=x.current,a=X.current;(async()=>{if(s==="session"){const o=await w();o&&(R.current=o)}else u();if(i){P(i);return}a&&(m(o=>{let n=[...o];return n.at(-1)?.role==="assistant"&&(n=n.slice(0,-1)),n.at(-1)?.role==="user"&&(n=n.slice(0,-1)),n}),O({text:a.content},{body:a.body}))})().catch(()=>{g.current=0,u(),m(o=>{const n=[...o],L=n[n.length-1];if(!L)return n;const ie=$;return L.role==="user"?n.push({id:H.generateUid(16),role:"assistant",parts:[{type:"text",text:ie}]}):L.parts=[{type:"text",text:ie}],n})});return}g.current=0,s!==null&&u(),h({eventName:"chat_error",properties:{conversationId:r,error:e.message}}),m(i=>{const a=[...i],c=a[a.length-1];if(c){const o=ye(e);c.role==="user"?a.push({id:H.generateUid(16),role:"assistant",parts:[{type:"text",text:o}]}):c.parts=[{type:"text",text:o}]}return a})}}),se=ee==="submitted",F=ee==="streaming",Re=t.useMemo(()=>{const e=c=>{if(!c||typeof c!="object")return!1;const o=c;return typeof o.type=="string"&&o.type.startsWith("tool-")},i=[...A??[]].reverse().find(c=>c.role==="assistant");if(!i)return!1;const a=i.parts?.at(-1);return!(!e(a)||a.state!=="output-available"||!a.approval?.id||F)},[A,F]),re=F||Re,ne=se||re,Ie=A.length===0,B=!v.trim()||ne,Ae=Ue.useMediaQuery("(max-width: 768px)"),[Ee,E]=t.useState(null);t.useEffect(()=>{_&&E(_)},[_]);const Me=()=>E(null),ae=t.useRef(null);t.useEffect(()=>{ge?.(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(""),g.current=0,x.current=null,await h({eventName:"user_message_submitted",properties:{conversationId:r}});let s=r;s||(s=`conv_${H.generateUid(16)}`,d(s)),de(s),X.current={content:e,body:{conversationId:s}},O({text:e},{body:{conversationId:s}})},qe=t.useCallback(e=>{g.current=0,x.current=e,P(e)},[P]),U=t.useCallback(()=>{te().then(()=>{C("aborted",{conversationId:r})})},[te,r,C]),oe=()=>{Me(),m([]),d(""),I([]),N(null),u(),h({eventName:"chat_clear_button_clicked",properties:{conversationId:r}})},M=t.useCallback((e,s)=>{E(null),m(s),d(e),I([]),N(null),u()},[m,d,u]),we=t.useCallback(async(e,s)=>{U(),M(e,[]),Z(!0);try{const i=await V(e,s);i!==null&&M(e,i)}finally{s?.aborted||Z(!1)}},[M,V,U]),{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:qe,isLoading:se,isStreaming:re,isBusy:ne,error:Ee,setError:E,isSubmitDisabled:B,input:v,handleInputChange:pe,handleInputKeyDown:ke,handleSubmit:D,stop:U,clear:oe,inputRef:ae,isMobile:Ae,messageAttachments:be,setMessageAttachments:I,selectedWorkflow:Ce,setSelectedWorkflow:N,isNewChat:Ie,conversationId:r,restoreSession:M,loadAndRestoreSession:we,isSessionLoading:ve,sessionToken:q,refreshSession:w,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 x, 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";
13
- import { generateUid as W } 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))
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
+ import { generateUid as k } from "../../utils/generate-uid.js";
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, k] = C(""), he = (e) => k(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: N, refreshSession: T } = 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 ?? N,
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 : T
66
- }), [Se, X] = C(!1), A = l(null);
67
- A.current = N;
68
- const f = l(0), Y = l(null), O = l(null), ee = l(G);
69
- ee.current = G;
70
- const _ = l(void 0);
71
- _.current = K || J ? JSON.stringify({ ...K, ...J }) : void 0;
72
- const Ie = (e) => {
76
+ refreshSession: d ? void 0 : _
77
+ }), [Ie, ee] = C(!1), w = l(null);
78
+ w.current = T;
79
+ const g = l(0), te = l(null), O = l(null), se = l(V);
80
+ se.current = V;
81
+ const F = l(void 0);
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
- }, [Ae, R] = C([]), [Re, F] = C(null), we = 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 } : {},
88
- ...A.current ? { Authorization: `Bearer ${A.current}` } : {},
89
- ...m ? { Authorization: `Bearer ${m}` } : {},
90
- ..._.current ? { "inkeep-filters": _.current } : {},
91
- ...ee.current
98
+ ...y ? { "x-inkeep-app-id": y } : {},
99
+ ...w.current ? { Authorization: `Bearer ${w.current}` } : {},
100
+ ...d ? { Authorization: `Bearer ${d}` } : {},
101
+ ...F.current ? { "inkeep-filters": F.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,211 +113,215 @@ 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: w,
116
- sendMessage: B,
117
- addToolApprovalResponse: D,
118
- status: te,
119
- setMessages: g,
120
- stop: se,
121
- error: P
122
- } = De({
123
- transport: we,
126
+ messages: R,
127
+ sendMessage: D,
128
+ addToolApprovalResponse: P,
129
+ status: re,
130
+ setMessages: h,
131
+ stop: ne,
132
+ error: H
133
+ } = Pe({
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 a = O.current, n = 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 o = await T();
149
- o && (A.current = o);
158
+ if (s === "session") {
159
+ const i = await _();
160
+ i && (w.current = i);
150
161
  } else
151
162
  c();
152
- if (a) {
153
- D(a);
163
+ if (n) {
164
+ P(n);
154
165
  return;
155
166
  }
156
- n && (g((o) => {
157
- let r = [...o];
158
- return r.at(-1)?.role === "assistant" && (r = r.slice(0, -1)), r.at(-1)?.role === "user" && (r = r.slice(0, -1)), r;
159
- }), B({ text: n.content }, { body: n.body }));
167
+ r && (h((i) => {
168
+ let a = [...i];
169
+ return a.at(-1)?.role === "assistant" && (a = a.slice(0, -1)), a.at(-1)?.role === "user" && (a = a.slice(0, -1)), a;
170
+ }), D({ text: r.content }, { body: r.body }));
160
171
  })().catch(() => {
161
- f.current = 0, c(), g((o) => {
162
- const r = [...o], z = r[r.length - 1];
163
- if (!z) return r;
164
- const ce = pe;
165
- return z.role === "user" ? r.push({
166
- id: W(16),
172
+ g.current = 0, c(), h((i) => {
173
+ const a = [...i], W = a[a.length - 1];
174
+ if (!W) return a;
175
+ const ue = me;
176
+ return W.role === "user" ? a.push({
177
+ id: k(16),
167
178
  role: "assistant",
168
- parts: [{ type: "text", text: ce }]
169
- }) : z.parts = [{ type: "text", text: ce }], r;
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((a) => {
181
- const n = [...a], i = n[n.length - 1];
182
- if (i) {
183
- const o = Ie(e);
184
- i.role === "user" ? n.push({
185
- id: W(16),
191
+ }), h((n) => {
192
+ const r = [...n], o = r[r.length - 1];
193
+ if (o) {
194
+ const i = we(e);
195
+ o.role === "user" ? r.push({
196
+ id: k(16),
186
197
  role: "assistant",
187
- parts: [{ type: "text", text: o }]
188
- }) : i.parts = [{ type: "text", text: o }];
198
+ parts: [{ type: "text", text: i }]
199
+ }) : o.parts = [{ type: "text", text: i }];
189
200
  }
190
- return n;
201
+ return r;
191
202
  });
192
203
  }
193
- }), re = te === "submitted", H = te === "streaming", Me = le(() => {
194
- const e = (i) => {
195
- if (!i || typeof i != "object") return !1;
196
- const o = i;
197
- return typeof o.type == "string" && o.type.startsWith("tool-");
198
- }, a = [...w ?? []].reverse().find((i) => i.role === "assistant");
199
- if (!a) return !1;
200
- const n = a.parts?.at(-1);
201
- return !(!e(n) || n.state !== "output-available" || !n.approval?.id || H);
202
- }, [w, H]), ne = H || Me, oe = re || ne, Ee = w.length === 0, L = !y.trim() || oe, xe = qe("(max-width: 768px)"), [ke, M] = C(null);
203
- ue(() => {
204
- P && M(P);
205
- }, [P]);
206
- const Ne = () => M(null), ae = l(null);
207
- ue(() => {
208
- ve?.(y);
209
- }, [y]);
210
- const Te = (e) => {
211
- e.key === "Enter" && !e.shiftKey && !L && !e.nativeEvent.isComposing && (e.preventDefault(), U());
212
- }, U = async (e = y) => {
213
- if (L && (!e || e.trim().length === 0)) return;
214
- R([]), k(""), f.current = 0, O.current = null, await h({
204
+ }), oe = re === "submitted", L = re === "streaming", xe = pe(() => {
205
+ const e = (o) => {
206
+ if (!o || typeof o != "object") return !1;
207
+ const i = o;
208
+ return typeof i.type == "string" && i.type.startsWith("tool-");
209
+ }, n = [...R ?? []].reverse().find((o) => o.role === "assistant");
210
+ if (!n) return !1;
211
+ const r = n.parts?.at(-1);
212
+ return !(!e(r) || r.state !== "output-available" || !r.approval?.id || L);
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);
216
+ }, [H]);
217
+ const Te = () => M(null), ce = l(null);
218
+ q(() => {
219
+ be?.(v);
220
+ }, [v]);
221
+ const _e = (e) => {
222
+ e.key === "Enter" && !e.shiftKey && !U && !e.nativeEvent.isComposing && (e.preventDefault(), $());
223
+ }, $ = async (e = v) => {
224
+ if (U && (!e || e.trim().length === 0)) return;
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_${W(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 }
224
- }, B(
234
+ body: { conversationId: s }
235
+ }, D(
225
236
  { text: e },
226
237
  {
227
- body: { conversationId: t }
238
+ body: { conversationId: s }
228
239
  }
229
240
  );
230
- }, Oe = x(
241
+ }, Oe = E(
231
242
  (e) => {
232
- f.current = 0, O.current = e, D(e);
243
+ g.current = 0, O.current = e, P(e);
233
244
  },
234
- [D]
235
- ), $ = x(() => {
236
- se().then(() => {
237
- S("aborted", { conversationId: s });
245
+ [P]
246
+ ), z = E(() => {
247
+ ne().then(() => {
248
+ S("aborted", { conversationId: t });
238
249
  });
239
- }, [se, s, S]), ie = () => {
240
- Ne(), g([]), p(""), R([]), F(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
- }, E = x(
247
- (e, t) => {
248
- M(null), g(t), p(e), R([]), F(null), c();
257
+ }, x = E(
258
+ (e, s) => {
259
+ M(null), h(s), p(e), A([]), B(null), c();
249
260
  },
250
- [g, p, c]
251
- ), _e = x(
252
- async (e, t) => {
253
- $(), E(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 a = await Z(e, t);
256
- a !== null && E(e, a);
266
+ const n = await Y(e, s), r = n?.[n.length - 1], o = n !== null && r?.role === "user" ? [...n, {
267
+ id: k(16),
268
+ role: "assistant",
269
+ parts: [{ type: "text", text: "This session was interrupted. Please check back in a few minutes or start a new conversation." }]
270
+ }] : n;
271
+ o !== null && x(e, o);
257
272
  } finally {
258
- t?.aborted || X(!1);
273
+ s?.aborted || ee(!1);
259
274
  }
260
275
  },
261
- [E, Z, $]
262
- ), { openForm: Fe } = Ge(), Be = Qe();
263
- return He(u.chatFunctionsRef, () => ({
264
- submitMessage: U,
276
+ [x, Y, z]
277
+ ), { openForm: Be } = Qe(), De = Ve();
278
+ return Le(u.chatFunctionsRef, () => ({
279
+ submitMessage: $,
265
280
  updateInputMessage(e) {
266
- k(e);
281
+ N(e);
267
282
  },
268
- clearChat: ie,
283
+ clearChat: le,
269
284
  openForm: (e) => {
270
- Be?.setView("chat"), Fe(e, void 0);
285
+ De?.setView("chat"), Be(e, void 0);
271
286
  },
272
287
  focusInput: () => {
273
- ae.current?.focus();
288
+ ce.current?.focus();
274
289
  }
275
290
  })), {
276
- messages: w,
277
- sendMessage: B,
291
+ messages: R,
292
+ sendMessage: D,
278
293
  addToolApprovalResponse: Oe,
279
- isLoading: re,
280
- isStreaming: ne,
281
- isBusy: oe,
282
- error: ke,
294
+ isLoading: oe,
295
+ isStreaming: ae,
296
+ isBusy: ie,
297
+ error: Ne,
283
298
  setError: M,
284
- isSubmitDisabled: L,
285
- input: y,
286
- handleInputChange: he,
287
- handleInputKeyDown: Te,
288
- handleSubmit: U,
289
- stop: $,
290
- clear: ie,
291
- inputRef: ae,
292
- isMobile: xe,
299
+ isSubmitDisabled: U,
300
+ input: v,
301
+ handleInputChange: ve,
302
+ handleInputKeyDown: _e,
303
+ handleSubmit: $,
304
+ stop: z,
305
+ clear: le,
306
+ inputRef: ce,
307
+ isMobile: ke,
293
308
  // Additional state for attachments and workflow
294
309
  messageAttachments: Ae,
295
- setMessageAttachments: R,
310
+ setMessageAttachments: A,
296
311
  selectedWorkflow: Re,
297
- setSelectedWorkflow: F,
312
+ setSelectedWorkflow: B,
298
313
  isNewChat: Ee,
299
- conversationId: s,
300
- restoreSession: E,
301
- loadAndRestoreSession: _e,
302
- isSessionLoading: Se,
303
- sessionToken: N,
304
- refreshSession: T,
314
+ conversationId: t,
315
+ restoreSession: x,
316
+ loadAndRestoreSession: Fe,
317
+ isSessionLoading: Ie,
318
+ sessionToken: T,
319
+ refreshSession: _,
305
320
  getCaptchaHeader: b,
306
321
  invalidateCaptcha: c
307
322
  };
308
323
  };
309
324
  export {
310
- pe as DEFAULT_ERROR_MESSAGE,
311
- vt as useInkeepChat
325
+ me as DEFAULT_ERROR_MESSAGE,
326
+ bt as useInkeepChat
312
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.17",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.17",
8
+ widgetLibraryVersion: "0.15.19",
9
9
  componentType: o,
10
10
  tags: s
11
11
  }),
@@ -1 +1 @@
1
- "use client";"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const X=require("react/jsx-runtime"),e=require("react"),Y=require("../components/embedded-chat/chat-provider.cjs"),N=require("./config-provider.cjs"),ee=require("../hooks/use-inkeep-api-client.cjs"),F=e.createContext(void 0),D=25;function te(t){const{stop:a,clear:c,conversationId:u,isStreaming:H,loadAndRestoreSession:P,sessionToken:f,refreshSession:W,getCaptchaHeader:G,invalidateCaptcha:K}=Y.useChat(),{aiChatSettings:U}=N.useInkeepConfig(),{baseUrl:h,appId:k,apiKey:Z}=U,o=!Z&&!!k,C=f,{fetchWithAuth:I}=ee.useInkeepApiClient({appId:k,authToken:C,getCaptchaHeader:G,invalidateCaptcha:K,refreshSession:W}),[p,S]=e.useState(!1),[R,E]=e.useState([]),[g,x]=e.useState(!1),[m,_]=e.useState(0),[v,z]=e.useState(!1),b=e.useRef(!1),q=e.useRef(null),j=e.useRef([]);j.current=R;const M=e.useRef(I);M.current=I;const i=e.useCallback(async(s,n=!1)=>{if(!(!h||!C||!o)){n||x(!0);try{const w=`${h}/run/v1/conversations?page=${s+1}&limit=${D}`,y=await M.current(w);if(!y.ok)throw new Error(`Failed to fetch conversations: ${y.status}`);const L=await y.json(),d=(L.data??[]).map(r=>({id:r.id,title:r.title??"",createdAt:new Date(r.createdAt),updatedAt:new Date(r.updatedAt)}));E(r=>{if(s===0&&!n)return d;if(s===0&&n){const l=new Set(d.map(A=>A.id));return[...d,...r.slice(D).filter(A=>!l.has(A.id))]}const V=new Set(r.map(l=>l.id));return[...r,...d.filter(l=>!V.has(l.id))]});const{page:O,pages:T}=L.pagination??{};z(O!=null&&T!=null?O<T:!1),n||_(s)}catch(w){console.error("[useChatHistory] Failed to load conversations:",w)}finally{x(!1)}}},[h,C,o]);e.useEffect(()=>{!p||!f||!o||(t==="stack"?(E([]),i(0)):b.current||(b.current=!0,i(0)))},[p,f,o,t,i]);const $=e.useRef("");e.useEffect(()=>{o&&t==="sidepane"&&(!u||!H||b.current&&$.current!==u&&(j.current.some(s=>s.id===u)||($.current=u,i(0,!0))))},[u,o,t,i,H]);const B=e.useCallback(()=>{!g&&v&&i(m+1)},[g,v,m,i]),J=e.useCallback(()=>{a(),c(),t!=="sidepane"&&S(!1)},[t,a,c]),Q=e.useCallback(async s=>{q.current?.abort();const n=new AbortController;q.current=n,await P(s,n.signal),!n.signal.aborted&&t!=="sidepane"&&S(!1)},[t,P]);return{isEnabled:o,isOpen:p,setIsOpen:S,sessions:R,isLoading:g,hasMore:v,loadMore:B,startNewConversation:J,loadSession:Q}}const se=({layout:t,children:a})=>{const c=te(t);return X.jsx(F.Provider,{value:c,children:typeof a=="function"?a(c):a})},ne=()=>{const t=e.useContext(F);if(!t)throw new Error("useChatHistory must be used within a ChatHistoryProvider");return t};exports.ChatHistoryProvider=se;exports.useChatHistory=ne;
1
+ "use client";"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const X=require("react/jsx-runtime"),e=require("react"),Y=require("../components/embedded-chat/chat-provider.cjs"),N=require("./config-provider.cjs"),ee=require("../hooks/use-inkeep-api-client.cjs"),D=e.createContext(void 0),T=25;function te(t){const{stop:a,clear:c,conversationId:u,isStreaming:H,loadAndRestoreSession:P,sessionToken:f,refreshSession:F,getCaptchaHeader:W,invalidateCaptcha:G}=Y.useChat(),{aiChatSettings:K}=N.useInkeepConfig(),{baseUrl:h,appId:k,apiKey:U}=K,o=!U&&!!k,C=f,{fetchWithAuth:I}=ee.useInkeepApiClient({appId:k,authToken:C,getCaptchaHeader:W,invalidateCaptcha:G,refreshSession:F}),[p,S]=e.useState(!1),[R,Z]=e.useState([]),[g,E]=e.useState(!1),[x,_]=e.useState(0),[v,z]=e.useState(!1),b=e.useRef(!1),m=e.useRef(null),q=e.useRef([]);q.current=R;const j=e.useRef(I);j.current=I;const i=e.useCallback(async(s,n=!1)=>{if(!(!h||!C||!o)){n||E(!0);try{const w=`${h}/run/v1/conversations?page=${s+1}&limit=${T}`,y=await j.current(w);if(!y.ok)throw new Error(`Failed to fetch conversations: ${y.status}`);const $=await y.json(),d=($.data??[]).map(r=>({id:r.id,title:r.title??"",createdAt:new Date(r.createdAt),updatedAt:new Date(r.updatedAt)}));Z(r=>{if(s===0&&!n)return d;if(s===0&&n){const l=new Set(d.map(A=>A.id));return[...d,...r.slice(T).filter(A=>!l.has(A.id))]}const V=new Set(r.map(l=>l.id));return[...r,...d.filter(l=>!V.has(l.id))]});const{page:L,pages:O}=$.pagination??{};z(L!=null&&O!=null?L<O:!1),n||_(s)}catch(w){console.error("[useChatHistory] Failed to load conversations:",w)}finally{E(!1)}}},[h,C,o]);e.useEffect(()=>{!p||!f||!o||(t==="stack"?i(0):b.current||(b.current=!0,i(0)))},[p,f,o,t,i]);const M=e.useRef("");e.useEffect(()=>{o&&t==="sidepane"&&(!u||!H||b.current&&M.current!==u&&(q.current.some(s=>s.id===u)||(M.current=u,i(0,!0))))},[u,o,t,i,H]);const B=e.useCallback(()=>{!g&&v&&i(x+1)},[g,v,x,i]),J=e.useCallback(()=>{a(),c(),t!=="sidepane"&&S(!1)},[t,a,c]),Q=e.useCallback(async s=>{m.current?.abort();const n=new AbortController;m.current=n,await P(s,n.signal),!n.signal.aborted&&t!=="sidepane"&&S(!1)},[t,P]);return{isEnabled:o,isOpen:p,setIsOpen:S,sessions:R,isLoading:g,hasMore:v,loadMore:B,startNewConversation:J,loadSession:Q}}const se=({layout:t,children:a})=>{const c=te(t);return X.jsx(D.Provider,{value:c,children:typeof a=="function"?a(c):a})},ne=()=>{const t=e.useContext(D);if(!t)throw new Error("useChatHistory must be used within a ChatHistoryProvider");return t};exports.ChatHistoryProvider=se;exports.useChatHistory=ne;
@@ -1,10 +1,10 @@
1
1
  "use client";
2
2
  import { jsx as tt } from "react/jsx-runtime";
3
- import { createContext as et, useContext as st, useState as f, useRef as d, useCallback as h, useEffect as G } from "react";
3
+ import { createContext as et, useContext as st, useState as f, useRef as d, useCallback as h, useEffect as W } from "react";
4
4
  import { useChat as nt } from "../components/embedded-chat/chat-provider.js";
5
5
  import { useInkeepConfig as rt } from "./config-provider.js";
6
6
  import { useInkeepApiClient as ot } from "../hooks/use-inkeep-api-client.js";
7
- const U = et(void 0), K = 25;
7
+ const K = et(void 0), G = 25;
8
8
  function it(t) {
9
9
  const {
10
10
  stop: i,
@@ -13,68 +13,68 @@ function it(t) {
13
13
  isStreaming: y,
14
14
  loadAndRestoreSession: P,
15
15
  sessionToken: p,
16
- refreshSession: Z,
17
- getCaptchaHeader: _,
18
- invalidateCaptcha: q
19
- } = nt(), { aiChatSettings: z } = rt(), { baseUrl: C, appId: k, apiKey: B } = z, r = !B && !!k, g = p, { fetchWithAuth: x } = ot({
16
+ refreshSession: U,
17
+ getCaptchaHeader: Z,
18
+ invalidateCaptcha: _
19
+ } = nt(), { aiChatSettings: q } = rt(), { baseUrl: C, appId: k, apiKey: z } = q, r = !z && !!k, g = p, { fetchWithAuth: x } = ot({
20
20
  appId: k,
21
21
  authToken: g,
22
- getCaptchaHeader: _,
23
- invalidateCaptcha: q,
24
- refreshSession: Z
25
- }), [w, m] = f(!1), [E, $] = f([]), [S, L] = f(!1), [M, J] = f(0), [v, Q] = f(!1), A = d(!1), R = d(null), j = d([]);
26
- j.current = E;
27
- const D = d(x);
28
- D.current = x;
22
+ getCaptchaHeader: Z,
23
+ invalidateCaptcha: _,
24
+ refreshSession: U
25
+ }), [w, m] = f(!1), [E, B] = f([]), [S, $] = f(!1), [L, J] = f(0), [v, Q] = f(!1), A = d(!1), M = d(null), R = d([]);
26
+ R.current = E;
27
+ const j = d(x);
28
+ j.current = x;
29
29
  const o = h(
30
30
  async (e, s = !1) => {
31
31
  if (!(!C || !g || !r)) {
32
- s || L(!0);
32
+ s || $(!0);
33
33
  try {
34
- const b = `${C}/run/v1/conversations?page=${e + 1}&limit=${K}`, H = await D.current(b);
34
+ const b = `${C}/run/v1/conversations?page=${e + 1}&limit=${G}`, H = await j.current(b);
35
35
  if (!H.ok) throw new Error(`Failed to fetch conversations: ${H.status}`);
36
- const O = await H.json(), l = (O.data ?? []).map((n) => ({
36
+ const F = await H.json(), l = (F.data ?? []).map((n) => ({
37
37
  id: n.id,
38
38
  title: n.title ?? "",
39
39
  createdAt: new Date(n.createdAt),
40
40
  updatedAt: new Date(n.updatedAt)
41
41
  }));
42
- $((n) => {
42
+ B((n) => {
43
43
  if (e === 0 && !s) return l;
44
44
  if (e === 0 && s) {
45
45
  const u = new Set(l.map((I) => I.id));
46
- return [...l, ...n.slice(K).filter((I) => !u.has(I.id))];
46
+ return [...l, ...n.slice(G).filter((I) => !u.has(I.id))];
47
47
  }
48
48
  const N = new Set(n.map((u) => u.id));
49
49
  return [...n, ...l.filter((u) => !N.has(u.id))];
50
50
  });
51
- const { page: T, pages: W } = O.pagination ?? {};
52
- Q(T != null && W != null ? T < W : !1), s || J(e);
51
+ const { page: O, pages: T } = F.pagination ?? {};
52
+ Q(O != null && T != null ? O < T : !1), s || J(e);
53
53
  } catch (b) {
54
54
  console.error("[useChatHistory] Failed to load conversations:", b);
55
55
  } finally {
56
- L(!1);
56
+ $(!1);
57
57
  }
58
58
  }
59
59
  },
60
60
  [C, g, r]
61
61
  );
62
- G(() => {
63
- !w || !p || !r || (t === "stack" ? ($([]), o(0)) : A.current || (A.current = !0, o(0)));
62
+ W(() => {
63
+ !w || !p || !r || (t === "stack" ? o(0) : A.current || (A.current = !0, o(0)));
64
64
  }, [w, p, r, t, o]);
65
- const F = d("");
66
- G(() => {
67
- r && t === "sidepane" && (!c || !y || A.current && F.current !== c && (j.current.some((e) => e.id === c) || (F.current = c, o(0, !0))));
65
+ const D = d("");
66
+ W(() => {
67
+ r && t === "sidepane" && (!c || !y || A.current && D.current !== c && (R.current.some((e) => e.id === c) || (D.current = c, o(0, !0))));
68
68
  }, [c, r, t, o, y]);
69
69
  const V = h(() => {
70
- !S && v && o(M + 1);
71
- }, [S, v, M, o]), X = h(() => {
70
+ !S && v && o(L + 1);
71
+ }, [S, v, L, o]), X = h(() => {
72
72
  i(), a(), t !== "sidepane" && m(!1);
73
73
  }, [t, i, a]), Y = h(
74
74
  async (e) => {
75
- R.current?.abort();
75
+ M.current?.abort();
76
76
  const s = new AbortController();
77
- R.current = s, await P(e, s.signal), !s.signal.aborted && t !== "sidepane" && m(!1);
77
+ M.current = s, await P(e, s.signal), !s.signal.aborted && t !== "sidepane" && m(!1);
78
78
  },
79
79
  [t, P]
80
80
  );
@@ -92,9 +92,9 @@ function it(t) {
92
92
  }
93
93
  const ht = ({ layout: t, children: i }) => {
94
94
  const a = it(t);
95
- return /* @__PURE__ */ tt(U.Provider, { value: a, children: typeof i == "function" ? i(a) : i });
95
+ return /* @__PURE__ */ tt(K.Provider, { value: a, children: typeof i == "function" ? i(a) : i });
96
96
  }, pt = () => {
97
- const t = st(U);
97
+ const t = st(K);
98
98
  if (!t)
99
99
  throw new Error("useChatHistory must be used within a ChatHistoryProvider");
100
100
  return t;
@@ -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.17",
3
+ "version": "0.15.19",
4
4
  "description": "",
5
5
  "homepage": "",
6
6
  "repository": {