@object-ui/plugin-chatbot 4.0.4 → 4.0.6

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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,61 @@
1
1
  # @object-ui/plugin-chatbot
2
2
 
3
+ ## 4.0.6
4
+
5
+ ### Patch Changes
6
+
7
+ - 1b6dc64: fix: complete Tailwind v3→v4 migration cleanup
8
+ - Rename deprecated `flex-shrink-0` → `shrink-0` and `flex-grow-N` →
9
+ `grow-N` (Tailwind v4 dropped the long-form aliases). Affects
10
+ data-table, fields/index, FileField, ChatbotEnhanced,
11
+ FloatingChatbotPanel, ProcessDesigner, HistoryPanel, KanbanEnhanced,
12
+ KanbanImpl, plugin-timeline index, FlowDesigner, LayoutRenderer.
13
+ - Replace `theme(spacing.4)` inside arbitrary-value `[calc(...)]` with
14
+ literal `1rem` in sidebar.tsx — `theme()` is deprecated in v4.
15
+ - Remove obsolete v3-escape CSS overrides from index.css and
16
+ sidebar-fixes.css. The component source now uses native v4 stacked
17
+ data variants (`group-data-[state=collapsed]:group-data-[collapsible=icon]:w-(--sidebar-width-icon)`)
18
+ which Tailwind v4 emits correctly without the manual overrides.
19
+ Only the bespoke `.sidebar-menu-button-icon-mode*` rules are kept.
20
+
21
+ - Updated dependencies [925051d]
22
+ - Updated dependencies [1b6dc64]
23
+ - @object-ui/components@4.0.6
24
+ - @object-ui/types@4.0.6
25
+ - @object-ui/core@4.0.6
26
+ - @object-ui/react@4.0.6
27
+
28
+ ## 4.0.5
29
+
30
+ ### Patch Changes
31
+
32
+ - 1dc6061: fix(build): inline dynamic imports in library outputs
33
+
34
+ Library `vite build --lib` outputs were emitting separate code-split chunks
35
+ (`rolldown-runtime-*.js`, `LookupField-*.js`, etc.) when source files used
36
+ `React.lazy()` / dynamic `import()`. When consumer apps re-bundled these
37
+ multi-file dists, the library's per-chunk rolldown-runtime collided with the
38
+ consumer's own runtime, causing "TypeError: i is not a function" at runtime
39
+ when lazy components tried to register themselves (e.g. TextField in
40
+ `@object-ui/fields` after 4.0.4).
41
+
42
+ Adding `output.inlineDynamicImports: true` to all `@object-ui/*` library vite
43
+ configs forces a single `dist/index.js` per package, which lets consumer
44
+ bundlers handle the library as an opaque ESM module without identifier
45
+ mismatches across chunks.
46
+
47
+ Affected packages: components, fields, layout, plugin-aggrid, plugin-ai,
48
+ plugin-calendar, plugin-charts, plugin-chatbot, plugin-dashboard,
49
+ plugin-designer, plugin-detail, plugin-editor, plugin-form, plugin-gantt,
50
+ plugin-grid, plugin-kanban, plugin-list, plugin-map, plugin-markdown,
51
+ plugin-report, plugin-timeline, plugin-view, plugin-workflow.
52
+
53
+ - Updated dependencies [1dc6061]
54
+ - @object-ui/components@4.0.5
55
+ - @object-ui/types@4.0.5
56
+ - @object-ui/core@4.0.5
57
+ - @object-ui/react@4.0.5
58
+
3
59
  ## 4.0.4
4
60
 
5
61
  ### Patch Changes
