@qqbrowser/qbot-claw-launcher 0.9.60 → 0.9.61
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.
- package/dist/authMiddleware.js +1 -1
- package/dist/filePicker.js +10 -10
- package/dist/fileSecurityCheck.js +1 -1
- package/dist/installer.js +3 -3
- package/dist/server.js +2 -2
- package/dist/version.js +1 -1
- package/package.json +1 -1
package/dist/authMiddleware.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.verifyServiceToken=u,exports.verifyOrigin=s,exports.authenticateRequest=o;const
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.verifyServiceToken=u,exports.verifyOrigin=s,exports.authenticateRequest=o;const n=["https://quickstart.imtt.qq.com","https://quickstarttest.imtt.qq.com","https://browser.qq.com"];function u(t,e){return!0}function s(t){let e=t.headers.origin;if(!e){const r=t.headers.referer;if(r)try{e=new URL(r).origin}catch{}}if(!e||e.startsWith("chrome-extension://")||e.startsWith("moz-extension://"))return!0;try{const r=new URL(e).origin;return n.some(i=>{try{return new URL(i).origin===r}catch{return!1}})}catch{return!1}}function o(t,e){return u(t,e)?s(t)?{ok:!0,statusCode:200,message:""}:{ok:!1,statusCode:403,message:"\u8BF7\u6C42\u6765\u6E90\u4E0D\u5728\u5141\u8BB8\u5217\u8868\u4E2D"}:{ok:!1,statusCode:401,message:"\u672A\u6388\u6743\u8BBF\u95EE\uFF1A\u7F3A\u5C11\u6709\u6548\u7684 ServiceToken"}}
|
package/dist/filePicker.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.isFilePickerBusy
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.isFilePickerBusy=g,exports.showFilePicker=B;const f=require("child_process"),E=6e4;let d=!1;function g(){return d}async function B(l={}){if(d)throw new Error("\u5DF2\u6709\u6587\u4EF6\u9009\u62E9\u5BF9\u8BDD\u6846\u6B63\u5728\u663E\u793A");d=!0;try{const r=process.platform;switch(r){case"darwin":return await y(l);case"win32":return await x(l);case"linux":return await O(l);default:throw new Error(`\u4E0D\u652F\u6301\u7684\u64CD\u4F5C\u7CFB\u7EDF\u5E73\u53F0: ${r}`)}}finally{d=!1}}function y(l){const{extensions:r=[],multiple:n=!1,title:c="\u9009\u62E9\u6587\u4EF6",allowDirectory:F=!1}=l;let t;if(F)t=`choose folder with prompt "${h(c)}"`,n&&(t+=" with multiple selections allowed");else if(t=`choose file with prompt "${h(c)}"`,n&&(t+=" with multiple selections allowed"),r.length>0){const u=r.map(e=>`"${e.replace(/^\./,"")}"`).join(", ");t+=` of type {${u}}`}const i=n?`set selectedItems to (${t})
|
|
2
2
|
set posixPaths to ""
|
|
3
3
|
repeat with anItem in selectedItems
|
|
4
4
|
set posixPaths to posixPaths & POSIX path of anItem & linefeed
|
|
5
5
|
end repeat
|
|
6
6
|
return posixPaths`:`set selectedItem to (${t})
|
|
7
|
-
return POSIX path of selectedItem`;return new Promise((u,e)=>{const p=(0,f.execFile)("osascript",["-e",i],{timeout:E},(s,a,
|
|
8
|
-
`).map(
|
|
7
|
+
return POSIX path of selectedItem`;return new Promise((u,e)=>{const p=(0,f.execFile)("osascript",["-e",i],{timeout:E},(s,a,o)=>{if(s){if(s.killed){e(new Error("\u6587\u4EF6\u9009\u62E9\u5BF9\u8BDD\u6846\u8D85\u65F6\uFF0860\u79D2\uFF09"));return}if(o&&o.includes("User canceled")){u(null);return}if(s.code===1){u(null);return}e(new Error(`macOS \u6587\u4EF6\u9009\u62E9\u5931\u8D25: ${o||s.message}`));return}const m=a.trim().split(`
|
|
8
|
+
`).map($=>$.trim()).filter(Boolean);u(m.length>0?m:null)})})}function h(l){return l.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}function x(l){const{extensions:r=[],multiple:n=!1,title:c="\u9009\u62E9\u6587\u4EF6",allowDirectory:F=!1}=l;let t;if(F)t=`
|
|
9
9
|
Add-Type -AssemblyName System.Windows.Forms
|
|
10
10
|
$dialog = New-Object System.Windows.Forms.FolderBrowserDialog
|
|
11
11
|
$dialog.Description = '${w(c)}'
|
|
@@ -15,19 +15,19 @@ if ($result -eq [System.Windows.Forms.DialogResult]::OK) {
|
|
|
15
15
|
Write-Output $dialog.SelectedPath
|
|
16
16
|
} else {
|
|
17
17
|
Write-Output ''
|
|
18
|
-
}`;else{let i="\u6240\u6709\u6587\u4EF6 (*.*)|*.*";if(
|
|
18
|
+
}`;else{let i="\u6240\u6709\u6587\u4EF6 (*.*)|*.*";if(r.length>0){const u=r.map(e=>`*${e.startsWith(".")?e:"."+e}`).join(";");i=`\u5141\u8BB8\u7684\u6587\u4EF6\u7C7B\u578B (${r.map(e=>e.startsWith(".")?e:"."+e).join(", ")})|${u}|\u6240\u6709\u6587\u4EF6 (*.*)|*.*`}t=`
|
|
19
19
|
Add-Type -AssemblyName System.Windows.Forms
|
|
20
20
|
$dialog = New-Object System.Windows.Forms.OpenFileDialog
|
|
21
21
|
$dialog.Title = '${w(c)}'
|
|
22
22
|
$dialog.Filter = '${w(i)}'
|
|
23
|
-
$dialog.Multiselect = $${
|
|
23
|
+
$dialog.Multiselect = $${n?"true":"false"}
|
|
24
24
|
$result = $dialog.ShowDialog()
|
|
25
25
|
if ($result -eq [System.Windows.Forms.DialogResult]::OK) {
|
|
26
26
|
$dialog.FileNames | ForEach-Object { Write-Output $_ }
|
|
27
27
|
} else {
|
|
28
28
|
Write-Output ''
|
|
29
|
-
}`}return new Promise((i,u)=>{(0,f.execFile)("powershell.exe",["-NoProfile","-NonInteractive","-Command",t],{timeout:E},(e,p,s)=>{if(e){if(e.killed){u(new Error("\u6587\u4EF6\u9009\u62E9\u5BF9\u8BDD\u6846\u8D85\u65F6\uFF0860\u79D2\uFF09"));return}u(new Error(`Windows \u6587\u4EF6\u9009\u62E9\u5931\u8D25: ${s||e.message}`));return}const a=p.trim();if(!a){i(null);return}const
|
|
30
|
-
`).map(m=>m.trim()).filter(Boolean);i(
|
|
31
|
-
`),!F&&
|
|
32
|
-
`).map(m=>m.trim()).filter(Boolean);i(
|
|
33
|
-
`).map(m=>m.trim()).filter(Boolean);i(
|
|
29
|
+
}`}return new Promise((i,u)=>{(0,f.execFile)("powershell.exe",["-NoProfile","-NonInteractive","-Command",t],{timeout:E},(e,p,s)=>{if(e){if(e.killed){u(new Error("\u6587\u4EF6\u9009\u62E9\u5BF9\u8BDD\u6846\u8D85\u65F6\uFF0860\u79D2\uFF09"));return}u(new Error(`Windows \u6587\u4EF6\u9009\u62E9\u5931\u8D25: ${s||e.message}`));return}const a=p.trim();if(!a){i(null);return}const o=a.split(`
|
|
30
|
+
`).map(m=>m.trim()).filter(Boolean);i(o.length>0?o:null)})})}function w(l){return l.replace(/'/g,"''")}async function O(l){if(await D("zenity"))return P(l);if(await D("kdialog"))return W(l);throw new Error("Linux \u7CFB\u7EDF\u672A\u5B89\u88C5 zenity \u6216 kdialog\uFF0C\u65E0\u6CD5\u5F39\u51FA\u6587\u4EF6\u9009\u62E9\u5BF9\u8BDD\u6846\u3002\u8BF7\u5B89\u88C5\u5176\u4E2D\u4E4B\u4E00\uFF1Asudo apt install zenity \u6216 sudo apt install kdialog")}function D(l){return new Promise(r=>{(0,f.execFile)("which",[l],n=>{r(!n)})})}function P(l){const{extensions:r=[],multiple:n=!1,title:c="\u9009\u62E9\u6587\u4EF6",allowDirectory:F=!1}=l,t=["--file-selection",`--title=${c}`];if(F&&t.push("--directory"),n&&t.push("--multiple",`--separator=
|
|
31
|
+
`),!F&&r.length>0){const i=r.map(u=>`*${u.startsWith(".")?u:"."+u}`).join(" ");t.push(`--file-filter=\u5141\u8BB8\u7684\u6587\u4EF6\u7C7B\u578B | ${i}`),t.push("--file-filter=\u6240\u6709\u6587\u4EF6 | *")}return new Promise((i,u)=>{(0,f.execFile)("zenity",t,{timeout:E},(e,p,s)=>{if(e){if(e.killed){u(new Error("\u6587\u4EF6\u9009\u62E9\u5BF9\u8BDD\u6846\u8D85\u65F6\uFF0860\u79D2\uFF09"));return}if(e.code===1){i(null);return}u(new Error(`zenity \u6587\u4EF6\u9009\u62E9\u5931\u8D25: ${s||e.message}`));return}const a=p.trim();if(!a){i(null);return}const o=a.split(`
|
|
32
|
+
`).map(m=>m.trim()).filter(Boolean);i(o.length>0?o:null)})})}function W(l){const{extensions:r=[],multiple:n=!1,title:c="\u9009\u62E9\u6587\u4EF6",allowDirectory:F=!1}=l;let t;if(F)t=["--getexistingdirectory",process.env.HOME||"/"];else{let i="";r.length>0&&(i=`${r.map(u=>`*${u.startsWith(".")?u:"."+u}`).join(" ")} | \u5141\u8BB8\u7684\u6587\u4EF6\u7C7B\u578B`),n?t=["--getopenfilename",process.env.HOME||"/",i,"--multiple","--separate-output"]:t=["--getopenfilename",process.env.HOME||"/",i]}return t.push("--title",c),new Promise((i,u)=>{(0,f.execFile)("kdialog",t,{timeout:E},(e,p,s)=>{if(e){if(e.killed){u(new Error("\u6587\u4EF6\u9009\u62E9\u5BF9\u8BDD\u6846\u8D85\u65F6\uFF0860\u79D2\uFF09"));return}if(e.code===1){i(null);return}u(new Error(`kdialog \u6587\u4EF6\u9009\u62E9\u5931\u8D25: ${s||e.message}`));return}const a=p.trim();if(!a){i(null);return}const o=a.split(`
|
|
33
|
+
`).map(m=>m.trim()).filter(Boolean);i(o.length>0?o:null)})})}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var r=exports&&exports.__importDefault||function(
|
|
1
|
+
"use strict";var r=exports&&exports.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.BLOCKED_DIRS=void 0,exports.getMimeType=s,exports.validateFilePath=p,exports.readFileInfo=m,exports.readFileAsBase64=g;const n=r(require("fs")),o=r(require("path")),v=require("./config");exports.BLOCKED_DIRS=process.platform==="win32"?["C:\\Windows","C:\\Program Files","C:\\Program Files (x86)","C:\\ProgramData"]:["/etc","/var","/usr","/bin","/sbin","/boot","/root","/sys","/proc","/dev","/lib","/lib64"];const x=o.default.basename(v.QBOT_CLAW_DIR),E={".pdf":"application/pdf",".doc":"application/msword",".docx":"application/vnd.openxmlformats-officedocument.wordprocessingml.document",".xls":"application/vnd.ms-excel",".xlsx":"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",".ppt":"application/vnd.ms-powerpoint",".pptx":"application/vnd.openxmlformats-officedocument.presentationml.presentation",".txt":"text/plain",".csv":"text/csv",".rtf":"application/rtf",".md":"text/markdown",".jpg":"image/jpeg",".jpeg":"image/jpeg",".png":"image/png",".gif":"image/gif",".bmp":"image/bmp",".svg":"image/svg+xml",".webp":"image/webp",".ico":"image/x-icon",".tiff":"image/tiff",".tif":"image/tiff",".mp3":"audio/mpeg",".wav":"audio/wav",".ogg":"audio/ogg",".flac":"audio/flac",".aac":"audio/aac",".mp4":"video/mp4",".avi":"video/x-msvideo",".mov":"video/quicktime",".wmv":"video/x-ms-wmv",".webm":"video/webm",".mkv":"video/x-matroska",".zip":"application/zip",".rar":"application/vnd.rar",".7z":"application/x-7z-compressed",".tar":"application/x-tar",".gz":"application/gzip",".bz2":"application/x-bzip2",".json":"application/json",".xml":"application/xml",".html":"text/html",".htm":"text/html",".css":"text/css",".js":"application/javascript",".ts":"application/typescript",".py":"text/x-python",".java":"text/x-java-source",".c":"text/x-c",".cpp":"text/x-c++src",".h":"text/x-c",".sh":"application/x-sh",".yaml":"text/yaml",".yml":"text/yaml",".toml":"application/toml",".ini":"text/plain",".log":"text/plain",".wasm":"application/wasm",".exe":"application/x-msdownload",".dmg":"application/x-apple-diskimage",".iso":"application/x-iso9660-image"};function s(e){const t=o.default.extname(e).toLowerCase();return E[t]||"application/octet-stream"}function p(e){if(e.includes("\0"))return{valid:!1,reason:"\u8DEF\u5F84\u5305\u542B\u975E\u6CD5\u5B57\u7B26"};const t=o.default.resolve(e),a=l(t);if(!a.valid)return a;const i=c(t);if(!i.valid)return i;if(!n.default.existsSync(t))return{valid:!1,reason:`\u6587\u4EF6\u6216\u76EE\u5F55\u4E0D\u5B58\u5728: ${t}`};let u;try{u=n.default.realpathSync(t)}catch{return{valid:!1,reason:"\u65E0\u6CD5\u89E3\u6790\u6587\u4EF6\u771F\u5B9E\u8DEF\u5F84"}}if(u!==t){if(!l(u).valid)return{valid:!1,reason:"\u7981\u6B62\u8BBF\u95EE\u7CFB\u7EDF\u654F\u611F\u76EE\u5F55"};if(!c(u).valid)return{valid:!1,reason:"\u7981\u6B62\u8BBF\u95EE\u9690\u85CF\u6587\u4EF6\u6216\u76EE\u5F55"}}return{valid:!0}}function l(e){const t=e.toLowerCase();for(const a of exports.BLOCKED_DIRS)if(t===a.toLowerCase()||t.startsWith(a.toLowerCase()+o.default.sep))return{valid:!1,reason:"\u7981\u6B62\u8BBF\u95EE\u7CFB\u7EDF\u654F\u611F\u76EE\u5F55"};return{valid:!0}}function c(e){const t=e.split(o.default.sep);for(const a of t)if(a.startsWith(".")&&a!=="."&&a!==".."&&a!==x)return{valid:!1,reason:"\u7981\u6B62\u8BBF\u95EE\u9690\u85CF\u6587\u4EF6\u6216\u76EE\u5F55"};return{valid:!0}}function m(e,t){const a=p(e);if(!a.valid)return{ok:!1,path:e,reason:a.reason};const i=o.default.resolve(e);let u;try{u=n.default.statSync(i)}catch{return{ok:!1,path:e,reason:"\u65E0\u6CD5\u8BFB\u53D6\u6587\u4EF6\u4FE1\u606F"}}if(u.isDirectory())return{ok:!1,path:e,reason:"\u8DEF\u5F84\u6307\u5411\u4E00\u4E2A\u76EE\u5F55\uFF0C\u4E0D\u662F\u6587\u4EF6"};if(u.size>t){const f=(u.size/1024/1024).toFixed(2),F=(t/1024/1024).toFixed(2);return{ok:!1,path:e,reason:`\u6587\u4EF6\u5927\u5C0F (${f}MB) \u8D85\u8FC7\u9650\u5236 (${F}MB)`}}const d=s(i);return{ok:!0,name:o.default.basename(i),path:i,size:u.size,mimeType:d}}function g(e,t){const a=m(e,t);if(!a.ok)return a;try{const i=n.default.readFileSync(a.path);return{...a,content:i.toString("base64")}}catch(i){return{ok:!1,path:e,reason:`\u6587\u4EF6\u8BFB\u53D6\u5931\u8D25: ${i.message}`}}}
|
package/dist/installer.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var P=exports&&exports.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.PYTHON_DIR=exports.isInstalling=exports.installState=void 0,exports.runQBotClaw=C,exports.configAndRunQBotClaw=N,exports.runInstall=T;const c=P(require("fs")),u=P(require("path")),_=require("child_process"),r=require("./config"),w=require("./utils"),p=require("./state"),f=require("./quarantine"),a=require("./reportLog"),d=require("./service");function g(t,o,s,i){if(t&&t.writable){const e=o>0?Math.round(s/o*1e4)/100:0;try{t.write(JSON.stringify({status:"downloading",progress:e,totalSteps:o,currentStep:s,message:i})+`
|
|
2
2
|
`)}catch{}}}exports.installState={status:"idle",message:"\u672A\u5F00\u59CB"},exports.isInstalling=!1,exports.PYTHON_DIR=u.default.join(r.QBOT_CLAW_DIR,"python");function C(t,o){return new Promise(s=>{const i=(0,_.spawn)(r.QBOTCLAW_BIN,t,{stdio:["ignore","pipe","pipe"],env:{PATH:r.NODE_BIN_DIR,HOME:process.env.HOME,OPENCLAW_TELEMETRY_GALIELO_GUID:process.env.QB_GUID||"",OPENCLAW_TELEMETRY_GALIELO_QIEMI36:process.env.QB_QIMEI36||""}});(0,a.log)(`[QBotClaw] \u6267\u884C: QBotClaw ${t.join(" ")}`),i.stdout.on("data",e=>{const n=e.toString();if(o&&o.writable)try{o.write(n)}catch{}}),i.stderr.on("data",e=>{const n=e.toString();if(o&&o.writable)try{o.write(n)}catch{}}),i.on("close",e=>{(0,a.log)(`[QBotClaw] \u6267\u884C\u5B8C\u6210\uFF0C\u9000\u51FA\u7801: ${e}`),s()}),i.on("error",e=>{(0,a.log)(`[QBotClaw] \u542F\u52A8\u5931\u8D25: ${e.message}`),s()})})}function I(){c.default.existsSync(r.QBOT_CLAW_DIR)||c.default.mkdirSync(r.QBOT_CLAW_DIR,{recursive:!0})}function m(){const t=u.default.join(exports.PYTHON_DIR,"pip.conf");if(c.default.existsSync(t)){(0,a.log)("pip.conf \u5DF2\u5B58\u5728\uFF0C\u8DF3\u8FC7");return}const o=["[global]","index-url = https://mirrors.tencent.com/pypi/simple/",`cache-dir = ${u.default.join(exports.PYTHON_DIR,".pip-cache")}`,"","[install]",`prefix = ${exports.PYTHON_DIR}`,""].join(`
|
|
3
|
-
`);c.default.writeFileSync(t,o,"utf-8"),(0,a.log)(`\u5DF2\u5199\u5165 pip.conf: ${t}`)}async function O(t){if(c.default.existsSync(r.MCPORTER_BIN)){(0,a.log)("mcporter \u5DF2\u5B89\u88C5\uFF0C\u8DF3\u8FC7");return}(0,a.log)("\u5F00\u59CB\u5B89\u88C5 mcporter..."),await new Promise((o,s)=>{const i=(0,_.spawn)(r.NPM_BIN,["--userconfig",r.NPM_RC,"install","-g","mcporter"],{stdio:["ignore","pipe","pipe"],env:{...process.env,PATH:`${u.default.dirname(r.NPM_BIN)}:${process.env.PATH}`}});i.stdout.on("data",e=>{const n=`[mcporter] ${e.toString().trim()}`;(0,a.log)(n),g(t,0,0,n)}),i.stderr.on("data",e=>{const n=`[mcporter] ${e.toString().trim()}`;(0,a.log)(n),g(t,0,0,n)}),i.on("close",e=>{e===0?((0,a.log)("mcporter \u5B89\u88C5\u6210\u529F"),o()):s(new Error(`mcporter \u5B89\u88C5\u5931\u8D25\uFF0C\u9000\u51FA\u7801: ${e}`))}),i.on("error",s)})}function A(t,o){return new Promise((s,i)=>{const e=(0,_.spawn)(r.NPM_BIN,["--userconfig",r.NPM_RC,...t],{stdio:["ignore","pipe","pipe"],env:{...process.env,PATH:`${u.default.dirname(r.NPM_BIN)}:${process.env.PATH}`}});e.stdout.on("data",n=>{const l=`[npm] ${n.toString().trim()}`;(0,a.log)(l)}),e.stderr.on("data",n=>{const l=`[npm] ${n.toString().trim()}`;(0,a.log)(l)}),e.on("close",n=>{n===0?((0,a.log)(`${o} \u6210\u529F`),s()):i(new Error(`${o} \u5931\u8D25\uFF0C\u9000\u51FA\u7801: ${n}`))}),e.on("error",i)})}async function E(t){const o=`${r.NPM_PACKAGE_NAME}@${t}`;(0,a.log)(`\u5F00\u59CB\u5B89\u88C5 ${o}\uFF08--ignore-scripts\uFF0C\u4EC5\u4E0B\u8F7D\u89E3\u538B\uFF09...`),await A(["install","-g","--ignore-scripts",o],`${o} \u4E0B\u8F7D\u89E3\u538B`)}async function y(t){const o=`${r.NPM_PACKAGE_NAME}@${t}`;(0,a.log)("\u5F00\u59CB npm rebuild\uFF08\u6267\u884C postinstall \u811A\u672C\uFF09..."),await A(["rebuild","-g",r.NPM_PACKAGE_NAME],`${o} rebuild`),(0,a.log)(`${o} \u5B89\u88C5\u6210\u529F`)}async function $(t,o,s,i){let e;if((0,a.log)(`\u8986\u76D6\u7528\u6237\u5DF2\u6709\u914D\u7F6E: ${i}`),!i&&c.default.existsSync(r.QBOT_CLAW_CONFIG_PATH))e=r.QBOT_CLAW_CONFIG_PATH,(0,a.log)(`\u4F7F\u7528\u5DF2\u6709\u914D\u7F6E\u6587\u4EF6: ${e}`);else{const l=u.default.join(r.NPM_GLOBAL_MODULES,r.NPM_PACKAGE_NAME,"preset-config.json");if(!c.default.existsSync(l)){(0,a.log)(`npm \u5168\u5C40\u5B89\u88C5\u76EE\u5F55\u4E2D\u7684\u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728\uFF0C\u8DF3\u8FC7\u914D\u7F6E\u5199\u5165: ${l}`);return}e=l,(0,a.log)(`\u4F7F\u7528 npm \u5168\u5C40\u5B89\u88C5\u76EE\u5F55\u4E2D\u7684\u914D\u7F6E: ${e}`)}let n;try{n=JSON.parse(c.default.readFileSync(e,"utf-8")),(0,a.log)(`\u5DF2\u8BFB\u53D6\u914D\u7F6E: ${e}`)}catch(l){(0,a.log)(`\u8BFB\u53D6\u914D\u7F6E\u5931\u8D25: ${e}\uFF0C${l.message}\uFF0C\u8DF3\u8FC7\u914D\u7F6E\u5199\u5165`);return}t!==void 0&&(n.gateway={...n.gateway??{},port:t},(0,a.log)(`\u5DF2\u5C06 gateway.port=${t} \u5199\u5165\u914D\u7F6E`)),n.plugins=n.plugins??{},n.plugins.entries=n.plugins.entries??{},n.plugins.entries["x5use-browser-control"]=n.plugins.entries["x5use-browser-control"]??{},n.plugins.entries["x5use-browser-control"].config={...n.plugins.entries["x5use-browser-control"].config??{},wsPort:s,httpPort:o},(0,a.log)(`\u5DF2\u5C06 x5use-browser-control wsPort=${s}, httpPort=${o} \u5199\u5165\u914D\u7F6E`),c.default.writeFileSync(r.QBOT_CLAW_CONFIG_PATH,JSON.stringify(n,null,2),"utf-8"),(0,a.log)(`\u914D\u7F6E\u6587\u4EF6\u5DF2\u5199\u5165: ${r.QBOT_CLAW_CONFIG_PATH}`)}async function N(t){const o=(0,p.readState)();let s;o.gatewayPort&&!await(0,p.isPortAvailable)(o.gatewayPort)?(s=o.gatewayPort,(0,a.log)(`\u68C0\u6D4B\u5230 QBotClaw gateway \u5DF2\u5728\u7AEF\u53E3 ${s} \u8FD0\u884C\uFF0C\u590D\u7528\u539F\u7AEF\u53E3`)):s=await(0,w.findAvailablePort)(),(0,a.log)(`\u540E\u53F0\u542F\u52A8 QBotClaw gateway run --port ${s} --force`);const i=await(0,w.findAvailablePort)(r.DEFAULT_MCP_HTTP_PORT),e=await(0,w.findAvailablePort)();await $(s,i,e,t);const n=(0,_.spawn)(r.QBOTCLAW_BIN,["gateway","run","--port",String(s),"--force"],{stdio:"ignore",env:{PATH:r.NODE_BIN_DIR,HOME:process.env.HOME,OPENCLAW_NO_RESPAWN:"true",VENUS_API_KEY:"E9isWWfAr4VIFuIa5RbJaPxD@2040",OPENCLAW_TELEMETRY_GALIELO_GUID:process.env.QB_GUID||"",OPENCLAW_TELEMETRY_GALIELO_QIEMI36:process.env.QB_QIMEI36||"",OPENCLAW_GATEWAY_TOKEN:(0,
|
|
4
|
-
`)}catch{}return}exports.isInstalling=!0,exports.installState={status:"downloading",message:"\u6B63\u5728\u5B89\u88C5...",startTime:new Date().toISOString()},(0,a.log)(`\u5F00\u59CB\u5B89\u88C5 ${r.NPM_PACKAGE_NAME}@${o}`),(async()=>{try{(0,p.stopGateway)(),I(),m();const i=5;let e=0;g(t,i,e,"\u5F00\u59CB\u5B89\u88C5 mcporter..."),await O(t),e++,g(t,i,e,"\u5F00\u59CB\u4E0B\u8F7D\u89E3\u538B QBotClaw..."),await E(o),e++,g(t,i,e,"npmDownloadQBotClaw \u5B8C\u6210"),await(0,f.fullScanClearQuarantine)("npm install --ignore-scripts \u5B8C\u6210\u540E\uFF0Crebuild \u524D"),e++,await(0,f.watchWorkspaceQuarantine)().catch(n=>{(0,a.log)(`[quarantine] watchWorkspaceQuarantine \u542F\u52A8\u5F02\u5E38: ${n.message}`)}),g(t,i,e,"\u5F00\u59CB npm rebuild..."),await y(o),e++,g(t,i,e,"npmRebuildQBotClaw \u5B8C\u6210");try{c.default.existsSync(r.OPENCLAW_BIN)||(c.default.symlinkSync(r.QBOTCLAW_BIN,r.OPENCLAW_BIN),(0,a.log)(`\u5DF2\u521B\u5EFA\u8F6F\u94FE\u63A5: ${r.OPENCLAW_BIN} -> ${r.QBOTCLAW_BIN}`))}catch(n){(0,a.log)(`\u521B\u5EFA openclaw \u8F6F\u94FE\u63A5\u5931\u8D25: ${n.message}`)}if(await(0,f.stopWatchWorkspaceQuarantine)().catch(n=>{(0,a.log)(`[quarantine] stopWatchWorkspaceQuarantine \u5F02\u5E38: ${n.message}`)}),exports.installState={status:"success",message:"\u5B89\u88C5\u6210\u529F",endTime:new Date().toISOString()},(0,a.log)("\u5B89\u88C5\u6210\u529F"),(0,a.refreshClawVersion)(o),g(t,i,e,"\u5F00\u59CB\u914D\u7F6E\u5E76\u542F\u52A8 QBotClaw gateway..."),await N(s),e++,t.writable)try{t.end(JSON.stringify({status:"done",progress:100,message:"\u5B89\u88C5\u6210\u529F"})+`
|
|
3
|
+
`);c.default.writeFileSync(t,o,"utf-8"),(0,a.log)(`\u5DF2\u5199\u5165 pip.conf: ${t}`)}async function O(t){if(c.default.existsSync(r.MCPORTER_BIN)){(0,a.log)("mcporter \u5DF2\u5B89\u88C5\uFF0C\u8DF3\u8FC7");return}(0,a.log)("\u5F00\u59CB\u5B89\u88C5 mcporter..."),await new Promise((o,s)=>{const i=(0,_.spawn)(r.NPM_BIN,["--userconfig",r.NPM_RC,"install","-g","mcporter"],{stdio:["ignore","pipe","pipe"],env:{...process.env,PATH:`${u.default.dirname(r.NPM_BIN)}:${process.env.PATH}`}});i.stdout.on("data",e=>{const n=`[mcporter] ${e.toString().trim()}`;(0,a.log)(n),g(t,0,0,n)}),i.stderr.on("data",e=>{const n=`[mcporter] ${e.toString().trim()}`;(0,a.log)(n),g(t,0,0,n)}),i.on("close",e=>{e===0?((0,a.log)("mcporter \u5B89\u88C5\u6210\u529F"),o()):s(new Error(`mcporter \u5B89\u88C5\u5931\u8D25\uFF0C\u9000\u51FA\u7801: ${e}`))}),i.on("error",s)})}function A(t,o){return new Promise((s,i)=>{const e=(0,_.spawn)(r.NPM_BIN,["--userconfig",r.NPM_RC,...t],{stdio:["ignore","pipe","pipe"],env:{...process.env,PATH:`${u.default.dirname(r.NPM_BIN)}:${process.env.PATH}`}});e.stdout.on("data",n=>{const l=`[npm] ${n.toString().trim()}`;(0,a.log)(l)}),e.stderr.on("data",n=>{const l=`[npm] ${n.toString().trim()}`;(0,a.log)(l)}),e.on("close",n=>{n===0?((0,a.log)(`${o} \u6210\u529F`),s()):i(new Error(`${o} \u5931\u8D25\uFF0C\u9000\u51FA\u7801: ${n}`))}),e.on("error",i)})}async function E(t){const o=`${r.NPM_PACKAGE_NAME}@${t}`;(0,a.log)(`\u5F00\u59CB\u5B89\u88C5 ${o}\uFF08--ignore-scripts\uFF0C\u4EC5\u4E0B\u8F7D\u89E3\u538B\uFF09...`),await A(["install","-g","--ignore-scripts",o],`${o} \u4E0B\u8F7D\u89E3\u538B`)}async function y(t){const o=`${r.NPM_PACKAGE_NAME}@${t}`;(0,a.log)("\u5F00\u59CB npm rebuild\uFF08\u6267\u884C postinstall \u811A\u672C\uFF09..."),await A(["rebuild","-g",r.NPM_PACKAGE_NAME],`${o} rebuild`),(0,a.log)(`${o} \u5B89\u88C5\u6210\u529F`)}async function $(t,o,s,i){let e;if((0,a.log)(`\u8986\u76D6\u7528\u6237\u5DF2\u6709\u914D\u7F6E: ${i}`),!i&&c.default.existsSync(r.QBOT_CLAW_CONFIG_PATH))e=r.QBOT_CLAW_CONFIG_PATH,(0,a.log)(`\u4F7F\u7528\u5DF2\u6709\u914D\u7F6E\u6587\u4EF6: ${e}`);else{const l=u.default.join(r.NPM_GLOBAL_MODULES,r.NPM_PACKAGE_NAME,"preset-config.json");if(!c.default.existsSync(l)){(0,a.log)(`npm \u5168\u5C40\u5B89\u88C5\u76EE\u5F55\u4E2D\u7684\u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728\uFF0C\u8DF3\u8FC7\u914D\u7F6E\u5199\u5165: ${l}`);return}e=l,(0,a.log)(`\u4F7F\u7528 npm \u5168\u5C40\u5B89\u88C5\u76EE\u5F55\u4E2D\u7684\u914D\u7F6E: ${e}`)}let n;try{n=JSON.parse(c.default.readFileSync(e,"utf-8")),(0,a.log)(`\u5DF2\u8BFB\u53D6\u914D\u7F6E: ${e}`)}catch(l){(0,a.log)(`\u8BFB\u53D6\u914D\u7F6E\u5931\u8D25: ${e}\uFF0C${l.message}\uFF0C\u8DF3\u8FC7\u914D\u7F6E\u5199\u5165`);return}t!==void 0&&(n.gateway={...n.gateway??{},port:t},(0,a.log)(`\u5DF2\u5C06 gateway.port=${t} \u5199\u5165\u914D\u7F6E`)),n.plugins=n.plugins??{},n.plugins.entries=n.plugins.entries??{},n.plugins.entries["x5use-browser-control"]=n.plugins.entries["x5use-browser-control"]??{},n.plugins.entries["x5use-browser-control"].config={...n.plugins.entries["x5use-browser-control"].config??{},wsPort:s,httpPort:o},(0,a.log)(`\u5DF2\u5C06 x5use-browser-control wsPort=${s}, httpPort=${o} \u5199\u5165\u914D\u7F6E`),c.default.writeFileSync(r.QBOT_CLAW_CONFIG_PATH,JSON.stringify(n,null,2),"utf-8"),(0,a.log)(`\u914D\u7F6E\u6587\u4EF6\u5DF2\u5199\u5165: ${r.QBOT_CLAW_CONFIG_PATH}`)}async function N(t){const o=(0,p.readState)();let s;o.gatewayPort&&!await(0,p.isPortAvailable)(o.gatewayPort)?(s=o.gatewayPort,(0,a.log)(`\u68C0\u6D4B\u5230 QBotClaw gateway \u5DF2\u5728\u7AEF\u53E3 ${s} \u8FD0\u884C\uFF0C\u590D\u7528\u539F\u7AEF\u53E3`)):s=await(0,w.findAvailablePort)(),(0,a.log)(`\u540E\u53F0\u542F\u52A8 QBotClaw gateway run --port ${s} --force`);const i=await(0,w.findAvailablePort)(r.DEFAULT_MCP_HTTP_PORT),e=await(0,w.findAvailablePort)();await $(s,i,e,t);const n=(0,_.spawn)(r.QBOTCLAW_BIN,["gateway","run","--port",String(s),"--force"],{stdio:"ignore",env:{PATH:r.NODE_BIN_DIR,HOME:process.env.HOME,OPENCLAW_NO_RESPAWN:"true",VENUS_API_KEY:"E9isWWfAr4VIFuIa5RbJaPxD@2040",OPENCLAW_TELEMETRY_GALIELO_GUID:process.env.QB_GUID||"",OPENCLAW_TELEMETRY_GALIELO_QIEMI36:process.env.QB_QIMEI36||"",OPENCLAW_GATEWAY_TOKEN:(0,d.getOrCreateGatewayToken)()}});n.unref();const l=n.pid;(0,a.log)(`QBotClaw gateway \u5DF2\u5728\u540E\u53F0\u542F\u52A8\uFF0CPID: ${l}\uFF0C\u7AEF\u53E3: ${s}, token ${(0,d.getOrCreateGatewayToken)()}`),(0,p.writeState)({...(0,p.readState)(),gatewayPid:l,gatewayPort:s,mcpHttpPort:i,mcpWsPort:e})}function T(t,o,s){if(exports.isInstalling){if((0,a.log)("[runInstall] \u5B89\u88C5\u6B63\u5728\u8FDB\u884C\u4E2D\uFF0C\u62D2\u7EDD\u91CD\u590D\u6267\u884C"),t&&t.writable)try{t.end(JSON.stringify({status:"failed",progress:0,message:"\u5B89\u88C5\u6B63\u5728\u8FDB\u884C\u4E2D\uFF0C\u8BF7\u52FF\u91CD\u590D\u64CD\u4F5C"})+`
|
|
4
|
+
`)}catch{}return}exports.isInstalling=!0,exports.installState={status:"downloading",message:"\u6B63\u5728\u5B89\u88C5...",startTime:new Date().toISOString()},(0,a.log)(`\u5F00\u59CB\u5B89\u88C5 ${r.NPM_PACKAGE_NAME}@${o}`),(async()=>{try{(0,p.stopGateway)(),I(),m();const i=5;let e=0;g(t,i,e,"\u5F00\u59CB\u5B89\u88C5 mcporter..."),await O(t),e++,g(t,i,e,"\u5F00\u59CB\u4E0B\u8F7D\u89E3\u538B QBotClaw..."),await E(o),e++,g(t,i,e,"npmDownloadQBotClaw \u5B8C\u6210"),await(0,f.fullScanClearQuarantine)("npm install --ignore-scripts \u5B8C\u6210\u540E\uFF0Crebuild \u524D"),e++,await(0,f.watchWorkspaceQuarantine)().catch(n=>{(0,a.log)(`[quarantine] watchWorkspaceQuarantine \u542F\u52A8\u5F02\u5E38: ${n.message}`)}),g(t,i,e,"\u5F00\u59CB npm rebuild..."),await y(o),e++,g(t,i,e,"npmRebuildQBotClaw \u5B8C\u6210");try{c.default.existsSync(r.OPENCLAW_BIN)||(c.default.symlinkSync(r.QBOTCLAW_BIN,r.OPENCLAW_BIN),(0,a.log)(`\u5DF2\u521B\u5EFA\u8F6F\u94FE\u63A5: ${r.OPENCLAW_BIN} -> ${r.QBOTCLAW_BIN}`))}catch(n){(0,a.log)(`\u521B\u5EFA openclaw \u8F6F\u94FE\u63A5\u5931\u8D25: ${n.message}`)}if(await(0,f.stopWatchWorkspaceQuarantine)().catch(n=>{(0,a.log)(`[quarantine] stopWatchWorkspaceQuarantine \u5F02\u5E38: ${n.message}`)}),exports.installState={status:"success",message:"\u5B89\u88C5\u6210\u529F",endTime:new Date().toISOString()},(0,a.log)("\u5B89\u88C5\u6210\u529F"),(0,a.refreshClawVersion)(o),g(t,i,e,"\u5F00\u59CB\u914D\u7F6E\u5E76\u542F\u52A8 QBotClaw gateway..."),await N(s),e++,t.writable)try{const n=(0,d.getOrCreateGatewayToken)();t.end(JSON.stringify({status:"done",progress:100,message:"\u5B89\u88C5\u6210\u529F",gatewayToken:n})+`
|
|
5
5
|
`)}catch{}}catch(i){if(await(0,f.stopWatchWorkspaceQuarantine)().catch(()=>{}),exports.installState={status:"failed",message:i.message,endTime:new Date().toISOString()},(0,a.log)(`\u5B89\u88C5\u5931\u8D25: ${i.message}`),t&&t.writable)try{t.end(JSON.stringify({status:"failed",progress:0,message:i.message})+`
|
|
6
6
|
`)}catch{}}finally{exports.isInstalling=!1}})()}
|
package/dist/server.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
"use strict";var I=exports&&exports.__importDefault||function(p){return p&&p.__esModule?p:{default:p}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.server=void 0,exports.watchParentProcess=W;const R=I(require("http")),
|
|
1
|
+
"use strict";var I=exports&&exports.__importDefault||function(p){return p&&p.__esModule?p:{default:p}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.server=void 0,exports.watchParentProcess=W;const R=I(require("http")),w=I(require("fs")),y=I(require("path")),l=require("./config"),n=require("./utils"),a=require("./reportLog"),_=require("./installer"),J=require("./version"),P=require("./state"),A=require("child_process"),k=require("./service"),N={"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":"GET, POST, PUT, DELETE, OPTIONS","Access-Control-Allow-Headers":"Content-Type, Authorization, X-Requested-With","Access-Control-Max-Age":"86400"};function b(p){for(const[t,d]of Object.entries(N))p.setHeader(t,d)}exports.server=R.default.createServer(async(p,t)=>{const d=p.url||"";if(b(t),p.method==="OPTIONS"){t.writeHead(204,N),t.end();return}if(d==="/api/version"){let r="unknown";try{r=(await(0,n.execCommand)(`"${l.NODE_BIN}" -v`)).trim(),(0,a.log)(`[version] node \u7248\u672C: ${r}`)}catch(i){(0,a.log)(`[version] \u83B7\u53D6 node \u7248\u672C\u5931\u8D25: ${i.message}`),r=`error: ${i.message}`}const o=await(0,n.getQBotClawVersion)()??"0.0.0";(0,a.log)(`[version] qbotclaw \u7248\u672C: ${o}`);let e="0.0.0";if(w.default.existsSync(l.MCPORTER_BIN))try{e=(await(0,n.execCommand)(`"${l.NODE_BIN}" "${l.MCPORTER_BIN}" --version`)).trim(),(0,a.log)(`[version] mcporter \u7248\u672C: ${e}`)}catch(i){(0,a.log)(`[version] \u83B7\u53D6 mcporter \u7248\u672C\u5931\u8D25: ${i.message}`),e=`error: ${i.message}`}let s="0.0.0";if(w.default.existsSync(l.PYTHON_BIN))try{s=(await(0,n.execCommand)(`"${l.PYTHON_BIN}" --version`)).trim(),(0,a.log)(`[version] python \u7248\u672C: ${s}`)}catch(i){(0,a.log)(`[version] \u83B7\u53D6 python \u7248\u672C\u5931\u8D25: ${i.message}`),s=`error: ${i.message}`}(0,n.sendJSON)(t,200,{status:"\u6210\u529F",launcher:J.LAUNCHER_VERSION,node:r,qbotclaw:o,mcporter:e,python:s});return}if(d==="/api/port"){const r=exports.server.address(),o=r&&typeof r=="object"?r.port:null,e=(0,P.readState)();(0,n.sendJSON)(t,200,{status:"\u6210\u529F",launcher:o,qbotclaw:e.gatewayPort??2e3,mcpHttp:e.mcpHttpPort??l.DEFAULT_MCP_HTTP_PORT,mcpWs:e.mcpWsPort??8765});return}if(d==="/api/status"){const r=(0,P.readState)(),o=[];if(r.gatewayPid)try{process.kill(r.gatewayPid,0)}catch{o.push(`gateway \u8FDB\u7A0B (pid: ${r.gatewayPid}) \u5DF2\u9000\u51FA`)}else o.push("gateway \u8FDB\u7A0B\u672A\u542F\u52A8\uFF08\u72B6\u6001\u4E2D\u65E0 gatewayPid\uFF09");const e=[{name:"gateway",port:r.gatewayPort},{name:"mcpHttp",port:r.mcpHttpPort},{name:"mcpWs",port:r.mcpWsPort}];for(const{name:s,port:i}of e){if(!i){o.push(`${s} \u7AEF\u53E3\u672A\u914D\u7F6E\uFF08\u72B6\u6001\u4E2D\u65E0\u5BF9\u5E94\u7AEF\u53E3\u53F7\uFF09`);continue}await(0,P.isPortAvailable)(i)&&o.push(`${s} \u7AEF\u53E3 (${i}) \u65E0\u670D\u52A1\u76D1\u542C`)}o.length===0?(0,n.sendJSON)(t,200,{ok:!0,message:"\u6240\u6709\u670D\u52A1\u8FD0\u884C\u6B63\u5E38"}):(0,n.sendJSON)(t,200,{ok:!1,message:o.join("\uFF1B")});return}if(d==="/api/restart"){try{const r=(0,P.readState)();if(r.gatewayPid)try{process.kill(r.gatewayPid,"SIGTERM"),(0,a.log)(`[restart] \u5DF2\u53D1\u9001 SIGTERM \u7ED9\u65E7 gateway \u8FDB\u7A0B pid: ${r.gatewayPid}`)}catch{(0,a.log)(`[restart] \u65E7 gateway \u8FDB\u7A0B ${r.gatewayPid} \u53EF\u80FD\u5DF2\u9000\u51FA\uFF0C\u5FFD\u7565`)}const{gatewayPid:o,gatewayPort:e,mcpHttpPort:s,mcpWsPort:i,...f}=r;(0,P.writeState)(f),(0,a.log)("[restart] \u5DF2\u6E05\u9664 gatewayPid, gatewayPort, mcpHttpPort, mcpWsPort"),await(0,_.configAndRunQBotClaw)(),(0,a.log)("[restart] QBotClaw gateway \u91CD\u542F\u5B8C\u6210");const g=(0,P.readState)(),c=exports.server.address(),u=c&&typeof c=="object"?c.port:null;(0,n.sendJSON)(t,200,{ok:!0,message:"QBotClaw gateway \u91CD\u542F\u6210\u529F",launcher:u,qbotclaw:g.gatewayPort??2e3,mcpHttp:g.mcpHttpPort??l.DEFAULT_MCP_HTTP_PORT,mcpWs:g.mcpWsPort??8765,gatewayToken:(0,k.getOrCreateGatewayToken)()})}catch(r){(0,a.log)(`[restart] \u91CD\u542F\u5931\u8D25: ${r.message}`),(0,n.sendJSON)(t,500,{ok:!1,message:`\u91CD\u542F\u5931\u8D25: ${r.message}`})}return}if(d==="/api/wechat/history"){try{if(!w.default.existsSync(l.SESSIONS_FILE)){(0,n.sendJSON)(t,404,{ok:!1,sessionKey:"",message:"\u672A\u627E\u5230\u4F1A\u8BDD\u6587\u4EF6"});return}const r=JSON.parse(w.default.readFileSync(l.SESSIONS_FILE,"utf-8"));let o=null,e=0;for(const[f,g]of Object.entries(r))if(f.includes("openclaw-weixin")){const u=g.updatedAt??0;u>e&&(e=u,o=f)}if(!o){(0,n.sendJSON)(t,404,{ok:!1,sessionKey:"",message:"\u672A\u627E\u5230\u5FAE\u4FE1\u4F1A\u8BDD"});return}const i=o.split(":").slice(4).join(":");(0,n.sendJSON)(t,200,{ok:!0,sessionKey:i,message:"\u83B7\u53D6\u6210\u529F"})}catch(r){(0,a.log)(`[wechat/history] \u8BFB\u53D6\u5FAE\u4FE1\u4F1A\u8BDD\u5931\u8D25: ${r.message}`),(0,n.sendJSON)(t,500,{ok:!1,sessionKey:"",message:`\u8BFB\u53D6\u5FAE\u4FE1\u4F1A\u8BDD\u5931\u8D25: ${r.message}`})}return}if(d==="/api/installing"){(0,n.sendJSON)(t,200,{installing:_.isInstalling});return}if(d==="/api/install"||d.startsWith("/api/install?")){if(_.installState.status==="downloading"){(0,n.sendJSON)(t,200,{ok:"downloading",message:"\u6B63\u5728\u5B89\u88C5\u4E2D..."});return}const r=new URL(d,"http://localhost"),o=r.searchParams.get("version")||void 0,e=r.searchParams.get("overrideConfig")==="true";if(!o){(0,n.sendJSON)(t,400,{status:"\u5931\u8D25",message:"\u7F3A\u5C11\u5FC5\u8981\u53C2\u6570 version\uFF0C\u7528\u6CD5: GET /api/install?version=x.x.x"});return}t.writeHead(200,{...N,"Content-Type":"text/plain; charset=utf-8","Transfer-Encoding":"chunked","Cache-Control":"no-cache"}),(0,_.runInstall)(t,o,e);return}if(d.startsWith("/api/watch")){const o=new URL(d,"http://localhost").searchParams.get("ppid");if(!o||isNaN(Number(o))){(0,n.sendJSON)(t,400,{status:"\u5931\u8D25",message:"\u7F3A\u5C11\u6709\u6548\u7684 ppid \u53C2\u6570\uFF0C\u7528\u6CD5: GET /api/watch?ppid=12345"});return}const e=parseInt(o,10);try{process.kill(e,0)}catch{(0,n.sendJSON)(t,400,{status:"\u5931\u8D25",message:`\u8FDB\u7A0B ${e} \u4E0D\u5B58\u5728`});return}const s=(0,P.readState)();(0,P.writeState)({...s,ppid:e}),W(e),(0,n.sendJSON)(t,200,{status:"\u6210\u529F",message:`\u5DF2\u5F00\u59CB\u76D1\u63A7\u7236\u8FDB\u7A0B ppid: ${e}`});return}if(d==="/api/qbotclaw"&&p.method==="POST"){let r="";p.on("data",o=>{r+=o.toString()}),p.on("end",()=>{let o;try{const e=JSON.parse(r);if(!Array.isArray(e.args)||e.args.length===0){(0,n.sendJSON)(t,400,{status:"\u5931\u8D25",message:"\u53C2\u6570 args \u5FC5\u987B\u662F\u975E\u7A7A\u6570\u7EC4"});return}o=e.args.map(s=>String(s))}catch{(0,n.sendJSON)(t,400,{status:"\u5931\u8D25",message:"\u8BF7\u6C42\u4F53\u5FC5\u987B\u662F\u5408\u6CD5\u7684 JSON"});return}if(!w.default.existsSync(l.QBOTCLAW_BIN)){(0,n.sendJSON)(t,404,{status:"\u5931\u8D25",message:`qbotclaw \u53EF\u6267\u884C\u6587\u4EF6\u4E0D\u5B58\u5728: ${l.QBOTCLAW_BIN}`});return}t.writeHead(200,{...N,"Content-Type":"text/plain; charset=utf-8","Transfer-Encoding":"chunked","Cache-Control":"no-cache"}),(0,_.runQBotClaw)(o,t).then(()=>{t.end(`
|
|
2
2
|
[\u6267\u884C\u6210\u529F]
|
|
3
3
|
`)}).catch(e=>{t.end(`
|
|
4
4
|
[\u542F\u52A8\u5931\u8D25: ${e.message}]
|
|
5
5
|
`)})});return}if(d.startsWith("/api/uninstall")){const o=new URL(d,"http://localhost").searchParams.get("keepWorkspace")==="true";t.writeHead(200,{...N,"Content-Type":"text/plain; charset=utf-8","Transfer-Encoding":"chunked","Cache-Control":"no-cache"});const e=(s,i,f)=>{if(t.writable)try{t.write(JSON.stringify({status:s,file:i,msg:f})+`
|
|
6
|
-
`)}catch{}};try{e("\u6210\u529F","","\u6B63\u5728\u505C\u6B62 QBotClaw...");const s=(0,P.readState)();if(s.gatewayPid)try{process.kill(s.gatewayPid,"SIGTERM"),(0,a.log)(`[uninstall] \u5DF2\u505C\u6B62 QBotClaw gateway \u8FDB\u7A0B pid: ${s.gatewayPid}`),e("\u6210\u529F","",`\u5DF2\u505C\u6B62 QBotClaw gateway \u8FDB\u7A0B pid: ${s.gatewayPid}`)}catch{(0,a.log)(`[uninstall] QBotClaw gateway \u8FDB\u7A0B ${s.gatewayPid} \u53EF\u80FD\u5DF2\u9000\u51FA`),e("\u6210\u529F","",`QBotClaw gateway \u8FDB\u7A0B ${s.gatewayPid} \u53EF\u80FD\u5DF2\u9000\u51FA`)}else e("\u6210\u529F","","QBotClaw \u672A\u5728\u8FD0\u884C");e("\u6210\u529F","",`\u6B63\u5728\u6267\u884C npm uninstall -g ${l.NPM_PACKAGE_NAME}...`);try{await new Promise((f,g)=>{const c=(0,A.spawn)(l.NPM_BIN,["--userconfig",l.NPM_RC,"uninstall","-g",l.NPM_PACKAGE_NAME],{env:{...process.env,PATH:`${l.NODE_BIN_DIR}:${process.env.PATH}`}});c.stdout?.on("data",u=>{(0,a.log)(`[uninstall] npm: ${u.toString().trim()}`)}),c.stderr?.on("data",u=>{(0,a.log)(`[uninstall] npm stderr: ${u.toString().trim()}`)}),c.on("close",u=>{u===0?f():g(new Error(`npm uninstall \u9000\u51FA\u7801: ${u}`))}),c.on("error",u=>g(u))}),(0,a.log)(`[uninstall] npm uninstall -g ${l.NPM_PACKAGE_NAME} \u6210\u529F`),e("\u6210\u529F","",`npm uninstall -g ${l.NPM_PACKAGE_NAME} \u6210\u529F`)}catch(f){(0,a.log)(`[uninstall] npm uninstall \u5931\u8D25: ${f.message}`),e("\u5931\u8D25","",`npm uninstall \u5931\u8D25: ${f.message}`)}e("\u6210\u529F","",`\u6B63\u5728\u6E05\u7406\u76EE\u5F55 ${l.QBOT_CLAW_DIR}...`);const i=[];if(
|
|
6
|
+
`)}catch{}};try{e("\u6210\u529F","","\u6B63\u5728\u505C\u6B62 QBotClaw...");const s=(0,P.readState)();if(s.gatewayPid)try{process.kill(s.gatewayPid,"SIGTERM"),(0,a.log)(`[uninstall] \u5DF2\u505C\u6B62 QBotClaw gateway \u8FDB\u7A0B pid: ${s.gatewayPid}`),e("\u6210\u529F","",`\u5DF2\u505C\u6B62 QBotClaw gateway \u8FDB\u7A0B pid: ${s.gatewayPid}`)}catch{(0,a.log)(`[uninstall] QBotClaw gateway \u8FDB\u7A0B ${s.gatewayPid} \u53EF\u80FD\u5DF2\u9000\u51FA`),e("\u6210\u529F","",`QBotClaw gateway \u8FDB\u7A0B ${s.gatewayPid} \u53EF\u80FD\u5DF2\u9000\u51FA`)}else e("\u6210\u529F","","QBotClaw \u672A\u5728\u8FD0\u884C");e("\u6210\u529F","",`\u6B63\u5728\u6267\u884C npm uninstall -g ${l.NPM_PACKAGE_NAME}...`);try{await new Promise((f,g)=>{const c=(0,A.spawn)(l.NPM_BIN,["--userconfig",l.NPM_RC,"uninstall","-g",l.NPM_PACKAGE_NAME],{env:{...process.env,PATH:`${l.NODE_BIN_DIR}:${process.env.PATH}`}});c.stdout?.on("data",u=>{(0,a.log)(`[uninstall] npm: ${u.toString().trim()}`)}),c.stderr?.on("data",u=>{(0,a.log)(`[uninstall] npm stderr: ${u.toString().trim()}`)}),c.on("close",u=>{u===0?f():g(new Error(`npm uninstall \u9000\u51FA\u7801: ${u}`))}),c.on("error",u=>g(u))}),(0,a.log)(`[uninstall] npm uninstall -g ${l.NPM_PACKAGE_NAME} \u6210\u529F`),e("\u6210\u529F","",`npm uninstall -g ${l.NPM_PACKAGE_NAME} \u6210\u529F`)}catch(f){(0,a.log)(`[uninstall] npm uninstall \u5931\u8D25: ${f.message}`),e("\u5931\u8D25","",`npm uninstall \u5931\u8D25: ${f.message}`)}e("\u6210\u529F","",`\u6B63\u5728\u6E05\u7406\u76EE\u5F55 ${l.QBOT_CLAW_DIR}...`);const i=[];if(w.default.existsSync(l.QBOT_CLAW_DIR)){const f=w.default.readdirSync(l.QBOT_CLAW_DIR);for(const g of f){const c=y.default.join(l.QBOT_CLAW_DIR,g);if(o&&g==="workspace"){e("\u6210\u529F",c,"\u4FDD\u7559 workspace \u76EE\u5F55");continue}try{w.default.statSync(c).isDirectory()?w.default.rmSync(c,{recursive:!0,force:!0}):w.default.unlinkSync(c),e("\u6210\u529F",c,"\u5DF2\u5220\u9664")}catch(u){(0,a.log)(`[uninstall] \u5220\u9664\u5931\u8D25: ${c} - ${u.message}`),e("\u5931\u8D25",c,`\u5220\u9664\u5931\u8D25: ${u.message}`),i.push(c)}}if(i.length>0){e("\u6210\u529F","",`${i.length} \u4E2A\u9879\u76EE\u5220\u9664\u5931\u8D25\uFF0C\u4F7F\u7528 rm \u547D\u4EE4\u91CD\u8BD5...`);for(const g of i)try{(0,A.execSync)(`rm -rf "${g}"`),(0,a.log)(`[uninstall] rm -rf \u91CD\u8BD5\u6210\u529F: ${g}`),e("\u6210\u529F",g,"rm \u91CD\u8BD5\u5220\u9664\u6210\u529F")}catch(c){(0,a.log)(`[uninstall] rm -rf \u91CD\u8BD5\u4E5F\u5931\u8D25: ${g} - ${c.message}`),e("\u5931\u8D25",g,`rm \u91CD\u8BD5\u4E5F\u5931\u8D25: ${c.message}`)}}if(o)e("\u6210\u529F",l.QBOT_CLAW_DIR,"\u4FDD\u7559\u6839\u76EE\u5F55\uFF08workspace \u6A21\u5F0F\uFF09");else try{w.default.rmSync(l.QBOT_CLAW_DIR,{recursive:!0,force:!0}),e("\u6210\u529F",l.QBOT_CLAW_DIR,"\u5DF2\u5220\u9664\u6839\u76EE\u5F55")}catch(g){(0,a.log)(`[uninstall] \u5220\u9664\u6839\u76EE\u5F55\u5931\u8D25: ${g.message}`);try{(0,A.execSync)(`rm -rf "${l.QBOT_CLAW_DIR}"`),e("\u6210\u529F",l.QBOT_CLAW_DIR,"rm \u91CD\u8BD5\u5220\u9664\u6839\u76EE\u5F55\u6210\u529F")}catch(c){e("\u5931\u8D25",l.QBOT_CLAW_DIR,`\u5220\u9664\u6839\u76EE\u5F55\u5931\u8D25: ${c.message}`)}}}else e("\u6210\u529F",l.QBOT_CLAW_DIR,"\u76EE\u5F55\u4E0D\u5B58\u5728\uFF0C\u65E0\u9700\u6E05\u7406");e("\u6210\u529F","","\u5378\u8F7D\u5B8C\u6210")}catch(s){(0,a.log)(`[uninstall] \u5378\u8F7D\u8FC7\u7A0B\u5F02\u5E38: ${s.message}`),e("\u5931\u8D25","",`\u5378\u8F7D\u8FC7\u7A0B\u5F02\u5E38: ${s.message}`)}t.end(),setTimeout(()=>{(0,a.log)("[uninstall] \u5378\u8F7D\u6D41\u7A0B\u7ED3\u675F\uFF0Clauncher \u8FDB\u7A0B\u9000\u51FA"),process.exit(0)},500);return}if(d.startsWith("/api/reveal")){const o=new URL(d,"http://localhost").searchParams.get("path");if(!o){(0,n.sendJSON)(t,400,{status:"\u5931\u8D25",message:"\u7F3A\u5C11\u5FC5\u8981\u53C2\u6570 path\uFF08\u9700 Base64 \u7F16\u7801\uFF09\uFF0C\u7528\u6CD5: GET /api/reveal?path=<base64\u7F16\u7801\u7684\u6587\u4EF6\u7EDD\u5BF9\u8DEF\u5F84>"});return}let e;try{e=Buffer.from(o,"base64").toString("utf-8")}catch{(0,n.sendJSON)(t,400,{status:"\u5931\u8D25",message:"path \u53C2\u6570 Base64 \u89E3\u7801\u5931\u8D25\uFF0C\u8BF7\u786E\u4FDD\u4F20\u5165\u5408\u6CD5\u7684 Base64 \u7F16\u7801\u5B57\u7B26\u4E32"});return}if(!e||e.trim()===""){(0,n.sendJSON)(t,400,{status:"\u5931\u8D25",message:"Base64 \u89E3\u7801\u540E\u8DEF\u5F84\u4E3A\u7A7A"});return}if(e.includes("\0")){(0,n.sendJSON)(t,400,{status:"\u5931\u8D25",message:"\u8DEF\u5F84\u5305\u542B\u975E\u6CD5\u5B57\u7B26"});return}const s=y.default.resolve(e),i=process.platform==="win32"?["C:\\Windows","C:\\Program Files","C:\\Program Files (x86)","C:\\ProgramData"]:["/etc","/var","/usr","/bin","/sbin","/boot","/root","/sys","/proc","/dev","/lib","/lib64"],f=s.toLowerCase();for(const m of i)if(f===m.toLowerCase()||f.startsWith(m.toLowerCase()+y.default.sep)){(0,a.log)(`[reveal] \u8BBF\u95EE\u7CFB\u7EDF\u654F\u611F\u76EE\u5F55\u88AB\u62D2\u7EDD: ${s}`),(0,n.sendJSON)(t,403,{status:"\u5931\u8D25",message:"\u7981\u6B62\u8BBF\u95EE\u7CFB\u7EDF\u654F\u611F\u76EE\u5F55"});return}const g=y.default.basename(l.QBOT_CLAW_DIR),c=s.split(y.default.sep);for(const m of c)if(m.startsWith(".")&&m!=="."&&m!==".."&&m!==g){(0,a.log)(`[reveal] \u8BBF\u95EE\u9690\u85CF\u6587\u4EF6/\u76EE\u5F55\u88AB\u62D2\u7EDD: ${s}\uFF08\u5339\u914D\u6BB5: ${m}\uFF09`),(0,n.sendJSON)(t,403,{status:"\u5931\u8D25",message:"\u7981\u6B62\u8BBF\u95EE\u9690\u85CF\u6587\u4EF6\u6216\u76EE\u5F55"});return}if(!w.default.existsSync(s)){(0,n.sendJSON)(t,404,{status:"\u5931\u8D25",message:`\u6587\u4EF6\u6216\u76EE\u5F55\u4E0D\u5B58\u5728: ${s}`});return}let u;try{u=w.default.realpathSync(s)}catch{(0,n.sendJSON)(t,400,{status:"\u5931\u8D25",message:"\u65E0\u6CD5\u89E3\u6790\u6587\u4EF6\u771F\u5B9E\u8DEF\u5F84"});return}if(u!==s){const m=u.toLowerCase();for(const h of i)if(m===h.toLowerCase()||m.startsWith(h.toLowerCase()+y.default.sep)){(0,a.log)(`[reveal] \u7B26\u53F7\u94FE\u63A5\u6307\u5411\u7CFB\u7EDF\u654F\u611F\u76EE\u5F55\u88AB\u62D2\u7EDD: ${s} -> ${u}`),(0,n.sendJSON)(t,403,{status:"\u5931\u8D25",message:"\u7981\u6B62\u8BBF\u95EE\u7CFB\u7EDF\u654F\u611F\u76EE\u5F55"});return}const $=u.split(y.default.sep);for(const h of $)if(h.startsWith(".")&&h!=="."&&h!==".."&&h!==g){(0,a.log)(`[reveal] \u7B26\u53F7\u94FE\u63A5\u6307\u5411\u9690\u85CF\u6587\u4EF6/\u76EE\u5F55\u88AB\u62D2\u7EDD: ${s} -> ${u}\uFF08\u5339\u914D\u6BB5: ${h}\uFF09`),(0,n.sendJSON)(t,403,{status:"\u5931\u8D25",message:"\u7981\u6B62\u8BBF\u95EE\u9690\u85CF\u6587\u4EF6\u6216\u76EE\u5F55"});return}}const E=process.platform;let T,v;E==="darwin"?(T="open",v=["-R",s]):E==="win32"?(T="explorer",v=[`/select,${s}`]):(T="xdg-open",v=[y.default.dirname(s)]);try{await new Promise((m,$)=>{const h=(0,A.spawn)(T,v,{stdio:"ignore"}),B=setTimeout(()=>{h.kill(),$(new Error("\u6253\u5F00\u6587\u4EF6\u7BA1\u7406\u5668\u8D85\u65F6\uFF085\u79D2\uFF09"))},5e3);h.on("close",O=>{clearTimeout(B),O===0||O===1?m():$(new Error(`\u8FDB\u7A0B\u9000\u51FA\u7801: ${O}`))}),h.on("error",O=>{clearTimeout(B),$(O)})}),(0,a.log)(`[reveal] \u5DF2\u5728\u6587\u4EF6\u7BA1\u7406\u5668\u4E2D\u663E\u793A: ${s}`),(0,n.sendJSON)(t,200,{status:"\u6210\u529F",message:`\u5DF2\u5728\u6587\u4EF6\u7BA1\u7406\u5668\u4E2D\u663E\u793A: ${s}`})}catch(m){(0,a.log)(`[reveal] \u6253\u5F00\u6587\u4EF6\u7BA1\u7406\u5668\u5931\u8D25: ${m.message}`),(0,n.sendJSON)(t,500,{status:"\u5931\u8D25",message:`\u6253\u5F00\u6587\u4EF6\u7BA1\u7406\u5668\u5931\u8D25: ${m.message}`})}return}(0,n.sendJSON)(t,404,{status:"\u5931\u8D25",message:"\u63A5\u53E3\u4E0D\u5B58\u5728"})});let S=null,C=null;function W(p){if(!p)return;if(S&&C===p){(0,a.log)(`[watchParentProcess] \u5DF2\u5728\u76D1\u63A7\u7236\u8FDB\u7A0B ppid: ${p}\uFF0C\u8DF3\u8FC7\u91CD\u590D\u76D1\u542C`);return}S?((0,a.log)(`[watchParentProcess] \u5DF2\u6709\u76D1\u63A7\uFF08ppid: ${C}\uFF09\uFF0C\u505C\u6B62\u65E7\u7684\u76D1\u63A7\uFF0C\u91CD\u65B0\u76D1\u63A7 ppid: ${p}`),clearInterval(S),S=null,C=null):(0,a.log)(`[watchParentProcess] \u5F00\u59CB\u76D1\u63A7\u7236\u8FDB\u7A0B ppid: ${p}`);const t=setInterval(()=>{try{process.kill(p,0)}catch{(0,a.log)(`[watchParentProcess] \u7236\u8FDB\u7A0B ${p} \u5DF2\u9000\u51FA\uFF0C\u5F00\u59CB\u6E05\u7406\u5E76\u9000\u51FA`),clearInterval(t),S=null,C=null;const d=(0,P.readState)();if(d.gatewayPid)try{process.kill(d.gatewayPid,"SIGTERM"),(0,a.log)(`[watchParentProcess] \u5DF2\u53D1\u9001 SIGTERM \u7ED9 qbotclaw \u8FDB\u7A0B pid: ${d.gatewayPid}`)}catch{(0,a.log)(`[watchParentProcess] qbotclaw \u8FDB\u7A0B ${d.gatewayPid} \u53EF\u80FD\u5DF2\u9000\u51FA\uFF0C\u5FFD\u7565`)}(0,P.clearState)(),(0,a.log)("[watchParentProcess] \u72B6\u6001\u5DF2\u6E05\u7406\uFF0C\u5173\u95ED server \u5E76\u9000\u51FA"),exports.server.close(()=>{(0,a.log)("[watchParentProcess] server \u5DF2\u5173\u95ED\uFF0C\u8FDB\u7A0B\u9000\u51FA"),process.exit(0)}),setTimeout(()=>{(0,a.log)("[watchParentProcess] server.close \u8D85\u65F6\uFF0C\u5F3A\u5236\u9000\u51FA"),process.exit(0)},3e3).unref()}},3e3);t.unref(),S=t,C=p}
|
package/dist/version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.LAUNCHER_VERSION=void 0,exports.LAUNCHER_VERSION="0.9.
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.LAUNCHER_VERSION=void 0,exports.LAUNCHER_VERSION="0.9.61";
|