@qqbrowser/qbot-claw-launcher 0.9.32
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/README.md +1 -0
- package/debug.html +440 -0
- package/dist/config.d.ts +15 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +23 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +128 -0
- package/dist/index.js.map +1 -0
- package/dist/installer.d.ts +20 -0
- package/dist/installer.d.ts.map +1 -0
- package/dist/installer.js +335 -0
- package/dist/installer.js.map +1 -0
- package/dist/quarantine.d.ts +37 -0
- package/dist/quarantine.d.ts.map +1 -0
- package/dist/quarantine.js +315 -0
- package/dist/quarantine.js.map +1 -0
- package/dist/reportLog.d.ts +28 -0
- package/dist/reportLog.d.ts.map +1 -0
- package/dist/reportLog.js +262 -0
- package/dist/reportLog.js.map +1 -0
- package/dist/server.d.ts +4 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +425 -0
- package/dist/server.js.map +1 -0
- package/dist/service.d.ts +11 -0
- package/dist/service.d.ts.map +1 -0
- package/dist/service.js +197 -0
- package/dist/service.js.map +1 -0
- package/dist/state.d.ts +21 -0
- package/dist/state.d.ts.map +1 -0
- package/dist/state.js +62 -0
- package/dist/state.js.map +1 -0
- package/dist/utils.d.ts +25 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +101 -0
- package/dist/utils.js.map +1 -0
- package/node_modules/@parcel/watcher/LICENSE +21 -0
- package/node_modules/@parcel/watcher/README.md +136 -0
- package/node_modules/@parcel/watcher/index.d.ts +49 -0
- package/node_modules/@parcel/watcher/index.js +42 -0
- package/node_modules/@parcel/watcher/index.js.flow +48 -0
- package/node_modules/@parcel/watcher/node_modules/picomatch/LICENSE +21 -0
- package/node_modules/@parcel/watcher/node_modules/picomatch/README.md +738 -0
- package/node_modules/@parcel/watcher/node_modules/picomatch/index.js +17 -0
- package/node_modules/@parcel/watcher/node_modules/picomatch/lib/constants.js +180 -0
- package/node_modules/@parcel/watcher/node_modules/picomatch/lib/parse.js +1085 -0
- package/node_modules/@parcel/watcher/node_modules/picomatch/lib/picomatch.js +341 -0
- package/node_modules/@parcel/watcher/node_modules/picomatch/lib/scan.js +391 -0
- package/node_modules/@parcel/watcher/node_modules/picomatch/lib/utils.js +72 -0
- package/node_modules/@parcel/watcher/node_modules/picomatch/package.json +83 -0
- package/node_modules/@parcel/watcher/node_modules/picomatch/posix.js +3 -0
- package/node_modules/@parcel/watcher/package.json +39 -0
- package/node_modules/@parcel/watcher/wrapper.js +74 -0
- package/node_modules/@parcel/watcher-darwin-arm64/LICENSE +21 -0
- package/node_modules/@parcel/watcher-darwin-arm64/README.md +1 -0
- package/node_modules/@parcel/watcher-darwin-arm64/package.json +30 -0
- package/node_modules/@parcel/watcher-darwin-arm64/watcher.node +0 -0
- package/node_modules/fs-xattr/LICENSE +21 -0
- package/node_modules/fs-xattr/build/Makefile +347 -0
- package/node_modules/fs-xattr/build/Release/.deps/Release/obj.target/xattr/src/async.o.d +15 -0
- package/node_modules/fs-xattr/build/Release/.deps/Release/obj.target/xattr/src/error.o.d +12 -0
- package/node_modules/fs-xattr/build/Release/.deps/Release/obj.target/xattr/src/sync.o.d +15 -0
- package/node_modules/fs-xattr/build/Release/.deps/Release/obj.target/xattr/src/util.o.d +12 -0
- package/node_modules/fs-xattr/build/Release/.deps/Release/obj.target/xattr/src/xattr.o.d +14 -0
- package/node_modules/fs-xattr/build/Release/.deps/Release/xattr.node.d +1 -0
- package/node_modules/fs-xattr/build/Release/obj.target/xattr/src/async.o +0 -0
- package/node_modules/fs-xattr/build/Release/obj.target/xattr/src/error.o +0 -0
- package/node_modules/fs-xattr/build/Release/obj.target/xattr/src/sync.o +0 -0
- package/node_modules/fs-xattr/build/Release/obj.target/xattr/src/util.o +0 -0
- package/node_modules/fs-xattr/build/Release/obj.target/xattr/src/xattr.o +0 -0
- package/node_modules/fs-xattr/build/Release/xattr.node +0 -0
- package/node_modules/fs-xattr/build/binding.Makefile +6 -0
- package/node_modules/fs-xattr/build/config.gypi +530 -0
- package/node_modules/fs-xattr/build/gyp-mac-tool +772 -0
- package/node_modules/fs-xattr/build/xattr.target.mk +185 -0
- package/node_modules/fs-xattr/index.d.ts +47 -0
- package/node_modules/fs-xattr/index.js +80 -0
- package/node_modules/fs-xattr/package.json +29 -0
- package/node_modules/fs-xattr/readme.md +101 -0
- package/node_modules/is-extglob/LICENSE +21 -0
- package/node_modules/is-extglob/README.md +107 -0
- package/node_modules/is-extglob/index.js +20 -0
- package/node_modules/is-extglob/package.json +69 -0
- package/node_modules/is-glob/LICENSE +21 -0
- package/node_modules/is-glob/README.md +206 -0
- package/node_modules/is-glob/index.js +150 -0
- package/node_modules/is-glob/package.json +81 -0
- package/package.json +45 -0
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.PYTHON_DIR = exports.installState = void 0;
|
|
7
|
+
exports.runQBotClaw = runQBotClaw;
|
|
8
|
+
exports.configAndRunQBotClaw = configAndRunQBotClaw;
|
|
9
|
+
exports.runInstall = runInstall;
|
|
10
|
+
const fs_1 = __importDefault(require("fs"));
|
|
11
|
+
const path_1 = __importDefault(require("path"));
|
|
12
|
+
const child_process_1 = require("child_process");
|
|
13
|
+
const config_1 = require("./config");
|
|
14
|
+
const utils_1 = require("./utils");
|
|
15
|
+
const state_1 = require("./state");
|
|
16
|
+
const quarantine_1 = require("./quarantine");
|
|
17
|
+
const reportLog_1 = require("./reportLog");
|
|
18
|
+
function sendProgress(res, totalSteps, currentStep, message) {
|
|
19
|
+
if (res && res.writable) {
|
|
20
|
+
const progress = totalSteps > 0 ? Math.round((currentStep / totalSteps) * 10000) / 100 : 0;
|
|
21
|
+
try {
|
|
22
|
+
res.write(JSON.stringify({ status: 'downloading', progress, totalSteps, currentStep, message }) + '\n');
|
|
23
|
+
}
|
|
24
|
+
catch { }
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
exports.installState = { status: 'idle', message: '未开始' };
|
|
28
|
+
exports.PYTHON_DIR = path_1.default.join(config_1.QBOT_CLAW_DIR, 'python');
|
|
29
|
+
/**
|
|
30
|
+
* 执行 QBotClaw 命令
|
|
31
|
+
*/
|
|
32
|
+
function runQBotClaw(args, res) {
|
|
33
|
+
return new Promise((resolve) => {
|
|
34
|
+
const child = (0, child_process_1.spawn)(config_1.QBOTCLAW_BIN, args, {
|
|
35
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
36
|
+
env: {
|
|
37
|
+
PATH: config_1.NODE_BIN_DIR,
|
|
38
|
+
HOME: process.env.HOME,
|
|
39
|
+
OPENCLAW_TELEMETRY_GALIELO_GUID: process.env.QB_GUID || '',
|
|
40
|
+
OPENCLAW_TELEMETRY_GALIELO_QIEMI36: process.env.QB_QIMEI36 || '',
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
(0, reportLog_1.log)(`[QBotClaw] 执行: QBotClaw ${args.join(' ')}`);
|
|
44
|
+
child.stdout.on('data', (chunk) => {
|
|
45
|
+
const text = chunk.toString();
|
|
46
|
+
process.stdout.write(`[QBotClaw] ${text}`);
|
|
47
|
+
if (res && res.writable) {
|
|
48
|
+
try {
|
|
49
|
+
res.write(text);
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
child.stderr.on('data', (chunk) => {
|
|
56
|
+
const text = chunk.toString();
|
|
57
|
+
process.stderr.write(`[QBotClaw] ${text}`);
|
|
58
|
+
if (res && res.writable) {
|
|
59
|
+
try {
|
|
60
|
+
res.write(text);
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
child.on('close', (code) => {
|
|
67
|
+
(0, reportLog_1.log)(`[QBotClaw] 执行完成,退出码: ${code}`);
|
|
68
|
+
resolve();
|
|
69
|
+
});
|
|
70
|
+
child.on('error', (err) => {
|
|
71
|
+
(0, reportLog_1.log)(`[QBotClaw] 启动失败: ${err.message}`);
|
|
72
|
+
resolve();
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
/** 步骤 1:确保 ~/.qbot-claw 目录存在 */
|
|
77
|
+
function ensureClawDir() {
|
|
78
|
+
if (!fs_1.default.existsSync(config_1.QBOT_CLAW_DIR)) {
|
|
79
|
+
fs_1.default.mkdirSync(config_1.QBOT_CLAW_DIR, { recursive: true });
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/** 写入 pip.conf 配置文件(不存在时写入) */
|
|
83
|
+
function ensurePipConf() {
|
|
84
|
+
const pipConfPath = path_1.default.join(exports.PYTHON_DIR, 'pip.conf');
|
|
85
|
+
if (fs_1.default.existsSync(pipConfPath)) {
|
|
86
|
+
(0, reportLog_1.log)(`pip.conf 已存在,跳过`);
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
const pipConf = [
|
|
90
|
+
'[global]',
|
|
91
|
+
'index-url = https://mirrors.tencent.com/pypi/simple/',
|
|
92
|
+
`cache-dir = ${path_1.default.join(exports.PYTHON_DIR, '.pip-cache')}`,
|
|
93
|
+
'',
|
|
94
|
+
'[install]',
|
|
95
|
+
`prefix = ${exports.PYTHON_DIR}`,
|
|
96
|
+
'',
|
|
97
|
+
].join('\n');
|
|
98
|
+
fs_1.default.writeFileSync(pipConfPath, pipConf, 'utf-8');
|
|
99
|
+
(0, reportLog_1.log)(`已写入 pip.conf: ${pipConfPath}`);
|
|
100
|
+
}
|
|
101
|
+
/** 全局安装 mcporter(已安装则跳过) */
|
|
102
|
+
async function installMcporter(res) {
|
|
103
|
+
if (fs_1.default.existsSync(config_1.MCPORTER_BIN)) {
|
|
104
|
+
(0, reportLog_1.log)(`mcporter 已安装,跳过`);
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
(0, reportLog_1.log)(`开始安装 mcporter...`);
|
|
108
|
+
await new Promise((resolve, reject) => {
|
|
109
|
+
const child = (0, child_process_1.spawn)(config_1.NPM_BIN, ['--userconfig', config_1.NPM_RC, 'install', '-g', 'mcporter'], {
|
|
110
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
111
|
+
env: { ...process.env, PATH: `${path_1.default.dirname(config_1.NPM_BIN)}:${process.env.PATH}` },
|
|
112
|
+
});
|
|
113
|
+
child.stdout.on('data', (chunk) => {
|
|
114
|
+
const msg = `[mcporter] ${chunk.toString().trim()}`;
|
|
115
|
+
(0, reportLog_1.log)(msg);
|
|
116
|
+
sendProgress(res, 0, 0, msg);
|
|
117
|
+
});
|
|
118
|
+
child.stderr.on('data', (chunk) => {
|
|
119
|
+
const msg = `[mcporter] ${chunk.toString().trim()}`;
|
|
120
|
+
(0, reportLog_1.log)(msg);
|
|
121
|
+
sendProgress(res, 0, 0, msg);
|
|
122
|
+
});
|
|
123
|
+
child.on('close', (code) => {
|
|
124
|
+
if (code === 0) {
|
|
125
|
+
(0, reportLog_1.log)(`mcporter 安装成功`);
|
|
126
|
+
resolve();
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
reject(new Error(`mcporter 安装失败,退出码: ${code}`));
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
child.on('error', reject);
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
/** 执行 npm 命令的通用辅助函数 */
|
|
136
|
+
function runNpmCommand(args, label) {
|
|
137
|
+
return new Promise((resolve, reject) => {
|
|
138
|
+
const child = (0, child_process_1.spawn)(config_1.NPM_BIN, ['--userconfig', config_1.NPM_RC, ...args], {
|
|
139
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
140
|
+
env: { ...process.env, PATH: `${path_1.default.dirname(config_1.NPM_BIN)}:${process.env.PATH}` },
|
|
141
|
+
});
|
|
142
|
+
child.stdout.on('data', (chunk) => {
|
|
143
|
+
const msg = `[npm] ${chunk.toString().trim()}`;
|
|
144
|
+
(0, reportLog_1.log)(msg);
|
|
145
|
+
});
|
|
146
|
+
child.stderr.on('data', (chunk) => {
|
|
147
|
+
const msg = `[npm] ${chunk.toString().trim()}`;
|
|
148
|
+
(0, reportLog_1.log)(msg);
|
|
149
|
+
});
|
|
150
|
+
child.on('close', (code) => {
|
|
151
|
+
if (code === 0) {
|
|
152
|
+
(0, reportLog_1.log)(`${label} 成功`);
|
|
153
|
+
resolve();
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
reject(new Error(`${label} 失败,退出码: ${code}`));
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
child.on('error', reject);
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* 使用 npm install -g --ignore-scripts 下载解压 QBotClaw(不执行 postinstall 脚本)
|
|
164
|
+
*
|
|
165
|
+
* 为什么跳过脚本:
|
|
166
|
+
* npm install 过程中,FSEvents 可能丢弃事件导致 watcher 遗漏文件。
|
|
167
|
+
* 如果 postinstall 脚本(如 node-llama-cpp)在 install 过程中 dlopen 这些文件,
|
|
168
|
+
* 会被 macOS Gatekeeper 拦截。拆分步骤后,可以在 dlopen 之前 100% 确保
|
|
169
|
+
* 所有 native 二进制文件的隔离属性已被清除。
|
|
170
|
+
*/
|
|
171
|
+
async function npmDownloadQBotClaw(version) {
|
|
172
|
+
const packageSpec = `${config_1.NPM_PACKAGE_NAME}@${version}`;
|
|
173
|
+
(0, reportLog_1.log)(`开始安装 ${packageSpec}(--ignore-scripts,仅下载解压)...`);
|
|
174
|
+
await runNpmCommand(['install', '-g', '--ignore-scripts', packageSpec], `${packageSpec} 下载解压`);
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* 执行 npm rebuild,触发所有 postinstall 脚本
|
|
178
|
+
*
|
|
179
|
+
* 调用前应确保已完成隔离属性清除,使所有 dylib/node 文件在 rebuild 时已安全。
|
|
180
|
+
*/
|
|
181
|
+
async function npmRebuildQBotClaw(version) {
|
|
182
|
+
const packageSpec = `${config_1.NPM_PACKAGE_NAME}@${version}`;
|
|
183
|
+
(0, reportLog_1.log)(`开始 npm rebuild(执行 postinstall 脚本)...`);
|
|
184
|
+
await runNpmCommand(['rebuild', '-g', config_1.NPM_PACKAGE_NAME], `${packageSpec} rebuild`);
|
|
185
|
+
(0, reportLog_1.log)(`${packageSpec} 安装成功`);
|
|
186
|
+
}
|
|
187
|
+
/** 读取 npm 全局安装目录中的 preset-config.json,修改 gateway.port,然后覆盖写入到 QBOT_CLAW_CONFIG_PATH */
|
|
188
|
+
async function copyPresetConfig(gatewayPort, mcpHttpPort, mcpWsPort) {
|
|
189
|
+
// 配置来源路径:优先使用现有配置文件,若不存在则从 npm 全局 node_modules 中读取
|
|
190
|
+
const npmPresetPath = path_1.default.join(config_1.NPM_GLOBAL_MODULES, config_1.NPM_PACKAGE_NAME, 'preset-config.json');
|
|
191
|
+
let configPath;
|
|
192
|
+
if (fs_1.default.existsSync(config_1.QBOT_CLAW_CONFIG_PATH)) {
|
|
193
|
+
configPath = config_1.QBOT_CLAW_CONFIG_PATH;
|
|
194
|
+
(0, reportLog_1.log)(`使用现有配置文件: ${configPath}`);
|
|
195
|
+
}
|
|
196
|
+
else if (fs_1.default.existsSync(npmPresetPath)) {
|
|
197
|
+
configPath = npmPresetPath;
|
|
198
|
+
(0, reportLog_1.log)(`现有配置文件不存在,使用 npm 全局安装目录中的配置: ${configPath}`);
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
(0, reportLog_1.log)(`配置文件不存在,跳过配置写入: ${config_1.QBOT_CLAW_CONFIG_PATH}`);
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
// 读取配置
|
|
205
|
+
let config;
|
|
206
|
+
try {
|
|
207
|
+
config = JSON.parse(fs_1.default.readFileSync(configPath, 'utf-8'));
|
|
208
|
+
(0, reportLog_1.log)(`已读取配置: ${configPath}`);
|
|
209
|
+
}
|
|
210
|
+
catch (err) {
|
|
211
|
+
(0, reportLog_1.log)(`读取配置失败: ${configPath},${err.message},跳过配置写入`);
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
// 修改 gateway.port 并写入
|
|
215
|
+
if (gatewayPort !== undefined) {
|
|
216
|
+
config.gateway = { ...(config.gateway ?? {}), port: gatewayPort };
|
|
217
|
+
(0, reportLog_1.log)(`已将 gateway.port=${gatewayPort} 写入配置`);
|
|
218
|
+
}
|
|
219
|
+
// 修改 plugins.entries.x5use-browser-control.config 中的端口
|
|
220
|
+
config.plugins = config.plugins ?? {};
|
|
221
|
+
config.plugins.entries = config.plugins.entries ?? {};
|
|
222
|
+
config.plugins.entries['x5use-browser-control'] = config.plugins.entries['x5use-browser-control'] ?? {};
|
|
223
|
+
config.plugins.entries['x5use-browser-control'].config = {
|
|
224
|
+
...(config.plugins.entries['x5use-browser-control'].config ?? {}),
|
|
225
|
+
wsPort: mcpWsPort,
|
|
226
|
+
httpPort: mcpHttpPort,
|
|
227
|
+
};
|
|
228
|
+
(0, reportLog_1.log)(`已将 x5use-browser-control wsPort=${mcpWsPort}, httpPort=${mcpHttpPort} 写入配置`);
|
|
229
|
+
fs_1.default.writeFileSync(config_1.QBOT_CLAW_CONFIG_PATH, JSON.stringify(config, null, 2), 'utf-8');
|
|
230
|
+
(0, reportLog_1.log)(`配置文件已写入: ${config_1.QBOT_CLAW_CONFIG_PATH}`);
|
|
231
|
+
}
|
|
232
|
+
/** 步骤 12:配置并启动 QBotClaw gateway */
|
|
233
|
+
async function configAndRunQBotClaw() {
|
|
234
|
+
// 如果已有 gateway 在某个端口运行(端口不可用),则复用原端口;否则寻找新端口
|
|
235
|
+
const state = (0, state_1.readState)();
|
|
236
|
+
let gatewayPort;
|
|
237
|
+
if (state.gatewayPort && !(await (0, state_1.isPortAvailable)(state.gatewayPort))) {
|
|
238
|
+
gatewayPort = state.gatewayPort;
|
|
239
|
+
(0, reportLog_1.log)(`检测到 QBotClaw gateway 已在端口 ${gatewayPort} 运行,复用原端口`);
|
|
240
|
+
}
|
|
241
|
+
else {
|
|
242
|
+
gatewayPort = await (0, utils_1.findAvailablePort)();
|
|
243
|
+
}
|
|
244
|
+
(0, reportLog_1.log)(`后台启动 QBotClaw gateway run --port ${gatewayPort} --force`);
|
|
245
|
+
const mcpHttpPort = await (0, utils_1.findAvailablePort)();
|
|
246
|
+
const mcpWsPort = await (0, utils_1.findAvailablePort)();
|
|
247
|
+
// 读取 preset-config.json,修改 gateway.port,覆盖写入配置文件
|
|
248
|
+
await copyPresetConfig(gatewayPort, mcpHttpPort, mcpWsPort);
|
|
249
|
+
const child = (0, child_process_1.spawn)(config_1.QBOTCLAW_BIN, ['gateway', 'run', '--port', String(gatewayPort), '--force'], {
|
|
250
|
+
stdio: 'ignore',
|
|
251
|
+
env: {
|
|
252
|
+
PATH: config_1.NODE_BIN_DIR,
|
|
253
|
+
HOME: process.env.HOME,
|
|
254
|
+
OPENCLAW_TELEMETRY_GALIELO_GUID: process.env.QB_GUID || '',
|
|
255
|
+
OPENCLAW_TELEMETRY_GALIELO_QIEMI36: process.env.QB_QIMEI36 || '',
|
|
256
|
+
},
|
|
257
|
+
});
|
|
258
|
+
child.unref();
|
|
259
|
+
const gatewayPid = child.pid;
|
|
260
|
+
(0, reportLog_1.log)(`QBotClaw gateway 已在后台启动,PID: ${gatewayPid},端口: ${gatewayPort}`);
|
|
261
|
+
// 将 gateway 进程信息写入 launcher.json
|
|
262
|
+
(0, state_1.writeState)({ ...(0, state_1.readState)(), gatewayPid, gatewayPort, mcpHttpPort, mcpWsPort });
|
|
263
|
+
}
|
|
264
|
+
// ─── 主安装入口 ───────────────────────────────────────────────────────────────
|
|
265
|
+
/**
|
|
266
|
+
* 执行安装流程(异步,日志实时写入 res)
|
|
267
|
+
*/
|
|
268
|
+
function runInstall(res, version) {
|
|
269
|
+
exports.installState = { status: 'downloading', message: '正在安装...', startTime: new Date().toISOString() };
|
|
270
|
+
(0, reportLog_1.log)(`开始安装 ${config_1.NPM_PACKAGE_NAME}@${version}`);
|
|
271
|
+
(async () => {
|
|
272
|
+
try {
|
|
273
|
+
// 1. 确保目录存在
|
|
274
|
+
ensureClawDir();
|
|
275
|
+
// 写入 pip.conf 配置文件
|
|
276
|
+
ensurePipConf();
|
|
277
|
+
// 安装开始时启动 workspace 监控,自动清除新文件的 Gatekeeper 隔离属性
|
|
278
|
+
await (0, quarantine_1.watchWorkspaceQuarantine)().catch((err) => {
|
|
279
|
+
(0, reportLog_1.log)(`[quarantine] watchWorkspaceQuarantine 启动异常: ${err.message}`);
|
|
280
|
+
});
|
|
281
|
+
// 耗时步骤总数:installMcporter, npmDownloadQBotClaw, fullScanClearQuarantine, npmRebuildQBotClaw, configAndRunQBotClaw
|
|
282
|
+
const totalSteps = 5;
|
|
283
|
+
let currentStep = 0;
|
|
284
|
+
// 2. 全局安装 mcporter(已安装则跳过)
|
|
285
|
+
sendProgress(res, totalSteps, currentStep, `开始安装 mcporter...`);
|
|
286
|
+
await installMcporter(res);
|
|
287
|
+
currentStep++;
|
|
288
|
+
// 3. 下载解压 QBotClaw(--ignore-scripts,不执行 postinstall 脚本)
|
|
289
|
+
sendProgress(res, totalSteps, currentStep, `开始下载解压 QBotClaw...`);
|
|
290
|
+
await npmDownloadQBotClaw(version);
|
|
291
|
+
currentStep++;
|
|
292
|
+
sendProgress(res, totalSteps, currentStep, `npmDownloadQBotClaw 完成`);
|
|
293
|
+
// 4. 全量扫描清除隔离属性(确保所有 dylib/node/可执行文件在 rebuild 前已安全)
|
|
294
|
+
await (0, quarantine_1.fullScanClearQuarantine)('npm install --ignore-scripts 完成后,rebuild 前');
|
|
295
|
+
currentStep++;
|
|
296
|
+
// 5. 执行 npm rebuild,触发所有 postinstall 脚本
|
|
297
|
+
sendProgress(res, totalSteps, currentStep, `开始 npm rebuild...`);
|
|
298
|
+
await npmRebuildQBotClaw(version);
|
|
299
|
+
currentStep++;
|
|
300
|
+
sendProgress(res, totalSteps, currentStep, `npmRebuildQBotClaw 完成`);
|
|
301
|
+
// 安装结束,停止 workspace 监控
|
|
302
|
+
await (0, quarantine_1.stopWatchWorkspaceQuarantine)().catch((err) => {
|
|
303
|
+
(0, reportLog_1.log)(`[quarantine] stopWatchWorkspaceQuarantine 异常: ${err.message}`);
|
|
304
|
+
});
|
|
305
|
+
exports.installState = { status: 'success', message: '安装成功', endTime: new Date().toISOString() };
|
|
306
|
+
(0, reportLog_1.log)(`安装成功`);
|
|
307
|
+
(0, reportLog_1.refreshClawVersion)(version);
|
|
308
|
+
// 6. 配置并启动 QBotClaw gateway
|
|
309
|
+
sendProgress(res, totalSteps, currentStep, `开始配置并启动 QBotClaw gateway...`);
|
|
310
|
+
await configAndRunQBotClaw();
|
|
311
|
+
currentStep++;
|
|
312
|
+
if (res.writable) {
|
|
313
|
+
try {
|
|
314
|
+
res.end(JSON.stringify({ status: 'done', progress: 100, message: '安装成功' }) + '\n');
|
|
315
|
+
}
|
|
316
|
+
catch {
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
catch (err) {
|
|
321
|
+
// 安装失败时也要停止监控
|
|
322
|
+
await (0, quarantine_1.stopWatchWorkspaceQuarantine)().catch(() => { });
|
|
323
|
+
exports.installState = { status: 'failed', message: err.message, endTime: new Date().toISOString() };
|
|
324
|
+
(0, reportLog_1.log)(`安装失败: ${err.message}`);
|
|
325
|
+
if (res && res.writable) {
|
|
326
|
+
try {
|
|
327
|
+
res.end(JSON.stringify({ status: 'failed', progress: 0, message: err.message }) + '\n');
|
|
328
|
+
}
|
|
329
|
+
catch {
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
})();
|
|
334
|
+
}
|
|
335
|
+
//# sourceMappingURL=installer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installer.js","sourceRoot":"","sources":["../src/installer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 全量递归扫描目录,对所有匹配白名单的文件清除 quarantine 属性。
|
|
3
|
+
*
|
|
4
|
+
* 设计目标:作为 watcher 的补偿机制。当 FSEvents 丢弃事件时,
|
|
5
|
+
* 通过全量扫描确保不会遗漏任何需要处理的文件。
|
|
6
|
+
*
|
|
7
|
+
* 性能(基于 benchmark):
|
|
8
|
+
* - 遍历 ~60000 文件 + 过滤 ~3400 匹配文件 + 逐个 removeAttribute ≈ 300ms
|
|
9
|
+
* - 对用户无感知,可安全地在 npm install 过程中触发
|
|
10
|
+
*
|
|
11
|
+
* @param reason 触发原因,用于日志记录
|
|
12
|
+
*/
|
|
13
|
+
export declare function fullScanClearQuarantine(reason: string): Promise<void>;
|
|
14
|
+
/**
|
|
15
|
+
* 停止监听 QBOT_CLAW_DIR 目录,取消 quarantine 属性清除的 watcher。
|
|
16
|
+
*/
|
|
17
|
+
export declare function stopWatchWorkspaceQuarantine(): Promise<void>;
|
|
18
|
+
/**
|
|
19
|
+
* 监听 QBOT_CLAW_DIR 目录,自动清除新文件的 Gatekeeper 隔离属性。
|
|
20
|
+
*
|
|
21
|
+
* 核心设计:使用 @parcel/watcher(底层直接调用 FSEvents C API)。
|
|
22
|
+
* 相比 Node.js 原生 fs.watch,@parcel/watcher 的事件投递延迟低至 ~10ms,
|
|
23
|
+
* 可以在 npm postinstall 脚本启动二进制文件之前完成 quarantine 属性清除。
|
|
24
|
+
*
|
|
25
|
+
* 优势:
|
|
26
|
+
* - 超低延迟(~10ms vs fs.watch 的数秒延迟)
|
|
27
|
+
* - 精确事件类型(create/update/delete),无需猜测 rename 语义
|
|
28
|
+
* - 原生支持 glob ignore 模式,在 C++ 层过滤无关事件
|
|
29
|
+
* - 整棵目录树只需要 1 个文件描述符
|
|
30
|
+
*
|
|
31
|
+
* 策略:
|
|
32
|
+
* - 只处理 create 事件(文件新增),忽略 update/delete
|
|
33
|
+
* - 通过路径黑名单排除无关目录(纯字符串匹配,零 IO)
|
|
34
|
+
* - 通过扩展名白名单过滤需要处理的文件(.dylib, .so, .node, 无扩展名)
|
|
35
|
+
*/
|
|
36
|
+
export declare function watchWorkspaceQuarantine(): Promise<void>;
|
|
37
|
+
//# sourceMappingURL=quarantine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quarantine.d.ts","sourceRoot":"","sources":["../src/quarantine.ts"],"names":[],"mappings":"AAuHA;;;;;;;;;;;GAWG;AACH,wBAAsB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAwD3E;AAiBD;;GAEG;AACH,wBAAsB,4BAA4B,IAAI,OAAO,CAAC,IAAI,CAAC,CAMlE;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,wBAAwB,IAAI,OAAO,CAAC,IAAI,CAAC,CA4D9D"}
|