@inkeep/agents-ui 0.15.26 → 0.15.28

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.
Files changed (102) hide show
  1. package/dist/index.cjs +1 -1
  2. package/dist/index.js +166 -174
  3. package/dist/primitives/atoms/dialog.cjs +1 -1
  4. package/dist/primitives/atoms/dialog.js +110 -106
  5. package/dist/primitives/atoms/file-upload.cjs +1 -0
  6. package/dist/primitives/atoms/file-upload.d.ts +35 -0
  7. package/dist/primitives/atoms/file-upload.js +45 -0
  8. package/dist/primitives/atoms/icons/built-in-icons.cjs +1 -1
  9. package/dist/primitives/atoms/icons/built-in-icons.d.ts +8 -1
  10. package/dist/primitives/atoms/icons/built-in-icons.js +86 -79
  11. package/dist/primitives/atoms/icons/collections/pi.cjs +1 -1
  12. package/dist/primitives/atoms/icons/collections/pi.d.ts +6 -0
  13. package/dist/primitives/atoms/icons/collections/pi.js +103 -13
  14. package/dist/primitives/atoms/icons/inkeep-default-icons.cjs +1 -1
  15. package/dist/primitives/atoms/icons/inkeep-default-icons.js +9 -1
  16. package/dist/primitives/components/embedded-chat/file-upload-input.cjs +1 -0
  17. package/dist/primitives/components/embedded-chat/file-upload-input.d.ts +68 -0
  18. package/dist/primitives/components/embedded-chat/file-upload-input.js +328 -0
  19. package/dist/primitives/components/embedded-chat/image-preview-modal.cjs +1 -0
  20. package/dist/primitives/components/embedded-chat/image-preview-modal.d.ts +15 -0
  21. package/dist/primitives/components/embedded-chat/image-preview-modal.js +71 -0
  22. package/dist/primitives/components/embedded-chat/use-inkeep-chat.cjs +3 -3
  23. package/dist/primitives/components/embedded-chat/use-inkeep-chat.d.ts +8 -6
  24. package/dist/primitives/components/embedded-chat/use-inkeep-chat.js +277 -227
  25. package/dist/primitives/components/embedded-chat.cjs +4 -4
  26. package/dist/primitives/components/embedded-chat.d.ts +7 -116
  27. package/dist/primitives/components/embedded-chat.js +1082 -1484
  28. package/dist/primitives/components/embedded-search.d.ts +1 -1
  29. package/dist/primitives/hooks/index.cjs +1 -1
  30. package/dist/primitives/hooks/index.js +15 -14
  31. package/dist/primitives/hooks/use-initial-conversation.cjs +1 -0
  32. package/dist/primitives/hooks/use-initial-conversation.d.ts +16 -0
  33. package/dist/primitives/hooks/use-initial-conversation.js +31 -0
  34. package/dist/primitives/hooks/use-input-notification.cjs +1 -0
  35. package/dist/primitives/hooks/use-input-notification.d.ts +9 -0
  36. package/dist/primitives/hooks/use-input-notification.js +18 -0
  37. package/dist/primitives/hooks/use-scrolling-fades.cjs +1 -1
  38. package/dist/primitives/hooks/use-scrolling-fades.d.ts +1 -0
  39. package/dist/primitives/hooks/use-scrolling-fades.js +21 -5
  40. package/dist/primitives/index.cjs +1 -1
  41. package/dist/primitives/index.js +146 -154
  42. package/dist/primitives/providers/base-events-provider.cjs +1 -1
  43. package/dist/primitives/providers/base-events-provider.js +1 -1
  44. package/dist/primitives/providers/feedback-provider.cjs +1 -1
  45. package/dist/primitives/providers/feedback-provider.js +37 -38
  46. package/dist/primitives/providers/image-preview-provider.cjs +1 -0
  47. package/dist/primitives/providers/image-preview-provider.d.ts +15 -0
  48. package/dist/primitives/providers/image-preview-provider.js +23 -0
  49. package/dist/primitives/providers/index.cjs +1 -1
  50. package/dist/primitives/providers/index.d.ts +0 -3
  51. package/dist/primitives/providers/index.js +54 -63
  52. package/dist/primitives/utils/component-ids.cjs +1 -1
  53. package/dist/primitives/utils/component-ids.d.ts +54 -98
  54. package/dist/primitives/utils/component-ids.js +44 -66
  55. package/dist/primitives/utils/default-settings.cjs +1 -1
  56. package/dist/primitives/utils/default-settings.d.ts +0 -2
  57. package/dist/primitives/utils/default-settings.js +6 -8
  58. package/dist/react/embedded-chat.cjs +1 -1
  59. package/dist/react/embedded-chat.js +283 -287
  60. package/dist/react/index.cjs +1 -1
  61. package/dist/react/index.js +166 -174
  62. package/dist/styled/components/chat-history.cjs +1 -1
  63. package/dist/styled/components/chat-history.d.ts +1 -1
  64. package/dist/styled/components/chat-history.js +31 -29
  65. package/dist/styled/components/embedded-chat/file-upload-input.cjs +1 -0
  66. package/dist/styled/components/embedded-chat/file-upload-input.d.ts +20 -0
  67. package/dist/styled/components/embedded-chat/file-upload-input.js +300 -0
  68. package/dist/styled/components/embedded-chat/image-preview-modal.cjs +1 -0
  69. package/dist/styled/components/embedded-chat/image-preview-modal.d.ts +11 -0
  70. package/dist/styled/components/embedded-chat/image-preview-modal.js +77 -0
  71. package/dist/styled/components/embedded-chat.cjs +1 -1
  72. package/dist/styled/components/embedded-chat.d.ts +4 -50
  73. package/dist/styled/components/embedded-chat.js +567 -1010
  74. package/dist/styled/components/message.cjs +1 -1
  75. package/dist/styled/components/message.js +89 -88
  76. package/dist/styled/components/ui/recipes/citation.d.ts +1 -1
  77. package/dist/styled/components/ui/recipes/index.cjs +1 -1
  78. package/dist/styled/components/ui/recipes/index.d.ts +0 -1
  79. package/dist/styled/components/ui/recipes/index.js +31 -33
  80. package/dist/styled/index.cjs +1 -1
  81. package/dist/styled/index.js +154 -162
  82. package/dist/styled/inkeep.css.cjs +241 -61
  83. package/dist/styled/inkeep.css.js +241 -61
  84. package/dist/types/config/ai.d.ts +8 -10
  85. package/dist/types/icons/built-in.d.ts +1 -1
  86. package/dist/types/icons/custom.d.ts +8 -0
  87. package/dist/types/index.d.ts +0 -1
  88. package/package.json +7 -6
  89. package/dist/primitives/providers/attachment-item-provider.cjs +0 -1
  90. package/dist/primitives/providers/attachment-item-provider.d.ts +0 -9
  91. package/dist/primitives/providers/attachment-item-provider.js +0 -13
  92. package/dist/primitives/providers/attachments-bar-provider.cjs +0 -1
  93. package/dist/primitives/providers/attachments-bar-provider.d.ts +0 -30
  94. package/dist/primitives/providers/attachments-bar-provider.js +0 -57
  95. package/dist/primitives/providers/message-attachments-provider.cjs +0 -1
  96. package/dist/primitives/providers/message-attachments-provider.d.ts +0 -13
  97. package/dist/primitives/providers/message-attachments-provider.js +0 -27
  98. package/dist/primitives/utils/get-message-metadata.d.ts +0 -8
  99. package/dist/styled/components/ui/recipes/attachment.cjs +0 -1
  100. package/dist/styled/components/ui/recipes/attachment.d.ts +0 -4
  101. package/dist/styled/components/ui/recipes/attachment.js +0 -28
  102. package/dist/types/config/settings/workflow.d.ts +0 -86
