@inkeep/agents-ui 0.16.0 → 0.16.2

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 (124) hide show
  1. package/dist/color-mode/index.js +4 -4
  2. package/dist/index.cjs +1 -1
  3. package/dist/index.js +167 -161
  4. package/dist/node_modules/.pnpm/use-sync-external-store@1.6.0_react@19.3.0-canary-87ae75b3-20260128/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.cjs +9 -0
  5. package/dist/node_modules/.pnpm/{use-sync-external-store@1.5.0_react@19.0.0 → use-sync-external-store@1.6.0_react@19.3.0-canary-87ae75b3-20260128}/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js +2 -2
  6. package/dist/primitives/atoms/cmdk/index.cjs +1 -1
  7. package/dist/primitives/atoms/cmdk/index.js +14 -2
  8. package/dist/primitives/atoms/combobox.d.ts +104 -0
  9. package/dist/primitives/atoms/icons/built-in-icons.cjs +1 -1
  10. package/dist/primitives/atoms/icons/built-in-icons.d.ts +4 -1
  11. package/dist/primitives/atoms/icons/built-in-icons.js +94 -91
  12. package/dist/primitives/atoms/icons/collections/pi.cjs +1 -1
  13. package/dist/primitives/atoms/icons/collections/pi.d.ts +3 -0
  14. package/dist/primitives/atoms/icons/collections/pi.js +82 -37
  15. package/dist/primitives/atoms/icons/inkeep-default-icons.cjs +1 -1
  16. package/dist/primitives/atoms/icons/inkeep-default-icons.js +4 -1
  17. package/dist/primitives/atoms/portal.js +3 -3
  18. package/dist/primitives/atoms/select.cjs +1 -1
  19. package/dist/primitives/atoms/select.js +2 -2
  20. package/dist/primitives/atoms/shadow/context.js +4 -4
  21. package/dist/primitives/components/embedded-chat/chat-error-helpers.cjs +3 -0
  22. package/dist/primitives/components/embedded-chat/chat-error-helpers.d.ts +26 -0
  23. package/dist/primitives/components/embedded-chat/chat-error-helpers.js +32 -0
  24. package/dist/primitives/components/embedded-chat/file-upload-input.cjs +1 -1
  25. package/dist/primitives/components/embedded-chat/file-upload-input.d.ts +1 -2
  26. package/dist/primitives/components/embedded-chat/file-upload-input.js +359 -217
  27. package/dist/primitives/components/embedded-chat/image-preview-modal.js +3 -3
  28. package/dist/primitives/components/embedded-chat/use-chat-action.cjs +1 -1
  29. package/dist/primitives/components/embedded-chat/use-chat-action.js +16 -14
  30. package/dist/primitives/components/embedded-chat/use-inkeep-chat.cjs +2 -4
  31. package/dist/primitives/components/embedded-chat/use-inkeep-chat.d.ts +1 -2
  32. package/dist/primitives/components/embedded-chat/use-inkeep-chat.js +312 -284
  33. package/dist/primitives/components/embedded-chat/use-stream-processor.cjs +1 -1
  34. package/dist/primitives/components/embedded-chat/use-stream-processor.js +1 -1
  35. package/dist/primitives/components/embedded-chat.cjs +3 -3
  36. package/dist/primitives/components/embedded-chat.d.ts +2 -3
  37. package/dist/primitives/components/embedded-chat.js +122 -114
  38. package/dist/primitives/components/embedded-search/search-provider.js +3 -3
  39. package/dist/primitives/components/embedded-search.cjs +1 -1
  40. package/dist/primitives/components/embedded-search.d.ts +1 -1
  41. package/dist/primitives/components/embedded-search.js +3 -3
  42. package/dist/primitives/components/modal/modal-provider.js +2 -2
  43. package/dist/primitives/components/modal.js +3 -3
  44. package/dist/primitives/components/sidebar-chat/index.js +1 -1
  45. package/dist/primitives/components/tagline-logo-icon.js +50 -9
  46. package/dist/primitives/hooks/use-events-api.cjs +1 -0
  47. package/dist/primitives/hooks/use-events-api.d.ts +29 -0
  48. package/dist/primitives/hooks/use-events-api.js +43 -0
  49. package/dist/primitives/hooks/use-initial-conversation.js +4 -1
  50. package/dist/primitives/hooks/use-input-notification.js +9 -9
  51. package/dist/primitives/index.cjs +1 -1
  52. package/dist/primitives/index.js +150 -144
  53. package/dist/primitives/providers/base-events-provider.cjs +1 -1
  54. package/dist/primitives/providers/base-events-provider.d.ts +2 -0
  55. package/dist/primitives/providers/base-events-provider.js +23 -22
  56. package/dist/primitives/providers/chat-auth-provider.cjs +1 -0
  57. package/dist/primitives/providers/chat-auth-provider.d.ts +27 -0
  58. package/dist/primitives/providers/chat-auth-provider.js +46 -0
  59. package/dist/primitives/providers/chat-base-events-provider.cjs +1 -0
  60. package/dist/primitives/providers/chat-base-events-provider.d.ts +12 -0
  61. package/dist/primitives/providers/chat-base-events-provider.js +73 -0
  62. package/dist/primitives/providers/chat-bubble-provider.js +1 -1
  63. package/dist/primitives/providers/chat-form-provider.d.ts +1 -1
  64. package/dist/primitives/providers/chat-form-provider.js +4 -4
  65. package/dist/primitives/providers/chat-history-provider.js +3 -3
  66. package/dist/primitives/providers/config-provider.js +3 -3
  67. package/dist/primitives/providers/feedback-provider.cjs +1 -1
  68. package/dist/primitives/providers/feedback-provider.js +37 -31
  69. package/dist/primitives/providers/form-field-provider.js +3 -3
  70. package/dist/primitives/providers/help-menu-provider.js +4 -4
  71. package/dist/primitives/providers/hover-popover-provider.js +3 -3
  72. package/dist/primitives/providers/image-preview-provider.js +5 -5
  73. package/dist/primitives/providers/index.cjs +1 -1
  74. package/dist/primitives/providers/index.d.ts +2 -0
  75. package/dist/primitives/providers/index.js +57 -51
  76. package/dist/primitives/providers/markdown-provider.js +2 -2
  77. package/dist/primitives/providers/message-provider.js +1 -1
  78. package/dist/primitives/providers/sidebar-chat-provider.js +3 -3
  79. package/dist/primitives/providers/source-item-provider.js +3 -3
  80. package/dist/primitives/providers/widget-provider.js +2 -2
  81. package/dist/primitives/utils/misc.cjs +1 -1
  82. package/dist/primitives/utils/misc.js +2 -2
  83. package/dist/react/chat-button.js +1 -1
  84. package/dist/react/embedded-chat.cjs +1 -1
  85. package/dist/react/embedded-chat.js +104 -102
  86. package/dist/react/embedded-search.cjs +1 -1
  87. package/dist/react/embedded-search.js +18 -18
  88. package/dist/react/index.cjs +1 -1
  89. package/dist/react/index.js +167 -161
  90. package/dist/styled/components/chat-bubble.js +4 -4
  91. package/dist/styled/components/chat-button.cjs +1 -1
  92. package/dist/styled/components/chat-button.js +9 -9
  93. package/dist/styled/components/chat-history.cjs +1 -1
  94. package/dist/styled/components/chat-history.js +22 -22
  95. package/dist/styled/components/embedded-chat/file-upload-input.cjs +1 -1
  96. package/dist/styled/components/embedded-chat/file-upload-input.js +71 -72
  97. package/dist/styled/components/embedded-chat/image-preview-modal.js +14 -7
  98. package/dist/styled/components/embedded-chat.cjs +1 -1
  99. package/dist/styled/components/embedded-chat.js +211 -199
  100. package/dist/styled/components/embedded-search.cjs +1 -1
  101. package/dist/styled/components/embedded-search.js +72 -66
  102. package/dist/styled/components/loading-indicator.cjs +1 -1
  103. package/dist/styled/components/loading-indicator.js +1 -1
  104. package/dist/styled/components/message.cjs +1 -1
  105. package/dist/styled/components/message.js +142 -139
  106. package/dist/styled/components/modal.js +3 -3
  107. package/dist/styled/components/searchbar.js +8 -8
  108. package/dist/styled/components/sidebar-chat.cjs +1 -1
  109. package/dist/styled/components/sidebar-chat.js +5 -5
  110. package/dist/styled/index.cjs +1 -1
  111. package/dist/styled/index.js +155 -149
  112. package/dist/styled/inkeep.css.cjs +13 -3
  113. package/dist/styled/inkeep.css.js +13 -3
  114. package/dist/theme/utils/generate-theme-variables.js +6 -6
  115. package/dist/types/config/ai.d.ts +5 -0
  116. package/dist/types/events.d.ts +11 -0
  117. package/dist/types/icons/built-in.d.ts +1 -1
  118. package/dist/types/icons/custom.d.ts +3 -0
  119. package/package.json +2 -2
  120. package/dist/node_modules/.pnpm/use-sync-external-store@1.5.0_react@19.0.0/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.cjs +0 -9
  121. /package/dist/node_modules/.pnpm/{use-sync-external-store@1.5.0_react@19.0.0 → use-sync-external-store@1.6.0_react@19.3.0-canary-87ae75b3-20260128}/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.cjs +0 -0
  122. /package/dist/node_modules/.pnpm/{use-sync-external-store@1.5.0_react@19.0.0 → use-sync-external-store@1.6.0_react@19.3.0-canary-87ae75b3-20260128}/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.js +0 -0
  123. /package/dist/node_modules/.pnpm/{use-sync-external-store@1.5.0_react@19.0.0 → use-sync-external-store@1.6.0_react@19.3.0-canary-87ae75b3-20260128}/node_modules/use-sync-external-store/shim/index.cjs +0 -0
  124. /package/dist/node_modules/.pnpm/{use-sync-external-store@1.5.0_react@19.0.0 → use-sync-external-store@1.6.0_react@19.3.0-canary-87ae75b3-20260128}/node_modules/use-sync-external-store/shim/index.js +0 -0
