@graphen.ai/aiia-sdk 1.0.18 → 1.0.20

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.
@@ -0,0 +1,101 @@
1
+ 'use strict';var lodashEs=require('lodash-es'),ne=require('moment'),rxjs=require('rxjs'),socket_ioClient=require('socket.io-client'),tasksVision=require('@mediapipe/tasks-vision');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var ne__default=/*#__PURE__*/_interopDefault(ne);/**
2
+ * MIT License
3
+ *
4
+ * Copyright (c) 2026 Graphen
5
+ *
6
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ * of this software and associated documentation files (the "Software"), to deal
8
+ * in the Software without restriction, including without limitation the rights
9
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ * copies of the Software, and to permit persons to whom the Software is
11
+ * furnished to do so, subject to the following conditions:
12
+ *
13
+ * The above copyright notice and this permission notice shall be included in all
14
+ * copies or substantial portions of the Software.
15
+ *
16
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
+ * SOFTWARE.
23
+ *
24
+ * UPDATA DATE: 2026/2/11
25
+ */
26
+ var P=typeof window<"u";typeof process<"u"&&process.versions!=null&&process.versions.node!=null;function B(c,e){let t=typeof e=="number"?e:NaN;if(c){let i=Number(c);return isNaN(i)?t:i}else return t}var x=class{constructor(e){this.config=e;}get webserver(){return this.safeRead("webserver")}get environment(){let e=this.safeRead("env");return typeof e=="string"?e:"production"}get license(){return this.safeRead("group_id")??this.safeRead("license")??""}get note(){return this.safeRead("note")}get port(){return B(process.env.PORT,this.safeRead("port")??3e3)}get ws_url(){let e=this.safeRead("ws_url");return typeof e=="string"?e:""}get worklet_url(){let e=this.safeRead("worklet_url");return typeof e=="string"?e:""}get project(){let e=this.safeRead("project");if(e===void 0)return {specific:false};if(typeof e=="string")return {name:e,id:e,specific:false};{let t=lodashEs.get(e,"id",void 0),i=lodashEs.get(e,"name",void 0);return {id:typeof t=="string"?t:void 0,name:typeof i=="string"?i:void 0,specific:true}}}get endPoint(){let e="dev";switch(this.environment){case "production":e="prod";break;case "test":e="test";break;}let t=`graphen-agentic-workflow-${e}-21193779403.asia-east1.run.app`;return {api:`https://${t}`,socket:`wss://${t}`}}get debug(){return this.safeRead("debug")??true}get mediaStream(){return this.safeRead("mediaStream")}get chunkTimeInSeconds(){let t=this.safeRead("chunkTimeInSeconds");return typeof t=="number"&&t>0?t:.3}get llmSampleRate(){let t=this.safeRead("llmSampleRate");return typeof t=="number"&&t>0?t:16e3}get detection(){return lodashEs.assign({perSecond:3,confidence:80},this.safeRead("faceDetection"),this.safeRead("cameraDetection"))}get autoClearSubtitle(){let e=this.safeRead("autoClearUserSubtitle"),t=this.safeRead("autoClearAiiaSubtitle");return {userDelayTime:typeof e=="number"?e:5e3,aiiaDelayTime:typeof t=="number"?t:NaN}}get eyeTrackEnable(){return !!this.safeRead("eyeTrackEnable")}get eyeTrackCorrection(){return lodashEs.assign({x_axis_px:0,y_axis_px:0},this.safeRead("correction"))}safeRead(e){return lodashEs.get(this.config,e,void 0)}};var p={code:console.log,debug:console.log,info:console.log,warn:console.warn,error:console.error,fatal:console.error},H=[];function $(...c){return H.push(...c),$}function z(c){function e(o){if(o===void 0||o==="all")return {code:true,error:true,warn:true,info:true,debug:true,fatal:true};if(o==="none")return {error:false,code:false,warn:false,info:false,debug:false,fatal:false};if(typeof o=="boolean")return {code:o,error:o,warn:o,info:o,debug:o,fatal:o};{let l=new Set(o);return {code:l.has("code"),debug:l.has("debug"),fatal:l.has("fatal"),error:l.has("error"),warn:l.has("warn"),info:l.has("info")}}}let{info:t,error:i,warn:a,debug:s,fatal:n,code:r}=e(c);return r||(p.code=()=>{}),s||(p.debug=()=>{}),t||(p.info=()=>{}),a||(p.warn=()=>{}),i||(p.error=()=>{}),n||(p.fatal=()=>{}),$}function K(c){return new Proxy(p,{get(e,t,i){if(typeof t=="string")switch(t){case "debug":case "info":case "error":case "warn":case "fatal":case "code":return (...a)=>{let s=ne__default.default().format("yyyy-MM-DD[T]HH:mm:ss:sss");lodashEs.forEach(H,n=>{(n.category===void 0||n.category.includes(c))&&n.next(t,s,c,...a);}),e[t](`[Aiia::${t}_${s}_](${c})`,...a);};default:return}else return},set(e,t,i,a){return true}})}var u=K("default");function F(c){return function(e,t){let{width:i,height:a}=t,s=lodashEs.filter(e,r=>(r.categories[0]?.score??0)*100>=c),n=lodashEs.compact(lodashEs.map(s,r=>{if(r.boundingBox!==void 0){let o=r.boundingBox,l=o.width*o.height,d=r.categories[0]?.score??0;return {...o,area:l,score:d*100,clientWidth:i,clientHeight:a}}else return null}));return lodashEs.sortBy(n,["area","score"])[0]??null}}var A=class{socket;messageSub;destorySub;get message(){return this.messageSub.asObservable()}constructor(e){this.destorySub=new rxjs.Subject,this.messageSub=new rxjs.Subject;let{specific:t,id:i}=e.project;this.socket=socket_ioClient.io(e.ws_url,lodashEs.assign({autoConnect:false},t&&i!==void 0?{query:{uuid:i}}:{}));}start(){let e="list",t="cloud",i="channel",a="monitor";rxjs.fromEvent(this.socket,"connect").pipe(rxjs.takeUntil(this.destorySub)).subscribe(()=>{u.debug("Client ID: ",this.socket.id);}),rxjs.fromEvent(this.socket,e).pipe(rxjs.take(1),rxjs.takeUntil(this.destorySub)).subscribe(s=>{this.messageSub.next({event:e,data:s});}),rxjs.fromEvent(this.socket,t).pipe(rxjs.takeUntil(this.destorySub)).subscribe(s=>{this.messageSub.next({event:t,data:s});}),rxjs.fromEvent(this.socket,i).pipe(rxjs.takeUntil(this.destorySub)).subscribe(s=>{this.messageSub.next({event:i,data:s});}),rxjs.fromEvent(this.socket,a).pipe(rxjs.takeUntil(this.destorySub)).subscribe(s=>{this.messageSub.next({event:a,data:s});}),this.socket.connect();}send(e,t){this.socket.emit(e,t);}sendToCloud(e){this.send("cloud",e);}onDestroy(){this.destorySub.next(),this.destorySub.complete(),this.messageSub.complete(),this.socket.disconnect();}};async function V(c){try{return await navigator.mediaDevices.getUserMedia(c)}catch{return null}}function E(c){let e=new Float32Array(c.length);for(let t=0;t<c.length;t++)e[t]=c[t]/32768;return e}function M(c,e,t){if(e===t)return c;let i=t/e,a=c.length,s=Math.ceil(a*i),n=new Float32Array(s),r=1/i,o=0;for(let l=0;l<s;l++){let d=o|0,g=o-d,m=c[d],T=d+1<a?c[d+1]:m;n[l]=m+(T-m)*g,o+=r;}return n}function W(c){let e=c.length,t=new Array(e);for(let i=0;i<e;i++){let a=c[i]*32768;t[i]=a<-32768?-32768:a>32767?32767:a;}return t}var R=class{constructor(e){this.audioContext=e;this.bufferQueue=[],this.currentNode=null,this.gainNode=this.audioContext.createGain(),this.gainNode.connect(this.audioContext.destination);}type="audio";currentNode;bufferQueue;gainNode;set volume(e){e<0&&(e=0),e>100&&(e=100),this.gainNode.gain.value=e/100;}get volume(){return Math.round(this.gainNode.gain.value*100)}addBuffer(e){this.bufferQueue.push(e);}addBufferByFloat32(e,t=1){let i=e.length,a=this.audioContext.sampleRate,s=this.audioContext.createBuffer(t,i,a),n=e.slice();for(let r=0;r<t;r++)s.copyToChannel(n,r);this.addBuffer(s);}addBufferByInt16(e,t=1){this.addBufferByFloat32(E(e),t);}startSpeech(){this.currentNode===null&&this.continue();}pauseSpeech(){this.audioContext.suspend().catch(e=>{u.error("pause speech fail",e);});}resumeSpeech(){this.audioContext.resume().catch(e=>{u.error("resume speech fail",e);});}nextSpeech(){this.bufferQueue.length>0&&(this.clearNode(),this.continue());}stopSpeech(){this.bufferQueue=[],this.clearNode();}clearNode(){this.currentNode&&(this.currentNode.onended=function(){},this.currentNode.stop(),this.currentNode.disconnect(),this.currentNode=null);}continue(){let e=this.bufferQueue.shift();if(e){this.currentNode=this.audioContext.createBufferSource(),this.currentNode.buffer=e,this.currentNode.connect(this.gainNode);let t=this.continue.bind(this);this.currentNode.onended=t,this.currentNode.start();}else this.clearNode();}};var _=class extends HTMLElement{_shadow;_canvas;_ctx;_mode="waveform";_color="#00ffcc";_sampleRate=16e3;_isDebug=false;_ringBuffer;_bufferCapacity;_writePtr=0;_readPtr=0;_currentSize=0;_displayBuffer;_timeModifier=0;_smoothedVolume=0;_animationId=null;static get observedAttributes(){return ["mode","color","debug"]}constructor(){super(),this.id="AiiaVisualizer",this._shadow=this.attachShadow({mode:"open"}),this._canvas=document.createElement("canvas"),this._ctx=this._canvas.getContext("2d",{alpha:false}),this._settingStyle(),this._shadow.append(this._canvas),this._bufferCapacity=48e3,this._ringBuffer=new Float32Array(this._bufferCapacity),this._displayBuffer=new Float32Array(0);}attributeChangedCallback(e,t,i){switch(e){case "mode":(i==="waveform"||i==="siri")&&(this._mode=i,this._resetCanvas());break;case "color":i&&(this._color=i);break;case "debug":this._isDebug=i===null?false:i==="true"||i==="",this._isDebug?this.startRendering():this.stopRendering(),this.style.visibility=this._isDebug?"visible":"hidden";break}}connectedCallback(){this._setSize(),window.addEventListener("resize",()=>this._setSize());}disconnectedCallback(){this.stopRendering();}setSampleRate(e){this._sampleRate=e,this._bufferCapacity<e&&(this._bufferCapacity=e,this._ringBuffer=new Float32Array(this._bufferCapacity),this._writePtr=0,this._readPtr=0,this._currentSize=0);}addPcm(e){if(this._animationId===null)return;let t=e.length;for(let i=0;i<t;i++)this._ringBuffer[this._writePtr]=e[i],this._writePtr=(this._writePtr+1)%this._bufferCapacity;this._currentSize=Math.min(this._bufferCapacity,this._currentSize+t),this._currentSize===this._bufferCapacity&&t>0&&(this._readPtr=this._writePtr);}startRendering(){if(this._animationId!==null)return;let e=performance.now(),t=i=>{let a=(i-e)/1e3;e=i,this._update(a),this._draw(),this._animationId=requestAnimationFrame(t);};this._animationId=requestAnimationFrame(t);}stopRendering(){this._animationId!==null&&(cancelAnimationFrame(this._animationId),this._animationId=null),this._currentSize=0,this._writePtr=0,this._readPtr=0,this._smoothedVolume=0;}_settingStyle(){let e=document.createElement("style");e.textContent=`
27
+ :host {
28
+ display: block;
29
+ width: 300px;
30
+ height: 100px;
31
+ border-radius: 8px;
32
+ background-color: black;
33
+ overflow: hidden;
34
+ visibility: hidden;
35
+ position: fixed;
36
+ bottom: 0;
37
+ left: 0;
38
+ }
39
+ canvas {
40
+ width: 100%;
41
+ height: 100%;
42
+ display: block;
43
+ }
44
+ `,this._shadow.append(e);}_setSize(){let e=this.getBoundingClientRect(),t=window.devicePixelRatio||1,i=this._mode==="siri"?Math.min(t,1.5):t;this._canvas.width=e.width*i,this._canvas.height=e.height*i,this._displayBuffer=new Float32Array(Math.floor(this._canvas.width));}_update(e){performance.mark("visualizer-update-start"),this._timeModifier+=e;let t=Math.floor(this._sampleRate*e);if(this._currentSize>0&&t>0){let i=Math.min(t,this._currentSize),a=new Float32Array(i),s=0;for(let r=0;r<i;r++){let o=this._ringBuffer[this._readPtr];s+=o*o,a[r]=o,this._readPtr=(this._readPtr+1)%this._bufferCapacity;}this._currentSize-=i;let n=Math.sqrt(s/i);if(this._smoothedVolume+=(n*5-this._smoothedVolume)*.15,this._mode==="waveform"){let r=this._displayBuffer.length;performance.mark("resample-start");let o=M(a,i,r);performance.mark("resample-end"),performance.measure("Aiia Resample PCM","resample-start","resample-end");let l=o.length;l<r?(this._displayBuffer.copyWithin(0,l),this._displayBuffer.set(o,r-l)):this._displayBuffer.set(o.subarray(l-r));}}else this._smoothedVolume*=.9;performance.mark("visualizer-update-end"),performance.measure("Aiia Visualizer Update","visualizer-update-start","visualizer-update-end");}_draw(){performance.mark("visualizer-draw-start");let{width:e,height:t}=this._canvas;this._ctx.fillStyle="black",this._ctx.fillRect(0,0,e,t),this._mode==="waveform"?this._drawWaveform(e,t):this._drawSiri(e,t),performance.mark("visualizer-draw-end"),performance.measure("Aiia Visualizer Draw","visualizer-draw-start","visualizer-draw-end");}_drawWaveform(e,t){let i=this._ctx,a=t/2;i.beginPath(),i.strokeStyle=this._color,i.lineWidth=1.5;for(let s=0;s<e;s++){let n=this._displayBuffer[s],r=a+n*a*.8;s===0?i.moveTo(s,r):i.lineTo(s,r);}i.stroke();}_drawSiri(e,t){let i=this._ctx,a=t/2,s=Math.max(this._smoothedVolume,.02);i.globalCompositeOperation="lighter";let n=[{color:this._color,f:.003,s:1.5,a:.6},{color:"#ff00ff",f:.002,s:1,a:.4}];for(let r of n){i.beginPath(),i.strokeStyle=r.color,i.lineWidth=2;for(let o=0;o<=e;o+=4){let l=o/e*2-1,d=Math.pow(Math.cos(l*Math.PI/2),3),g=Math.sin(o*r.f+this._timeModifier*r.s),m=a+t*.4*s*r.a*d*g;o===0?i.moveTo(o,m):i.lineTo(o,m);}i.stroke();}i.globalCompositeOperation="source-over";}_resetCanvas(){this._ctx.fillRect(0,0,this._canvas.width,this._canvas.height);}};customElements.define("aiia-audio",_);var S=class extends HTMLElement{static get observedAttributes(){return ["debug"]}_shadow;_containerEl;_styleEl;_videoEl;_canvasEl;_canvasCtx;_isDebug;_debugElements;_statsEl;_interval;_lastTimestamp;_isProcessing;_loopFrameID;_faceDetector;_detectionsSub;_poseLandmarker;_landmarksSub;_isReady;_drawingUtils;landmarkColors=["gray","lightgray","gray","gray","lightgray"];connectorColors=["green","blue","red","yellow","purple"];get detections(){return this._detectionsSub.asObservable()}get landmarks(){return this._landmarksSub.asObservable()}get videoSize(){return {width:this._videoEl.videoWidth,height:this._videoEl.videoHeight}}constructor(){super(),this.id="AiiaCamera",this._isDebug=false,this._isReady=false,this._shadow=this.attachShadow({mode:"open"}),this._containerEl=document.createElement("div"),this._videoEl=document.createElement("video"),this._styleEl=document.createElement("style"),this._canvasEl=document.createElement("canvas"),this._statsEl=document.createElement("div"),this._debugElements=[],this._loopFrameID=null,this._detectionsSub=new rxjs.Subject,this._landmarksSub=new rxjs.Subject,this._interval=Math.ceil(1e3/3),this._lastTimestamp=0,this._isProcessing=false,this.predictWebcam=this.predictWebcam.bind(this),this._settingContainer(),this._settingStyle(),this._settingVideo(),this._containerEl.appendChild(this._videoEl),this._containerEl.appendChild(this._canvasEl),this._containerEl.appendChild(this._statsEl),this._shadow.appendChild(this._styleEl),this._shadow.appendChild(this._containerEl);let e=this._canvasEl.getContext("2d");e?(this._canvasCtx=e,this._drawingUtils=new tasksVision.DrawingUtils(this._canvasCtx)):(this._canvasCtx=null,this._drawingUtils=null);}connectedCallback(){}disconnectedCallback(){this.stopCapture();}attributeChangedCallback(e,t,i){e==="debug"&&(this._isDebug=i===null?false:i==="true"||i==="",this._containerEl.style.visibility=this._isDebug?"visible":"hidden");}setStream(e){this._videoEl.onloadedmetadata=()=>{this._isReady=true;},this._videoEl.srcObject=e;}setFaceDetector(e){this._faceDetector=e;}setPoseLandmarker(e){this._poseLandmarker=e;}setFrequency(e){this._interval=Math.ceil(1e3/e);}_settingStyle(){this._styleEl.textContent=`
45
+ .aiia_container {
46
+ visibility: hidden;
47
+ position: fixed;
48
+ top: 0;
49
+ left: 0;
50
+ > canvas {
51
+ position: absolute;
52
+ top: 0;
53
+ left: 0;
54
+ width: 640px;
55
+ height: 480px;
56
+ }
57
+ }
58
+ .aiia_stats {
59
+ position: absolute;
60
+ top: 10px;
61
+ left: 10px;
62
+ background: rgba(0, 0, 0, 0.75);
63
+ color: green;
64
+ padding: 8px;
65
+ font-size: 11px;
66
+ font-family: 'Courier New', Courier, monospace;
67
+ z-index: 100;
68
+ border: 1px solid green;
69
+ border-radius: 4px;
70
+ pointer-events: none;
71
+ line-height: 1.4;
72
+ }
73
+ .aiia_container .highlighter {
74
+ background: rgba(0, 255, 0, 0.2);
75
+ border: 1px dashed #fff;
76
+ z-index: 1;
77
+ }
78
+ .aiia_container .confidence {
79
+ padding-bottom: 5px;
80
+ padding-top: 5px;
81
+ background-color: #007f8b;
82
+ color: #fff;
83
+ z-index: 2;
84
+ font-size: 10px;
85
+ margin: 0;
86
+ white-space: nowrap;
87
+ }
88
+ .aiia_container .highlighter,
89
+ .aiia_container .confidence {
90
+ position: absolute;
91
+ top: 0;
92
+ right: 0;
93
+ will-change: transform;
94
+ transition: none;
95
+ }
96
+ `;}_settingContainer(){this._containerEl.classList.add("aiia_container");}_settingVideo(){this._videoEl.autoplay=true,this._videoEl.playsInline=true,this._videoEl.muted=true;}getVideo(){return this._videoEl}startCapture(){this._loopFrameID===null&&(this._loopFrameID=window.requestAnimationFrame(this.predictWebcam));}stopCapture(){this._loopFrameID!==null&&(window.cancelAnimationFrame(this._loopFrameID),this._loopFrameID=null,this._drawRect([]),this._drawRect2([]));}async predictWebcam(){if(this._loopFrameID=window.requestAnimationFrame(this.predictWebcam),this._isReady&&!this._isProcessing){this._isProcessing=true;let e=performance.now();if(this._lastTimestamp+this._interval<=e){this._lastTimestamp=e,performance.mark("aiia-imageBitmap-start");let t=await createImageBitmap(this._videoEl).catch(()=>null);if(performance.mark("aiia-imageBitmap-end"),performance.measure("Aiia ImageBitmap","aiia-imageBitmap-start","aiia-imageBitmap-end"),t===null){this._isProcessing=false;return}performance.mark("aiia-detect-start");let i=this._faceDetector?.detect(t).detections,a=this._poseLandmarker?.detect(t).landmarks;performance.mark("aiia-detect-end"),performance.measure("Aiia Detection","aiia-detect-start","aiia-detect-end"),this._isDebug&&i&&a&&(performance.mark("aiia-el-start"),this._drawRect(i),this._drawRect2(a),performance.mark("aiia-el-end"),performance.measure("Aiia Detection UI","aiia-el-start","aiia-el-end"),this._updateStats()),i&&this._detectionsSub.next(i),a&&this._landmarksSub.next(a);}this._isProcessing=false;}}_updateStats(){let e=performance.getEntriesByName("AiiaDetection"),t=performance.getEntriesByName("AiiaUI"),i=e[e.length-1],a=t[t.length-1];if(i&&a){let s=i.duration,n=a.duration,r=s+n;this._statsEl.innerHTML=`
97
+ <div>ML: ${s.toFixed(1)}ms</div>
98
+ <div>Draw: ${n.toFixed(1)}ms</div>
99
+ <div>Budget: ${this._interval}ms</div>
100
+ `,this._statsEl.style.color=r>this._interval?"#ff4444":"green",this._statsEl.style.borderColor=r>this._interval?"#ff4444":"green";}e.length>30&&(performance.clearMarks(),performance.clearMeasures());}_drawRect(e){let t=this._videoEl.offsetWidth;lodashEs.forEach(e,(i,a)=>{let{categories:s,boundingBox:n}=i;if(!n)return;let r=this._debugElements[a*2],o=this._debugElements[a*2+1];(!r||!o)&&(r=document.createElement("div"),r.classList.add("highlighter"),o=document.createElement("p"),o.classList.add("confidence"),this._containerEl.append(o,r),this._debugElements.push(r,o)),r.style.display="block",o.style.display="block";let{width:l,height:d,originX:g,originY:m}=n,T=t-l-g;r.style.width=`${l}px`,r.style.height=`${d}px`,r.style.transform=`translate3d(${-T}px, ${m}px, 0)`;let re=s[0].score*100;o.innerText=`Confidence: ${Math.round(re)}%`,o.style.width=`${l}px`,o.style.transform=`translate3d(${-T}px, ${m-25}px, 0)`;});for(let i=e.length*2;i<this._debugElements.length;i++)this._debugElements[i].style.display="none";}_drawRect2(e){this._canvasCtx&&this._drawingUtils&&(this._canvasCtx.save(),this._canvasCtx.clearRect(0,0,640,480),lodashEs.forEach(e,(t,i)=>{this._drawingUtils?.drawLandmarks(t,{radius:a=>tasksVision.DrawingUtils.lerp(a.from.z,-0.15,.1,5,1),color:this.landmarkColors[i]}),this._drawingUtils?.drawConnectors(t,tasksVision.PoseLandmarker.POSE_CONNECTIONS,{color:this.connectorColors[i],lineWidth:2});}),this._canvasCtx.restore());}destroy(){this._detectionsSub.complete(),this._landmarksSub.complete(),this.remove();}};customElements.define("aiia-camera",S);function D(){return f.visualizer}var f=class c{constructor(e,t,i){this.stream=e;this.audioContext=t;if(this.outputSampleRate=i?.llmSampleRate??16e3,this.chunkTimeInSeconds=i?.chunkTimeInSeconds??1,this.pcmSub=new rxjs.Subject,c.visualizer===null){let a=new _;document.body.append(a),c.visualizer=a;}this.visualizer=c.visualizer,this.visualizer.setSampleRate(this.outputSampleRate);}static visualizer=null;type="vad";workletNode;source;isRecording=false;outputSampleRate;chunkTimeInSeconds;pcmSub;visualizer;get pcm(){return this.pcmSub.asObservable()}async startRecord(){this.isRecording||(this.source=this.audioContext.createMediaStreamSource(this.stream),this.workletNode=new AudioWorkletNode(this.audioContext,"aiia-vad",{processorOptions:{outputSampleRate:this.outputSampleRate,chunkTimeInSeconds:this.chunkTimeInSeconds}}),this.source.connect(this.workletNode),this.workletNode.port.onmessage=e=>{let{float32:t}=e.data;if(t){let i=new Float32Array(t);this.pcmSub.next(i),this.visualizer.addPcm(t);}},this.isRecording=true);}stopRecord(){this.isRecording&&(this.workletNode&&(this.workletNode.port.onmessage=null,this.workletNode.disconnect()),this.source&&this.source.disconnect(),this.isRecording=false);}};function O(){return b.camera}var b=class c{static MediaPipeTools=null;static camera=null;type="camera";aiiaCamera;get detections(){return this.aiiaCamera.detections}get landmarks(){return this.aiiaCamera.landmarks}get videoSize(){return this.aiiaCamera.videoSize}constructor(e){let{perSecond:t}=lodashEs.assign({perSecond:3},e);this.aiiaCamera=new S,document.body.append(this.aiiaCamera),this.aiiaCamera.setFrequency(t),c.camera=this.aiiaCamera,this.clearElement();}async init(e){try{if(c.MediaPipeTools===null){let a=await tasksVision.FilesetResolver.forVisionTasks("https://cdn.jsdelivr.net/npm/@mediapipe/tasks-vision@0.10.0/wasm");c.MediaPipeTools=await Promise.all([tasksVision.FaceDetector.createFromOptions(a,{baseOptions:{modelAssetPath:"https://storage.googleapis.com/mediapipe-models/face_detector/blaze_face_short_range/float16/1/blaze_face_short_range.tflite",delegate:"GPU"}}),tasksVision.PoseLandmarker.createFromOptions(a,{baseOptions:{modelAssetPath:"https://storage.googleapis.com/mediapipe-models/pose_landmarker/pose_landmarker_lite/float16/1/pose_landmarker_lite.task",delegate:"GPU"},numPoses:5})]);}let[t,i]=c.MediaPipeTools;this.aiiaCamera.setFaceDetector(t),this.aiiaCamera.setPoseLandmarker(i),this.aiiaCamera.setStream(e);}catch(t){u.error("Camera init fail",t);}}clearElement(){lodashEs.forEach(document.querySelectorAll("aiia-camera#AiiaCamera"),e=>{this.aiiaCamera!==e&&e.destroy();});}startCapture(){this.aiiaCamera.startCapture();}stopCapture(){this.aiiaCamera.stopCapture();}onDestroy(){c.camera=null,this.aiiaCamera.destroy();}};function we(c){let e=c.getAudioTracks(),i=e.length>0&&lodashEs.some(e,r=>r.enabled),a=c.getVideoTracks(),n=a.length>0&&lodashEs.some(a,r=>r.enabled);return {hasAudio:i,hasVideo:n}}var v=class{constructor(e){this.stream=e;this.stateSub=new rxjs.ReplaySubject(1),this.pcmSub=new rxjs.Subject,this.destroy=new rxjs.Subject,this.detectionsSub=new rxjs.Subject,this.landmarksSub=new rxjs.Subject,this.state=0;}_state;stateSub;audioCtx;audioManager;vadManager;camManager;destroy;pcmSub;detectionsSub;landmarksSub;get sampleRate(){return this.audioCtx?this.audioCtx.sampleRate:16e3}get pcm(){return this.pcmSub.asObservable()}get detections(){return this.detectionsSub.asObservable()}get landmarks(){return this.landmarksSub.asObservable()}get state(){return this._state}set state(e){e!==this._state&&(this._state=e,this.stateSub.next(e));}get stateObs(){return this.stateSub.asObservable()}async init(e,t){let i=this.stream??await V({audio:{echoCancellation:true,noiseSuppression:true},video:true});if(i===null)throw this.state=1,new Error("ERROR CODE: 1003");this.stream=i,this.audioCtx=new AudioContext;try{await this.audioCtx.audioWorklet.addModule(e);}catch(s){throw u.fatal(s),this.state=2,new Error("ERROR CODE: 1002")}this.state=3,this.audioManager=new R(this.audioCtx),this.vadManager=new f(i,this.audioCtx,t),this.vadManager.pcm.pipe(rxjs.takeUntil(this.destroy)).subscribe(s=>{this.pcmSub.next(s);});let a=new b(t?.cameraDetection);a.detections.pipe(rxjs.takeUntil(this.destroy)).subscribe(s=>{let{width:n,height:r}=a.videoSize;this.detectionsSub.next({detections:s,clientWidth:n,clientHeight:r});}),a.landmarks.pipe(rxjs.takeUntil(this.destroy)).subscribe(s=>{this.landmarksSub.next(s);}),a.init(i),this.camManager=a;}addAudioQueue(e){let t=lodashEs.get(e,"buffer",void 0),i=lodashEs.get(e,"float32",void 0),a=lodashEs.get(e,"int16",void 0),s=lodashEs.get(e,"numberOfChannels",void 0);t?this.audioManager?.addBuffer(t):i?this.audioManager?.addBufferByFloat32(i,s):a&&this.audioManager?.addBufferByInt16(a,s);}playAudio(){this.audioManager?.startSpeech();}stopAudio(){this.audioManager?.stopSpeech();}startRecord(){this.vadManager?.startRecord();}stopRecord(){this.vadManager?.stopRecord();}setVolume(e){this.audioManager&&(this.audioManager.volume=e);}getVolume(){return this.audioManager?this.audioManager.volume:0}startCapture(){this.camManager?.startCapture();}stopCapture(){this.camManager?.stopCapture();}getInfo(){switch(this.state){case 0:return {mic:2,camera:2};case 1:return {mic:3,camera:3};case 2:return {mic:4,camera:4};case 3:if(this.stream){let{hasAudio:e,hasVideo:t}=we(this.stream),i=e?5:6,a=t?5:6;return {mic:i,camera:a}}else return {mic:7,camera:7}}}onDestroy(){this.camManager?.onDestroy(),this.audioCtx?.close(),this.destroy.next(),this.destroy.complete();}};var N=class{constructor(e,t){this.config=e;this.media=t;this.layoutSub=new rxjs.Subject,this.projectsSub=new rxjs.ReplaySubject(1),this.destroySub=new rxjs.Subject,this.aiiaSubtitleSub=new rxjs.Subject,this.userSubtitleSub=new rxjs.Subject,this.aiiaSubtitleClearSub=new rxjs.Subject,this.userSubtitleClearSub=new rxjs.Subject,this.stateSub=new rxjs.BehaviorSubject("NotStart"),this.sampleRateOfWhisper={input:e.llmSampleRate,output:16e3},this.isMuteAiia=false,this._lastProjects=[],this.guestSub=new rxjs.ReplaySubject(1),this._hasGuest=false,this.isStart=false,this.chat=new A(e),u.code("CODE: 1011","chat"),this.close=this.onDestroy,this.behavior=this.behavior.bind(this);let{userDelayTime:i,aiiaDelayTime:a}=e.autoClearSubtitle;isNaN(a)||this.aiiaSubtitleClearSub.pipe(rxjs.debounceTime(a),rxjs.takeUntil(this.destroySub)).subscribe(()=>{this.aiiaSubtitleSub.next("");}),isNaN(i)||this.userSubtitleClearSub.pipe(rxjs.debounceTime(i),rxjs.takeUntil(this.destroySub)).subscribe(()=>{this.userSubtitleSub.next("");}),this.stateSub.pipe(rxjs.takeUntil(this.destroySub)).subscribe(n=>{this._currentState=n;}),this.projectsSub.pipe(rxjs.takeUntil(this.destroySub)).subscribe(n=>{this._lastProjects=n;}),this.guestSub.pipe(rxjs.takeUntil(this.destroySub)).subscribe(n=>{this._hasGuest=n;}),rxjs.combineLatest([this.stateSub,this.media.stateObs]).pipe(rxjs.takeUntil(this.destroySub)).subscribe(([n,r])=>{if(r===3)switch(n){case "InServiceNoMedia":{this.media.startCapture(),this.media.startRecord(),this.stateSub.next("InService");break}case "InService":break;default:{this.media.stopCapture(),this.media.stopRecord();break}}});let s=F(this.config.detection.confidence);this.media.pcm.pipe(rxjs.takeUntil(this.destroySub)).subscribe(n=>{this.chat.sendToCloud({request:"audio",command:"pcm",content:W(n)});}),this.media.detections.pipe(rxjs.takeUntil(this.destroySub)).subscribe(({detections:n,clientHeight:r,clientWidth:o})=>{this.chat.send("face",s(n,{width:o,height:r}));}),this.media.landmarks.pipe(rxjs.takeUntil(this.destroySub)).subscribe(n=>{this.chat.sendToCloud({request:"pose_detect",content:n});});}chat;destroySub;projectsSub;layoutSub;aiiaSubtitleSub;userSubtitleSub;sampleRateOfWhisper;stateSub;_currentState;isMuteAiia;aiiaSubtitleClearSub;userSubtitleClearSub;_lastProjects;guestSub;_hasGuest;isStart;get state(){return this.stateSub.asObservable()}get currentState(){return this._currentState}get layout(){return this.layoutSub.asObservable()}get projects(){return this.projectsSub.asObservable()}get lastProjects(){return lodashEs.cloneDeep(this._lastProjects)}get aiiaSubtitle(){return this.aiiaSubtitleSub.asObservable()}get userSubtitle(){return this.userSubtitleSub.asObservable()}get guest(){return this.guestSub.asObservable()}get hasGuest(){return this._hasGuest}set volume(e){this.media.setVolume(e);}get volume(){return this.media.getVolume()}start(){if(this.isStart){u.code("CODE: 1014");return}this.isStart=true,this.chat.message.pipe(rxjs.takeUntil(this.destroySub)).subscribe(({event:e,data:t})=>{switch(e){case "cloud":{lodashEs.map(t,this.behavior);break}case "list":{let{id:i,name:a,specific:s}=this.config.project,n=null;if(s&&i!==void 0)n=i;else {let r=lodashEs.find(t,o=>o.name===a||o.id===i);r&&(n=r.id);}n!==null?this.chooseProject(n):t===null?(this.stateSub.next("CloseService"),u.error("No project ready or lose network")):(this.projectsSub.next(t),this.stateSub.next("WaitingProjectID"),u.code("CODE: 1002"));break}case "channel":{switch(t){case "net_error":u.error("Please check network status");case "close":case "no_permissions":{this.stateSub.next("CloseService");break}case "reconnect":{this.stateSub.next("ReconnectingCloud");break}}break}case "monitor":{let i=this.media.getInfo();this.chat.send("monitor",i);break}}}),this.chat.start(),this.stateSub.next("ConnectingCloud"),u.code("CODE: 1012");}close;skip(){this.chat.sendToCloud({request:"skip"});}reset(){this.chat.sendToCloud({request:"reset"});}chooseProject(e){this.chat.send("uuid",e),this.stateSub.next("ConnectingCloud");}mute(){this.isMuteAiia=true,this.media.stopAudio(),this.media.stopRecord();}unmute(){this.isMuteAiia=false,this.media.startRecord();}switchMediaElement(e){let{camera:t,audio:i}=lodashEs.assign({},e);requestAnimationFrame(()=>{let s=O(),n=D();if(t!==void 0&&s&&s.setAttribute("debug",`${t}`),i!==void 0&&n)if(typeof i=="boolean")n.setAttribute("debug",`${i}`);else {let{mode:r,color:o,open:l=false}=i;n.setAttribute("debug",`${l}`),r&&n.setAttribute("mode",r),o&&n.setAttribute("color",o);}});}behavior(e){switch(e.signal){case "layout":{this.layoutSub.next(e.content);break}case "audio":{if(e.command==="sampleRate")this.sampleRateOfWhisper.output=e.content;else switch(e.command){case "pcm":{if(!this.isMuteAiia){let t=M(E(new Int16Array(e.content)),this.sampleRateOfWhisper.output,this.media.sampleRate);this.media.addAudioQueue({float32:t}),this.media.playAudio();}break}case "interrupted":{this.media.stopAudio(),this.aiiaSubtitleSub.next("");break}}break}case "status":{lodashEs.get(e,"content")==="Connected"&&this.proxyIsStable();break}case "agent":{if(!this.isMuteAiia){let t=lodashEs.get(e,"content.function_result.response");t!==void 0&&(this.aiiaSubtitleSub.next(t),this.aiiaSubtitleClearSub.next());}break}case "asr":{if(!this.isMuteAiia&&lodashEs.get(e,"content.function_type")==="ASR"){let t=lodashEs.get(e,"content.function_result.result");t!==void 0&&(this.userSubtitleSub.next(t),this.userSubtitleClearSub.next());}break}case "cv":{let t=lodashEs.get(e,"content.status");t==="user present"?this.guestSub.next(true):t==="user leave"?this.guestSub.next(false):u.warn("Unexpect value",lodashEs.get(e,"content"));break}default:{u.debug(e.signal);break}}}proxyIsStable(){this.chat.sendToCloud({request:"audio",command:"sampleRate",content:this.sampleRateOfWhisper.input}),this.media.state===3?(this.media.startRecord(),this.media.startCapture(),this.stateSub.next("InService"),u.code("CODE: 1000")):(this.stateSub.next("InServiceNoMedia"),u.code("CODE: 1001")),this.layoutSub.next({type:"resetLayout"});}onDestroy(){this.chat.onDestroy(),this.media.onDestroy(),this.destroySub.next(),this.destroySub.complete(),this.stateSub.next("Destroy"),this.stateSub.complete(),u.code("CODE: 1013");}};function ai(c){if(P){z(lodashEs.get(c,"debug",true)),u.code("CODE: 1010");let e=new x(lodashEs.assign({},c));u.code("CODE: 1011","config");let t=new v(e.mediaStream);u.code("CODE: 1011","media");let i=new N(e,t);return u.code("CODE: 1011","sdk"),e.worklet_url!==""&&t.init(e.worklet_url,e),i}else throw new Error("ERROR CODE: 1001")}
101
+ exports.initSdk=ai;
@@ -0,0 +1,101 @@
1
+ import {forEach,get,assign,cloneDeep,find,map,some,filter,compact,sortBy}from'lodash-es';import ne from'moment';import {Subject,ReplaySubject,takeUntil,BehaviorSubject,debounceTime,combineLatest,fromEvent,take}from'rxjs';import {io}from'socket.io-client';import {DrawingUtils,PoseLandmarker,FilesetResolver,FaceDetector}from'@mediapipe/tasks-vision';/**
2
+ * MIT License
3
+ *
4
+ * Copyright (c) 2026 Graphen
5
+ *
6
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ * of this software and associated documentation files (the "Software"), to deal
8
+ * in the Software without restriction, including without limitation the rights
9
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ * copies of the Software, and to permit persons to whom the Software is
11
+ * furnished to do so, subject to the following conditions:
12
+ *
13
+ * The above copyright notice and this permission notice shall be included in all
14
+ * copies or substantial portions of the Software.
15
+ *
16
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
+ * SOFTWARE.
23
+ *
24
+ * UPDATA DATE: 2026/2/11
25
+ */
26
+ var P=typeof window<"u";typeof process<"u"&&process.versions!=null&&process.versions.node!=null;function B(c,e){let t=typeof e=="number"?e:NaN;if(c){let i=Number(c);return isNaN(i)?t:i}else return t}var x=class{constructor(e){this.config=e;}get webserver(){return this.safeRead("webserver")}get environment(){let e=this.safeRead("env");return typeof e=="string"?e:"production"}get license(){return this.safeRead("group_id")??this.safeRead("license")??""}get note(){return this.safeRead("note")}get port(){return B(process.env.PORT,this.safeRead("port")??3e3)}get ws_url(){let e=this.safeRead("ws_url");return typeof e=="string"?e:""}get worklet_url(){let e=this.safeRead("worklet_url");return typeof e=="string"?e:""}get project(){let e=this.safeRead("project");if(e===void 0)return {specific:false};if(typeof e=="string")return {name:e,id:e,specific:false};{let t=get(e,"id",void 0),i=get(e,"name",void 0);return {id:typeof t=="string"?t:void 0,name:typeof i=="string"?i:void 0,specific:true}}}get endPoint(){let e="dev";switch(this.environment){case "production":e="prod";break;case "test":e="test";break;}let t=`graphen-agentic-workflow-${e}-21193779403.asia-east1.run.app`;return {api:`https://${t}`,socket:`wss://${t}`}}get debug(){return this.safeRead("debug")??true}get mediaStream(){return this.safeRead("mediaStream")}get chunkTimeInSeconds(){let t=this.safeRead("chunkTimeInSeconds");return typeof t=="number"&&t>0?t:.3}get llmSampleRate(){let t=this.safeRead("llmSampleRate");return typeof t=="number"&&t>0?t:16e3}get detection(){return assign({perSecond:3,confidence:80},this.safeRead("faceDetection"),this.safeRead("cameraDetection"))}get autoClearSubtitle(){let e=this.safeRead("autoClearUserSubtitle"),t=this.safeRead("autoClearAiiaSubtitle");return {userDelayTime:typeof e=="number"?e:5e3,aiiaDelayTime:typeof t=="number"?t:NaN}}get eyeTrackEnable(){return !!this.safeRead("eyeTrackEnable")}get eyeTrackCorrection(){return assign({x_axis_px:0,y_axis_px:0},this.safeRead("correction"))}safeRead(e){return get(this.config,e,void 0)}};var p={code:console.log,debug:console.log,info:console.log,warn:console.warn,error:console.error,fatal:console.error},H=[];function $(...c){return H.push(...c),$}function z(c){function e(o){if(o===void 0||o==="all")return {code:true,error:true,warn:true,info:true,debug:true,fatal:true};if(o==="none")return {error:false,code:false,warn:false,info:false,debug:false,fatal:false};if(typeof o=="boolean")return {code:o,error:o,warn:o,info:o,debug:o,fatal:o};{let l=new Set(o);return {code:l.has("code"),debug:l.has("debug"),fatal:l.has("fatal"),error:l.has("error"),warn:l.has("warn"),info:l.has("info")}}}let{info:t,error:i,warn:a,debug:s,fatal:n,code:r}=e(c);return r||(p.code=()=>{}),s||(p.debug=()=>{}),t||(p.info=()=>{}),a||(p.warn=()=>{}),i||(p.error=()=>{}),n||(p.fatal=()=>{}),$}function K(c){return new Proxy(p,{get(e,t,i){if(typeof t=="string")switch(t){case "debug":case "info":case "error":case "warn":case "fatal":case "code":return (...a)=>{let s=ne().format("yyyy-MM-DD[T]HH:mm:ss:sss");forEach(H,n=>{(n.category===void 0||n.category.includes(c))&&n.next(t,s,c,...a);}),e[t](`[Aiia::${t}_${s}_](${c})`,...a);};default:return}else return},set(e,t,i,a){return true}})}var u=K("default");function F(c){return function(e,t){let{width:i,height:a}=t,s=filter(e,r=>(r.categories[0]?.score??0)*100>=c),n=compact(map(s,r=>{if(r.boundingBox!==void 0){let o=r.boundingBox,l=o.width*o.height,d=r.categories[0]?.score??0;return {...o,area:l,score:d*100,clientWidth:i,clientHeight:a}}else return null}));return sortBy(n,["area","score"])[0]??null}}var A=class{socket;messageSub;destorySub;get message(){return this.messageSub.asObservable()}constructor(e){this.destorySub=new Subject,this.messageSub=new Subject;let{specific:t,id:i}=e.project;this.socket=io(e.ws_url,assign({autoConnect:false},t&&i!==void 0?{query:{uuid:i}}:{}));}start(){let e="list",t="cloud",i="channel",a="monitor";fromEvent(this.socket,"connect").pipe(takeUntil(this.destorySub)).subscribe(()=>{u.debug("Client ID: ",this.socket.id);}),fromEvent(this.socket,e).pipe(take(1),takeUntil(this.destorySub)).subscribe(s=>{this.messageSub.next({event:e,data:s});}),fromEvent(this.socket,t).pipe(takeUntil(this.destorySub)).subscribe(s=>{this.messageSub.next({event:t,data:s});}),fromEvent(this.socket,i).pipe(takeUntil(this.destorySub)).subscribe(s=>{this.messageSub.next({event:i,data:s});}),fromEvent(this.socket,a).pipe(takeUntil(this.destorySub)).subscribe(s=>{this.messageSub.next({event:a,data:s});}),this.socket.connect();}send(e,t){this.socket.emit(e,t);}sendToCloud(e){this.send("cloud",e);}onDestroy(){this.destorySub.next(),this.destorySub.complete(),this.messageSub.complete(),this.socket.disconnect();}};async function V(c){try{return await navigator.mediaDevices.getUserMedia(c)}catch{return null}}function E(c){let e=new Float32Array(c.length);for(let t=0;t<c.length;t++)e[t]=c[t]/32768;return e}function M(c,e,t){if(e===t)return c;let i=t/e,a=c.length,s=Math.ceil(a*i),n=new Float32Array(s),r=1/i,o=0;for(let l=0;l<s;l++){let d=o|0,g=o-d,m=c[d],T=d+1<a?c[d+1]:m;n[l]=m+(T-m)*g,o+=r;}return n}function W(c){let e=c.length,t=new Array(e);for(let i=0;i<e;i++){let a=c[i]*32768;t[i]=a<-32768?-32768:a>32767?32767:a;}return t}var R=class{constructor(e){this.audioContext=e;this.bufferQueue=[],this.currentNode=null,this.gainNode=this.audioContext.createGain(),this.gainNode.connect(this.audioContext.destination);}type="audio";currentNode;bufferQueue;gainNode;set volume(e){e<0&&(e=0),e>100&&(e=100),this.gainNode.gain.value=e/100;}get volume(){return Math.round(this.gainNode.gain.value*100)}addBuffer(e){this.bufferQueue.push(e);}addBufferByFloat32(e,t=1){let i=e.length,a=this.audioContext.sampleRate,s=this.audioContext.createBuffer(t,i,a),n=e.slice();for(let r=0;r<t;r++)s.copyToChannel(n,r);this.addBuffer(s);}addBufferByInt16(e,t=1){this.addBufferByFloat32(E(e),t);}startSpeech(){this.currentNode===null&&this.continue();}pauseSpeech(){this.audioContext.suspend().catch(e=>{u.error("pause speech fail",e);});}resumeSpeech(){this.audioContext.resume().catch(e=>{u.error("resume speech fail",e);});}nextSpeech(){this.bufferQueue.length>0&&(this.clearNode(),this.continue());}stopSpeech(){this.bufferQueue=[],this.clearNode();}clearNode(){this.currentNode&&(this.currentNode.onended=function(){},this.currentNode.stop(),this.currentNode.disconnect(),this.currentNode=null);}continue(){let e=this.bufferQueue.shift();if(e){this.currentNode=this.audioContext.createBufferSource(),this.currentNode.buffer=e,this.currentNode.connect(this.gainNode);let t=this.continue.bind(this);this.currentNode.onended=t,this.currentNode.start();}else this.clearNode();}};var _=class extends HTMLElement{_shadow;_canvas;_ctx;_mode="waveform";_color="#00ffcc";_sampleRate=16e3;_isDebug=false;_ringBuffer;_bufferCapacity;_writePtr=0;_readPtr=0;_currentSize=0;_displayBuffer;_timeModifier=0;_smoothedVolume=0;_animationId=null;static get observedAttributes(){return ["mode","color","debug"]}constructor(){super(),this.id="AiiaVisualizer",this._shadow=this.attachShadow({mode:"open"}),this._canvas=document.createElement("canvas"),this._ctx=this._canvas.getContext("2d",{alpha:false}),this._settingStyle(),this._shadow.append(this._canvas),this._bufferCapacity=48e3,this._ringBuffer=new Float32Array(this._bufferCapacity),this._displayBuffer=new Float32Array(0);}attributeChangedCallback(e,t,i){switch(e){case "mode":(i==="waveform"||i==="siri")&&(this._mode=i,this._resetCanvas());break;case "color":i&&(this._color=i);break;case "debug":this._isDebug=i===null?false:i==="true"||i==="",this._isDebug?this.startRendering():this.stopRendering(),this.style.visibility=this._isDebug?"visible":"hidden";break}}connectedCallback(){this._setSize(),window.addEventListener("resize",()=>this._setSize());}disconnectedCallback(){this.stopRendering();}setSampleRate(e){this._sampleRate=e,this._bufferCapacity<e&&(this._bufferCapacity=e,this._ringBuffer=new Float32Array(this._bufferCapacity),this._writePtr=0,this._readPtr=0,this._currentSize=0);}addPcm(e){if(this._animationId===null)return;let t=e.length;for(let i=0;i<t;i++)this._ringBuffer[this._writePtr]=e[i],this._writePtr=(this._writePtr+1)%this._bufferCapacity;this._currentSize=Math.min(this._bufferCapacity,this._currentSize+t),this._currentSize===this._bufferCapacity&&t>0&&(this._readPtr=this._writePtr);}startRendering(){if(this._animationId!==null)return;let e=performance.now(),t=i=>{let a=(i-e)/1e3;e=i,this._update(a),this._draw(),this._animationId=requestAnimationFrame(t);};this._animationId=requestAnimationFrame(t);}stopRendering(){this._animationId!==null&&(cancelAnimationFrame(this._animationId),this._animationId=null),this._currentSize=0,this._writePtr=0,this._readPtr=0,this._smoothedVolume=0;}_settingStyle(){let e=document.createElement("style");e.textContent=`
27
+ :host {
28
+ display: block;
29
+ width: 300px;
30
+ height: 100px;
31
+ border-radius: 8px;
32
+ background-color: black;
33
+ overflow: hidden;
34
+ visibility: hidden;
35
+ position: fixed;
36
+ bottom: 0;
37
+ left: 0;
38
+ }
39
+ canvas {
40
+ width: 100%;
41
+ height: 100%;
42
+ display: block;
43
+ }
44
+ `,this._shadow.append(e);}_setSize(){let e=this.getBoundingClientRect(),t=window.devicePixelRatio||1,i=this._mode==="siri"?Math.min(t,1.5):t;this._canvas.width=e.width*i,this._canvas.height=e.height*i,this._displayBuffer=new Float32Array(Math.floor(this._canvas.width));}_update(e){performance.mark("visualizer-update-start"),this._timeModifier+=e;let t=Math.floor(this._sampleRate*e);if(this._currentSize>0&&t>0){let i=Math.min(t,this._currentSize),a=new Float32Array(i),s=0;for(let r=0;r<i;r++){let o=this._ringBuffer[this._readPtr];s+=o*o,a[r]=o,this._readPtr=(this._readPtr+1)%this._bufferCapacity;}this._currentSize-=i;let n=Math.sqrt(s/i);if(this._smoothedVolume+=(n*5-this._smoothedVolume)*.15,this._mode==="waveform"){let r=this._displayBuffer.length;performance.mark("resample-start");let o=M(a,i,r);performance.mark("resample-end"),performance.measure("Aiia Resample PCM","resample-start","resample-end");let l=o.length;l<r?(this._displayBuffer.copyWithin(0,l),this._displayBuffer.set(o,r-l)):this._displayBuffer.set(o.subarray(l-r));}}else this._smoothedVolume*=.9;performance.mark("visualizer-update-end"),performance.measure("Aiia Visualizer Update","visualizer-update-start","visualizer-update-end");}_draw(){performance.mark("visualizer-draw-start");let{width:e,height:t}=this._canvas;this._ctx.fillStyle="black",this._ctx.fillRect(0,0,e,t),this._mode==="waveform"?this._drawWaveform(e,t):this._drawSiri(e,t),performance.mark("visualizer-draw-end"),performance.measure("Aiia Visualizer Draw","visualizer-draw-start","visualizer-draw-end");}_drawWaveform(e,t){let i=this._ctx,a=t/2;i.beginPath(),i.strokeStyle=this._color,i.lineWidth=1.5;for(let s=0;s<e;s++){let n=this._displayBuffer[s],r=a+n*a*.8;s===0?i.moveTo(s,r):i.lineTo(s,r);}i.stroke();}_drawSiri(e,t){let i=this._ctx,a=t/2,s=Math.max(this._smoothedVolume,.02);i.globalCompositeOperation="lighter";let n=[{color:this._color,f:.003,s:1.5,a:.6},{color:"#ff00ff",f:.002,s:1,a:.4}];for(let r of n){i.beginPath(),i.strokeStyle=r.color,i.lineWidth=2;for(let o=0;o<=e;o+=4){let l=o/e*2-1,d=Math.pow(Math.cos(l*Math.PI/2),3),g=Math.sin(o*r.f+this._timeModifier*r.s),m=a+t*.4*s*r.a*d*g;o===0?i.moveTo(o,m):i.lineTo(o,m);}i.stroke();}i.globalCompositeOperation="source-over";}_resetCanvas(){this._ctx.fillRect(0,0,this._canvas.width,this._canvas.height);}};customElements.define("aiia-audio",_);var S=class extends HTMLElement{static get observedAttributes(){return ["debug"]}_shadow;_containerEl;_styleEl;_videoEl;_canvasEl;_canvasCtx;_isDebug;_debugElements;_statsEl;_interval;_lastTimestamp;_isProcessing;_loopFrameID;_faceDetector;_detectionsSub;_poseLandmarker;_landmarksSub;_isReady;_drawingUtils;landmarkColors=["gray","lightgray","gray","gray","lightgray"];connectorColors=["green","blue","red","yellow","purple"];get detections(){return this._detectionsSub.asObservable()}get landmarks(){return this._landmarksSub.asObservable()}get videoSize(){return {width:this._videoEl.videoWidth,height:this._videoEl.videoHeight}}constructor(){super(),this.id="AiiaCamera",this._isDebug=false,this._isReady=false,this._shadow=this.attachShadow({mode:"open"}),this._containerEl=document.createElement("div"),this._videoEl=document.createElement("video"),this._styleEl=document.createElement("style"),this._canvasEl=document.createElement("canvas"),this._statsEl=document.createElement("div"),this._debugElements=[],this._loopFrameID=null,this._detectionsSub=new Subject,this._landmarksSub=new Subject,this._interval=Math.ceil(1e3/3),this._lastTimestamp=0,this._isProcessing=false,this.predictWebcam=this.predictWebcam.bind(this),this._settingContainer(),this._settingStyle(),this._settingVideo(),this._containerEl.appendChild(this._videoEl),this._containerEl.appendChild(this._canvasEl),this._containerEl.appendChild(this._statsEl),this._shadow.appendChild(this._styleEl),this._shadow.appendChild(this._containerEl);let e=this._canvasEl.getContext("2d");e?(this._canvasCtx=e,this._drawingUtils=new DrawingUtils(this._canvasCtx)):(this._canvasCtx=null,this._drawingUtils=null);}connectedCallback(){}disconnectedCallback(){this.stopCapture();}attributeChangedCallback(e,t,i){e==="debug"&&(this._isDebug=i===null?false:i==="true"||i==="",this._containerEl.style.visibility=this._isDebug?"visible":"hidden");}setStream(e){this._videoEl.onloadedmetadata=()=>{this._isReady=true;},this._videoEl.srcObject=e;}setFaceDetector(e){this._faceDetector=e;}setPoseLandmarker(e){this._poseLandmarker=e;}setFrequency(e){this._interval=Math.ceil(1e3/e);}_settingStyle(){this._styleEl.textContent=`
45
+ .aiia_container {
46
+ visibility: hidden;
47
+ position: fixed;
48
+ top: 0;
49
+ left: 0;
50
+ > canvas {
51
+ position: absolute;
52
+ top: 0;
53
+ left: 0;
54
+ width: 640px;
55
+ height: 480px;
56
+ }
57
+ }
58
+ .aiia_stats {
59
+ position: absolute;
60
+ top: 10px;
61
+ left: 10px;
62
+ background: rgba(0, 0, 0, 0.75);
63
+ color: green;
64
+ padding: 8px;
65
+ font-size: 11px;
66
+ font-family: 'Courier New', Courier, monospace;
67
+ z-index: 100;
68
+ border: 1px solid green;
69
+ border-radius: 4px;
70
+ pointer-events: none;
71
+ line-height: 1.4;
72
+ }
73
+ .aiia_container .highlighter {
74
+ background: rgba(0, 255, 0, 0.2);
75
+ border: 1px dashed #fff;
76
+ z-index: 1;
77
+ }
78
+ .aiia_container .confidence {
79
+ padding-bottom: 5px;
80
+ padding-top: 5px;
81
+ background-color: #007f8b;
82
+ color: #fff;
83
+ z-index: 2;
84
+ font-size: 10px;
85
+ margin: 0;
86
+ white-space: nowrap;
87
+ }
88
+ .aiia_container .highlighter,
89
+ .aiia_container .confidence {
90
+ position: absolute;
91
+ top: 0;
92
+ right: 0;
93
+ will-change: transform;
94
+ transition: none;
95
+ }
96
+ `;}_settingContainer(){this._containerEl.classList.add("aiia_container");}_settingVideo(){this._videoEl.autoplay=true,this._videoEl.playsInline=true,this._videoEl.muted=true;}getVideo(){return this._videoEl}startCapture(){this._loopFrameID===null&&(this._loopFrameID=window.requestAnimationFrame(this.predictWebcam));}stopCapture(){this._loopFrameID!==null&&(window.cancelAnimationFrame(this._loopFrameID),this._loopFrameID=null,this._drawRect([]),this._drawRect2([]));}async predictWebcam(){if(this._loopFrameID=window.requestAnimationFrame(this.predictWebcam),this._isReady&&!this._isProcessing){this._isProcessing=true;let e=performance.now();if(this._lastTimestamp+this._interval<=e){this._lastTimestamp=e,performance.mark("aiia-imageBitmap-start");let t=await createImageBitmap(this._videoEl).catch(()=>null);if(performance.mark("aiia-imageBitmap-end"),performance.measure("Aiia ImageBitmap","aiia-imageBitmap-start","aiia-imageBitmap-end"),t===null){this._isProcessing=false;return}performance.mark("aiia-detect-start");let i=this._faceDetector?.detect(t).detections,a=this._poseLandmarker?.detect(t).landmarks;performance.mark("aiia-detect-end"),performance.measure("Aiia Detection","aiia-detect-start","aiia-detect-end"),this._isDebug&&i&&a&&(performance.mark("aiia-el-start"),this._drawRect(i),this._drawRect2(a),performance.mark("aiia-el-end"),performance.measure("Aiia Detection UI","aiia-el-start","aiia-el-end"),this._updateStats()),i&&this._detectionsSub.next(i),a&&this._landmarksSub.next(a);}this._isProcessing=false;}}_updateStats(){let e=performance.getEntriesByName("AiiaDetection"),t=performance.getEntriesByName("AiiaUI"),i=e[e.length-1],a=t[t.length-1];if(i&&a){let s=i.duration,n=a.duration,r=s+n;this._statsEl.innerHTML=`
97
+ <div>ML: ${s.toFixed(1)}ms</div>
98
+ <div>Draw: ${n.toFixed(1)}ms</div>
99
+ <div>Budget: ${this._interval}ms</div>
100
+ `,this._statsEl.style.color=r>this._interval?"#ff4444":"green",this._statsEl.style.borderColor=r>this._interval?"#ff4444":"green";}e.length>30&&(performance.clearMarks(),performance.clearMeasures());}_drawRect(e){let t=this._videoEl.offsetWidth;forEach(e,(i,a)=>{let{categories:s,boundingBox:n}=i;if(!n)return;let r=this._debugElements[a*2],o=this._debugElements[a*2+1];(!r||!o)&&(r=document.createElement("div"),r.classList.add("highlighter"),o=document.createElement("p"),o.classList.add("confidence"),this._containerEl.append(o,r),this._debugElements.push(r,o)),r.style.display="block",o.style.display="block";let{width:l,height:d,originX:g,originY:m}=n,T=t-l-g;r.style.width=`${l}px`,r.style.height=`${d}px`,r.style.transform=`translate3d(${-T}px, ${m}px, 0)`;let re=s[0].score*100;o.innerText=`Confidence: ${Math.round(re)}%`,o.style.width=`${l}px`,o.style.transform=`translate3d(${-T}px, ${m-25}px, 0)`;});for(let i=e.length*2;i<this._debugElements.length;i++)this._debugElements[i].style.display="none";}_drawRect2(e){this._canvasCtx&&this._drawingUtils&&(this._canvasCtx.save(),this._canvasCtx.clearRect(0,0,640,480),forEach(e,(t,i)=>{this._drawingUtils?.drawLandmarks(t,{radius:a=>DrawingUtils.lerp(a.from.z,-0.15,.1,5,1),color:this.landmarkColors[i]}),this._drawingUtils?.drawConnectors(t,PoseLandmarker.POSE_CONNECTIONS,{color:this.connectorColors[i],lineWidth:2});}),this._canvasCtx.restore());}destroy(){this._detectionsSub.complete(),this._landmarksSub.complete(),this.remove();}};customElements.define("aiia-camera",S);function D(){return f.visualizer}var f=class c{constructor(e,t,i){this.stream=e;this.audioContext=t;if(this.outputSampleRate=i?.llmSampleRate??16e3,this.chunkTimeInSeconds=i?.chunkTimeInSeconds??1,this.pcmSub=new Subject,c.visualizer===null){let a=new _;document.body.append(a),c.visualizer=a;}this.visualizer=c.visualizer,this.visualizer.setSampleRate(this.outputSampleRate);}static visualizer=null;type="vad";workletNode;source;isRecording=false;outputSampleRate;chunkTimeInSeconds;pcmSub;visualizer;get pcm(){return this.pcmSub.asObservable()}async startRecord(){this.isRecording||(this.source=this.audioContext.createMediaStreamSource(this.stream),this.workletNode=new AudioWorkletNode(this.audioContext,"aiia-vad",{processorOptions:{outputSampleRate:this.outputSampleRate,chunkTimeInSeconds:this.chunkTimeInSeconds}}),this.source.connect(this.workletNode),this.workletNode.port.onmessage=e=>{let{float32:t}=e.data;if(t){let i=new Float32Array(t);this.pcmSub.next(i),this.visualizer.addPcm(t);}},this.isRecording=true);}stopRecord(){this.isRecording&&(this.workletNode&&(this.workletNode.port.onmessage=null,this.workletNode.disconnect()),this.source&&this.source.disconnect(),this.isRecording=false);}};function O(){return b.camera}var b=class c{static MediaPipeTools=null;static camera=null;type="camera";aiiaCamera;get detections(){return this.aiiaCamera.detections}get landmarks(){return this.aiiaCamera.landmarks}get videoSize(){return this.aiiaCamera.videoSize}constructor(e){let{perSecond:t}=assign({perSecond:3},e);this.aiiaCamera=new S,document.body.append(this.aiiaCamera),this.aiiaCamera.setFrequency(t),c.camera=this.aiiaCamera,this.clearElement();}async init(e){try{if(c.MediaPipeTools===null){let a=await FilesetResolver.forVisionTasks("https://cdn.jsdelivr.net/npm/@mediapipe/tasks-vision@0.10.0/wasm");c.MediaPipeTools=await Promise.all([FaceDetector.createFromOptions(a,{baseOptions:{modelAssetPath:"https://storage.googleapis.com/mediapipe-models/face_detector/blaze_face_short_range/float16/1/blaze_face_short_range.tflite",delegate:"GPU"}}),PoseLandmarker.createFromOptions(a,{baseOptions:{modelAssetPath:"https://storage.googleapis.com/mediapipe-models/pose_landmarker/pose_landmarker_lite/float16/1/pose_landmarker_lite.task",delegate:"GPU"},numPoses:5})]);}let[t,i]=c.MediaPipeTools;this.aiiaCamera.setFaceDetector(t),this.aiiaCamera.setPoseLandmarker(i),this.aiiaCamera.setStream(e);}catch(t){u.error("Camera init fail",t);}}clearElement(){forEach(document.querySelectorAll("aiia-camera#AiiaCamera"),e=>{this.aiiaCamera!==e&&e.destroy();});}startCapture(){this.aiiaCamera.startCapture();}stopCapture(){this.aiiaCamera.stopCapture();}onDestroy(){c.camera=null,this.aiiaCamera.destroy();}};function we(c){let e=c.getAudioTracks(),i=e.length>0&&some(e,r=>r.enabled),a=c.getVideoTracks(),n=a.length>0&&some(a,r=>r.enabled);return {hasAudio:i,hasVideo:n}}var v=class{constructor(e){this.stream=e;this.stateSub=new ReplaySubject(1),this.pcmSub=new Subject,this.destroy=new Subject,this.detectionsSub=new Subject,this.landmarksSub=new Subject,this.state=0;}_state;stateSub;audioCtx;audioManager;vadManager;camManager;destroy;pcmSub;detectionsSub;landmarksSub;get sampleRate(){return this.audioCtx?this.audioCtx.sampleRate:16e3}get pcm(){return this.pcmSub.asObservable()}get detections(){return this.detectionsSub.asObservable()}get landmarks(){return this.landmarksSub.asObservable()}get state(){return this._state}set state(e){e!==this._state&&(this._state=e,this.stateSub.next(e));}get stateObs(){return this.stateSub.asObservable()}async init(e,t){let i=this.stream??await V({audio:{echoCancellation:true,noiseSuppression:true},video:true});if(i===null)throw this.state=1,new Error("ERROR CODE: 1003");this.stream=i,this.audioCtx=new AudioContext;try{await this.audioCtx.audioWorklet.addModule(e);}catch(s){throw u.fatal(s),this.state=2,new Error("ERROR CODE: 1002")}this.state=3,this.audioManager=new R(this.audioCtx),this.vadManager=new f(i,this.audioCtx,t),this.vadManager.pcm.pipe(takeUntil(this.destroy)).subscribe(s=>{this.pcmSub.next(s);});let a=new b(t?.cameraDetection);a.detections.pipe(takeUntil(this.destroy)).subscribe(s=>{let{width:n,height:r}=a.videoSize;this.detectionsSub.next({detections:s,clientWidth:n,clientHeight:r});}),a.landmarks.pipe(takeUntil(this.destroy)).subscribe(s=>{this.landmarksSub.next(s);}),a.init(i),this.camManager=a;}addAudioQueue(e){let t=get(e,"buffer",void 0),i=get(e,"float32",void 0),a=get(e,"int16",void 0),s=get(e,"numberOfChannels",void 0);t?this.audioManager?.addBuffer(t):i?this.audioManager?.addBufferByFloat32(i,s):a&&this.audioManager?.addBufferByInt16(a,s);}playAudio(){this.audioManager?.startSpeech();}stopAudio(){this.audioManager?.stopSpeech();}startRecord(){this.vadManager?.startRecord();}stopRecord(){this.vadManager?.stopRecord();}setVolume(e){this.audioManager&&(this.audioManager.volume=e);}getVolume(){return this.audioManager?this.audioManager.volume:0}startCapture(){this.camManager?.startCapture();}stopCapture(){this.camManager?.stopCapture();}getInfo(){switch(this.state){case 0:return {mic:2,camera:2};case 1:return {mic:3,camera:3};case 2:return {mic:4,camera:4};case 3:if(this.stream){let{hasAudio:e,hasVideo:t}=we(this.stream),i=e?5:6,a=t?5:6;return {mic:i,camera:a}}else return {mic:7,camera:7}}}onDestroy(){this.camManager?.onDestroy(),this.audioCtx?.close(),this.destroy.next(),this.destroy.complete();}};var N=class{constructor(e,t){this.config=e;this.media=t;this.layoutSub=new Subject,this.projectsSub=new ReplaySubject(1),this.destroySub=new Subject,this.aiiaSubtitleSub=new Subject,this.userSubtitleSub=new Subject,this.aiiaSubtitleClearSub=new Subject,this.userSubtitleClearSub=new Subject,this.stateSub=new BehaviorSubject("NotStart"),this.sampleRateOfWhisper={input:e.llmSampleRate,output:16e3},this.isMuteAiia=false,this._lastProjects=[],this.guestSub=new ReplaySubject(1),this._hasGuest=false,this.isStart=false,this.chat=new A(e),u.code("CODE: 1011","chat"),this.close=this.onDestroy,this.behavior=this.behavior.bind(this);let{userDelayTime:i,aiiaDelayTime:a}=e.autoClearSubtitle;isNaN(a)||this.aiiaSubtitleClearSub.pipe(debounceTime(a),takeUntil(this.destroySub)).subscribe(()=>{this.aiiaSubtitleSub.next("");}),isNaN(i)||this.userSubtitleClearSub.pipe(debounceTime(i),takeUntil(this.destroySub)).subscribe(()=>{this.userSubtitleSub.next("");}),this.stateSub.pipe(takeUntil(this.destroySub)).subscribe(n=>{this._currentState=n;}),this.projectsSub.pipe(takeUntil(this.destroySub)).subscribe(n=>{this._lastProjects=n;}),this.guestSub.pipe(takeUntil(this.destroySub)).subscribe(n=>{this._hasGuest=n;}),combineLatest([this.stateSub,this.media.stateObs]).pipe(takeUntil(this.destroySub)).subscribe(([n,r])=>{if(r===3)switch(n){case "InServiceNoMedia":{this.media.startCapture(),this.media.startRecord(),this.stateSub.next("InService");break}case "InService":break;default:{this.media.stopCapture(),this.media.stopRecord();break}}});let s=F(this.config.detection.confidence);this.media.pcm.pipe(takeUntil(this.destroySub)).subscribe(n=>{this.chat.sendToCloud({request:"audio",command:"pcm",content:W(n)});}),this.media.detections.pipe(takeUntil(this.destroySub)).subscribe(({detections:n,clientHeight:r,clientWidth:o})=>{this.chat.send("face",s(n,{width:o,height:r}));}),this.media.landmarks.pipe(takeUntil(this.destroySub)).subscribe(n=>{this.chat.sendToCloud({request:"pose_detect",content:n});});}chat;destroySub;projectsSub;layoutSub;aiiaSubtitleSub;userSubtitleSub;sampleRateOfWhisper;stateSub;_currentState;isMuteAiia;aiiaSubtitleClearSub;userSubtitleClearSub;_lastProjects;guestSub;_hasGuest;isStart;get state(){return this.stateSub.asObservable()}get currentState(){return this._currentState}get layout(){return this.layoutSub.asObservable()}get projects(){return this.projectsSub.asObservable()}get lastProjects(){return cloneDeep(this._lastProjects)}get aiiaSubtitle(){return this.aiiaSubtitleSub.asObservable()}get userSubtitle(){return this.userSubtitleSub.asObservable()}get guest(){return this.guestSub.asObservable()}get hasGuest(){return this._hasGuest}set volume(e){this.media.setVolume(e);}get volume(){return this.media.getVolume()}start(){if(this.isStart){u.code("CODE: 1014");return}this.isStart=true,this.chat.message.pipe(takeUntil(this.destroySub)).subscribe(({event:e,data:t})=>{switch(e){case "cloud":{map(t,this.behavior);break}case "list":{let{id:i,name:a,specific:s}=this.config.project,n=null;if(s&&i!==void 0)n=i;else {let r=find(t,o=>o.name===a||o.id===i);r&&(n=r.id);}n!==null?this.chooseProject(n):t===null?(this.stateSub.next("CloseService"),u.error("No project ready or lose network")):(this.projectsSub.next(t),this.stateSub.next("WaitingProjectID"),u.code("CODE: 1002"));break}case "channel":{switch(t){case "net_error":u.error("Please check network status");case "close":case "no_permissions":{this.stateSub.next("CloseService");break}case "reconnect":{this.stateSub.next("ReconnectingCloud");break}}break}case "monitor":{let i=this.media.getInfo();this.chat.send("monitor",i);break}}}),this.chat.start(),this.stateSub.next("ConnectingCloud"),u.code("CODE: 1012");}close;skip(){this.chat.sendToCloud({request:"skip"});}reset(){this.chat.sendToCloud({request:"reset"});}chooseProject(e){this.chat.send("uuid",e),this.stateSub.next("ConnectingCloud");}mute(){this.isMuteAiia=true,this.media.stopAudio(),this.media.stopRecord();}unmute(){this.isMuteAiia=false,this.media.startRecord();}switchMediaElement(e){let{camera:t,audio:i}=assign({},e);requestAnimationFrame(()=>{let s=O(),n=D();if(t!==void 0&&s&&s.setAttribute("debug",`${t}`),i!==void 0&&n)if(typeof i=="boolean")n.setAttribute("debug",`${i}`);else {let{mode:r,color:o,open:l=false}=i;n.setAttribute("debug",`${l}`),r&&n.setAttribute("mode",r),o&&n.setAttribute("color",o);}});}behavior(e){switch(e.signal){case "layout":{this.layoutSub.next(e.content);break}case "audio":{if(e.command==="sampleRate")this.sampleRateOfWhisper.output=e.content;else switch(e.command){case "pcm":{if(!this.isMuteAiia){let t=M(E(new Int16Array(e.content)),this.sampleRateOfWhisper.output,this.media.sampleRate);this.media.addAudioQueue({float32:t}),this.media.playAudio();}break}case "interrupted":{this.media.stopAudio(),this.aiiaSubtitleSub.next("");break}}break}case "status":{get(e,"content")==="Connected"&&this.proxyIsStable();break}case "agent":{if(!this.isMuteAiia){let t=get(e,"content.function_result.response");t!==void 0&&(this.aiiaSubtitleSub.next(t),this.aiiaSubtitleClearSub.next());}break}case "asr":{if(!this.isMuteAiia&&get(e,"content.function_type")==="ASR"){let t=get(e,"content.function_result.result");t!==void 0&&(this.userSubtitleSub.next(t),this.userSubtitleClearSub.next());}break}case "cv":{let t=get(e,"content.status");t==="user present"?this.guestSub.next(true):t==="user leave"?this.guestSub.next(false):u.warn("Unexpect value",get(e,"content"));break}default:{u.debug(e.signal);break}}}proxyIsStable(){this.chat.sendToCloud({request:"audio",command:"sampleRate",content:this.sampleRateOfWhisper.input}),this.media.state===3?(this.media.startRecord(),this.media.startCapture(),this.stateSub.next("InService"),u.code("CODE: 1000")):(this.stateSub.next("InServiceNoMedia"),u.code("CODE: 1001")),this.layoutSub.next({type:"resetLayout"});}onDestroy(){this.chat.onDestroy(),this.media.onDestroy(),this.destroySub.next(),this.destroySub.complete(),this.stateSub.next("Destroy"),this.stateSub.complete(),u.code("CODE: 1013");}};function ai(c){if(P){z(get(c,"debug",true)),u.code("CODE: 1010");let e=new x(assign({},c));u.code("CODE: 1011","config");let t=new v(e.mediaStream);u.code("CODE: 1011","media");let i=new N(e,t);return u.code("CODE: 1011","sdk"),e.worklet_url!==""&&t.init(e.worklet_url,e),i}else throw new Error("ERROR CODE: 1001")}
101
+ export{ai as initSdk};
@@ -0,0 +1,43 @@
1
+ import { I as InitOptions } from '../type-RVXBPx7G.js';
2
+ export { A as AiiaProjectItem } from '../type-RVXBPx7G.js';
3
+ import 'http';
4
+ import 'https';
5
+ import 'http2';
6
+
7
+ /**
8
+ * [zh]
9
+ * 自動啟動完整服務
10
+ *
11
+ * @property options.unrealFolder 放置應用程式的相對或絕對路徑(有資訊則會自動檢查 UE 狀態並啟動)
12
+ * @property options.openUrl 自動開啟網頁
13
+ * @property options.mode 開啟的模式
14
+ * @property options.foreground 強制瀏覽器至於前景
15
+ * @property options.remoteDebug 遠程調控
16
+ */
17
+ interface AutomationOptions {
18
+ unrealFolder?: string;
19
+ openUrl?: string;
20
+ mode?: "kiosk";
21
+ foreground?: "always";
22
+ remoteDebug?: number;
23
+ }
24
+
25
+ interface ExperimentOptions {
26
+ interaction?: {
27
+ port?: number;
28
+ host?: string;
29
+ };
30
+ automation?: AutomationOptions;
31
+ }
32
+
33
+ type NodeInitOptions = Omit<InitOptions, "project" | "ws_url" | "worklet_url" | "mediaStream" | "chunkTimeInSeconds" | "llmSampleRate" | "autoClearUserSubtitle" | "autoClearAiiaSubtitle" | "faceDetection" | "cameraDetection"> & {
34
+ experiment?: ExperimentOptions;
35
+ };
36
+ /**
37
+ * Initialize the service
38
+ * @param options
39
+ * @returns method of clean for service
40
+ */
41
+ declare function aiiaCore(options?: NodeInitOptions): () => void;
42
+
43
+ export { type ExperimentOptions, type NodeInitOptions, aiiaCore };
@@ -0,0 +1,69 @@
1
+ 'use strict';var lodashEs=require('lodash-es'),we=require('moment'),mathjs=require('mathjs'),socket_io=require('socket.io'),rxjs=require('rxjs'),ut=require('axios'),y=require('ws'),z=require('fs'),pe=require('os'),F=require('path'),nodeOsc=require('node-osc'),child_process=require('child_process'),Xe=require('systeminformation'),nutJs=require('@nut-tree-fork/nut-js'),ze=require('readline'),net=require('net');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var we__default=/*#__PURE__*/_interopDefault(we);var ut__default=/*#__PURE__*/_interopDefault(ut);var y__default=/*#__PURE__*/_interopDefault(y);var z__default=/*#__PURE__*/_interopDefault(z);var pe__default=/*#__PURE__*/_interopDefault(pe);var F__default=/*#__PURE__*/_interopDefault(F);var Xe__default=/*#__PURE__*/_interopDefault(Xe);var ze__namespace=/*#__PURE__*/_interopNamespace(ze);/**
2
+ * MIT License
3
+ *
4
+ * Copyright (c) 2026 Graphen
5
+ *
6
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ * of this software and associated documentation files (the "Software"), to deal
8
+ * in the Software without restriction, including without limitation the rights
9
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ * copies of the Software, and to permit persons to whom the Software is
11
+ * furnished to do so, subject to the following conditions:
12
+ *
13
+ * The above copyright notice and this permission notice shall be included in all
14
+ * copies or substantial portions of the Software.
15
+ *
16
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
+ * SOFTWARE.
23
+ *
24
+ * UPDATA DATE: 2026/2/11
25
+ */
26
+ var R=(a=>(a[a.\u672A\u97FF\u61C9=1]="\u672A\u97FF\u61C9",a[a.\u7B49\u5F85\u6388\u6B0A=2]="\u7B49\u5F85\u6388\u6B0A",a[a.\u5DF2\u88AB\u62D2\u7D55=3]="\u5DF2\u88AB\u62D2\u7D55",a[a.VAD\u6A21\u7D44\u8F09\u5165\u5931\u6557=4]="VAD\u6A21\u7D44\u8F09\u5165\u5931\u6557",a[a.\u53EF\u6B63\u5E38\u4F7F\u7528=5]="\u53EF\u6B63\u5E38\u4F7F\u7528",a[a.\u7F3A\u5931\u8A72\u88DD\u7F6E=6]="\u7F3A\u5931\u8A72\u88DD\u7F6E",a[a.\u6C92\u6709\u670D\u52D9=7]="\u6C92\u6709\u670D\u52D9",a))(R||{}),_=(o=>(o[o.\u975E\u9810\u671F\u7684\u72C0\u614B=1]="\u975E\u9810\u671F\u7684\u72C0\u614B",o[o.\u672A\u6388\u6B0A\u63A7\u5236=2]="\u672A\u6388\u6B0A\u63A7\u5236",o[o.\u672A\u555F\u52D5=3]="\u672A\u555F\u52D5",o[o.\u7121\u670D\u52D9=4]="\u7121\u670D\u52D9",o[o.\u53EF\u4F7F\u7528=5]="\u53EF\u4F7F\u7528",o))(_||{});var X="access_token";var oe=typeof process<"u"&&process.versions!=null&&process.versions.node!=null;function ie(i,e){let t=typeof e=="number"?e:NaN;if(i){let r=Number(i);return isNaN(r)?t:r}else return t}function x(i){return new Promise(e=>{setTimeout(e,i);})}var D=class{constructor(e){this.config=e;}get webserver(){return this.safeRead("webserver")}get environment(){let e=this.safeRead("env");return typeof e=="string"?e:"production"}get license(){return this.safeRead("group_id")??this.safeRead("license")??""}get note(){return this.safeRead("note")}get port(){return ie(process.env.PORT,this.safeRead("port")??3e3)}get ws_url(){let e=this.safeRead("ws_url");return typeof e=="string"?e:""}get worklet_url(){let e=this.safeRead("worklet_url");return typeof e=="string"?e:""}get project(){let e=this.safeRead("project");if(e===void 0)return {specific:false};if(typeof e=="string")return {name:e,id:e,specific:false};{let t=lodashEs.get(e,"id",void 0),r=lodashEs.get(e,"name",void 0);return {id:typeof t=="string"?t:void 0,name:typeof r=="string"?r:void 0,specific:true}}}get endPoint(){let e="dev";switch(this.environment){case "production":e="prod";break;case "test":e="test";break;}let t=`graphen-agentic-workflow-${e}-21193779403.asia-east1.run.app`;return {api:`https://${t}`,socket:`wss://${t}`}}get debug(){return this.safeRead("debug")??true}get mediaStream(){return this.safeRead("mediaStream")}get chunkTimeInSeconds(){let t=this.safeRead("chunkTimeInSeconds");return typeof t=="number"&&t>0?t:.3}get llmSampleRate(){let t=this.safeRead("llmSampleRate");return typeof t=="number"&&t>0?t:16e3}get detection(){return lodashEs.assign({perSecond:3,confidence:80},this.safeRead("faceDetection"),this.safeRead("cameraDetection"))}get autoClearSubtitle(){let e=this.safeRead("autoClearUserSubtitle"),t=this.safeRead("autoClearAiiaSubtitle");return {userDelayTime:typeof e=="number"?e:5e3,aiiaDelayTime:typeof t=="number"?t:NaN}}get eyeTrackEnable(){return !!this.safeRead("eyeTrackEnable")}get eyeTrackCorrection(){return lodashEs.assign({x_axis_px:0,y_axis_px:0},this.safeRead("correction"))}safeRead(e){return lodashEs.get(this.config,e,void 0)}};var w={code:console.log,debug:console.log,info:console.log,warn:console.warn,error:console.error,fatal:console.error},Ae=[];function Pe(...i){return Ae.push(...i),Pe}function ae(i){function e(c){if(c===void 0||c==="all")return {code:true,error:true,warn:true,info:true,debug:true,fatal:true};if(c==="none")return {error:false,code:false,warn:false,info:false,debug:false,fatal:false};if(typeof c=="boolean")return {code:c,error:c,warn:c,info:c,debug:c,fatal:c};{let u=new Set(c);return {code:u.has("code"),debug:u.has("debug"),fatal:u.has("fatal"),error:u.has("error"),warn:u.has("warn"),info:u.has("info")}}}let{info:t,error:r,warn:s,debug:o,fatal:n,code:a}=e(i);return a||(w.code=()=>{}),o||(w.debug=()=>{}),t||(w.info=()=>{}),s||(w.warn=()=>{}),r||(w.error=()=>{}),n||(w.fatal=()=>{}),Pe}function m(i){return new Proxy(w,{get(e,t,r){if(typeof t=="string")switch(t){case "debug":case "info":case "error":case "warn":case "fatal":case "code":return (...s)=>{let o=we__default.default().format("yyyy-MM-DD[T]HH:mm:ss:sss");lodashEs.forEach(Ae,n=>{(n.category===void 0||n.category.includes(i))&&n.next(t,o,i,...s);}),e[t](`[Aiia::${t}_${o}_](${i})`,...s);};default:return}else return},set(e,t,r,s){return true}})}var p=m("default");function ce(i,e){let{maxX:t,maxY:r,minX:s,minY:o}=lodashEs.assign({maxX:25,minX:-25,maxY:50,minY:-50},e),n=mathjs.abs(t)+mathjs.abs(s),a=mathjs.abs(r)+mathjs.abs(o),{clientHeight:c,clientWidth:u,originX:g,originY:f,width:h,height:S}=i,N=mathjs.matrix([[n/u,0,s],[0,a/c,o],[0,0,1]]),C=g+h/2,E=c-(f+S/2),v=mathjs.matrix([[C],[E],[1]]),Re=mathjs.multiply(N,v),rt=Re.get([0,0]),st=Re.get([1,0]);return {x:rt,y:st}}var q=m("ChatModule"),L=class{constructor(e){this.config=e;this.memberSub=new rxjs.Subject;}server;memberSub;get port(){return this.config.port}get webserver(){return this.config.webserver}get memberChange(){return this.memberSub.asObservable()}start(){if(this.server=new socket_io.Server(this.webserver,{cors:{origin:"*"}}),this.server.on("connection",e=>{q.debug("client on",e.id),this.memberSub.next({type:"in",socket:e}),e.on("disconnect",t=>{q.debug("client off",e.id,"reason",t),this.memberSub.next({type:"out",socket:e});});}),this.webserver===void 0){let e=this.port;this.server.listen(e),q.info("Websocket server run on",e);}else q.info("Websocket server rely your webserver.");}onDestroy(){this.server&&this.server.close();}};var Ee=m("ApiProxyModule"),I=class{instance;controller;constructor(e){this.controller=new AbortController,this.instance=ut__default.default.create({baseURL:e,signal:this.controller.signal});}async getAccessToken(e,t,r){let s=performance.now(),n={license_number:e,token_value:t??""};r&&(n.note=r);let a=await this.instance.post("/api/v1/license/agent_token",n).then(c=>lodashEs.get(c.data,"token_value","")).catch(()=>null);if(Ee.debug("Complete certification",`Took ${performance.now()-s} milliseconds.`),a===null)throw new Error("ERROR CODE: 500");if(a==="")throw new Error("ERROR CODE: 2003");return a}async getProjectList(e){let t=performance.now(),r=await this.instance.post("/api/v1/license/projects",{license_number:e}).then(s=>lodashEs.map(lodashEs.get(s,"data.projects",[]),({id:o,sub_project_name:n,avatar:a})=>{let{name:c,url:u}=a;return {avatar:{name:c,url:u},id:o,name:n}})).catch(s=>null);if(Ee.debug("Got Project List",`Took ${performance.now()-t} milliseconds.`),r===null)throw new Error("ERROR CODE: 500");if(r.length===0)throw new Error("ERROR CODE: 2004");return r}onDestroy(){this.controller.abort();}};function De(i){if(typeof i!="string")return {type:0};try{let e=[],t=JSON.parse(i);return lodashEs.get(t,"signal")?e=[t]:lodashEs.isArray(t)?e=t:e=lodashEs.values(t),lodashEs.some(e,({signal:s})=>s==="pong")?{type:1}:{type:2,data:e}}catch{return {type:0}}}var ue=2e4,Le=12e4/ue,ft={request:"ping",content:"2"},Ie=JSON.stringify(ft);var d=m("SocketProxtModule");var U=class{constructor(e){this.id=e;this.messageSub=new rxjs.Subject,this.pingSub=new rxjs.Subject,this.linkStartSub=new rxjs.Subject,this.closeSub=new rxjs.Subject,this.destorySub=new rxjs.Subject,this.uuid=crypto.randomUUID(),this.pingSub.pipe(rxjs.delay(ue),rxjs.takeUntil(this.destorySub)).subscribe(()=>{this.isConnected&&(this.setPing(),this.socket.send(Ie));}),d.debug(`create proxy for browser(${this.id})`);}uuid;socket;messageSub;pingSub;linkStartSub;destorySub;closeSub;lastCloseLog;_latency=[];pingTime=NaN;get url(){return this.socket?.url}get message(){return this.messageSub.asObservable()}get close(){return this.closeSub.asObservable()}get linkStart(){return this.linkStartSub.asObservable()}get isConnected(){return this.socket?.readyState===y__default.default.OPEN}get latency(){let e=this._latency.length;return e>=1?this._latency[e-1]:NaN}get averageLatency(){let e=this._latency.length;return e>=1?this._latency.reduce((r,s)=>r+s,0)/e:NaN}start(e){this.socket=new y__default.default(e,{autoPong:true}),rxjs.fromEvent(this.socket,"open").pipe(rxjs.takeUntil(this.destorySub)).subscribe(()=>{d.code("CODE: 2012","proxy"),this.linkStartSub.next(),this.pingSub.next();}),rxjs.fromEvent(this.socket,"message").pipe(rxjs.takeUntil(this.destorySub)).subscribe(t=>{let{data:r}=t,s=De(r);switch(s.type){case 1:{this.setPong(),this.pingSub.next();break}case 2:{this.messageSub.next(s.data);break}case 0:default:{d.warn("Got a message, but failed",r);break}}}),rxjs.fromEvent(this.socket,"error").pipe(rxjs.takeUntil(this.destorySub)).subscribe(t=>{let{error:r}=t;d.error("Proxy has some problem",r);}),rxjs.fromEvent(this.socket,"close").pipe(rxjs.takeUntil(this.destorySub)).subscribe(t=>{let{code:r,reason:s,type:o,wasClean:n}=t;switch(this.lastCloseLog=`\u6700\u8FD1\u4E00\u6B21\u95DC\u9589\u539F\u56E0: ${s}, \u932F\u8AA4\u78BC: ${r}, Type: ${o}`,r){case 4001:{d.code("CODE: 2001");break}case 1e3:case 1001:{this.closeSub.next("close"),d.code("CODE: 2000");break}case 1005:case 1006:{this.closeSub.next("close"),d.code("CODE: 2002",{code:r,reason:s,type:o,wasClean:n});break}case 4100:case 4103:case 4104:case 4105:{this.closeSub.next("reconnect"),d.code("CODE: 2004",`socket code: ${r}`);break}case 4101:case 4102:{this.closeSub.next("no_permissions"),d.code("CODE: 2003",`socket code: ${r}`);break}default:{this.closeSub.next("close"),d.code("CODE: 2005",{code:r,reason:s,type:o,wasClean:n});break}}this.onDestroy();});}setPing(){lodashEs.isNaN(this.pingTime)&&(this.pingTime=Date.now());}setPong(){if(!lodashEs.isNaN(this.pingTime)){let e=Date.now()-this.pingTime;this._latency.push(e/2),this.pingTime=NaN,this._latency.length>Le&&this._latency.shift();}}send(e){let t=`currentTime: ${we__default.default().format("yyyy-MM-DD[T]HH:mm:ss:sss")}`;this.isConnected?this.socket.send(e,r=>{r&&d.error("send message fail",t,e.slice(0,100),r);}):d.warn("The socket is not connected",t,e.slice(0,100));}sendToCloud(e){this.send(JSON.stringify(e));}getStatusInfo(){let e=(()=>{if(this.socket){let r=this.socket.readyState;switch(r){case y__default.default.CONNECTING:return "\u6B63\u5728\u9023\u7DDA\u96F2\u7AEF\u670D\u52D9\u4E2D";case y__default.default.OPEN:return "\u96F2\u7AEF\u670D\u52D9\u6B63\u5E38\u904B\u4F5C";case y__default.default.CLOSING:return "\u6B63\u5728\u95DC\u9589\u96F2\u7AEF\u670D\u52D9";case y__default.default.CLOSED:return "\u96F2\u7AEF\u670D\u52D9\u5DF2\u95DC\u9589";default:return `\u672A\u77E5\u7684 Websocket \u72C0\u614B: ${r}`}}else return "\u96F2\u7AEF\u670D\u52D9\u5C1A\u672A\u555F\u52D5"})(),t=this.lastCloseLog?`${e}, ${this.lastCloseLog}`:e;return {proxy_id:this.uuid,latency:this.latency,averageLatency:this.averageLatency,proxy_state:this.socket?.readyState??-1,msg:`\u700F\u89BD\u5668(${this.id}) - \u96F2\u7AEF\u4EE3\u7406(${this.uuid}), ${t}`}}onDestroy(){this.linkStartSub.complete(),this.messageSub.complete(),this.closeSub.complete(),this.destorySub.next(),this.destorySub.complete(),d.debug(`Destroy cloud channel(${this.uuid})`);}onBrowserLeave(){switch(this.socket?.readyState){case y__default.default.CONNECTING:this.linkStartSub.pipe(rxjs.take(1),rxjs.takeUntil(this.destorySub)).subscribe(()=>{this.socket?.close(4001);});break;case y__default.default.OPEN:this.socket?.close(4001);break;case y__default.default.CLOSING:case y__default.default.CLOSED:}}};var me=class{constructor(e){this.AppName=e;switch(this.platform=process.platform,this.homedir=pe__default.default.homedir(),this.userName=pe__default.default.userInfo().username,this.EOL=pe__default.default.EOL,this.platform){case "darwin":this.isMAC=true,this.isWIN=false,this.isLINUX=false,this.saveFolder=F__default.default.join(this.homedir,"Library","Application Support");break;case "win32":this.isMAC=false,this.isWIN=true,this.isLINUX=false,this.saveFolder=process.env.APPDATA||F__default.default.join(this.homedir,"AppData","Roaming");break;case "linux":this.isMAC=false,this.isWIN=false,this.isLINUX=true,this.saveFolder=process.env.XDG_CONFIG_HOME||F__default.default.join(this.homedir,".config");break;default:console.log(`\u7576\u524D\u7CFB\u7D71\u662F\u672A\u77E5\u7684\u5E73\u53F0: ${this.platform}`),this.isMAC=false,this.isWIN=false,this.isLINUX=false,this.saveFolder=this.homedir;break}this.appFolder=F__default.default.join(this.saveFolder,this.AppName),this.folderCheck(this.appFolder);}platform;isMAC;isWIN;isLINUX;saveFolder;homedir;appFolder;userName;EOL;addPath(...e){return F__default.default.join(...e)}folderCheck(e){z__default.default.mkdirSync(e,{recursive:true});}createFolder(e){let t=this.addPath(this.appFolder,e);return this.folderCheck(t),t}fileCheck(e,t=""){z__default.default.existsSync(e)||z__default.default.writeFileSync(e,t,{encoding:"utf8"});}},l=new me("aiia-sdk");var $=class{type="node";filePath;fileName;constructor(){this.fileName="storage.json",this.filePath=l.addPath(l.appFolder,this.fileName),l.fileCheck(this.filePath);}getFileDataSync(){let e=z__default.default.readFileSync(this.filePath,"utf8");try{return JSON.parse(e)}catch{return {}}}setFileDataSync(e){try{let t=JSON.stringify(e);z__default.default.writeFileSync(this.filePath,t,"utf8");}catch{}}async getFileData(){return new Promise(e=>{z__default.default.readFile(this.filePath,"utf8",(t,r)=>{if(t)e({});else try{e(JSON.parse(r));}catch{e({});}});})}async setFileData(e){return new Promise(t=>{try{let r=JSON.stringify(e);z__default.default.writeFile(this.filePath,r,"utf8",s=>{t();});}catch{}})}async getItem(e){return (await this.getFileData())[e]??null}async setItem(e,t){let r=await this.getFileData();r[e]=t,await this.setFileData(r);}async removeItem(e){let t=await this.getFileData(),r=lodashEs.omit(t,e);await this.setFileData(r);}async clear(){await this.setFileData({});}getItemSync(e){return this.getFileDataSync()[e]??null}setItemSync(e,t){let r=this.getFileDataSync();r[e]=t,this.setFileDataSync(r);}setItemSyncByRecoord(e){let t=this.getFileDataSync();lodashEs.forEach(lodashEs.keys(e),r=>{t[r]=e[r];}),this.setFileDataSync(t);}removeItemSync(e){let t=lodashEs.omit(this.getFileDataSync(),e);this.setFileDataSync(t);}clearSync(){this.setFileDataSync({});}};var At={["CODE: 1000"]:"\u901A\u9053\u3001\u96F2\u7AEF\u670D\u52D9\u3001\u9EA5\u514B\u98A8\u90FD\u5DF2\u5C31\u7DD2",["CODE: 1001"]:"\u672A\u53D6\u5F97\u5A92\u9AD4\u88DD\u7F6E\u6B0A\u9650\uFF0C\u8ACB\u91CD\u65B0\u8A2D\u5B9A\u6216\u5FFD\u7565\u6B64\u8A0A\u606F","CODE: 1002":"\u8ACB\u8A02\u95B1\u5C08\u6848\u5217\u8868","CODE: 1010":"\u521D\u59CB\u5316\u5FC5\u8981\u4F9D\u8CF4","CODE: 1011":"\u6307\u5B9A\u4F9D\u8CF4\u5DF2\u5B8C\u6210","CODE: 1012":"\u555F\u52D5SDK","CODE: 1013":"\u7D50\u675FSDK","CODE: 1014":"\u5DF2\u555F\u52D5SDK","CODE: 2000":"\u5B89\u5168\u7684\u95DC\u9589\u9023\u7DDA","CODE: 2001":"\u7121\u526F\u4F5C\u7528\u7684\u95DC\u9589\u9023\u7DDA","CODE: 2002":"\u8207\u96F2\u7AEF\u7684\u670D\u52D9\u4E2D\u65B7",["CODE: 2003"]:"\u6C92\u6709\u6388\u6B0A\uFF0C\u8ACB\u806F\u7E6BGraphen","CODE: 2004":"\u81EA\u52D5\u91CD\u65B0\u9023\u7DDA\u96F2\u7AEF\u670D\u52D9",["CODE: 2005"]:"\u672A\u9810\u671F\u7684\u65B7\u7DDA\uFF0C\u8ACB\u806F\u7E6BGraphen","CODE: 2010":"\u958B\u59CB\u521D\u59CB\u5316\u5FC5\u8981\u6A21\u7D44","CODE: 2011":"\u6307\u5B9A\u6A21\u7D44\u521D\u59CB\u5316\u5B8C\u6210","CODE: 2012":"\u555F\u52D5\u670D\u52D9","CODE: 2013":"\u670D\u52D9\u7D50\u675F","ERROR CODE: 500":"\u7DB2\u7D61\u932F\u8AA4",["ERROR CODE: 1001"]:"\u74B0\u5883\u932F\u8AA4","ERROR CODE: 1002":"Worklet\u6A21\u7D44\u8F09\u5165\u5931\u6557","ERROR CODE: 1003":"\u672A\u7372\u5F97\u5A92\u9AD4\u88DD\u7F6E\u6B0A\u9650","ERROR CODE: 1004":"\u5BE6\u4F8B\u5DF2\u6467\u6BC0",["ERROR CODE: 2001"]:"nodejs","ERROR CODE: 2002":"\u672A\u63D0\u4F9B\u6191\u8B49","ERROR CODE: 2003":"\u7372\u53D6\u6B0A\u6756\u5931\u6557","ERROR CODE: 2004":"\u6C92\u6709\u53EF\u7528\u5C08\u6848","ERROR CODE: 2005":"\u91CD\u8907\u521D\u59CB\u5316"},W=class{path;buffer=[];destroy;constructor(e){this.path=e?l.createFolder(e):l.appFolder,this.destroy=new rxjs.Subject,rxjs.interval(3e3).pipe(rxjs.takeUntil(this.destroy)).subscribe(this.flush.bind(this)),this.destroy.subscribe(this.flush.bind(this));}next(e,t,r,...s){let o=e==="code"?n=>n.startsWith("CODE")||n.startsWith("ERROR CODE")?`${n}(${At[n]})`:n:n=>n;try{let n=s.reduce((a,c)=>{if(c instanceof Error){let u=`Error[${c.message??"No Message"}]${l.EOL}`;return u+=c.stack??"unknow stack",typeof c.cause=="string"&&(u+=`${l.EOL}cause: ${c.cause}`),`${a}${l.EOL}${u}${l.EOL}`}else switch(typeof c){case "string":return `${a} ${o(c)}`;case "number":case "bigint":return `${a} ${c.toString()}`;case "boolean":return `${a} ${c?"true":"false"}`;case "object":try{return `${a} ${JSON.stringify(c)}`}catch{return a}case "symbol":case "undefined":case "function":return `${a} [${typeof c}]`}},"");this.buffer.push(`LOG(${e})__${t}__${r}__::${n}${l.EOL}`);}catch{}}flush(){if(this.buffer.length===0)return;let t=`log_${we__default.default().format("yyyy-MM-DD")}.txt`,r=l.addPath(this.path,t);try{z__default.default.appendFileSync(r,this.buffer.join(""),{encoding:"utf8"}),this.buffer=[];}catch{}}onDestroy(){this.destroy.next(),this.destroy.complete();}};var j="127.0.0.1",de={AvatarPort:9876,ActionPort:6969,LocationPort:4060,LookPort:6745,BackGroundPort:2400},Pt={StreamAudioPort:8080,CleanAudioPort:8081};function b(){return {...de,...Pt}}function A(i){return Object.keys(i).reduce((e,t)=>({...e,[t]:i[t].toString()}),{})}function Z(i){return Object.keys(i).reduce((e,t)=>({...e,[t]:Number(i[t])}),{})}var vt=m("UnrealUdpModule"),Q=class{udpClient;eyeBallUdp;x_axis_px;y_axis_px;mapping;constructor(){this.udpClient=new Map,this.x_axis_px=0,this.y_axis_px=0,this.mapping={};let e=lodashEs.pick(de,"AvatarPort","ActionPort","LocationPort","BackGroundPort");lodashEs.forEach(lodashEs.keys(e),t=>{let r=t,s=e[r].toString();this.mapping[s]=r;});}enableUDPClient(e){lodashEs.forEach(lodashEs.keys(e),t=>{let r=new nodeOsc.Client(j,e[t]);this.udpClient.set(t,r);});}enableEyeTrack(e){this.eyeBallUdp=new nodeOsc.Client(j,e.port),this.x_axis_px=e.x_axis_px,this.y_axis_px=e.y_axis_px;}eyeTrack(e){if(this.eyeBallUdp!==void 0){let t=e!==null,{x:r,y:s}=(()=>{if(t){let{x:o,y:n}=ce(e);return {x:this.toFloat(o+this.x_axis_px),y:this.toFloat(n+this.y_axis_px)}}else return {x:this.toFloat(7),y:this.toFloat(20)}})();this.eyeBallUdp.send(["/",r,s]);}}movement(e){lodashEs.map(e,({content:t})=>{let r=lodashEs.get(t,"port","").toString(),s=this.mapping[r];if(this.udpClient.has(s)){let o=lodashEs.get(t,"message");this.udpClient.get(s).send(o);}});}toFloat(e){return lodashEs.isInteger(e)?e+1e-5:e}onDestroy(){lodashEs.forEach(Array.from(this.udpClient),([e,t])=>{t.close();}),vt.debug("Close all UnrealEngine's UDP");}};var P=m("UnrealSocketModule");function It(i){let e=Buffer.allocUnsafe(i.length*2);for(let t=0;t<i.length;t++)e.writeInt16LE(i[t],t*2);return e}var V=class{destroy;retrySub;speechWS;interruptWS;get speechIsConnected(){return this.speechWS?.readyState===y__default.default.OPEN}get intrIsConnected(){return this.interruptWS?.readyState===y__default.default.OPEN}constructor(){this.destroy=new rxjs.Subject,this.retrySub=new rxjs.Subject;}connectSocket(e){this.speechWS=this.getSocket(e.speech,"speech"),this.interruptWS=this.getSocket(e.interrupt,"interrupt"),this.retrySub.pipe(rxjs.delay(1e3),rxjs.takeUntil(this.destroy)).subscribe(t=>{switch(t){case "speech":this.speechWS=this.getSocket(e.speech,"speech");break;case "interrupt":this.interruptWS=this.getSocket(e.interrupt,"interrupt");break}});}getSocket(e,t){let r=new y__default.default(`ws://${j}:${e}`);return r.onopen=()=>{P.debug("Unreal tools connection successful",`type ${t}`);},r.onerror=s=>{let{message:o,error:n,type:a}=s;P.error(`UE Tool(${t}) fail: ${o}`,n,{port:e,type:a});},r.onclose=s=>{let{code:o,reason:n,type:a}=s;P.debug(`UE Tool(${t}) close, try reconnecting after a delay`,{code:o,reason:n,type:a,port:e}),this.retrySub.next(t);},r}interrupted(){this.intrIsConnected?this.interruptWS.send("interrupted"):P.error("Send to Unreal fail, type interrupt");}speech(e){this.speechIsConnected?this.speechWS.send(It(e)):P.error("Send to Unreal fail, type speech");}onDestroy(){this.speechWS?.close(),this.interruptWS?.close(),this.destroy.next(),this.destroy.complete(),P.info("Close all UnrealEngine's WebSocket");}};var Ge=m("UnrealModule"),G=class{constructor(e){this.config=e;this.udpManager=new Q,this.socketManager=new V,this.movement=()=>{},this.eyeTrack=()=>{},this.interrupted=()=>{},this.speech=()=>{};}udpManager;socketManager;movement;eyeTrack;interrupted;speech;onStart(e){let t=lodashEs.assign(b(),e);Ge.debug("\u6307\u5B9A\u7684 ue port",t);let{StreamAudioPort:r,CleanAudioPort:s,LookPort:o,...n}=t;this.udpManager.enableUDPClient(n),this.socketManager.connectSocket({speech:r,interrupt:s}),this.movement=this.udpManager.movement.bind(this.udpManager),this.eyeTrack=this.udpManager.eyeTrack.bind(this.udpManager),this.interrupted=this.socketManager.interrupted.bind(this.socketManager),this.speech=this.socketManager.speech.bind(this.socketManager),this.config.eyeTrackEnable&&this.udpManager.enableEyeTrack({...this.config.eyeTrackCorrection,port:o});}onDestroy(){this.udpManager.onDestroy(),this.socketManager.onDestroy(),Ge.debug("UE tools destroy");}};async function Jt(...i){let e=i.length>0?i.join(", "):"*";return await Xe__default.default.processLoad(e).catch(()=>[])}async function ee(i){return new Promise(e=>{z__default.default.stat(i,t=>{e(t?[false,t]:[true]);});})}async function qt(i,...e){return l.isWIN?new Promise(t=>{let r=child_process.spawn(i,e,{detached:true,stdio:"ignore"});r.once("error",s=>{t([false,s]);}),r.once("spawn",()=>{r.unref(),t([true]);});}):Promise.resolve([false,new Error("The function isn't implement in this system")])}async function Be(i,e,...t){return l.isWIN?new Promise(r=>{let s=[`cd ${i} && ${e} `,...t].join(" "),o=child_process.exec(s);o.once("error",n=>{r([false,n]);}),o.once("spawn",()=>{o.unref(),r([true]);});}):Promise.resolve([false,new Error("The function isn't implement in this system")])}async function _e(){try{return await Xe__default.default.networkConnections()}catch(i){return console.error("\u6AA2\u67E5 Port \u6642\u767C\u751F\u932F\u8AA4\uFF1A",i),[]}}async function Kt(i){let e=i.toString(),t=await _e();return lodashEs.some(t,r=>r.localPort===e)}async function zt(i,e){let t=e??await _e(),r={};return lodashEs.forEach(lodashEs.keys(i),s=>{let o=lodashEs.some(t,({localPort:n})=>n===i[s].toString());r[s]=o;}),r}async function He(i){let e=await nutJs.getWindows(),t=null,r=new RegExp(i.toLocaleLowerCase());for(let s of e){let o=await s.title;if(r.test(o.toLocaleLowerCase())){t=s;break}}return t}function Zt(i){return [2e3,2e3,2e3,1e3,1e3,2e3,3e3,5e3][i]??[6e3,4e3][i%2]}function te(){if(l.isWIN){let i="UEProject_5_6";return {proc:i,name:`${i}.exe`}}else return null}function Qt(){return l.isWIN?{edge:["C:/Program Files (x86)/Microsoft/Edge/Application","msedge.exe"],chrome:["C:/Program Files/Google/Chrome/Application","chrome.exe"],chrome2:[`${l.homedir}/AppData/Local/Google/Chrome/Application`,"chrome.exe"]}:null}var Y=class{config;ueConfig;destroySub;constructor(e){this.destroySub=new rxjs.Subject;let t={isKiosk:false,browserKeeping:false},{unrealFolder:r,openUrl:s,mode:o,foreground:n,remoteDebug:a}=lodashEs.assign({},e);if(typeof r=="string"&&r.trim()!==""){t.path=r;let c=te();c&&(this.ueConfig=new be(r,c.proc));}typeof s=="string"&&s.trim()!==""&&(t.url=s),typeof o=="string"&&o.trim()!==""&&(t.isKiosk=o==="kiosk"),typeof n=="string"&&n.trim()!==""&&(t.browserKeeping=n==="always"),typeof a=="number"&&(t.remoteDebug=a),this.config=t;}async exec(e){let{blockPorts:t=[]}=lodashEs.assign({},e),r=false,s=await this.isUnrealRunning();return s||(this.ueConfig&&await this.ueConfig.settingSafePort(...t),s=await this.openUnreal()),s&&(r=await this.isUnrealInService()),r&&await this.openBrowser(),this.ueConfig?await this.ueConfig.getPortTable().then(Z):b()}async isUnrealRunning(){let e=te();if(e===null)return false;let{proc:t}=e,r=await Jt(t);if(r.length<=0)return false;let s=t.toLocaleLowerCase(),o=lodashEs.find(r,n=>n.proc.toLocaleLowerCase()===s);return !!(o&&typeof o.pid=="number"&&o.pids.length>=2)}async isUnrealInService(e=12){let t=false,r=0,{StreamAudioPort:s}=this.ueConfig?await this.ueConfig.getPortTable():b();for(;!t&&r<e;)t=await Kt(s),await x(Zt(r)),r++;return t}async openUnreal(){let e=te();if(e===null)return false;let{path:t}=this.config;if(t===void 0)return false;let r=l.addPath(t,e.name),[s,o]=await ee(r);if(!s)return p.error(o),false;let[n,a]=await qt(r);return a&&p.error(a),n}async openBrowser(){let{url:e,isKiosk:t,remoteDebug:r}=this.config;if(e===void 0)return false;let s=Qt();if(s===null)return false;let{proc:o}=te(),{chrome:n,chrome2:a,edge:c}=s,[[u],[g],[f]]=await Promise.all([ee(l.addPath(...n)),ee(l.addPath(...c)),ee(l.addPath(...a))]);if(u||f){let h=[];if(t&&(h.push("--kiosk"),h.push(`--auto-select-desktop-capture-source="${o}"`)),r!==void 0){h.push(`--remote-debugging-port=${r}`);let v=l.createFolder("google");h.push(`--user-data-dir=${v}`);}h.push(e);let[S,N]=u?n:a,[C,E]=await Be(S,N,...h);return C?(this.setAppInForeground("chrome"),true):(p.error(E),false)}else if(g){let h=[];if(t&&(h.push("--kiosk"),h.push(`--auto-select-desktop-capture-source="${o}"`)),r!==void 0){h.push(`--remote-debugging-port=${r}`);let v=l.createFolder("edge");h.push(`--user-data-dir=${v}`);}h.push(e);let[S,N]=c,[C,E]=await Be(S,N,...h);return C?(this.setAppInForeground("edge"),true):(p.error(E),false)}else return p.debug("Can't find browser"),false}async setAppInForeground(e){await x(3e3),(await He(e))?.focus(),this.config.browserKeeping&&rxjs.interval(1e4).pipe(rxjs.takeUntil(this.destroySub)).subscribe(()=>{He(e).then(r=>{r?.focus();});});}async getStateInfo(){let e=await this.isUnrealRunning();switch(+`0b${(e?await this.isUnrealInService(1):false)?1:0}${e?1:0}`){case 0:return 3;case 1:return 4;case 3:return 5;default:return 1}}onDestroy(){this.destroySub.next(),this.destroySub.complete();}},be=class{folder;file;constructor(e,t){this.folder=l.addPath(e,t,"config"),this.file=l.addPath(this.folder,"config.json"),l.folderCheck(this.folder),l.fileCheck(this.file,JSON.stringify(b()));}async settingSafePort(...e){let t=b(),r=await _e(),s=await zt(t,r);if(lodashEs.some(lodashEs.values(s),o=>o)){let o=[...e,...lodashEs.filter(lodashEs.map(r,a=>Number(a.localPort)),a=>!isNaN(a))],n=new Set(o);lodashEs.forEach(lodashEs.keys(s),a=>{let c=a;if(s[c]){let u=t[c],g=1,f=NaN;for(;isNaN(f)&&g<=200;){let h=u+g;n.has(h)?g++:(n.add(h),f=h);}isNaN(f)||(t[c]=f);}});}await this.setPortTable(A(t));}getPortTable(){return new Promise(e=>{z__default.default.readFile(this.file,"utf8",(t,r)=>{if(t)e(A(b()));else try{e(JSON.parse(r));}catch{e(A(b()));}});})}async setPortTable(e){try{let t=JSON.stringify(e);await new Promise(r=>{z__default.default.writeFile(this.file,t,"utf8",s=>{r();});});}catch{}}};function tr(...i){switch(i[0]){case "--status":return `\u670D\u52D9\u72C0\u614B\u78BA\u8A8D
27
+ \u7528\u6CD5: status [\u984D\u5916\u53C3\u6578]
28
+ \u7BC4\u4F8B:
29
+ status
30
+ `;case "--log":return `\u65E5\u8A8C\u8B80\u53D6(\u7121\u53C3\u6578\u6642\uFF0C\u6703\u8FD4\u56DE\u53EF\u7528\u65E5\u8A8C)
31
+ \u7528\u6CD5: log [\u984D\u5916\u53C3\u6578]
32
+
33
+ \u7BC4\u4F8B:
34
+ log --y
35
+ log --yesterday
36
+ log --specific=2025-11-28
37
+ \u53EF\u7528\u53C3\u6578:
38
+ today : \u8B80\u53D6\u4ECA\u5929\u7684\u65E5\u8A8C
39
+ t : \u8B80\u53D6\u4ECA\u5929\u7684\u65E5\u8A8C
40
+ yesterday : \u8B80\u53D6\u6628\u5929\u7684\u65E5\u8A8C
41
+ y : \u8B80\u53D6\u6628\u5929\u7684\u65E5\u8A8C
42
+ specific=<yyyy-MM-dd> : \u8B80\u53D6\u6307\u5B9A\u65E5\u671F\u7684\u65E5\u8A8C
43
+ s=<yyyy-MM-dd> : \u8B80\u53D6\u6307\u5B9A\u65E5\u671F\u7684\u65E5\u8A8C
44
+ `;case "--exit":case "--close":return `\u5B89\u5168\u96E2\u958B
45
+ \u7528\u6CD5 1: exit
46
+ \u7528\u6CD5 2: close
47
+ `;default:return `\u7528\u6CD5: [\u53EF\u7528\u6307\u4EE4] [\u984D\u5916\u53C3\u6578]
48
+ \u7BC4\u4F8B:
49
+ help
50
+ help --log
51
+ \u53EF\u7528\u6307\u4EE4\u5217\u8868:
52
+ help : \u7372\u5F97\u53EF\u7528\u7684\u6307\u4EE4\uFF0C\u4F7F\u7528 [--\u53EF\u7528\u6307\u4EE4] \u7372\u5F97\u8A72\u6307\u4EE4\u7684\u8A73\u7D30\u8AAA\u660E\u3002
53
+ status : \u986F\u793A\u7576\u524D\u7684\u670D\u52D9\u72C0\u614B
54
+ log : \u8B80\u53D6\u65E5\u8A8C
55
+ exit : \u95DC\u9589\u9023\u7DDA
56
+ close : exit \u7684\u5225\u7A31\uFF0C\u95DC\u9589\u9023\u7DDA
57
+ `}}function rr(i){return async(...e)=>{let{core:t,channel:r}=await i.getStatusInfo(),s=r.reduce((n,a,c)=>{let u=a.msg;return n+` channel ${c+1} - ${u}}
58
+ `},`
59
+ `),o=`\u670D\u52D9\u72C0\u614B
60
+ \u6838\u5FC3\u72C0\u614B : ${t.msg}, ${t.state}
61
+ \u901A\u9053\u5217\u8868 : ${r.length===0?"\u7121\u670D\u52D9\u901A\u9053":s}
62
+ `;if(i.automaion){let n=await i.automaion.getStateInfo();o+=" Unreal : ",o+=_[n],o+=`
63
+ `;}return o}}function sr(...i){let e=i[0];if(e){let t=null;switch(e){case "--today":case "--t":{t=we__default.default();break}case "--yesterday":case "--y":{t=we__default.default().add(-1);break}default:{let r=new RegExp(/^--(specific|s)=([0-9]{4}-[0-9]{1,2}-[0-9]{1,2})$/),s=e.match(r);if(s){let[o,n,a]=s[2].split("-");t=we__default.default(`${o}-${n.padStart(2,"0")}-${a.padStart(2,"0")}`);break}else return "\u8ACB\u4F7F\u7528 -- \u958B\u59CB\uFF0C\u6216\u4F7F\u7528 help --log \u67E5\u770B\u5E6B\u52A9"}}if(t.isValid()){let r=`log_${t.format("yyyy-MM-DD")}.txt`,s=l.addPath(l.appFolder,r);try{return z__default.default.readFileSync(s,"utf8")}catch{return "\u627E\u4E0D\u5230\u65E5\u8A8C"}}else return "\u6307\u5B9A\u4E86\u7121\u6548\u7684\u65E5\u671F\uFF0C\u8ACB\u518D\u6B21\u78BA\u8A8D"}else return new Promise(t=>{z__default.default.readdir(l.appFolder,(r,s)=>{t(r?"\u6C92\u6709\u53EF\u7528\u65E5\u8A8C":s.filter(o=>o.endsWith(".txt")).join(`
64
+ `));});})}function or(i){return i?{help:tr,status:rr(i),log:sr}:{}}var B=class{server;constructor(e,t){let r=or(t),{port:s,host:o}=e;this.server=net.createServer(n=>{console.log(`\u2699\uFE0F \u65B0\u7684\u9023\u7DDA\u4F86\u81EA: ${n.remoteAddress}`);let a=ze__namespace.createInterface({input:n,output:n,prompt:"Aiia Admin > "});n.setEncoding("utf8"),n.write(`\u6B61\u8FCE\u4F7F\u7528Aiia Admin\uFF01
65
+ `),n.write("\u4F7F\u7528 `help` \u7372\u5F97\u5E6B\u52A9\n"),a.prompt(),a.on("line",async c=>{let[u,...g]=c.trim().split(/\s/),f=u.toLocaleLowerCase();if(f==="exit"||f==="close")n.write(`\u{1F44B} \u5207\u65B7\u9023\u7DDA...
66
+ `),n.end();else {let h=lodashEs.get(r,f,null);if(h){let S=await h(...g);n.write(`
67
+ `+S+`
68
+ `);}else n.write(`"${u}"\u662F\u7121\u6548\u7684\u6307\u4EE4.
69
+ `);a.prompt();}}),n.on("end",()=>{console.log(`\u2699\uFE0F \u5207\u65B7\u9023\u7DDA: ${n.remoteAddress}`);});}),this.server.listen(s,o,()=>{console.log(`\u9023\u7DDA\u6307\u4EE4: telnet 127.0.0.1 ${s}`);});}onDestroy(){this.server.close();}};function pr(i){return lodashEs.isArray(i)?lodashEs.get(i,"[0]",void 0):i??void 0}function hr(i){try{return i?i.split("/").reverse()[1]??null:null}catch{return null}}var k=m("ChannelService"),re=class{constructor(e,t){this.sdk=e;this.browser=t;this.destroy=new rxjs.Subject,this.project_id=pr(t.handshake.query.uuid),this.cloud=this.getCloudProxy(),this._currentState="JOIN",this.transitionMap=new Map,this.registerTransition(),rxjs.fromEvent(t,"disconnect").pipe(rxjs.take(1)).subscribe(r=>{this.transition("TO_DESTROY",r);}),rxjs.fromEvent(this.browser,"cloud").pipe(rxjs.takeUntil(this.destroy)).subscribe(r=>{this.cloud.sendToCloud(r);}),rxjs.fromEvent(this.browser,"face").pipe(rxjs.takeUntil(this.destroy)).subscribe(r=>{let s=r,o=s!==null;this.sdk.ueTools.eyeTrack(s),this.cloud.sendToCloud({request:"face_detect",content:o});}),this.project_id===void 0?(this.sdk.getProjectList().then(r=>{t.emit("list",r);}).catch(r=>{t.emit("list",null),k.error(r);}),rxjs.fromEvent(t,"uuid").pipe(rxjs.take(1),rxjs.takeUntil(this.destroy)).subscribe(r=>{this.project_id=r,this.sdk.getProxySocketURL(this.project_id).then(s=>{this.transition("TO_CONNECTING",s);});})):this.sdk.getProxySocketURL(this.project_id).then(r=>{this.transition("TO_CONNECTING",r);});}_currentState;transitionMap;destroy;cloud;project_id;get state(){return this._currentState}getCloudProxy(){let e=new U(this.browser.id);return e.linkStart.pipe(rxjs.takeUntil(this.destroy)).subscribe(()=>{this.transition("TO_READY","open");}),e.close.pipe(rxjs.takeUntil(this.destroy)).subscribe(async t=>{switch(t){case "close":case "no_permissions":{this.transition("TO_CLOSED",t);break}case "reconnect":{try{this.transition("TO_CLOSED",t),await this.sdk.replaceAccessToken();let r=await this.sdk.getProxySocketURL(this.project_id);this.transition("TO_RECONNECTING",r);}catch{this.transition("TO_CLOSED","net_error");}break}}}),e.message.pipe(rxjs.takeUntil(this.destroy)).subscribe(t=>{let r=[],s=[];lodashEs.forEach(t,o=>{switch(o.signal){case "osc":{s.push(o);break}case "audio":o.command==="pcm"?this.sdk.ueTools.speech(o.content):o.command==="interrupted"&&this.sdk.ueTools.interrupted();default:{r.push(o);break}}}),r.length>0&&this.browser.emit("cloud",r),s.length>0&&this.sdk.ueTools.movement(s);}),e}registerTransition(){this.transitionMap.set("TO_DESTROY",e=>{this.onDestroy(),k.debug(e);}),this.transitionMap.set("TO_CLOSED",e=>{switch(e){case "close":case "no_permissions":case "reconnect":case "net_error":this.browser.emit("channel",e);break;default:k.fatal("\u975E\u9810\u671F\u7684\u4E8B\u4EF6\u8F49\u63DB\u53C3\u6578");break}}),this.transitionMap.set("TO_READY",e=>{this.browser.emit("channel",e);}),this.transitionMap.set("TO_CONNECTING",e=>{this.cloud.start(e);}),this.transitionMap.set("TO_RECONNECTING",e=>{let t=this.getCloudProxy();t.start(e),k.debug(`\u8B8A\u66F4\u4EE3\u7406, old cloud: ${this.cloud.uuid} --> new cloud: ${t.uuid}`),this.cloud=t;});}transition(e,t){if(this._currentState==="DESTROY")return k.warn(`\u{1F6AB} \u901A\u9053\u5DF2\u92B7\u6BC0\u4E0D\u5141\u8A31\u57F7\u884C\u4E8B\u4EF6\uFF0C\u88AB\u62D2\u7D55\u7684\u4E8B\u4EF6 ${e}`),false;let r=this._currentState;switch(e){case "TO_CONNECTING":case "TO_RECONNECTING":this._currentState="CONNECTING";break;case "TO_READY":this._currentState="READY";break;case "TO_CLOSED":this._currentState="CLOSED";break;case "TO_DESTROY":this._currentState="DESTROY";break;default:return k.warn(`\u274C \u8F49\u63DB\u5931\u6557\uFF1A\u672A\u5B9A\u7FA9\u7684\u4E8B\u4EF6 ${e}`),false}let s=this.transitionMap.get(e);return s&&s(t),k.debug(`\u2705 \u8F49\u63DB\u6210\u529F\uFF1A ${r} --(${e})--> ${this._currentState}`),true}async getStatusInfo(){let e=new Promise(o=>{let n=rxjs.timer(3e3).pipe(rxjs.map(()=>({mic:1,camera:1}))),a=rxjs.fromEvent(this.browser,"monitor").pipe(rxjs.map(c=>c));rxjs.merge(n,a).pipe(rxjs.take(1),rxjs.takeUntil(this.destroy)).subscribe(o),this.browser.emit("monitor",null);}),t=this.cloud.getStatusInfo(),r=this.browser.id,s=await e;return {browser_id:r,access:hr(this.cloud.url),...s,...t}}onDestroy(){this.cloud.onBrowserLeave(),this.transitionMap.clear(),this.destroy.next(),this.destroy.complete(),this.sdk.onChannelDestroy(this.browser.id);}};var tt=(r=>(r[r.\u672A\u555F\u52D5=0]="\u672A\u555F\u52D5",r[r.\u670D\u52D9\u4E2D=1]="\u670D\u52D9\u4E2D",r[r.\u5DF2\u7D50\u675F=2]="\u5DF2\u7D50\u675F",r))(tt||{}),se=class{constructor(e,t,r){this.config=e;this.stroage=t;this.expiment=r;this.state=0,this.destorySub=new rxjs.Subject,this.channelMap=new Map,this.timestamp=0,this.access_token=t.getItemSync(X);let{api:s,socket:o}=e.endPoint;this.socketAddr=o,this.apiProxy=new I(s),p.code("CODE: 2011","api"),this.chat=new L(e),p.code("CODE: 2011","chat"),this.ueTools=new G(e),p.code("CODE: 2011","udp tools"),this.initService();}apiProxy;chat;ueTools;automaion;state;channelMap;destorySub;access_token;timestamp;socketAddr;get accessToken(){return this.access_token}async start(){if(this.state!==0)throw new Error("ERROR CODE: 2005");this.state=1,await this.replaceAccessToken(),this.chat.memberChange.pipe(rxjs.takeUntil(this.destorySub)).subscribe(({type:t,socket:r})=>{t==="in"&&this.channelMap.set(r.id,new re(this,r));}),this.chat.start(),p.code("CODE: 2012","chat");let{interaction:e}=lodashEs.assign({},this.expiment);if(e!==void 0&&typeof e.port=="number"){let{port:t,host:r}=e,s=new B({port:t,host:r},this);this.destorySub.subscribe(()=>{s.onDestroy();});}}initService(){let{automation:e}=lodashEs.assign({},this.expiment);if(e!==void 0){let t=new Y(e);t.exec({blockPorts:[this.config.port]}).then(r=>{this.ueTools.onStart(r);}),this.destorySub.subscribe(()=>{t.onDestroy();}),this.automaion=t;}else this.ueTools.onStart();rxjs.interval(1e3*60*3).pipe(rxjs.takeUntil(this.destorySub)).subscribe(()=>{this.inspectClientSocket(),this.getStatusInfo().then(({channel:t,core:r,unreal:s})=>{p.info("core",r),p.info("Unreal state",_[s],s),p.info("channels",lodashEs.map(t,o=>{let{camera:n,mic:a,...c}=o,u=`${R[n]}, ${n}`,g=`${R[a]}, ${a}`;return {cameraState:u,micState:g,...c}}));});});}async replaceAccessToken(){try{let e=await this.apiProxy.getAccessToken(this.config.license,this.access_token,this.config.note);this.access_token=e,this.timestamp=0,this.stroage.setItemSync(X,e);}catch(e){throw p.error(e),e}}async getProjectList(){try{return await this.apiProxy.getProjectList(this.config.license)}catch(e){throw p.error(e),e}}async getProxySocketURL(e){let t=Date.now()-this.timestamp;return t<5e3&&await x(5100-t),this.timestamp=Date.now(),`${this.socketAddr}/v1/chat/project/${this.accessToken}/${e}`}inspectClientSocket(){let e=Array.from(this.channelMap);lodashEs.forEach(e,([t,r])=>{r.state==="DESTROY"?this.channelMap.delete(t):r.browser.disconnected&&(r.onDestroy(),p.info(`The browser(${t}) should be closed. Auto clean service.`));});}onChannelDestroy(e){this.channelMap.delete(e);}async getStatusInfo(){let e=lodashEs.map(Array.from(this.channelMap),([o,n])=>n.getStatusInfo()),t=new Promise(o=>{this.automaion?this.automaion.getStateInfo().then(o):o(2);}),[r,...s]=await Promise.all([t,...e]);return {core:{state:this.state,msg:tt[this.state]},channel:s,unreal:r}}onDestroy(){this.apiProxy.onDestroy(),this.chat.onDestroy(),this.ueTools.onDestroy(),this.destorySub.next(),this.destorySub.complete(),this.state=2,p.code("CODE: 2013");}};function Po(i){if(oe){if(typeof lodashEs.get(i,"license",void 0)!="string")throw new Error("ERROR CODE: 2002");let e=new W;ae(lodashEs.get(i,"debug",true))(e),p.code("CODE: 2010");let t=new D(lodashEs.assign({},i));p.code("CODE: 2011","config");let r=new $;p.code("CODE: 2011","storage");let s=new se(t,r,lodashEs.get(i,"experiment"));return p.code("CODE: 2011","core"),s.start(),p.code("CODE: 2012","main core"),()=>{s.onDestroy(),e.onDestroy();}}else throw new Error("ERROR CODE: 2001")}exports.aiiaCore=Po;