@atri-bot/core 2.0.0-beta.3 → 2.0.0-beta.5

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 (2) hide show
  1. package/dist/index.mjs +2 -2
  2. package/package.json +1 -1
package/dist/index.mjs CHANGED
@@ -1,7 +1,7 @@
1
- import e from"node:path";import{LogLevel as t,Logger as n,defaultTransformer as r,saveFileTransformer as i}from"@huan_kong/logger";import a from"fs-extra";import o from"node:process";import{NCWebsocket as s,Structs as c}from"node-napcat-ts";function l(e,t,n=`up`){return e.sort((e,r)=>e[t]>r[t]?n===`up`?1:-1:e[t]<r[t]?n===`up`?-1:1:0)}var u=class{atri;config;logger;ws;events={command:[],message:[],notice:[],request:[]};unloaders={};constructor(e,t){this.atri=e,this.config=t,this.logger=this.atri.logger.clone({title:`Bot`,...t.logLevel?{level:t.logLevel}:{}}),this.ws=new s(t)}async init(){this.ws.on(`socket.connecting`,e=>this.logger.INFO(`连接中 [#${e.reconnection.nowAttempts}/${e.reconnection.attempts}]`)),this.ws.on(`socket.open`,e=>this.logger.INFO(`连接成功 [#${e.reconnection.nowAttempts}/${e.reconnection.attempts}]`)),this.ws.on(`socket.error`,e=>{e.error_type===`connect_error`?(this.logger.ERROR(`连接失败 [#${e.reconnection.nowAttempts}/${e.reconnection.attempts}]`),this.logger.ERROR(`错误信息:`,e)):e.error_type===`response_error`&&(this.logger.ERROR(`NapCat 服务端返回错误 [#${e.reconnection.nowAttempts}/${e.reconnection.attempts}]`),this.logger.ERROR(`错误信息:`,e.info),o.exit(1)),e.reconnection.nowAttempts>=e.reconnection.attempts&&(this.logger.ERROR(`重试次数超过设置的${e.reconnection.attempts}次!`),o.exit(1))}),this.ws.on(`api.preSend`,e=>this.logger.DEBUG(`发送API请求`,e)),this.ws.on(`api.response.success`,e=>this.logger.DEBUG(`收到API成功响应`,e)),this.ws.on(`api.response.failure`,e=>this.logger.DEBUG(`收到API失败响应`,e)),this.ws.on(`message`,async e=>{if(e.message.length===0){this.logger.DEBUG(`收到空消息, 已跳过处理流程:`,e);return}let n=`message.${e.message_type}.${e.sub_type}`,r=this.config.adminId.includes(e.user_id),i=e.message[0].type===`reply`;if(this.logger.DEBUG(`收到消息:`,e),this.config.logLevel===t.DEBUG&&!r){this.logger.DEBUG(`当前处于调试模式, 非管理员消息, 已跳过处理流程:`,e);return}for(let t of this.events.message)if(!(!n.includes(t.endPoint??`message`)||t.needReply&&!i||t.needAdmin&&!r||t.trigger&&!(typeof t.trigger==`string`?e.raw_message.includes(t.trigger):t.trigger.test(e.raw_message))))try{if(await t.callback(e)===`quit`){this.logger.DEBUG(`插件 ${t.pluginName} 请求提前终止 ${n} 事件`);break}}catch(r){this.logger.ERROR(`插件 ${t.pluginName} ${n} 事件处理失败:`,r),await this.sendMsg(e,[c.text(`插件 ${t.pluginName} ${n} 事件处理失败, 请联系管理员处理: ${r instanceof Error?r.stack??r.message:String(r)}`)])}let a=this.config.prefix.find(t=>e.raw_message.startsWith(t));if(!a)return;let o=e.raw_message.slice(a.length).trim();for(let t of this.events.command){if(!n.includes(t.endPoint??`message`)||t.needReply&&!i||t.needAdmin&&!r)continue;let a=this.extractCommandBody(o,t.trigger);if(a!==null)try{let r=this.splitArgs(a),i=t.commander?t.commander().fail(!1).parseSync(r):{_:[],$0:``};if(await t.callback({context:e,options:i})===`quit`){this.logger.DEBUG(`插件 ${t.pluginName} 请求提前终止 ${n} 事件`);break}}catch(r){if(r instanceof Error&&r.stack?.toString().includes(`yargs`)){await this.sendMsg(e,[c.text(`命令使用错误: ${r.message}\n\n`),c.text(await t.commander?.()?.getHelp()??`无帮助信息`)]);continue}this.logger.ERROR(`插件 ${t.pluginName} ${n} 事件处理失败:`,r),await this.sendMsg(e,[c.text(`插件 ${t.pluginName} ${n} 事件处理失败, 请联系管理员处理: ${r instanceof Error?r.stack??r.message:String(r)}`)])}}}),this.ws.on(`request`,async e=>{this.logger.DEBUG(`收到请求:`,e);let t=`request.${e.request_type}.${`sub_type`in e?e.sub_type:``}`;for(let n of this.events.request)if(t.includes(n.endPoint??`request`))try{if(await n.callback(e)===`quit`){this.logger.DEBUG(`插件 ${n.pluginName} 请求提前终止 ${t} 事件`);break}}catch(e){this.logger.ERROR(`插件 ${n.pluginName} ${t} 事件处理失败:`,e),await this.sendMsg({message_type:`private`,user_id:this.config.adminId[0]},[c.text(`插件 ${n.pluginName} ${t} 事件处理失败: ${e instanceof Error?e.stack??e.message:String(e)}`)])}}),this.ws.on(`notice`,async e=>{this.logger.DEBUG(`收到通知:`,e);let t=`notice.${e.notice_type}.${`sub_type`in e?e.sub_type:``}`;e.notice_type===`notify`&&(e.sub_type===`input_status`?t+=`.${e.group_id===0?`friend`:`group`}`:e.sub_type===`poke`&&(t+=`.${`group_id`in e?`group`:`friend`}`));for(let n of this.events.notice)if(t.includes(n.endPoint??`notice`))try{if(await n.callback(e)===`quit`){this.logger.DEBUG(`插件 ${n.pluginName} 请求提前终止 ${t} 事件`);break}}catch(e){this.logger.ERROR(`插件 ${n.pluginName} ${t} 事件处理失败:`,e),await this.sendMsg({message_type:`private`,user_id:this.config.adminId[0]},[c.text(`插件 ${n.pluginName} ${t} 事件处理失败: ${e instanceof Error?e.stack??e.message:String(e)}`)])}}),await this.ws.connect(),this.logger.INFO(`Bot 初始化完成`)}splitArgsRegex=/"([^"]*)"|'([^']*)'|(\S+)/g;splitArgs(e){let t=e.matchAll(this.splitArgsRegex),n=[];for(let e of t)n.push(e[1]||e[2]||e[3]);return n}extractCommandBody(e,t){return typeof t==`string`?e.startsWith(t)?e.slice(t.length).trim():null:t.test(e)?e.replace(t,``).trim():null}regCommandEvent(e){let t={...e,type:`command`};t.commander&&=(e=>()=>e().exitProcess(!1).usage(`用法: ${t.trigger} [选项]`).locale(this.config.yargsLocale??`zh_CN`).help(!1).version(!1))(t.commander),this.events.command=l([...this.events.command,t],`priority`,`down`);let n=()=>{let e=this.events.command.indexOf(t);e!==-1&&this.events.command.splice(e,1)};return this.unloaders[t.pluginName]=this.unloaders[t.pluginName]??[],this.unloaders[t.pluginName].push(n),n}regMessageEvent(e){let t={...e,type:`message`};this.events.message=l([...this.events.message,t],`priority`,`down`);let n=()=>{let e=this.events.message.indexOf(t);e!==-1&&this.events.message.splice(e,1)};return this.unloaders[t.pluginName]=this.unloaders[t.pluginName]??[],this.unloaders[t.pluginName].push(n),n}regNoticeEvent(e){let t={...e,type:`notice`};this.events.notice=l([...this.events.notice,t],`priority`,`down`);let n=()=>{let e=this.events.notice.indexOf(t);e!==-1&&this.events.notice.splice(e,1)};return this.unloaders[t.pluginName]=this.unloaders[t.pluginName]??[],this.unloaders[t.pluginName].push(n),n}regRequestEvent(e){let t={...e,type:`request`};this.events.request=l([...this.events.request,t],`priority`,`down`);let n=()=>{let e=this.events.request.indexOf(t);e!==-1&&this.events.request.splice(e,1)};return this.unloaders[t.pluginName]=this.unloaders[t.pluginName]??[],this.unloaders[t.pluginName].push(n),n}async sendMsg(e,t,{reply:n=!0,at:r=!0}={}){try{if(e.message_type===`private`)return await this.ws.send_private_msg({user_id:e.user_id,message:t});{let i=[];return n&&e.message_id&&i.push(c.reply(e.message_id)),r&&e.user_id&&i.push(c.at(e.user_id),c.text(`
1
+ import e from"node:path";import{LogLevel as t,Logger as n,defaultTransformer as r,saveFileTransformer as i}from"@huan_kong/logger";import a from"fs-extra";import o from"node:process";import{NCWebsocket as s,Structs as c}from"node-napcat-ts";function l(e,t,n=`up`){return e.sort((e,r)=>e[t]>r[t]?n===`up`?1:-1:e[t]<r[t]?n===`up`?-1:1:0)}var u=class{atri;config;logger;ws;events={command:[],message:[],notice:[],request:[]};unloaders={};constructor(e,t){this.atri=e,this.config=t,this.logger=this.atri.logger.clone({title:`Bot`,...t.logLevel?{level:t.logLevel}:{}}),this.ws=new s(t)}async init(){this.ws.on(`socket.connecting`,e=>this.logger.INFO(`连接中 [#${e.reconnection.nowAttempts}/${e.reconnection.attempts}]`)),this.ws.on(`socket.open`,e=>this.logger.INFO(`连接成功 [#${e.reconnection.nowAttempts}/${e.reconnection.attempts}]`)),this.ws.on(`socket.error`,e=>{e.error_type===`connect_error`?(this.logger.ERROR(`连接失败 [#${e.reconnection.nowAttempts}/${e.reconnection.attempts}]`),this.logger.ERROR(`错误信息:`,e)):e.error_type===`response_error`&&(this.logger.ERROR(`NapCat 服务端返回错误 [#${e.reconnection.nowAttempts}/${e.reconnection.attempts}]`),this.logger.ERROR(`错误信息:`,e.info),o.exit(1)),e.reconnection.nowAttempts>=e.reconnection.attempts&&(this.logger.ERROR(`重试次数超过设置的${e.reconnection.attempts}次!`),o.exit(1))}),this.ws.on(`api.preSend`,e=>this.logger.DEBUG(`发送API请求`,e)),this.ws.on(`api.response.success`,e=>this.logger.DEBUG(`收到API成功响应`,e)),this.ws.on(`api.response.failure`,e=>this.logger.DEBUG(`收到API失败响应`,e)),this.ws.on(`message`,async e=>{if(e.message.length===0){this.logger.DEBUG(`收到空消息, 已跳过处理流程:`,e);return}let n=`message.${e.message_type}.${e.sub_type}`,r=this.config.adminId.includes(e.user_id),i=e.message[0].type===`reply`;if(this.logger.DEBUG(`收到消息:`,e),this.config.logLevel===t.DEBUG&&!r){this.logger.DEBUG(`当前处于调试模式, 非管理员消息, 已跳过处理流程:`,e);return}for(let t of this.events.message)if(!(!n.includes(t.endPoint??`message`)||t.needReply&&!i||t.needAdmin&&!r||t.trigger&&!(typeof t.trigger==`string`?e.raw_message.includes(t.trigger):t.trigger.test(e.raw_message))))try{if(await t.callback(e)===`quit`){this.logger.DEBUG(`插件 ${t.pluginName} 请求提前终止 ${n} 事件`);break}}catch(r){this.logger.ERROR(`插件 ${t.pluginName} ${n} 事件处理失败:`,r),await this.sendMsg(e,[c.text(`插件 ${t.pluginName} ${n} 事件处理失败, 请联系管理员处理: ${r instanceof Error?r.stack??r.message:String(r)}`)])}let a=this.config.prefix.find(t=>e.raw_message.startsWith(t));if(!a)return;let o=e.raw_message.slice(a.length).trim();for(let t of this.events.command){if(!n.includes(t.endPoint??`message`)||t.needReply&&!i||t.needAdmin&&!r)continue;let a=this.extractCommandBody(o,t.trigger);if(a!==null)try{let r=this.splitArgs(a),i=t.commander?t.commander().fail(!1).parseSync(r):{_:[],$0:``};if(await t.callback({context:e,options:i})===`quit`){this.logger.DEBUG(`插件 ${t.pluginName} 请求提前终止 ${n} 事件`);break}}catch(r){if(r instanceof Error&&r.stack?.toString().includes(`yargs`)){await this.sendMsg(e,[c.text(`命令使用错误:\n${r.message}\n\n`),c.text(await t.commander?.()?.getHelp()??`无帮助信息`)]);continue}this.logger.ERROR(`插件 ${t.pluginName} ${n} 事件处理失败:`,r),await this.sendMsg(e,[c.text(`插件 ${t.pluginName} ${n} 事件处理失败, 请联系管理员处理: ${r instanceof Error?r.stack??r.message:String(r)}`)])}}}),this.ws.on(`request`,async e=>{this.logger.DEBUG(`收到请求:`,e);let t=`request.${e.request_type}.${`sub_type`in e?e.sub_type:``}`;for(let n of this.events.request)if(t.includes(n.endPoint??`request`))try{if(await n.callback(e)===`quit`){this.logger.DEBUG(`插件 ${n.pluginName} 请求提前终止 ${t} 事件`);break}}catch(e){this.logger.ERROR(`插件 ${n.pluginName} ${t} 事件处理失败:`,e),await this.sendMsg({message_type:`private`,user_id:this.config.adminId[0]},[c.text(`插件 ${n.pluginName} ${t} 事件处理失败: ${e instanceof Error?e.stack??e.message:String(e)}`)])}}),this.ws.on(`notice`,async e=>{this.logger.DEBUG(`收到通知:`,e);let t=`notice.${e.notice_type}.${`sub_type`in e?e.sub_type:``}`;e.notice_type===`notify`&&(e.sub_type===`input_status`?t+=`.${e.group_id===0?`friend`:`group`}`:e.sub_type===`poke`&&(t+=`.${`group_id`in e?`group`:`friend`}`));for(let n of this.events.notice)if(t.includes(n.endPoint??`notice`))try{if(await n.callback(e)===`quit`){this.logger.DEBUG(`插件 ${n.pluginName} 请求提前终止 ${t} 事件`);break}}catch(e){this.logger.ERROR(`插件 ${n.pluginName} ${t} 事件处理失败:`,e),await this.sendMsg({message_type:`private`,user_id:this.config.adminId[0]},[c.text(`插件 ${n.pluginName} ${t} 事件处理失败: ${e instanceof Error?e.stack??e.message:String(e)}`)])}}),await this.ws.connect(),this.logger.INFO(`Bot 初始化完成`)}splitArgsRegex=/"([^"]*)"|'([^']*)'|(\S+)/g;splitArgs(e){let t=e.matchAll(this.splitArgsRegex),n=[];for(let e of t)n.push(e[1]||e[2]||e[3]);return n}extractCommandBody(e,t){return typeof t==`string`?e.startsWith(t)?e.slice(t.length).trim():null:t.test(e)?e.replace(t,``).trim():null}regCommandEvent(e){let t={...e,type:`command`};if(t.commander){let e=typeof t.commander==`function`?t.commander():t.commander;`exitProcess`in e&&e.exitProcess(!1).usage(`用法: ${t.trigger} [选项]`).locale(this.config.yargsLocale??`zh_CN`).help(!1).version(!1)}this.events.command=l([...this.events.command,t],`priority`,`down`);let n=()=>{let e=this.events.command.indexOf(t);e!==-1&&this.events.command.splice(e,1)};return this.unloaders[t.pluginName]=this.unloaders[t.pluginName]??[],this.unloaders[t.pluginName].push(n),n}regMessageEvent(e){let t={...e,type:`message`};this.events.message=l([...this.events.message,t],`priority`,`down`);let n=()=>{let e=this.events.message.indexOf(t);e!==-1&&this.events.message.splice(e,1)};return this.unloaders[t.pluginName]=this.unloaders[t.pluginName]??[],this.unloaders[t.pluginName].push(n),n}regNoticeEvent(e){let t={...e,type:`notice`};this.events.notice=l([...this.events.notice,t],`priority`,`down`);let n=()=>{let e=this.events.notice.indexOf(t);e!==-1&&this.events.notice.splice(e,1)};return this.unloaders[t.pluginName]=this.unloaders[t.pluginName]??[],this.unloaders[t.pluginName].push(n),n}regRequestEvent(e){let t={...e,type:`request`};this.events.request=l([...this.events.request,t],`priority`,`down`);let n=()=>{let e=this.events.request.indexOf(t);e!==-1&&this.events.request.splice(e,1)};return this.unloaders[t.pluginName]=this.unloaders[t.pluginName]??[],this.unloaders[t.pluginName].push(n),n}async sendMsg(e,t,{reply:n=!0,at:r=!0}={}){try{if(e.message_type===`private`)return await this.ws.send_private_msg({user_id:e.user_id,message:t});{let i=[];return n&&e.message_id&&i.push(c.reply(e.message_id)),r&&e.user_id&&i.push(c.at(e.user_id),c.text(`
2
2
  `)),t=[...i,...t],await this.ws.send_group_msg({group_id:e.group_id,message:t})}}catch{return null}}async sendForwardMsg(e,t){try{return e.message_type===`private`?await this.ws.send_private_forward_msg({user_id:e.user_id,message:t}):await this.ws.send_group_forward_msg({group_id:e.group_id,message:t})}catch{return null}}async isFriend(e){return this.ws.get_friend_list().then(t=>t.find(t=>t.user_id===e.user_id))}async getUsername(e){return`group_id`in e?this.ws.get_group_member_info({group_id:e.group_id,user_id:e.user_id}).then(e=>e.nickname):this.ws.get_stranger_info({user_id:e.user_id}).then(e=>e.nickname)}},d=class{config;logger;bot;plugins={};configs={};normalizeConfigKey(e){return e.replaceAll(`/`,`__`)}async removeUselessLogs(){let t=await Array.fromAsync(a.promises.glob(`${this.config.logDir}/[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]*.log`)),n=this.config.maxFiles??30;if(t.length<=n)return;let r=t.length-n+1;t.sort().slice(0,r).map(t=>a.promises.rm(e.join(this.config.logDir,t)).catch())}constructor(e){this.config=e,this.logger=new n({title:`ATRI`,transformers:[r,...this.config.saveLogs?[i({filename:()=>(this.removeUselessLogs(),`./logs/${new Date().toISOString().slice(0,10)}.log`)})]:[]]}),this.bot=new u(this,{logLevel:e.logLevel,...e.botConfig})}async init(){console.log(`%c __ .__