package/dist/index.js CHANGED
@@ -271,7 +271,7 @@ function U({ title: e = "Chat", position: t = "bottom-right", width: n = 400, he
271
271
  className: "flex items-center justify-between gap-2 px-4 py-2 border-b bg-muted/40",
272
272
  children: [
273
273
  /* @__PURE__ */ w("span", {
274
- className: "text-sm font-medium truncate flex-shrink-0",
274
+ className: "text-sm font-medium truncate shrink-0",
275
275
  children: e
276
276
  }),
277
277
  o ? /* @__PURE__ */ w("div", {
@@ -280,7 +280,7 @@ function U({ title: e = "Chat", position: t = "bottom-right", width: n = 400, he
280
280
  children: o
281
281
  }) : null,
282
282
  /* @__PURE__ */ T("div", {
283
- className: "flex items-center gap-1 flex-shrink-0",
283
+ className: "flex items-center gap-1 shrink-0",
284
284
  children: [/* @__PURE__ */ w(l, {
285
285
  variant: "ghost",
286
286
  size: "icon",
@@ -441,7 +441,7 @@ var G = e.forwardRef(({ className: t, messages: n = [], placeholder: r = "Type y
441
441
  className: f("flex gap-3", e.role === "user" ? "justify-end" : "justify-start"),
442
442
  children: [
443
443
  e.role !== "user" && /* @__PURE__ */ T(o, {
444
- className: "h-8 w-8 flex-shrink-0",
444
+ className: "h-8 w-8 shrink-0",
445
445
  children: [/* @__PURE__ */ w(c, { src: e.avatar || j }), /* @__PURE__ */ w(s, { children: e.avatarFallback || M })]
446
446
  }),
447
447
  /* @__PURE__ */ T("div", {
@@ -475,7 +475,7 @@ var G = e.forwardRef(({ className: t, messages: n = [], placeholder: r = "Type y
475
475
  ]
476
476
  }),
477
477
  e.role === "user" && /* @__PURE__ */ T(o, {
478
- className: "h-8 w-8 flex-shrink-0",
478
+ className: "h-8 w-8 shrink-0",
479
479
  children: [/* @__PURE__ */ w(c, { src: e.avatar || k }), /* @__PURE__ */ w(s, { children: e.avatarFallback || A })]
480
480
  })
481
481
  ]
@@ -509,7 +509,7 @@ var G = e.forwardRef(({ className: t, messages: n = [], placeholder: r = "Type y
509
509
  className: "flex items-center gap-2 px-4 py-2 border-t bg-destructive/10 text-destructive text-sm",
510
510
  role: "alert",
511
511
  children: [
512
- /* @__PURE__ */ w(p, { className: "h-4 w-4 flex-shrink-0" }),
512
+ /* @__PURE__ */ w(p, { className: "h-4 w-4 shrink-0" }),
513
513
  /* @__PURE__ */ w("span", {
514
514
  className: "flex-1 truncate",
515
515
  children: D.message || "An error occurred"
@@ -1 +1 @@
1
- (function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports,require(`react`),require(`@object-ui/components`),require(`lucide-react`),require(`react/jsx-runtime`),require(`@ai-sdk/react`),require(`ai`),require(`react-dom`),require(`react-markdown`),require(`react-syntax-highlighter`),require(`react-syntax-highlighter/dist/esm/styles/prism`),require(`remark-gfm`),require(`@object-ui/core`)):typeof define==`function`&&define.amd?define([`exports`,`react`,`@object-ui/components`,`lucide-react`,`react/jsx-runtime`,`@ai-sdk/react`,`ai`,`react-dom`,`react-markdown`,`react-syntax-highlighter`,`react-syntax-highlighter/dist/esm/styles/prism`,`remark-gfm`,`@object-ui/core`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.ObjectUIPluginChatbot={},e.React,e.ObjectUIComponents,e.LucideReact,e.react_jsx_runtime,e._ai_sdk_react,e.ai,e.ReactDOM,e.react_markdown,e.react_syntax_highlighter,e.react_syntax_highlighter_dist_esm_styles_prism,e.remark_gfm,e.ObjectUICore))})(this,function(e,t,n,r,i,a,o,s,c,l,u,d,f){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var p=Object.create,m=Object.defineProperty,h=Object.getOwnPropertyDescriptor,g=Object.getOwnPropertyNames,_=Object.getPrototypeOf,v=Object.prototype.hasOwnProperty,y=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var i=g(t),a=0,o=i.length,s;a<o;a++)s=i[a],!v.call(e,s)&&s!==n&&m(e,s,{get:(e=>t[e]).bind(null,s),enumerable:!(r=h(t,s))||r.enumerable});return e},b=(e,t,n)=>(n=e==null?{}:p(_(e)),y(t||!e||!e.__esModule?m(n,`default`,{value:e,enumerable:!0}):n,e));t=b(t,1),s=b(s,1),c=b(c,1),d=b(d,1);function x(e=`msg`){return typeof crypto<`u`&&crypto.randomUUID?crypto.randomUUID():`${e}-${Date.now()}-${Math.random().toString(36).slice(2)}`}function S(e){return(e??[]).map((e,t)=>({id:e.id||`msg-${t}`,role:e.role||`user`,content:e.content||``,timestamp:typeof e.timestamp==`string`?e.timestamp:e.timestamp instanceof Date?e.timestamp.toISOString():void 0,metadata:e.metadata,streaming:e.streaming,toolInvocations:e.toolInvocations}))}function C(e={}){let{api:n,initialMessages:r,conversationId:i,systemPrompt:s,model:c,streamingEnabled:l=!0,headers:u,body:d,maxToolRoundtrips:f=5,onError:p,showTimestamp:m,autoResponse:h,autoResponseText:g,autoResponseDelay:_=1e3,onSend:v}=e,y=(0,t.useRef)(n?`api`:`local`).current===`api`,b=(0,t.useMemo)(()=>S(r).map(e=>({id:e.id,role:e.role,parts:[{type:`text`,text:e.content??``}]})),[]),C=(0,a.useChat)({transport:(0,t.useMemo)(()=>{if(y)return new o.DefaultChatTransport({api:n,headers:{...u},body:{...d,...i?{conversationId:i}:{},...c?{model:c}:{},...s?{systemPrompt:s}:{},...l===void 0?{}:{stream:l}}})},[y,n,u,d,c,s,l,i]),messages:y&&b.length>0?b:void 0,onError:y?e=>{p?.(e)}:void 0}),[w,T]=(0,t.useState)(()=>S(r)),[E,D]=(0,t.useState)(!1),[O,k]=(0,t.useState)(``),[A,j]=(0,t.useState)(``),M=(0,t.useRef)(null);if((0,t.useEffect)(()=>()=>{M.current&&=(clearTimeout(M.current),null)},[]),y){let{messages:e,status:n,error:r,sendMessage:i,regenerate:a,stop:o,setMessages:s}=C,c=n===`submitted`||n===`streaming`,l=e.map(t=>{let n=typeof t.content==`string`?t.content:Array.isArray(t.parts)?t.parts.filter(e=>e?.type===`text`).map(e=>e.text??``).join(``):``;return{id:t.id,role:t.role,content:n,toolInvocations:t.toolInvocations,streaming:c&&t.id===e[e.length-1]?.id&&t.role===`assistant`}});return{messages:l,isLoading:c,error:r,sendMessage:(0,t.useCallback)(e=>{let t=e.trim();if(!t)return;let n=[...l,{id:x(`msg`),role:`user`,content:t}];i({text:t}),j(``),v?.(t,n)},[i,v,l]),stop:o,reload:a,clear:(0,t.useCallback)(()=>{s([])},[s]),isApiMode:!0,input:A,setInput:j,handleInputChange:(0,t.useCallback)(e=>{j(e.target.value)},[])}}let N=(0,t.useCallback)(()=>{M.current&&=(clearTimeout(M.current),null),D(!1)},[]);return{messages:w,isLoading:E,error:void 0,sendMessage:(0,t.useCallback)(e=>{if(!e.trim())return;let t={id:x(`msg`),role:`user`,content:e.trim(),timestamp:m?new Date().toLocaleTimeString():void 0};T(n=>{let r=[...n,t];return v?.(e.trim(),r),r}),k(``),h&&(D(!0),M.current=setTimeout(()=>{let e={id:x(`msg`),role:`assistant`,content:g||`Thank you for your message!`,timestamp:m?new Date().toLocaleTimeString():void 0};T(t=>[...t,e]),D(!1)},_))},[m,h,g,_,v]),stop:N,reload:(0,t.useCallback)(()=>{},[]),clear:(0,t.useCallback)(()=>{N(),T([])},[N]),isApiMode:!1,input:O,setInput:k,handleInputChange:(0,t.useCallback)(e=>{k(e.target.value)},[])}}function w(e){return e.filter(e=>typeof e?.name==`string`&&e.name.length>0).map(e=>({name:e.name,label:e.label||e.name,description:e.description,role:e.role,active:e.active!==!1}))}function T(e={}){let{apiBase:n,headers:r,enabled:i=!0,fallback:a=[]}=e,[o,s]=(0,t.useState)(a),[c,l]=(0,t.useState)(!1),[u,d]=(0,t.useState)(void 0),[f,p]=(0,t.useState)(0),m=(0,t.useRef)(r);return m.current=r,(0,t.useEffect)(()=>{if(!i||!n)return;let e=new AbortController,t=!1;l(!0),d(void 0);let r=`${n.replace(/\/$/,``)}/agents`;return fetch(r,{method:`GET`,headers:{Accept:`application/json`,...m.current??{}},credentials:`include`,signal:e.signal}).then(async e=>{if(!e.ok)throw Error(`Failed to load agents (${e.status})`);return e.json()}).then(e=>{if(t)return;let n=w(Array.isArray(e)?e:e?.agents??[]);s(n.length>0?n:a)}).catch(e=>{t||e.name===`AbortError`||(d(e),s(a))}).finally(()=>{t||l(!1)}),()=>{t=!0,e.abort()}},[n,i,f]),{agents:o,isLoading:c,error:u,refetch:(0,t.useCallback)(()=>p(e=>e+1),[])}}var E=t.createContext(null);function D({defaultOpen:e=!1,children:n}){let[r,a]=t.useState(e),[o,s]=t.useState(!1),c=t.useMemo(()=>({isOpen:r,isFullscreen:o,open:()=>a(!0),close:()=>{a(!1),s(!1)},toggle:()=>a(e=>!e),toggleFullscreen:()=>s(e=>!e)}),[r,o]);return(0,i.jsx)(E.Provider,{value:c,children:n})}function O(){let e=t.useContext(E);if(!e)throw Error(`useFloatingChatbot must be used within a <FloatingChatbotProvider>`);return e}function k({position:e=`bottom-right`,size:t=56,className:a}){let{isOpen:o,toggle:s}=O();return(0,i.jsx)(n.Button,{onClick:s,className:(0,n.cn)(`fixed z-50 rounded-full shadow-lg transition-transform hover:scale-105`,e===`bottom-right`?`right-6 bottom-6`:`left-6 bottom-6`,a),style:{width:t,height:t},size:`icon`,"aria-label":o?`Close chat`:`Open chat`,"data-testid":`floating-chatbot-trigger`,children:o?(0,i.jsx)(r.X,{className:`h-6 w-6`}):(0,i.jsx)(r.MessageCircle,{className:`h-6 w-6`})})}function A({title:e=`Chat`,position:t=`bottom-right`,width:a=400,height:o=520,children:s,className:c,headerExtra:l}){let{isOpen:u,isFullscreen:d,close:f,toggleFullscreen:p}=O();if(!u)return null;let m=d?{inset:0,width:`100vw`,height:`100vh`}:{width:a,height:o,maxHeight:`calc(100vh - 100px)`};return(0,i.jsxs)(`div`,{className:(0,n.cn)(`fixed z-50 flex flex-col rounded-lg border bg-background shadow-xl overflow-hidden transition-all`,d?`inset-0 rounded-none`:t===`bottom-right`?`right-6 bottom-20`:`left-6 bottom-20`,c),style:m,role:`dialog`,"aria-label":e,"data-testid":`floating-chatbot-panel`,children:[(0,i.jsxs)(`div`,{className:`flex items-center justify-between gap-2 px-4 py-2 border-b bg-muted/40`,children:[(0,i.jsx)(`span`,{className:`text-sm font-medium truncate flex-shrink-0`,children:e}),l?(0,i.jsx)(`div`,{className:`flex-1 min-w-0 flex items-center justify-end mr-1`,"data-testid":`floating-chatbot-header-extra`,children:l}):null,(0,i.jsxs)(`div`,{className:`flex items-center gap-1 flex-shrink-0`,children:[(0,i.jsx)(n.Button,{variant:`ghost`,size:`icon`,className:`h-7 w-7`,onClick:p,"aria-label":d?`Exit fullscreen`:`Fullscreen`,"data-testid":`floating-chatbot-fullscreen`,children:d?(0,i.jsx)(r.Minimize2,{className:`h-4 w-4`}):(0,i.jsx)(r.Maximize2,{className:`h-4 w-4`})}),(0,i.jsx)(n.Button,{variant:`ghost`,size:`icon`,className:`h-7 w-7`,onClick:f,"aria-label":`Close chat`,"data-testid":`floating-chatbot-close`,children:(0,i.jsx)(r.X,{className:`h-4 w-4`})})]})]}),(0,i.jsx)(`div`,{className:`flex-1 overflow-hidden`,children:s})]})}function j({content:e,enableMarkdown:t}){return t?(0,i.jsx)(`div`,{className:`prose prose-sm dark:prose-invert max-w-none`,children:(0,i.jsx)(c.default,{remarkPlugins:[d.default],components:{code({node:e,inline:t,className:r,children:a,...o}){let s=/language-(\w+)/.exec(r||``);return!t&&s?(0,i.jsx)(l.Prism,{style:u.oneDark,language:s[1],PreTag:`div`,className:`rounded-md my-2`,...o,children:String(a).replace(/\n$/,``)}):(0,i.jsx)(`code`,{className:(0,n.cn)(`bg-muted px-1 py-0.5 rounded text-sm`,r),...o,children:a})},p:({children:e})=>(0,i.jsx)(`p`,{className:`mb-2 last:mb-0`,children:e}),ul:({children:e})=>(0,i.jsx)(`ul`,{className:`list-disc pl-4 mb-2`,children:e}),ol:({children:e})=>(0,i.jsx)(`ol`,{className:`list-decimal pl-4 mb-2`,children:e}),li:({children:e})=>(0,i.jsx)(`li`,{className:`mb-1`,children:e}),a:({href:e,children:t})=>(0,i.jsx)(`a`,{href:e,className:`text-primary hover:underline`,target:`_blank`,rel:`noopener noreferrer`,children:t}),blockquote:({children:e})=>(0,i.jsx)(`blockquote`,{className:`border-l-4 border-primary pl-4 italic my-2 text-muted-foreground`,children:e}),table:({children:e})=>(0,i.jsx)(`div`,{className:`overflow-x-auto my-2`,children:(0,i.jsx)(`table`,{className:`min-w-full divide-y divide-border`,children:e})}),th:({children:e})=>(0,i.jsx)(`th`,{className:`px-3 py-2 text-left text-xs font-medium uppercase tracking-wider bg-muted`,children:e}),td:({children:e})=>(0,i.jsx)(`td`,{className:`px-3 py-2 text-sm border-t border-border`,children:e})},children:e})}):(0,i.jsx)(`div`,{className:`whitespace-pre-wrap`,children:e})}var M=t.forwardRef(({className:e,messages:a=[],placeholder:o=`Type your message...`,onSendMessage:s,onClear:c,onStop:l,onReload:u,disabled:d=!1,isLoading:f=!1,error:p,showTimestamp:m=!1,userAvatarUrl:h,userAvatarFallback:g=`You`,assistantAvatarUrl:_,assistantAvatarFallback:v=`AI`,maxHeight:y=`500px`,enableMarkdown:b=!0,enableFileUpload:x=!1,acceptedFileTypes:S=`image/*,.pdf,.doc,.docx,.txt`,maxFileSize:C=10*1024*1024,...w},T)=>{let[E,D]=t.useState(``),[O,k]=t.useState([]),A=t.useRef(null),M=t.useRef(null),N=t.useRef(null);t.useEffect(()=>{if(A.current){let e=A.current.querySelector(`[data-radix-scroll-area-viewport]`);e&&(e.scrollTop=e.scrollHeight)}},[a]);let P=()=>{(E.trim()||O.length>0)&&s&&(s(E.trim(),O),D(``),k([]),M.current?.focus())},F=d||f,I=F||!E.trim()&&O.length===0,L=e=>{e.key===`Enter`&&!e.shiftKey&&(e.preventDefault(),P())},R=e=>{let t=Array.from(e.target.files||[]),n=t.filter(e=>e.size>C?(console.warn(`File ${e.name} exceeds ${C/1024/1024}MB limit`),!1):S.split(`,`).map(e=>e.trim()).some(t=>{if(t.startsWith(`.`))return e.name.toLowerCase().endsWith(t.toLowerCase());if(t.endsWith(`/*`)){let n=t.split(`/`)[0];return e.type.startsWith(n+`/`)}return e.type===t})?!0:(console.warn(`File ${e.name} type ${e.type} not accepted`),!1));n.length<t.length&&console.warn(`${t.length-n.length} file(s) were rejected`),k(e=>[...e,...n])},z=e=>{k(t=>t.filter((t,n)=>n!==e))},B=()=>{c&&c()};return(0,i.jsxs)(`div`,{ref:T,className:(0,n.cn)(`flex flex-col border rounded-lg bg-background overflow-hidden`,e),style:{maxHeight:y},...w,children:[c&&a.length>0&&(0,i.jsxs)(`div`,{className:`flex items-center justify-between px-4 py-2 border-b bg-muted/30`,children:[(0,i.jsxs)(`span`,{className:`text-sm text-muted-foreground`,children:[a.length,` message`,a.length===1?``:`s`]}),(0,i.jsxs)(n.Button,{variant:`ghost`,size:`sm`,onClick:B,className:`h-8 text-xs`,children:[(0,i.jsx)(r.Trash2,{className:`h-3 w-3 mr-1`}),`Clear`]})]}),(0,i.jsx)(n.ScrollArea,{ref:A,className:`flex-1 p-4`,children:(0,i.jsx)(`div`,{className:`space-y-4`,children:a.length===0?(0,i.jsx)(`div`,{className:`flex items-center justify-center h-32 text-muted-foreground text-sm`,children:`Start a conversation...`}):a.map(e=>(0,i.jsxs)(`div`,{className:(0,n.cn)(`flex gap-3`,e.role===`user`?`justify-end`:`justify-start`),children:[e.role!==`user`&&(0,i.jsxs)(n.Avatar,{className:`h-8 w-8 flex-shrink-0`,children:[(0,i.jsx)(n.AvatarImage,{src:e.avatar||_}),(0,i.jsx)(n.AvatarFallback,{children:e.avatarFallback||v})]}),(0,i.jsxs)(`div`,{className:(0,n.cn)(`rounded-lg px-4 py-2 max-w-[80%]`,e.role===`user`?`bg-primary text-primary-foreground`:`bg-muted`),children:[(0,i.jsx)(j,{content:e.content,enableMarkdown:b}),m&&e.timestamp&&(0,i.jsx)(`div`,{className:`text-xs opacity-70 mt-1`,children:e.timestamp}),e.streaming&&(0,i.jsxs)(`div`,{className:`flex gap-1 mt-2`,children:[(0,i.jsx)(`div`,{className:`w-2 h-2 bg-current rounded-full animate-bounce`,style:{animationDelay:`0ms`}}),(0,i.jsx)(`div`,{className:`w-2 h-2 bg-current rounded-full animate-bounce`,style:{animationDelay:`150ms`}}),(0,i.jsx)(`div`,{className:`w-2 h-2 bg-current rounded-full animate-bounce`,style:{animationDelay:`300ms`}})]})]}),e.role===`user`&&(0,i.jsxs)(n.Avatar,{className:`h-8 w-8 flex-shrink-0`,children:[(0,i.jsx)(n.AvatarImage,{src:e.avatar||h}),(0,i.jsx)(n.AvatarFallback,{children:e.avatarFallback||g})]})]},e.id))})}),O.length>0&&(0,i.jsx)(`div`,{className:`px-4 py-2 border-t bg-muted/30`,children:(0,i.jsx)(`div`,{className:`flex flex-wrap gap-2`,children:O.map((e,t)=>(0,i.jsxs)(`div`,{className:`flex items-center gap-2 bg-background border rounded px-2 py-1 text-xs`,children:[(0,i.jsx)(r.Paperclip,{className:`h-3 w-3`}),(0,i.jsx)(`span`,{className:`max-w-[150px] truncate`,children:e.name}),(0,i.jsx)(n.Button,{variant:`ghost`,size:`sm`,className:`h-4 w-4 p-0`,onClick:()=>z(t),children:(0,i.jsx)(r.X,{className:`h-3 w-3`})})]},t))})}),p&&(0,i.jsxs)(`div`,{className:`flex items-center gap-2 px-4 py-2 border-t bg-destructive/10 text-destructive text-sm`,role:`alert`,children:[(0,i.jsx)(r.AlertCircle,{className:`h-4 w-4 flex-shrink-0`}),(0,i.jsx)(`span`,{className:`flex-1 truncate`,children:p.message||`An error occurred`}),u&&(0,i.jsxs)(n.Button,{variant:`ghost`,size:`sm`,onClick:u,className:`h-7 text-xs`,"aria-label":`Retry`,children:[(0,i.jsx)(r.RefreshCw,{className:`h-3 w-3 mr-1`}),`Retry`]})]}),f&&l&&(0,i.jsx)(`div`,{className:`flex items-center justify-center px-4 py-2 border-t`,children:(0,i.jsxs)(n.Button,{variant:`outline`,size:`sm`,onClick:l,className:`h-8 text-xs`,"aria-label":`Stop generating`,children:[(0,i.jsx)(r.Square,{className:`h-3 w-3 mr-1`}),`Stop generating`]})}),(0,i.jsxs)(`div`,{className:`flex items-center gap-2 p-4 border-t`,children:[x&&(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(`input`,{ref:N,type:`file`,multiple:!0,accept:S,onChange:R,className:`hidden`}),(0,i.jsx)(n.Button,{variant:`ghost`,size:`icon`,onClick:()=>N.current?.click(),disabled:F,"aria-label":`Attach file`,children:(0,i.jsx)(r.Paperclip,{className:`h-4 w-4`})})]}),(0,i.jsx)(n.Input,{ref:M,value:E,onChange:e=>D(e.target.value),onKeyDown:L,placeholder:o,disabled:F,className:`flex-1`}),(0,i.jsx)(n.Button,{onClick:P,disabled:I,size:`icon`,"aria-label":`Send message`,children:(0,i.jsx)(r.Send,{className:`h-4 w-4`})})]})]})});M.displayName=`ChatbotEnhanced`;function N({floatingConfig:e,headerExtra:n,...r}){let{position:a=`bottom-right`,defaultOpen:o=!1,panelWidth:c=400,panelHeight:l=520,title:u=`Chat`,triggerSize:d=56}=e??{},[f,p]=t.useState(null);t.useEffect(()=>{let e=document.getElementById(`floating-chatbot-portal`);return e||(e=document.createElement(`div`),e.id=`floating-chatbot-portal`,document.body.appendChild(e)),p(e),()=>{e&&e.parentNode&&!e.hasChildNodes()&&e.parentNode.removeChild(e)}},[]);let m=(0,i.jsxs)(D,{defaultOpen:o,children:[(0,i.jsx)(k,{position:a,size:d}),(0,i.jsx)(A,{title:u,position:a,width:c,height:l,headerExtra:n,children:(0,i.jsx)(M,{...r,maxHeight:`100%`,className:`h-full border-0 rounded-none`})})]});return f?s.createPortal(m,f):m}f.ComponentRegistry.register(`chatbot`,({schema:e,className:t,...n})=>{let{messages:r,isLoading:a,sendMessage:o}=C({api:e.api,initialMessages:e.messages,conversationId:e.conversationId,systemPrompt:e.systemPrompt,model:e.model,streamingEnabled:e.streamingEnabled,headers:e.headers,body:e.requestBody,maxToolRoundtrips:e.maxToolRoundtrips,onError:e.onError,showTimestamp:e.showTimestamp,autoResponse:e.autoResponse,autoResponseText:e.autoResponseText,autoResponseDelay:e.autoResponseDelay,onSend:e.onSend});return(0,i.jsx)(P,{messages:r,placeholder:e.placeholder,onSendMessage:e=>{o(e)},disabled:e.disabled||a,showTimestamp:e.showTimestamp,userAvatarUrl:e.userAvatarUrl,userAvatarFallback:e.userAvatarFallback,assistantAvatarUrl:e.assistantAvatarUrl,assistantAvatarFallback:e.assistantAvatarFallback,maxHeight:e.maxHeight,className:t,...n})},{namespace:`plugin-chatbot`,label:`Chatbot`,inputs:[{name:`messages`,type:`array`,label:`Initial Messages`,description:`Array of message objects with id, role, content, and optional timestamp`},{name:`placeholder`,type:`string`,label:`Input Placeholder`,defaultValue:`Type your message...`},{name:`showTimestamp`,type:`boolean`,label:`Show Timestamps`,defaultValue:!1},{name:`disabled`,type:`boolean`,label:`Disabled`,defaultValue:!1},{name:`userAvatarUrl`,type:`string`,label:`User Avatar URL`,description:`URL of the user avatar image`},{name:`userAvatarFallback`,type:`string`,label:`User Avatar Fallback`,defaultValue:`You`,description:`Fallback text shown when user avatar image is not available`},{name:`assistantAvatarUrl`,type:`string`,label:`Assistant Avatar URL`,description:`URL of the assistant avatar image`},{name:`assistantAvatarFallback`,type:`string`,label:`Assistant Avatar Fallback`,defaultValue:`AI`,description:`Fallback text shown when assistant avatar image is not available`},{name:`maxHeight`,type:`string`,label:`Max Height`,defaultValue:`500px`},{name:`api`,type:`string`,label:`API Endpoint`,description:`Backend SSE endpoint (e.g., /api/v1/ai/chat). When set, enables streaming AI mode.`},{name:`conversationId`,type:`string`,label:`Conversation ID`,description:`Multi-turn conversation identifier`},{name:`systemPrompt`,type:`string`,label:`System Prompt`,description:`System prompt to configure assistant behavior`},{name:`model`,type:`string`,label:`AI Model`,description:`AI model identifier (e.g., gpt-4o)`},{name:`streamingEnabled`,type:`boolean`,label:`Enable Streaming`,defaultValue:!0},{name:`autoResponse`,type:`boolean`,label:`Enable Auto Response (Demo)`,defaultValue:!1,description:`Automatically send a response after user message (for demo purposes, ignored when API is set)`},{name:`autoResponseText`,type:`string`,label:`Auto Response Text`,defaultValue:`Thank you for your message!`},{name:`autoResponseDelay`,type:`number`,label:`Auto Response Delay (ms)`,defaultValue:1e3},{name:`className`,type:`string`,label:`CSS Class`}],defaultProps:{messages:[{id:`welcome`,role:`assistant`,content:`Hello! How can I help you today?`}],placeholder:`Type your message...`,showTimestamp:!1,disabled:!1,userAvatarFallback:`You`,assistantAvatarFallback:`AI`,maxHeight:`500px`,autoResponse:!0,autoResponseText:`Thank you for your message! This is an automated response.`,autoResponseDelay:1e3,className:`w-full max-w-2xl`}}),f.ComponentRegistry.register(`chatbot-enhanced`,({schema:e,className:t,...n})=>{let{messages:r,isLoading:a,error:o,sendMessage:s,stop:c,reload:l,clear:u,isApiMode:d}=C({api:e.api,initialMessages:e.messages,conversationId:e.conversationId,systemPrompt:e.systemPrompt,model:e.model,streamingEnabled:e.streamingEnabled,headers:e.headers,body:e.requestBody,maxToolRoundtrips:e.maxToolRoundtrips,onError:e.onError,showTimestamp:e.showTimestamp,autoResponse:e.autoResponse,autoResponseText:e.autoResponseText,autoResponseDelay:e.autoResponseDelay,onSend:e.onSend});return(0,i.jsx)(M,{messages:r,placeholder:e.placeholder,onSendMessage:(e,t)=>{s(e,t)},onClear:()=>{u(),e.onClear?.()},onStop:d&&a?c:void 0,onReload:d?l:void 0,disabled:e.disabled,isLoading:a,error:o,showTimestamp:e.showTimestamp,userAvatarUrl:e.userAvatarUrl,userAvatarFallback:e.userAvatarFallback,assistantAvatarUrl:e.assistantAvatarUrl,assistantAvatarFallback:e.assistantAvatarFallback,maxHeight:e.maxHeight,enableMarkdown:e.enableMarkdown??!0,enableFileUpload:e.enableFileUpload??!1,className:t,...n})},{namespace:`plugin-chatbot`,label:`Chatbot (Enhanced)`,inputs:[{name:`messages`,type:`array`,label:`Initial Messages`},{name:`placeholder`,type:`string`,label:`Input Placeholder`,defaultValue:`Type your message...`},{name:`showTimestamp`,type:`boolean`,label:`Show Timestamps`,defaultValue:!1},{name:`disabled`,type:`boolean`,label:`Disabled`,defaultValue:!1},{name:`enableMarkdown`,type:`boolean`,label:`Enable Markdown`,defaultValue:!0},{name:`enableFileUpload`,type:`boolean`,label:`Enable File Upload`,defaultValue:!1},{name:`userAvatarUrl`,type:`string`,label:`User Avatar URL`},{name:`userAvatarFallback`,type:`string`,label:`User Avatar Fallback`,defaultValue:`You`},{name:`assistantAvatarUrl`,type:`string`,label:`Assistant Avatar URL`},{name:`assistantAvatarFallback`,type:`string`,label:`Assistant Avatar Fallback`,defaultValue:`AI`},{name:`maxHeight`,type:`string`,label:`Max Height`,defaultValue:`500px`},{name:`api`,type:`string`,label:`API Endpoint`,description:`Backend SSE endpoint for streaming AI mode`},{name:`conversationId`,type:`string`,label:`Conversation ID`},{name:`systemPrompt`,type:`string`,label:`System Prompt`},{name:`model`,type:`string`,label:`AI Model`},{name:`streamingEnabled`,type:`boolean`,label:`Enable Streaming`,defaultValue:!0},{name:`autoResponse`,type:`boolean`,label:`Enable Auto Response (Demo)`,defaultValue:!1},{name:`autoResponseText`,type:`string`,label:`Auto Response Text`,defaultValue:`Thank you for your message!`},{name:`autoResponseDelay`,type:`number`,label:`Auto Response Delay (ms)`,defaultValue:1e3},{name:`className`,type:`string`,label:`CSS Class`}],defaultProps:{messages:[{id:`welcome`,role:`assistant`,content:`Hello! How can I help you today?`}],placeholder:`Type your message...`,showTimestamp:!1,disabled:!1,enableMarkdown:!0,enableFileUpload:!1,userAvatarFallback:`You`,assistantAvatarFallback:`AI`,maxHeight:`500px`,autoResponse:!0,autoResponseText:`Thank you for your message! This is an automated response.`,autoResponseDelay:1e3,className:`w-full max-w-2xl`}}),f.ComponentRegistry.register(`chatbot-floating`,({schema:e,className:t,...n})=>{let{messages:r,isLoading:a,error:o,sendMessage:s,stop:c,reload:l,clear:u,isApiMode:d}=C({api:e.api,initialMessages:e.messages,conversationId:e.conversationId,systemPrompt:e.systemPrompt,model:e.model,streamingEnabled:e.streamingEnabled,headers:e.headers,body:e.requestBody,maxToolRoundtrips:e.maxToolRoundtrips,onError:e.onError,showTimestamp:e.showTimestamp,autoResponse:e.autoResponse,autoResponseText:e.autoResponseText,autoResponseDelay:e.autoResponseDelay,onSend:e.onSend});return(0,i.jsx)(N,{floatingConfig:e.floatingConfig,messages:r,placeholder:e.placeholder,onSendMessage:(e,t)=>{s(e,t)},onClear:()=>{u(),e.onClear?.()},onStop:d&&a?c:void 0,onReload:d?l:void 0,disabled:e.disabled,isLoading:a,error:o,showTimestamp:e.showTimestamp,userAvatarUrl:e.userAvatarUrl,userAvatarFallback:e.userAvatarFallback,assistantAvatarUrl:e.assistantAvatarUrl,assistantAvatarFallback:e.assistantAvatarFallback,enableMarkdown:e.enableMarkdown??!0,enableFileUpload:e.enableFileUpload??!1,className:t,...n})},{namespace:`plugin-chatbot`,label:`Chatbot (Floating)`,inputs:[{name:`displayMode`,type:`string`,label:`Display Mode`,defaultValue:`floating`,description:`Set to "floating" for FAB widget`},{name:`floatingConfig.position`,type:`string`,label:`FAB Position`,defaultValue:`bottom-right`,description:`bottom-right or bottom-left`},{name:`floatingConfig.defaultOpen`,type:`boolean`,label:`Default Open`,defaultValue:!1},{name:`floatingConfig.panelWidth`,type:`number`,label:`Panel Width`,defaultValue:400},{name:`floatingConfig.panelHeight`,type:`number`,label:`Panel Height`,defaultValue:520},{name:`floatingConfig.title`,type:`string`,label:`Panel Title`,defaultValue:`Chat`},{name:`floatingConfig.triggerSize`,type:`number`,label:`Trigger Size`,defaultValue:56},{name:`messages`,type:`array`,label:`Initial Messages`},{name:`placeholder`,type:`string`,label:`Input Placeholder`,defaultValue:`Type your message...`},{name:`enableMarkdown`,type:`boolean`,label:`Enable Markdown`,defaultValue:!0},{name:`enableFileUpload`,type:`boolean`,label:`Enable File Upload`,defaultValue:!1},{name:`api`,type:`string`,label:`API Endpoint`,description:`Backend SSE endpoint for streaming AI mode`},{name:`conversationId`,type:`string`,label:`Conversation ID`},{name:`systemPrompt`,type:`string`,label:`System Prompt`},{name:`model`,type:`string`,label:`AI Model`},{name:`streamingEnabled`,type:`boolean`,label:`Enable Streaming`,defaultValue:!0},{name:`autoResponse`,type:`boolean`,label:`Enable Auto Response (Demo)`,defaultValue:!1},{name:`autoResponseText`,type:`string`,label:`Auto Response Text`,defaultValue:`Thank you for your message!`},{name:`autoResponseDelay`,type:`number`,label:`Auto Response Delay (ms)`,defaultValue:1e3},{name:`className`,type:`string`,label:`CSS Class`}],defaultProps:{displayMode:`floating`,floatingConfig:{position:`bottom-right`,defaultOpen:!1,panelWidth:400,panelHeight:520,title:`Chat`,triggerSize:56},messages:[{id:`welcome`,role:`assistant`,content:`Hello! How can I help you today?`}],placeholder:`Type your message...`,enableMarkdown:!0,enableFileUpload:!1,autoResponse:!0,autoResponseText:`Thank you for your message! This is an automated response.`,autoResponseDelay:1e3}});var P=t.forwardRef(({className:e,messages:a=[],placeholder:o=`Type your message...`,onSendMessage:s,disabled:c=!1,showTimestamp:l=!1,userAvatarUrl:u,userAvatarFallback:d=`You`,assistantAvatarUrl:f,assistantAvatarFallback:p=`AI`,maxHeight:m=`500px`,...h},g)=>{let[_,v]=t.useState(``),y=t.useRef(null),b=t.useRef(null);t.useEffect(()=>{if(y.current){let e=y.current.querySelector(`[data-radix-scroll-area-viewport]`);e&&(e.scrollTop=e.scrollHeight)}},[a]);let x=()=>{_.trim()&&s&&(s(_.trim()),v(``),b.current?.focus())},S=e=>{e.key===`Enter`&&!e.shiftKey&&(e.preventDefault(),x())};return(0,i.jsxs)(`div`,{ref:g,className:(0,n.cn)(`flex flex-col border rounded-lg bg-background overflow-hidden`,e),style:{maxHeight:m},...h,children:[(0,i.jsx)(n.ScrollArea,{ref:y,className:`flex-1 p-4`,children:(0,i.jsx)(`div`,{className:`space-y-4`,children:a.length===0?(0,i.jsx)(`div`,{className:`flex items-center justify-center h-32 text-muted-foreground text-sm`,children:`No messages yet. Start a conversation!`}):a.map(e=>(0,i.jsx)(F,{message:e,showTimestamp:l,userAvatarUrl:u,userAvatarFallback:d,assistantAvatarUrl:f,assistantAvatarFallback:p},e.id))})}),(0,i.jsx)(`div`,{className:`border-t p-4`,children:(0,i.jsxs)(`div`,{className:`flex gap-2`,children:[(0,i.jsx)(n.Input,{ref:b,value:_,onChange:e=>v(e.target.value),onKeyDown:S,placeholder:o,disabled:c,className:`flex-1`}),(0,i.jsx)(n.Button,{onClick:x,disabled:c||!_.trim(),size:`icon`,children:(0,i.jsx)(r.Send,{className:`h-4 w-4`})})]})})]})});P.displayName=`Chatbot`;var F=({message:e,showTimestamp:t,userAvatarUrl:r,userAvatarFallback:a,assistantAvatarUrl:o,assistantAvatarFallback:s})=>{let c=e.role===`user`;if(e.role===`system`)return(0,i.jsx)(`div`,{className:`flex justify-center`,children:(0,i.jsx)(`div`,{className:`text-xs text-muted-foreground bg-muted px-3 py-1 rounded-full`,children:e.content})});let l=c?e.avatar||r:e.avatar||o,u=c?e.avatarFallback||a:e.avatarFallback||s;return(0,i.jsxs)(`div`,{className:(0,n.cn)(`flex gap-3`,c?`flex-row-reverse`:`flex-row`),children:[(0,i.jsxs)(n.Avatar,{className:`h-8 w-8`,children:[(0,i.jsx)(n.AvatarImage,{src:l}),(0,i.jsx)(n.AvatarFallback,{className:`text-xs`,children:u})]}),(0,i.jsxs)(`div`,{className:(0,n.cn)(`flex flex-col gap-1`,c?`items-end`:`items-start`),children:[(0,i.jsx)(`div`,{className:(0,n.cn)(`rounded-lg px-4 py-2 max-w-[70%] break-words`,c?`bg-primary text-primary-foreground`:`bg-muted`),children:(0,i.jsx)(`p`,{className:`text-sm whitespace-pre-wrap`,children:e.content})}),t&&e.timestamp&&(0,i.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:e.timestamp})]})]})},I=t.forwardRef(({className:e,avatarSrc:t,avatarFallback:r=`AI`,...a},o)=>(0,i.jsxs)(`div`,{ref:o,className:(0,n.cn)(`flex gap-3`,e),...a,children:[(0,i.jsxs)(n.Avatar,{className:`h-8 w-8`,children:[(0,i.jsx)(n.AvatarImage,{src:t}),(0,i.jsx)(n.AvatarFallback,{className:`text-xs`,children:r})]}),(0,i.jsx)(`div`,{className:`flex items-center bg-muted rounded-lg px-4 py-2`,children:(0,i.jsxs)(`div`,{className:`flex gap-1`,children:[(0,i.jsx)(`span`,{className:`w-2 h-2 bg-muted-foreground rounded-full animate-bounce [animation-delay:-0.3s]`}),(0,i.jsx)(`span`,{className:`w-2 h-2 bg-muted-foreground rounded-full animate-bounce [animation-delay:-0.15s]`}),(0,i.jsx)(`span`,{className:`w-2 h-2 bg-muted-foreground rounded-full animate-bounce`})]})})]}));I.displayName=`TypingIndicator`,e.Chatbot=P,e.FloatingChatbot=N,e.FloatingChatbotPanel=A,e.FloatingChatbotProvider=D,e.FloatingChatbotTrigger=k,e.TypingIndicator=I,e.useAgents=T,e.useFloatingChatbot=O,e.useObjectChat=C});
1
+ (function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports,require(`react`),require(`@object-ui/components`),require(`lucide-react`),require(`react/jsx-runtime`),require(`@ai-sdk/react`),require(`ai`),require(`react-dom`),require(`react-markdown`),require(`react-syntax-highlighter`),require(`react-syntax-highlighter/dist/esm/styles/prism`),require(`remark-gfm`),require(`@object-ui/core`)):typeof define==`function`&&define.amd?define([`exports`,`react`,`@object-ui/components`,`lucide-react`,`react/jsx-runtime`,`@ai-sdk/react`,`ai`,`react-dom`,`react-markdown`,`react-syntax-highlighter`,`react-syntax-highlighter/dist/esm/styles/prism`,`remark-gfm`,`@object-ui/core`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.ObjectUIPluginChatbot={},e.React,e.ObjectUIComponents,e.LucideReact,e.react_jsx_runtime,e._ai_sdk_react,e.ai,e.ReactDOM,e.react_markdown,e.react_syntax_highlighter,e.react_syntax_highlighter_dist_esm_styles_prism,e.remark_gfm,e.ObjectUICore))})(this,function(e,t,n,r,i,a,o,s,c,l,u,d,f){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var p=Object.create,m=Object.defineProperty,h=Object.getOwnPropertyDescriptor,g=Object.getOwnPropertyNames,_=Object.getPrototypeOf,v=Object.prototype.hasOwnProperty,y=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var i=g(t),a=0,o=i.length,s;a<o;a++)s=i[a],!v.call(e,s)&&s!==n&&m(e,s,{get:(e=>t[e]).bind(null,s),enumerable:!(r=h(t,s))||r.enumerable});return e},b=(e,t,n)=>(n=e==null?{}:p(_(e)),y(t||!e||!e.__esModule?m(n,`default`,{value:e,enumerable:!0}):n,e));t=b(t,1),s=b(s,1),c=b(c,1),d=b(d,1);function x(e=`msg`){return typeof crypto<`u`&&crypto.randomUUID?crypto.randomUUID():`${e}-${Date.now()}-${Math.random().toString(36).slice(2)}`}function S(e){return(e??[]).map((e,t)=>({id:e.id||`msg-${t}`,role:e.role||`user`,content:e.content||``,timestamp:typeof e.timestamp==`string`?e.timestamp:e.timestamp instanceof Date?e.timestamp.toISOString():void 0,metadata:e.metadata,streaming:e.streaming,toolInvocations:e.toolInvocations}))}function C(e={}){let{api:n,initialMessages:r,conversationId:i,systemPrompt:s,model:c,streamingEnabled:l=!0,headers:u,body:d,maxToolRoundtrips:f=5,onError:p,showTimestamp:m,autoResponse:h,autoResponseText:g,autoResponseDelay:_=1e3,onSend:v}=e,y=(0,t.useRef)(n?`api`:`local`).current===`api`,b=(0,t.useMemo)(()=>S(r).map(e=>({id:e.id,role:e.role,parts:[{type:`text`,text:e.content??``}]})),[]),C=(0,a.useChat)({transport:(0,t.useMemo)(()=>{if(y)return new o.DefaultChatTransport({api:n,headers:{...u},body:{...d,...i?{conversationId:i}:{},...c?{model:c}:{},...s?{systemPrompt:s}:{},...l===void 0?{}:{stream:l}}})},[y,n,u,d,c,s,l,i]),messages:y&&b.length>0?b:void 0,onError:y?e=>{p?.(e)}:void 0}),[w,T]=(0,t.useState)(()=>S(r)),[E,D]=(0,t.useState)(!1),[O,k]=(0,t.useState)(``),[A,j]=(0,t.useState)(``),M=(0,t.useRef)(null);if((0,t.useEffect)(()=>()=>{M.current&&=(clearTimeout(M.current),null)},[]),y){let{messages:e,status:n,error:r,sendMessage:i,regenerate:a,stop:o,setMessages:s}=C,c=n===`submitted`||n===`streaming`,l=e.map(t=>{let n=typeof t.content==`string`?t.content:Array.isArray(t.parts)?t.parts.filter(e=>e?.type===`text`).map(e=>e.text??``).join(``):``;return{id:t.id,role:t.role,content:n,toolInvocations:t.toolInvocations,streaming:c&&t.id===e[e.length-1]?.id&&t.role===`assistant`}});return{messages:l,isLoading:c,error:r,sendMessage:(0,t.useCallback)(e=>{let t=e.trim();if(!t)return;let n=[...l,{id:x(`msg`),role:`user`,content:t}];i({text:t}),j(``),v?.(t,n)},[i,v,l]),stop:o,reload:a,clear:(0,t.useCallback)(()=>{s([])},[s]),isApiMode:!0,input:A,setInput:j,handleInputChange:(0,t.useCallback)(e=>{j(e.target.value)},[])}}let N=(0,t.useCallback)(()=>{M.current&&=(clearTimeout(M.current),null),D(!1)},[]);return{messages:w,isLoading:E,error:void 0,sendMessage:(0,t.useCallback)(e=>{if(!e.trim())return;let t={id:x(`msg`),role:`user`,content:e.trim(),timestamp:m?new Date().toLocaleTimeString():void 0};T(n=>{let r=[...n,t];return v?.(e.trim(),r),r}),k(``),h&&(D(!0),M.current=setTimeout(()=>{let e={id:x(`msg`),role:`assistant`,content:g||`Thank you for your message!`,timestamp:m?new Date().toLocaleTimeString():void 0};T(t=>[...t,e]),D(!1)},_))},[m,h,g,_,v]),stop:N,reload:(0,t.useCallback)(()=>{},[]),clear:(0,t.useCallback)(()=>{N(),T([])},[N]),isApiMode:!1,input:O,setInput:k,handleInputChange:(0,t.useCallback)(e=>{k(e.target.value)},[])}}function w(e){return e.filter(e=>typeof e?.name==`string`&&e.name.length>0).map(e=>({name:e.name,label:e.label||e.name,description:e.description,role:e.role,active:e.active!==!1}))}function T(e={}){let{apiBase:n,headers:r,enabled:i=!0,fallback:a=[]}=e,[o,s]=(0,t.useState)(a),[c,l]=(0,t.useState)(!1),[u,d]=(0,t.useState)(void 0),[f,p]=(0,t.useState)(0),m=(0,t.useRef)(r);return m.current=r,(0,t.useEffect)(()=>{if(!i||!n)return;let e=new AbortController,t=!1;l(!0),d(void 0);let r=`${n.replace(/\/$/,``)}/agents`;return fetch(r,{method:`GET`,headers:{Accept:`application/json`,...m.current??{}},credentials:`include`,signal:e.signal}).then(async e=>{if(!e.ok)throw Error(`Failed to load agents (${e.status})`);return e.json()}).then(e=>{if(t)return;let n=w(Array.isArray(e)?e:e?.agents??[]);s(n.length>0?n:a)}).catch(e=>{t||e.name===`AbortError`||(d(e),s(a))}).finally(()=>{t||l(!1)}),()=>{t=!0,e.abort()}},[n,i,f]),{agents:o,isLoading:c,error:u,refetch:(0,t.useCallback)(()=>p(e=>e+1),[])}}var E=t.createContext(null);function D({defaultOpen:e=!1,children:n}){let[r,a]=t.useState(e),[o,s]=t.useState(!1),c=t.useMemo(()=>({isOpen:r,isFullscreen:o,open:()=>a(!0),close:()=>{a(!1),s(!1)},toggle:()=>a(e=>!e),toggleFullscreen:()=>s(e=>!e)}),[r,o]);return(0,i.jsx)(E.Provider,{value:c,children:n})}function O(){let e=t.useContext(E);if(!e)throw Error(`useFloatingChatbot must be used within a <FloatingChatbotProvider>`);return e}function k({position:e=`bottom-right`,size:t=56,className:a}){let{isOpen:o,toggle:s}=O();return(0,i.jsx)(n.Button,{onClick:s,className:(0,n.cn)(`fixed z-50 rounded-full shadow-lg transition-transform hover:scale-105`,e===`bottom-right`?`right-6 bottom-6`:`left-6 bottom-6`,a),style:{width:t,height:t},size:`icon`,"aria-label":o?`Close chat`:`Open chat`,"data-testid":`floating-chatbot-trigger`,children:o?(0,i.jsx)(r.X,{className:`h-6 w-6`}):(0,i.jsx)(r.MessageCircle,{className:`h-6 w-6`})})}function A({title:e=`Chat`,position:t=`bottom-right`,width:a=400,height:o=520,children:s,className:c,headerExtra:l}){let{isOpen:u,isFullscreen:d,close:f,toggleFullscreen:p}=O();if(!u)return null;let m=d?{inset:0,width:`100vw`,height:`100vh`}:{width:a,height:o,maxHeight:`calc(100vh - 100px)`};return(0,i.jsxs)(`div`,{className:(0,n.cn)(`fixed z-50 flex flex-col rounded-lg border bg-background shadow-xl overflow-hidden transition-all`,d?`inset-0 rounded-none`:t===`bottom-right`?`right-6 bottom-20`:`left-6 bottom-20`,c),style:m,role:`dialog`,"aria-label":e,"data-testid":`floating-chatbot-panel`,children:[(0,i.jsxs)(`div`,{className:`flex items-center justify-between gap-2 px-4 py-2 border-b bg-muted/40`,children:[(0,i.jsx)(`span`,{className:`text-sm font-medium truncate shrink-0`,children:e}),l?(0,i.jsx)(`div`,{className:`flex-1 min-w-0 flex items-center justify-end mr-1`,"data-testid":`floating-chatbot-header-extra`,children:l}):null,(0,i.jsxs)(`div`,{className:`flex items-center gap-1 shrink-0`,children:[(0,i.jsx)(n.Button,{variant:`ghost`,size:`icon`,className:`h-7 w-7`,onClick:p,"aria-label":d?`Exit fullscreen`:`Fullscreen`,"data-testid":`floating-chatbot-fullscreen`,children:d?(0,i.jsx)(r.Minimize2,{className:`h-4 w-4`}):(0,i.jsx)(r.Maximize2,{className:`h-4 w-4`})}),(0,i.jsx)(n.Button,{variant:`ghost`,size:`icon`,className:`h-7 w-7`,onClick:f,"aria-label":`Close chat`,"data-testid":`floating-chatbot-close`,children:(0,i.jsx)(r.X,{className:`h-4 w-4`})})]})]}),(0,i.jsx)(`div`,{className:`flex-1 overflow-hidden`,children:s})]})}function j({content:e,enableMarkdown:t}){return t?(0,i.jsx)(`div`,{className:`prose prose-sm dark:prose-invert max-w-none`,children:(0,i.jsx)(c.default,{remarkPlugins:[d.default],components:{code({node:e,inline:t,className:r,children:a,...o}){let s=/language-(\w+)/.exec(r||``);return!t&&s?(0,i.jsx)(l.Prism,{style:u.oneDark,language:s[1],PreTag:`div`,className:`rounded-md my-2`,...o,children:String(a).replace(/\n$/,``)}):(0,i.jsx)(`code`,{className:(0,n.cn)(`bg-muted px-1 py-0.5 rounded text-sm`,r),...o,children:a})},p:({children:e})=>(0,i.jsx)(`p`,{className:`mb-2 last:mb-0`,children:e}),ul:({children:e})=>(0,i.jsx)(`ul`,{className:`list-disc pl-4 mb-2`,children:e}),ol:({children:e})=>(0,i.jsx)(`ol`,{className:`list-decimal pl-4 mb-2`,children:e}),li:({children:e})=>(0,i.jsx)(`li`,{className:`mb-1`,children:e}),a:({href:e,children:t})=>(0,i.jsx)(`a`,{href:e,className:`text-primary hover:underline`,target:`_blank`,rel:`noopener noreferrer`,children:t}),blockquote:({children:e})=>(0,i.jsx)(`blockquote`,{className:`border-l-4 border-primary pl-4 italic my-2 text-muted-foreground`,children:e}),table:({children:e})=>(0,i.jsx)(`div`,{className:`overflow-x-auto my-2`,children:(0,i.jsx)(`table`,{className:`min-w-full divide-y divide-border`,children:e})}),th:({children:e})=>(0,i.jsx)(`th`,{className:`px-3 py-2 text-left text-xs font-medium uppercase tracking-wider bg-muted`,children:e}),td:({children:e})=>(0,i.jsx)(`td`,{className:`px-3 py-2 text-sm border-t border-border`,children:e})},children:e})}):(0,i.jsx)(`div`,{className:`whitespace-pre-wrap`,children:e})}var M=t.forwardRef(({className:e,messages:a=[],placeholder:o=`Type your message...`,onSendMessage:s,onClear:c,onStop:l,onReload:u,disabled:d=!1,isLoading:f=!1,error:p,showTimestamp:m=!1,userAvatarUrl:h,userAvatarFallback:g=`You`,assistantAvatarUrl:_,assistantAvatarFallback:v=`AI`,maxHeight:y=`500px`,enableMarkdown:b=!0,enableFileUpload:x=!1,acceptedFileTypes:S=`image/*,.pdf,.doc,.docx,.txt`,maxFileSize:C=10*1024*1024,...w},T)=>{let[E,D]=t.useState(``),[O,k]=t.useState([]),A=t.useRef(null),M=t.useRef(null),N=t.useRef(null);t.useEffect(()=>{if(A.current){let e=A.current.querySelector(`[data-radix-scroll-area-viewport]`);e&&(e.scrollTop=e.scrollHeight)}},[a]);let P=()=>{(E.trim()||O.length>0)&&s&&(s(E.trim(),O),D(``),k([]),M.current?.focus())},F=d||f,I=F||!E.trim()&&O.length===0,L=e=>{e.key===`Enter`&&!e.shiftKey&&(e.preventDefault(),P())},R=e=>{let t=Array.from(e.target.files||[]),n=t.filter(e=>e.size>C?(console.warn(`File ${e.name} exceeds ${C/1024/1024}MB limit`),!1):S.split(`,`).map(e=>e.trim()).some(t=>{if(t.startsWith(`.`))return e.name.toLowerCase().endsWith(t.toLowerCase());if(t.endsWith(`/*`)){let n=t.split(`/`)[0];return e.type.startsWith(n+`/`)}return e.type===t})?!0:(console.warn(`File ${e.name} type ${e.type} not accepted`),!1));n.length<t.length&&console.warn(`${t.length-n.length} file(s) were rejected`),k(e=>[...e,...n])},z=e=>{k(t=>t.filter((t,n)=>n!==e))},B=()=>{c&&c()};return(0,i.jsxs)(`div`,{ref:T,className:(0,n.cn)(`flex flex-col border rounded-lg bg-background overflow-hidden`,e),style:{maxHeight:y},...w,children:[c&&a.length>0&&(0,i.jsxs)(`div`,{className:`flex items-center justify-between px-4 py-2 border-b bg-muted/30`,children:[(0,i.jsxs)(`span`,{className:`text-sm text-muted-foreground`,children:[a.length,` message`,a.length===1?``:`s`]}),(0,i.jsxs)(n.Button,{variant:`ghost`,size:`sm`,onClick:B,className:`h-8 text-xs`,children:[(0,i.jsx)(r.Trash2,{className:`h-3 w-3 mr-1`}),`Clear`]})]}),(0,i.jsx)(n.ScrollArea,{ref:A,className:`flex-1 p-4`,children:(0,i.jsx)(`div`,{className:`space-y-4`,children:a.length===0?(0,i.jsx)(`div`,{className:`flex items-center justify-center h-32 text-muted-foreground text-sm`,children:`Start a conversation...`}):a.map(e=>(0,i.jsxs)(`div`,{className:(0,n.cn)(`flex gap-3`,e.role===`user`?`justify-end`:`justify-start`),children:[e.role!==`user`&&(0,i.jsxs)(n.Avatar,{className:`h-8 w-8 shrink-0`,children:[(0,i.jsx)(n.AvatarImage,{src:e.avatar||_}),(0,i.jsx)(n.AvatarFallback,{children:e.avatarFallback||v})]}),(0,i.jsxs)(`div`,{className:(0,n.cn)(`rounded-lg px-4 py-2 max-w-[80%]`,e.role===`user`?`bg-primary text-primary-foreground`:`bg-muted`),children:[(0,i.jsx)(j,{content:e.content,enableMarkdown:b}),m&&e.timestamp&&(0,i.jsx)(`div`,{className:`text-xs opacity-70 mt-1`,children:e.timestamp}),e.streaming&&(0,i.jsxs)(`div`,{className:`flex gap-1 mt-2`,children:[(0,i.jsx)(`div`,{className:`w-2 h-2 bg-current rounded-full animate-bounce`,style:{animationDelay:`0ms`}}),(0,i.jsx)(`div`,{className:`w-2 h-2 bg-current rounded-full animate-bounce`,style:{animationDelay:`150ms`}}),(0,i.jsx)(`div`,{className:`w-2 h-2 bg-current rounded-full animate-bounce`,style:{animationDelay:`300ms`}})]})]}),e.role===`user`&&(0,i.jsxs)(n.Avatar,{className:`h-8 w-8 shrink-0`,children:[(0,i.jsx)(n.AvatarImage,{src:e.avatar||h}),(0,i.jsx)(n.AvatarFallback,{children:e.avatarFallback||g})]})]},e.id))})}),O.length>0&&(0,i.jsx)(`div`,{className:`px-4 py-2 border-t bg-muted/30`,children:(0,i.jsx)(`div`,{className:`flex flex-wrap gap-2`,children:O.map((e,t)=>(0,i.jsxs)(`div`,{className:`flex items-center gap-2 bg-background border rounded px-2 py-1 text-xs`,children:[(0,i.jsx)(r.Paperclip,{className:`h-3 w-3`}),(0,i.jsx)(`span`,{className:`max-w-[150px] truncate`,children:e.name}),(0,i.jsx)(n.Button,{variant:`ghost`,size:`sm`,className:`h-4 w-4 p-0`,onClick:()=>z(t),children:(0,i.jsx)(r.X,{className:`h-3 w-3`})})]},t))})}),p&&(0,i.jsxs)(`div`,{className:`flex items-center gap-2 px-4 py-2 border-t bg-destructive/10 text-destructive text-sm`,role:`alert`,children:[(0,i.jsx)(r.AlertCircle,{className:`h-4 w-4 shrink-0`}),(0,i.jsx)(`span`,{className:`flex-1 truncate`,children:p.message||`An error occurred`}),u&&(0,i.jsxs)(n.Button,{variant:`ghost`,size:`sm`,onClick:u,className:`h-7 text-xs`,"aria-label":`Retry`,children:[(0,i.jsx)(r.RefreshCw,{className:`h-3 w-3 mr-1`}),`Retry`]})]}),f&&l&&(0,i.jsx)(`div`,{className:`flex items-center justify-center px-4 py-2 border-t`,children:(0,i.jsxs)(n.Button,{variant:`outline`,size:`sm`,onClick:l,className:`h-8 text-xs`,"aria-label":`Stop generating`,children:[(0,i.jsx)(r.Square,{className:`h-3 w-3 mr-1`}),`Stop generating`]})}),(0,i.jsxs)(`div`,{className:`flex items-center gap-2 p-4 border-t`,children:[x&&(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(`input`,{ref:N,type:`file`,multiple:!0,accept:S,onChange:R,className:`hidden`}),(0,i.jsx)(n.Button,{variant:`ghost`,size:`icon`,onClick:()=>N.current?.click(),disabled:F,"aria-label":`Attach file`,children:(0,i.jsx)(r.Paperclip,{className:`h-4 w-4`})})]}),(0,i.jsx)(n.Input,{ref:M,value:E,onChange:e=>D(e.target.value),onKeyDown:L,placeholder:o,disabled:F,className:`flex-1`}),(0,i.jsx)(n.Button,{onClick:P,disabled:I,size:`icon`,"aria-label":`Send message`,children:(0,i.jsx)(r.Send,{className:`h-4 w-4`})})]})]})});M.displayName=`ChatbotEnhanced`;function N({floatingConfig:e,headerExtra:n,...r}){let{position:a=`bottom-right`,defaultOpen:o=!1,panelWidth:c=400,panelHeight:l=520,title:u=`Chat`,triggerSize:d=56}=e??{},[f,p]=t.useState(null);t.useEffect(()=>{let e=document.getElementById(`floating-chatbot-portal`);return e||(e=document.createElement(`div`),e.id=`floating-chatbot-portal`,document.body.appendChild(e)),p(e),()=>{e&&e.parentNode&&!e.hasChildNodes()&&e.parentNode.removeChild(e)}},[]);let m=(0,i.jsxs)(D,{defaultOpen:o,children:[(0,i.jsx)(k,{position:a,size:d}),(0,i.jsx)(A,{title:u,position:a,width:c,height:l,headerExtra:n,children:(0,i.jsx)(M,{...r,maxHeight:`100%`,className:`h-full border-0 rounded-none`})})]});return f?s.createPortal(m,f):m}f.ComponentRegistry.register(`chatbot`,({schema:e,className:t,...n})=>{let{messages:r,isLoading:a,sendMessage:o}=C({api:e.api,initialMessages:e.messages,conversationId:e.conversationId,systemPrompt:e.systemPrompt,model:e.model,streamingEnabled:e.streamingEnabled,headers:e.headers,body:e.requestBody,maxToolRoundtrips:e.maxToolRoundtrips,onError:e.onError,showTimestamp:e.showTimestamp,autoResponse:e.autoResponse,autoResponseText:e.autoResponseText,autoResponseDelay:e.autoResponseDelay,onSend:e.onSend});return(0,i.jsx)(P,{messages:r,placeholder:e.placeholder,onSendMessage:e=>{o(e)},disabled:e.disabled||a,showTimestamp:e.showTimestamp,userAvatarUrl:e.userAvatarUrl,userAvatarFallback:e.userAvatarFallback,assistantAvatarUrl:e.assistantAvatarUrl,assistantAvatarFallback:e.assistantAvatarFallback,maxHeight:e.maxHeight,className:t,...n})},{namespace:`plugin-chatbot`,label:`Chatbot`,inputs:[{name:`messages`,type:`array`,label:`Initial Messages`,description:`Array of message objects with id, role, content, and optional timestamp`},{name:`placeholder`,type:`string`,label:`Input Placeholder`,defaultValue:`Type your message...`},{name:`showTimestamp`,type:`boolean`,label:`Show Timestamps`,defaultValue:!1},{name:`disabled`,type:`boolean`,label:`Disabled`,defaultValue:!1},{name:`userAvatarUrl`,type:`string`,label:`User Avatar URL`,description:`URL of the user avatar image`},{name:`userAvatarFallback`,type:`string`,label:`User Avatar Fallback`,defaultValue:`You`,description:`Fallback text shown when user avatar image is not available`},{name:`assistantAvatarUrl`,type:`string`,label:`Assistant Avatar URL`,description:`URL of the assistant avatar image`},{name:`assistantAvatarFallback`,type:`string`,label:`Assistant Avatar Fallback`,defaultValue:`AI`,description:`Fallback text shown when assistant avatar image is not available`},{name:`maxHeight`,type:`string`,label:`Max Height`,defaultValue:`500px`},{name:`api`,type:`string`,label:`API Endpoint`,description:`Backend SSE endpoint (e.g., /api/v1/ai/chat). When set, enables streaming AI mode.`},{name:`conversationId`,type:`string`,label:`Conversation ID`,description:`Multi-turn conversation identifier`},{name:`systemPrompt`,type:`string`,label:`System Prompt`,description:`System prompt to configure assistant behavior`},{name:`model`,type:`string`,label:`AI Model`,description:`AI model identifier (e.g., gpt-4o)`},{name:`streamingEnabled`,type:`boolean`,label:`Enable Streaming`,defaultValue:!0},{name:`autoResponse`,type:`boolean`,label:`Enable Auto Response (Demo)`,defaultValue:!1,description:`Automatically send a response after user message (for demo purposes, ignored when API is set)`},{name:`autoResponseText`,type:`string`,label:`Auto Response Text`,defaultValue:`Thank you for your message!`},{name:`autoResponseDelay`,type:`number`,label:`Auto Response Delay (ms)`,defaultValue:1e3},{name:`className`,type:`string`,label:`CSS Class`}],defaultProps:{messages:[{id:`welcome`,role:`assistant`,content:`Hello! How can I help you today?`}],placeholder:`Type your message...`,showTimestamp:!1,disabled:!1,userAvatarFallback:`You`,assistantAvatarFallback:`AI`,maxHeight:`500px`,autoResponse:!0,autoResponseText:`Thank you for your message! This is an automated response.`,autoResponseDelay:1e3,className:`w-full max-w-2xl`}}),f.ComponentRegistry.register(`chatbot-enhanced`,({schema:e,className:t,...n})=>{let{messages:r,isLoading:a,error:o,sendMessage:s,stop:c,reload:l,clear:u,isApiMode:d}=C({api:e.api,initialMessages:e.messages,conversationId:e.conversationId,systemPrompt:e.systemPrompt,model:e.model,streamingEnabled:e.streamingEnabled,headers:e.headers,body:e.requestBody,maxToolRoundtrips:e.maxToolRoundtrips,onError:e.onError,showTimestamp:e.showTimestamp,autoResponse:e.autoResponse,autoResponseText:e.autoResponseText,autoResponseDelay:e.autoResponseDelay,onSend:e.onSend});return(0,i.jsx)(M,{messages:r,placeholder:e.placeholder,onSendMessage:(e,t)=>{s(e,t)},onClear:()=>{u(),e.onClear?.()},onStop:d&&a?c:void 0,onReload:d?l:void 0,disabled:e.disabled,isLoading:a,error:o,showTimestamp:e.showTimestamp,userAvatarUrl:e.userAvatarUrl,userAvatarFallback:e.userAvatarFallback,assistantAvatarUrl:e.assistantAvatarUrl,assistantAvatarFallback:e.assistantAvatarFallback,maxHeight:e.maxHeight,enableMarkdown:e.enableMarkdown??!0,enableFileUpload:e.enableFileUpload??!1,className:t,...n})},{namespace:`plugin-chatbot`,label:`Chatbot (Enhanced)`,inputs:[{name:`messages`,type:`array`,label:`Initial Messages`},{name:`placeholder`,type:`string`,label:`Input Placeholder`,defaultValue:`Type your message...`},{name:`showTimestamp`,type:`boolean`,label:`Show Timestamps`,defaultValue:!1},{name:`disabled`,type:`boolean`,label:`Disabled`,defaultValue:!1},{name:`enableMarkdown`,type:`boolean`,label:`Enable Markdown`,defaultValue:!0},{name:`enableFileUpload`,type:`boolean`,label:`Enable File Upload`,defaultValue:!1},{name:`userAvatarUrl`,type:`string`,label:`User Avatar URL`},{name:`userAvatarFallback`,type:`string`,label:`User Avatar Fallback`,defaultValue:`You`},{name:`assistantAvatarUrl`,type:`string`,label:`Assistant Avatar URL`},{name:`assistantAvatarFallback`,type:`string`,label:`Assistant Avatar Fallback`,defaultValue:`AI`},{name:`maxHeight`,type:`string`,label:`Max Height`,defaultValue:`500px`},{name:`api`,type:`string`,label:`API Endpoint`,description:`Backend SSE endpoint for streaming AI mode`},{name:`conversationId`,type:`string`,label:`Conversation ID`},{name:`systemPrompt`,type:`string`,label:`System Prompt`},{name:`model`,type:`string`,label:`AI Model`},{name:`streamingEnabled`,type:`boolean`,label:`Enable Streaming`,defaultValue:!0},{name:`autoResponse`,type:`boolean`,label:`Enable Auto Response (Demo)`,defaultValue:!1},{name:`autoResponseText`,type:`string`,label:`Auto Response Text`,defaultValue:`Thank you for your message!`},{name:`autoResponseDelay`,type:`number`,label:`Auto Response Delay (ms)`,defaultValue:1e3},{name:`className`,type:`string`,label:`CSS Class`}],defaultProps:{messages:[{id:`welcome`,role:`assistant`,content:`Hello! How can I help you today?`}],placeholder:`Type your message...`,showTimestamp:!1,disabled:!1,enableMarkdown:!0,enableFileUpload:!1,userAvatarFallback:`You`,assistantAvatarFallback:`AI`,maxHeight:`500px`,autoResponse:!0,autoResponseText:`Thank you for your message! This is an automated response.`,autoResponseDelay:1e3,className:`w-full max-w-2xl`}}),f.ComponentRegistry.register(`chatbot-floating`,({schema:e,className:t,...n})=>{let{messages:r,isLoading:a,error:o,sendMessage:s,stop:c,reload:l,clear:u,isApiMode:d}=C({api:e.api,initialMessages:e.messages,conversationId:e.conversationId,systemPrompt:e.systemPrompt,model:e.model,streamingEnabled:e.streamingEnabled,headers:e.headers,body:e.requestBody,maxToolRoundtrips:e.maxToolRoundtrips,onError:e.onError,showTimestamp:e.showTimestamp,autoResponse:e.autoResponse,autoResponseText:e.autoResponseText,autoResponseDelay:e.autoResponseDelay,onSend:e.onSend});return(0,i.jsx)(N,{floatingConfig:e.floatingConfig,messages:r,placeholder:e.placeholder,onSendMessage:(e,t)=>{s(e,t)},onClear:()=>{u(),e.onClear?.()},onStop:d&&a?c:void 0,onReload:d?l:void 0,disabled:e.disabled,isLoading:a,error:o,showTimestamp:e.showTimestamp,userAvatarUrl:e.userAvatarUrl,userAvatarFallback:e.userAvatarFallback,assistantAvatarUrl:e.assistantAvatarUrl,assistantAvatarFallback:e.assistantAvatarFallback,enableMarkdown:e.enableMarkdown??!0,enableFileUpload:e.enableFileUpload??!1,className:t,...n})},{namespace:`plugin-chatbot`,label:`Chatbot (Floating)`,inputs:[{name:`displayMode`,type:`string`,label:`Display Mode`,defaultValue:`floating`,description:`Set to "floating" for FAB widget`},{name:`floatingConfig.position`,type:`string`,label:`FAB Position`,defaultValue:`bottom-right`,description:`bottom-right or bottom-left`},{name:`floatingConfig.defaultOpen`,type:`boolean`,label:`Default Open`,defaultValue:!1},{name:`floatingConfig.panelWidth`,type:`number`,label:`Panel Width`,defaultValue:400},{name:`floatingConfig.panelHeight`,type:`number`,label:`Panel Height`,defaultValue:520},{name:`floatingConfig.title`,type:`string`,label:`Panel Title`,defaultValue:`Chat`},{name:`floatingConfig.triggerSize`,type:`number`,label:`Trigger Size`,defaultValue:56},{name:`messages`,type:`array`,label:`Initial Messages`},{name:`placeholder`,type:`string`,label:`Input Placeholder`,defaultValue:`Type your message...`},{name:`enableMarkdown`,type:`boolean`,label:`Enable Markdown`,defaultValue:!0},{name:`enableFileUpload`,type:`boolean`,label:`Enable File Upload`,defaultValue:!1},{name:`api`,type:`string`,label:`API Endpoint`,description:`Backend SSE endpoint for streaming AI mode`},{name:`conversationId`,type:`string`,label:`Conversation ID`},{name:`systemPrompt`,type:`string`,label:`System Prompt`},{name:`model`,type:`string`,label:`AI Model`},{name:`streamingEnabled`,type:`boolean`,label:`Enable Streaming`,defaultValue:!0},{name:`autoResponse`,type:`boolean`,label:`Enable Auto Response (Demo)`,defaultValue:!1},{name:`autoResponseText`,type:`string`,label:`Auto Response Text`,defaultValue:`Thank you for your message!`},{name:`autoResponseDelay`,type:`number`,label:`Auto Response Delay (ms)`,defaultValue:1e3},{name:`className`,type:`string`,label:`CSS Class`}],defaultProps:{displayMode:`floating`,floatingConfig:{position:`bottom-right`,defaultOpen:!1,panelWidth:400,panelHeight:520,title:`Chat`,triggerSize:56},messages:[{id:`welcome`,role:`assistant`,content:`Hello! How can I help you today?`}],placeholder:`Type your message...`,enableMarkdown:!0,enableFileUpload:!1,autoResponse:!0,autoResponseText:`Thank you for your message! This is an automated response.`,autoResponseDelay:1e3}});var P=t.forwardRef(({className:e,messages:a=[],placeholder:o=`Type your message...`,onSendMessage:s,disabled:c=!1,showTimestamp:l=!1,userAvatarUrl:u,userAvatarFallback:d=`You`,assistantAvatarUrl:f,assistantAvatarFallback:p=`AI`,maxHeight:m=`500px`,...h},g)=>{let[_,v]=t.useState(``),y=t.useRef(null),b=t.useRef(null);t.useEffect(()=>{if(y.current){let e=y.current.querySelector(`[data-radix-scroll-area-viewport]`);e&&(e.scrollTop=e.scrollHeight)}},[a]);let x=()=>{_.trim()&&s&&(s(_.trim()),v(``),b.current?.focus())},S=e=>{e.key===`Enter`&&!e.shiftKey&&(e.preventDefault(),x())};return(0,i.jsxs)(`div`,{ref:g,className:(0,n.cn)(`flex flex-col border rounded-lg bg-background overflow-hidden`,e),style:{maxHeight:m},...h,children:[(0,i.jsx)(n.ScrollArea,{ref:y,className:`flex-1 p-4`,children:(0,i.jsx)(`div`,{className:`space-y-4`,children:a.length===0?(0,i.jsx)(`div`,{className:`flex items-center justify-center h-32 text-muted-foreground text-sm`,children:`No messages yet. Start a conversation!`}):a.map(e=>(0,i.jsx)(F,{message:e,showTimestamp:l,userAvatarUrl:u,userAvatarFallback:d,assistantAvatarUrl:f,assistantAvatarFallback:p},e.id))})}),(0,i.jsx)(`div`,{className:`border-t p-4`,children:(0,i.jsxs)(`div`,{className:`flex gap-2`,children:[(0,i.jsx)(n.Input,{ref:b,value:_,onChange:e=>v(e.target.value),onKeyDown:S,placeholder:o,disabled:c,className:`flex-1`}),(0,i.jsx)(n.Button,{onClick:x,disabled:c||!_.trim(),size:`icon`,children:(0,i.jsx)(r.Send,{className:`h-4 w-4`})})]})})]})});P.displayName=`Chatbot`;var F=({message:e,showTimestamp:t,userAvatarUrl:r,userAvatarFallback:a,assistantAvatarUrl:o,assistantAvatarFallback:s})=>{let c=e.role===`user`;if(e.role===`system`)return(0,i.jsx)(`div`,{className:`flex justify-center`,children:(0,i.jsx)(`div`,{className:`text-xs text-muted-foreground bg-muted px-3 py-1 rounded-full`,children:e.content})});let l=c?e.avatar||r:e.avatar||o,u=c?e.avatarFallback||a:e.avatarFallback||s;return(0,i.jsxs)(`div`,{className:(0,n.cn)(`flex gap-3`,c?`flex-row-reverse`:`flex-row`),children:[(0,i.jsxs)(n.Avatar,{className:`h-8 w-8`,children:[(0,i.jsx)(n.AvatarImage,{src:l}),(0,i.jsx)(n.AvatarFallback,{className:`text-xs`,children:u})]}),(0,i.jsxs)(`div`,{className:(0,n.cn)(`flex flex-col gap-1`,c?`items-end`:`items-start`),children:[(0,i.jsx)(`div`,{className:(0,n.cn)(`rounded-lg px-4 py-2 max-w-[70%] break-words`,c?`bg-primary text-primary-foreground`:`bg-muted`),children:(0,i.jsx)(`p`,{className:`text-sm whitespace-pre-wrap`,children:e.content})}),t&&e.timestamp&&(0,i.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:e.timestamp})]})]})},I=t.forwardRef(({className:e,avatarSrc:t,avatarFallback:r=`AI`,...a},o)=>(0,i.jsxs)(`div`,{ref:o,className:(0,n.cn)(`flex gap-3`,e),...a,children:[(0,i.jsxs)(n.Avatar,{className:`h-8 w-8`,children:[(0,i.jsx)(n.AvatarImage,{src:t}),(0,i.jsx)(n.AvatarFallback,{className:`text-xs`,children:r})]}),(0,i.jsx)(`div`,{className:`flex items-center bg-muted rounded-lg px-4 py-2`,children:(0,i.jsxs)(`div`,{className:`flex gap-1`,children:[(0,i.jsx)(`span`,{className:`w-2 h-2 bg-muted-foreground rounded-full animate-bounce [animation-delay:-0.3s]`}),(0,i.jsx)(`span`,{className:`w-2 h-2 bg-muted-foreground rounded-full animate-bounce [animation-delay:-0.15s]`}),(0,i.jsx)(`span`,{className:`w-2 h-2 bg-muted-foreground rounded-full animate-bounce`})]})})]}));I.displayName=`TypingIndicator`,e.Chatbot=P,e.FloatingChatbot=N,e.FloatingChatbotPanel=A,e.FloatingChatbotProvider=D,e.FloatingChatbotTrigger=k,e.TypingIndicator=I,e.useAgents=T,e.useFloatingChatbot=O,e.useObjectChat=C});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@object-ui/plugin-chatbot",
3
- "version": "4.0.4",
3
+ "version": "4.0.6",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "description": "Chatbot interface plugin for Object UI",
@@ -30,10 +30,10 @@
30
30
  "react-markdown": "^10.1.0",
31
31
  "react-syntax-highlighter": "^16.1.1",
32
32
  "remark-gfm": "^4.0.1",
33
- "@object-ui/components": "4.0.4",
34
- "@object-ui/core": "4.0.4",
35
- "@object-ui/react": "4.0.4",
36
- "@object-ui/types": "4.0.4"
33
+ "@object-ui/components": "4.0.6",
34
+ "@object-ui/core": "4.0.6",
35
+ "@object-ui/react": "4.0.6",
36
+ "@object-ui/types": "4.0.6"
37
37
  },
38
38
  "peerDependencies": {
39
39
  "react": "^18.0.0 || ^19.0.0",