@@ -0,0 +1 @@
1
+ "use client";"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("react/jsx-runtime"),t=require("../../atoms/dialog.cjs"),l=require("../../atoms/icons/custom-icon.cjs"),m=require("../../providers/image-preview-provider.cjs"),s=require("../../utils/compose-event-handlers.cjs"),a=require("../factory.cjs"),P=a.ikp(t.Root,{_id:"aiChatImagePreviewModal"}),g=i=>{const{onOpenChange:e,...d}=i,{imagePreview:o,closeImagePreview:n}=m.useImagePreview();return r.jsx(P,{open:o!==null,onOpenChange:s.composeEventHandlers(e,v=>{v||n()}),...d})},c=a.ikp(t.Overlay,{_id:"aiChatImagePreviewModal__Overlay"}),I=a.ikp(t.Content,{_id:"aiChatImagePreviewModal__Content"}),w=i=>{const{imagePreview:e}=m.useImagePreview(),{children:d,...o}=i;return r.jsxs(I,{"aria-label":e?.name??"Image preview","aria-describedby":void 0,...o,children:[r.jsx(t.Title,{className:"sr-only",children:e?.name??"Image preview"}),d]})},C=a.ikp("img",{_id:"aiChatImagePreviewModal__Image"}),h=i=>{const{imagePreview:e}=m.useImagePreview();return r.jsx(C,{src:e?.url,alt:e?.name??"Image preview",...i})},M=a.ikp("div",{_id:"aiChatImagePreviewModal__Footer"}),u=a.ikp("span",{_id:"aiChatImagePreviewModal__FileName"}),b=i=>{const{imagePreview:e}=m.useImagePreview();return r.jsx(u,{...i,children:e?.name})},_=a.ikp(t.Close,{_id:"aiChatImagePreviewModal__Close",children:r.jsx(l.CustomIcon,{iconKey:"close"})});exports.EmbeddedChatPrimitiveImagePreviewModal=g;exports.EmbeddedChatPrimitiveImagePreviewModalClose=_;exports.EmbeddedChatPrimitiveImagePreviewModalContent=w;exports.EmbeddedChatPrimitiveImagePreviewModalFileName=b;exports.EmbeddedChatPrimitiveImagePreviewModalFooter=M;exports.EmbeddedChatPrimitiveImagePreviewModalImage=h;exports.EmbeddedChatPrimitiveImagePreviewModalOverlay=c;
@@ -0,0 +1,15 @@
1
+ import { ComponentPropsWithRef, ForwardRefExoticComponent, RefAttributes, DetailedHTMLProps, ImgHTMLAttributes, HTMLAttributes } from 'react';
2
+ import { PolymorphicProps } from '..';
3
+ import * as DialogPrimitive from '../../atoms/dialog';
4
+ declare const PrimitiveImagePreviewModal: ForwardRefExoticComponent< PolymorphicProps & Omit<DialogPrimitive.DialogProps, "_id"> & Partial<Pick<DialogPrimitive.DialogProps, "_id">>>;
5
+ export declare const EmbeddedChatPrimitiveImagePreviewModal: (props: ComponentPropsWithRef<typeof PrimitiveImagePreviewModal>) => import("react/jsx-runtime").JSX.Element;
6
+ export declare const EmbeddedChatPrimitiveImagePreviewModalOverlay: ForwardRefExoticComponent< PolymorphicProps & Omit<DialogPrimitive.DialogOverlayProps & RefAttributes<HTMLDivElement>, "_id"> & Partial<Pick<DialogPrimitive.DialogOverlayProps & RefAttributes<HTMLDivElement>, "_id">>>;
7
+ declare const PrimitiveImagePreviewModalContent: ForwardRefExoticComponent< PolymorphicProps & Omit<DialogPrimitive.DialogContentProps & RefAttributes<HTMLDivElement>, "_id"> & Partial<Pick<DialogPrimitive.DialogContentProps & RefAttributes<HTMLDivElement>, "_id">>>;
8
+ export declare const EmbeddedChatPrimitiveImagePreviewModalContent: (props: ComponentPropsWithRef<typeof PrimitiveImagePreviewModalContent>) => import("react/jsx-runtime").JSX.Element;
9
+ declare const PrimitiveImagePreviewModalImage: ForwardRefExoticComponent< PolymorphicProps & Omit< DetailedHTMLProps<ImgHTMLAttributes<HTMLImageElement>, HTMLImageElement>, "_id"> & Partial<Pick< DetailedHTMLProps<ImgHTMLAttributes<HTMLImageElement>, HTMLImageElement>, "_id">>>;
10
+ export declare const EmbeddedChatPrimitiveImagePreviewModalImage: (props: ComponentPropsWithRef<typeof PrimitiveImagePreviewModalImage>) => import("react/jsx-runtime").JSX.Element;
11
+ export declare const EmbeddedChatPrimitiveImagePreviewModalFooter: ForwardRefExoticComponent< PolymorphicProps & Omit< DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "_id"> & Partial<Pick< DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "_id">>>;
12
+ declare const PrimitiveImagePreviewModalFileName: ForwardRefExoticComponent< PolymorphicProps & Omit< DetailedHTMLProps<HTMLAttributes<HTMLSpanElement>, HTMLSpanElement>, "_id"> & Partial<Pick< DetailedHTMLProps<HTMLAttributes<HTMLSpanElement>, HTMLSpanElement>, "_id">>>;
13
+ export declare const EmbeddedChatPrimitiveImagePreviewModalFileName: (props: ComponentPropsWithRef<typeof PrimitiveImagePreviewModalFileName>) => import("react/jsx-runtime").JSX.Element;
14
+ export declare const EmbeddedChatPrimitiveImagePreviewModalClose: ForwardRefExoticComponent< PolymorphicProps & Omit<DialogPrimitive.DialogCloseProps & RefAttributes<HTMLButtonElement>, "children" | "_id"> & Partial<Pick<DialogPrimitive.DialogCloseProps & RefAttributes<HTMLButtonElement>, "children" | "_id">>>;
15
+ export {};
@@ -0,0 +1,71 @@
1
+ "use client";
2
+ import { jsx as r, jsxs as l } from "react/jsx-runtime";
3
+ import { Overlay as v, Title as s, Close as P, Root as g, Content as c } from "../../atoms/dialog.js";
4
+ import { CustomIcon as w } from "../../atoms/icons/custom-icon.js";
5
+ import { useImagePreview as o } from "../../providers/image-preview-provider.js";
6
+ import { composeEventHandlers as I } from "../../utils/compose-event-handlers.js";
7
+ import { ikp as a } from "../factory.js";
8
+ const C = a(g, {
9
+ _id: "aiChatImagePreviewModal"
10
+ }), F = (i) => {
11
+ const { onOpenChange: e, ...m } = i, { imagePreview: t, closeImagePreview: d } = o();
12
+ return /* @__PURE__ */ r(
13
+ C,
14
+ {
15
+ open: t !== null,
16
+ onOpenChange: I(e, (n) => {
17
+ n || d();
18
+ }),
19
+ ...m
20
+ }
21
+ );
22
+ }, O = a(v, {
23
+ _id: "aiChatImagePreviewModal__Overlay"
24
+ }), h = a(c, {
25
+ _id: "aiChatImagePreviewModal__Content"
26
+ }), N = (i) => {
27
+ const { imagePreview: e } = o(), { children: m, ...t } = i;
28
+ return /* @__PURE__ */ l(
29
+ h,
30
+ {
31
+ "aria-label": e?.name ?? "Image preview",
32
+ "aria-describedby": void 0,
33
+ ...t,
34
+ children: [
35
+ /* @__PURE__ */ r(s, { className: "sr-only", children: e?.name ?? "Image preview" }),
36
+ m
37
+ ]
38
+ }
39
+ );
40
+ }, _ = a("img", {
41
+ _id: "aiChatImagePreviewModal__Image"
42
+ }), x = (i) => {
43
+ const { imagePreview: e } = o();
44
+ return /* @__PURE__ */ r(
45
+ _,
46
+ {
47
+ src: e?.url,
48
+ alt: e?.name ?? "Image preview",
49
+ ...i
50
+ }
51
+ );
52
+ }, j = a("div", {
53
+ _id: "aiChatImagePreviewModal__Footer"
54
+ }), M = a("span", {
55
+ _id: "aiChatImagePreviewModal__FileName"
56
+ }), k = (i) => {
57
+ const { imagePreview: e } = o();
58
+ return /* @__PURE__ */ r(M, { ...i, children: e?.name });
59
+ }, H = a(P, {
60
+ _id: "aiChatImagePreviewModal__Close",
61
+ children: /* @__PURE__ */ r(w, { iconKey: "close" })
62
+ });
63
+ export {
64
+ F as EmbeddedChatPrimitiveImagePreviewModal,
65
+ H as EmbeddedChatPrimitiveImagePreviewModalClose,
66
+ N as EmbeddedChatPrimitiveImagePreviewModalContent,
67
+ k as EmbeddedChatPrimitiveImagePreviewModalFileName,
68
+ j as EmbeddedChatPrimitiveImagePreviewModalFooter,
69
+ x as EmbeddedChatPrimitiveImagePreviewModalImage,
70
+ O as EmbeddedChatPrimitiveImagePreviewModalOverlay
71
+ };
@@ -1,4 +1,4 @@
1
- "use client";"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const We=require("@ai-sdk/react"),ze=require("ai"),t=require("react"),Je=require("../modal/modal-provider.cjs"),Ge=require("../../providers/chat-bubble-provider.cjs"),Qe=require("../../providers/sidebar-chat-provider.cjs"),Ve=require("../../providers/config-provider.cjs"),Ze=require("./use-captcha.cjs"),Xe=require("../../hooks/use-media-query.cjs"),Ye=require("../../hooks/use-anonymous-session.cjs"),et=require("../../hooks/use-auth-token.cjs"),tt=require("../../hooks/use-conversation-loader.cjs"),N=require("../../utils/generate-uid.cjs"),st=require("../../providers/base-events-provider.cjs"),nt=require("../../providers/chat-form-provider.cjs"),rt=require("../../providers/widget-provider.cjs"),at=require("@radix-ui/react-use-controllable-state"),ot=require("../../hooks/use-streaming-events.cjs"),it=require("../../hooks/use-inkeep-api-client.cjs");function ut(f){const h=f.message??"";let n=Number(f.code)||Number(f.statusCode);if(Number.isNaN(n))try{n=Number(JSON.parse(h).status)}catch{}const l=it.parseAuthError(n,{detail:h});return l!==null?l:n===401?"session":null}const O=`Hmm..
1
+ "use client";"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const Ze=require("@ai-sdk/react"),Ae=require("./file-upload-input.cjs"),Xe=require("ai"),t=require("react"),Ye=require("../modal/modal-provider.cjs"),et=require("../../providers/chat-bubble-provider.cjs"),tt=require("../../providers/sidebar-chat-provider.cjs"),st=require("../../providers/config-provider.cjs"),rt=require("./use-captcha.cjs"),nt=require("../../hooks/use-media-query.cjs"),at=require("../../hooks/use-anonymous-session.cjs"),ot=require("../../hooks/use-auth-token.cjs"),it=require("../../hooks/use-conversation-loader.cjs"),ut=require("../../hooks/use-initial-conversation.cjs"),O=require("../../utils/generate-uid.cjs"),ct=require("../../providers/base-events-provider.cjs"),lt=require("../../providers/chat-form-provider.cjs"),dt=require("../../providers/widget-provider.cjs"),ft=require("@radix-ui/react-use-controllable-state"),pt=require("../../hooks/use-streaming-events.cjs"),ht=require("../../hooks/use-inkeep-api-client.cjs"),gt=require("../../hooks/use-input-notification.cjs");function mt(m){const h=m.message??"";let r=Number(m.code)||Number(m.statusCode);if(Number.isNaN(r))try{r=Number(JSON.parse(h).status)}catch{}const d=ht.parseAuthError(r,{detail:h});return d!==null?d:r===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.`,ct=()=>{const{baseSettings:f,aiChatSettings:h}=Ve.useInkeepConfig(),[n="",l]=at.useControllableState({prop:h.conversationId,defaultProp:h.conversationId??""}),be=Je.useModal(),Ce=Ge.useOptionalChatBubble(),Se=Qe.useOptionalSidebarChat(),{logEvent:g}=st.useBaseEvents(),{setConversationId:Re,emitToParent:I}=ot.useStreamingEvents(),Z=t.useRef(n);t.useEffect(()=>{const e=Z.current;Z.current=n,e!==n&&g({eventName:"chat_conversation_changed",properties:{conversationId:n,previousConversationId:e}})},[n,g]);const[y,w]=t.useState(""),Ae=e=>w(e.target.value),{shouldBypassCaptcha:X,filters:Y,privacyPreferences:ke,userProperties:_}=f,{authToken:E,isLoading:Ie,refreshToken:ee}=et.useAuthToken(),te=!!f.getAuthToken,d=!!E,{onInputMessageChange:we,filters:se,baseUrl:T,agentUrl:Ee,context:ne,headers:re,appId:b,apiKey:m,files:C}=h,Te=be?.isOpen??Ce?.isOpen??Se?.isOpen??!0,{getCaptchaHeader:S,invalidate:c}=Ze.useCaptcha({baseUrl:T,shouldBypassCaptcha:X||!!m,shouldMakeInitialRequest:Te}),ae=t.useRef(S);ae.current=S;const oe=Ee||`${T}/run/api/chat`,{sessionToken:F,refreshSession:U}=Ye.useAnonymousSession({baseUrl:T,appId:b,getCaptchaHeader:S,invalidateCaptcha:c,optOutAllAnalytics:ke?.optOutAllAnalytics,enabled:!d&&!Ie}),{loadConversation:ie}=tt.useConversationLoader({baseUrl:T,appId:b,authToken:m??(d?E:F),getCaptchaHeader:S,invalidateCaptcha:c,refreshSession:m||d?void 0:U}),[Me,ue]=t.useState(!1),D=t.useRef(null);D.current=F;const B=t.useRef(null);B.current=E;const L=t.useRef(void 0);L.current=_&&Object.keys(_).length>0?JSON.stringify(_):void 0;const v=t.useRef(0),ce=t.useRef(null),$=t.useRef(null),R=t.useRef(void 0),xe=C?.map(e=>`${e.filename??""}:${e.mediaType}:${e.url.length}:${e.url.slice(0,64)}:${e.url.slice(-32)}`).join(`
4
- `)??"";t.useEffect(()=>{R.current=C?.length?C:void 0},[xe]);const le=t.useRef(re);le.current=re;const H=t.useRef(void 0);H.current=Y||se?JSON.stringify({...Y,...se}):void 0;const qe=e=>{switch(e.code){case 400:return e.message;case 401:return te?"Authentication failed. Please try again.":O;case 403:return`There seems to be a configuration error. Please contact ${f.organizationDisplayName??"Administrator"}`;default:return O}},[Pe,A]=t.useState([]),[Ne,M]=t.useState(null),Oe=t.useMemo(()=>new ze.DefaultChatTransport({api:oe,headers:()=>{const e=m??B.current??D.current;return{"x-inkeep-client-timezone":Intl.DateTimeFormat().resolvedOptions().timeZone,"x-inkeep-client-timestamp":new Date().toISOString(),...b?{"x-inkeep-app-id":b}:{},...e?{Authorization:`Bearer ${e}`}:{},...H.current?{"inkeep-filters":H.current}:{},...L.current?{"x-inkeep-user-properties":L.current}:{},...le.current}},prepareSendMessagesRequest:async e=>{const r=await ae.current(),s=e.messages[e.messages.length-1];return s||console.warn("[useInkeepChat] prepareSendMessagesRequest called with empty messages array"),{body:{...e.body,id:e.id,messages:s?[s]:[],trigger:e.trigger,messageId:e.messageId},headers:{...e.headers,...r}}},body:{requestContext:ne}}),[oe,ne,b,m]),{messages:x,sendMessage:j,addToolApprovalResponse:K,status:de,setMessages:p,stop:q,error:W}=We.useChat({transport:Oe,onData(e){I(e.type,e.data)},async onFinish(){I("completion",{conversationId:n}),await g({eventName:"assistant_message_received",properties:{conversationId:n}}),g({eventName:"assistant_answer_displayed",properties:{conversationId:n}})},onError(e){console.error("onError",{code:e.code,message:e.message});const r=X||m?null:ut(e);if(r!==null&&v.current<1){v.current++;const s=$.current,a=ce.current;(async()=>{if(r==="session"&&te){const o=await ee();if(!o)throw new Error("Auth token refresh failed");B.current=o}else if(r==="session"){const o=await U();o&&(D.current=o)}else c();if(s){K(s);return}a&&(p(o=>{let u=[...o];return u.at(-1)?.role==="assistant"&&(u=u.slice(0,-1)),u.at(-1)?.role==="user"&&(u=u.slice(0,-1)),u}),j(a.files?.length?{parts:[{type:"text",text:a.content},...a.files]}:{text:a.content},{body:a.body}))})().catch(()=>{v.current=0,c(),p(o=>{const u=[...o],V=u[u.length-1];if(!V)return u;const ye=O;return V.role==="user"?u.push({id:N.generateUid(16),role:"assistant",parts:[{type:"text",text:ye}]}):V.parts=[{type:"text",text:ye}],u})});return}v.current=0,r!==null&&c(),g({eventName:"chat_error",properties:{conversationId:n,error:e.message}}),p(s=>{const a=[...s],i=a[a.length-1];if(i){const o=qe(e);i.role==="user"?a.push({id:N.generateUid(16),role:"assistant",parts:[{type:"text",text:o}]}):i.parts=[{type:"text",text:o}]}return a})}}),pe=t.useRef(d);t.useEffect(()=>{const e=pe.current;pe.current=d,e!==d&&(q(),k(null),p([]),l(""),w(""),A([]),M(null),c())},[d,q,p,l,c]);const fe=de==="submitted",z=de==="streaming",_e=t.useMemo(()=>{const e=i=>{if(!i||typeof i!="object")return!1;const o=i;return typeof o.type=="string"&&o.type.startsWith("tool-")},s=[...x??[]].reverse().find(i=>i.role==="assistant");if(!s)return!1;const a=s.parts?.at(-1);return!(!e(a)||a.state!=="output-available"||!a.approval?.id||z)},[x,z]),he=z||_e,ge=fe||he,Fe=x.length===0,J=!y.trim()||ge,Ue=Xe.useMediaQuery("(max-width: 768px)"),[De,k]=t.useState(null);t.useEffect(()=>{W&&k(W)},[W]);const Be=()=>k(null),me=t.useRef(null);t.useEffect(()=>{we?.(y)},[y]);const Le=e=>{e.key==="Enter"&&!e.shiftKey&&!J&&!e.nativeEvent.isComposing&&(e.preventDefault(),G())},G=async(e=y)=>{if(J&&(!e||e.trim().length===0))return;A([]),w(""),v.current=0,$.current=null,await g({eventName:"user_message_submitted",properties:{conversationId:n}});let r=n;r||(r=`conv_${N.generateUid(16)}`,l(r)),Re(r);const s=R.current;R.current=void 0,ce.current={content:e,body:{conversationId:r},files:s},j(s?{parts:[{type:"text",text:e},...s]}:{text:e},{body:{conversationId:r}})},$e=t.useCallback(e=>{v.current=0,$.current=e,K(e)},[K]),Q=t.useCallback(()=>{q().then(()=>{I("aborted",{conversationId:n})})},[q,n,I]),ve=()=>{Be(),p([]),l(""),A([]),M(null),c(),R.current=C?.length?C:void 0,g({eventName:"chat_clear_button_clicked",properties:{conversationId:n}})},P=t.useCallback((e,r)=>{k(null),p(r),l(e),A([]),M(null),c(),R.current=void 0},[p,l,c]),He=t.useCallback(async(e,r)=>{Q(),P(e,[]),ue(!0);try{const s=await ie(e,r),a=s?.[s.length-1],i=s!==null&&a?.role==="user"?[...s,{id:N.generateUid(16),role:"assistant",parts:[{type:"text",text:"This session was interrupted. Please check back in a few minutes or start a new conversation."}]}]:s;i!==null&&P(e,i)}finally{r?.aborted||ue(!1)}},[P,ie,Q]),{openForm:je}=nt.useChatForm(),Ke=rt.useWidget();return t.useImperativeHandle(h.chatFunctionsRef,()=>({submitMessage:G,updateInputMessage(e){w(e)},clearChat:ve,openForm:e=>{Ke?.setView("chat"),je(e,void 0)},focusInput:()=>{me.current?.focus()}})),{messages:x,sendMessage:j,addToolApprovalResponse:$e,isLoading:fe,isStreaming:he,isBusy:ge,error:De,setError:k,isSubmitDisabled:J,input:y,handleInputChange:Ae,handleInputKeyDown:Le,handleSubmit:G,stop:Q,clear:ve,inputRef:me,isMobile:Ue,messageAttachments:Pe,setMessageAttachments:A,selectedWorkflow:Ne,setSelectedWorkflow:M,isNewChat:Fe,conversationId:n,restoreSession:P,loadAndRestoreSession:He,isSessionLoading:Me,authToken:d?E:F,refreshSession:d?ee:U,getCaptchaHeader:S,invalidateCaptcha:c}};exports.DEFAULT_ERROR_MESSAGE=O;exports.useInkeepChat=ct;
3
+ It seems I might be having some issues right now. Please clear the chat and try again.`,vt=()=>{const{baseSettings:m,aiChatSettings:h}=st.useInkeepConfig(),[r="",d]=ft.useControllableState({prop:h.conversationIdOverride,defaultProp:h.conversationIdOverride??""}),ke=Ye.useModal(),we=et.useOptionalChatBubble(),Te=tt.useOptionalSidebarChat(),{logEvent:v}=ct.useBaseEvents(),{setConversationId:Ee,emitToParent:E}=pt.useStreamingEvents(),Y=t.useRef(r);t.useEffect(()=>{const e=Y.current;Y.current=r,e!==r&&v({eventName:"chat_conversation_changed",properties:{conversationId:r,previousConversationId:e}})},[r,v]);const[C,M]=t.useState(""),Me=e=>M(e.target.value),{shouldBypassCaptcha:ee,filters:te,privacyPreferences:qe,userProperties:U}=m,{authToken:q,isLoading:Fe,refreshToken:se}=ot.useAuthToken(),re=!!m.getAuthToken,f=!!q,{onInputMessageChange:xe,filters:ne,baseUrl:F,agentUrl:Pe,context:ae,headers:oe,appId:R,apiKey:y,files:S}=h,Ne=ke?.isOpen??we?.isOpen??Te?.isOpen??!0,{getCaptchaHeader:I,invalidate:c}=rt.useCaptcha({baseUrl:F,shouldBypassCaptcha:ee||!!y,shouldMakeInitialRequest:Ne}),ie=t.useRef(I);ie.current=I;const ue=Pe||`${F}/run/api/chat`,{sessionToken:D,refreshSession:L}=at.useAnonymousSession({baseUrl:F,appId:R,getCaptchaHeader:I,invalidateCaptcha:c,optOutAllAnalytics:qe?.optOutAllAnalytics,enabled:!f&&!Fe}),ce=y??(f?q:D),{loadConversation:le}=it.useConversationLoader({baseUrl:F,appId:R,authToken:ce,getCaptchaHeader:I,invalidateCaptcha:c,refreshSession:y||f?void 0:L}),[Oe,de]=t.useState(!1),$=t.useRef(null);$.current=D;const B=t.useRef(null);B.current=q;const z=t.useRef(void 0);z.current=U&&Object.keys(U).length>0?JSON.stringify(U):void 0;const b=t.useRef(0),fe=t.useRef(null),H=t.useRef(null),A=t.useRef(void 0),_e=S?.map(e=>`${e.filename??""}:${e.mediaType}:${e.url.length}:${e.url.slice(0,64)}:${e.url.slice(-32)}`).join(`
4
+ `)??"";t.useEffect(()=>{A.current=S?.length?S:void 0},[_e]);const pe=t.useRef(oe);pe.current=oe;const K=t.useRef(void 0);K.current=te||ne?JSON.stringify({...te,...ne}):void 0;const Ue=e=>{switch(e.code){case 400:return e.message;case 401:return re?"Authentication failed. Please try again.":_;case 403:return`There seems to be a configuration error. Please contact ${m.organizationDisplayName??"Administrator"}`;default:return _}},[x,j]=t.useState([]),De=t.useMemo(()=>new Xe.DefaultChatTransport({api:ue,headers:()=>{const e=y??B.current??$.current;return{"x-inkeep-client-timezone":Intl.DateTimeFormat().resolvedOptions().timeZone,"x-inkeep-client-timestamp":new Date().toISOString(),...R?{"x-inkeep-app-id":R}:{},...e?{Authorization:`Bearer ${e}`}:{},...K.current?{"inkeep-filters":K.current}:{},...z.current?{"x-inkeep-user-properties":z.current}:{},...pe.current}},prepareSendMessagesRequest:async e=>{const u=await ie.current(),s=e.messages[e.messages.length-1];return s||console.warn("[useInkeepChat] prepareSendMessagesRequest called with empty messages array"),{body:{...e.body,id:e.id,messages:s?[s]:[],trigger:e.trigger,messageId:e.messageId},headers:{...e.headers,...u}}},body:{requestContext:ae}}),[ue,ae,R,y]),{messages:P,sendMessage:J,addToolApprovalResponse:G,status:he,setMessages:g,stop:N,error:Q}=Ze.useChat({transport:De,onData(e){E(e.type,e.data)},async onFinish(){E("completion",{conversationId:r}),await v({eventName:"assistant_message_received",properties:{conversationId:r}}),v({eventName:"assistant_answer_displayed",properties:{conversationId:r}})},onError(e){console.error("onError",{code:e.code,message:e.message});const u=ee||y?null:mt(e);if(u!==null&&b.current<1){b.current++;const s=H.current,a=fe.current;(async()=>{if(u==="session"&&re){const n=await se();if(!n)throw new Error("Auth token refresh failed");B.current=n}else if(u==="session"){const n=await L();n&&($.current=n)}else c();if(s){G(s);return}a&&(g(n=>{let o=[...n];return o.at(-1)?.role==="assistant"&&(o=o.slice(0,-1)),o.at(-1)?.role==="user"&&(o=o.slice(0,-1)),o}),J(a.files?.length?{parts:[{type:"text",text:a.content},...a.files]}:{text:a.content},{body:a.body}))})().catch(()=>{b.current=0,c(),g(n=>{const o=[...n],p=o[o.length-1];if(!p)return o;const l=_;return p.role==="user"?o.push({id:O.generateUid(16),role:"assistant",parts:[{type:"text",text:l}]}):p.parts=[{type:"text",text:l}],o})});return}b.current=0,u!==null&&c(),v({eventName:"chat_error",properties:{conversationId:r,error:e.message}}),g(s=>{const a=[...s],i=a[a.length-1];if(i){const n=Ue(e);i.role==="user"?a.push({id:O.generateUid(16),role:"assistant",parts:[{type:"text",text:n}]}):i.parts=[{type:"text",text:n}]}return a})}}),ge=t.useRef(f);t.useEffect(()=>{const e=ge.current;ge.current=f,e!==f&&(N(),k(null),g([]),d(""),M(""),j([]),c())},[f,N,g,d,c]);const me=he==="submitted",W=he==="streaming",Le=t.useMemo(()=>{const e=i=>{if(!i||typeof i!="object")return!1;const n=i;return typeof n.type=="string"&&n.type.startsWith("tool-")},s=[...P??[]].reverse().find(i=>i.role==="assistant");if(!s)return!1;const a=s.parts?.at(-1);return!(!e(a)||a.state!=="output-available"||!a.approval?.id||W)},[P,W]),ve=W||Le,ye=me||ve,$e=P.length===0,V=!C.trim()&&x.length===0||ye,Be=nt.useMediaQuery("(max-width: 768px)"),[ze,k]=t.useState(null);t.useEffect(()=>{Q&&k(Q)},[Q]);const He=()=>k(null),{inputNotification:Ke,showInputNotification:be,clearInputNotification:je}=gt.useInputNotification(),Ce=t.useRef(null);t.useEffect(()=>{xe?.(C)},[C]);const Je=e=>{e.key==="Enter"&&!e.shiftKey&&!V&&!e.nativeEvent.isComposing&&(e.preventDefault(),Z())},Z=async(e=C)=>{if(V&&(!e||e.trim().length===0)&&x.length===0)return;const u=x;j([]),M(""),b.current=0,H.current=null,await v({eventName:"user_message_submitted",properties:{conversationId:r}});let s=r;s||(s=`conv_${O.generateUid(16)}`,d(s)),Ee(s);const a=A.current;A.current=void 0;let i,n;if(a?.length){let o;try{o=await Promise.all(u.map(p=>{const l=Ae.normalizeFileType(p);return new Promise((Ve,Ie)=>{const T=new FileReader;T.onload=()=>{if(typeof T.result!="string"){Ie(new Error(`Failed to read file "${l.name}"`));return}Ve({type:"file",url:T.result,mediaType:l.type,filename:l.name})},T.onerror=()=>Ie(new Error(`Failed to read file "${l.name}"`)),T.readAsDataURL(l)})}))}catch{be({title:"Failed to attach files",message:"Could not read one or more files. Please try again."});return}n=[...o,...a],i=e.trim()?{parts:[{type:"text",text:e},...n]}:{parts:n}}else if(u.length>0){const o=new DataTransfer;for(const l of u)o.items.add(Ae.normalizeFileType(l));const p=o.files;i=e.trim()?{text:e,files:p}:{files:p}}else i={text:e};fe.current={content:e,body:{conversationId:s},files:n},J(i,{body:{conversationId:s}})},Ge=t.useCallback(e=>{b.current=0,H.current=e,G(e)},[G]),X=t.useCallback(()=>{N().then(()=>{E("aborted",{conversationId:r})})},[N,r,E]),Re=()=>{He(),g([]),d(""),c(),A.current=S?.length?S:void 0,v({eventName:"chat_clear_button_clicked",properties:{conversationId:r}})},w=t.useCallback((e,u)=>{k(null),g(u),d(e),c(),A.current=void 0},[g,d,c]),Se=t.useCallback(async(e,u)=>{X(),w(e,[]),de(!0);try{const s=await le(e,u);if(s===null)return!1;const i=s[s.length-1]?.role==="user"?[...s,{id:O.generateUid(16),role:"assistant",parts:[{type:"text",text:"This session was interrupted. Please check back in a few minutes or start a new conversation."}]}]:s;return w(e,i),!0}finally{u?.aborted||de(!1)}},[w,le,X]);ut.useInitialConversation({conversationId:h.conversationId,effectiveAuthToken:ce,loadAndRestoreSession:Se,onLoadFailed:()=>w("",[])});const{openForm:Qe}=lt.useChatForm(),We=dt.useWidget();return t.useImperativeHandle(h.chatFunctionsRef,()=>({submitMessage:Z,updateInputMessage(e){M(e)},clearChat:Re,openForm:e=>{We?.setView("chat"),Qe(e,void 0)},focusInput:()=>{Ce.current?.focus()}})),{messages:P,sendMessage:J,addToolApprovalResponse:Ge,isLoading:me,isStreaming:ve,isBusy:ye,error:ze,setError:k,isSubmitDisabled:V,input:C,handleInputChange:Me,handleInputKeyDown:Je,handleSubmit:Z,stop:X,clear:Re,inputRef:Ce,isMobile:Be,files:x,setFiles:j,isNewChat:$e,conversationId:r,restoreSession:w,loadAndRestoreSession:Se,isSessionLoading:Oe,authToken:f?q:D,refreshSession:f?se:L,getCaptchaHeader:I,invalidateCaptcha:c,inputNotification:Ke,showInputNotification:be,clearInputNotification:je}};exports.DEFAULT_ERROR_MESSAGE=_;exports.useInkeepChat=vt;
@@ -1,6 +1,7 @@
1
1
  import { KeyboardEvent, Dispatch, SetStateAction, RefObject } from 'react';