@@ -1,6 +1,6 @@
1
1
  "use client";
2
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";
3
+ import { Close as v, Title as s, Overlay as P, Root as g, Content as c } from "../../atoms/dialog.js";
4
4
  import { CustomIcon as w } from "../../atoms/icons/custom-icon.js";
5
5
  import { useImagePreview as o } from "../../providers/image-preview-provider.js";
6
6
  import { composeEventHandlers as I } from "../../utils/compose-event-handlers.js";
@@ -19,7 +19,7 @@ const C = a(g, {
19
19
  ...m
20
20
  }
21
21
  );
22
- }, O = a(v, {
22
+ }, O = a(P, {
23
23
  _id: "aiChatImagePreviewModal__Overlay"
24
24
  }), h = a(c, {
25
25
  _id: "aiChatImagePreviewModal__Content"
@@ -56,7 +56,7 @@ const C = a(g, {
56
56
  }), k = (i) => {
57
57
  const { imagePreview: e } = o();
58
58
  return /* @__PURE__ */ r(M, { ...i, children: e?.name });
59
- }, H = a(P, {
59
+ }, H = a(v, {
60
60
  _id: "aiChatImagePreviewModal__Close",
61
61
  children: /* @__PURE__ */ r(w, { iconKey: "close" })
62
62
  });
@@ -1 +1 @@
1
- "use client";"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const p=require("../../providers/base-events-provider.cjs"),c=require("../../providers/chat-form-provider.cjs"),d=require("../modal/modal-provider.cjs"),u=require("./chat-provider.cjs"),m=(e,s)=>{const{logEvent:t}=p.useBaseEvents(),{conversationId:n,messages:i}=u.useChat(),{openForm:a}=c.useChatForm(),r=d.useModal();return{handleAction:l=>{if(e.action.type==="open_form"){l?.onOpenForm?.();const o="name"in e?e:void 0;a?.(e.action.formSettings,o)}else if(e.action.type==="invoke_callback"||e.action.type==="invoke_message_callback"){const o={conversation:{id:n,messages:i}};e.action.type==="invoke_message_callback"?e.action.callback({...o,messageId:s}):e.action.callback({...o}),e.action.shouldCloseModal&&r?.setOpen(!1)}},logHelpAction:()=>{"name"in e&&(t({eventName:"get_help_option_clicked",properties:{getHelpOption:e,conversationId:n}}),e.action.type!=="open_form"&&t({eventName:"user_escalation_indicated",properties:{escalationType:"get_help_option",getHelpOption:e,conversationId:n}}))}}};exports.useChatAction=m;
1
+ "use client";"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const p=require("../../providers/base-events-provider.cjs"),c=require("../../providers/chat-form-provider.cjs"),u=require("../modal/modal-provider.cjs"),v=require("./chat-provider.cjs"),d=(e,o)=>{const{logEvent:i}=p.useBaseEvents(),{conversationId:t,messages:s}=v.useChat(),{openForm:r}=c.useChatForm(),l=u.useModal();return{handleAction:a=>{if(e.action.type==="open_form"){a?.onOpenForm?.();const n="name"in e?e:void 0;r?.(e.action.formSettings,n)}else if(e.action.type==="invoke_callback"||e.action.type==="invoke_message_callback"){const n={conversation:{id:t,messages:s}};e.action.type==="invoke_message_callback"?e.action.callback({...n,messageId:o}):e.action.callback({...n}),e.action.shouldCloseModal&&l?.setOpen(!1)}},logHelpAction:()=>{"name"in e&&(i({eventName:"get_help_option_clicked",properties:{getHelpOption:e,conversationId:t,...o?{messageId:o}:{}}}),e.action.type!=="open_form"&&i({eventName:"user_escalation_indicated",properties:{escalationType:"get_help_option",getHelpOption:e,conversationId:t,...o?{messageId:o}:{}}}))}}};exports.useChatAction=d;
@@ -3,35 +3,37 @@ import { useBaseEvents as r } from "../../providers/base-events-provider.js";
3
3
  import { useChatForm as m } from "../../providers/chat-form-provider.js";
4
4
  import { useModal as c } from "../modal/modal-provider.js";
5
5
  import { useChat as f } from "./chat-provider.js";
6
- const y = (e, t) => {
7
- const { logEvent: s } = r(), { conversationId: n, messages: i } = f(), { openForm: l } = m(), a = c();
8
- return { handleAction: (p) => {
6
+ const y = (e, o) => {
7
+ const { logEvent: i } = r(), { conversationId: t, messages: l } = f(), { openForm: p } = m(), s = c();
8
+ return { handleAction: (a) => {
9
9
  if (e.action.type === "open_form") {
10
- p?.onOpenForm?.();
11
- const o = "name" in e ? e : void 0;
12
- l?.(e.action.formSettings, o);
10
+ a?.onOpenForm?.();
11
+ const n = "name" in e ? e : void 0;
12
+ p?.(e.action.formSettings, n);
13
13
  } else if (e.action.type === "invoke_callback" || e.action.type === "invoke_message_callback") {
14
- const o = {
14
+ const n = {
15
15
  conversation: {
16
- id: n,
17
- messages: i
16
+ id: t,
17
+ messages: l
18
18
  }
19
19
  };
20
- e.action.type === "invoke_message_callback" ? e.action.callback({ ...o, messageId: t }) : e.action.callback({ ...o }), e.action.shouldCloseModal && a?.setOpen(!1);
20
+ e.action.type === "invoke_message_callback" ? e.action.callback({ ...n, messageId: o }) : e.action.callback({ ...n }), e.action.shouldCloseModal && s?.setOpen(!1);
21
21
  }
22
22
  }, logHelpAction: () => {
23
- "name" in e && (s({
23
+ "name" in e && (i({
24
24
  eventName: "get_help_option_clicked",
25
25
  properties: {
26
26
  getHelpOption: e,
27
- conversationId: n
27
+ conversationId: t,
28
+ ...o ? { messageId: o } : {}
28
29
  }
29
- }), e.action.type !== "open_form" && s({
30
+ }), e.action.type !== "open_form" && i({
30
31
  eventName: "user_escalation_indicated",
31
32
  properties: {
32
33
  escalationType: "get_help_option",
33
34
  getHelpOption: e,
34
- conversationId: n
35
+ conversationId: t,
36
+ ...o ? { messageId: o } : {}
35
37
  }
36
38
  }));
37
39
  } };
@@ -1,4 +1,2 @@
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
-
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
+ "use client";"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const Ze=require("@ai-sdk/react"),Me=require("./file-upload-input.cjs"),Xe=require("ai"),t=require("react"),Ye=require("../../providers/config-provider.cjs"),et=require("../../providers/chat-auth-provider.cjs"),tt=require("../../hooks/use-media-query.cjs"),st=require("../../hooks/use-conversation-loader.cjs"),rt=require("../../hooks/use-initial-conversation.cjs"),L=require("../../utils/generate-uid.cjs"),nt=require("../../providers/base-events-provider.cjs"),at=require("../../providers/chat-form-provider.cjs"),ot=require("../../providers/widget-provider.cjs"),it=require("@radix-ui/react-use-controllable-state"),ct=require("../../hooks/use-streaming-events.cjs"),ut=require("../../hooks/use-input-notification.cjs"),f=require("./chat-error-helpers.cjs"),lt=()=>{const{baseSettings:se,aiChatSettings:y}=Ye.useInkeepConfig(),[u="",h]=it.useControllableState({prop:y.conversationIdOverride,defaultProp:y.conversationIdOverride??""}),{logEvent:g}=nt.useBaseEvents(),{setConversationId:ke,emitToParent:k}=ct.useStreamingEvents(),re=t.useRef(u);t.useEffect(()=>{const e=re.current;re.current=u,e!==u&&g({eventName:"chat_conversation_changed",properties:{conversationId:u,previousConversationId:e}})},[u,g]);const[R,E]=t.useState(""),Fe=e=>E(e.target.value),{shouldBypassCaptcha:_e,filters:ne,userProperties:N,analyticsProperties:O}=se,{authToken:ae,isAuthenticated:m,isAuthConfigured:oe,refreshAuthToken:ie,sessionToken:ce,refreshSession:ue,getCaptchaHeader:F,invalidateCaptcha:d,effectiveAuthToken:le,applicableRefreshSession:xe}=et.useChatAuth(),{onInputMessageChange:Pe,filters:de,baseUrl:fe,agentUrl:qe,context:pe,headers:ge,appId:_,apiKey:D,files:S}=y,he=t.useRef(F);he.current=F;const me=qe||`${fe}/run/api/chat`,{loadConversation:ve}=st.useConversationLoader({baseUrl:fe,appId:_,authToken:le,getCaptchaHeader:F,invalidateCaptcha:d,refreshSession:xe}),[Le,ye]=t.useState(!1),U=t.useRef(null);U.current=ce;const $=t.useRef(null);$.current=ae;const B=t.useRef(void 0);B.current=N&&Object.keys(N).length>0?N:void 0;const z=t.useRef(void 0);z.current=O&&Object.keys(O).length>0?O:void 0;const v=t.useRef(0),G=t.useRef(null),H=t.useRef(null),C=t.useRef(void 0),Ne=S?.map(e=>`${e.filename??""}:${e.mediaType}:${e.url.length}:${e.url.slice(0,64)}:${e.url.slice(-32)}`).join(`
2
+ `)??"";t.useEffect(()=>{C.current=S?.length?S:void 0},[Ne]);const Re=t.useRef(ge);Re.current=ge;const K=t.useRef(void 0);K.current=ne||de?JSON.stringify({...ne,...de}):void 0;const Oe=e=>{switch(f.resolveHttpStatusCode(e)){case 400:try{const s=JSON.parse(e.message??"");return s.detail??s.error?.message??f.RECOVERABLE_FALLBACK_MESSAGE}catch{return e.message?.trim()||f.RECOVERABLE_FALLBACK_MESSAGE}case 401:return oe?"Authentication failed. Please try again.":f.DEFAULT_ERROR_MESSAGE;case 403:return`There seems to be a configuration error. Please contact ${se.organizationDisplayName??"Administrator"}`;case 429:return f.RATE_LIMIT_MESSAGE;default:return f.DEFAULT_ERROR_MESSAGE}},[x,j]=t.useState([]),De=t.useMemo(()=>new Xe.DefaultChatTransport({api:me,headers:()=>{const e=D??$.current??U.current;return{"x-inkeep-client-timezone":Intl.DateTimeFormat().resolvedOptions().timeZone,"x-inkeep-client-timestamp":new Date().toISOString(),"x-inkeep-invocation-type":"chat_widget",..._?{"x-inkeep-app-id":_}:{},...e?{Authorization:`Bearer ${e}`}:{},...K.current?{"inkeep-filters":K.current}:{},...Re.current}},prepareSendMessagesRequest:async e=>{const i=await he.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,...B.current?{userProperties:B.current}:{},...z.current?{properties:z.current}:{}},headers:{...e.headers,...i}}},body:{requestContext:pe}}),[me,pe,_,D]),{messages:I,sendMessage:V,addToolApprovalResponse:J,status:Ee,setMessages:p,stop:P,error:q}=Ze.useChat({transport:De,onData(e){k(e.type,e.data)},async onFinish({message:e}){k("completion",{conversationId:u}),await g({eventName:"assistant_message_received",properties:{conversationId:u,messageId:e.id}}),g({eventName:"assistant_answer_displayed",properties:{conversationId:u,messageId:e.id}})},onError(e){console.error("onError",{code:e.code,message:e.message});const i=_e||D?null:f.resolveStreamingAuthError(e);if(i!==null&&v.current<1){v.current++;const a=H.current,r=G.current;(async()=>{if(i==="session"&&oe){const c=await ie();if(!c)throw new Error("Auth token refresh failed");$.current=c}else if(i==="session"){const c=await ue();c&&(U.current=c)}else d();if(a){J(a);return}r&&(p(c=>{let n=[...c];return n.at(-1)?.role==="assistant"&&(n=n.slice(0,-1)),n.at(-1)?.role==="user"&&(n=n.slice(0,-1)),n}),V(r.files?.length?{parts:[{type:"text",text:r.content},...r.files]}:{text:r.content},{body:r.body}))})().catch(()=>{v.current=0,d(),p(c=>{const n=[...c],T=n[n.length-1];if(!T)return n;const w=f.DEFAULT_ERROR_MESSAGE;return T.role==="user"?n.push({id:L.generateUid(16),role:"assistant",parts:[{type:"text",text:w}]}):T.parts=[{type:"text",text:w}],n})});return}v.current=0,i!==null&&d();const s=f.isRecoverableError(e),l=Oe(e);if(g({eventName:"chat_error",properties:{conversationId:u,messageId:I.at(-1)?.id,error:e.message}}),s){Y({title:"Request failed",message:l},f.RECOVERABLE_NOTIFICATION_DURATION_MS),p(r=>{let o=[...r];return o.at(-1)?.role==="assistant"&&(o=o.slice(0,-1)),o.at(-1)?.role==="user"&&(o=o.slice(0,-1)),o});const a=G.current?.content;a&&E(a),X.current=e;return}p(a=>{const r=[...a],o=r[r.length-1];return o&&(o.role==="user"?r.push({id:L.generateUid(16),role:"assistant",parts:[{type:"text",text:l}]}):o.parts=[{type:"text",text:l}]),r})}}),Se=t.useRef(m);t.useEffect(()=>{const e=Se.current;Se.current=m,e!==m&&(P(),A(null),p([]),h(""),E(""),j([]),d())},[m,P,p,h,d]);const Ce=Ee==="submitted",Q=Ee==="streaming",Ue=t.useMemo(()=>{const e=a=>{if(!a||typeof a!="object")return!1;const r=a;return typeof r.type=="string"&&r.type.startsWith("tool-")},s=[...I??[]].reverse().find(a=>a.role==="assistant");if(!s)return!1;const l=s.parts?.at(-1);return!(!e(l)||l.state!=="output-available"||!l.approval?.id||Q)},[I,Q]),[$e,W]=t.useState(!1),Ie=Q||Ue&&!$e,Ae=Ce||Ie,Be=I.length===0,Z=!R.trim()&&x.length===0||Ae,ze=tt.useMediaQuery("(max-width: 768px)"),[Ge,A]=t.useState(null),X=t.useRef(null);t.useEffect(()=>{if(q){if(X.current===q){X.current=null;return}A(q)}},[q]);const He=()=>A(null),{inputNotification:Ke,showInputNotification:Y,clearInputNotification:je}=ut.useInputNotification(),be=t.useRef(null);t.useEffect(()=>{Pe?.(R)},[R]);const Ve=e=>{e.key==="Enter"&&!e.shiftKey&&!Z&&!e.nativeEvent.isComposing&&(e.preventDefault(),ee())},ee=async(e=R)=>{if(Z&&(!e||e.trim().length===0)&&x.length===0)return;const i=x;j([]),E(""),v.current=0,H.current=null,W(!1);let s=u;s||(s=`conv_${L.generateUid(16)}`,h(s)),ke(s),await g({eventName:"user_message_submitted",properties:{conversationId:s}});const l=C.current;C.current=void 0;let a,r;if(l?.length){let o;try{o=await Promise.all(i.map(c=>{const n=Me.normalizeFileType(c);return new Promise((T,w)=>{const M=new FileReader;M.onload=()=>{if(typeof M.result!="string"){w(new Error(`Failed to read file "${n.name}"`));return}T({type:"file",url:M.result,mediaType:n.type,filename:n.name})},M.onerror=()=>w(new Error(`Failed to read file "${n.name}"`)),M.readAsDataURL(n)})}))}catch{Y({title:"Failed to attach files",message:"Could not read one or more files. Please try again."});return}r=[...o,...l],a=e.trim()?{parts:[{type:"text",text:e},...r]}:{parts:r}}else if(i.length>0){const o=new DataTransfer;for(const n of i)o.items.add(Me.normalizeFileType(n));const c=o.files;a=e.trim()?{text:e,files:c}:{files:c}}else a={text:e};G.current={content:e,body:{conversationId:s},files:r},V(a,{body:{conversationId:s}})},Je=t.useCallback(e=>{v.current=0,H.current=e,W(!1),J(e)},[J]),te=t.useCallback(()=>{W(!0),P().then(()=>{k("aborted",{conversationId:u})})},[P,u,k]),Te=()=>{He(),p([]),h(""),d(),C.current=S?.length?S:void 0,g({eventName:"chat_clear_button_clicked",properties:{conversationId:u}})},b=t.useCallback((e,i)=>{A(null),p(i),h(e),d(),C.current=void 0},[p,h,d]),we=t.useCallback(async(e,i)=>{te(),b(e,[]),ye(!0);try{const s=await ve(e,i);if(s===null)return!1;const a=s[s.length-1]?.role==="user"?[...s,{id:L.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 b(e,a),!0}finally{i?.aborted||ye(!1)}},[b,ve,te]);rt.useInitialConversation({conversationId:y.conversationId,effectiveAuthToken:le,loadAndRestoreSession:we,onLoadFailed:()=>b("",[])});const{openForm:Qe}=at.useChatForm(),We=ot.useWidget();return t.useImperativeHandle(y.chatFunctionsRef,()=>({submitMessage:ee,updateInputMessage(e){E(e)},clearChat:Te,openForm:e=>{We?.setView("chat"),Qe(e,void 0)},focusInput:()=>{be.current?.focus()}})),{messages:I,sendMessage:V,addToolApprovalResponse:Je,isLoading:Ce,isStreaming:Ie,isBusy:Ae,error:Ge,setError:A,isSubmitDisabled:Z,input:R,handleInputChange:Fe,handleInputKeyDown:Ve,handleSubmit:ee,stop:te,clear:Te,inputRef:be,isMobile:ze,files:x,setFiles:j,isNewChat:Be,conversationId:u,restoreSession:b,loadAndRestoreSession:we,isSessionLoading:Le,authToken:m?ae:ce,refreshSession:m?ie:ue,getCaptchaHeader:F,invalidateCaptcha:d,inputNotification:Ke,showInputNotification:Y,clearInputNotification:je}};exports.useInkeepChat=lt;
@@ -2,12 +2,11 @@ import { KeyboardEvent, Dispatch, SetStateAction, RefObject } from 'react';
2
2
  import { FileUIPart, ChatRequestOptions } from 'ai';
3
3
  import { Message } from '../../../types/index.ts';
4
4
  import { InputNotification } from '../../hooks/use-input-notification';
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.";
6
5
  export declare const useInkeepChat: () => {
7
6
  messages: Message[];
8
7
  sendMessage: (message?: (Omit<Message, "id" | "role"> & {
9
8
  id?: string | undefined;
10
- role?: "system" | "user" | "assistant" | undefined;
9
+ role?: "user" | "system" | "assistant" | undefined;
11
10
  } & {
12
11
  text?: never;
13
12
  files?: never;