ppagent 0.0.5 → 0.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/dist/lib.d.ts +1 -1
  2. package/dist/lib.js +2 -2
  3. package/package.json +115 -116
package/dist/lib.d.ts CHANGED
@@ -1584,7 +1584,7 @@ declare class PPAgent extends Emittery {
1584
1584
  }[];
1585
1585
  };
1586
1586
  get onlinePlugins(): IterableIterator<IOnlinePluginInfo>;
1587
- running(): boolean;
1587
+ get running(): boolean;
1588
1588
  private _createServer;
1589
1589
  private _initServer;
1590
1590
  private _checkRegister;
package/dist/lib.js CHANGED
@@ -1,4 +1,4 @@
1
- import nn from"emittery";import Mo from"pino";import St from"node:process";import Ao from"emittery";var Ht={level:St.env.LOG_LEVEL??"debug"};St.env.NODE_ENV==="development"&&(Ht.transport={target:"pino-pretty",options:{colorize:!0}});var $t=Mo(Ht),bt=class extends Ao{_levelMap={trace:0,debug:1,info:2,warn:3,error:4,fatal:5};_currentLevelVal;_currentLevel;get level(){return this._currentLevel}constructor(t){super(),this.setLevel(t??St.env.LOG_LEVEL??"trace")}setLevel(t){this._currentLevelVal=this._levelMap[t],this._currentLevel=t}emitString(t,e,o){this._levelMap[t]>=this._currentLevelVal&&this.emit("log",{level:t,name:e,message:o})}emitObject(t,e,o){this._levelMap[t]>=this._currentLevelVal&&this.emit("log",{level:t,name:e,message:o})}},le=(c,t,e,o)=>{typeof e=="string"?($t[c]("[%s] %s",t,e),o.emitString(c,t,e)):($t[c]("[%s] %o",t,e),o.emitObject(c,t,e))},re=new bt,f=(c,t=!1)=>({trace:e=>le("trace",c,e,re),debug:e=>le("debug",c,e,re),info:e=>le("info",c,e,re),warn:e=>le("warn",c,e,re),error:e=>le("error",c,e,re),fatal:e=>le("fatal",c,e,re),emitter:t?re:void 0});import{createReadStream as zo,existsSync as Xo,mkdirSync as Jo,readFile as Qo,stat as Yo,writeFile as Zo}from"node:fs";import{mkdirSync as Oo}from"node:fs";import kt from"node:path";import v from"node:process";import Eo from"localtunnel";import{v4 as No}from"uuid";var vt="0.0.5";var Fo=(g=>(g.text="text",g.number="number",g.boolean="boolean",g.radio="radio",g.check="check",g.select="select",g.date="date",g.image="image",g.video="video",g.audio="audio",g.url="url",g.email="email",g.phone="phone",g.ipv4="ipv4",g))(Fo||{}),F={instanceName:{type:"string",title:"\u5B9E\u4F8BID","x-order":1e3,"x-decorator":"FormItem","x-component":"Input","x-component-props":{placeholder:"\u5EFA\u8BAE\u4F7F\u7528\u5BB9\u6613\u8BC6\u522B\u7684\u6807\u8BC6\uFF0C\u53EF\u4EE5\u81EA\u5DF1\u4EFB\u610F\u6307\u5B9A\uFF0C\u5168\u5C40\u5B9E\u4F8B\u4E2D\u552F\u4E00\u5373\u53EF\uFF0C\u7559\u7A7A\u4F7F\u7528\u968F\u673A\u6570\u3002"},"x-decorator-props":{tooltip:"\u53EF\u4EE5\u81EA\u5DF1\u4EFB\u610F\u6307\u5B9A\uFF0C\u5168\u5C40\u5B9E\u4F8B\u4E2D\u552F\u4E00\u5373\u53EF\u3002\u7559\u7A7A\u4F7F\u7528\u968F\u673A\u6570\u3002"}}},G=f("config"),Ye=Number(v.env.PORT??5050),Gt=String(v.env.HOST?.length?v.env.HOST:"0.0.0.0"),jt=String(v.env.PRIVATE_HOST?.length?v.env.PRIVATE_HOST:Gt),Ro="http://"+jt+":"+Ye,Bo="ws://"+jt+":"+Ye,me,ue,te=String(v.env.PUBLIC_HOST??"").trim();if(te.length){let c=Number(v.env.PUBLIC_SSL)===1,t=80;v.env.PUBLIC_PORT?.length?t=Number(v.env.PUBLIC_PORT):c&&(t=443),te.indexOf("$port")<0?(me=(c?"wss://":"ws://")+te+":"+t,ue=(c?"https://":"http://")+te+":"+t):(me=(c?"wss://":"ws://")+te.replace("$port",t.toString()),ue=(c?"https://":"http://")+te.replace("$port",t.toString()))}else{let c=v.env.PUBLIC_TUNNEL_PREFIX??"";if(!c?.length)throw new Error("\u672A\u914D\u7F6EPUBLIC_HOST\uFF0C\u8BF7\u5148\u914D\u7F6E\u518D\u542F\u52A8\uFF01");let t=await Eo({port:Ye,subdomain:c??void 0,local_https:!1});for(let o of["SIGINT","SIGTERM"])G.info("close localtunnel"),v.once(o,async()=>t.close());ue=t.url;let e=t.url.indexOf("https")===0;te=t.url.replace("https://","").replace("http://",""),me=(e?"wss://":"ws://")+te,G.debug("auto generated public httpurl "+ue),G.debug("auto generated public wsurl "+me)}ue?.length||G.warn("PUBLIC_HOST\u672A\u914D\u7F6E\u4E14\u672A\u80FD\u81EA\u52A8\u751F\u6210\u516C\u7F51\u5730\u5740\uFF0C\u90E8\u5206\u670D\u52A1\u53EF\u80FD\u4F1A\u5F02\u5E38\uFF01");var Wt=v.env.PUBLIC_PATH?.length?v.env.PUBLIC_PATH:"/public",qt=kt.resolve(kt.join("./",Wt));me.length||G.warn("WS_URL not defined,if your message source need to connect with your http posted server url ,then error may occured!");var Qe=v.env.PUBLIC_TOKEN;Qe?.length||(Qe=No(),G.warn("\u5F53\u524D\u6CA1\u6709PUBLIC_TOKEN\u73AF\u5883\u53D8\u91CF\uFF0C\u5C06\u751F\u6210\u4E00\u4E2A\u968F\u673Atoken\uFF0C\u670D\u52A1\u91CD\u542F\u540E\u4F1A\u5931\u6548\uFF01"),G.warn("\u968F\u673Atoken\u4E3A\uFF1A"+Qe));var Vt=kt.resolve(qt,"temp");Oo(Vt,{recursive:!0});var Kt=v.env.CONFIG_SERVER_URL,zt=v.env.CONFIG_SERVER_EMAIL,Xt=v.env.CONFIG_SERVER_PASSWORD,Jt=!!(v.env.OFFLINE??!1);(!Kt?.length||!Xt?.length||!zt?.length)&&(G.warn("CONFIG SERVER\u76F8\u5173\u73AF\u5883\u53D8\u91CF\u672A\u914D\u7F6E\uFF0C\u65E0\u6CD5\u4F7F\u7528\u5728\u7EBF\u914D\u7F6E\u529F\u80FD\uFF01"),Jt=!0);var y={port:Ye,host:Gt,wsUrl:me,httpUrl:ue,privateHttpUrl:Ro,privateWsUrl:Bo,publicPath:qt,publicPathName:Wt,tempDir:Vt,redisUrl:v.env.REDIS_URL,offline:Jt,configServerUrl:Kt,configServerEmail:zt,configServerPassword:Xt,publicToken:Qe,publicForceAuth:v.env.PUBLIC_FORCE_AUTH=="1",secretFile:v.env.SECRETS_FILE??"./config/.secrets.json",traceHttpRequest:v.env.TRACE_HTTP_REQUEST==="1",version:vt,npmRegistry:v.env.NPM_REGISTRY?.length?v.env.NPM_REGISTRY:"https://registry.npmjs.com",npmTimeout:parseInt(v.env.NPM_TIMEOUT??3e5),serverCompress:v.env.SERVER_COMPRESS==="1",serverCompressMinSize:v.env.SERVER_COMPRESS_MIN_SIZE?Number(v.env.SERVER_COMPRESS_MIN_SIZE):10240,serverCompressMime:(v.env.SERVER_COMPRESS_MIME??"text/plain,text/html,text/css,application/javascript,application/json").split(",")};G.warn("\u5F53\u524D\u516C\u7F51\u8BBF\u95EE\u5730\u5740\uFF1A"+y.httpUrl+" ,API TOKEN:"+y.publicToken);G.warn("\u8F6F\u4EF6\u7248\u672C "+vt);G.trace("\u5F53\u524D\u6574\u4F53\u914D\u7F6E\u4FE1\u606F\uFF1A");G.trace(y);import Z,{dirname as en}from"node:path";import{v4 as tn}from"uuid";import{Buffer as be}from"node:buffer";import Zt from"recorder-core";var W=(l=>(l.CHAT_MESSAGE="CHAT_MESSAGE",l.LOGIN="LOGIN",l.LOGOUT="LOGOUT",l.GROUP_INFO_CHANGED="GROUP_INFO_CHANGED",l.SYSTEM="SYSTEM",l.SELF_SEND="SELF_SEND",l.FIRST_CHAT="FIRST_CHAT",l.GROUP_NEW_USER="GROUP_NEW_USER",l.ENTER_CHAT="ENTER_CHAT",l.CUSTOM="CUSTOM",l))(W||{}),M=(S=>(S.TEXT="TEXT",S.RICH_TEXT="RICH_TEXT",S.IMAGE="IMAGE",S.AUDIO="AUDIO",S.VIDEO="VIDEO",S.ARTICLE="ARTICLE",S.MUSIC="MUSIC",S.FILE="FILE",S.EMOTION="EMOTION",S.MP="MP",S.REF="REF",S.POSITION="POSITION",S.PHONE="PHONE",S.FRIEND_REQUEST="FRIEND_REQUEST",S.CONTACT_CARD="CONTACT_CARD",S.CARD="CARD",S.RECALL="RECALL",S.PAT="PAT",S.SYSTEM="SYSTEM",S.SUBSCRIBE="SUBSCRIBE",S.UNSUBSCRIBE="UNSUBSCRIBE",S.CUSTOM="CUSTOM",S))(M||{}),Ze=class extends Error{},et=class extends Error{},tt=class extends Error{};import{v4 as wt}from"uuid";import{decodeWavFile as Lo}from"wav-file-decoder";import Qt from"keyv";import Do from"@keyv/redis";import Uo from"ffmpeg-static";import eo from"fluent-ffmpeg";import{createReadStream as $o,readFileSync as Ho}from"fs";import{fileTypeFromBuffer as Go,fileTypeFromStream as jo}from"file-type";import{exec as to}from"child_process";eo.setFfmpegPath(Uo);var A=f("helper"),Wo=JSON.parse(await Ho(y.secretFile).toString());A.trace("secrets files path:"+y.secretFile);var ot=function(c,t,e,o){let n=c.byteLength,r=new ArrayBuffer(44+n),s=new DataView(r);function i(u,d,g){for(let _=0;_<g.length;_++)u.setUint8(d+_,g.charCodeAt(_))}let a=0;i(s,a,"RIFF"),a+=4,s.setUint32(a,36+n,!0),a+=4,i(s,a,"WAVE"),a+=4,i(s,a,"fmt "),a+=4,s.setUint32(a,16,!0),a+=4,s.setUint16(a,1,!0),a+=2,s.setUint16(a,o,!0),a+=2,s.setUint32(a,t,!0),a+=4,s.setUint32(a,t*o*(e/8),!0),a+=4,s.setUint16(a,o*(e/8),!0),a+=2,s.setUint16(a,e,!0),a+=2,i(s,a,"data"),a+=4,s.setUint32(a,n,!0),a+=4;function p(u,d,g){let _=new Int32Array(g);for(let I=0;I<_.length;I++,d+=4)u.setInt32(d,_[I],!0)}function l(u,d,g){let _=new Int16Array(g);for(let I=0;I<_.length;I++,d+=2)u.setInt16(d,_[I],!0)}function m(u,d,g){let _=new Int8Array(g);for(let I=0;I<_.length;I++,d++)u.setInt8(d,_[I])}return e==16?l(s,44,c):e==8?m(s,44,c):p(s,44,c),s.buffer};function oo(c){return c.replace(/[\p{Emoji_Presentation}\p{Emoji}\u200D]+/gu,"")}function no(c){return c.replace(/(#+\s*|\*\*\s*|\*\s*|-\s*|_)/g,"").replace(/\*\*(.*?)\*\*/g,"$1").replace(/_(.*?)_/g,"$1").replace(/`(.*?)`/g,"$1").replace(/$$(.*?)$$$$.*?$$/g,"$1").trim()}function ro(c){return/[\p{Emoji_Presentation}\p{Emoji}\u200D]+/gu.test(c)}function so(c){return[/^#{1,6}\s/,/\*\*.*\*\*/,/\*.*\*/,/~~.*~~/,/`{1,3}[^`](.*?)`{1,3}/,/^```[\s\S]*?^```/m,/\[.*?\]\(.*?\)/,/!\[.*?\]\(.*?\)/,/^>\s/,/^-+\s*$/,/^(\*|\-|\+)\s/,/^\d+\.\s/].some(e=>e.test(c))}function io(c){return`\u6807\u9898\uFF1A${c.title};\u4F5C\u8005\uFF1A${c.source};\u7F51\u5740\uFF1A${c.url}`}function Tt(c){let t="";return c.placeName?.length&&(t+=c.placeName),c.placeDetail?.length&&(t+="("+c.placeDetail+")"),c.lat!==void 0&&(t+=`\u7ECF\u5EA6${c.lon}\uFF0C\u7EAC\u5EA6${c.lat}`),t}function J(c){let t=/\((https?:\/\/[^\s]+)\)/g,e,o=c;for(;(e=t.exec(c))!==null;){let n=e[1];o=o.replaceAll(n,` ${n} `)}return o}async function oe(c){for(let t of c)if(t.dispose){let e=await t.dispose();e?.length&&A.error(e)}}async function se(c){return new Promise((t,e)=>{Zt.amr2wav(c.buffer,o=>{t(h.fromBuffer(Buffer.from(o),wt()+".wav","binary"))},o=>{A.error(o),e(o)})})}async function Y(c){let t=(await c.asBuffer()).buffer,e=Lo(t),o=e.channelData[0];if(e.numberOfChannels===2){o=new Float32Array(e.channelData[0].length);for(let r=0;r<o.length;r++)o[r]=(e.channelData[0][r]+e.channelData[1][r])/2}else if(e.numberOfChannels!==1){A.warn("\u4E0D\u652F\u6301\u7684\u901A\u9053\u6570\u91CF\uFF1A"+e.numberOfChannels);return}let n=new Int16Array(o.length);for(let r=0;r<o.length;r++)o[r]<-.999999?n[r]=-32768:o[r]>.999999?n[r]=32767:n[r]=Math.round(o[r]*32767);return new Promise((r,s)=>{Zt({type:"amr",sampleRate:e.sampleRate,bitRate:12.2}).mock(n,e.sampleRate).stop(async(a,p)=>{let l=h.fromBuffer(Buffer.from(await a.arrayBuffer()),wt()+".amr");r({file:l,duration:p})},a=>{s(a)})})}function nt(c){return y.redisUrl?.length?new Qt(new Do(y.redisUrl),{namespace:c}):new Qt}function j(c){if(!c.startsWith("__"))return c;let t=Wo[c.slice(2)];return t?.length||A.warn("\u672A\u80FD\u627E\u5230key\u4E3A"+c.slice(2)+"\u7684\u79D8\u94A5"),t}function rt(c){return/^1[3-9]\d{9}$/.test(c)}function ne(c=16){let t="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ",e="";for(let o=0;o<c;o++){let n=Math.floor(Math.random()*t.length);e+=t[n]}return e}async function qo(c,t,e){return new Promise(o=>{eo(c).toFormat(e).on("end",()=>{o(!0)}).on("error",n=>{A.debug(`\u4ECE${c}\u8F6C\u6362\u4E3A${e}\u5931\u8D25\uFF1A${n.message}`),o(!1)}).save(t)})}async function Mt(c,t){return new Promise(e=>{c.asLocalPath().then(o=>{let n=o+"."+t;qo(o,n,t).then(r=>{if(r){let s=h.fromPath(n);e(s)}else e(void 0)})})})}function Vo(c){let t=/!\[.*?\]\((.*?)\)/g,e=[],o;for(;(o=t.exec(c))!==null;)e.push(o[1]);return e}function xe(c,t=!1){if(c.indexOf("![")>=0)return Vo(c);if(t)return[];let e=/(?:\(|"|'|\s|^)(https?:\/\/[^\s'"()]+(?:\.[^\s'"()]+)+(?:\/[^\s'"()]+)*\.(?:jpg|jpeg|png|gif|webp)(?:\?[^\s'"()]*)?)(?:\)|"|'|\s|$)/gi,o=c.match(e);return o?o.map(n=>n.trim().replace(/^[('" ]+|['") ]+$/g,"")):[]}function ao(c){let t=/!\[.*?\]\(.*?\)/g;return c.match(t)||[]}async function co(c,t){let e=typeof c=="string"?await jo($o(c)):await Go(c);if(t){let o=t.lastIndexOf(".");o>0?t=t.substring(0,o)+"."+e.ext:t+="."+e.ext}else t=t??wt()+"."+e.ext;return t}async function po(c){let t=[];for await(let e of c)t.push(e);return Buffer.concat(t)}async function Q(c,t){let e=c.getReader(),o=new TextDecoder("utf-8"),n="",r=async()=>{let{value:s,done:i}=await e.read();if(s){let a=o.decode(s)?.trim();if(a?.length){let p=a.split(`
1
+ import nn from"emittery";import Mo from"pino";import St from"node:process";import Ao from"emittery";var Ht={level:St.env.LOG_LEVEL??"debug"};St.env.NODE_ENV==="development"&&(Ht.transport={target:"pino-pretty",options:{colorize:!0}});var $t=Mo(Ht),bt=class extends Ao{_levelMap={trace:0,debug:1,info:2,warn:3,error:4,fatal:5};_currentLevelVal;_currentLevel;get level(){return this._currentLevel}constructor(t){super(),this.setLevel(t??St.env.LOG_LEVEL??"trace")}setLevel(t){this._currentLevelVal=this._levelMap[t],this._currentLevel=t}emitString(t,e,o){this._levelMap[t]>=this._currentLevelVal&&this.emit("log",{level:t,name:e,message:o})}emitObject(t,e,o){this._levelMap[t]>=this._currentLevelVal&&this.emit("log",{level:t,name:e,message:o})}},le=(c,t,e,o)=>{typeof e=="string"?($t[c]("[%s] %s",t,e),o.emitString(c,t,e)):($t[c]("[%s] %o",t,e),o.emitObject(c,t,e))},re=new bt,f=(c,t=!1)=>({trace:e=>le("trace",c,e,re),debug:e=>le("debug",c,e,re),info:e=>le("info",c,e,re),warn:e=>le("warn",c,e,re),error:e=>le("error",c,e,re),fatal:e=>le("fatal",c,e,re),emitter:t?re:void 0});import{createReadStream as zo,existsSync as Xo,mkdirSync as Jo,readFile as Qo,stat as Yo,writeFile as Zo}from"node:fs";import{mkdirSync as Oo}from"node:fs";import kt from"node:path";import v from"node:process";import Eo from"localtunnel";import{v4 as No}from"uuid";var vt="0.0.6";var Fo=(g=>(g.text="text",g.number="number",g.boolean="boolean",g.radio="radio",g.check="check",g.select="select",g.date="date",g.image="image",g.video="video",g.audio="audio",g.url="url",g.email="email",g.phone="phone",g.ipv4="ipv4",g))(Fo||{}),F={instanceName:{type:"string",title:"\u5B9E\u4F8BID","x-order":1e3,"x-decorator":"FormItem","x-component":"Input","x-component-props":{placeholder:"\u5EFA\u8BAE\u4F7F\u7528\u5BB9\u6613\u8BC6\u522B\u7684\u6807\u8BC6\uFF0C\u53EF\u4EE5\u81EA\u5DF1\u4EFB\u610F\u6307\u5B9A\uFF0C\u5168\u5C40\u5B9E\u4F8B\u4E2D\u552F\u4E00\u5373\u53EF\uFF0C\u7559\u7A7A\u4F7F\u7528\u968F\u673A\u6570\u3002"},"x-decorator-props":{tooltip:"\u53EF\u4EE5\u81EA\u5DF1\u4EFB\u610F\u6307\u5B9A\uFF0C\u5168\u5C40\u5B9E\u4F8B\u4E2D\u552F\u4E00\u5373\u53EF\u3002\u7559\u7A7A\u4F7F\u7528\u968F\u673A\u6570\u3002"}}},G=f("config"),Ye=Number(v.env.PORT??5050),Gt=String(v.env.HOST?.length?v.env.HOST:"0.0.0.0"),jt=String(v.env.PRIVATE_HOST?.length?v.env.PRIVATE_HOST:Gt),Ro="http://"+jt+":"+Ye,Bo="ws://"+jt+":"+Ye,me,ue,te=String(v.env.PUBLIC_HOST??"").trim();if(te.length){let c=Number(v.env.PUBLIC_SSL)===1,t=80;v.env.PUBLIC_PORT?.length?t=Number(v.env.PUBLIC_PORT):c&&(t=443),te.indexOf("$port")<0?(me=(c?"wss://":"ws://")+te+":"+t,ue=(c?"https://":"http://")+te+":"+t):(me=(c?"wss://":"ws://")+te.replace("$port",t.toString()),ue=(c?"https://":"http://")+te.replace("$port",t.toString()))}else{let c=v.env.PUBLIC_TUNNEL_PREFIX??"";if(!c?.length)throw new Error("\u672A\u914D\u7F6EPUBLIC_HOST\uFF0C\u8BF7\u5148\u914D\u7F6E\u518D\u542F\u52A8\uFF01");let t=await Eo({port:Ye,subdomain:c??void 0,local_https:!1});for(let o of["SIGINT","SIGTERM"])G.info("close localtunnel"),v.once(o,async()=>t.close());ue=t.url;let e=t.url.indexOf("https")===0;te=t.url.replace("https://","").replace("http://",""),me=(e?"wss://":"ws://")+te,G.debug("auto generated public httpurl "+ue),G.debug("auto generated public wsurl "+me)}ue?.length||G.warn("PUBLIC_HOST\u672A\u914D\u7F6E\u4E14\u672A\u80FD\u81EA\u52A8\u751F\u6210\u516C\u7F51\u5730\u5740\uFF0C\u90E8\u5206\u670D\u52A1\u53EF\u80FD\u4F1A\u5F02\u5E38\uFF01");var Wt=v.env.PUBLIC_PATH?.length?v.env.PUBLIC_PATH:"/public",qt=kt.resolve(kt.join("./",Wt));me.length||G.warn("WS_URL not defined,if your message source need to connect with your http posted server url ,then error may occured!");var Qe=v.env.PUBLIC_TOKEN;Qe?.length||(Qe=No(),G.warn("\u5F53\u524D\u6CA1\u6709PUBLIC_TOKEN\u73AF\u5883\u53D8\u91CF\uFF0C\u5C06\u751F\u6210\u4E00\u4E2A\u968F\u673Atoken\uFF0C\u670D\u52A1\u91CD\u542F\u540E\u4F1A\u5931\u6548\uFF01"),G.warn("\u968F\u673Atoken\u4E3A\uFF1A"+Qe));var Vt=kt.resolve(qt,"temp");Oo(Vt,{recursive:!0});var Kt=v.env.CONFIG_SERVER_URL,zt=v.env.CONFIG_SERVER_EMAIL,Xt=v.env.CONFIG_SERVER_PASSWORD,Jt=!!(v.env.OFFLINE??!1);(!Kt?.length||!Xt?.length||!zt?.length)&&(G.warn("CONFIG SERVER\u76F8\u5173\u73AF\u5883\u53D8\u91CF\u672A\u914D\u7F6E\uFF0C\u65E0\u6CD5\u4F7F\u7528\u5728\u7EBF\u914D\u7F6E\u529F\u80FD\uFF01"),Jt=!0);var y={port:Ye,host:Gt,wsUrl:me,httpUrl:ue,privateHttpUrl:Ro,privateWsUrl:Bo,publicPath:qt,publicPathName:Wt,tempDir:Vt,redisUrl:v.env.REDIS_URL,offline:Jt,configServerUrl:Kt,configServerEmail:zt,configServerPassword:Xt,publicToken:Qe,publicForceAuth:v.env.PUBLIC_FORCE_AUTH=="1",secretFile:v.env.SECRETS_FILE??"./config/.secrets.json",traceHttpRequest:v.env.TRACE_HTTP_REQUEST==="1",version:vt,npmRegistry:v.env.NPM_REGISTRY?.length?v.env.NPM_REGISTRY:"https://registry.npmjs.com",npmTimeout:parseInt(v.env.NPM_TIMEOUT??3e5),serverCompress:v.env.SERVER_COMPRESS==="1",serverCompressMinSize:v.env.SERVER_COMPRESS_MIN_SIZE?Number(v.env.SERVER_COMPRESS_MIN_SIZE):10240,serverCompressMime:(v.env.SERVER_COMPRESS_MIME??"text/plain,text/html,text/css,application/javascript,application/json").split(",")};G.warn("\u5F53\u524D\u516C\u7F51\u8BBF\u95EE\u5730\u5740\uFF1A"+y.httpUrl+" ,API TOKEN:"+y.publicToken);G.warn("\u8F6F\u4EF6\u7248\u672C "+vt);G.trace("\u5F53\u524D\u6574\u4F53\u914D\u7F6E\u4FE1\u606F\uFF1A");G.trace(y);import Z,{dirname as en}from"node:path";import{v4 as tn}from"uuid";import{Buffer as be}from"node:buffer";import Zt from"recorder-core";var W=(l=>(l.CHAT_MESSAGE="CHAT_MESSAGE",l.LOGIN="LOGIN",l.LOGOUT="LOGOUT",l.GROUP_INFO_CHANGED="GROUP_INFO_CHANGED",l.SYSTEM="SYSTEM",l.SELF_SEND="SELF_SEND",l.FIRST_CHAT="FIRST_CHAT",l.GROUP_NEW_USER="GROUP_NEW_USER",l.ENTER_CHAT="ENTER_CHAT",l.CUSTOM="CUSTOM",l))(W||{}),M=(S=>(S.TEXT="TEXT",S.RICH_TEXT="RICH_TEXT",S.IMAGE="IMAGE",S.AUDIO="AUDIO",S.VIDEO="VIDEO",S.ARTICLE="ARTICLE",S.MUSIC="MUSIC",S.FILE="FILE",S.EMOTION="EMOTION",S.MP="MP",S.REF="REF",S.POSITION="POSITION",S.PHONE="PHONE",S.FRIEND_REQUEST="FRIEND_REQUEST",S.CONTACT_CARD="CONTACT_CARD",S.CARD="CARD",S.RECALL="RECALL",S.PAT="PAT",S.SYSTEM="SYSTEM",S.SUBSCRIBE="SUBSCRIBE",S.UNSUBSCRIBE="UNSUBSCRIBE",S.CUSTOM="CUSTOM",S))(M||{}),Ze=class extends Error{},et=class extends Error{},tt=class extends Error{};import{v4 as wt}from"uuid";import{decodeWavFile as Lo}from"wav-file-decoder";import Qt from"keyv";import Do from"@keyv/redis";import Uo from"ffmpeg-static";import eo from"fluent-ffmpeg";import{createReadStream as $o,readFileSync as Ho}from"fs";import{fileTypeFromBuffer as Go,fileTypeFromStream as jo}from"file-type";import{exec as to}from"child_process";eo.setFfmpegPath(Uo);var A=f("helper"),Wo=JSON.parse(await Ho(y.secretFile).toString());A.trace("secrets files path:"+y.secretFile);var ot=function(c,t,e,o){let n=c.byteLength,r=new ArrayBuffer(44+n),s=new DataView(r);function i(u,d,g){for(let _=0;_<g.length;_++)u.setUint8(d+_,g.charCodeAt(_))}let a=0;i(s,a,"RIFF"),a+=4,s.setUint32(a,36+n,!0),a+=4,i(s,a,"WAVE"),a+=4,i(s,a,"fmt "),a+=4,s.setUint32(a,16,!0),a+=4,s.setUint16(a,1,!0),a+=2,s.setUint16(a,o,!0),a+=2,s.setUint32(a,t,!0),a+=4,s.setUint32(a,t*o*(e/8),!0),a+=4,s.setUint16(a,o*(e/8),!0),a+=2,s.setUint16(a,e,!0),a+=2,i(s,a,"data"),a+=4,s.setUint32(a,n,!0),a+=4;function p(u,d,g){let _=new Int32Array(g);for(let I=0;I<_.length;I++,d+=4)u.setInt32(d,_[I],!0)}function l(u,d,g){let _=new Int16Array(g);for(let I=0;I<_.length;I++,d+=2)u.setInt16(d,_[I],!0)}function m(u,d,g){let _=new Int8Array(g);for(let I=0;I<_.length;I++,d++)u.setInt8(d,_[I])}return e==16?l(s,44,c):e==8?m(s,44,c):p(s,44,c),s.buffer};function oo(c){return c.replace(/[\p{Emoji_Presentation}\p{Emoji}\u200D]+/gu,"")}function no(c){return c.replace(/(#+\s*|\*\*\s*|\*\s*|-\s*|_)/g,"").replace(/\*\*(.*?)\*\*/g,"$1").replace(/_(.*?)_/g,"$1").replace(/`(.*?)`/g,"$1").replace(/$$(.*?)$$$$.*?$$/g,"$1").trim()}function ro(c){return/[\p{Emoji_Presentation}\p{Emoji}\u200D]+/gu.test(c)}function so(c){return[/^#{1,6}\s/,/\*\*.*\*\*/,/\*.*\*/,/~~.*~~/,/`{1,3}[^`](.*?)`{1,3}/,/^```[\s\S]*?^```/m,/\[.*?\]\(.*?\)/,/!\[.*?\]\(.*?\)/,/^>\s/,/^-+\s*$/,/^(\*|\-|\+)\s/,/^\d+\.\s/].some(e=>e.test(c))}function io(c){return`\u6807\u9898\uFF1A${c.title};\u4F5C\u8005\uFF1A${c.source};\u7F51\u5740\uFF1A${c.url}`}function Tt(c){let t="";return c.placeName?.length&&(t+=c.placeName),c.placeDetail?.length&&(t+="("+c.placeDetail+")"),c.lat!==void 0&&(t+=`\u7ECF\u5EA6${c.lon}\uFF0C\u7EAC\u5EA6${c.lat}`),t}function J(c){let t=/\((https?:\/\/[^\s]+)\)/g,e,o=c;for(;(e=t.exec(c))!==null;){let n=e[1];o=o.replaceAll(n,` ${n} `)}return o}async function oe(c){for(let t of c)if(t.dispose){let e=await t.dispose();e?.length&&A.error(e)}}async function se(c){return new Promise((t,e)=>{Zt.amr2wav(c.buffer,o=>{t(h.fromBuffer(Buffer.from(o),wt()+".wav","binary"))},o=>{A.error(o),e(o)})})}async function Y(c){let t=(await c.asBuffer()).buffer,e=Lo(t),o=e.channelData[0];if(e.numberOfChannels===2){o=new Float32Array(e.channelData[0].length);for(let r=0;r<o.length;r++)o[r]=(e.channelData[0][r]+e.channelData[1][r])/2}else if(e.numberOfChannels!==1){A.warn("\u4E0D\u652F\u6301\u7684\u901A\u9053\u6570\u91CF\uFF1A"+e.numberOfChannels);return}let n=new Int16Array(o.length);for(let r=0;r<o.length;r++)o[r]<-.999999?n[r]=-32768:o[r]>.999999?n[r]=32767:n[r]=Math.round(o[r]*32767);return new Promise((r,s)=>{Zt({type:"amr",sampleRate:e.sampleRate,bitRate:12.2}).mock(n,e.sampleRate).stop(async(a,p)=>{let l=h.fromBuffer(Buffer.from(await a.arrayBuffer()),wt()+".amr");r({file:l,duration:p})},a=>{s(a)})})}function nt(c){return y.redisUrl?.length?new Qt(new Do(y.redisUrl),{namespace:c}):new Qt}function j(c){if(!c.startsWith("__"))return c;let t=Wo[c.slice(2)];return t?.length||A.warn("\u672A\u80FD\u627E\u5230key\u4E3A"+c.slice(2)+"\u7684\u79D8\u94A5"),t}function rt(c){return/^1[3-9]\d{9}$/.test(c)}function ne(c=16){let t="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ",e="";for(let o=0;o<c;o++){let n=Math.floor(Math.random()*t.length);e+=t[n]}return e}async function qo(c,t,e){return new Promise(o=>{eo(c).toFormat(e).on("end",()=>{o(!0)}).on("error",n=>{A.debug(`\u4ECE${c}\u8F6C\u6362\u4E3A${e}\u5931\u8D25\uFF1A${n.message}`),o(!1)}).save(t)})}async function Mt(c,t){return new Promise(e=>{c.asLocalPath().then(o=>{let n=o+"."+t;qo(o,n,t).then(r=>{if(r){let s=h.fromPath(n);e(s)}else e(void 0)})})})}function Vo(c){let t=/!\[.*?\]\((.*?)\)/g,e=[],o;for(;(o=t.exec(c))!==null;)e.push(o[1]);return e}function xe(c,t=!1){if(c.indexOf("![")>=0)return Vo(c);if(t)return[];let e=/(?:\(|"|'|\s|^)(https?:\/\/[^\s'"()]+(?:\.[^\s'"()]+)+(?:\/[^\s'"()]+)*\.(?:jpg|jpeg|png|gif|webp)(?:\?[^\s'"()]*)?)(?:\)|"|'|\s|$)/gi,o=c.match(e);return o?o.map(n=>n.trim().replace(/^[('" ]+|['") ]+$/g,"")):[]}function ao(c){let t=/!\[.*?\]\(.*?\)/g;return c.match(t)||[]}async function co(c,t){let e=typeof c=="string"?await jo($o(c)):await Go(c);if(t){let o=t.lastIndexOf(".");o>0?t=t.substring(0,o)+"."+e.ext:t+="."+e.ext}else t=t??wt()+"."+e.ext;return t}async function po(c){let t=[];for await(let e of c)t.push(e);return Buffer.concat(t)}async function Q(c,t){let e=c.getReader(),o=new TextDecoder("utf-8"),n="",r=async()=>{let{value:s,done:i}=await e.read();if(s){let a=o.decode(s)?.trim();if(a?.length){let p=a.split(`
2
2
  `).map(l=>l.replace("data:","").trim()).filter(l=>l.length&&!l.startsWith("event:"));if(p.length){let l=n+p[0];try{let m=JSON.parse(l);if(t(m),p.length>1){for(let u=1;u<p.length-1;u++)m=JSON.parse(p[u]),t(m);try{m=JSON.parse(p[p.length-1]),t(m)}catch{n=p[p.length-1]}}}catch{n=l}}}}i?A.debug("\u6D88\u606F\u6D41\u5173\u95ED"):await r()};return r()}async function st(c){let t=`### ${c.title}`;for(let e of c.content)if(e.type==="text")t+=`
3
3
 
4
4
  ${e.data}
@@ -36,4 +36,4 @@ ${e.data}
36
36
  <ans_node_name></ans_node_name>
37
37
  </xml>`,s=`<xml>
38
38
  ${new hr().build(o)}
39
- </xml>`,i=_r(this._options.aesKey,r,this._options.appId),a=`${this._options.apiBase}/openapi/sendmsg/${this._options.token}`;try{let p=await fetch(a,{method:"post",headers:{"content-type":"application/json"},body:JSON.stringify({encrypt:i})});this._logger.debug(await p.text())}catch(p){this._logger.error(p)}}else this._logger.info("\u5185\u5BB9\u4E3A\u7A7A\u6216\u8005\u65E0\u6CD5\u53D1\u9001\u7684\u6D88\u606F"),this._logger.info(t)}async getContacts(t,e=!1){return[]}async getContactDetail(t){return t}};var Xe=class extends B{static params={name:"xunfei-bot",desc:"\u8BAF\u98DE\u661F\u706B\u8BA4\u77E5\u6A21\u578B",optionsSchema:{type:"formily",formily:{type:"object",properties:{...B.params.optionsSchema.formily.properties,apiBase:{type:"string",title:"\u670D\u52A1URL","x-index":1,"x-decorator":"FormItem","x-component":"Input","x-component-props":{placeholder:"eg: https://spark-api-open.xf-yun.com/v1 \u4F7F\u7528\u79D1\u5927\u8BAF\u98DE\u5B98\u65B9\u670D\u52A1\u53EF\u7559\u7A7A\u3002"},"x-validator":{format:"url"},"x-decorator-props":{tooltip:"\u57FA\u4E8EOpenAI\u517C\u5BB9\u63A5\u53E3\u6269\u5C55\uFF0C\u8BF7\u4F7F\u7528OpenAI\u517C\u5BB9\u63A5\u53E3\u7684\u5730\u5740\uFF0C\u4F7F\u7528\u79D1\u5927\u8BAF\u98DE\u5B98\u65B9\u5730\u5740\u53EF\u7559\u7A7A\u3002"}},modelName:{type:"string",title:"\u6A21\u578B\u540D\u79F0","x-index":4,"x-decorator":"FormItem","x-component":"AutoComplete",enum:[{label:"lite(Spark Lite)",value:"lite"},{label:"generalv3(Spark Pro)",value:"generalv3"},{label:"pro-128k(Spark Pro-128K)",value:"pro-128k"},{label:"generalv3.5(Spark Max)",value:"generalv3.5"},{label:"max-32k(Spark Max-32K)",value:"max-32k"},{label:"4.0Ultr(Spark4.0 Ultra)",value:"4.0Ultra"}],"x-component-props":{allowClear:!0,placeholder:"\u8BF7\u9009\u62E9\u6216\u8005\u8F93\u5165\u6A21\u578B\u7684\u540D\u79F0"},default:"lite","x-decorator-props":{tooltip:"\u6A21\u578B\u540D\u79F0\uFF0C\u53C2\u8003\u8BAF\u98DE\u63A7\u5236\u53F0-\u661F\u706B\u8C03\u8BD5\u4E2D\u5FC3-\uFF08\u53F3\u4FA7\uFF09\u8F6C\u6362\u6A21\u7248\u4E3A\u4EE3\u7801\u3002"},required:!0},chatOptions:{type:"object",title:"\u5176\u4ED6\u5BF9\u8BDD\u914D\u7F6E","x-index":5,"x-decorator":"FormItem","x-component":"Code","x-decorator-props":{tooltip:"\u9664\u6A21\u578B\u540D\u79F0\u4E4B\u5916\u7684\u5176\u4ED6\u5BF9\u8BDD\u914D\u7F6E\uFF0C\u53C2\u8003\u8BAF\u98DE\u5B98\u7F51"},required:!1},onlyText:{type:"boolean",title:"\u662F\u5426\u4E3A\u7EAF\u6587\u672C\u6A21\u578B","x-decorator":"FormItem","x-component":"Switch","x-component-props":{checkedChildren:"\u662F",unCheckedChildren:"\u5426"},"x-decorator-props":{tooltip:"\u5982\u679C\u4E0D\u652F\u6301\u591A\u6A21\u6001\uFF0C\u8BBE\u7F6E\u4E3Atrue\uFF0C\u5426\u5219\u8BBE\u7F6E\u4E3Afalse\uFF0C\u9ED8\u8BA4\u662Ffalse\u3002"},default:!1,"x-display":!1}}}}};constructor(t){t.apiBase?.length||(t.apiBase="https://spark-api-open.xf-yun.com/v1"),t.onlyText=!0,t.chatOptions.model=t.modelName??t.chatOptions.model??"lite",super(t),this.logger.trace("\u5F53\u524D\u8BAF\u98DE\u661F\u706B\u6A21\u578B\uFF1A"+t.chatOptions.model)}};var Je=class extends B{static params={name:"zhipu-bot",desc:"\u667A\u666EAI\u5927\u6A21\u578B",optionsSchema:{type:"formily",formily:{type:"object",properties:{...B.params.optionsSchema.formily.properties,apiBase:{type:"string",title:"\u670D\u52A1URL","x-index":1,"x-decorator":"FormItem","x-component":"Input","x-component-props":{placeholder:"eg: https://open.bigmodel.cn/api/paas/v4 \u4F7F\u7528\u667A\u666EAI\u5B98\u65B9\u670D\u52A1\u53EF\u7559\u7A7A\u3002"},"x-validator":{format:"url"},"x-decorator-props":{tooltip:"\u4F7F\u7528\u667A\u666EAI\u5B98\u65B9\u5730\u5740\u53EF\u7559\u7A7A\u3002"}},modelName:{type:"string",title:"\u6A21\u578B\u540D\u79F0","x-index":4,"x-decorator":"FormItem","x-component":"AutoComplete",enum:[{value:"glm-4-flash",label:"glm-4-flash(free)"},{value:"glm-4v-flash",label:"glm-4v-flash(free)"},{value:"glm-4-0520",label:"glm-4-0520"},{value:"glm-4",label:"glm-4"},{value:"glm-4-air",label:"glm-4-air"},{value:"glm-4-airx",label:"glm-4-airx"},{value:"glm-4-long",label:"glm-4-long"},{value:"glm-4-flashx",label:"glm-4-flashx"},{value:"glm-4v-plus",label:"glm-4v-plus"},{value:"glm-4v",label:"glm-4v"},{value:"charglm-4",label:"charglm-4"}],"x-component-props":{allowClear:!0,placeholder:"\u8BF7\u9009\u62E9\u6216\u8005\u8F93\u5165\u6A21\u578B\u7684\u540D\u79F0"},default:"glm-4-flash","x-decorator-props":{tooltip:"\u6A21\u578B\u540D\u79F0\uFF0C\u53C2\u8003 https://bigmodel.cn/dev/api/normal-model/glm-4 \u3002"},required:!0},chatOptions:{type:"object",title:"\u5176\u4ED6\u5BF9\u8BDD\u914D\u7F6E","x-index":5,"x-decorator":"FormItem","x-component":"Code","x-decorator-props":{tooltip:"\u9664\u6A21\u578B\u540D\u79F0\u4E4B\u5916\u7684\u5176\u4ED6\u5BF9\u8BDD\u914D\u7F6E\uFF0C\u53C2\u8003\u667A\u666EAI\u5B98\u7F51"},required:!1}}}}};constructor(t){t.apiBase?.length||(t.apiBase="https://open.bigmodel.cn/api/paas/v4"),t.chatOptions.model=t.modelName??t.chatOptions.model??"glm-4-flash",super(t),this.logger.trace("\u5F53\u524D\u667A\u666EAI\u6A21\u578B\uFF1A"+t.chatOptions.model)}};var ah=async c=>({init:async()=>({skills:[{creator:t=>new Be(t),params:Be.params},{creator:t=>new Re(t),params:Re.params}],bots:[{creator:t=>new ke(t),params:ke.params},{creator:t=>new ve(t),params:ve.params},{creator:t=>new B(t),params:B.params},{creator:t=>new we(t),params:we.params},{creator:t=>new Ae(t),params:Ae.params},{creator:t=>new Pe(t),params:Pe.params},{creator:t=>new Oe(t),params:Oe.params},{creator:t=>new Ee(t),params:Ee.params},{creator:t=>new Te(t),params:Te.params},{creator:t=>new Me(t),params:Me.params},{creator:t=>new Xe(t),params:Xe.params},{creator:t=>new Je(t),params:Je.params}],sources:[{creator:t=>new He(t),params:He.params},{creator:t=>new Le(c,t),params:Le.params},{creator:t=>new De(t),params:De.params},{creator:t=>new Ge(c,t),params:Ge.params},{creator:t=>new je(c,t),params:je.params},{creator:t=>new qe(c,t),params:qe.params},{creator:t=>new Ke(c,t),params:Ke.params},{creator:t=>new ze(c,t),params:ze.params}],taskTriggers:[{creator:t=>new Ne(c,t),params:Ne.params},{creator:t=>new Fe(c,t),params:Fe.params},{creator:t=>new $e(c,t),params:$e.params}],taskRunners:[{creator:t=>new Ue(c,t),params:Ue.params}]}),needOnline:!1,name:"\u9ED8\u8BA4\u63D2\u4EF6",dispose:async()=>{}});var yt=class extends q{};var _t=class extends q{};var Ct=class extends q{constructor(e){e.cacheInstance=!1;super(e);this.options=e}},xt=class extends q{constructor(e){e.cacheInstance=!1;super(e);this.options=e}};import Cr from"fastify";import xr from"@fastify/websocket";import br from"@fastify/static";import _e from"node:process";import Sr from"@fastify/formbody";import vr from"emittery";import{XMLParser as kr}from"fast-xml-parser";import ko from"fs";import Ut from"node:path";import{createReadStream as wr,existsSync as Tr}from"node:fs";import{authentication as Mr,createDirectus as Ar,readItems as Pr,readMe as Or,rest as Er}from"@directus/sdk";import Nr from"@fastify/cors";import{v4 as wo}from"uuid";import Fr from"@fastify/compress";var To=class c extends vr{constructor(e={name:"default"}){super();this._options=e;this._logger=f("app-"+this._options.name),this._globalEvent=new pt(this._options.name)}static EventNames={ERROR:"error"};_server;_pluginHandlers=[];_wsRoutes={};_httpRoutes=new Map;_starting=!1;_stopping=!1;_stopped=!1;_running=!1;_agentService;_skillManager;_sourceManager;_botManager;_taskService;_taskTriggerManager;_taskRunnerManager;_xmlParser=new kr;_sharedCover;_sharedLogo;_client;_me;_globalEvent;_logger;_onlinePluginInfos=new Map;get server(){return this._server}get skillManager(){return this._skillManager}get sourceManager(){return this._sourceManager}get botManager(){return this._botManager}get taskTriggerManager(){return this._taskTriggerManager}get taskRunnerManager(){return this._taskRunnerManager}get agentService(){return this._agentService}get offlineMode(){return this._options.offline??!1}get sharedCover(){return this._sharedCover}get sharedLogo(){return this._sharedLogo}get client(){return this._client||this._logger.warn("\u914D\u7F6E\u670D\u52A1client\u5C1A\u672A\u521B\u5EFA\uFF0C\u8BF7\u7B49\u5F85\u670D\u52A1\u521D\u59CB\u5316\u4E4B\u540E\u518D\u8C03\u7528\uFF01"),this._client}get options(){return JSON.parse(JSON.stringify(this._options))}get taskService(){return this._taskService}get globalEvent(){return this._globalEvent}get plugins(){return[...this._pluginHandlers]}get me(){return this._me}get onlinePlugins(){return this._onlinePluginInfos.values()}running(){return this._running}async _createServer(){this._logger.trace("create fastify server"),this._server=Cr({logger:{level:"warn"}}),await this._server.register(xr),await this._server.register(Sr),await this._server.register(Nr,{origin:"*"}),y.serverCompress&&(this._logger.info("\u542F\u7528\u670D\u52A1\u5668gzip\u538B\u7F29"),await this._server.register(Fr,{global:!0,threshold:y.serverCompressMinSize,customTypes:e=>y.serverCompressMime.includes(e)})),this._server.addContentTypeParser(["text/xml","application/xml"],(e,o,n)=>{let r=[];o.on("data",s=>{r.push(s)}),o.on("end",()=>{try{let s=Buffer.concat(r).toString(),i=this._xmlParser.parse(s);n(null,i)}catch(s){n(s)}})}),this._logger.trace("fastify server created")}async _initServer(){if(this._logger.trace("register fastify server plugins"),await this._server.register(async e=>{e.get("/ws/*",{websocket:!0},(o,n)=>{y.traceHttpRequest&&this._logger.trace("ws request,ip"+n.ip+",host:"+n.hostname+",path:"+n.url);let s=(n.query.token??n.headers.authorization?.replace("Bearer","").trim())===y.publicToken;if(y.publicForceAuth&&!s){this._logger.debug("\u672A\u6388\u6743\u7684\u8BBF\u95EE"),this._logger.debug(n.url),o.close(403,"\u672A\u6388\u6743\u7684\u8BBF\u95EE");return}let i=n.params["*"],a,p,l,m=new TextDecoder("utf-8");if(i==="normal")a=async u=>{u instanceof Buffer&&(u=m.decode(u));try{let d=JSON.parse(u),g=`${d?.instanceName}-${d?.action}`,_=this._wsRoutes[g];if(_.needAuth&&!s)return this._logger.debug("\u672A\u6388\u6743\u7684\u8BBF\u95EE\uFF01"),"\u60A8\u672A\u88AB\u5141\u8BB8\u8BBF\u95EE\u8BE5\u65B9\u6CD5\uFF01";let I=_.action;if(!I){this._logger.warn("unhandled message:"+u);return}let E=await I(d.data);if(E!=null){let $={id:d.id,data:E};return JSON.stringify($)}}catch(d){return String(d)}};else{let u=i.replaceAll("/","-"),d=()=>{let g=this._wsRoutes[u];if(!g){o.send(String({error:"normal ws path:/ws/normal,custom ws path:/ws/instanceName/action\uFF01"}));return}if(g.needAuth&&!s){this._logger.debug("\u672A\u6388\u6743\u7684\u8BBF\u95EE\uFF01"),o.close(403,"\u672A\u6388\u6743\u7684\u8BBF\u95EE\uFF01");return}return g};a=async(g,_,I)=>{let E=d();if(!E)return;E.action.onMessage(g,_,I)},p=async(g,_)=>{let I=d();if(!I)return;I.action.onOpen(g,_)},l=async(g,_)=>{let I=d();if(!I)return;I.action.onClose(g,_)}}o.on("message",async u=>{y.traceHttpRequest&&this._logger.trace("ws on meesage, type "+typeof u);try{let d=await a(u,n,o);d!=null&&o.send(d)}catch(d){this._logger.error(d)}}),p&&p(n,o),l&&o.on("close",()=>{l(n,o),this._logger.trace("ws closed,from "+n.hostname)}),o.on("error",u=>{this._logger.error(u)})})}),this._server.all("/api/*",async(e,o)=>{y.traceHttpRequest&&this._logger.trace("api request,ip"+e.ip+",host:"+e.hostname+",path:"+e.url);let n=e.params["*"].replaceAll("/","-");if(!this._httpRoutes.has(n)){o.send("success");return}let r=this._httpRoutes.get(n);if((r.needAuth||y.publicForceAuth)&&(e.query.token??e.headers.authorization?.replace("Bearer","").trim())!==y.publicToken){this._logger.warn("\u672A\u6388\u6743\u7684\u8BBF\u95EE"),this._logger.warn(e.url),o.status(401),o.send("\u672A\u88AB\u6388\u6743\u7684\u8BBF\u95EE\uFF01");return}let s=r.action;try{return s.type==="normal"?o.send(await s.handler(e)):(s.handler(e,o),o)}catch(i){i instanceof tt?(o.status(401),o.send(i.message)):i instanceof et?(o.status(400),o.send(i.message)):i instanceof Ze?(o.status(404),o.send(i.message)):(o.status(500),o.send(String(i)))}}),await this._server.register(br,{root:y.publicPath,prefix:y.publicPathName}),_e.env.VERIFY_FILE?.length){let e=Ut.resolve("."+_e.env.VERIFY_FILE);Tr(e)?this._server.get(_e.env.VERIFY_FILE,(o,n)=>{this._logger.trace("verify service requested from "+o.url),n.send(wr(e))}):this._logger.warn("\u8DEF\u5F84"+e+"\u4E0D\u5B58\u5728\uFF0C\u65E0\u6CD5\u521B\u5EFA\u7528\u4E8E\u9A8C\u8BC1\u7AD9\u70B9\u5F52\u5C5E\u7684\u8DEF\u7531\uFF01")}await this._server.ready(),await this._server.listen({host:y.host,port:y.port}),this._logger.info("http server started on port "+y.port)}_checkRegister(){return this._stopped?(this._logger.error("\u5F53\u524D\u670D\u52A1\u5DF2\u505C\u6B62\uFF0C\u65E0\u6CD5\u6CE8\u518C\u65B0\u7684\u8DEF\u7531\u6216\u8005\u63D2\u4EF6\uFF01"),!1):this._running?(this._logger.error("\u5F53\u524D\u670D\u52A1\u5DF2\u7ECF\u542F\u52A8\uFF0C\u65E0\u6CD5\u6CE8\u518C\u65B0\u7684\u8DEF\u7531\u6216\u8005\u63D2\u4EF6\uFF0C\u8BF7\u5728\u8C03\u7528start\u65B9\u6CD5\u4E4B\u524D\u6CE8\u518C\uFF01"),!1):!0}async _initResources(){let e=this._options.sharedCoverPath??Ut.resolve(y.publicPath,"images","cover-default.png");(e.startsWith("http")||ko.existsSync(e))&&(this._sharedCover=h.fromPath(e,"binary","shared-cover.png"));let o=this._options.sharedLogoPath??Ut.resolve(y.publicPath,"images","logo-default.png");(o.startsWith("http")||ko.existsSync(o))&&(this._sharedLogo=h.fromPath(o,"binary","shared-logo.png"))}async _loadOnlinePlugins(){this._logger.info("loading online plugins...");let e=await this._client.request(Pr("plugins",{filter:{status:{_neq:"archived"}},user_created:{_eq:this._me?.id}}));this._logger.info(e);let o=0;for(let n of e)try{let r=await import(n.name);r=r.default??r.plugin??r,await this.use(r,n),o++}catch(r){this._logger.warn(`\u8F7D\u5165\u63D2\u4EF6${n.name}\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5\u662F\u5426\u5DF2\u7ECF\u5B89\u88C5\u76F8\u5173npm\u4F9D\u8D56\uFF01`),this._logger.warn(r)}this._logger.info(`${o} online plugin(s) loaded`)}async use(e,o){if(typeof e!="function"){this._logger.warn("\u63D2\u4EF6\u9700\u8981\u5B9E\u73B0\u6307\u5B9A\u63A5\u53E3\uFF0C\u68C0\u6D4B\u5230\u65E0\u6548\u7684\u63D2\u4EF6\uFF1A"),this._logger.warn(e);return}let n=await e(this,o?.options);if(typeof n?.init!="function"){this._logger.warn("\u63D2\u4EF6\u6CA1\u6709\u5B9E\u73B0init\u63A5\u53E3"),this._logger.warn(n);return}if(n.needOnline&&this.offlineMode){this._logger.error("\u63D2\u4EF6"+n.name+"\u9700\u8981\u4F7F\u7528\u5728\u7EBF\u914D\u7F6E\uFF0C\u65E0\u6CD5\u79BB\u7EBF\u6A21\u5F0F\u542F\u52A8\uFF0C\u8BE5\u63D2\u4EF6\u5C06\u88AB\u5FFD\u7565\uFF01");return}return o?.name&&n.name!==o.name&&(this._logger.warn("\u5728\u7EBF\u63D2\u4EF6"+n.name+"\u7684\u4EE3\u7801\u4E0E\u63D2\u4EF6\u5305\u4E2D\u7684\u540D\u79F0\u4E0D\u5339\u914D\uFF0C\u5DF2\u81EA\u52A8\u8986\u76D6\u4E3Anpm\u5305\u4E2D\u7684\u540D\u79F0\uFF01"),n.name=o.name),o?.id&&(o.schecma=n.schema,o.options=o.options??{},this._onlinePluginInfos.set(o.name,o)),this._pluginHandlers.push(n),this._logger.trace("plugin "+n.name+" registered"),n}async start(){if(this._stopped){this._logger.error("\u5F53\u524D\u670D\u52A1\u5DF2\u505C\u6B62\uFF0C\u5982\u9700\u542F\u52A8\uFF0C\u8BF7\u91CD\u65B0\u521B\u5EFA\u65B0\u7684\u5B9E\u4F8B\uFF01");return}if(this._starting||this._running){this._logger.warn("\u670D\u52A1\u5668\u6B63\u5FD9\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5\uFF01");return}if(this._starting=!0,!this._options.offline){this._logger.debug("\u5F53\u524D\u670D\u52A1\u5C06\u542F\u7528\u5728\u7EBF\u914D\u7F6E\uFF0C\u8BF7\u786E\u4FDD\u60A8\u6CE8\u518C\u4E86\u914D\u7F6E\u670D\u52A1\u5668\u7684\u8D26\u53F7\uFF01\u5426\u5219\u8BF7\u5173\u95ED\u5728\u7EBF\u914D\u7F6E\u670D\u52A1\uFF08\u8BBE\u7F6EOFFLINE=true\uFF09"),this._client=Ar(y.configServerUrl).with(Mr("json")).with(Er()),await this.client.login(y.configServerEmail,y.configServerPassword);let n=await this._client.request(Or());this._logger.debug("\u914D\u7F6E\u670D\u52A1\u5668\u8FDE\u63A5\u6210\u529F"),this._logger.debug(`\u5F53\u524D\u767B\u5F55\u8D26\u53F7\uFF1A${n.email}`),this._me=n,await this._loadOnlinePlugins()}this._botManager=new mt,this._skillManager=new yt,this._sourceManager=new _t,this._taskTriggerManager=new xt({cacheInstance:!1}),this._taskRunnerManager=new Ct({cacheInstance:!1}),await this._initResources(),this._logger.trace("default resources loaded");for(let n of this._pluginHandlers)if(n.init){let r=await n.init();r&&(r.bots?.forEach(s=>this._botManager.registerInstanceCreator(s.creator,s.params)),r.sources?.forEach(s=>this._sourceManager.registerInstanceCreator(s.creator,s.params)),r.skills?.forEach(s=>this._skillManager.registerInstanceCreator(s.creator,s.params)),r.taskTriggers?.forEach(s=>this._taskTriggerManager.registerInstanceCreator(s.creator,s.params)),r.taskRunners?.forEach(s=>this._taskRunnerManager.registerInstanceCreator(s.creator,s.params))),this._logger.trace("plugin "+n.name+" init")}await this._createServer(),this._logger.trace("http server created"),await(this._agentService=new lt(this,this._options.agentServiceOptions)).init(),this._logger.trace("agent service created"),await(this._taskService=new ht(this,this._options.taskServiceOptions)).init(),this._logger.trace("task service created");for(let n of this._pluginHandlers)n.beforeStart&&(await n.beforeStart(),this._logger.trace(`plugin ${n.name} beforeStart`));await this._initServer(),this._running=!0;for(let n of this._pluginHandlers)n.afterStart&&(await n.afterStart(),this._logger.trace(`plugin ${n.name} afterStart`));this._starting=!1,_e.on("unhandledRejection",n=>{this._logger.error(n),this.emit(c.EventNames.ERROR,n)});for(let n of["SIGINT","SIGTERM"])this._logger.info("break signal received"),_e.once(n,async()=>await this.stop(n));this._globalEvent.emit("APP_STARED",{title:"\u670D\u52A1\u542F\u52A8",id:wo()})}async reload(){this._logger.info("agent and task service is reloading,service may unavailable for a while..."),await this._agentService.reload(),await this._taskService.reload(),this._logger.info("agent and task service reload completed"),this._logger.info("if you want to reload plugins,please restart server"),this._globalEvent.emit("APP_REALOD",{title:"\u670D\u52A1\u91CD\u8F7D",id:wo()})}async stop(e){if(this._logger.trace("stop server"),this._stopping){this._logger.warn("\u670D\u52A1\u5668\u6B63\u5FD9\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5\uFF01");return}this._stopping=!0;for(let o of this._pluginHandlers)o.beforeClose&&await o.beforeClose();await oe(this._pluginHandlers),this._pluginHandlers=[],await this._taskService.dispose(),await this._agentService.dispose(),await this._server.close(),this._stopping=!1,this._stopped=!0,this._running=!1,this._logger.trace("server stopped"),e?.length&&(this._logger.warn(`close application on ${e??"stop call"}`),_e.exit(0))}registerRoutes(e,o){let n=`${e}-${o.actionName}`;this._httpRoutes.has(n)&&this._logger.warn("\u8DEF\u7531"+n+"\u5DF2\u88AB\u8986\u76D6"),this._logger.info(`${y.httpUrl}/api/${e}/${o.actionName}\u7684http\u8DEF\u7531\u5DF2\u521B\u5EFA`),this._httpRoutes.set(n,o)}registerWSHandler(e,o){let n=`${e}-${o.actionName}`;this._wsRoutes[n]&&this._logger.warn("ws\u8DEF\u7531"+n+"\u5DF2\u88AB\u8986\u76D6"),this._wsRoutes[n]=o}};export{de as Agent,lt as AgentService,h as AsyncFile,w as BasicBot,mt as BotManager,gt as CogViewSkill,ve as CozeBot,ut as CozeService,$e as CronTaskTrigger,ke as DifyAgentBot,Ge as DingRobotSource,Ue as EchoTaskRunner,ft as EventTaskTrigger,we as FastGPTBot,qe as FeishuSource,pt as GlobalEvent,ge as GlobalEventNames,Fe as GlobalEventTaskTrigger,at as HistoryMessageManager,q as InstanceBaseManager,Te as OllamaBot,B as OpenAIBot,Me as OpenRouterBot,To as PPAgent,Ae as QAnythingBot,Ke as QQSource,F as SchemaBaseProperties,Re as SenseVoiceSTTSkill,Fo as SimpleSchemaType,yt as SkillManager,he as SkillSchemaBaseProperties,ct as SortedPromise,et as SourceApiMissingParamsError,Ze as SourceApiNotFoundError,tt as SourceApiUnAuthorizedError,M as SourceChatMessageType,Ne as SourceEventTaskTrigger,W as SourceEventType,_t as SourceManager,Be as SoviteTTSSkill,Ct as TaskRunnerManager,_o as TaskRunnerSchemaBaseProperties,ht as TaskService,fe as TaskTrigger,xt as TaskTriggerManager,ze as WCAISource,He as WCOASource,je as WeWorkSource,Pe as WenxinAgentBot,Oe as YuanQiBot,Ee as ZhipuQingyanBot,ot as addWavHeader,Mc as apiPlugin,se as arm2wav,J as betterMarkdown,ie as checkMessageRule,_c as cogViewPlugin,y as config,nt as createCacheManager,uo as createFormilySchema,ah as defaultPlugin,co as detectName,oe as disposeObjects,io as extractArticleInfo,xe as extractImageUrls,ao as extractMarkdownImageTags,Tt as extractPositionInfo,Yt as filterContentRule,ne as generateRandomString,it as getEnvNumber,lo as getFromMessageSummary,f as getLogger,j as getSecret,mo as getToMessageSummary,ro as hasEmoji,so as hasMarkdown,ho as installAndGetPluginInfo,rt as isPhoneNumber,oo as removeEmoji,no as removeMarkdown,st as richText2Markdown,At as sleep,Q as sse,po as stream2buffer,Mt as transFileFormat,qo as transFormat,fo as uninstallDep,Y as wav2amr};
39
+ </xml>`,i=_r(this._options.aesKey,r,this._options.appId),a=`${this._options.apiBase}/openapi/sendmsg/${this._options.token}`;try{let p=await fetch(a,{method:"post",headers:{"content-type":"application/json"},body:JSON.stringify({encrypt:i})});this._logger.debug(await p.text())}catch(p){this._logger.error(p)}}else this._logger.info("\u5185\u5BB9\u4E3A\u7A7A\u6216\u8005\u65E0\u6CD5\u53D1\u9001\u7684\u6D88\u606F"),this._logger.info(t)}async getContacts(t,e=!1){return[]}async getContactDetail(t){return t}};var Xe=class extends B{static params={name:"xunfei-bot",desc:"\u8BAF\u98DE\u661F\u706B\u8BA4\u77E5\u6A21\u578B",optionsSchema:{type:"formily",formily:{type:"object",properties:{...B.params.optionsSchema.formily.properties,apiBase:{type:"string",title:"\u670D\u52A1URL","x-index":1,"x-decorator":"FormItem","x-component":"Input","x-component-props":{placeholder:"eg: https://spark-api-open.xf-yun.com/v1 \u4F7F\u7528\u79D1\u5927\u8BAF\u98DE\u5B98\u65B9\u670D\u52A1\u53EF\u7559\u7A7A\u3002"},"x-validator":{format:"url"},"x-decorator-props":{tooltip:"\u57FA\u4E8EOpenAI\u517C\u5BB9\u63A5\u53E3\u6269\u5C55\uFF0C\u8BF7\u4F7F\u7528OpenAI\u517C\u5BB9\u63A5\u53E3\u7684\u5730\u5740\uFF0C\u4F7F\u7528\u79D1\u5927\u8BAF\u98DE\u5B98\u65B9\u5730\u5740\u53EF\u7559\u7A7A\u3002"}},modelName:{type:"string",title:"\u6A21\u578B\u540D\u79F0","x-index":4,"x-decorator":"FormItem","x-component":"AutoComplete",enum:[{label:"lite(Spark Lite)",value:"lite"},{label:"generalv3(Spark Pro)",value:"generalv3"},{label:"pro-128k(Spark Pro-128K)",value:"pro-128k"},{label:"generalv3.5(Spark Max)",value:"generalv3.5"},{label:"max-32k(Spark Max-32K)",value:"max-32k"},{label:"4.0Ultr(Spark4.0 Ultra)",value:"4.0Ultra"}],"x-component-props":{allowClear:!0,placeholder:"\u8BF7\u9009\u62E9\u6216\u8005\u8F93\u5165\u6A21\u578B\u7684\u540D\u79F0"},default:"lite","x-decorator-props":{tooltip:"\u6A21\u578B\u540D\u79F0\uFF0C\u53C2\u8003\u8BAF\u98DE\u63A7\u5236\u53F0-\u661F\u706B\u8C03\u8BD5\u4E2D\u5FC3-\uFF08\u53F3\u4FA7\uFF09\u8F6C\u6362\u6A21\u7248\u4E3A\u4EE3\u7801\u3002"},required:!0},chatOptions:{type:"object",title:"\u5176\u4ED6\u5BF9\u8BDD\u914D\u7F6E","x-index":5,"x-decorator":"FormItem","x-component":"Code","x-decorator-props":{tooltip:"\u9664\u6A21\u578B\u540D\u79F0\u4E4B\u5916\u7684\u5176\u4ED6\u5BF9\u8BDD\u914D\u7F6E\uFF0C\u53C2\u8003\u8BAF\u98DE\u5B98\u7F51"},required:!1},onlyText:{type:"boolean",title:"\u662F\u5426\u4E3A\u7EAF\u6587\u672C\u6A21\u578B","x-decorator":"FormItem","x-component":"Switch","x-component-props":{checkedChildren:"\u662F",unCheckedChildren:"\u5426"},"x-decorator-props":{tooltip:"\u5982\u679C\u4E0D\u652F\u6301\u591A\u6A21\u6001\uFF0C\u8BBE\u7F6E\u4E3Atrue\uFF0C\u5426\u5219\u8BBE\u7F6E\u4E3Afalse\uFF0C\u9ED8\u8BA4\u662Ffalse\u3002"},default:!1,"x-display":!1}}}}};constructor(t){t.apiBase?.length||(t.apiBase="https://spark-api-open.xf-yun.com/v1"),t.onlyText=!0,t.chatOptions.model=t.modelName??t.chatOptions.model??"lite",super(t),this.logger.trace("\u5F53\u524D\u8BAF\u98DE\u661F\u706B\u6A21\u578B\uFF1A"+t.chatOptions.model)}};var Je=class extends B{static params={name:"zhipu-bot",desc:"\u667A\u666EAI\u5927\u6A21\u578B",optionsSchema:{type:"formily",formily:{type:"object",properties:{...B.params.optionsSchema.formily.properties,apiBase:{type:"string",title:"\u670D\u52A1URL","x-index":1,"x-decorator":"FormItem","x-component":"Input","x-component-props":{placeholder:"eg: https://open.bigmodel.cn/api/paas/v4 \u4F7F\u7528\u667A\u666EAI\u5B98\u65B9\u670D\u52A1\u53EF\u7559\u7A7A\u3002"},"x-validator":{format:"url"},"x-decorator-props":{tooltip:"\u4F7F\u7528\u667A\u666EAI\u5B98\u65B9\u5730\u5740\u53EF\u7559\u7A7A\u3002"}},modelName:{type:"string",title:"\u6A21\u578B\u540D\u79F0","x-index":4,"x-decorator":"FormItem","x-component":"AutoComplete",enum:[{value:"glm-4-flash",label:"glm-4-flash(free)"},{value:"glm-4v-flash",label:"glm-4v-flash(free)"},{value:"glm-4-0520",label:"glm-4-0520"},{value:"glm-4",label:"glm-4"},{value:"glm-4-air",label:"glm-4-air"},{value:"glm-4-airx",label:"glm-4-airx"},{value:"glm-4-long",label:"glm-4-long"},{value:"glm-4-flashx",label:"glm-4-flashx"},{value:"glm-4v-plus",label:"glm-4v-plus"},{value:"glm-4v",label:"glm-4v"},{value:"charglm-4",label:"charglm-4"}],"x-component-props":{allowClear:!0,placeholder:"\u8BF7\u9009\u62E9\u6216\u8005\u8F93\u5165\u6A21\u578B\u7684\u540D\u79F0"},default:"glm-4-flash","x-decorator-props":{tooltip:"\u6A21\u578B\u540D\u79F0\uFF0C\u53C2\u8003 https://bigmodel.cn/dev/api/normal-model/glm-4 \u3002"},required:!0},chatOptions:{type:"object",title:"\u5176\u4ED6\u5BF9\u8BDD\u914D\u7F6E","x-index":5,"x-decorator":"FormItem","x-component":"Code","x-decorator-props":{tooltip:"\u9664\u6A21\u578B\u540D\u79F0\u4E4B\u5916\u7684\u5176\u4ED6\u5BF9\u8BDD\u914D\u7F6E\uFF0C\u53C2\u8003\u667A\u666EAI\u5B98\u7F51"},required:!1}}}}};constructor(t){t.apiBase?.length||(t.apiBase="https://open.bigmodel.cn/api/paas/v4"),t.chatOptions.model=t.modelName??t.chatOptions.model??"glm-4-flash",super(t),this.logger.trace("\u5F53\u524D\u667A\u666EAI\u6A21\u578B\uFF1A"+t.chatOptions.model)}};var ah=async c=>({init:async()=>({skills:[{creator:t=>new Be(t),params:Be.params},{creator:t=>new Re(t),params:Re.params}],bots:[{creator:t=>new ke(t),params:ke.params},{creator:t=>new ve(t),params:ve.params},{creator:t=>new B(t),params:B.params},{creator:t=>new we(t),params:we.params},{creator:t=>new Ae(t),params:Ae.params},{creator:t=>new Pe(t),params:Pe.params},{creator:t=>new Oe(t),params:Oe.params},{creator:t=>new Ee(t),params:Ee.params},{creator:t=>new Te(t),params:Te.params},{creator:t=>new Me(t),params:Me.params},{creator:t=>new Xe(t),params:Xe.params},{creator:t=>new Je(t),params:Je.params}],sources:[{creator:t=>new He(t),params:He.params},{creator:t=>new Le(c,t),params:Le.params},{creator:t=>new De(t),params:De.params},{creator:t=>new Ge(c,t),params:Ge.params},{creator:t=>new je(c,t),params:je.params},{creator:t=>new qe(c,t),params:qe.params},{creator:t=>new Ke(c,t),params:Ke.params},{creator:t=>new ze(c,t),params:ze.params}],taskTriggers:[{creator:t=>new Ne(c,t),params:Ne.params},{creator:t=>new Fe(c,t),params:Fe.params},{creator:t=>new $e(c,t),params:$e.params}],taskRunners:[{creator:t=>new Ue(c,t),params:Ue.params}]}),needOnline:!1,name:"\u9ED8\u8BA4\u63D2\u4EF6",dispose:async()=>{}});var yt=class extends q{};var _t=class extends q{};var Ct=class extends q{constructor(e){e.cacheInstance=!1;super(e);this.options=e}},xt=class extends q{constructor(e){e.cacheInstance=!1;super(e);this.options=e}};import Cr from"fastify";import xr from"@fastify/websocket";import br from"@fastify/static";import _e from"node:process";import Sr from"@fastify/formbody";import vr from"emittery";import{XMLParser as kr}from"fast-xml-parser";import ko from"fs";import Ut from"node:path";import{createReadStream as wr,existsSync as Tr}from"node:fs";import{authentication as Mr,createDirectus as Ar,readItems as Pr,readMe as Or,rest as Er}from"@directus/sdk";import Nr from"@fastify/cors";import{v4 as wo}from"uuid";import Fr from"@fastify/compress";var To=class c extends vr{constructor(e={name:"default"}){super();this._options=e;this._logger=f("app-"+this._options.name),this._globalEvent=new pt(this._options.name)}static EventNames={ERROR:"error"};_server;_pluginHandlers=[];_wsRoutes={};_httpRoutes=new Map;_starting=!1;_stopping=!1;_stopped=!1;_running=!1;_agentService;_skillManager;_sourceManager;_botManager;_taskService;_taskTriggerManager;_taskRunnerManager;_xmlParser=new kr;_sharedCover;_sharedLogo;_client;_me;_globalEvent;_logger;_onlinePluginInfos=new Map;get server(){return this._server}get skillManager(){return this._skillManager}get sourceManager(){return this._sourceManager}get botManager(){return this._botManager}get taskTriggerManager(){return this._taskTriggerManager}get taskRunnerManager(){return this._taskRunnerManager}get agentService(){return this._agentService}get offlineMode(){return this._options.offline??!1}get sharedCover(){return this._sharedCover}get sharedLogo(){return this._sharedLogo}get client(){return this._client||this._logger.warn("\u914D\u7F6E\u670D\u52A1client\u5C1A\u672A\u521B\u5EFA\uFF0C\u8BF7\u7B49\u5F85\u670D\u52A1\u521D\u59CB\u5316\u4E4B\u540E\u518D\u8C03\u7528\uFF01"),this._client}get options(){return JSON.parse(JSON.stringify(this._options))}get taskService(){return this._taskService}get globalEvent(){return this._globalEvent}get plugins(){return[...this._pluginHandlers]}get me(){return this._me}get onlinePlugins(){return this._onlinePluginInfos.values()}get running(){return this._running}async _createServer(){this._logger.trace("create fastify server"),this._server=Cr({logger:{level:"warn"}}),await this._server.register(xr),await this._server.register(Sr),await this._server.register(Nr,{origin:"*"}),y.serverCompress&&(this._logger.info("\u542F\u7528\u670D\u52A1\u5668gzip\u538B\u7F29"),await this._server.register(Fr,{global:!0,threshold:y.serverCompressMinSize,customTypes:e=>y.serverCompressMime.includes(e)})),this._server.addContentTypeParser(["text/xml","application/xml"],(e,o,n)=>{let r=[];o.on("data",s=>{r.push(s)}),o.on("end",()=>{try{let s=Buffer.concat(r).toString(),i=this._xmlParser.parse(s);n(null,i)}catch(s){n(s)}})}),this._logger.trace("fastify server created")}async _initServer(){if(this._logger.trace("register fastify server plugins"),await this._server.register(async e=>{e.get("/ws/*",{websocket:!0},(o,n)=>{y.traceHttpRequest&&this._logger.trace("ws request,ip"+n.ip+",host:"+n.hostname+",path:"+n.url);let s=(n.query.token??n.headers.authorization?.replace("Bearer","").trim())===y.publicToken;if(y.publicForceAuth&&!s){this._logger.debug("\u672A\u6388\u6743\u7684\u8BBF\u95EE"),this._logger.debug(n.url),o.close(403,"\u672A\u6388\u6743\u7684\u8BBF\u95EE");return}let i=n.params["*"],a,p,l,m=new TextDecoder("utf-8");if(i==="normal")a=async u=>{u instanceof Buffer&&(u=m.decode(u));try{let d=JSON.parse(u),g=`${d?.instanceName}-${d?.action}`,_=this._wsRoutes[g];if(_.needAuth&&!s)return this._logger.debug("\u672A\u6388\u6743\u7684\u8BBF\u95EE\uFF01"),"\u60A8\u672A\u88AB\u5141\u8BB8\u8BBF\u95EE\u8BE5\u65B9\u6CD5\uFF01";let I=_.action;if(!I){this._logger.warn("unhandled message:"+u);return}let E=await I(d.data);if(E!=null){let $={id:d.id,data:E};return JSON.stringify($)}}catch(d){return String(d)}};else{let u=i.replaceAll("/","-"),d=()=>{let g=this._wsRoutes[u];if(!g){o.send(String({error:"normal ws path:/ws/normal,custom ws path:/ws/instanceName/action\uFF01"}));return}if(g.needAuth&&!s){this._logger.debug("\u672A\u6388\u6743\u7684\u8BBF\u95EE\uFF01"),o.close(403,"\u672A\u6388\u6743\u7684\u8BBF\u95EE\uFF01");return}return g};a=async(g,_,I)=>{let E=d();if(!E)return;E.action.onMessage(g,_,I)},p=async(g,_)=>{let I=d();if(!I)return;I.action.onOpen(g,_)},l=async(g,_)=>{let I=d();if(!I)return;I.action.onClose(g,_)}}o.on("message",async u=>{y.traceHttpRequest&&this._logger.trace("ws on meesage, type "+typeof u);try{let d=await a(u,n,o);d!=null&&o.send(d)}catch(d){this._logger.error(d)}}),p&&p(n,o),l&&o.on("close",()=>{l(n,o),this._logger.trace("ws closed,from "+n.hostname)}),o.on("error",u=>{this._logger.error(u)})})}),this._server.all("/api/*",async(e,o)=>{y.traceHttpRequest&&this._logger.trace("api request,ip"+e.ip+",host:"+e.hostname+",path:"+e.url);let n=e.params["*"].replaceAll("/","-");if(!this._httpRoutes.has(n)){o.send("success");return}let r=this._httpRoutes.get(n);if((r.needAuth||y.publicForceAuth)&&(e.query.token??e.headers.authorization?.replace("Bearer","").trim())!==y.publicToken){this._logger.warn("\u672A\u6388\u6743\u7684\u8BBF\u95EE"),this._logger.warn(e.url),o.status(401),o.send("\u672A\u88AB\u6388\u6743\u7684\u8BBF\u95EE\uFF01");return}let s=r.action;try{return s.type==="normal"?o.send(await s.handler(e)):(s.handler(e,o),o)}catch(i){i instanceof tt?(o.status(401),o.send(i.message)):i instanceof et?(o.status(400),o.send(i.message)):i instanceof Ze?(o.status(404),o.send(i.message)):(o.status(500),o.send(String(i)))}}),await this._server.register(br,{root:y.publicPath,prefix:y.publicPathName}),_e.env.VERIFY_FILE?.length){let e=Ut.resolve("."+_e.env.VERIFY_FILE);Tr(e)?this._server.get(_e.env.VERIFY_FILE,(o,n)=>{this._logger.trace("verify service requested from "+o.url),n.send(wr(e))}):this._logger.warn("\u8DEF\u5F84"+e+"\u4E0D\u5B58\u5728\uFF0C\u65E0\u6CD5\u521B\u5EFA\u7528\u4E8E\u9A8C\u8BC1\u7AD9\u70B9\u5F52\u5C5E\u7684\u8DEF\u7531\uFF01")}await this._server.ready(),await this._server.listen({host:y.host,port:y.port}),this._logger.info("http server started on port "+y.port)}_checkRegister(){return this._stopped?(this._logger.error("\u5F53\u524D\u670D\u52A1\u5DF2\u505C\u6B62\uFF0C\u65E0\u6CD5\u6CE8\u518C\u65B0\u7684\u8DEF\u7531\u6216\u8005\u63D2\u4EF6\uFF01"),!1):this._running?(this._logger.error("\u5F53\u524D\u670D\u52A1\u5DF2\u7ECF\u542F\u52A8\uFF0C\u65E0\u6CD5\u6CE8\u518C\u65B0\u7684\u8DEF\u7531\u6216\u8005\u63D2\u4EF6\uFF0C\u8BF7\u5728\u8C03\u7528start\u65B9\u6CD5\u4E4B\u524D\u6CE8\u518C\uFF01"),!1):!0}async _initResources(){let e=this._options.sharedCoverPath??Ut.resolve(y.publicPath,"images","cover-default.png");(e.startsWith("http")||ko.existsSync(e))&&(this._sharedCover=h.fromPath(e,"binary","shared-cover.png"));let o=this._options.sharedLogoPath??Ut.resolve(y.publicPath,"images","logo-default.png");(o.startsWith("http")||ko.existsSync(o))&&(this._sharedLogo=h.fromPath(o,"binary","shared-logo.png"))}async _loadOnlinePlugins(){this._logger.info("loading online plugins...");let e=await this._client.request(Pr("plugins",{filter:{status:{_neq:"archived"}},user_created:{_eq:this._me?.id}}));this._logger.info(e);let o=0;for(let n of e)try{let r=await import(n.name);r=r.default??r.plugin??r,await this.use(r,n),o++}catch(r){this._logger.warn(`\u8F7D\u5165\u63D2\u4EF6${n.name}\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5\u662F\u5426\u5DF2\u7ECF\u5B89\u88C5\u76F8\u5173npm\u4F9D\u8D56\uFF01`),this._logger.warn(r)}this._logger.info(`${o} online plugin(s) loaded`)}async use(e,o){if(typeof e!="function"){this._logger.warn("\u63D2\u4EF6\u9700\u8981\u5B9E\u73B0\u6307\u5B9A\u63A5\u53E3\uFF0C\u68C0\u6D4B\u5230\u65E0\u6548\u7684\u63D2\u4EF6\uFF1A"),this._logger.warn(e);return}let n=await e(this,o?.options);if(typeof n?.init!="function"){this._logger.warn("\u63D2\u4EF6\u6CA1\u6709\u5B9E\u73B0init\u63A5\u53E3"),this._logger.warn(n);return}if(n.needOnline&&this.offlineMode){this._logger.error("\u63D2\u4EF6"+n.name+"\u9700\u8981\u4F7F\u7528\u5728\u7EBF\u914D\u7F6E\uFF0C\u65E0\u6CD5\u79BB\u7EBF\u6A21\u5F0F\u542F\u52A8\uFF0C\u8BE5\u63D2\u4EF6\u5C06\u88AB\u5FFD\u7565\uFF01");return}return o?.name&&n.name!==o.name&&(this._logger.warn("\u5728\u7EBF\u63D2\u4EF6"+n.name+"\u7684\u4EE3\u7801\u4E0E\u63D2\u4EF6\u5305\u4E2D\u7684\u540D\u79F0\u4E0D\u5339\u914D\uFF0C\u5DF2\u81EA\u52A8\u8986\u76D6\u4E3Anpm\u5305\u4E2D\u7684\u540D\u79F0\uFF01"),n.name=o.name),o?.id&&(o.schecma=n.schema,o.options=o.options??{},this._onlinePluginInfos.set(o.name,o)),this._pluginHandlers.push(n),this._logger.trace("plugin "+n.name+" registered"),n}async start(){if(this._stopped){this._logger.error("\u5F53\u524D\u670D\u52A1\u5DF2\u505C\u6B62\uFF0C\u5982\u9700\u542F\u52A8\uFF0C\u8BF7\u91CD\u65B0\u521B\u5EFA\u65B0\u7684\u5B9E\u4F8B\uFF01");return}if(this._starting||this._running){this._logger.warn("\u670D\u52A1\u5668\u6B63\u5FD9\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5\uFF01");return}if(this._starting=!0,!this._options.offline){this._logger.debug("\u5F53\u524D\u670D\u52A1\u5C06\u542F\u7528\u5728\u7EBF\u914D\u7F6E\uFF0C\u8BF7\u786E\u4FDD\u60A8\u6CE8\u518C\u4E86\u914D\u7F6E\u670D\u52A1\u5668\u7684\u8D26\u53F7\uFF01\u5426\u5219\u8BF7\u5173\u95ED\u5728\u7EBF\u914D\u7F6E\u670D\u52A1\uFF08\u8BBE\u7F6EOFFLINE=true\uFF09"),this._client=Ar(y.configServerUrl).with(Mr("json")).with(Er()),await this.client.login(y.configServerEmail,y.configServerPassword);let n=await this._client.request(Or());this._logger.debug("\u914D\u7F6E\u670D\u52A1\u5668\u8FDE\u63A5\u6210\u529F"),this._logger.debug(`\u5F53\u524D\u767B\u5F55\u8D26\u53F7\uFF1A${n.email}`),this._me=n,await this._loadOnlinePlugins()}this._botManager=new mt,this._skillManager=new yt,this._sourceManager=new _t,this._taskTriggerManager=new xt({cacheInstance:!1}),this._taskRunnerManager=new Ct({cacheInstance:!1}),await this._initResources(),this._logger.trace("default resources loaded");for(let n of this._pluginHandlers)if(n.init){let r=await n.init();r&&(r.bots?.forEach(s=>this._botManager.registerInstanceCreator(s.creator,s.params)),r.sources?.forEach(s=>this._sourceManager.registerInstanceCreator(s.creator,s.params)),r.skills?.forEach(s=>this._skillManager.registerInstanceCreator(s.creator,s.params)),r.taskTriggers?.forEach(s=>this._taskTriggerManager.registerInstanceCreator(s.creator,s.params)),r.taskRunners?.forEach(s=>this._taskRunnerManager.registerInstanceCreator(s.creator,s.params))),this._logger.trace("plugin "+n.name+" init")}await this._createServer(),this._logger.trace("http server created"),await(this._agentService=new lt(this,this._options.agentServiceOptions)).init(),this._logger.trace("agent service created"),await(this._taskService=new ht(this,this._options.taskServiceOptions)).init(),this._logger.trace("task service created");for(let n of this._pluginHandlers)n.beforeStart&&(await n.beforeStart(),this._logger.trace(`plugin ${n.name} beforeStart`));await this._initServer(),this._running=!0;for(let n of this._pluginHandlers)n.afterStart&&(await n.afterStart(),this._logger.trace(`plugin ${n.name} afterStart`));this._starting=!1,_e.on("unhandledRejection",n=>{this._logger.error(n),this.emit(c.EventNames.ERROR,n)});for(let n of["SIGINT","SIGTERM"])this._logger.info("break signal received"),_e.once(n,async()=>await this.stop(n));this._globalEvent.emit("APP_STARED",{title:"\u670D\u52A1\u542F\u52A8",id:wo()})}async reload(){this._logger.info("agent and task service is reloading,service may unavailable for a while..."),await this._agentService.reload(),await this._taskService.reload(),this._logger.info("agent and task service reload completed"),this._logger.info("if you want to reload plugins,please restart server"),this._globalEvent.emit("APP_REALOD",{title:"\u670D\u52A1\u91CD\u8F7D",id:wo()})}async stop(e){if(this._logger.trace("stop server"),this._stopping){this._logger.warn("\u670D\u52A1\u5668\u6B63\u5FD9\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5\uFF01");return}this._stopping=!0;for(let o of this._pluginHandlers)o.beforeClose&&await o.beforeClose();await oe(this._pluginHandlers),this._pluginHandlers=[],await this._taskService.dispose(),await this._agentService.dispose(),await this._server.close(),this._stopping=!1,this._stopped=!0,this._running=!1,this._logger.trace("server stopped"),e?.length&&(this._logger.warn(`close application on ${e??"stop call"}`),_e.exit(0))}registerRoutes(e,o){let n=`${e}-${o.actionName}`;this._httpRoutes.has(n)&&this._logger.warn("\u8DEF\u7531"+n+"\u5DF2\u88AB\u8986\u76D6"),this._logger.info(`${y.httpUrl}/api/${e}/${o.actionName}\u7684http\u8DEF\u7531\u5DF2\u521B\u5EFA`),this._httpRoutes.set(n,o)}registerWSHandler(e,o){let n=`${e}-${o.actionName}`;this._wsRoutes[n]&&this._logger.warn("ws\u8DEF\u7531"+n+"\u5DF2\u88AB\u8986\u76D6"),this._wsRoutes[n]=o}};export{de as Agent,lt as AgentService,h as AsyncFile,w as BasicBot,mt as BotManager,gt as CogViewSkill,ve as CozeBot,ut as CozeService,$e as CronTaskTrigger,ke as DifyAgentBot,Ge as DingRobotSource,Ue as EchoTaskRunner,ft as EventTaskTrigger,we as FastGPTBot,qe as FeishuSource,pt as GlobalEvent,ge as GlobalEventNames,Fe as GlobalEventTaskTrigger,at as HistoryMessageManager,q as InstanceBaseManager,Te as OllamaBot,B as OpenAIBot,Me as OpenRouterBot,To as PPAgent,Ae as QAnythingBot,Ke as QQSource,F as SchemaBaseProperties,Re as SenseVoiceSTTSkill,Fo as SimpleSchemaType,yt as SkillManager,he as SkillSchemaBaseProperties,ct as SortedPromise,et as SourceApiMissingParamsError,Ze as SourceApiNotFoundError,tt as SourceApiUnAuthorizedError,M as SourceChatMessageType,Ne as SourceEventTaskTrigger,W as SourceEventType,_t as SourceManager,Be as SoviteTTSSkill,Ct as TaskRunnerManager,_o as TaskRunnerSchemaBaseProperties,ht as TaskService,fe as TaskTrigger,xt as TaskTriggerManager,ze as WCAISource,He as WCOASource,je as WeWorkSource,Pe as WenxinAgentBot,Oe as YuanQiBot,Ee as ZhipuQingyanBot,ot as addWavHeader,Mc as apiPlugin,se as arm2wav,J as betterMarkdown,ie as checkMessageRule,_c as cogViewPlugin,y as config,nt as createCacheManager,uo as createFormilySchema,ah as defaultPlugin,co as detectName,oe as disposeObjects,io as extractArticleInfo,xe as extractImageUrls,ao as extractMarkdownImageTags,Tt as extractPositionInfo,Yt as filterContentRule,ne as generateRandomString,it as getEnvNumber,lo as getFromMessageSummary,f as getLogger,j as getSecret,mo as getToMessageSummary,ro as hasEmoji,so as hasMarkdown,ho as installAndGetPluginInfo,rt as isPhoneNumber,oo as removeEmoji,no as removeMarkdown,st as richText2Markdown,At as sleep,Q as sse,po as stream2buffer,Mt as transFileFormat,qo as transFormat,fo as uninstallDep,Y as wav2amr};
package/package.json CHANGED
@@ -1,116 +1,115 @@
1
- {
2
- "name": "ppagent",
3
- "version": "0.0.5",
4
- "description": "an agent manager",
5
- "types": "dist/lib.d.ts",
6
- "main": "dist/lib.js",
7
- "type": "module",
8
- "displayName": "PP智能体对接工具",
9
- "repository": {
10
- "type": "git",
11
- "url": "git+https://github.com/ppagent/ppagent"
12
- },
13
- "publishConfig": {
14
- "access": "public",
15
- "registry": "https://registry.npmjs.org/"
16
- },
17
- "files": [
18
- "/dist"
19
- ],
20
- "engines": {
21
- "node": ">=20"
22
- },
23
- "keywords": [
24
- "chat",
25
- "wechat",
26
- "chatbot"
27
- ],
28
- "author": "ppagent",
29
- "license": "Apache-2.0",
30
- "bugs": {
31
- "url": "https://github.com/ppagent/ppagent/issues"
32
- },
33
- "homepage": "https://github.com/ppagent/ppagent",
34
- "dependencies": {
35
- "@alicloud/dingtalk": "^2.1.52",
36
- "@alicloud/openapi-client": "^0.4.12",
37
- "@coze/api": "^1.0.0",
38
- "@directus/sdk": "^18.0.0",
39
- "@fastify/compress": "^7.0.3",
40
- "@fastify/cors": "^8.5.0",
41
- "@fastify/formbody": "^7.4.0",
42
- "@fastify/static": "^7.0.4",
43
- "@fastify/websocket": "^10.0.1",
44
- "@formily/core": "^2.3.2",
45
- "@formily/react": "^2.3.2",
46
- "@keyv/redis": "^3.0.1",
47
- "@larksuiteoapi/node-sdk": "^1.40.1",
48
- "@ppagent/plugin-sample": "0.0.5",
49
- "@types/qrcode-terminal": "^0.12.2",
50
- "@wecom/crypto": "^1.0.1",
51
- "axios": "^1.7.7",
52
- "cross-env": "^7.0.3",
53
- "dingtalk-stream": "^2.1.4",
54
- "dotenv": "^16.4.5",
55
- "emittery": "^1.0.3",
56
- "fast-xml-parser": "^4.5.0",
57
- "fastify": "^4.28.1",
58
- "ffmpeg-static": "^5.2.0",
59
- "file-type": "^19.6.0",
60
- "fluent-ffmpeg": "^2.1.3",
61
- "form-data": "^4.0.0",
62
- "jsonwebtoken": "^9.0.2",
63
- "keyv": "^5.1.0",
64
- "localtunnel": "^2.0.2",
65
- "md5": "^2.3.0",
66
- "node-schedule": "^2.1.1",
67
- "node-video-lib": "^2.3.1",
68
- "openai": "^4.69.0",
69
- "pino": "^9.5.0",
70
- "qrcode-terminal": "^0.12.0",
71
- "recorder-core": "^1.3.24040900",
72
- "remove-markdown": "^0.5.5",
73
- "silk-wasm": "^3.6.1",
74
- "tweetnacl": "^1.0.3",
75
- "uuid": "^10.0.0",
76
- "wav-file-decoder": "^1.0.3",
77
- "ws": "^8.18.0"
78
- },
79
- "devDependencies": {
80
- "@eslint/js": "^9.9.1",
81
- "@types/eslint__js": "^8.42.3",
82
- "@types/fluent-ffmpeg": "^2.1.26",
83
- "@types/jsonwebtoken": "^9.0.7",
84
- "@types/localtunnel": "^2.0.4",
85
- "@types/md5": "^2.3.5",
86
- "@types/node": "^22.5.1",
87
- "@types/node-schedule": "^2.1.7",
88
- "@types/uuid": "^10.0.0",
89
- "@types/ws": "^8.5.12",
90
- "@typescript-eslint/eslint-plugin": "^8.3.0",
91
- "@typescript-eslint/parser": "^8.3.0",
92
- "esbuild": "^0.23.1",
93
- "eslint": "^9.9.1",
94
- "eslint-config-prettier": "^9.1.0",
95
- "eslint-plugin-prettier": "^5.2.1",
96
- "pino-pretty": "^11.3.0",
97
- "prettier": "^3.3.3",
98
- "tsup": "^8.3.5",
99
- "tsx": "^4.19.0",
100
- "typescript": "^5.5.4",
101
- "typescript-eslint": "^8.3.0",
102
- "vitest": "^2.0.5"
103
- },
104
- "scripts": {
105
- "lint": "eslint .",
106
- "build": "esbuild \"src/**/*.ts\" --platform=node --outdir=build --resolve-extensions=.js --out-extension:.js=.js --format=esm",
107
- "build:docker": "docker build . -t pp-agent --build-arg APP_ENV=production --progress=plain",
108
- "start": "node build",
109
- "tsx": "cross-env NODE_ENV=development tsx src/index.ts",
110
- "dev": "cross-env NODE_ENV=development tsx watch src/index.ts",
111
- "deno": "deno --unstable-sloppy-imports --allow-env --allow-sys --allow-read --allow-write --allow-net --inspect src/index.ts | pino-pretty --colorize",
112
- "lib": "node build.lib.js",
113
- "test": "vitest",
114
- "test:watch": "vitest -w"
115
- }
116
- }
1
+ {
2
+ "name": "ppagent",
3
+ "version": "0.0.6",
4
+ "description": "an agent manager",
5
+ "types": "dist/lib.d.ts",
6
+ "main": "dist/lib.js",
7
+ "type": "module",
8
+ "displayName": "PP智能体对接工具",
9
+ "scripts": {
10
+ "lint": "eslint .",
11
+ "build": "esbuild \"src/**/*.ts\" --platform=node --outdir=build --resolve-extensions=.js --out-extension:.js=.js --format=esm",
12
+ "build:docker": "docker build . -t pp-agent --build-arg APP_ENV=production --progress=plain",
13
+ "start": "node build",
14
+ "tsx": "cross-env NODE_ENV=development tsx src/index.ts",
15
+ "dev": "cross-env NODE_ENV=development tsx watch src/index.ts",
16
+ "deno": "deno --unstable-sloppy-imports --allow-env --allow-sys --allow-read --allow-write --allow-net --inspect src/index.ts | pino-pretty --colorize",
17
+ "lib": "node build.lib.js",
18
+ "test": "vitest",
19
+ "test:watch": "vitest -w"
20
+ },
21
+ "repository": {
22
+ "type": "git",
23
+ "url": "git+https://github.com/ppagent/ppagent"
24
+ },
25
+ "publishConfig": {
26
+ "access": "public",
27
+ "registry": "https://registry.npmjs.org/"
28
+ },
29
+ "files": [
30
+ "/dist"
31
+ ],
32
+ "engines": {
33
+ "node": ">=20"
34
+ },
35
+ "keywords": [
36
+ "chat",
37
+ "wechat",
38
+ "chatbot"
39
+ ],
40
+ "author": "ppagent",
41
+ "license": "Apache-2.0",
42
+ "bugs": {
43
+ "url": "https://github.com/ppagent/ppagent/issues"
44
+ },
45
+ "homepage": "https://github.com/ppagent/ppagent",
46
+ "dependencies": {
47
+ "@alicloud/dingtalk": "^2.1.52",
48
+ "@alicloud/openapi-client": "^0.4.12",
49
+ "@coze/api": "^1.0.0",
50
+ "@directus/sdk": "^18.0.0",
51
+ "@fastify/compress": "^7.0.3",
52
+ "@fastify/cors": "^8.5.0",
53
+ "@fastify/formbody": "^7.4.0",
54
+ "@fastify/static": "^7.0.4",
55
+ "@fastify/websocket": "^10.0.1",
56
+ "@formily/core": "^2.3.2",
57
+ "@formily/react": "^2.3.2",
58
+ "@keyv/redis": "^3.0.1",
59
+ "@larksuiteoapi/node-sdk": "^1.40.1",
60
+ "@types/qrcode-terminal": "^0.12.2",
61
+ "@wecom/crypto": "^1.0.1",
62
+ "axios": "^1.7.7",
63
+ "cross-env": "^7.0.3",
64
+ "dingtalk-stream": "^2.1.4",
65
+ "dotenv": "^16.4.5",
66
+ "emittery": "^1.0.3",
67
+ "fast-xml-parser": "^4.5.0",
68
+ "fastify": "^4.28.1",
69
+ "ffmpeg-static": "^5.2.0",
70
+ "file-type": "^19.6.0",
71
+ "fluent-ffmpeg": "^2.1.3",
72
+ "form-data": "^4.0.0",
73
+ "jsonwebtoken": "^9.0.2",
74
+ "keyv": "^5.1.0",
75
+ "localtunnel": "^2.0.2",
76
+ "md5": "^2.3.0",
77
+ "node-schedule": "^2.1.1",
78
+ "node-video-lib": "^2.3.1",
79
+ "openai": "^4.69.0",
80
+ "pino": "^9.5.0",
81
+ "qrcode-terminal": "^0.12.0",
82
+ "recorder-core": "^1.3.24040900",
83
+ "remove-markdown": "^0.5.5",
84
+ "silk-wasm": "^3.6.1",
85
+ "tweetnacl": "^1.0.3",
86
+ "uuid": "^10.0.0",
87
+ "wav-file-decoder": "^1.0.3",
88
+ "ws": "^8.18.0"
89
+ },
90
+ "devDependencies": {
91
+ "@eslint/js": "^9.9.1",
92
+ "@types/eslint__js": "^8.42.3",
93
+ "@types/fluent-ffmpeg": "^2.1.26",
94
+ "@types/jsonwebtoken": "^9.0.7",
95
+ "@types/localtunnel": "^2.0.4",
96
+ "@types/md5": "^2.3.5",
97
+ "@types/node": "^22.5.1",
98
+ "@types/node-schedule": "^2.1.7",
99
+ "@types/uuid": "^10.0.0",
100
+ "@types/ws": "^8.5.12",
101
+ "@typescript-eslint/eslint-plugin": "^8.3.0",
102
+ "@typescript-eslint/parser": "^8.3.0",
103
+ "esbuild": "^0.23.1",
104
+ "eslint": "^9.9.1",
105
+ "eslint-config-prettier": "^9.1.0",
106
+ "eslint-plugin-prettier": "^5.2.1",
107
+ "pino-pretty": "^11.3.0",
108
+ "prettier": "^3.3.3",
109
+ "tsup": "^8.3.5",
110
+ "tsx": "^4.19.0",
111
+ "typescript": "^5.5.4",
112
+ "typescript-eslint": "^8.3.0",
113
+ "vitest": "^2.0.5"
114
+ }
115
+ }