UNPKG

filecat

Version:
2 lines 4.49 MB
/*! For license information please see main.js.LICENSE.txt */ (()=>{var __webpack_modules__={35430(e,t){"use strict";t.get_user_now_pwd=function(e){return 0===e.folder_item_now||void 0===e.folder_item_now?e.cwd:e.folder_items[e.folder_item_now-1].path}},3031(e,t,r){"use strict";t.getFileFormat=function(e){const t=n.StringUtil.getFileExtension(e);if("pdf"===t)return i.FileTypeEnum.pdf;if(c.has(t))return i.FileTypeEnum.database;if("md"==t)return i.FileTypeEnum.md;if(s.has(t))return i.FileTypeEnum.video;if(a.has(t))return i.FileTypeEnum.uncompress;if(o.has(t))return i.FileTypeEnum.image;if(t===i.FileTypeEnum.excalidraw||t===i.FileTypeEnum.draw)return i.FileTypeEnum.excalidraw;if(t===i.FileTypeEnum.workflow_act)return i.FileTypeEnum.workflow_act;if("url"===t)return i.FileTypeEnum.url;return i.FileTypeEnum.unknow};const n=r(74207),i=r(24406);const s=new Set(["mp4","webm","flv","mov","m4v","mkv","avi","wmv","swf","mod","mpv","mpeg","asf"]),a=new Set(["tar","zip","gz","tgz","rar","7z"]),o=new Set(["jpg","jpeg","png","gif"]),c=new Set(["db","sqlite","sqlite3"]),l=(new Set(["txt","ts","js"]),new Set(["js","mjs","json","html","htm","css","xml"]))},9794(e,t){"use strict";function r(e,t){for(let r=0;r<e.length;r++)if(e[r]===t)return r;return null}t.AsyncPool=void 0,t.getMapByList=function(e,t){const r=new Map;for(const n of e)r.set(t(n),n);return r},t.deleteList=function(e,t){if(!t)return;for(let r=0;r<e.length;r++)if(t(e[r]))return e.splice(r,1)[0];return},t.list_paginate=function(e,t,r){const n=e.length,i=Math.ceil(n/r);if(t<1)t=1;else if(0===n||t<1||t>i)return{list:[],total:n,page_num:t,page_size:r,total_pages:i};const s=(t-1)*r,a=s+r;return{list:e.slice(s,a),total:n,page_num:t,page_size:r,total_pages:i}};t.AsyncPool=class{limit;running=0;queue=[];constructor(e){this.limit=e}async run(e){this.running>=this.limit&&await new Promise(e=>this.queue.push(e)),this.running++;try{return await e()}finally{this.running--;const e=this.queue.shift();e&&e()}}}},96115(e,t){"use strict";var r;t.RCode=void 0,function(e){e[e.Success=0]="Success",e[e.Fail=1]="Fail",e[e.AuthFail=2]="AuthFail",e[e.DdnsAuthFail=3]="DdnsAuthFail",e[e.File_Max=4]="File_Max",e[e.PreFile=5]="PreFile",e[e.PROTECT_FILE=6]="PROTECT_FILE",e[e.need_token_share=7]="need_token_share"}(r||(t.RCode=r={}))},13001(e,t){"use strict";t.routerConfig=void 0,t.routerConfig={file:"file",aichat:"aichat",navindex:"navindex",toolbox:"toolbox",proxy:"proxy",info:"info",ddns:"ddns",net:"net",net_proxy:"net_proxy",setting:"setting",share:"share",share_list_setting_page:"share_list_setting_page",ai_agent_setting_page:"ai_agent_setting_page",studio_page:"studio_page",sqlite_query_page:"sqlite_query_page","/":"/","":""}},74207(e,t,r){"use strict";t.StringUtil=void 0,t.getWebFirstKey=function(e){if(!e)return"";for(let t=1;t<e.length;t++)if("//"===e[t])return e.slice(1,t);return e.slice(1)},t.generateSaltyUUID=function(e=""){const t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"+(e??`${Date.now()}`);let r="";for(let e=0;e<60;e++){r+=t[Math.floor(Math.random()*t.length)]}return r},t.generateRandomHash=function(e=16){const t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";let r="";for(let n=0;n<e;n++)r+=t.charAt(Math.floor(62*Math.random()));return r},t.have_empty_char=function(e){return/\s/.test(e)},t.removeTrailingPath=function(e){const t=(0,n.find_sep)(e),r=e.trimEnd();if(r.endsWith(t)&&!r.endsWith(":\\"))return r.slice(0,-1);return r},t.matchGitignore=function(e,t){if(!e||!t)return!1;e=s(e);const r=(t=s(t.trim())).endsWith("/");r&&(t=t.slice(0,-1));const n=t.startsWith("/");n&&(t=t.slice(1));return function(e,t,r){let n=e.replace(/[.+^${}()|[\]\\]/g,"\\$&").replace(/\\\*\\\*/g,"§§DOUBLE_STAR§§").replace(/\\\*/g,"[^/]*").replace(/§§DOUBLE_STAR§§/g,".*");n=r?"^"+n:"(^|/)"+n;n+=t?"(/|$)":"$";return new RegExp(n)}(t,r,n).test(e)},t.get_zip_file_format_util=function(e){for(const t of i.file_select_list)if(e.endsWith(t))return t},t.fastHash=function(e){let t=0xcbf29ce484222325n;for(let r=0;r<e.length;r++)t^=BigInt(e.charCodeAt(r)),t*=1099511628211n;return t.toString(16).padStart(16,"0")};const n=r(20928),i=r(24406);function s(e){return e.replace(/\\/g,"/").replace(/^\/+/,"")}t.StringUtil=class{static trim(e){return e?e.replace(" ",""):""}static trimList(e,t){const r=e[t];return this.trim(r)}static getParam(...e){let t="?",r=!1;if(Array.isArray(e))for(const n of e)n.value&&(r?t+=`&${n.key}=${n.value}`:(t+=`${n.key}=${n.value}`,r=!0));return t}static getFileExtension(e){return e?e.split(".").pop():""}static splitBashCommands(e){const t=[];let r="",n=!1,i=!1,s=!1;const a=()=>{const e=r.trim();e&&t.push(e),r=""};for(let t=0;t<e.length;t++){const o=e[t];s?(r+=o,s=!1):"\\"!==o?"'"!==o||i?'"'!==o||n?n||i?r+=o:";"!==o?"&"!==o?"|"!==o?r+=o:("|"===e[t+1]&&t++,a()):("&"===e[t+1]&&t++,a()):a():(i=!i,r+=o):(n=!n,r+=o):(r+=o,s=!0)}return a(),t}}},84189(e,t){"use strict";t.formatFileSize=function(e){if(!e&&0!==e)return"";if("number"!=typeof e)return e;return e<1024?e+" B":e<1048576?(e/1024).toFixed(2)+" KB":e<r?(e/1048576).toFixed(2)+" MB":(e/r).toFixed(2)+" GB"},t.formatter_time=function(e){return new Intl.DateTimeFormat("zh-CN",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1}).format(e)},t.formatDuration=function(e){if(!e)return"";const t=[{label:"y",value:31536e6},{label:"mo",value:2592e6},{label:"d",value:864e5},{label:"h",value:36e5},{label:"min",value:6e4},{label:"s",value:1e3},{label:"ms",value:1}];for(const r of t)if(e>=r.value){const t=e/r.value;return`${parseFloat(t.toFixed(2))} ${r.label}`}return"0 ms"};const r=1073741824},11153(e,t){"use strict";t.CommonUtil=void 0;const r=new Map;t.CommonUtil=class{static sleep(e){return new Promise(t=>setTimeout(t,e))}static async sleep_lock_key(e,t){const n=r.get(e)||Promise.resolve();let i;const s=new Promise(e=>{i=e});r.set(e,n.then(()=>s)),await n;try{await new Promise(e=>setTimeout(e,t))}finally{i(),r.get(e)===s&&r.delete(e)}}static random01(){return Math.random()}}},24406(e,t){"use strict";var r,n,i;t.base64UploadType=t.file_select_list=t.FileCompressType=t.FileTypeEnum=void 0,function(e){e.audio="audio",e.blob="blob",e.database="database",e.image="image",e.pdf="pdf",e.text="text",e.video="video",e.invalid_link="invalid_link",e.folder="folder",e.upload_folder="upload_folder",e.studio_file="studio_file",e.studio_folder="studio_folder",e.directory="directory",e.unknow="text",e.uncompress="uncompress",e.md="md",e.excalidraw="excalidraw",e.draw="draw",e.workflow_act="act",e.dev="dev",e.url="url"}(r||(t.FileTypeEnum=r={}));(function(e){e.zip=".zip",e.tar=".tar",e.gz=".gz",e.rar=".rar",e.sevenZip=".7z",e.tar_gz=".tar.gz"})(n||(t.FileCompressType=n={})),t.file_select_list=[n.sevenZip,n.zip,n.tar_gz,n.gz,n.rar,n.tar];!function(e){e[e.all=0]="all",e[e.start=1]="start",e[e.part=2]="part"}(i||(t.base64UploadType=i={}))},298(e,t,r){"use strict";t.WsData=t.WsConnectType=t.CmdType=void 0;const n=r(96115),i=r(24802);var s,a;(function(e){e[e.heart=0]="heart",e[e.sys_get=1]="sys_get",e[e.sys_getting=2]="sys_getting",e[e.sys_cancel=3]="sys_cancel",e[e.shell_open=4]="shell_open",e[e.shell_send=5]="shell_send",e[e.shell_getting=6]="shell_getting",e[e.shell_copy=7]="shell_copy",e[e.docker_get=8]="docker_get",e[e.docker_getting=9]="docker_getting",e[e.docker_shell_logs=10]="docker_shell_logs",e[e.docker_shell_logs_getting=11]="docker_shell_logs_getting",e[e.docker_shell_logs_cancel=12]="docker_shell_logs_cancel",e[e.docker_shell_exec_open=13]="docker_shell_exec_open",e[e.docker_shell_exec=14]="docker_shell_exec",e[e.docker_shell_exec_getting=15]="docker_shell_exec_getting",e[e.docker_shell_exec_cancel=16]="docker_shell_exec_cancel",e[e.docker_switch=17]="docker_switch",e[e.docker_del_container=18]="docker_del_container",e[e.process_get=19]="process_get",e[e.process_getting=20]="process_getting",e[e.process_close=21]="process_close",e[e.systemd_inside_get=22]="systemd_inside_get",e[e.systemd_inside_getting=23]="systemd_inside_getting",e[e.systemd_logs_get=24]="systemd_logs_get",e[e.systemd_logs_getting=25]="systemd_logs_getting",e[e.remote_shell_open=26]="remote_shell_open",e[e.remote_shell_send=27]="remote_shell_send",e[e.remote_shell_getting=28]="remote_shell_getting",e[e.remote_shell_cancel=29]="remote_shell_cancel",e[e.remote_shell_cd=30]="remote_shell_cd",e[e.infos=31]="infos",e[e.connect=32]="connect",e[e.rdp_connect=33]="rdp_connect",e[e.rdp_bitmap=34]="rdp_bitmap",e[e.rdp_close=35]="rdp_close",e[e.rdp_error=36]="rdp_error",e[e.mouse=37]="mouse",e[e.wheel=38]="wheel",e[e.scancode=39]="scancode",e[e.unicode=40]="unicode",e[e.rdp_disconnect=41]="rdp_disconnect",e[e.vir_net_serverIno_get=42]="vir_net_serverIno_get",e[e.vir_net_client_get=43]="vir_net_client_get",e[e.tcp_proxy_client_status=44]="tcp_proxy_client_status",e[e.file_info=45]="file_info",e[e.file_video_trans=46]="file_video_trans",e[e.file_video_trans_progress=47]="file_video_trans_progress",e[e.file_uncompress=48]="file_uncompress",e[e.file_uncompress_progress=49]="file_uncompress_progress",e[e.file_compress=50]="file_compress",e[e.file_compress_progress=51]="file_compress_progress",e[e.file_upload_pre=52]="file_upload_pre",e[e.file_upload=53]="file_upload",e[e.log_viewer=54]="log_viewer",e[e.log_viewer_watch=55]="log_viewer_watch",e[e.log_viewer_watch_cancel=56]="log_viewer_watch_cancel",e[e.search_file=57]="search_file",e[e.search_file_progress=58]="search_file_progress",e[e.search_file_index=59]="search_file_index",e[e.search_file_cancel=60]="search_file_cancel",e[e.http_download_water=61]="http_download_water",e[e.http_download_cancel=62]="http_download_cancel",e[e.folder_size_info=63]="folder_size_info",e[e.folder_size_info_close=64]="folder_size_info_close",e[e.rtsp_get=65]="rtsp_get",e[e.rtsp_cancel=66]="rtsp_cancel",e[e.workflow_exec=67]="workflow_exec",e[e.workflow_get=68]="workflow_get",e[e.workflow_realtime=69]="workflow_realtime",e[e.workflow_realtime_one_req=70]="workflow_realtime_one_req",e[e.workflow_realtime_one_rsq=71]="workflow_realtime_one_rsq",e[e.workflow_search_by_run_name=72]="workflow_search_by_run_name",e[e.ai_load_info=73]="ai_load_info",e[e.tcp_forward_server_load=74]="tcp_forward_server_load"})(s||(t.CmdType=s={})),function(e){e[e.data=0]="data",e[e.other=1]="other"}(a||(t.WsConnectType=a={}));class o{cmdType;context;bin_context;wss;client_wss;code;message;random_id;constructor(e,t,r,i){this.cmdType=e,this.context=t,this.bin_context=r,this.code=n.RCode.Success,this.random_id=i}encode(){return i.DataEncode.encode({cmdType:this.cmdType,context:this.context?JSON.stringify(this.context):null,code:this.code,message:this.message,binContext:this.bin_context,randomId:this.random_id})}static decode(e){const t=i.DataEncode.decode(e);let r=t.context;if("string"==typeof r&&r)try{r=JSON.parse(r)}catch(e){console.log(e),r=t.context}const n=new o(t.cmdType,r,t.binContext);return n.code=t.code,n.message=t.message,n.random_id=t.randomId,n}}t.WsData=o},55184(e,t){"use strict";t.max_heart_interval=t.heart_interval=void 0,t.heart_interval=601e3,t.max_heart_interval=18e5},24802(e,t){"use strict";t.DataEncode=void 0;const r=e=>{const t=new Uint8Array(4);if(null==e)t.set([255,255,255,255]);else{new DataView(t.buffer).setUint32(0,e)}return t},n=e=>{if(null==e){const e=new Uint8Array(4);return new DataView(e.buffer).setUint32(0,4294967295),e}const t=(new TextEncoder).encode(e),r=new Uint8Array(4);return new DataView(r.buffer).setUint32(0,t.length),s([r,t])};class i{static VERSION=0;static encode(e){const t=[];return t.push(new Uint8Array([i.VERSION])),t.push(r(e.cmdType)),t.push(n(e.context)),t.push((e=>{if(!e){const e=new Uint8Array(4);return new DataView(e.buffer).setUint32(0,4294967295),e}const t=new Uint8Array(4);return new DataView(t.buffer).setUint32(0,e.length),s([t,e])})(e.binContext)),t.push(n(e.message)),t.push(r(e.code)),t.push(n(e.randomId)),s(t)}static decode(e){const t=e instanceof Uint8Array?e:new Uint8Array(e);let r=0;const n=()=>{const e=new DataView(t.buffer,t.byteOffset+r,4).getUint32(0);return r+=4,e},s=()=>{const e=n();return 4294967295===e?null:e},a=()=>{const e=n();if(4294967295===e)return null;if(r+e>t.length)throw new RangeError("decodeString 越界");const i=t.slice(r,r+e);return r+=e,(new TextDecoder).decode(i)};if(t[r++]!==i.VERSION)throw new Error("版本号不匹配");return{cmdType:s(),context:a(),binContext:(()=>{const e=n();if(4294967295===e)return null;if(r+e>t.length)throw new RangeError("decodeBin 越界");const i=t.slice(r,r+e);return r+=e,i})(),message:a(),code:s(),randomId:a()}}}function s(e,t){if("number"!=typeof t){t=0;for(let r of e)t+=r.length}const r=new Uint8Array(t);let n=0;for(let t of e)r.set(t,n),n+=t.length;return r}t.DataEncode=i},15133(e,t){"use strict";t.otherRouterHandlerMap=t.routerHandlerMap=void 0,t.msg=function(e){return(n,i,s)=>{const a=r.get(n.name)??new n.constructor;t.routerHandlerMap.set(e,a[i].bind(a))}},t.otherMsg=function(e){return(n,i,s)=>{const a=r.get(n.name)??new n.constructor;t.otherRouterHandlerMap.set(e,a[i].bind(a))}};const r=new Map;t.routerHandlerMap=new Map,t.otherRouterHandlerMap=new Map},89477(e,t,r){"use strict";t.WsServer=t.Wss=void 0;const n=r(15133),i=r(298),s=r(96115),a=r(74207),o=r(55184),c=r(87016),l=new Set;class u{_ws;dataMap=new Map;id;_close=[];token;heart_time_stamp=Date.now();heart_interval;constructor(e){this._ws=e,this.id=`${Date.now().toString()}_${(0,a.generateRandomHash)(4)}`}get ws(){return this._ws}sendData(e){if(Array.isArray(e))for(let t=0;t<e.length;t++)this._ws.send(e[t]);else this._ws.send(e)}send(e,t){const r=new i.WsData(e);r.context=t,this._ws.send(r.encode())}static sendToAllClient(e,t,r){const n=new i.WsData(e);n.context=t;const s=n.encode();for(const e of(r??l).values())e.sendData(s)}setClose(e){this._close.push(e)}}t.Wss=u;t.WsServer=class{_wss;constructor(e){this._wss=e}start(e){this._wss.on("connection",async function(t,r){try{const a=c.parse(r.url,!0),{query:p}=a,d=p.token;if(!await e(d))return t.close(),void console.log("未验证的ws请求");if(p.type===`${i.WsConnectType.data}`){const e=new u(t);l.add(e),e.token=d;let r=!1;const a=()=>{if(!r){r=!0,l.delete(e),t.close();for(const t of e._close??[])try{t()}catch(e){console.error("关闭函数",e)}clearInterval(e.heart_interval)}};e.heart_interval=setInterval(()=>{Date.now()-e.heart_time_stamp>o.max_heart_interval&&(console.log("ws心跳断开"),a())},o.heart_interval),t.on("message",async function(t){const r=i.WsData.decode(t);if(r.wss=e,e.heart_time_stamp=Date.now(),r.cmdType===i.CmdType.heart)return void e.sendData(new i.WsData(r.cmdType,{},void 0,r.random_id).encode());const a=n.routerHandlerMap.get(r.cmdType);if(a)try{const t=await a(r);e.sendData(new i.WsData(r.cmdType,t,void 0,r.random_id).encode())}catch(t){console.log(t);const n=new i.WsData(r.cmdType);n.code=s.RCode.Fail,n.message=JSON.stringify(t),n.random_id=r.random_id,e.sendData(n.encode())}else console.log("没有匹配到路由")}),e.ws.on("close",()=>{a()})}else if(p.type===`${i.WsConnectType.other}`){const e=n.otherRouterHandlerMap.get(parseInt(p.code));e?e(t,p):console.log("没找到对应路径")}else console.log("ws未找到对应的访问途径"),t.close()}catch(e){console.log("ws connection",e),t.close()}})}}},36215(e,t){"use strict";t.withLock=function(e,t,r){null==t&&(t=6e4);let n=!1,i=null,s=0;function a(e){n&&s===e&&(n=!1,s++,i&&(clearTimeout(i),i=null))}return async function(...o){if(n)return;n=!0;const c=s;t>=0&&(i=setTimeout(()=>{a(c)},t));try{return await e(...o)}catch(e){if(console.log(e?.message||e),r)throw e}finally{a(c)}}}},79094(e,t,r){"use strict";var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.Env=void 0;const i=n(r(79896)),s=n(r(16928)),a=n(r(70857)),{execSync:o}=r(35317);class c{static port=5567;static base_folder=process.cwd();static username="";static password="";static work_dir=s.default.join(process.cwd(),"data");static env="";static reset_root_username;static reset_root_password;static base_url;static lan="en";static https_tunnel_server_port;static https_tunnel_server_open;static https_tunnel_key;static https_tunnel_key_kb_size;static https_tunnel_forbid_regexp;static async parseArgs(){return new Promise((e,t)=>{const n=process.argv.slice(2),s={};for(let e=0;e<n.length;e++){const t=n[e];if(t.startsWith("--")){const c=t.slice(2);let l=!0;if(e+1<n.length&&!n[e+1].startsWith("--")&&(l=n[++e]),"true"===l?l=!0:"false"===l?l=!1:isNaN(l)||(l=Number(l)),s[c]=l,"install"===c)return"linux"!==a.default.platform()&&(console.log("sorry现在只支持linux"),process.exit()),void r(98386);if("version"===c)console.log("5.67.0"),process.exit();else if("update"===c)o("npm install -g filecat"),process.exit();else if("help"===c)console.log('\n命令参数都需要加 --\n1. update 升级(npm方式升级)\n2. remove 移除(从npm)\n3. version 版本\n4. help 帮助信息\n5. install 安装到systemd(只支持linux)\n6. uninstall 从systemd卸载(只支持linux)\n7 restart 重启systemd服务(只支持linux)\n8. stop 停止运行systemd服务(支持linux)\n// 以下参数都需要额外的参数输入 例如"filecat --port 8080 "端口参数 用于控制程序运行。\n9. port 需要端口参数 \n10. env 输入环境配置文件\n11. work_dir 工作目录,软件执行需要生成一些数据,会放到这个目录下,默认是启动软件所在的目录下的data文件夹\n12. base_folder 软件管理的文件夹默认根路径,默认是启动软件所在的目录\n13. username 登录账号 默认是admin (截止到1.0.5目前没有权限功能)\n14. password 登录密码 默认是admin\n15. reset_root_username 重新生成管理员的账号 (启动完请删除这个参数下次要再使用,下面的密码也是)\n16. reset_root_password\n17. base_url 路由前缀\n18. lan 语言,只在第一次创建账号的时候生效 目前支持 zh(简体) en\n19. watch 内置参数\n对于shell支持filecat-restart 重启命令\n'),process.exit();else if("stop"===c)"linux"!==a.default.platform()&&(console.log("sorry现在只支持linux"),process.exit()),o("sudo systemctl stop filecat"),process.exit();else if("restart"===c)"linux"!==a.default.platform()&&(console.log("sorry现在只支持linux"),process.exit()),o("sudo systemctl daemon-reload"),o("sudo systemctl restart filecat"),process.exit();else if("uninstall"===c)"linux"!==a.default.platform()&&(console.log("sorry现在只支持linux"),process.exit()),o("sudo systemctl stop filecat"),o("sudo systemctl disable filecat"),o("sudo rm /etc/systemd/system/filecat.service"),o("sudo systemctl daemon-reload"),console.log("卸载完成"),process.exit();else if("env"===c&&this.env){const e=i.default.readFileSync(this.env,"utf8");this.load(e,s)}}}for(const e of Object.keys(s))this[e]=s[e];e(1)})}static updateEnv(e){if(!this.env)return;const t=i.default.readFileSync(s.default.join(this.env),"utf8").split(/\r?\n/);for(let r=0;r<t.length;r++){const n=t[r];for(const i of e)n.includes(i.key)&&(t[r]=`${i.key}=${i.value||""}`,this[i.key]=i.value)}i.default.writeFileSync(s.default.join(this.env),t.join("\n"))}static isNumeric(e){return/^-?\d+(\.\d+)?$/.test(e)}static parseValue(e){const t=e.trim();if(t.startsWith('"')&&t.endsWith('"')||t.startsWith("'")&&t.endsWith("'")){return t.slice(1,-1).replace(/\\n/g,"\n").replace(/\\r/g,"\r").replace(/\\t/g,"\t")}return isNaN(Number(t))?"true"===t.toLowerCase()||"false"!==t.toLowerCase()&&t:Number(t)}static load(e,t){if(!e)return;const r=e.split(/\r?\n/);for(const e of r){const r=e.trim();if(!r||r.startsWith("#"))continue;const n=r.indexOf("=");if(-1===n)continue;const i=r.slice(0,n).trim(),s=r.slice(n+1).trim();if(s)try{t[i]=JSON.parse(s)}catch(e){t[i]=this.parseValue(s)}else t[i]=void 0}}}t.Env=c},12250(e,t,r){"use strict";var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.ChildProcessUtil=t.FatherProcessUtil=t.node_process_cmd=t.filecat_cmd=void 0;const i=n(r(79896)),s=n(r(16928)),a=r(35317),o=n(r(78747)),c=r(1776);var l,u;!function(e){e.filecat_restart="filecat-restart",e.filecat_upgrade="filecat-upgrade",e.filecat_down="filecat-down",e.ai="ai"}(l||(t.filecat_cmd=l={})),function(e){e.npm_update="npm_update"}(u||(t.node_process_cmd=u={}));t.FatherProcessUtil=class{static send(e,t){if(e&&!e.killed&&e.send)try{e.send(t)}catch(e){console.warn("IPC 已关闭,忽略消息")}}static npmGlobalInstall(e,t,r,n){return n||(n=console.log),new Promise((i,s)=>{const o=["i","-g",e];r&&o.push(`--registry=${r}`);const c="win32"===process.platform?"npm.cmd":"npm";console.log(`全局安装 ${c} ${JSON.stringify(o)}`);const l=(0,a.spawn)(c,o,{stdio:["ignore","pipe","pipe"],shell:"win32"===process.platform,env:{...process.env,PATH:t}});l.stdout.on("data",e=>{const t=e.toString();n?.(t,"stdout")}),l.stderr.on("data",e=>{const t=e.toString();n?.(t,"stderr")}),l.on("close",e=>{0===e?i():s(new Error(`npm install failed with code ${e}`))}),l.on("error",e=>{s(e)})})}};const p={},d={};process.on("message",e=>{console.log("收到父进程消息:",e),d[e.msg_id]&&d[e.msg_id](e.data),p[e.msg_id]&&(p[e.msg_id](e.data),delete p[e.msg_id])});t.ChildProcessUtil=class{static msg_id=1;static async send_father(e,t,r){this.msg_id++,this.msg_id>1e5&&(this.msg_id=1);const n=this.msg_id;this.msg_id++;const i=this.msg_id;r&&(d[i]=r);const s=await new Promise(r=>{p[n]=r,process.send?.({msg:e,msg_id:n,on_data_msg_id:i,data:t})});return delete d[i],s}static async down_load_file(e,t,r){return new Promise(async(n,a)=>{try{await c.FileUtil.mkdirSync(t,{recursive:!0});const l=encodeURI(e);let u;try{u=new URL(l)}catch(t){return a(new Error("非法 URL: "+e))}const p=o.default.get(l,{follow_max:5,headers:{"User-Agent":"node",Accept:"*/*"}});let d="",h=0,f=0,m=-1,g="",y=null;const _=e=>{try{y&&y.destroy(),g&&i.default.existsSync(g)&&i.default.unlinkSync(g)}catch{}a(e)};p.on("response",e=>{if(e.statusCode&&e.statusCode>=400)return _(new Error(`下载失败: ${e.statusCode}`)),void p.destroy();const r=e.headers["content-disposition"];if(r){const e=r.match(/filename\*?=(?:UTF-8''|")?([^\";]+)/i);if(e?.[1])try{d=decodeURIComponent(e[1])}catch{d=e[1]}}d||(d=s.default.basename(u.pathname)),d&&"/"!==d&&"."!==d||(d=`download_${Date.now()}`),g=s.default.resolve(t,d),y=i.default.createWriteStream(g),y.on("error",_),p.pipe(y),h=Number(e.headers["content-length"]||0)}),p.on("data",e=>{if(f+=e.length,h>0){const e=Math.floor(f/h*100);e!==m&&(m=e,r(e))}}),p.on("end",()=>{y&&y.end()}),y?y.on("finish",()=>{r(100),n(g)}):p.on("close",()=>{g&&(r(100),n(g))}),p.on("error",_)}catch(e){a(e)}})}}},1433(e,t,r){"use strict";t.find_available_port=async function(e,t){for(let r=e;r<=t;r++)try{return await new Promise((e,t)=>{const i=n.createServer();i.unref(),i.on("error",t),i.listen(r,()=>{i.close(()=>e(r))})}),r}catch(e){}return null};const n=r(69278)},59853(e,t,r){"use strict";t.HttpRequest=void 0;const n=r(78747),i=r(83480);t.HttpRequest=class{static async post(e,t,r=!1,i={}){const s=await n("post",e,t,{json:!r,headers:i});return 200===s.statusCode?s.body:null}static async get(e,t,r){try{const s=i.stringify(t);t&&(e=`${e}?${s}`);const a={};r&&(a.open_timeout=r);const o=await n("get",e,a);return 200===o.statusCode?o.body:null}catch(e){return null}}}},98386(e,t,r){const n=r(23785),i=r(79896),s=r(16928),{spawn:a,execSync:o}=r(35317),c=n.createInterface({input:process.stdin,output:process.stdout});let l;l=process.argv[0].endsWith("node")&&process.argv[1].endsWith("filecat")?`${process.argv[0]} ${process.argv[1]} `:process.argv[0];const u={exe_path:l,env_path:"",port:5567,username:"admin",password:"admin",work_dir:`${process.cwd()}/data`,base_folder:process.cwd(),Group:"root",User:"root"},p=e=>new Promise(t=>c.question(e,t)),d={1:async()=>{const e=await p(`1.程序位置-绝对路径(当前-${u.exe_path}):`);e&&(u.exe_path=e);const t=await p("请输入用户账号(默认:root):");if(t){u.User=t;const e=await p(`请输入用户所属组(默认:${t}):`);u.Group=e||t}return"2"},2:async()=>{const e=await p("2.请输入env文件-绝对路径:");return e?(u.env_path=e,""):"3"},3:async()=>{const e=await p("3/7.请输入程序端口(默认:5567):");e&&(u.port=parseInt(e));const t=await p("4/7.请输入登录名(默认:admin):");t&&(u.username=t);const r=await p("5/7.请输入密码(默认:admin):");r&&(u.password=r);const n=await p("6/7.请输入程序缓存数据目录(默认:程序目录下data):");n&&(u.work_dir=n);const i=await p("7/7.请输入管理root文件目录(默认:程序目录下):");return i&&(u.base_folder=i),""}};(async()=>{let e,t="1";for(;;){const e=await d[t]();if(!e)break;t=e}c.close(),e=u.env_path?` --env ${u.env_path}`:` --username ${u.username} --password ${u.password} --port ${u.port} --work_dir ${u.work_dir} --base_folder ${u.base_folder}`;const r=`\n[Unit]\nDescription=filecat\nAfter=network.target\n\n[Service]\nWorkingDirectory=${s.dirname(u.work_dir)}\nExecStart=${u.exe_path} ${e}\nRestart=always\nUser=${u.User}\nGroup=${u.Group}\nKillMode=process\n[Install]\nWantedBy=multi-user.target\n `;try{i.writeFileSync("/etc/systemd/system/filecat.service",r),o(`sudo chmod +x ${u.exe_path}`),o("sudo systemctl daemon-reload"),o("sudo systemctl start filecat"),o("sudo systemctl enable filecat")}catch(e){console.error(e)}console.log("安装完成!"),process.exit()})().catch(e=>{console.error("出现错误:",e),process.exit()})},71920(e,t,r){"use strict";t.hash_str_to_number=function(e){return n.h64(e,43981).toNumber()};const n=r(29134)},20928(e,t){"use strict";function r(e){const t=e.lastIndexOf(".");return-1===t||0===t?"":e.slice(t)}function n(e){let t="\\";for(const r of e)if("/"===r||"\\"===r){t=r;break}return t}t.find_sep=n,t.get_best_cmd=function(e){if(!e)return;let t,n=0;for(const s of e){const e=i[r(s)];void 0!==e&&e>n&&(t=s,n=e)}if(void 0===t)for(const r of e)r.length>n&&(t=r,n=r.length);return t},t.isAbsolutePath=function(e){if("string"!=typeof e)return!1;return/^[a-zA-Z]:[\\\/]/.test(e)||/^\//.test(e)};const i={".com":4,".exe":3,".bat":2,".cmd":1}},78272(e,t){"use strict";t.tcp_proxy_client_fig=t.tcp_proxy_sync_task_item=t.tcp_proxy_server_config=t.vg_item=void 0;t.vg_item=class{name;pv_cout;lv_count;size;free_size;lv_list=[];pv_list=[]};t.tcp_proxy_server_config=class{open;key;option_keys;port};t.tcp_proxy_sync_task_item=class{id;source_client_num_id;source_client_name;source_dir;target_client_num_id;target_client_name;target_dir;open;note;ignore_list=[];ignore_text;delete_missing=!0;two_way_sync;running_num;full_sync};t.tcp_proxy_client_fig=class{client_name;client_num_id;open=!1;serverIp;serverPort;key="";note;status;is_new;index}},68724(e,t,r){"use strict";t.self_auth_jscode=void 0;const n=r(38423);t.self_auth_jscode=n.data_common_key.self_auth_jscode},72410(e,t){"use strict";var r,n,i;t.DdnsConnection=t.DdnsIPPojo=t.ip_source_type=t.DdnsType=void 0,function(e){e[e.www=0]="www",e[e.sys=1]="sys"}(r||(r={})),function(e){e[e.dnspod=0]="dnspod",e[e.tengxun=1]="tengxun",e[e.ali=2]="ali"}(n||(t.DdnsType=n={})),function(e){e.physics="物理",e.http_get="http_get"}(i||(t.ip_source_type=i={}));t.DdnsIPPojo=class{isIPv4;ifaceOrWww;ip;ddnsHost;source_type;source_value;scopeid};t.DdnsConnection=class{ips=[];ddnsType;isOpen=!1;account}},61991(e,t){"use strict";var r,n;t.WorkflowGetRsq=t.WorkFlowRealTimeRsq=t.running_type=t.workflow_dir_name=t.WorkRunType=void 0;!function(e){e[e.start=0]="start",e[e.stop=1]="stop"}(r||(t.WorkRunType=r={}));t.workflow_dir_name=".filecat_work_flows",function(e){e[e.not=0]="not",e[e.running=1]="running",e[e.success=2]="success",e[e.fail=3]="fail"}(n||(t.running_type=n={}));t.WorkFlowRealTimeRsq=class{sucess_file_list=[];failed_file_list=[];running_file_list=[]};t.WorkflowGetRsq=class{list;total;one_data}},75440(e,t){"use strict";var r;t.Http_controller_router=void 0,function(e){e.setting_sys_option_status_save="sys_option/status/save",e.setting_customer_router="customer_router",e.setting_customer_router_save="customer_router/save",e.setting_customer_workflow_router="customer_router/workflow",e.setting_customer_workflow_router_save="customer_router/workflow/save",e.user_save_private_attr="user_save_private_attr"}(r||(t.Http_controller_router=r={}))},19402(e,t){"use strict";var r,n;t.http_proxy_item_sample=t.http_body_type=t.VirClientPojo=t.VirServerPojo=t.VirServerEnum=t.NetPojo=void 0;t.NetPojo=class{targetProxyUrl;proxyPort;sysProxyPort},function(e){e[e.tcp=0]="tcp",e[e.udp=1]="udp"}(r||(t.VirServerEnum=r={}));t.VirServerPojo=class{open=!1;port;key="";async_ips=[]};t.VirClientPojo=class{client_num_id;client_name;open=!1;ip;mask;serverIp;serverPort;key="";model=r.udp};!function(e){e[e.row=1]="row",e[e.json=2]="json",e[e.form=3]="form"}(n||(t.http_body_type=n={}));t.http_proxy_item_sample={url_regexp:"",changeOrigin:!1,rewrite_regexp_source:"",rewrite_target:"",headers:{}}},50585(e,t){"use strict";var r,n;t.SysSoftwareItem=t.SysSoftware=t.json_params_default=t.ai_agent_item_dotenv_default=t.ai_agent_item_dotenv=t.ai_docs_setting_param_default=t.ai_docs_setting_param=t.ai_docs_load_info=t.ai_agent_Item=t.FileSettingItem=t.TokenSettingReq=t.TokenTimeMode=void 0,function(e){e[e.close=0]="close",e[e.length=1]="length",e[e.forver=2]="forver"}(r||(t.TokenTimeMode=r={}));t.TokenSettingReq=class{mode;length};t.FileSettingItem=class{path;default=!1;note;index};t.ai_agent_Item=class{token;open=!1;note;index;url;model;json_params;sys_prompt;dotenv=""};t.ai_docs_load_info=class{progress="100";num=0;size=0;char_num=0;total_num=0;consume_time_ms_len=0;init_statics(e){this.progress=0,this.num=0,this.size=0,this.char_num=0,this.total_num=e,this.consume_time_ms_len=0}};t.ai_docs_setting_param=class{docs_max_char_num=1e4;force_use_local_data=!1;dir_recursion_depth=10;ignore_dir=["node_modules",".git","*.pdf","*.dll","build",".ieda","package-lock.json","*.zip","*.exe","*.rar","*.gz","*.lock","*.png","images","*.woff2","*.svg","*.webp","*.jpg"];max_file_num=5e3;max_file_byte_size=2e7;max_file_concurrency=2;await_time_ms_len=500;await_file_num=100;use_zh_segmentation=!0;allow_file_path=["*.txt","*.md","*.html","*.js","*.ts","*.tsx","*.json","*.csv","*.xml","*.css","*.java","*.go","*.php","*.c","*.cc","*.cpp","*.h","*.py"];index_storage_type="memory"},t.ai_docs_setting_param_default='\n# 获取的最多字符数量 优先级大于docs_max_char_num\ndocs_max_char_num=10000\n# 强制每次聊天前都执行本地知识库搜索,建议在模型的系统提示词中设置,让AI每次都调用本地知识库搜索,会更加精准\nforce_use_local_data=false\n# 读取知识库目录的时候,递归最大深度\ndir_recursion_depth=10\n# gitignore类型的忽略表达式,用于忽略某些文件不被索引,也支持数组 ["abc","node_modules"]\nignore_dir=["node_modules",".git","*.pdf","*.dll","build",".ieda","package-lock.json","*.zip","*.exe","*.rar","*.gz","*.lock","*.png","images","*.woff2","*.svg","*.webp","*.jpg","*.jpeg"]\n# 只允许符合条件的目录,非文本内容加载在中文分词情况下特别消耗cpu\nallow_file_path=["*.txt","*.md","*.html","*.js","*.ts","*.tsx","*.json","*.csv","*.xml","*.css","*.java","*.go","*.php","*.c","*.cc","*.cpp","*.h","*.py"]\n# 加载最多文件数量\nmax_file_num=5000\n# 可以加载的文件最大大小 默认是20MB 单位是字节\nmax_file_byte_size=20000000\n# 文件加载最大并发数量 太大的话会影响机械硬盘的性能\nmax_file_concurrency=2\n# 需要等待的目录时间间隔单位是毫秒,会让系统有时间释放临时内存\nawait_time_ms_len=500\n# 配合await_time_ms_len读取多少个文件后进行等待\nawait_file_num=100\n# 使用中文分词\nuse_zh_segmentation=true\n# 索引的存储类型 memory sqlite\nindex_storage_type=memory\n';t.ai_agent_item_dotenv=class{tool_error_max=50;tool_call_max=300;messages_show_max=100;messages_current_max=100},t.ai_agent_item_dotenv_default="\n# 核心参数\n# 工具报错最大尝试次数\ntool_error_max=50\n# 聊天循环最大次数\ntool_call_max=300\n\n# 聊天页面的参数\n# 聊天消息最多展示多少条\nmessages_show_max=100\n# 聊天消息最多发送最近的多少条去请求(这些设置更能节省token)\nmessages_current_max=100\n";t.json_params_default=JSON.stringify({stream:!0,thinking:{type:"disabled"}});!function(e){e.ffmpeg="ffmpeg",e.smartmontools="smartctl",e.ntfs_3g="ntfs-3g"}(n||(t.SysSoftware=n={}));t.SysSoftwareItem=class{id;installed;path}},17885(e,t,r){"use strict";t.SshPojo=void 0;const n=r(74207);class i{rows;cols;init_path;dockerId;http_token}t.SshPojo=class extends i{key;username;password;private_path;domain;port;cmd;dir;file;context;files;source;target;authorization;static getKey(e){return(0,n.fastHash)(`${e.domain}${e.port}${e.username}${e.authorization}`)}}},87760(e,t){"use strict";var r;t.SysCmdExePojo=t.SysCmd=t.DiskCheckInfo=t.DiskFilePojo=t.DiskDevicePojo=void 0;t.DiskDevicePojo=class{typeName;name;type;total};t.DiskFilePojo=class{name;fsType;mount;device_name;total;available};t.DiskCheckInfo=class{model_name;serial_number;firmware_version;smart_status;rotation_rate;power_on_time_hours;power_cycle_count;temperature;device_protocol;ata_smart_attributes=[];nvme_smart},function(e){e[e.mount=0]="mount"}(r||(t.SysCmd=r={}));t.SysCmdExePojo=class{type}},60126(e,t){"use strict";var r,n,i,s,a,o;t.UserData=t.UserAuth=t.UserBaseInfo=t.SysEnum=t.UserLogin=void 0;class c{username;password;confirm_password;hash_password;user_id}t.UserLogin=c,function(e){e[e.win=0]="win",e[e.linux=1]="linux",e[e.mac=2]="mac",e[e.unknown=3]="unknown"}(r||(t.SysEnum=r={}));t.UserBaseInfo=class{language;sys;sysSoftWare;runing_time_length;user_data;dir_user_upload_max_num;latest_version;sys_ai_is_open;docs_ai_is_open;process_env_run_env;sys_env;static get_now_dir(e){let t=e.user_data.cwd;return e.user_data.folder_item_now&&e.user_data.folder_items?.length&&(t=e.user_data.folder_items[e.user_data.folder_item_now-1].path),t}},function(e){e[e.sys_process_close=1]="sys_process_close",e[e.docker_container_update=2]="docker_container_update",e[e.docker_images_delete=3]="docker_images_delete",e[e.systemd_update=4]="systemd_update",e[e.vir_net=5]="vir_net",e[e.token_update=6]="token_update",e[e.code_auth=7]="code_auth",e[e.code_resource=8]="code_resource",e[e.code_api=9]="code_api",e[e.update_password=10]="update_password",e[e.net_site_tag_update=11]="net_site_tag_update",e[e.ssh_proxy_tag_update=12]="ssh_proxy_tag_update",e[e.http_proxy_tag_update=13]="http_proxy_tag_update",e[e.browser_proxy_tag_update=14]="browser_proxy_tag_update",e[e.rdp_proxy_tag_update=15]="rdp_proxy_tag_update",e[e.wol_proxy_tag_update=16]="wol_proxy_tag_update",e[e.rtsp_proxy_tag_update=17]="rtsp_proxy_tag_update",e[e.sys_disk_mount=18]="sys_disk_mount",e[e.ddns=19]="ddns",e[e.crypto_ssh_file=20]="crypto_ssh_file",e[e.outside_software_path=21]="outside_software_path",e[e.user_manage=22]="user_manage",e[e.filecat_file_delete_cut_rename=23]="filecat_file_delete_cut_rename",e[e.filecat_file_context_update_upload_created_copy_decompression=26]="filecat_file_context_update_upload_created_copy_decompression",e[e.filecat_file_context_update=27]="filecat_file_context_update",e[e.shell_cmd_check=28]="shell_cmd_check",e[e.role_manage=29]="role_manage",e[e.env_path_update=30]="env_path_update",e[e.pty_cmd_update=31]="pty_cmd_update",e[e.sys_protection_dir=32]="sys_protection_dir",e[e.recycle_file_save=33]="recycle_file_save",e[e.ssh_proxy=34]="ssh_proxy",e[e.http_proxy=35]="http_proxy",e[e.browser_proxy=36]="browser_proxy",e[e.rdp_proxy=37]="rdp_proxy",e[e.wol_proxy=38]="wol_proxy",e[e.rtsp_proxy=39]="rtsp_proxy",e[e.workflow_exe=40]="workflow_exe",e[e.workflow_exe_user=41]="workflow_exe_user",e[e.workflow_job=42]="workflow_job",e[e.workflow_api=43]="workflow_api",e[e.dir_upload_max_num=43]="dir_upload_max_num",e[e.http_proxy_download_cancel=44]="http_proxy_download_cancel",e[e.sys_env_setting_key=45]="sys_env_setting_key",e[e.nav_net_tag=46]="nav_net_tag",e[e.all_sys=47]="all_sys",e[e.shell_cmd_filecat_restart=48]="shell_cmd_filecat_restart",e[e.ai_agent_setting=49]="ai_agent_setting",e[e.ai_agent_page=50]="ai_agent_page",e[e.share_file=51]="share_file",e[e.sys_page=52]="sys_page",e[e.auth_router_page=53]="auth_router_page",e[e.shell_cmd_filecat_upgrade=54]="shell_cmd_filecat_upgrade",e[e.shell_cmd_filecat_kill_self=55]="shell_cmd_filecat_kill_self",e[e.ai_chat_cmd=56]="ai_chat_cmd",e[e.private_sys_env=57]="private_sys_env",e[e.tcp_proxy=85]="tcp_proxy"}(n||(t.UserAuth=n={})),function(e){e.block="",e.list="list",e.gallery="gallery"}(i||(i={})),Object.values(i),function(e){e.defualt="",e.time_minx_max="time_minx_max",e.time_max_min="time_max_min",e.size_min_max="size_min_max",e.size_max_min="size_max_min",e.name="name"}(s||(s={})),function(e){e.all="all",e.pagination="pagination"}(a||(a={})),function(e){e.current="current",e.time="time"}(o||(o={}));t.UserData=class extends c{cwd;access_dirs=[];not_access_dirs=[];only_read_dirs=[];note;id;language;access_cmd;not_access_cmd;theme;auth_list=[];is_root;folder_items;folder_item_now;protection_directory;bind_role_id;quick_cmd;file_quick_cmd;role_id;role_name;role_note;file_list_show_type;dir_show_type;not_pre_show_image;file_list_pagination_mode;file_time_show_type;file_list_zoom;upload_file_ignore;upload_file_ignore_list}},70550(e,t){"use strict";t.word_detection_js=void 0;class r{char;children;is_end;constructor(){this.children=new Map,this.char="",this.is_end=!1}}t.word_detection_js=class{root;size;constructor(){this.root=new r,this.size=0}add(e){if(!e)return;e=e.trim();let t=this.root;for(const n of e){let e=t.children.get(n);null==e&&(e=new r,e.char=n,t.children.set(n,e)),t=e}t.is_end=!0}clear(){this.root=void 0}detection_next_list_word(e,t){const r=[];!e||this.root;let n=this.root;for(let t=0;t<e.length;t++){const i=n.children.get(e[t]);if(null==i)return r;n=i}if(n.is_end&&r.push(e),!n.children)return r;const i=[],s=n.children.get(t);if(void 0!==s&&void 0!==s.children)for(const r of s.children.values())r.word=e+t,i.push(r);for(let e=0;e<i.length;e++){let t=i[e],n=t.word;for(;null!=t;){if(t.is_end){n+=t.char,r.push(n);break}if(void 0===t.children){if(t.is_end){n+=t.char,r.push(n);break}break}if(1!==t.children.size)break;n+=t.char,t=t.children.values().next().value}}return r}detection_next_one_word(e,t=void 0){if(!e||!this.root)return;let r=this.root;for(let t=0;t<e.length;t++){const n=r.children.get(e[t]);if(null==n)return;r=n}if(!r.is_end)for(void 0!==r.children&&(1===r.children.size?r=r.children.values().next().value:void 0!==t&&(r=r.children.get(t)));null!=r;){if(r.is_end)return e+=r.char;if(void 0===r.children)return r.is_end?e:void 0;if(1!==r.children.size)return e+r.char;e+=r.char,r=r.children.values().next().value}}}},48320(e,t){"use strict";t.ai_tools=t.ai_tools_search_docs=void 0,t.ai_tools_search_docs={type:"function",function:{name:"search_docs",description:"在本地知识库中搜索相关文档,根据关键词返回最匹配的文件内容",parameters:{type:"object",properties:{keywords:{type:"array",items:{type:"string"},description:"用于搜索知识库的关键词列表,keywords每个元素都是一个词而不是一句话"}},required:["keywords"]}}},t.ai_tools=[{type:"function",function:{name:"read_file",description:"获取本地文件的内容",parameters:{type:"object",properties:{path:{type:"string",description:"文件的路径"}},required:["path"]}}},{type:"function",function:{name:"list_files",description:"列出指定目录下的文件和文件夹",parameters:{type:"object",properties:{path:{type:"string",description:"要列出的目录路径,默认为当前目录"}},required:["path"]}}},{type:"function",function:{name:"edit_file",description:"\n编辑文件工具,支持六种模式:\noverwrite / replace / append / patch / insert / delete\n内容修改操作使用顺序 append overwrite patch insert replace\n ",parameters:{type:"object",properties:{path:{type:"string"},action:{type:"string",enum:["overwrite","replace","append","patch","insert","delete"]},content:{oneOf:[{description:"overwrite / append / patch,patch 使用 unified diff 文本,支持 @@、空格上下文、+新增、-删除、patch 行必须以空格/+/- 开头",type:"string"},{description:"replace operations",type:"array",items:{type:"object",properties:{find:{type:"string"},replace:{type:"string"}},required:["find"]}},{description:"insert",type:"object",properties:{line:{type:"number"},content:{oneOf:[{type:"string"},{type:"array",items:{type:"string"}}]}},required:["line","content"]},{description:"delete",type:"object",properties:{start:{type:"number"},end:{type:"number"}},required:["start","end"]}]}},required:["path","action"]}}},{type:"function",function:{name:"exec_cmd",description:"在服务器上执行系统命令,从而获取系统的信息,或者执行一些系统功能,要区分不同系统支持的命令情况,使用child_process的exec来执行不使用shell",parameters:{type:"object",properties:{cmd:{type:"string",description:"要执行的系统命令"},cwd:{type:"string",description:"命令执行的工作目录,默认是当前目录"}},required:["cmd"]}}},{type:"function",function:{name:"http_request",description:"发送 HTTP 请求以访问外部网络资源。支持 GET/POST/PUT/DELETE/PATCH 等方法,可设置请求头、查询参数和请求体。",parameters:{type:"object",properties:{url:{type:"string",description:"请求的完整 URL(仅支持 http 或 https)"},method:{type:"string",description:"HTTP 方法,如 GET、POST、PUT、DELETE、PATCH,默认 GET"},headers:{type:"object",additionalProperties:{type:"string"},description:"请求头(键值对)"},query:{type:"object",additionalProperties:{oneOf:[{type:"string"},{type:"number"},{type:"boolean"}]},description:"URL 查询参数"},body:{description:"请求体内容(对象将自动转为 JSON)"},timeout:{type:"number",description:"请求超时时间(毫秒),默认 10000"},max_length:{type:"number",description:"最大返回字符数,超出将被截断,默认 8000,-1s是不截断"}},required:["url"]}}},{type:"function",function:{name:"search_in_files",description:"在本地项目中跨文件搜索文本内容(类似 grep),返回匹配的文件、行号和内容",parameters:{type:"object",properties:{pattern:{type:"string",description:"要搜索的正则或关键词"},path:{type:"string",description:"搜索路径"},max_files:{type:"number",description:"最多扫描多少个文件,默认50"},max_matches_per_file:{type:"number",description:"每个文件最多匹配多少条结果,默认20"},ignore_case:{type:"boolean",description:"是否忽略大小写,默认true"}},required:["pattern"]}}},{type:"function",function:{name:"create_fs_entry",description:"创建文件或目录,支持初始化文件内容和递归创建目录",parameters:{type:"object",properties:{path:{type:"string",description:"文件或目录路径"},type:{type:"string",enum:["file","dir"],description:"创建类型:file=文件,dir=目录"},content:{type:"string",description:"文件初始内容,仅在 type=file 时生效"},recursive:{type:"boolean",description:"是否递归创建目录,仅在 type=dir 时生效,默认 true"}},required:["path","type"]}}}]},2280(e,t,r){"use strict";var n=this&&this.__decorate||function(e,t,r,n){var i,s=arguments.length,a=s<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,r):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(e,t,r,n);else for(var o=e.length-1;o>=0;o--)(i=e[o])&&(a=(s<3?i(a):s>3?i(t,r,a):i(t,r))||a);return s>3&&a&&Object.defineProperty(t,r,a),a},i=this&&this.__metadata||function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)},s=this&&this.__param||function(e,t){return function(r,n){t(r,n,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.Ai_AgentController=void 0;const a=r(4336),o=r(68397),c=r(3683),l=r(60126),u=r(15133),p=r(298),d=r(89477),h=r(33068),f=r(18536),m=r(38423);let g=class{async chat(e,t,r){c.userService.check_user_auth(r.headers.authorization,l.UserAuth.ai_agent_page),t.setHeader("Content-Type","text/event-stream; charset=utf-8"),t.setHeader("Cache-Control","no-cache"),t.setHeader("Connection","keep-alive"),t.setHeader("X-Accel-Buffering","no");const n=r.headers.authorization;let i;try{i=await o.ai_agentService.chat(e.messages,t,n)}catch(e){if(console.log(e),!t.writableEnded&&!t.destroyed){const r="string"==typeof e?e:e?.message||"AI service error";o.ai_agentService.write_to_res(t,r),t.write("data: [DONE]\n\n"),t.end()}}return i}async get_info(e){const t=e.wss;return c.userService.check_user_auth(t.token,l.UserAuth.ai_agent_setting),o.ai_agentService.all_wss_set.add(t),t.setClose(()=>{o.ai_agentService.all_wss_set.delete(t)}),o.ai_agentService.docs_info}async ai_load_one_file(e,t){return c.userService.check_user_auth(e.headers.authorization,l.UserAuth.ai_agent_setting),await o.ai_agentService.load_one_file(e.headers.authorization,t.param_path),(0,h.Sucess)("")}async docs_on_get(e){return c.userService.check_user_auth(e.headers.authorization,l.UserAuth.ai_agent_setting),(0,h.Sucess)(o.ai_agentService.docs_switch_get())}async docs_on_set(e,t){return c.userService.check_user_auth(e.headers.authorization,l.UserAuth.ai_agent_setting),f.DataUtil.set(m.data_common_key.ai_agent_status,t.status),o.ai_agentService.docs_switch_get()?(await o.ai_agentService.init(),d.Wss.sendToAllClient(p.CmdType.ai_load_info,o.ai_agentService.docs_info,o.ai_agentService.all_wss_set)):await o.ai_agentService.close_index(),(0,h.Sucess)("")}async ai_del(e,t){return c.userService.check_user_auth(e.headers.authorization,l.UserAuth.ai_agent_setting),o.ai_agentService.delete_index_with_progress(t.param_path).catch(console.error),(0,h.Sucess)("")}};t.Ai_AgentController=g,n([(0,a.Post)("/chat"),s(0,(0,a.Body)()),s(1,(0,a.Res)()),s(2,(0,a.Req)()),i("design:type",Function),i("design:paramtypes",[Object,Object,Object]),i("design:returntype",Promise)],g.prototype,"chat",null),n([(0,u.msg)(p.CmdType.ai_load_info),i("design:type",Function),i("design:paramtypes",[p.WsData]),i("design:returntype",Promise)],g.prototype,"get_info",null),n([(0,a.Post)("/ai_load_one_file"),s(0,(0,a.Req)()),s(1,(0,a.Body)()),i("design:type",Function),i("design:paramtypes",[Object,Object]),i("design:returntype",Promise)],g.prototype,"ai_load_one_file",null),n([(0,a.Get)("/docs_on_get"),s(0,(0,a.Req)()),i("design:type",Function),i("design:paramtypes",[Object]),i("design:returntype",Promise)],g.prototype,"docs_on_get",null),n([(0,a.Post)("/docs_on_set"),s(0,(0,a.Req)()),s(1,(0,a.Body)()),i("design:type",Function),i("design:paramtypes",[Object,Object]),i("design:returntype",Promise)],g.prototype,"docs_on_set",null),n([(0,a.Post)("/ai_del"),s(0,(0,a.Req)()),s(1,(0,a.Body)()),i("design:type",Function),i("design:paramtypes",[Object,Object]),i("design:returntype",Promise)],g.prototype,"ai_del",null),t.Ai_AgentController=g=n([(0,a.JsonController)("/ai_agent")],g)},91990(e,t,r){"use strict";var n,i=this&&this.__createBinding||(Object.create?function(e,t,r,n){void 0===n&&(n=r);var i=Object.getOwnPropertyDescriptor(t,r);i&&!("get"in i?!t.__esModule:i.writable||i.configurable)||(i={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,n,i)}:function(e,t,r,n){void 0===n&&(n=r),e[n]=t[r]}),s=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__importStar||(n=function(e){return n=Object.getOwnPropertyNames||function(e){var t=[];for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[t.length]=r);return t},n(e)},function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r=n(e),a=0;a<r.length;a++)"default"!==r[a]&&i(t,e,r[a]);return s(t,e),t});Object.defineProperty(t,"__esModule",{value:!0}),t.ai_agentMcpService=t.AiMcpRuntimeService=void 0;const o=r(1073);class c{clients=new Map;toolMap=new Map;toolToClient=new Map;clientTools=new Map;loadingPromise=null;buildClientKey(e,t){return`mcp_${t}_${(0,o.sanitizeName)(e.name||e.note)}`}createClient(e,t){return"http"===e.transport?e.endpoint?new o.HttpMcpTransport({endpoint:e.endpoint,headers:(0,o.parseHeaderText)(e.headers)}):null:e.command?new o.StdioMcpServerClient(e,t):null}async startClient(e,t){if(!e?.open)return;const r=this.buildClientKey(e,t);await this.closeClient(r);const n=this.createClient(e,r);if(n)try{await n.start(),this.clients.set(r,n);const e=[];for(const t of n.runtime_tools){const n=`mcp__${(0,o.sanitizeName)(r)}__${(0,o.sanitizeName)(t.tool_name)}`,i={...t,runtime_name:n};this.toolMap.set(n,i),this.toolToClient.set(n,{clientKey:r,originalToolName:t.tool_name}),e.push(n)}this.clientTools.set(r,e),console.log(`MCP service ${r} loaded ${n.runtime_tools?.length??0} tools`)}catch(e){console.error(`[MCP ${r}] start failed`,e),await n.close().catch(()=>{})}}async closeClient(e){const t=this.clients.get(e);this.clients.delete(e),this.clientTools.delete(e);for(const[t,r]of[...this.toolToClient.entries()])r.clientKey===e&&(this.toolToClient.delete(t),this.toolMap.delete(t));t&&await t.close().catch(()=>{})}async reload(){this.loadingPromise&&await this.loadingPromise,this.loadingPromise=this.reloadInner();try{await this.loadingPromise}finally{this.loadingPromise=null}}async reloadInner(){await this.close();const{settingService:e}=await Promise.resolve().then(()=>a(r(48299))),t=e.ai_mcp_setting().list??[];for(let e=0;e<t.length;e++)await this.startClient(t[e],e)}async reloadServer(e){const{settingService:t}=await Promise.resolve().then(()=>a(r(48299))),n=(t.ai_mcp_setting().list??[])[e];if(!n)throw new Error(`未找到 MCP 服务: ${e}`);await this.startClient(n,e);return(await this.getServerToolGroups()).find(t=>t.index===e)??null}async close(){const e=[...this.clients.keys()];await Promise.all(e.map(e=>this.closeClient(e))),this.clients.clear(),this.toolMap.clear(),this.toolToClient.clear(),this.clientTools.clear()}async getServerToolGroups(){const{settingService:e}=await Promise.resolve().then(()=>a(r(48299)));return(e.ai_mcp_setting().list??[]).map((e,t)=>{const r=this.buildClientKey(e,t),n=(this.clientTools.get(r)??[]).map(e=>{const t=this.toolMap.get(e);return t?{runtime_name:t.runtime_name,tool_name:t.tool_name,display_name:t.display_name,description:t.description,input_schema:t.input_schema}:null}).filter(Boolean);return{index:t,key:r,name:e.name||"",note:e.note,transport:e.transport??"stdio",open:!!e.open,loaded:this.clients.has(r),tool_count:n.length,tools:n,error:void 0}})}getTools(){return[...this.toolMap.values()].map(e=>({type:"function",function:{name:e.runtime_name,description:e.description?`[${e.server_label}] ${e.description}`:`[${e.server_label}] ${e.tool_name}`,parameters:e.input_schema??{type:"object",properties:{}}}}))}getToolInfo(e,t){const r=this.toolMap.get(e);return r?{get_name:()=>`${r.server_label}/${r.tool_name}`,get_params:()=>` ${JSON.stringify(t??{}).slice(0,500)}`}:null}hasTool(e){return this.toolToClient.has(e)}async callTool(e,t){const r=this.toolToClient.get(e);if(!r)throw new Error(`未找到 MCP 工具: ${e}`);const n=this.clients.get(r.clientKey);if(!n)throw new Error(`MCP 客户端未启动: ${r.clientKey}`);n.ensureStarted&&await n.ensureStarted();const i=await n.request("tools/call",{name:r.originalToolName,arguments:t});return(0,o.getToolTextContent)(i)}}t.AiMcpRuntimeService=c,t.ai_agentMcpService=new c},68397(e,t,r){"use strict";var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.ai_agentService=t.Ai_agentService=t.ai_config_search_doc=t.ai_config_env=t.ai_config=void 0;const i=r(6937),s=r(48299),a=r(91990),o=n(r(16928)),c=r(3683),l=r(50585),u=r(79094),p=r(1776),d=r(74207),h=r(84189),f=r(9794),m=r(89477),g=r(298),y=r(20928),_=r(11153),b=r(9718),v=r(57525),w=r(18536),S=r(38423),E=r(19787),k=r(71920),x=r(38863),A=r(16165),T=r(23729),{cut:C,cut_all:P,cut_for_search:O,tokenize:I,add_word:R}=r(22880);function L(e){return/[\u4e00-\u9fa5]/.test(e)}t.ai_config_env=new l.ai_agent_item_dotenv,t.ai_config_search_doc=new l.ai_docs_setting_param;class D{docs_data_map=new Map;docs_info=new l.ai_docs_load_info;all_wss_set=new Set;async search_docs({keywords:e}){const r=new Map,n={};for(const t of e)if(t&&(n[t]=1,L(t))){for(const e of O(t,!0))e&&(n[e]=1);const e=(0,E.pinyin)(t,{toneType:"none"});e&&(n[e.replace(/\s+/g,"")]=1)}let i=[...new Set(Object.keys(n).map(e=>