@object-ui/plugin-chatbot 4.0.5 → 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 +25 -0
- package/dist/index.js +5 -5
- package/dist/index.umd.cjs +1 -1
- package/package.json +5 -5
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,30 @@
|
|
|
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
|
+
|
|
3
28
|
## 4.0.5
|
|
4
29
|
|
|
5
30
|
### 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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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"
|
package/dist/index.umd.cjs
CHANGED
|
@@ -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.
|
|
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.
|
|
34
|
-
"@object-ui/core": "4.0.
|
|
35
|
-
"@object-ui/react": "4.0.
|
|
36
|
-
"@object-ui/types": "4.0.
|
|
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",
|