2
2
  import { FileUIPart, ChatRequestOptions } from 'ai';
3
- import { Message, MessageAttachment, Workflow } from '../../../types/index.ts';
3
+ import { Message } from '../../../types/index.ts';
4
+ import { InputNotification } from '../../hooks/use-input-notification';
4
5
  export declare const DEFAULT_ERROR_MESSAGE = "Hmm.. \n\nIt seems I might be having some issues right now. Please clear the chat and try again.";
5
6
  export declare const useInkeepChat: () => {
6
7
  messages: Message[];
@@ -41,17 +42,18 @@ export declare const useInkeepChat: () => {
41
42
  clear: () => void;
42
43
  inputRef: RefObject<HTMLTextAreaElement | null>;
43
44
  isMobile: boolean;
44
- messageAttachments: MessageAttachment[];
45
- setMessageAttachments: Dispatch<SetStateAction<MessageAttachment[]>>;
46
- selectedWorkflow: Workflow | null;
47
- setSelectedWorkflow: Dispatch<SetStateAction<Workflow | null>>;
45
+ files: File[];
46
+ setFiles: Dispatch<SetStateAction<File[]>>;
48
47
  isNewChat: boolean;
49
48
  conversationId: string;
50
49
  restoreSession: (sessionId: string, loadedMessages: Message[]) => void;
51
- loadAndRestoreSession: (sessionId: string, signal?: AbortSignal) => Promise<void>;
50
+ loadAndRestoreSession: (sessionId: string, signal?: AbortSignal) => Promise<boolean>;
52
51
  isSessionLoading: boolean;
53
52
  authToken: string | null;
54
53
  refreshSession: () => Promise<string | null>;
55
54
  getCaptchaHeader: () => Promise<Record<string, string>>;
56
55
  invalidateCaptcha: () => void;
56
+ inputNotification: InputNotification | null;
57
+ showInputNotification: (n: InputNotification, durationMs?: number) => void;
58
+ clearInputNotification: () => void;
57
59
  };