@gui-chat-plugin/avatar 0.0.3 → 0.0.4

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/dist/vue.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const a=require("./three-vrm.module-FTOSkzpf.cjs"),z=require("./core.cjs"),o=require("vue"),$={class:"size-full bg-gradient-to-b from-slate-800 to-slate-900 relative"},q={key:0,class:"absolute inset-0 flex items-center justify-center bg-slate-900/80"},H={key:1,class:"absolute inset-0 flex items-center justify-center bg-slate-900/80"},G={class:"text-red-400 text-lg text-center p-4"},W={key:2,class:"absolute top-4 right-4 px-3 py-1 bg-green-600 text-white text-sm rounded-full"},U=o.defineComponent({__name:"View",props:{selectedResult:{},sendTextMessage:{type:Function},isAudioPlaying:{type:Boolean}},setup(y){const A=y,p=o.ref(null),N=o.ref(!1),B=o.ref(null);let r=null,f=null,l=null,t=null,w=null,V=null,S=0,k="neutral",L="none",b=0,P=0,_="";const F={neutral:null,happy:a.VRMExpressionPresetName.Happy,sad:a.VRMExpressionPresetName.Sad,angry:a.VRMExpressionPresetName.Angry,surprised:a.VRMExpressionPresetName.Surprised};function I(){if(!p.value)return;const n=p.value,e=n.clientWidth,E=n.clientHeight;r=new a.Scene,f=new a.PerspectiveCamera(30,e/E,.1,100),f.position.set(0,1.3,1.5),f.lookAt(0,1.2,0),l=new a.WebGLRenderer({antialias:!0,alpha:!0}),l.setSize(e,E),l.setPixelRatio(window.devicePixelRatio),l.outputColorSpace=a.SRGBColorSpace,n.appendChild(l.domElement);const v=new a.AmbientLight(16777215,.6);r.add(v);const c=new a.DirectionalLight(16777215,.8);c.position.set(1,1,1),r.add(c),w=new a.Clock,window.addEventListener("resize",R),T()}function R(){if(!p.value||!f||!l)return;const n=p.value.clientWidth,e=p.value.clientHeight;f.aspect=n/e,f.updateProjectionMatrix(),l.setSize(n,e)}async function C(n){if(r){N.value=!0,B.value=null,t&&(r.remove(t.scene),t=null);try{const e=new a.GLTFLoader;e.register(c=>new a.VRMLoaderPlugin(c));const v=(await e.loadAsync(n)).userData.vrm;if(!v)throw new Error("Failed to load VRM data");r.add(v.scene),t=v,N.value=!1}catch(e){console.error("Failed to load VRM:",e),B.value=`Failed to load avatar: ${e instanceof Error?e.message:"Unknown error"}`,N.value=!1}}}function T(){if(V=requestAnimationFrame(T),!w||!l||!r||!f)return;const n=w.getDelta(),e=w.getElapsedTime();if(t){if(t.update(n),A.isAudioPlaying){S+=n*10;const c=(Math.sin(S)+1)*.3;t.expressionManager?.setValue(a.VRMExpressionPresetName.Aa,c);const h=t.humanoid?.getNormalizedBoneNode("head"),u=t.humanoid?.getNormalizedBoneNode("neck"),i=t.humanoid?.getNormalizedBoneNode("spine");h&&(h.rotation.x=Math.sin(e*2)*.08,h.rotation.z=Math.sin(e*1.5)*.05),u&&(u.rotation.y=Math.sin(e*.8)*.05),i&&(i.rotation.z=Math.sin(e*.5)*.03);const s=t.humanoid?.getNormalizedBoneNode("leftShoulder"),m=t.humanoid?.getNormalizedBoneNode("rightShoulder"),g=t.humanoid?.getNormalizedBoneNode("leftUpperArm"),x=t.humanoid?.getNormalizedBoneNode("rightUpperArm"),d=t.humanoid?.getNormalizedBoneNode("leftLowerArm"),M=t.humanoid?.getNormalizedBoneNode("rightLowerArm");s&&(s.rotation.z=.1),m&&(m.rotation.z=-.1),g&&(g.rotation.z=-.8+Math.sin(e*1.2)*.1,g.rotation.x=.4+Math.sin(e*.9)*.15,g.rotation.y=Math.sin(e*.7)*.1),x&&(x.rotation.z=.8+Math.sin(e*1.3)*.1,x.rotation.x=.4+Math.sin(e*1)*.15,x.rotation.y=Math.sin(e*.8)*.1),d&&(d.rotation.y=-1-Math.sin(e*1.5)*.2,d.rotation.z=Math.sin(e*1.1)*.1),M&&(M.rotation.y=1+Math.sin(e*1.4)*.2,M.rotation.z=Math.sin(e*1.2)*.1)}else{S=0,t.expressionManager?.setValue(a.VRMExpressionPresetName.Aa,0);const c=t.humanoid?.getNormalizedBoneNode("spine"),h=t.humanoid?.getNormalizedBoneNode("head");c&&(c.rotation.x=Math.sin(e*.8)*.02),h&&(h.rotation.x=Math.sin(e*.3)*.03,h.rotation.z=Math.sin(e*.2)*.02);const u=t.humanoid?.getNormalizedBoneNode("leftShoulder"),i=t.humanoid?.getNormalizedBoneNode("rightShoulder"),s=t.humanoid?.getNormalizedBoneNode("leftUpperArm"),m=t.humanoid?.getNormalizedBoneNode("rightUpperArm"),g=t.humanoid?.getNormalizedBoneNode("leftLowerArm"),x=t.humanoid?.getNormalizedBoneNode("rightLowerArm");u&&(u.rotation.z=.1),i&&(i.rotation.z=-.1),s&&(s.rotation.z=-.9,s.rotation.x=.2,s.rotation.y=0),m&&(m.rotation.z=.9,m.rotation.x=.2,m.rotation.y=0),g&&(g.rotation.y=-.8),x&&(x.rotation.y=.8)}e%4<.1?t.expressionManager?.setValue(a.VRMExpressionPresetName.Blink,1):t.expressionManager?.setValue(a.VRMExpressionPresetName.Blink,0);const v=F[k];if(t.expressionManager?.setValue(a.VRMExpressionPresetName.Happy,0),t.expressionManager?.setValue(a.VRMExpressionPresetName.Sad,0),t.expressionManager?.setValue(a.VRMExpressionPresetName.Angry,0),t.expressionManager?.setValue(a.VRMExpressionPresetName.Surprised,0),v&&t.expressionManager?.setValue(v,.8),L!=="none"){const c=e-b,h=1.5;if(c<h){const u=c/h,i=t.humanoid?.getNormalizedBoneNode("head"),s=t.humanoid?.getNormalizedBoneNode("rightUpperArm"),m=t.humanoid?.getNormalizedBoneNode("rightLowerArm"),g=t.humanoid?.getNormalizedBoneNode("spine"),d=(M=>M<.5?2*M*M:1-Math.pow(-2*M+2,2)/2)(u<.5?u*2:(1-u)*2);switch(L){case"nod":i&&(i.rotation.x=Math.sin(u*Math.PI*3)*.2);break;case"shake":i&&(i.rotation.y=Math.sin(u*Math.PI*4)*.3);break;case"wave":s&&(s.rotation.z=1.5*d,s.rotation.x=-.3*d),m&&(m.rotation.y=.5+Math.sin(u*Math.PI*6)*.3);break;case"think":i&&(i.rotation.x=.1*d,i.rotation.z=.1*d),s&&(s.rotation.z=.3*d,s.rotation.x=.8*d),m&&(m.rotation.y=1.5*d);break;case"bow":g&&(g.rotation.x=.4*d),i&&(i.rotation.x=.2*d);break}}else L="none"}}l.render(r,f)}function j(){V!==null&&(cancelAnimationFrame(V),V=null),window.removeEventListener("resize",R),l&&p.value&&(p.value.removeChild(l.domElement),l.dispose(),l=null),t&&(t=null),r=null,f=null,w=null}return o.watch(()=>A.selectedResult,n=>{if(n?.toolName===z.TOOL_NAME&&n.data){const e=n.data;if(e.avatarUrl&&e.avatarUrl!==_&&(_=e.avatarUrl,C(e.avatarUrl)),e.emotion&&e.emotion!==k&&(console.log("[Avatar Debug] Emotion changed to:",e.emotion),k=e.emotion),e.action&&e.action!=="none"){const E=e.actionTimestamp||0;E>P&&(console.log("[Avatar Debug] Action triggered:",e.action),L=e.action,b=w?.getElapsedTime()||0,P=E)}}},{deep:!0}),o.onMounted(()=>{if(I(),A.selectedResult?.toolName===z.TOOL_NAME&&A.selectedResult.data){const n=A.selectedResult.data;n.avatarUrl&&(_=n.avatarUrl,C(n.avatarUrl)),n.emotion&&(k=n.emotion)}}),o.onUnmounted(()=>{j()}),(n,e)=>(o.openBlock(),o.createElementBlock("div",$,[o.createElementVNode("div",{ref_key:"containerRef",ref:p,class:"size-full"},null,512),N.value?(o.openBlock(),o.createElementBlock("div",q,[...e[0]||(e[0]=[o.createElementVNode("div",{class:"text-white text-lg"},"Loading Avatar...",-1)])])):o.createCommentVNode("",!0),B.value?(o.openBlock(),o.createElementBlock("div",H,[o.createElementVNode("div",G,o.toDisplayString(B.value),1)])):o.createCommentVNode("",!0),y.isAudioPlaying?(o.openBlock(),o.createElementBlock("div",W," Speaking... ")):o.createCommentVNode("",!0)]))}}),J={class:"p-3 bg-gradient-to-br from-slate-700 to-slate-800 rounded-md"},K={class:"flex flex-col items-center gap-2"},Q={key:0,class:"text-xs px-2 py-0.5 bg-blue-500 text-white rounded-full"},O=o.defineComponent({__name:"Preview",props:{result:{}},setup(y){const A=y,p=o.computed(()=>A.result.data),N=o.computed(()=>p.value?.emotion||"neutral");return(B,r)=>(o.openBlock(),o.createElementBlock("div",J,[o.createElementVNode("div",K,[r[0]||(r[0]=o.createElementVNode("div",{class:"size-12 bg-slate-600 rounded-full flex items-center justify-center"},[o.createElementVNode("svg",{class:"size-8 text-slate-300",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[o.createElementVNode("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z"})])],-1)),r[1]||(r[1]=o.createElementVNode("div",{class:"text-sm font-semibold text-white text-center"}," 3D Avatar ",-1)),N.value&&N.value!=="neutral"?(o.openBlock(),o.createElementBlock("div",Q,o.toDisplayString(N.value),1)):o.createCommentVNode("",!0)])]))}}),D={...z.pluginCore,viewComponent:U,previewComponent:O},X={plugin:D};exports.SAMPLES=z.SAMPLES;exports.TOOL_DEFINITION=z.TOOL_DEFINITION;exports.TOOL_NAME=z.TOOL_NAME;exports.executeAvatar=z.executeAvatar;exports.pluginCore=z.pluginCore;exports.Preview=O;exports.View=U;exports.default=X;exports.plugin=D;
1
+ Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require(`./plugin-DbprBh0b.cjs`),t=require(`./three-vrm.module-FrURzSOB.cjs`);require(`./react.cjs`);let n=require(`vue`);var r={class:`size-full bg-gradient-to-b from-slate-800 to-slate-900 relative`},i={key:0,class:`absolute inset-0 flex items-center justify-center bg-slate-900/80`},a={key:1,class:`absolute inset-0 flex items-center justify-center bg-slate-900/80`},o={class:`text-red-400 text-lg text-center p-4`},s={key:2,class:`absolute top-4 right-4 px-3 py-1 bg-green-600 text-white text-sm rounded-full`},c=(0,n.defineComponent)({__name:`View`,props:{selectedResult:{},sendTextMessage:{type:Function},isAudioPlaying:{type:Boolean}},setup(e){let c=e,l=(0,n.ref)(null),u=(0,n.ref)(!1),d=(0,n.ref)(null),f=null,p=null,m=null,h=null,g=null,_=null,v=0,y=`neutral`,b=`none`,x=0,S=0,C=``,w={neutral:null,happy:t.t.Happy,sad:t.t.Sad,angry:t.t.Angry,surprised:t.t.Surprised};function T(){if(!l.value)return;let e=l.value,n=e.clientWidth,r=e.clientHeight;f=new t.u,p=new t.c(30,n/r,.1,100),p.position.set(0,1.3,1.5),p.lookAt(0,1.2,0),m=new t.i({antialias:!0,alpha:!0}),m.setSize(n,r),m.setPixelRatio(window.devicePixelRatio),m.outputColorSpace=t.l,e.appendChild(m.domElement);let i=new t.a(16777215,.6);f.add(i);let a=new t.s(16777215,.8);a.position.set(1,1,1),f.add(a),g=new t.o,window.addEventListener(`resize`,E),O()}function E(){if(!l.value||!p||!m)return;let e=l.value.clientWidth,t=l.value.clientHeight;p.aspect=e/t,p.updateProjectionMatrix(),m.setSize(e,t)}async function D(e){if(f){u.value=!0,d.value=null,h&&=(f.remove(h.scene),null);try{let n=new t.r;n.register(e=>new t.n(e));let r=(await n.loadAsync(e)).userData.vrm;if(!r)throw Error(`Failed to load VRM data`);f.add(r.scene),h=r,u.value=!1}catch(e){console.error(`Failed to load VRM:`,e),d.value=`Failed to load avatar: ${e instanceof Error?e.message:`Unknown error`}`,u.value=!1}}}function O(){if(_=requestAnimationFrame(O),!g||!m||!f||!p)return;let e=g.getDelta(),n=g.getElapsedTime();if(h){if(h.update(e),c.isAudioPlaying){v+=e*10;let r=(Math.sin(v)+1)*.3;h.expressionManager?.setValue(t.t.Aa,r);let i=h.humanoid?.getNormalizedBoneNode(`head`),a=h.humanoid?.getNormalizedBoneNode(`neck`),o=h.humanoid?.getNormalizedBoneNode(`spine`);i&&(i.rotation.x=Math.sin(n*2)*.08,i.rotation.z=Math.sin(n*1.5)*.05),a&&(a.rotation.y=Math.sin(n*.8)*.05),o&&(o.rotation.z=Math.sin(n*.5)*.03);let s=h.humanoid?.getNormalizedBoneNode(`leftShoulder`),c=h.humanoid?.getNormalizedBoneNode(`rightShoulder`),l=h.humanoid?.getNormalizedBoneNode(`leftUpperArm`),u=h.humanoid?.getNormalizedBoneNode(`rightUpperArm`),d=h.humanoid?.getNormalizedBoneNode(`leftLowerArm`),f=h.humanoid?.getNormalizedBoneNode(`rightLowerArm`);s&&(s.rotation.z=.1),c&&(c.rotation.z=-.1),l&&(l.rotation.z=-.8+Math.sin(n*1.2)*.1,l.rotation.x=.4+Math.sin(n*.9)*.15,l.rotation.y=Math.sin(n*.7)*.1),u&&(u.rotation.z=.8+Math.sin(n*1.3)*.1,u.rotation.x=.4+Math.sin(n*1)*.15,u.rotation.y=Math.sin(n*.8)*.1),d&&(d.rotation.y=-1-Math.sin(n*1.5)*.2,d.rotation.z=Math.sin(n*1.1)*.1),f&&(f.rotation.y=1+Math.sin(n*1.4)*.2,f.rotation.z=Math.sin(n*1.2)*.1)}else{v=0,h.expressionManager?.setValue(t.t.Aa,0);let e=h.humanoid?.getNormalizedBoneNode(`spine`),r=h.humanoid?.getNormalizedBoneNode(`head`);e&&(e.rotation.x=Math.sin(n*.8)*.02),r&&(r.rotation.x=Math.sin(n*.3)*.03,r.rotation.z=Math.sin(n*.2)*.02);let i=h.humanoid?.getNormalizedBoneNode(`leftShoulder`),a=h.humanoid?.getNormalizedBoneNode(`rightShoulder`),o=h.humanoid?.getNormalizedBoneNode(`leftUpperArm`),s=h.humanoid?.getNormalizedBoneNode(`rightUpperArm`),c=h.humanoid?.getNormalizedBoneNode(`leftLowerArm`),l=h.humanoid?.getNormalizedBoneNode(`rightLowerArm`);i&&(i.rotation.z=.1),a&&(a.rotation.z=-.1),o&&(o.rotation.z=-.9,o.rotation.x=.2,o.rotation.y=0),s&&(s.rotation.z=.9,s.rotation.x=.2,s.rotation.y=0),c&&(c.rotation.y=-.8),l&&(l.rotation.y=.8)}n%4<.1?h.expressionManager?.setValue(t.t.Blink,1):h.expressionManager?.setValue(t.t.Blink,0);let r=w[y];if(h.expressionManager?.setValue(t.t.Happy,0),h.expressionManager?.setValue(t.t.Sad,0),h.expressionManager?.setValue(t.t.Angry,0),h.expressionManager?.setValue(t.t.Surprised,0),r&&h.expressionManager?.setValue(r,.8),b!==`none`){let e=n-x,t=1.5;if(e<t){let n=e/t,r=h.humanoid?.getNormalizedBoneNode(`head`),i=h.humanoid?.getNormalizedBoneNode(`rightUpperArm`),a=h.humanoid?.getNormalizedBoneNode(`rightLowerArm`),o=h.humanoid?.getNormalizedBoneNode(`spine`),s=(e=>e<.5?2*e*e:1-(-2*e+2)**2/2)(n<.5?n*2:(1-n)*2);switch(b){case`nod`:r&&(r.rotation.x=Math.sin(n*Math.PI*3)*.2);break;case`shake`:r&&(r.rotation.y=Math.sin(n*Math.PI*4)*.3);break;case`wave`:i&&(i.rotation.z=1.5*s,i.rotation.x=-.3*s),a&&(a.rotation.y=.5+Math.sin(n*Math.PI*6)*.3);break;case`think`:r&&(r.rotation.x=.1*s,r.rotation.z=.1*s),i&&(i.rotation.z=.3*s,i.rotation.x=.8*s),a&&(a.rotation.y=1.5*s);break;case`bow`:o&&(o.rotation.x=.4*s),r&&(r.rotation.x=.2*s);break}}else b=`none`}}m.render(f,p)}function k(){_!==null&&(cancelAnimationFrame(_),_=null),window.removeEventListener(`resize`,E),m&&l.value&&(l.value.removeChild(m.domElement),m.dispose(),m=null),h&&=null,f=null,p=null,g=null}return(0,n.watch)(()=>c.selectedResult,e=>{if(e?.toolName===`receptron_avatar`&&e.data){let t=e.data;if(t.avatarUrl&&t.avatarUrl!==C&&(C=t.avatarUrl,D(t.avatarUrl)),t.emotion&&t.emotion!==y&&(console.log(`[Avatar Debug] Emotion changed to:`,t.emotion),y=t.emotion),t.action&&t.action!==`none`){let e=t.actionTimestamp||0;e>S&&(console.log(`[Avatar Debug] Action triggered:`,t.action),b=t.action,x=g?.getElapsedTime()||0,S=e)}}},{deep:!0}),(0,n.onMounted)(()=>{if(T(),c.selectedResult?.toolName===`receptron_avatar`&&c.selectedResult.data){let e=c.selectedResult.data;e.avatarUrl&&(C=e.avatarUrl,D(e.avatarUrl)),e.emotion&&(y=e.emotion)}}),(0,n.onUnmounted)(()=>{k()}),(t,c)=>((0,n.openBlock)(),(0,n.createElementBlock)(`div`,r,[(0,n.createElementVNode)(`div`,{ref_key:`containerRef`,ref:l,class:`size-full`},null,512),u.value?((0,n.openBlock)(),(0,n.createElementBlock)(`div`,i,[...c[0]||=[(0,n.createElementVNode)(`div`,{class:`text-white text-lg`},`Loading Avatar...`,-1)]])):(0,n.createCommentVNode)(``,!0),d.value?((0,n.openBlock)(),(0,n.createElementBlock)(`div`,a,[(0,n.createElementVNode)(`div`,o,(0,n.toDisplayString)(d.value),1)])):(0,n.createCommentVNode)(``,!0),e.isAudioPlaying?((0,n.openBlock)(),(0,n.createElementBlock)(`div`,s,` Speaking... `)):(0,n.createCommentVNode)(``,!0)]))}}),l={class:`p-3 bg-gradient-to-br from-slate-700 to-slate-800 rounded-md`},u={class:`flex flex-col items-center gap-2`},d={key:0,class:`text-xs px-2 py-0.5 bg-blue-500 text-white rounded-full`},f=(0,n.defineComponent)({__name:`Preview`,props:{result:{}},setup(e){let t=e,r=(0,n.computed)(()=>t.result.data),i=(0,n.computed)(()=>r.value?.emotion||`neutral`);return(e,t)=>((0,n.openBlock)(),(0,n.createElementBlock)(`div`,l,[(0,n.createElementVNode)(`div`,u,[t[0]||=(0,n.createElementVNode)(`div`,{class:`size-12 bg-slate-600 rounded-full flex items-center justify-center`},[(0,n.createElementVNode)(`svg`,{class:`size-8 text-slate-300`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[(0,n.createElementVNode)(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z`})])],-1),t[1]||=(0,n.createElementVNode)(`div`,{class:`text-sm font-semibold text-white text-center`},` 3D Avatar `,-1),i.value&&i.value!==`neutral`?((0,n.openBlock)(),(0,n.createElementBlock)(`div`,d,(0,n.toDisplayString)(i.value),1)):(0,n.createCommentVNode)(``,!0)])]))}}),p={...e.n,viewComponent:c,previewComponent:f},m={plugin:p};exports.Preview=f,exports.SAMPLES=e.r,exports.TOOL_DEFINITION=e.i,exports.TOOL_NAME=e.a,exports.View=c,exports.default=m,exports.executeAvatar=e.t,exports.plugin=p,exports.pluginCore=e.n;
package/dist/vue.js CHANGED
@@ -1,192 +1,166 @@
1
- import { S as q, P as J, W as K, a as Q, A as X, D as Y, G as Z, V as ee, b as u, C as te } from "./three-vrm.module-DJ7DURJm.js";
2
- import { TOOL_NAME as I, pluginCore as oe } from "./core.js";
3
- import { SAMPLES as Ae, TOOL_DEFINITION as ye, executeAvatar as Be } from "./core.js";
4
- import { defineComponent as j, ref as P, watch as ne, onMounted as ae, onUnmounted as ie, openBlock as y, createElementBlock as B, createElementVNode as z, createCommentVNode as U, toDisplayString as $, computed as O } from "vue";
5
- const re = { class: "size-full bg-gradient-to-b from-slate-800 to-slate-900 relative" }, se = {
6
- key: 0,
7
- class: "absolute inset-0 flex items-center justify-center bg-slate-900/80"
8
- }, le = {
9
- key: 1,
10
- class: "absolute inset-0 flex items-center justify-center bg-slate-900/80"
11
- }, de = { class: "text-red-400 text-lg text-center p-4" }, ce = {
12
- key: 2,
13
- class: "absolute top-4 right-4 px-3 py-1 bg-green-600 text-white text-sm rounded-full"
14
- }, ue = /* @__PURE__ */ j({
15
- __name: "View",
16
- props: {
17
- selectedResult: {},
18
- sendTextMessage: { type: Function },
19
- isAudioPlaying: { type: Boolean }
20
- },
21
- setup(b) {
22
- const M = b, m = P(null), g = P(!1), k = P(null);
23
- let a = null, f = null, r = null, t = null, A = null, L = null, V = 0, S = "neutral", _ = "none", C = 0, R = 0, E = "";
24
- const G = {
25
- neutral: null,
26
- happy: u.Happy,
27
- sad: u.Sad,
28
- angry: u.Angry,
29
- surprised: u.Surprised
30
- };
31
- function H() {
32
- if (!m.value) return;
33
- const o = m.value, e = o.clientWidth, w = o.clientHeight;
34
- a = new q(), f = new J(30, e / w, 0.1, 100), f.position.set(0, 1.3, 1.5), f.lookAt(0, 1.2, 0), r = new K({ antialias: !0, alpha: !0 }), r.setSize(e, w), r.setPixelRatio(window.devicePixelRatio), r.outputColorSpace = Q, o.appendChild(r.domElement);
35
- const v = new X(16777215, 0.6);
36
- a.add(v);
37
- const l = new Y(16777215, 0.8);
38
- l.position.set(1, 1, 1), a.add(l), A = new te(), window.addEventListener("resize", T), F();
39
- }
40
- function T() {
41
- if (!m.value || !f || !r) return;
42
- const o = m.value.clientWidth, e = m.value.clientHeight;
43
- f.aspect = o / e, f.updateProjectionMatrix(), r.setSize(o, e);
44
- }
45
- async function D(o) {
46
- if (a) {
47
- g.value = !0, k.value = null, t && (a.remove(t.scene), t = null);
48
- try {
49
- const e = new Z();
50
- e.register((l) => new ee(l));
51
- const v = (await e.loadAsync(o)).userData.vrm;
52
- if (!v)
53
- throw new Error("Failed to load VRM data");
54
- a.add(v.scene), t = v, g.value = !1;
55
- } catch (e) {
56
- console.error("Failed to load VRM:", e), k.value = `Failed to load avatar: ${e instanceof Error ? e.message : "Unknown error"}`, g.value = !1;
57
- }
58
- }
59
- }
60
- function F() {
61
- if (L = requestAnimationFrame(F), !A || !r || !a || !f) return;
62
- const o = A.getDelta(), e = A.getElapsedTime();
63
- if (t) {
64
- if (t.update(o), M.isAudioPlaying) {
65
- V += o * 10;
66
- const l = (Math.sin(V) + 1) * 0.3;
67
- t.expressionManager?.setValue(u.Aa, l);
68
- const h = t.humanoid?.getNormalizedBoneNode("head"), d = t.humanoid?.getNormalizedBoneNode("neck"), n = t.humanoid?.getNormalizedBoneNode("spine");
69
- h && (h.rotation.x = Math.sin(e * 2) * 0.08, h.rotation.z = Math.sin(e * 1.5) * 0.05), d && (d.rotation.y = Math.sin(e * 0.8) * 0.05), n && (n.rotation.z = Math.sin(e * 0.5) * 0.03);
70
- const i = t.humanoid?.getNormalizedBoneNode("leftShoulder"), c = t.humanoid?.getNormalizedBoneNode("rightShoulder"), p = t.humanoid?.getNormalizedBoneNode("leftUpperArm"), x = t.humanoid?.getNormalizedBoneNode("rightUpperArm"), s = t.humanoid?.getNormalizedBoneNode("leftLowerArm"), N = t.humanoid?.getNormalizedBoneNode("rightLowerArm");
71
- i && (i.rotation.z = 0.1), c && (c.rotation.z = -0.1), p && (p.rotation.z = -0.8 + Math.sin(e * 1.2) * 0.1, p.rotation.x = 0.4 + Math.sin(e * 0.9) * 0.15, p.rotation.y = Math.sin(e * 0.7) * 0.1), x && (x.rotation.z = 0.8 + Math.sin(e * 1.3) * 0.1, x.rotation.x = 0.4 + Math.sin(e * 1) * 0.15, x.rotation.y = Math.sin(e * 0.8) * 0.1), s && (s.rotation.y = -1 - Math.sin(e * 1.5) * 0.2, s.rotation.z = Math.sin(e * 1.1) * 0.1), N && (N.rotation.y = 1 + Math.sin(e * 1.4) * 0.2, N.rotation.z = Math.sin(e * 1.2) * 0.1);
72
- } else {
73
- V = 0, t.expressionManager?.setValue(u.Aa, 0);
74
- const l = t.humanoid?.getNormalizedBoneNode("spine"), h = t.humanoid?.getNormalizedBoneNode("head");
75
- l && (l.rotation.x = Math.sin(e * 0.8) * 0.02), h && (h.rotation.x = Math.sin(e * 0.3) * 0.03, h.rotation.z = Math.sin(e * 0.2) * 0.02);
76
- const d = t.humanoid?.getNormalizedBoneNode("leftShoulder"), n = t.humanoid?.getNormalizedBoneNode("rightShoulder"), i = t.humanoid?.getNormalizedBoneNode("leftUpperArm"), c = t.humanoid?.getNormalizedBoneNode("rightUpperArm"), p = t.humanoid?.getNormalizedBoneNode("leftLowerArm"), x = t.humanoid?.getNormalizedBoneNode("rightLowerArm");
77
- d && (d.rotation.z = 0.1), n && (n.rotation.z = -0.1), i && (i.rotation.z = -0.9, i.rotation.x = 0.2, i.rotation.y = 0), c && (c.rotation.z = 0.9, c.rotation.x = 0.2, c.rotation.y = 0), p && (p.rotation.y = -0.8), x && (x.rotation.y = 0.8);
78
- }
79
- e % 4 < 0.1 ? t.expressionManager?.setValue(u.Blink, 1) : t.expressionManager?.setValue(u.Blink, 0);
80
- const v = G[S];
81
- if (t.expressionManager?.setValue(u.Happy, 0), t.expressionManager?.setValue(u.Sad, 0), t.expressionManager?.setValue(u.Angry, 0), t.expressionManager?.setValue(u.Surprised, 0), v && t.expressionManager?.setValue(v, 0.8), _ !== "none") {
82
- const l = e - C, h = 1.5;
83
- if (l < h) {
84
- const d = l / h, n = t.humanoid?.getNormalizedBoneNode("head"), i = t.humanoid?.getNormalizedBoneNode("rightUpperArm"), c = t.humanoid?.getNormalizedBoneNode("rightLowerArm"), p = t.humanoid?.getNormalizedBoneNode("spine"), s = ((N) => N < 0.5 ? 2 * N * N : 1 - Math.pow(-2 * N + 2, 2) / 2)(d < 0.5 ? d * 2 : (1 - d) * 2);
85
- switch (_) {
86
- case "nod":
87
- n && (n.rotation.x = Math.sin(d * Math.PI * 3) * 0.2);
88
- break;
89
- case "shake":
90
- n && (n.rotation.y = Math.sin(d * Math.PI * 4) * 0.3);
91
- break;
92
- case "wave":
93
- i && (i.rotation.z = 1.5 * s, i.rotation.x = -0.3 * s), c && (c.rotation.y = 0.5 + Math.sin(d * Math.PI * 6) * 0.3);
94
- break;
95
- case "think":
96
- n && (n.rotation.x = 0.1 * s, n.rotation.z = 0.1 * s), i && (i.rotation.z = 0.3 * s, i.rotation.x = 0.8 * s), c && (c.rotation.y = 1.5 * s);
97
- break;
98
- case "bow":
99
- p && (p.rotation.x = 0.4 * s), n && (n.rotation.x = 0.2 * s);
100
- break;
101
- }
102
- } else
103
- _ = "none";
104
- }
105
- }
106
- r.render(a, f);
107
- }
108
- function W() {
109
- L !== null && (cancelAnimationFrame(L), L = null), window.removeEventListener("resize", T), r && m.value && (m.value.removeChild(r.domElement), r.dispose(), r = null), t && (t = null), a = null, f = null, A = null;
110
- }
111
- return ne(
112
- () => M.selectedResult,
113
- (o) => {
114
- if (o?.toolName === I && o.data) {
115
- const e = o.data;
116
- if (e.avatarUrl && e.avatarUrl !== E && (E = e.avatarUrl, D(e.avatarUrl)), e.emotion && e.emotion !== S && (console.log("[Avatar Debug] Emotion changed to:", e.emotion), S = e.emotion), e.action && e.action !== "none") {
117
- const w = e.actionTimestamp || 0;
118
- w > R && (console.log("[Avatar Debug] Action triggered:", e.action), _ = e.action, C = A?.getElapsedTime() || 0, R = w);
119
- }
120
- }
121
- },
122
- { deep: !0 }
123
- ), ae(() => {
124
- if (H(), M.selectedResult?.toolName === I && M.selectedResult.data) {
125
- const o = M.selectedResult.data;
126
- o.avatarUrl && (E = o.avatarUrl, D(o.avatarUrl)), o.emotion && (S = o.emotion);
127
- }
128
- }), ie(() => {
129
- W();
130
- }), (o, e) => (y(), B("div", re, [
131
- z("div", {
132
- ref_key: "containerRef",
133
- ref: m,
134
- class: "size-full"
135
- }, null, 512),
136
- g.value ? (y(), B("div", se, [...e[0] || (e[0] = [
137
- z("div", { class: "text-white text-lg" }, "Loading Avatar...", -1)
138
- ])])) : U("", !0),
139
- k.value ? (y(), B("div", le, [
140
- z("div", de, $(k.value), 1)
141
- ])) : U("", !0),
142
- b.isAudioPlaying ? (y(), B("div", ce, " Speaking... ")) : U("", !0)
143
- ]));
144
- }
145
- }), me = { class: "p-3 bg-gradient-to-br from-slate-700 to-slate-800 rounded-md" }, he = { class: "flex flex-col items-center gap-2" }, pe = {
146
- key: 0,
147
- class: "text-xs px-2 py-0.5 bg-blue-500 text-white rounded-full"
148
- }, fe = /* @__PURE__ */ j({
149
- __name: "Preview",
150
- props: {
151
- result: {}
152
- },
153
- setup(b) {
154
- const M = b, m = O(() => M.result.data), g = O(() => m.value?.emotion || "neutral");
155
- return (k, a) => (y(), B("div", me, [
156
- z("div", he, [
157
- a[0] || (a[0] = z("div", { class: "size-12 bg-slate-600 rounded-full flex items-center justify-center" }, [
158
- z("svg", {
159
- class: "size-8 text-slate-300",
160
- fill: "none",
161
- stroke: "currentColor",
162
- viewBox: "0 0 24 24"
163
- }, [
164
- z("path", {
165
- "stroke-linecap": "round",
166
- "stroke-linejoin": "round",
167
- "stroke-width": "2",
168
- d: "M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z"
169
- })
170
- ])
171
- ], -1)),
172
- a[1] || (a[1] = z("div", { class: "text-sm font-semibold text-white text-center" }, " 3D Avatar ", -1)),
173
- g.value && g.value !== "neutral" ? (y(), B("div", pe, $(g.value), 1)) : U("", !0)
174
- ])
175
- ]));
176
- }
177
- }), ge = {
178
- ...oe,
179
- viewComponent: ue,
180
- previewComponent: fe
181
- }, ze = { plugin: ge };
182
- export {
183
- fe as Preview,
184
- Ae as SAMPLES,
185
- ye as TOOL_DEFINITION,
186
- I as TOOL_NAME,
187
- ue as View,
188
- ze as default,
189
- Be as executeAvatar,
190
- ge as plugin,
191
- oe as pluginCore
192
- };
1
+ import { a as e, i as t, n, r, t as i } from "./plugin-Cezk5ZnX.js";
2
+ import { a, c as o, i as s, l as c, n as l, o as u, r as d, s as f, t as p, u as m } from "./three-vrm.module-BlO9zbj_.js";
3
+ import { computed as h, createCommentVNode as g, createElementBlock as _, createElementVNode as v, defineComponent as y, onMounted as b, onUnmounted as x, openBlock as S, ref as C, toDisplayString as w, watch as T } from "vue";
4
+ //#region src/vue/View.vue?vue&type=script&setup=true&lang.ts
5
+ var E = { class: "size-full bg-gradient-to-b from-slate-800 to-slate-900 relative" }, D = {
6
+ key: 0,
7
+ class: "absolute inset-0 flex items-center justify-center bg-slate-900/80"
8
+ }, O = {
9
+ key: 1,
10
+ class: "absolute inset-0 flex items-center justify-center bg-slate-900/80"
11
+ }, k = { class: "text-red-400 text-lg text-center p-4" }, A = {
12
+ key: 2,
13
+ class: "absolute top-4 right-4 px-3 py-1 bg-green-600 text-white text-sm rounded-full"
14
+ }, j = /* @__PURE__ */ y({
15
+ __name: "View",
16
+ props: {
17
+ selectedResult: {},
18
+ sendTextMessage: { type: Function },
19
+ isAudioPlaying: { type: Boolean }
20
+ },
21
+ setup(e) {
22
+ let t = e, n = C(null), r = C(!1), i = C(null), h = null, y = null, j = null, M = null, N = null, P = null, F = 0, I = "neutral", L = "none", R = 0, z = 0, B = "", V = {
23
+ neutral: null,
24
+ happy: p.Happy,
25
+ sad: p.Sad,
26
+ angry: p.Angry,
27
+ surprised: p.Surprised
28
+ };
29
+ function H() {
30
+ if (!n.value) return;
31
+ let e = n.value, t = e.clientWidth, r = e.clientHeight;
32
+ h = new m(), y = new o(30, t / r, .1, 100), y.position.set(0, 1.3, 1.5), y.lookAt(0, 1.2, 0), j = new s({
33
+ antialias: !0,
34
+ alpha: !0
35
+ }), j.setSize(t, r), j.setPixelRatio(window.devicePixelRatio), j.outputColorSpace = c, e.appendChild(j.domElement);
36
+ let i = new a(16777215, .6);
37
+ h.add(i);
38
+ let l = new f(16777215, .8);
39
+ l.position.set(1, 1, 1), h.add(l), N = new u(), window.addEventListener("resize", U), G();
40
+ }
41
+ function U() {
42
+ if (!n.value || !y || !j) return;
43
+ let e = n.value.clientWidth, t = n.value.clientHeight;
44
+ y.aspect = e / t, y.updateProjectionMatrix(), j.setSize(e, t);
45
+ }
46
+ async function W(e) {
47
+ if (h) {
48
+ r.value = !0, i.value = null, M &&= (h.remove(M.scene), null);
49
+ try {
50
+ let t = new d();
51
+ t.register((e) => new l(e));
52
+ let n = (await t.loadAsync(e)).userData.vrm;
53
+ if (!n) throw Error("Failed to load VRM data");
54
+ h.add(n.scene), M = n, r.value = !1;
55
+ } catch (e) {
56
+ console.error("Failed to load VRM:", e), i.value = `Failed to load avatar: ${e instanceof Error ? e.message : "Unknown error"}`, r.value = !1;
57
+ }
58
+ }
59
+ }
60
+ function G() {
61
+ if (P = requestAnimationFrame(G), !N || !j || !h || !y) return;
62
+ let e = N.getDelta(), n = N.getElapsedTime();
63
+ if (M) {
64
+ if (M.update(e), t.isAudioPlaying) {
65
+ F += e * 10;
66
+ let t = (Math.sin(F) + 1) * .3;
67
+ M.expressionManager?.setValue(p.Aa, t);
68
+ let r = M.humanoid?.getNormalizedBoneNode("head"), i = M.humanoid?.getNormalizedBoneNode("neck"), a = M.humanoid?.getNormalizedBoneNode("spine");
69
+ r && (r.rotation.x = Math.sin(n * 2) * .08, r.rotation.z = Math.sin(n * 1.5) * .05), i && (i.rotation.y = Math.sin(n * .8) * .05), a && (a.rotation.z = Math.sin(n * .5) * .03);
70
+ let o = M.humanoid?.getNormalizedBoneNode("leftShoulder"), s = M.humanoid?.getNormalizedBoneNode("rightShoulder"), c = M.humanoid?.getNormalizedBoneNode("leftUpperArm"), l = M.humanoid?.getNormalizedBoneNode("rightUpperArm"), u = M.humanoid?.getNormalizedBoneNode("leftLowerArm"), d = M.humanoid?.getNormalizedBoneNode("rightLowerArm");
71
+ o && (o.rotation.z = .1), s && (s.rotation.z = -.1), c && (c.rotation.z = -.8 + Math.sin(n * 1.2) * .1, c.rotation.x = .4 + Math.sin(n * .9) * .15, c.rotation.y = Math.sin(n * .7) * .1), l && (l.rotation.z = .8 + Math.sin(n * 1.3) * .1, l.rotation.x = .4 + Math.sin(n * 1) * .15, l.rotation.y = Math.sin(n * .8) * .1), u && (u.rotation.y = -1 - Math.sin(n * 1.5) * .2, u.rotation.z = Math.sin(n * 1.1) * .1), d && (d.rotation.y = 1 + Math.sin(n * 1.4) * .2, d.rotation.z = Math.sin(n * 1.2) * .1);
72
+ } else {
73
+ F = 0, M.expressionManager?.setValue(p.Aa, 0);
74
+ let e = M.humanoid?.getNormalizedBoneNode("spine"), t = M.humanoid?.getNormalizedBoneNode("head");
75
+ e && (e.rotation.x = Math.sin(n * .8) * .02), t && (t.rotation.x = Math.sin(n * .3) * .03, t.rotation.z = Math.sin(n * .2) * .02);
76
+ let r = M.humanoid?.getNormalizedBoneNode("leftShoulder"), i = M.humanoid?.getNormalizedBoneNode("rightShoulder"), a = M.humanoid?.getNormalizedBoneNode("leftUpperArm"), o = M.humanoid?.getNormalizedBoneNode("rightUpperArm"), s = M.humanoid?.getNormalizedBoneNode("leftLowerArm"), c = M.humanoid?.getNormalizedBoneNode("rightLowerArm");
77
+ r && (r.rotation.z = .1), i && (i.rotation.z = -.1), a && (a.rotation.z = -.9, a.rotation.x = .2, a.rotation.y = 0), o && (o.rotation.z = .9, o.rotation.x = .2, o.rotation.y = 0), s && (s.rotation.y = -.8), c && (c.rotation.y = .8);
78
+ }
79
+ n % 4 < .1 ? M.expressionManager?.setValue(p.Blink, 1) : M.expressionManager?.setValue(p.Blink, 0);
80
+ let r = V[I];
81
+ if (M.expressionManager?.setValue(p.Happy, 0), M.expressionManager?.setValue(p.Sad, 0), M.expressionManager?.setValue(p.Angry, 0), M.expressionManager?.setValue(p.Surprised, 0), r && M.expressionManager?.setValue(r, .8), L !== "none") {
82
+ let e = n - R, t = 1.5;
83
+ if (e < t) {
84
+ let n = e / t, r = M.humanoid?.getNormalizedBoneNode("head"), i = M.humanoid?.getNormalizedBoneNode("rightUpperArm"), a = M.humanoid?.getNormalizedBoneNode("rightLowerArm"), o = M.humanoid?.getNormalizedBoneNode("spine"), s = ((e) => e < .5 ? 2 * e * e : 1 - (-2 * e + 2) ** 2 / 2)(n < .5 ? n * 2 : (1 - n) * 2);
85
+ switch (L) {
86
+ case "nod":
87
+ r && (r.rotation.x = Math.sin(n * Math.PI * 3) * .2);
88
+ break;
89
+ case "shake":
90
+ r && (r.rotation.y = Math.sin(n * Math.PI * 4) * .3);
91
+ break;
92
+ case "wave":
93
+ i && (i.rotation.z = 1.5 * s, i.rotation.x = -.3 * s), a && (a.rotation.y = .5 + Math.sin(n * Math.PI * 6) * .3);
94
+ break;
95
+ case "think":
96
+ r && (r.rotation.x = .1 * s, r.rotation.z = .1 * s), i && (i.rotation.z = .3 * s, i.rotation.x = .8 * s), a && (a.rotation.y = 1.5 * s);
97
+ break;
98
+ case "bow":
99
+ o && (o.rotation.x = .4 * s), r && (r.rotation.x = .2 * s);
100
+ break;
101
+ }
102
+ } else L = "none";
103
+ }
104
+ }
105
+ j.render(h, y);
106
+ }
107
+ function K() {
108
+ P !== null && (cancelAnimationFrame(P), P = null), window.removeEventListener("resize", U), j && n.value && (n.value.removeChild(j.domElement), j.dispose(), j = null), M &&= null, h = null, y = null, N = null;
109
+ }
110
+ return T(() => t.selectedResult, (e) => {
111
+ if (e?.toolName === "receptron_avatar" && e.data) {
112
+ let t = e.data;
113
+ if (t.avatarUrl && t.avatarUrl !== B && (B = t.avatarUrl, W(t.avatarUrl)), t.emotion && t.emotion !== I && (console.log("[Avatar Debug] Emotion changed to:", t.emotion), I = t.emotion), t.action && t.action !== "none") {
114
+ let e = t.actionTimestamp || 0;
115
+ e > z && (console.log("[Avatar Debug] Action triggered:", t.action), L = t.action, R = N?.getElapsedTime() || 0, z = e);
116
+ }
117
+ }
118
+ }, { deep: !0 }), b(() => {
119
+ if (H(), t.selectedResult?.toolName === "receptron_avatar" && t.selectedResult.data) {
120
+ let e = t.selectedResult.data;
121
+ e.avatarUrl && (B = e.avatarUrl, W(e.avatarUrl)), e.emotion && (I = e.emotion);
122
+ }
123
+ }), x(() => {
124
+ K();
125
+ }), (t, a) => (S(), _("div", E, [
126
+ v("div", {
127
+ ref_key: "containerRef",
128
+ ref: n,
129
+ class: "size-full"
130
+ }, null, 512),
131
+ r.value ? (S(), _("div", D, [...a[0] ||= [v("div", { class: "text-white text-lg" }, "Loading Avatar...", -1)]])) : g("", !0),
132
+ i.value ? (S(), _("div", O, [v("div", k, w(i.value), 1)])) : g("", !0),
133
+ e.isAudioPlaying ? (S(), _("div", A, " Speaking... ")) : g("", !0)
134
+ ]));
135
+ }
136
+ }), M = { class: "p-3 bg-gradient-to-br from-slate-700 to-slate-800 rounded-md" }, N = { class: "flex flex-col items-center gap-2" }, P = {
137
+ key: 0,
138
+ class: "text-xs px-2 py-0.5 bg-blue-500 text-white rounded-full"
139
+ }, F = /* @__PURE__ */ y({
140
+ __name: "Preview",
141
+ props: { result: {} },
142
+ setup(e) {
143
+ let t = e, n = h(() => t.result.data), r = h(() => n.value?.emotion || "neutral");
144
+ return (e, t) => (S(), _("div", M, [v("div", N, [
145
+ t[0] ||= v("div", { class: "size-12 bg-slate-600 rounded-full flex items-center justify-center" }, [v("svg", {
146
+ class: "size-8 text-slate-300",
147
+ fill: "none",
148
+ stroke: "currentColor",
149
+ viewBox: "0 0 24 24"
150
+ }, [v("path", {
151
+ "stroke-linecap": "round",
152
+ "stroke-linejoin": "round",
153
+ "stroke-width": "2",
154
+ d: "M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z"
155
+ })])], -1),
156
+ t[1] ||= v("div", { class: "text-sm font-semibold text-white text-center" }, " 3D Avatar ", -1),
157
+ r.value && r.value !== "neutral" ? (S(), _("div", P, w(r.value), 1)) : g("", !0)
158
+ ])]));
159
+ }
160
+ }), I = {
161
+ ...n,
162
+ viewComponent: j,
163
+ previewComponent: F
164
+ }, L = { plugin: I };
165
+ //#endregion
166
+ export { F as Preview, r as SAMPLES, t as TOOL_DEFINITION, e as TOOL_NAME, j as View, L as default, i as executeAvatar, I as plugin, n as pluginCore };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gui-chat-plugin/avatar",
3
- "version": "0.0.3",
3
+ "version": "0.0.4",
4
4
  "description": "3D Avatar Plugin for GUIChat - VRM avatar with lip-sync",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -56,26 +56,27 @@
56
56
  }
57
57
  },
58
58
  "devDependencies": {
59
- "@tailwindcss/vite": "^4.1.18",
59
+ "@eslint/js": "^10.0.1",
60
+ "@tailwindcss/vite": "^4.2.2",
60
61
  "@types/react": "^19.0.0",
61
62
  "@types/react-dom": "^19.0.0",
62
63
  "@types/three": "^0.174.0",
63
- "@typescript-eslint/eslint-plugin": "^8.53.0",
64
- "@typescript-eslint/parser": "^8.53.0",
64
+ "@typescript-eslint/eslint-plugin": "^8.58.0",
65
+ "@typescript-eslint/parser": "^8.58.0",
65
66
  "@vitejs/plugin-react": "^4.5.0",
66
- "@vitejs/plugin-vue": "^6.0.3",
67
- "eslint": "^9.39.2",
68
- "eslint-plugin-vue": "^10.6.2",
69
- "globals": "^17.0.0",
67
+ "@vitejs/plugin-vue": "^6.0.5",
68
+ "eslint": "^10.1.0",
69
+ "eslint-plugin-vue": "^10.8.0",
70
+ "globals": "^17.4.0",
70
71
  "openai": "^6.16.0",
71
72
  "react": "^19.0.0",
72
73
  "react-dom": "^19.0.0",
73
- "tailwindcss": "^4.1.18",
74
+ "tailwindcss": "^4.2.2",
74
75
  "typescript": "~5.9.3",
75
- "vite": "^7.3.1",
76
- "vue": "^3.5.26",
77
- "vue-eslint-parser": "^10.2.0",
78
- "vue-tsc": "^3.2.2"
76
+ "vite": "^8.0.3",
77
+ "vue": "^3.5.31",
78
+ "vue-eslint-parser": "^10.4.0",
79
+ "vue-tsc": "^3.2.6"
79
80
  },
80
81
  "keywords": [
81
82
  "guichat",