@glodon-aiot/agent-cli-sdk
Version:
aiot agent client js sdk
5 lines (4 loc) • 42.9 kB
JavaScript
"use strict";var se=Object.defineProperty,ie=Object.defineProperties;var ne=Object.getOwnPropertyDescriptors;var T=Object.getOwnPropertySymbols;var B=Object.prototype.hasOwnProperty,F=Object.prototype.propertyIsEnumerable;var $=(o,e,s)=>e in o?se(o,e,{enumerable:!0,configurable:!0,writable:!0,value:s}):o[e]=s,u=(o,e)=>{for(var s in e||(e={}))B.call(e,s)&&$(o,s,e[s]);if(T)for(var s of T(e))F.call(e,s)&&$(o,s,e[s]);return o},w=(o,e)=>ie(o,ne(e));var j=(o,e)=>{var s={};for(var t in o)B.call(o,t)&&e.indexOf(t)<0&&(s[t]=o[t]);if(o!=null&&T)for(var t of T(o))e.indexOf(t)<0&&F.call(o,t)&&(s[t]=o[t]);return s};var m=(o,e,s)=>($(o,typeof e!="symbol"?e+"":e,s),s);var p=(o,e,s)=>new Promise((t,a)=>{var r=i=>{try{c(s.next(i))}catch(d){a(d)}},n=i=>{try{c(s.throw(i))}catch(d){a(d)}},c=i=>i.done?t(i.value):Promise.resolve(i.value).then(r,n);c((s=s.apply(o,e)).next())});Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const ae=require("js-base64"),re=require("axios"),I=require("@glodon-aiot/apis"),oe=require("socket.io-client"),J=require("uuid"),K=require("dayjs"),R=class R{constructor(e,s=!1){this.prefix=e,this.open=s}disable(){this.open=!1}enable(){this.open=!0}log(...e){!this.open&&!R.debug||console.log(this.prefix,...e)}info(...e){!this.open&&!R.debug||console.info(`%c ${this.prefix} %o`,"color:#0f0;",...e)}error(...e){!this.open&&!R.debug||console.error(this.prefix,...e)}warn(...e){!this.open&&!R.debug||console.warn(this.prefix,...e)}};m(R,"debug",!1);let b=R;const ce=new b("[Config] ");var G=(o=>(o.dev="https://aiot-dev.glodon.com/api/cvforcepd",o.test="https://aiot-dev.glodon.com/api/cvforce",o.prod="https://copilot.glodon.com/api/cvforce",o.local="http://localhost:3000/api/cvforcepd",o))(G||{});exports.configuration={debug:!1,env:"prod",apiRoot:"https://copilot.glodon.com/api/cvforce",applicationId:"",plugins:{},mcp:void 0,loadRelatedQuesions:!0,stream:!1};function z(o){b.debug=(o==null?void 0:o.debug)||!1,exports.configuration=w(u(u({},exports.configuration),o),{apiRoot:(o==null?void 0:o.apiRoot)||exports.configuration.apiRoot||(o!=null&&o.env?G[o.env||"prod"]:exports.configuration.apiRoot)}),b.debug&&ce.log("updated",exports.configuration)}const P=o=>JSON.parse(ae.decode(o.split(".")[1])),de=o=>{const e=P(o).exp;return new Date().valueOf()/1e3>=e},he=o=>o==null?void 0:o.replace(/[\r\n]+/gm,""),le=o=>o.replace(/\\|\\/g,"");function X(o,e,s){const t=d=>{var f;return e&&(de(e)&&s(403,"aiotToken is timeout"),d.headers=(f=d.headers)!=null?f:{},d.headers=w(u({},d.headers),{Authorization:e?`Bearer ${e}`:""})),d};function a(d,f=!0){const l=`${o}${d}`,g=re.create({baseURL:l});return f&&g.interceptors.request.use(t),g}const r=(d,f)=>{d===401&&s(d,"aiotToken is invalid")},n=(d,f)=>{console.log("onAppStatusError",d,f),d!==10001&&d!==10215&&s(d,f)},c=a("/data/v1");return new I.CVForceApi(c,{onHttpStatusError:r,onAppStatusError:n})}var L=(o=>(o[o.Normal=0]="Normal",o[o.Debug=1]="Debug",o))(L||{});const M=new b("[EventBus] ");class Z{constructor(e=!1){m(this,"eventListenerMap",{});e&&M.disable()}getEventListenerMap(){return u({},this.eventListenerMap)}on(e,s,t=!1){this.eventListenerMap[e]||(this.eventListenerMap[e]=[]),t?this.eventListenerMap[e].push({fn:s,once:!0}):this.eventListenerMap[e].push(s),M.log(`add event ${e} listener ${t?", call once":""}`)}once(e,s){this.on(e,s,!0)}off(e,s){if(this.eventListenerMap[e]){const t=this.eventListenerMap[e].findIndex(a=>{if(typeof a=="function"&&s===a)return!0;if(a=a,a.fn===s)return!0});t<0?M.log(`event ${e} listener ${s.name} is not found`):(this.eventListenerMap[e].splice(t,1),M.log(`remove event ${e} listener`))}else M.log(`event ${e} listeners is empty`)}emit(e,s){if(!this.eventListenerMap[e]){M.log(`event ${e} listeners is empty`);return}const t=[];for(let a=0;a<this.eventListenerMap[e].length;a++){const r=this.eventListenerMap[e][a];typeof r=="function"?r(s):t.push(r)}t.forEach(a=>{a&&(a.fn(s),this.off(e,a.fn))}),M.log(`event ${e} is fired, has ${this.eventListenerMap[e].length} listeners`)}removeAllListeners(){this.eventListenerMap={}}}const S=new b("[Session] ");var C=(o=>(o.DataRequestFailed="data request error",o.SocketConnectionFailed="socket error",o.IdUndefined="session id is not defined",o.SendingEmptyContent="failed at sending empty content",o.Frozen="session is frozen",o.UserModeError="failed at setting socket user mode",o.Inactive="session is inactive",o))(C||{});class q{constructor(e,s="",t,a,r,n){m(this,"_id");m(this,"_frozen",!1);m(this,"inactivating",!1);m(this,"_ready",!1);m(this,"event",new Z);m(this,"_applicationId");m(this,"_application",null);m(this,"data",null);m(this,"client",null);m(this,"messages",[]);m(this,"_loadingMessages",!1);m(this,"_loadingMessagesSize",10);m(this,"cvforceApi");m(this,"socket",null);m(this,"_promptVariables",[]);m(this,"active",!1);m(this,"activing",!1);m(this,"_stopAnswer",!1);m(this,"_dataLoading",!1);m(this,"_dataLoaded",!1);m(this,"_mcpServers",null);this.token=e,this.lazyload=a,this.client=n||null,this._applicationId=P(e).rid||exports.configuration.applicationId,this.cvforceApi=this.getService(),r&&(this._application=r),this.event.emit("init",{applicationId:this._applicationId,sessionId:s}),this.loadApplicationInfo().then(()=>{var c;if(s)this._id=s,this.event.emit("data:loading"),t?(this.data=t,a||(this._dataLoading=!0,this.cvforceApi.getSession(this.applicationId,s).then(i=>p(this,null,function*(){this.data=i,this._promptVariables=yield this.cvforceApi.getApplicationIdSessionIdPromptVariables(this.applicationId,s)})).then(()=>p(this,null,function*(){this.messages=[],yield this.fetchMessages(),this.event.emit("data:loaded",this.data),this.event.emit("data:updated",this.data)})))):(this._dataLoading=!0,this.cvforceApi.getSession(this.applicationId,s).then(i=>p(this,null,function*(){this.data=i,this._promptVariables=yield this.cvforceApi.getApplicationIdSessionIdPromptVariables(this.applicationId,s)})).then(()=>p(this,null,function*(){this.messages=[],yield this.fetchMessages(),this.event.emit("data:loaded",this.data),this.event.emit("data:updated",this.data),this._dataLoading=!1,this._dataLoaded=!0})));else{const i=(t==null?void 0:t.name)||"新建会话";this.event.emit("data:creating",{applicationId:this._applicationId,name:i}),this.event.emit("data:loading"),this.cvforceApi.postSession(this.applicationId,{name:i,netOpen:t==null?void 0:t.netOpen,knowledgeIdList:(c=t==null?void 0:t.knowledges)==null?void 0:c.map(d=>d.id),applicationId:this._applicationId}).then(d=>p(this,null,function*(){var f;this._id=d.id,this.data=w(u({},d),{knowledges:t==null?void 0:t.knowledges}),this._promptVariables=yield this.cvforceApi.getApplicationIdSessionIdPromptVariables(this.applicationId,this._id),yield(()=>p(this,null,function*(){if(t!=null&&t.knowledges)return this.setKnowledges((t==null?void 0:t.knowledges)||void 0)}))(),yield(()=>{if(t!=null&&t.promptVariables){const l=this._promptVariables.map(g=>{var v,y;const h=((y=(v=t.promptVariables)==null?void 0:v.find(_=>_.key===g.key&&_.type===g.type))==null?void 0:y.value)||"";return w(u({},g),{value:h})}).sort((g,h)=>g.key.localeCompare(h.key));return this.setPromptVariables(l||[])}else return})(),this.event.emit("data:created",this.data),this.event.emit("data:loaded",this.data),this.event.emit("data:updated",this.data),((f=this.application)==null?void 0:f.type)!==I.ApplicationTypes.Agent&&(this._ready=!0,this.event.emit("ready"))}))}})}fetchData(){return p(this,null,function*(){if(!this.data)throw Error("session data is not loaded");return yield this.cvforceApi.getSession(this.applicationId,this.data.id).then(e=>p(this,null,function*(){return this.data=e,this.event.emit("data:updated",this.data),e}))})}get id(){var e;return this._id||((e=this.data)==null?void 0:e.id)||""}get applicationId(){return this._applicationId}get application(){return this._application}set application(e){this._application=e}loadApplicationInfo(){if(this._application)return Promise.resolve(this._application);if(this._applicationId&&!this._application)return this.event.emit("application:data:loading"),this.cvforceApi.getApplicationId(this._applicationId).then(e=>(this._application=e,this.event.emit("application:data:loaded",e),e));throw Error("application id is not defined")}get ready(){return this._ready}get frozen(){return this._frozen}set frozen(e){e===!1&&this.inactivating&&this.socket&&(this.socket.disconnect(),this.socket=null,this.event.emit("inactivated")),this._frozen=e,this.event.emit("frozen",e)}get knowledges(){if(!this.data)throw Error("session data is not loaded");return this.data.knowledges||void 0}setKnowledges(e){return p(this,null,function*(){if(!this.data)throw Error("session data is not loaded");return yield this.cvforceApi.patchSessionsId(this._applicationId,this.data.id,{knowledges:e}),this.data.knowledges=e,this.event.emit("data:updated",this.data),this.event.emit("data:updated:knowledges",{knowledges:e}),e})}validateConfigs(){if(!this._id)throw Error("session id is not defined");if(!this.data)throw Error("session data is not loaded");const e=this.promptVariables.filter(s=>s.status===I.PromptStatus.Quoted).filter(s=>!s.value);if(e.length)throw Error(`在提示词中被引用的变量值不能为空, 请检查以下变量: ${e.map(s=>s.key).join(", ")}`)}get promptVariables(){return this._promptVariables.filter(e=>!(e.type===I.PromptVariableType.User&&e.key==="query")&&!(e.type===I.PromptVariableType.System&&e.key==="datetime"))}setPromptVariables(e){return p(this,null,function*(){const s=this._promptVariables.map(t=>{var r;const a=((r=e==null?void 0:e.find(n=>n.key===t.key&&n.type===t.type))==null?void 0:r.value)||t.value;return w(u({},t),{value:a})}).sort((t,a)=>t.key.localeCompare(a.key));if(yield Promise.all(s.filter(t=>!(t.type===I.PromptVariableType.User&&t.key==="query")&&!(t.type===I.PromptVariableType.System&&t.key==="datetime")).map(t=>{if(!this.data)throw Error("session data is not loaded");if(!(!t.id||!t.key))return this.cvforceApi.patchApplicationIdSessionpromptVariablesId(this._applicationId,this.data.id,t.id,{value:t.value})})),!this.data)throw Error("session data is not loaded");return this._promptVariables=yield this.cvforceApi.getApplicationIdSessionIdPromptVariables(this.applicationId,this.data.id),this.event.emit("data:updated",this.data),this.event.emit("data:updated:promptVariables",{promptVariables:this._promptVariables}),this._promptVariables})}get netOpen(){if(!this.data)throw Error("session data is not loaded");return this.data.netOpen||!1}setNetOpen(e){return p(this,null,function*(){var s,t,a;if(S.log("setNetOpen:",e),S.log("application arrange setting value: ",(s=this._application)==null?void 0:s.arrange[0].enableNetOpen),((t=this._application)==null?void 0:t.type)===I.ApplicationTypes.Agent){console.warn("Agent Application Sessions are disabled to setNetOpen.");return}if(((a=this._application)==null?void 0:a.arrange[0].enableNetOpen)===!1){console.warn("This Application is disabled to change netOpen.");return}if(!this.data)throw Error("session data is not loaded");return yield this.cvforceApi.patchSessionsId(this._applicationId,this.data.id,{netOpen:e?1:2}),this.data.netOpen=e,S.log("data:updated",this.data),this.event.emit("data:updated",this.data),this.event.emit("data:updated:netOpen",{netOpen:e}),e})}getService(){return X(exports.configuration.apiRoot,this.token,(e,s)=>{const t=new Error("data request error",{cause:{status:e,message:s}});S.error(t),this.event.emit("error",t)})}addEventListener(e,s,t=!1){if(typeof s!="function")throw Error("event listener is not a function");if(t){this.event.once(e,s);return}this.event.on(e,s)}removeEventListener(e,s){this.event.off(e,s)}fetchMessages(){return p(this,arguments,function*(e={}){var t,a;const s={pageSize:this._loadingMessagesSize};if(this._id){e=u(u({},s),e),this.event.emit("history:loading"),S.log("history:loading"),(e.endTime||e.startTime)&&(this.event.emit("history:moreloading",e),S.log("history:moreloading",e)),this._loadingMessages=!0;const r=yield this.cvforceApi.getChatHistorySessionId(this._applicationId,this._id,e),n=r.map((i,d)=>{var g,h;let f=[],l;return typeof((g=i.agentHistoryList)==null?void 0:g.agentList)=="string"&&(f=JSON.parse(i.agentHistoryList.agentList).reduce((y,_)=>(y[_.data.step-1]||(y[_.data.step-1]=[]),y[_.data.step-1].push(_),y),[])),d===r.length-1&&(l=(h=this.data)==null?void 0:h.lastRelatedQuestion),w(u({},i),{actions:f,relatedQuesion:l})});if(!e.endTime&&!e.startTime){const i=this.messages[this.messages.length-1];i&&!i.relatedQuesion&&(i.relatedQuesion=(t=this.data)==null?void 0:t.lastRelatedQuestion),this.messages=[...n,...this.messages]}else if(e.endTime&&!e.startTime){const i=this.messages.findIndex(d=>d.ts===e.endTime);this.messages.splice(0,i+1),this.messages=[...n,...this.messages]}else if(!e.endTime&&e.startTime){const i=this.messages.findLastIndex(d=>d.ts===e.endTime);this.messages.splice(i,this.messages.length-i-1),this.messages=[...this.messages,...n]}else{const i=this.messages.findIndex(f=>f.ts===e.endTime),d=this.messages.findLastIndex(f=>f.ts===e.endTime);this.messages.splice(i,d-i+1,...n)}const c=this.messages[this.messages.length-1];return c&&!c.relatedQuesion&&(c.relatedQuesion=(a=this.data)==null?void 0:a.lastRelatedQuestion),this.event.emit("history:moreloaded",n),S.log("history:loaded",this.messages),this.event.emit("history:loaded",this.messages),this._loadingMessages=!1,n}else{const r=new Error("session id is not defined");return S.error(r),this.event.emit("error",r),!1}})}rename(e){return p(this,null,function*(){if(!this._id)throw Error("session is not created yet");if(e.trim()==="")throw Error("name is empty");return this.data=yield this.cvforceApi.patchSessionsId(this.applicationId,this._id,{name:e}),S.log("data:updated",this.messages),this.event.emit("data:updated",this.data),this.event.emit("data:updated:name",{name:e}),!0})}pushMessage(e){return p(this,null,function*(){this.messages.push(e),S.log("history:add",e),this.event.emit("history:add",e),this.event.emit("message:new",e),this.event.emit("message:updated",e)})}reloadSessionInfo(){if(!this._id)throw Error("session is not created yet");return this._dataLoading=!0,this.cvforceApi.getSession(this.applicationId,this._id).then(e=>p(this,null,function*(){if(this.data=e,!this._id)throw Error("session is not created yet");return this._promptVariables=yield this.cvforceApi.getApplicationIdSessionIdPromptVariables(this.applicationId,this._id),S.log("data:updated",this.data),this.event.emit("data:updated",this.data),this.data})).then(()=>p(this,null,function*(){return this.messages=[],yield this.fetchMessages(),this._dataLoading=!1,this._dataLoaded=!0,this.event.emit("data:loaded",this.data),this}))}reload(){return p(this,null,function*(){return yield this.reloadSessionInfo(),this.socket?(this.inactivate(!0),this.activate()):(this.inactivate(!0),this.activate())})}delete(){return p(this,null,function*(){if(!this.id){const e=new Error("session id is not defined");return S.error(e),this.event.emit("error",e),!1}return this.event.emit("data:deleting"),yield this.cvforceApi.delSessionsId(this.applicationId,this.id),this.event.emit("data:deleted"),this.destroy()})}activate(){return p(this,null,function*(){if(this.activing)return new Promise(s=>{this.addEventListener("activated",()=>{s(!0)},!0)});if(!this._id)throw Error("session is not avalible. id is undefined");this.activing=!0;const e=this._id;return this._dataLoading=!0,this._dataLoaded=!1,this.data=yield this.cvforceApi.getSession(this.applicationId,e).then(s=>p(this,null,function*(){return this._promptVariables=yield this.cvforceApi.getApplicationIdSessionIdPromptVariables(this.applicationId,e),s})),this.messages.length||(this.messages=[],yield this.fetchMessages()),this.event.emit("data:loaded",this.data),this.event.emit("data:updated",this.data),this._dataLoaded=!0,this._dataLoading=!1,this.inactivating=!1,this.frozen=!0,yield this.prepareConnection(),this.event.emit("activated",this.socket),this.active=!0,this.activing=!1,this})}inactivate(e=!1){return this.socket?this._frozen?(e||(this.inactivating=!0),this.activing=!1,!0):(this.socket.close(),this.socket=null,this.event.emit("inactivated"),this.active=!1,this.activing=!1,!0):(this.activing=!1,!0)}get dataLoaded(){return this._dataLoaded}get messagesLoading(){return this._loadingMessages}send(t){return p(this,arguments,function*(e,s={stream:exports.configuration.stream}){var g;try{this.validateConfigs()}catch(h){console.error(h)}const{stream:a=exports.configuration.stream,referenceFirst:r=!1}=s,n=e.uuid||J.v4(),c=((g=e.text)==null?void 0:g.trim())||"",i=e.fileIds;if(!c&&!(i!=null&&i.length)){const h=new Error("failed at sending empty content");return S.error(h),this.event.emit("error",h),!1}if(!this._id){const h=new Error("session id is not defined");return S.error(h),this.event.emit("error",h),!1}if(this.frozen){const h=new Error("session is frozen");return S.error(h),this.event.emit("error",h),!1}this.frozen=!0,this._stopAnswer=!1;const d={sessionId:this.id,role:2,content:c,messageId:n,reference:[],searchReference:[],messageTime:""},f={content:c,stream:a,requestId:n,fileIds:i,referenceFirst:r};this.pushMessage(d),this.event.emit("question:content",c);const l=h=>p(this,null,function*(){if(h.role!==I.ChatMessageRole.Robot)return;switch(this.removeEventListener("answer:finish",l),this._id&&h.content&&h.index&&h.index<0&&(this.data=yield this.cvforceApi.patchSessionsId(this.applicationId,this._id,{finialMessage:h.content}),this.event.emit("data:updated",this.data),this.event.emit("data:updated:finialMessage",{finialMessage:h.content})),yield this.fillMessageReference(h),h.code){case 11915:h.content="请您换个问题问我吧~",h.index=-1,h.isSensitive=!0,h.isLoading=!1,h.sessionId=this._id||"",this.event.emit("message:error",h);break;case 11916:h.content="尊敬的用户您好,让我们换个话题再聊聊吧。",h.index=-1,h.isSensitive=!0,h.isLoading=!1,h.sessionId=this._id||"",this.event.emit("message:error",h);break;case 200:h.index=-1,h.isLoading=!1;break;default:h.content=h.message||"未知错误",h.isLoading=!1,h.index=-1,this.event.emit("message:error",h)}this.getRelatedQuesion(h),h.isLoading=!1;let v=this.messages[this.messages.length-1];if(v&&v.role===I.ChatMessageRole.Robot){const y=u(u({},v),h);this.messages[this.messages.length-1]=y,this.event.emit("message:updated",y)}else this.pushMessage(h);this.frozen=!1});return this.addEventListener("answer:finish",l),this.sendQuestion(f,w(u({},s),{stream:a,referenceFirst:r})),d})}getRelatedQuesion(e){return p(this,null,function*(){var r,n;if(!e.content||e.isSensitive||e.code!==200||!((r=this.application)!=null&&r.arrange[0].recommendQuestionOpen))return e;this.event.emit("message:relatedQuesion:loading",e);const s=yield this.cvforceApi.postGeneques({content:e.content}).catch(c=>null);if(!s){const c=[],i=w(u({},e),{relatedQuesion:c,index:-3,isLoading:!1});return this.event.emit("message:relatedQuesion:loaded",{relatedQuesion:c}),this.event.emit("message:updated",i),i}const t=(n=s.content)==null?void 0:n.split("*").map(he).map(le).filter(c=>!!c);e.relatedQuesion=t,e.index=-3,e.isLoading=!1;const a=w(u({},e),{relatedQuesion:t,index:-3,isLoading:!1});return this.event.emit("message:relatedQuesion:loaded",a),this.event.emit("message:updated",a),this._id&&this.cvforceApi.patchSessionsId(this._applicationId,this._id,{lastRelatedQuestion:t}),a})}fillMessageReference(e){return p(this,null,function*(){const s=yield Promise.all(e.reference.map(t=>this.cvforceApi.getKnowledgeIdFileId(t.knowledgeId,t.docId)));return e.reference=e.reference.map((t,a)=>u(u({},t),s[a])),this.event.emit("message:updated",e),e})}answerAgain(){return p(this,arguments,function*(e={stream:exports.configuration.stream}){const s=this.messages[this.messages.length-1];if(!s)throw Error("message list is empty");this.frozen=!0,this._stopAnswer=!1;const{stream:t=exports.configuration.stream}=e;let a;s.role!==I.ChatMessageRole.User&&(a=e.oldMessageId||s.messageId,this.messages.splice(this.messages.length-1,1),this.event.emit("message:remove",s),this.event.emit("history:remove",s));const r=this.messages[this.messages.length-1],n={content:r.content,fileIds:r.fileIds,requestId:r.messageId,stream:t,oldMessageId:a},c=i=>p(this,null,function*(){if(i.role===I.ChatMessageRole.Robot&&i.index===-1){switch(this._id&&i.content&&i.index&&i.index<0&&(this.data=yield this.cvforceApi.patchSessionsId(this.applicationId,this._id,{finialMessage:i.content}),this.event.emit("data:updated",this.data),this.event.emit("data:updated:finialMessage",{finialMessage:i.content})),yield this.fillMessageReference(i),i.code){case 11915:i.content="请您换个问题问我吧~",i.index=-1,i.isSensitive=!0,i.isLoading=!1,i.sessionId=this._id||"",this.event.emit("message:error",i);break;case 11916:i.content="尊敬的用户您好,让我们换个话题再聊聊吧。",i.index=-1,i.isSensitive=!0,i.isLoading=!1,i.sessionId=this._id||"",this.event.emit("message:error",i);break;case 200:i.index=-1,i.isLoading=!1;break;default:i.content=i.message||"未知错误",i.isLoading=!1,i.index=-1,this.event.emit("message:error",i)}this.getRelatedQuesion(i),this.removeEventListener("message:content",c),this.frozen=!1}});this.addEventListener("message:content",c),this.sendQuestion(n,w(u({},e),{stream:t}))})}setTop(e){return p(this,null,function*(){if(!this._id)throw Error("session is not avalible. id is undefined");this.data=yield this.cvforceApi.patchSessionsId(this._applicationId,this._id,{top:e}),this.event.emit("data:updated",this.data),this.event.emit("data:updated:top",{top:e})})}suspend(){var t;this.stopAnswer(),this.frozen=!1,this._stopAnswer=!0;let e=this.messages[this.messages.length-1];const s={messageId:J.v4(),isLoading:!1,index:-2,messageTime:K(new Date).format("YYYY-MM-DD HH:ss:mm"),content:"",role:I.ChatMessageRole.System,sessionId:this.id||"",reference:[],searchReference:[]};if(e&&!e.messageId){if(e.index===-2)return;if(e.actions){const a=e.actions[((t=e.actions)==null?void 0:t.length)-1];if(a){const r=a[a.length-1];if(r&&(r.type==="BEFORE_CALL"||r.type==="FUNCTION_CALL")){const{pluginName:n,pluginCode:c,funcCode:i,funcName:d}=r.data;a.push({data:{pluginName:n,pluginCode:c,funcCode:i,funcName:d,step:r.data.step+1},type:"ABORT"}),this.event.emit("message:action",{messageId:e.messageId,action:a})}}}e=u(u({},e),s),this.event.emit("message:content",e),this.event.emit("message:updated",e)}else this.pushMessage(s),this.event.emit("message:content",s);return this}postMessageComment(e){return p(this,null,function*(){if(!this._applicationId||!this._id)throw Error("session is not avalible. id is undefined");return this.cvforceApi.postComments(this._applicationId,this._id,e).then(s=>{const t=this.messages.find(a=>a.messageId===e.messageId);return t&&(t.comment=e,this.event.emit("message:comment",t)),s})})}clear(){if(!this._id)throw Error("session is not avalible. id is undefined");return this.cvforceApi.patchApplicationIdSessionsIdContext(this._applicationId,this._id).then(()=>(this.event.emit("context:clear"),!0))}destroy(){var e;return this._ready=!1,this.event.removeAllListeners(),(e=this.socket)==null||e.disconnect(),this.socket=null,this.event.emit("destroy",{applicationId:this._applicationId,sessionId:this._id}),this._id||""}}const A=new b("[AgentSession] ");class fe extends q{constructor(e,s="",t,a,r,n){super(e,s,t,a,r,n)}prepareConnection(){return new Promise(e=>p(this,null,function*(){this.socket&&e(!0);const s={version:"1.0",stream:JSON.stringify(exports.configuration.stream===void 0?!0:exports.configuration.stream),appId:this._applicationId,sessionId:this.id,Authorization:`${this.token}`,userMode:exports.configuration.debug?L.Debug:L.Normal},t=new URL(exports.configuration.apiRoot),a=yield oe.io(t.origin,{path:t.pathname.replace("api","socketio")+"/copilot",query:s,transports:["websocket"]});a.on("connect",()=>{A.log("socket:connect"),this.event.emit("socket:connect"),a.emit("init")}),a.on("disconnect",()=>{A.log("socket:disconnect"),this.event.emit("socket:disconnect"),this._ready=!1}),a.on("ready",r=>{if(r.code===200){A.log("ready");const n=exports.configuration.debug?L.Debug:L.Normal;n===L.Debug&&r.userMode,this._ready=!0,this.event.emit("ready"),this.frozen=!1,this.registerMcpFromClientConfig(),e(!0)}else{this._ready&&(this._ready=!1);const n=new Error(C.SocketConnectionFailed);A.error("error",n),this.event.emit("error",n),e(!1)}}),a.on("action",(r,n)=>p(this,null,function*(){if(this._stopAnswer||!this.id)return;const{type:c,data:{runnerIsClient:i,pluginCode:d,funcCode:f,parameters:l,requestBody:g}}=r,h=this.messages[this.messages.length-1];if(!h.messageId)h.actions||(h.actions=[]),h.actions[r.data.step-1]||(h.actions[r.data.step-1]=[]),h.actions[r.data.step-1].push(r),this.event.emit("message:action",{messageId:h.messageId,action:r}),this.event.emit("message:updated",h);else{const v={messageId:"",content:"",role:I.ChatMessageRole.Robot,sessionId:this.id,reference:[],searchReference:[],isLoading:!0,messageTime:"",actions:[[r]],comment:{isAgree:0}};this.pushMessage(v),this.event.emit("message:action",{messageId:v.messageId,action:r})}if(this.inactivating){const v=new Error(C.Inactive);A.warn("error",v),this.event.emit("error",v)}else if(c==="FUNCTION_CALL"&&i){if(A.log(`calling function ${f} of plugin ${d} with argument:
${JSON.stringify(l)}`),!exports.configuration.plugins[d]){n({code:404,message:"对不起,没有找到插件。"});return}const v=exports.configuration.plugins[d][f];typeof v!="function"&&n({code:404,message:"对不起,没有找到插件方法。"});let y=l==null?void 0:l.query;try{y=JSON.parse(l==null?void 0:l.query)}catch(_){}v(y,(..._)=>{this._stopAnswer||n(..._)})}})),a.on("answer",r=>{if(!this._stopAnswer)if(r.data.code!==200&&(r.data.index=-1,this.event.emit("error",r.data)),r.data.index===-1){let n=this.messages[this.messages.length-1];if(n&&!n.messageId)n=u(u({},n),r.data),this.event.emit("message:content",n),this.event.emit("message:updated",n),this.event.emit("answer:finish",n);else{const c=u({messageId:"",content:"",role:I.ChatMessageRole.Robot,sessionId:this.id,reference:[],searchReference:[],isLoading:!1,messageTime:"",actions:[],comment:{isAgree:0}},r.data);this.event.emit("message:content",c),this.pushMessage(c),this.event.emit("answer:finish",c)}}else{let n=this.messages[this.messages.length-1];n&&!n.messageId?(n=u(u({},n),r.data),this.messages[this.messages.length-1]=n,this.event.emit("message:content",n),this.event.emit("message:updated",n)):(this.pushMessage(r.data),this.event.emit("message:content",r.data))}}),a.on("reference",r=>p(this,null,function*(){if(this._stopAnswer)return;if(!this.id){const l=new Error(C.IdUndefined);A.error(l),this.event.emit("error",l),this.frozen=!1;return}const{type:n,data:c,requestId:i}=r,d=this.messages.findIndex(l=>l.messageId===i&&l.role===I.ChatMessageRole.User);if(d<0)return;const f=d+1;if(f>=this.messages.length){const l={messageId:"",content:"",role:I.ChatMessageRole.Robot,sessionId:this.id,reference:[],searchReference:[],isLoading:!0,messageTime:"",actions:[],comment:{isAgree:0}};this.pushMessage(l)}n==="KG"?(this.messages[f]=w(u({},this.messages[f]),{reference:c.knowledgeReference}),yield this.fillMessageReference(this.messages[f]),this.event.emit("message:reference",c.knowledgeReference),this.event.emit("message:updated",this.messages[f])):n==="WEB_SEARCH"&&(this.messages[f]=w(u({},this.messages[f]),{searchReference:c.knowledgeReference}),this.event.emit("message:searchreference",c.searchReference),this.event.emit("message:updated",this.messages[f]))})),this.socket=a,a.open()}))}registerMcpFromClientConfig(){return exports.configuration.mcp?new Promise((e,s)=>{if(!this.socket){s("socket is undefined");return}this.socket.emit("add_mcp_servers",exports.configuration.mcp,t=>{t.code===200?(Object.keys(t.data).forEach(a=>{t.data[a].code!==200&&console.error(a,"MCP Server 注册失败。",t.data[a])}),e(!0)):(console.error("MCP Server 注册失败。",t),s(t))})}):Promise.resolve(!0)}addMcpServers(e){return p(this,null,function*(){return this.ready?this.socket?new Promise((s,t)=>{this.socket&&this.socket.emit("add_mcp_servers",e,a=>{a.code===200?(Object.keys(a.data).forEach(r=>{a.data[r].code!==200&&console.error(r,"MCP Server 注册失败。",a.data[r])}),s(!0)):(console.error("MCP Server 注册失败。",a),t(a))})}):(console.error(" socket is undefined."),Promise.reject("socket is undefined")):(console.error("session is not avalible."),Promise.reject("session is not avalible"))})}listMcpServers(){return p(this,null,function*(){return this.ready?this.socket?new Promise((e,s)=>{this.socket&&this.socket.emit("list_mcp_servers",t=>{t.code===200?e(t.data):s(t)})}):(console.error(" socket is undefined."),Promise.reject("socket is undefined")):(console.error("session is not avalible."),Promise.reject("session is not avalible"))})}sendQuestion(e,s){return p(this,null,function*(){var a,r,n;let t=w(u({},e),{promptVariables:this.promptVariables.reduce((c,i)=>w(u({},c),{[i.key]:i.value}),{}),knowledges:(a=this.knowledges)==null?void 0:a.map(c=>c.id)});if(!this.active){if(yield this.activate(),!this.socket){const c=new Error(C.SocketConnectionFailed);return A.warn("error",c),this.event.emit("error",c),!1}(r=this.socket)==null||r.emit("question",t);return}(n=this.socket)==null||n.emit("question",t)})}stopAnswer(){var e;(e=this.socket)==null||e.emit("stop_answer")}}function pe(o,e){return p(this,null,function*(){const s=o.getReader();let t;for(;!(t=yield s.read()).done;)e(t.value)})}function ge(o){let e,s,t,a=!1,r;return function(c){e===void 0?(e=c,s=0,t=-1,r=!1):e=me(e,c);const i=e.length;let d=0;for(;s<i;){a&&(e[s]===10&&(d=++s),a=!1);let f=-1;for(;s<i&&f===-1;++s)switch(e[s]){case 58:t===-1&&(t=s-d);break;case 13:a=!1,s+4<i&&e[s+1]===10&&e[s+2]!==13&&e[s-1]!==10&&e[s-2]!==13&&(r=!0);case 10:f=s;break}if(f===-1)break;o(e.subarray(d,f),t,r),d=s,t=-1,r=!1}d===i?e=void 0:d!==0&&(e=e.subarray(d),s-=d)}}function ue(o,e,s){let t=H();const a=new TextDecoder;return function(n,c,i){if(n.length===0)s==null||s(t),t=H();else if(c>0){const d=a.decode(n.subarray(0,c)),f=c+(n[c+1]===32?2:1);let l=a.decode(n.subarray(f));switch(i&&(l+=`
`),d){case"data":t.data=t.data?t.data+`
`+l:l;break;case"event":t.event=l;break;case"id":o(t.id=l);break;case"retry":const g=parseInt(l,10);isNaN(g)||e(t.retry=g);break}}}}function me(o,e){const s=new Uint8Array(o.length+e.length);return s.set(o),s.set(e,o.length),s}function H(){return{data:"",event:"",id:"",retry:void 0}}const N="text/event-stream",ve=1e3,Y="last-event-id";function U(o,f){var l=f,{signal:e,headers:s,onopen:t,onmessage:a,onclose:r,onerror:n,openWhenHidden:c,fetch:i}=l,d=j(l,["signal","headers","onopen","onmessage","onclose","onerror","openWhenHidden","fetch"]);return new Promise((g,h)=>{const v=u({},s);v.accept||(v.accept=N);let y;function _(){y.abort(),document.hidden||Q()}c||document.addEventListener("visibilitychange",_);let E=ve,V=0;function O(){document.removeEventListener("visibilitychange",_),window.clearTimeout(V),y.abort()}e==null||e.addEventListener("abort",()=>{O(),g()});const ee=i!=null?i:window.fetch,te=t!=null?t:ye;function Q(){return p(this,null,function*(){var D;y=new AbortController;try{const x=yield ee(o,w(u({},d),{headers:v,signal:y.signal}));yield te(x),yield pe(x.body,ge(ue(k=>{k?v[Y]=k:delete v[Y]},k=>{E=k},a))),r==null||r(),O(),g()}catch(x){if(!y.signal.aborted)try{const k=(D=n==null?void 0:n(x))!=null?D:E;window.clearTimeout(V),V=window.setTimeout(Q,k)}catch(k){O(),h(k)}}})}Q()})}function ye(o){const e=o.headers.get("content-type");if(!(e!=null&&e.startsWith(N)))throw new Error(`Expected content-type to be ${N}, Actual: ${e}`)}const W=new b("[DialogSession] ");class we extends q{constructor(s,t="",a,r,n,c){super(s,t,a,r,n,c);m(this,"ctrl",new AbortController)}prepareConnection(){return new Promise(s=>p(this,null,function*(){this._ready=!0,this.event.emit("ready"),this.frozen=!1,s(!0)}))}postChatV2EventSource(s,t,a,r,n,c){return p(this,null,function*(){const i={code:0,content:"",role:I.IHistoryRole.Robot,sessionId:t,reference:[],searchReference:[],messageTime:"",llmModel:"",comment:{isAgree:0},isReplying:!1},d=w(u({},a),{stream:exports.configuration.stream});U(`${exports.configuration.apiRoot}/chat/v2/chat?applicationId=${s}&sessionId=${t}`,{method:"POST",headers:{Authorization:`Bearer ${this.token}`,"Content-Type":"application/json"},body:JSON.stringify(d),openWhenHidden:!0,signal:r,onopen(f){return f.ok&&n!=null&&n.onopen&&n.onopen(),Promise.resolve()},onmessage(f){if(!f.data.includes('{"code": ')){let g={};try{g=JSON.parse(f.data)}catch(v){}(g==null?void 0:g.mtype)==="search"?i.searchReference.push(g):i.content=i.content+f.data;const h={content:i.content,role:1,reference:i.reference,searchReference:i.searchReference,messageId:i.messageId,sessionId:t,messageTime:K(new Date).format("YYYY-MM-DD HH:mm:ss"),comment:{isAgree:0},isReplying:!0};return(n==null?void 0:n.onmessage)&&n.onmessage(h)}const l=JSON.parse(f.data);if(i.reference=l.data.reference,i.searchReference=l.data.searchReference,i.messageTime=l.data.messageTime,i.messageId=l.data.messageId,i.llmModel=l.data.llmModel,i.content=l.data.content,i.code=l.code,l.code===200){const g={code:i.code,content:i.content,role:1,reference:i.reference,searchReference:i.searchReference,messageId:i.messageId,sessionId:t,messageTime:i.messageTime,isReplying:!0};n!=null&&n.onmessage&&n.onmessage(g)}else return n!=null&&n.onclose&&n.onclose(i),c&&c({code:i.code,message:i.message})},onerror(){n!=null&&n.onerror&&n.onerror()},onclose(){const f={code:i.code,content:i.content,role:1,reference:i.reference,searchReference:i.searchReference,messageId:i.messageId,sessionId:t,messageTime:i.messageTime,comment:{isAgree:0},isReplying:!1,index:-1};n!=null&&n.onclose&&n.onclose(f)}})})}postChatV3EventSource(s,t,a,r,n,c){return p(this,null,function*(){const i={code:0,content:"",role:I.IHistoryRole.Robot,sessionId:t,reference:[],searchReference:[],messageTime:"",llmModel:"",comment:{isAgree:0},isReplying:!1,reasoningContent:"",thinkingSecs:"",thinkingStatus:"",searchingStatus:""},d=w(u({},a),{stream:exports.configuration.stream});U(`${exports.configuration.apiRoot}/chat/v3/chat?applicationId=${s}&sessionId=${t}`,{method:"POST",headers:{Authorization:`Bearer ${this.token}`,"Content-Type":"application/json"},body:JSON.stringify(d),openWhenHidden:!0,signal:r,onopen(f){return f.ok&&n!=null&&n.onopen&&n.onopen(),Promise.resolve()},onmessage(f){if(!f.data&&!f.event&&!f.id&&!f.retry)return;let l={};try{l=JSON.parse(f.data)}catch(y){console.error("parse eventData to JSON failed. ",f.data)}if(l.code!==200)return i.index=-1,i.code=l.code,i.message=l.message,n!=null&&n.onmessage&&n.onmessage(i),c&&c({code:l.code,message:l.message});const g=l.data.type,h=l.data.payload;i.isReplying=!0;const v=()=>{if(!i.searchingStatus){i.searchingStatus="start";return}if(i.searchingStatus==="start"){i.searchingStatus="end";return}};if(g==="beforeSearch"&&v(),g==="searchOver"&&v(),g==="search"&&i.searchReference.push(h),g==="thinking"){i.thinkingStatus="start";const _=h.choices[0];i.reasoningContent=i.reasoningContent+_.delta.reasoningContent}if(g==="thinkingOver"){i.thinkingStatus="end";const y=h.thinkingSecs;i.thinkingSecs=y}if(g==="text"){const _=h.choices[0];i.content=i.content+_.delta.content}if(g==="reference"&&(i.reference=h),g==="result"){const y=h.messageId,_=h.llmModel,E=h.messageTime;i.messageId=y,i.llmModel=_,i.messageTime=E,i.sessionId=t}g==="over"?i.index=-1:(i.code=l.code,i.message=l.message),n!=null&&n.onmessage&&n.onmessage(i)},onerror(){n!=null&&n.onerror&&n.onerror()},onclose(){const f=w(u({},i),{isReplying:!1});n!=null&&n.onclose&&n.onclose(f)}})})}sendQuestion(s,t){return p(this,null,function*(){var d;const{content:a,fileIds:r,oldMessageId:n}=s,{stream:c,referenceFirst:i}=t;if(this.active||(yield this.activate()),this._id){let f={content:a,fileIds:r,referenceFirst:i,oldMessageId:n,promptVariables:this.promptVariables.reduce((l,g)=>w(u({},l),{[g.key]:g.value}),{}),knowledges:(d=this.knowledges)==null?void 0:d.map(l=>l.id)};this.ctrl=new AbortController,this.postChatV3EventSource(this._applicationId,this._id,f,this.ctrl.signal,{onopen:()=>{W.log("open",this.ctrl)},onmessage:l=>{if(this._stopAnswer)return;let g=this.messages[this.messages.length-1];g&&g.role===I.ChatMessageRole.Robot?(g=u(u({},g),l),this.messages[this.messages.length-1]=g,this.event.emit("message:content",g),this.event.emit("message:updated",g)):(this.pushMessage(l),this.event.emit("message:content",l))},onclose:l=>p(this,null,function*(){this._stopAnswer||(W.log(l,"onclose"),this.event.emit("answer:finish",l))}),onerror:()=>{this._stopAnswer||(this.event.emit("message:error",""),this.frozen=!1)}})}})}stopAnswer(){this.ctrl.abort()}registerMcpFromClientConfig(){return p(this,null,function*(){throw new Error("MCP registration is not supported by DialogSession")})}addMcpServers(s){return p(this,null,function*(){throw new Error("MCP registration is not supported by DialogSession")})}listMcpServers(){return p(this,null,function*(){throw new Error("MCP registration is not supported by DialogSession")})}}const Ie=new b("[BotClient] ");class _e{constructor(e,s,t=!0){m(this,"event",new Z);m(this,"cvforceApi");m(this,"_applicationId");m(this,"_application",null);m(this,"_sessions",[]);m(this,"_activeSession");m(this,"_ready",!1);m(this,"_questionContextMaxLength",4e3);m(this,"_promptVariables",[]);if(this._token=e,this.lazyload=t,z(s),this._applicationId=P(e).rid||exports.configuration.applicationId,!this._applicationId)throw"token is not vaild";this.cvforceApi=this.getService(),this.loadApplication().then(a=>{z(w(u({},s),{stream:s.stream===void 0?(a==null?void 0:a.type)===I.ApplicationTypes.Dialog:s.stream})),this.event.emit("ready")})}checkReady(){if(!this.ready)throw Error("client is not ready.")}get ready(){return this._ready}set ready(e){this._ready=e}get questionContextMaxLength(){return this.checkReady(),this._questionContextMaxLength}get promptVariables(){return this.checkReady(),this._promptVariables}get knowledges(){var e;return this.checkReady(),(e=this._application)==null?void 0:e.arrange[0].knowledges}get sessions(){return this.checkReady(),this._sessions}set sessions(e){this.checkReady(),this._sessions=e,this.event.emit("sessions:updated",e)}loadApplication(){return p(this,null,function*(){var s,t,a;this._application=yield this.cvforceApi.getApplicationId(this._applicationId).then(r=>(typeof r.arrange[0].recommendQuestionOpen!="boolean"&&(r.arrange[0].recommendQuestionOpen=!0),w(u({},r),{arrange:[w(u({},r.arrange[0]),{recommendQuestionOpen:exports.configuration.loadRelatedQuesions&&r.arrange[0].recommendQuestionOpen})]})));const e=(a=(t=(s=this._application)==null?void 0:s.arrange)==null?void 0:t[0])==null?void 0:a.llmModel;return e&&(this._questionContextMaxLength=yield this.cvforceApi.getBaseModel(e).then(r=>r.maxModelLength)),this._promptVariables=yield this.cvforceApi.getPrompts(this._applicationId),this._ready=!0,this.event.emit("application:loaded"),this._application})}getService(){return this.cvforceApi?this.cvforceApi:X(exports.configuration.apiRoot,this.token,(e,s)=>Ie.error(s))}get token(){return this._token}set token(e){this.checkReady(),this._token=e,this.ready=!1;const s=P(e).rid;this._applicationId!==s&&(this._applicationId=s,this._application=null,this.loadApplication().then(()=>{this.event.emit("ready")}),this.clean())}get applicationId(){return this._applicationId}get application(){return this.checkReady(),this._application}get activeSession(){var e;return this.checkReady(),((e=this._activeSession)==null?void 0:e.id)||""}set activeSession(e){this.checkReady(),this.loadSession(e).then(s=>{this._activeSession&&this._activeSession.id!==e&&this._activeSession.inactivate(),this._activeSession=s})}createSession(e,s,t,a,r){return p(this,null,function*(){const n=this;return new Promise((c,i)=>{const d=f=>p(this,null,function*(){if(f===I.ApplicationTypes.Agent)c(new fe(e,s,t,a,r,n));else if(f===I.ApplicationTypes.Dialog)c(new we(e,s,t,a,r,n));else throw Error(`不支持的应用类型:${f}`)});if(this.ready){if(!this._application)throw Error("client is not ready");d(this._application.type)}else this.event.on("ready",()=>{if(!this._application)throw Error("_application is null");d(this._application.type)},!0)})})}getSessions(e){return p(this,null,function*(){return new Promise((s,t)=>{const a=()=>this.cvforceApi.listSessions(this._applicationId,e).then(r=>{const n=[];return r.forEach(c=>p(this,null,function*(){const i=this._sessions.find(d=>c.id===d.id);if(i)i.data=c,this._application?i.application=this._application:i.loadApplicationInfo(),n.push(i);else{const d=yield this.createSession(this.token,c.id,c,this.lazyload,this._application||void 0);n.push(d)}})),this.sessions=n,n});if(this.ready){if(!this._application)throw Error("_application is null");s(a())}else this.event.on("ready",()=>{if(!this._application)throw Error("_application is null");s(a())},!0)})})}loadSession(e="",s){return p(this,null,function*(){this.checkReady();let t=this.sessions.find(a=>a.id===e);if(t||(t=yield this.createSession(this.token,e,s),this._sessions.push(t)),this._activeSession){if(this._activeSession===t)return t;this._activeSession.inactivate()}return t.id?(yield t.activate(),this._activeSession=t):t.addEventListener("data:loaded",()=>{this._activeSession!==t&&(t==null||t.activate(),this._activeSession=t)},!0),t})}reload(){return this.loadApplication().then(()=>p(this,null,function*(){return yield this.getSessions(),this.event.emit("ready"),this}))}reloadSession(e){return p(this,null,function*(){yield this.reload();let s=this._sessions.find(t=>t.id===e)||this._activeSession;if(!s){console.warn("reloadSession session failed.");return}return yield s.reload(),s})}setTop(e,s,t="top_time desc, sort_status desc, updated_at desc"){return p(this,null,function*(){let a=e?this._sessions.find(r=>r.id===e):this._activeSession;if(!a){console.warn("setTop session failed.");return}return yield a.setTop(s),this.getSessions({order:t})})}addEventListener(e,s,t=!1){if(typeof s!="function")throw Error("event listener is not a function");if(t){this.event.once(e,s);return}this.event.on(e,s)}removeEventListener(e,s){this.event.off(e,s)}removeSession(e,s){return p(this,null,function*(){this.checkReady();let t=-1;if(typeof e=="string"?t=this._sessions.findIndex(a=>a.id===e):t=this._sessions.findIndex(a=>a.id===e.id),t>-1){const a=this._sessions[t];s&&(yield a.delete()),this._sessions.splice(t,1)}else console.warn("session delete failed, session is not exist.")})}clean(){this._sessions.forEach(e=>e.destroy()),this.sessions=[]}}class Se{constructor(e,s={},t){m(this,"code");m(this,"description","");m(this,"loaded",!1);m(this,"functions",{});this.code=e,s&&(this.functions=s)}fetchData(){this.description="描述",this.loaded=!0}checkFunctions(){}}exports.AgentPlugin=Se;exports.BotClient=_e;exports.Session=q;exports.configure=z;