3
3
  _____ _/ |_ _______ |__|
4
4
  \\__ \\ \\ __\\ \\_ __ \\ | |
5
5
  / __ \\_ | | | | \\/ | |
6
6
  (____ / |__| |__| |__|
7
- \\/`,`font-family: Consolas;`),this.logger.INFO(`アトリは、高性能ですから!`),await this.bot.init();for(let e of this.config.plugins??[])await this.installPlugin(e);this.logger.INFO(`ATRI 初始化完成`)}async installPlugin(e){let t=await e(this);if(t.pluginName in this.plugins){this.logger.WARN(`插件 ${t.pluginName} 已经安装,跳过本次安装`);return}await t.install(),this.plugins[t.pluginName]=t,this.logger.INFO(`插件 ${t.pluginName} 安装成功`)}async uninstallPlugin(e){let t=this.plugins[e];if(!t){this.logger.WARN(`插件 ${e} 未找到,无法卸载`);return}let n=this.bot.unloaders[e]??[];for(let e of n)e();await t.uninstall(),delete this.plugins[e],this.logger.INFO(`插件 ${e} 卸载成功`)}async loadConfig(t,n,r=!1){if(!n)return{};if(t=this.normalizeConfigKey(t),!r)return this.configs[t]??await this.loadConfig(t,n,!0);await a.ensureDir(this.config.configDir);let i=e.join(this.config.configDir,`${t}.json`);if(!await a.exists(i))return await a.writeJSON(i,n,{spaces:2}),n;try{let e=await a.readJSON(i,`utf-8`),r={...n,...e};return this.configs[t]=r,r}catch(e){return this.logger.ERROR(`插件 ${t} 配置加载失败:`,e),{}}}async saveConfig(t,n){t=this.normalizeConfigKey(t),await a.ensureDir(this.config.configDir);let r=e.join(this.config.configDir,`${t}.json`);await a.writeJSON(r,n,{spaces:2}),Object.assign(this.configs[t],n)}};function f(e){return async t=>{let n=await Promise.resolve(typeof e==`function`?e():e),r={...n,atri:t,bot:t.bot,ws:t.bot.ws,config:n.config??await t.loadConfig(n.pluginName,n.defaultConfig),logger:t.logger.clone({title:n.pluginName}),refreshConfig:async()=>{n.config||(r.config=await t.loadConfig(n.pluginName,n.defaultConfig))},saveConfig:async e=>{n.config||await t.saveConfig(n.pluginName,e??r.config)},regMessageEvent:e=>t.bot.regMessageEvent({...e,pluginName:n.pluginName}),regCommandEvent:e=>t.bot.regCommandEvent({...e,pluginName:n.pluginName}),regNoticeEvent:e=>t.bot.regNoticeEvent({...e,pluginName:n.pluginName}),regRequestEvent:e=>t.bot.regRequestEvent({...e,pluginName:n.pluginName})};return r}}export{d as ATRI,u as Bot,f as definePlugin,l as sortObjectArray};
7
+ \\/`,`font-family: Consolas;`),this.logger.INFO(`アトリは、高性能ですから!`),await this.bot.init();for(let e of this.config.plugins??[])await this.installPlugin(e);this.logger.INFO(`ATRI 初始化完成`)}async installPlugin(e){let t=await e(this);if(t.pluginName in this.plugins){this.logger.WARN(`插件 ${t.pluginName} 已经安装,跳过本次安装`);return}await t.install(),this.plugins[t.pluginName]=t,this.logger.INFO(`插件 ${t.pluginName} 安装成功`)}async uninstallPlugin(e){let t=this.plugins[e];if(!t){this.logger.WARN(`插件 ${e} 未找到,无法卸载`);return}let n=this.bot.unloaders[e]??[];for(let e of n)e();this.bot.unloaders[e]=[],await t.uninstall(),delete this.plugins[e],this.logger.INFO(`插件 ${e} 卸载成功`)}async loadConfig(t,n,r=!1){if(!n)return{};if(t=this.normalizeConfigKey(t),!r)return this.configs[t]??await this.loadConfig(t,n,!0);await a.ensureDir(this.config.configDir);let i=e.join(this.config.configDir,`${t}.json`);if(!await a.exists(i))return await a.writeJSON(i,n,{spaces:2}),n;try{let e=await a.readJSON(i,`utf-8`),r={...n,...e};return this.configs[t]=r,r}catch(e){return this.logger.ERROR(`插件 ${t} 配置加载失败:`,e),{}}}async saveConfig(t,n){t=this.normalizeConfigKey(t),await a.ensureDir(this.config.configDir);let r=e.join(this.config.configDir,`${t}.json`);await a.writeJSON(r,n,{spaces:2}),Object.assign(this.configs[t],n)}};function f(e){return async t=>{let n=await Promise.resolve(typeof e==`function`?e():e),r={...n,atri:t,bot:t.bot,ws:t.bot.ws,config:n.config??await t.loadConfig(n.pluginName,n.defaultConfig),logger:t.logger.clone({title:n.pluginName}),refreshConfig:async()=>{n.config||(r.config=await t.loadConfig(n.pluginName,n.defaultConfig))},saveConfig:async e=>{n.config||await t.saveConfig(n.pluginName,e??r.config)},regMessageEvent:e=>t.bot.regMessageEvent({...e,pluginName:n.pluginName}),regCommandEvent:e=>t.bot.regCommandEvent({...e,pluginName:n.pluginName}),regNoticeEvent:e=>t.bot.regNoticeEvent({...e,pluginName:n.pluginName}),regRequestEvent:e=>t.bot.regRequestEvent({...e,pluginName:n.pluginName})};return r}}export{d as ATRI,u as Bot,f as definePlugin,l as sortObjectArray};
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@atri-bot/core",
3
3
  "type": "module",
4
- "version": "2.0.0-beta.3",
4
+ "version": "2.0.0-beta.5",
5
5
  "description": "QQBOT TypeScript framework",
6
6
  "author": "huankong233",
7
7
  "license": "MIT",