@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,315 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.fullScanClearQuarantine = fullScanClearQuarantine;
|
|
40
|
+
exports.stopWatchWorkspaceQuarantine = stopWatchWorkspaceQuarantine;
|
|
41
|
+
exports.watchWorkspaceQuarantine = watchWorkspaceQuarantine;
|
|
42
|
+
const path_1 = __importDefault(require("path"));
|
|
43
|
+
const fs_1 = __importDefault(require("fs"));
|
|
44
|
+
const fs_xattr_1 = require("fs-xattr");
|
|
45
|
+
const watcher = __importStar(require("@parcel/watcher"));
|
|
46
|
+
const config_1 = require("./config");
|
|
47
|
+
const reportLog_1 = require("./reportLog");
|
|
48
|
+
let subscription = null;
|
|
49
|
+
/**
|
|
50
|
+
* 需要清除 quarantine 属性的文件扩展名白名单。
|
|
51
|
+
* 注意:无扩展名文件(可执行文件)排除常见非可执行文件名后均会被处理。
|
|
52
|
+
*/
|
|
53
|
+
const QUARANTINE_EXTS = new Set([
|
|
54
|
+
'.dylib', // macOS 动态库
|
|
55
|
+
'.so', // Linux 动态库
|
|
56
|
+
'.node', // Node.js native addon
|
|
57
|
+
]);
|
|
58
|
+
/**
|
|
59
|
+
* 不需要处理的路径片段(这些目录下的文件不可能需要清除 quarantine)。
|
|
60
|
+
* 使用路径片段匹配,避免对不必要的事件做 IO 操作。
|
|
61
|
+
*/
|
|
62
|
+
const IGNORED_PATH_SEGMENTS = [
|
|
63
|
+
'/.npm-cache/',
|
|
64
|
+
'/_cacache/',
|
|
65
|
+
'/.pip-cache/',
|
|
66
|
+
'/__pycache__/',
|
|
67
|
+
'/.cache/',
|
|
68
|
+
'/tmp/',
|
|
69
|
+
// node_modules/.bin/ 下是 npm 创建的 symlink 脚本,不需要清除 quarantine
|
|
70
|
+
'/node_modules/.bin/',
|
|
71
|
+
// 其他平台的 native addon 目录,macOS 上不需要处理
|
|
72
|
+
'/win32_',
|
|
73
|
+
'/linux_',
|
|
74
|
+
'/musl_',
|
|
75
|
+
'/openbsd_',
|
|
76
|
+
'/freebsd_',
|
|
77
|
+
];
|
|
78
|
+
/**
|
|
79
|
+
* 常见的非可执行文件名(无扩展名),这些文件名出现频率极高但绝不需要清除 quarantine。
|
|
80
|
+
* 使用小写匹配,避免大小写变体遗漏(如 LICENSE / license / License)。
|
|
81
|
+
*/
|
|
82
|
+
const IGNORED_FILENAMES = new Set([
|
|
83
|
+
'license',
|
|
84
|
+
'licence',
|
|
85
|
+
'readme',
|
|
86
|
+
'changelog',
|
|
87
|
+
'changes',
|
|
88
|
+
'history',
|
|
89
|
+
'authors',
|
|
90
|
+
'contributors',
|
|
91
|
+
'version',
|
|
92
|
+
'files',
|
|
93
|
+
'makefile',
|
|
94
|
+
'cname',
|
|
95
|
+
'copying',
|
|
96
|
+
'notice',
|
|
97
|
+
'patents',
|
|
98
|
+
'metadata',
|
|
99
|
+
]);
|
|
100
|
+
/**
|
|
101
|
+
* 判断路径是否应该被忽略(命中黑名单目录)。
|
|
102
|
+
* 纯字符串匹配,零 IO。
|
|
103
|
+
*/
|
|
104
|
+
function isIgnoredPath(filePath) {
|
|
105
|
+
for (const seg of IGNORED_PATH_SEGMENTS) {
|
|
106
|
+
if (filePath.includes(seg))
|
|
107
|
+
return true;
|
|
108
|
+
}
|
|
109
|
+
return false;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* 判断文件是否需要清除 quarantine 属性。
|
|
113
|
+
* - 有扩展名的文件:通过扩展名白名单过滤(.dylib, .so, .node)
|
|
114
|
+
* - 无扩展名的文件:排除常见非可执行文件名(LICENSE、README 等)后,均视为可执行文件处理
|
|
115
|
+
* 零 IO,纯内存操作。
|
|
116
|
+
*/
|
|
117
|
+
function needsClearQuarantine(filePath) {
|
|
118
|
+
const ext = path_1.default.extname(filePath).toLowerCase();
|
|
119
|
+
if (ext === '') {
|
|
120
|
+
// 无扩展名:排除常见的非可执行文件名(LICENSE、README 等)
|
|
121
|
+
const basename = path_1.default.basename(filePath).toLowerCase();
|
|
122
|
+
if (IGNORED_FILENAMES.has(basename))
|
|
123
|
+
return false;
|
|
124
|
+
// 其余无扩展名文件均视为可执行文件,需要清除 quarantine
|
|
125
|
+
return true;
|
|
126
|
+
}
|
|
127
|
+
return QUARANTINE_EXTS.has(ext);
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* 检查文件是否真正拥有 quarantine 属性,有则清除。
|
|
131
|
+
* 直接执行 removeAttribute,如果属性不存在会自然失败被 catch 忽略。
|
|
132
|
+
*/
|
|
133
|
+
async function clearQuarantineIfNeeded(filePath) {
|
|
134
|
+
try {
|
|
135
|
+
await (0, fs_xattr_1.removeAttribute)(filePath, 'com.apple.quarantine');
|
|
136
|
+
(0, reportLog_1.log)(`[quarantine] 已清除 quarantine 属性: ${filePath}`);
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
// 属性不存在或文件已删除,无需处理
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// ─── 全量补偿扫描 ─────────────────────────────────────────────────────────────
|
|
143
|
+
/** 防抖定时器:避免连续多次 FSEvents drop 错误重复触发扫描 */
|
|
144
|
+
let compensateScanTimer = null;
|
|
145
|
+
/**
|
|
146
|
+
* 当前正在执行的扫描 Promise。
|
|
147
|
+
* - null 表示没有扫描在执行
|
|
148
|
+
* - 非 null 时,新的调用者会 await 这个 Promise(等待已有扫描完成),而非直接跳过
|
|
149
|
+
* 这样可以避免 "扫描还在跑,rebuild 已经开始" 的竞态问题。
|
|
150
|
+
*/
|
|
151
|
+
let scanningPromise = null;
|
|
152
|
+
/**
|
|
153
|
+
* 全量递归扫描目录,对所有匹配白名单的文件清除 quarantine 属性。
|
|
154
|
+
*
|
|
155
|
+
* 设计目标:作为 watcher 的补偿机制。当 FSEvents 丢弃事件时,
|
|
156
|
+
* 通过全量扫描确保不会遗漏任何需要处理的文件。
|
|
157
|
+
*
|
|
158
|
+
* 性能(基于 benchmark):
|
|
159
|
+
* - 遍历 ~60000 文件 + 过滤 ~3400 匹配文件 + 逐个 removeAttribute ≈ 300ms
|
|
160
|
+
* - 对用户无感知,可安全地在 npm install 过程中触发
|
|
161
|
+
*
|
|
162
|
+
* @param reason 触发原因,用于日志记录
|
|
163
|
+
*/
|
|
164
|
+
async function fullScanClearQuarantine(reason) {
|
|
165
|
+
if (scanningPromise) {
|
|
166
|
+
(0, reportLog_1.log)(`[quarantine] 补偿扫描已在执行中,等待其完成 (触发原因: ${reason})`);
|
|
167
|
+
await scanningPromise;
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
const startTime = Date.now();
|
|
171
|
+
(0, reportLog_1.log)(`[quarantine] 开始全量补偿扫描 (原因: ${reason})`);
|
|
172
|
+
let resolveScan;
|
|
173
|
+
scanningPromise = new Promise(r => { resolveScan = r; });
|
|
174
|
+
try {
|
|
175
|
+
// 递归收集所有匹配文件
|
|
176
|
+
const matchedFiles = [];
|
|
177
|
+
function walk(dir) {
|
|
178
|
+
let entries;
|
|
179
|
+
try {
|
|
180
|
+
entries = fs_1.default.readdirSync(dir, { withFileTypes: true });
|
|
181
|
+
}
|
|
182
|
+
catch {
|
|
183
|
+
return; // 目录不可读,跳过
|
|
184
|
+
}
|
|
185
|
+
for (const entry of entries) {
|
|
186
|
+
const fullPath = path_1.default.join(dir, entry.name);
|
|
187
|
+
if (entry.isDirectory()) {
|
|
188
|
+
// 跳过黑名单目录
|
|
189
|
+
if (!isIgnoredPath(fullPath + '/')) {
|
|
190
|
+
walk(fullPath);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
else if (entry.isFile()) {
|
|
194
|
+
if (!isIgnoredPath(fullPath) && needsClearQuarantine(fullPath)) {
|
|
195
|
+
matchedFiles.push(fullPath);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
walk(config_1.QBOT_CLAW_DIR);
|
|
201
|
+
// 分批并发清除(每批 1000,避免 fd 耗尽)
|
|
202
|
+
const batchSize = 1000;
|
|
203
|
+
for (let i = 0; i < matchedFiles.length; i += batchSize) {
|
|
204
|
+
const batch = matchedFiles.slice(i, i + batchSize);
|
|
205
|
+
await Promise.all(batch.map(f => (0, fs_xattr_1.removeAttribute)(f, 'com.apple.quarantine').catch(() => { })));
|
|
206
|
+
}
|
|
207
|
+
const elapsed = Date.now() - startTime;
|
|
208
|
+
(0, reportLog_1.log)(`[quarantine] 补偿扫描完成: 扫描到 ${matchedFiles.length} 个目标文件, 耗时 ${elapsed}ms`);
|
|
209
|
+
}
|
|
210
|
+
catch (err) {
|
|
211
|
+
(0, reportLog_1.log)(`[quarantine] 补偿扫描出错: ${err.message}`);
|
|
212
|
+
}
|
|
213
|
+
finally {
|
|
214
|
+
scanningPromise = null;
|
|
215
|
+
resolveScan();
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* 防抖触发补偿扫描。
|
|
220
|
+
* 连续多次调用时,只在最后一次调用后 200ms 执行一次扫描。
|
|
221
|
+
* 200ms 的窗口既能合并连续的 drop 错误,又不会延误太久。
|
|
222
|
+
*/
|
|
223
|
+
function triggerCompensateScan(reason) {
|
|
224
|
+
if (compensateScanTimer) {
|
|
225
|
+
clearTimeout(compensateScanTimer);
|
|
226
|
+
}
|
|
227
|
+
compensateScanTimer = setTimeout(() => {
|
|
228
|
+
compensateScanTimer = null;
|
|
229
|
+
fullScanClearQuarantine(reason);
|
|
230
|
+
}, 200);
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* 停止监听 QBOT_CLAW_DIR 目录,取消 quarantine 属性清除的 watcher。
|
|
234
|
+
*/
|
|
235
|
+
async function stopWatchWorkspaceQuarantine() {
|
|
236
|
+
if (subscription) {
|
|
237
|
+
(0, reportLog_1.log)('[quarantine] 停止监听目录');
|
|
238
|
+
await subscription.unsubscribe();
|
|
239
|
+
subscription = null;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* 监听 QBOT_CLAW_DIR 目录,自动清除新文件的 Gatekeeper 隔离属性。
|
|
244
|
+
*
|
|
245
|
+
* 核心设计:使用 @parcel/watcher(底层直接调用 FSEvents C API)。
|
|
246
|
+
* 相比 Node.js 原生 fs.watch,@parcel/watcher 的事件投递延迟低至 ~10ms,
|
|
247
|
+
* 可以在 npm postinstall 脚本启动二进制文件之前完成 quarantine 属性清除。
|
|
248
|
+
*
|
|
249
|
+
* 优势:
|
|
250
|
+
* - 超低延迟(~10ms vs fs.watch 的数秒延迟)
|
|
251
|
+
* - 精确事件类型(create/update/delete),无需猜测 rename 语义
|
|
252
|
+
* - 原生支持 glob ignore 模式,在 C++ 层过滤无关事件
|
|
253
|
+
* - 整棵目录树只需要 1 个文件描述符
|
|
254
|
+
*
|
|
255
|
+
* 策略:
|
|
256
|
+
* - 只处理 create 事件(文件新增),忽略 update/delete
|
|
257
|
+
* - 通过路径黑名单排除无关目录(纯字符串匹配,零 IO)
|
|
258
|
+
* - 通过扩展名白名单过滤需要处理的文件(.dylib, .so, .node, 无扩展名)
|
|
259
|
+
*/
|
|
260
|
+
async function watchWorkspaceQuarantine() {
|
|
261
|
+
// 确保目录存在
|
|
262
|
+
fs_1.default.mkdirSync(config_1.QBOT_CLAW_DIR, { recursive: true });
|
|
263
|
+
// 如果已有 watcher,先关闭再重建
|
|
264
|
+
if (subscription) {
|
|
265
|
+
(0, reportLog_1.log)('[quarantine] 关闭旧的 watcher,准备重建');
|
|
266
|
+
await subscription.unsubscribe();
|
|
267
|
+
subscription = null;
|
|
268
|
+
}
|
|
269
|
+
try {
|
|
270
|
+
subscription = await watcher.subscribe(config_1.QBOT_CLAW_DIR, (err, events) => {
|
|
271
|
+
if (err) {
|
|
272
|
+
(0, reportLog_1.log)(`[quarantine] watcher 发生错误: ${err.message}`);
|
|
273
|
+
// FSEvents 事件溢出时,立即触发全量补偿扫描
|
|
274
|
+
if (err.message.includes('Events were dropped')) {
|
|
275
|
+
triggerCompensateScan('FSEvents 事件丢失');
|
|
276
|
+
}
|
|
277
|
+
return;
|
|
278
|
+
}
|
|
279
|
+
for (const event of events) {
|
|
280
|
+
// 只关心 create 事件(文件新增)
|
|
281
|
+
if (event.type !== 'create')
|
|
282
|
+
continue;
|
|
283
|
+
const fullPath = event.path;
|
|
284
|
+
// 快速过滤:路径黑名单(纯字符串匹配)
|
|
285
|
+
if (isIgnoredPath(fullPath))
|
|
286
|
+
continue;
|
|
287
|
+
// 快速过滤:扩展名白名单
|
|
288
|
+
if (!needsClearQuarantine(fullPath))
|
|
289
|
+
continue;
|
|
290
|
+
// 检查是否是普通文件(而非目录),避免对目录调用 xattr
|
|
291
|
+
fs_1.default.stat(fullPath, (statErr, stats) => {
|
|
292
|
+
if (statErr || !stats.isFile())
|
|
293
|
+
return;
|
|
294
|
+
clearQuarantineIfNeeded(fullPath);
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
}, {
|
|
298
|
+
backend: 'fs-events',
|
|
299
|
+
ignore: [
|
|
300
|
+
'**/.npm-cache/**',
|
|
301
|
+
'**/_cacache/**',
|
|
302
|
+
'**/.pip-cache/**',
|
|
303
|
+
'**/__pycache__/**',
|
|
304
|
+
'**/.cache/**',
|
|
305
|
+
'**/tmp/**',
|
|
306
|
+
'**/node_modules/.bin/**',
|
|
307
|
+
],
|
|
308
|
+
});
|
|
309
|
+
(0, reportLog_1.log)(`[quarantine] 开始监听目录: ${config_1.QBOT_CLAW_DIR} (使用 @parcel/watcher, 低延迟 FSEvents)`);
|
|
310
|
+
}
|
|
311
|
+
catch (err) {
|
|
312
|
+
(0, reportLog_1.log)(`[quarantine] 启动 watcher 失败: ${err.message}`);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
//# sourceMappingURL=quarantine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quarantine.js","sourceRoot":"","sources":["../src/quarantine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 立刻将队列中所有日志上传(同步等待完成),用于进程退出前调用
|
|
3
|
+
*/
|
|
4
|
+
export declare function flushLogs(): Promise<void>;
|
|
5
|
+
/**
|
|
6
|
+
* 上报日志到 Galileo Telemetry 平台(异步排队,500ms 防抖)
|
|
7
|
+
*
|
|
8
|
+
* 每次调用会立刻捕获当前时间戳和生成独立 trace_id,然后入队等待发送。
|
|
9
|
+
* 两次实际 HTTP 请求之间至少间隔 500ms,期间的日志会合并为一批发送。
|
|
10
|
+
*
|
|
11
|
+
* @param body 日志正文内容
|
|
12
|
+
*/
|
|
13
|
+
export declare function log(body: string): void;
|
|
14
|
+
/**
|
|
15
|
+
* 重新读取 QBotClaw 版本并更新上报属性(安装完成后调用)
|
|
16
|
+
*/
|
|
17
|
+
export declare function refreshClawVersion(version: string): void;
|
|
18
|
+
/**
|
|
19
|
+
* 初始化日志上报参数
|
|
20
|
+
*
|
|
21
|
+
* - 读取环境变量 QB_GUID、QB_QIMEI36 替换默认值
|
|
22
|
+
* - 读取自身(launcher)版本
|
|
23
|
+
* - 读取 QBotClaw 版本
|
|
24
|
+
*
|
|
25
|
+
* 应在程序入口处尽早调用一次
|
|
26
|
+
*/
|
|
27
|
+
export declare function initLog(): void;
|
|
28
|
+
//# sourceMappingURL=reportLog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reportLog.d.ts","sourceRoot":"","sources":["../src/reportLog.ts"],"names":[],"mappings":"AAmMA;;GAEG;AACH,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAc/C;AAED;;;;;;;GAOG;AACH,wBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAOtC;AAgBD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAExD;AAED;;;;;;;;GAQG;AACH,wBAAgB,OAAO,IAAI,IAAI,CAkB9B"}
|
|
@@ -0,0 +1,262 @@
|
|
|
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.flushLogs = flushLogs;
|
|
7
|
+
exports.log = log;
|
|
8
|
+
exports.refreshClawVersion = refreshClawVersion;
|
|
9
|
+
exports.initLog = initLog;
|
|
10
|
+
const https_1 = __importDefault(require("https"));
|
|
11
|
+
const crypto_1 = require("crypto");
|
|
12
|
+
const fs_1 = __importDefault(require("fs"));
|
|
13
|
+
const path_1 = __importDefault(require("path"));
|
|
14
|
+
const config_1 = require("./config");
|
|
15
|
+
/** 日志队列 */
|
|
16
|
+
const logQueue = [];
|
|
17
|
+
/** 上一次发送完成的时间戳 */
|
|
18
|
+
let lastSendTime = 0;
|
|
19
|
+
/** 当前排队的定时器 */
|
|
20
|
+
let pendingTimer = null;
|
|
21
|
+
/** 是否正在发送中 */
|
|
22
|
+
let isSending = false;
|
|
23
|
+
/** 防抖间隔(毫秒) */
|
|
24
|
+
const THROTTLE_MS = 500;
|
|
25
|
+
/** 日志上报的动态属性 */
|
|
26
|
+
let logGuid = 'guidxxx';
|
|
27
|
+
let logQimei36 = 'qimei36';
|
|
28
|
+
let launcherVersion = 'unknown';
|
|
29
|
+
let clawVersion = 'unknown';
|
|
30
|
+
/**
|
|
31
|
+
* 生成 32 位唯一十六进制字符串,用作 trace_id
|
|
32
|
+
* 基于 UUID v4(密码学安全随机),去掉连字符后为 32 位
|
|
33
|
+
*/
|
|
34
|
+
function generateTraceId() {
|
|
35
|
+
return (0, crypto_1.randomUUID)().replace(/-/g, '');
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* 获取当前时间的纳秒级 Unix 时间戳(精度到毫秒,末尾补零至纳秒)
|
|
39
|
+
*/
|
|
40
|
+
function getCurrentTimeUnixNano() {
|
|
41
|
+
return Date.now() * 1000000;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* 将队列中的日志记录构建成请求 payload 并发送
|
|
45
|
+
* @returns Promise<void>
|
|
46
|
+
*/
|
|
47
|
+
function sendLogs(records) {
|
|
48
|
+
if (records.length === 0)
|
|
49
|
+
return Promise.resolve();
|
|
50
|
+
const logRecordsPayload = records.map((record) => ({
|
|
51
|
+
trace_id: record.trace_id,
|
|
52
|
+
body: {
|
|
53
|
+
string_value: record.body,
|
|
54
|
+
},
|
|
55
|
+
time_unix_nano: record.time_unix_nano,
|
|
56
|
+
severity_number: 'SEVERITY_NUMBER_INFO',
|
|
57
|
+
severity_text: 'INFO',
|
|
58
|
+
flags: 1,
|
|
59
|
+
attributes: [
|
|
60
|
+
{
|
|
61
|
+
key: 'guid',
|
|
62
|
+
value: { string_value: logGuid },
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
key: 'qimei36',
|
|
66
|
+
value: { string_value: logQimei36 },
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
key: 'launcher_version',
|
|
70
|
+
value: { string_value: launcherVersion },
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
key: 'claw_version',
|
|
74
|
+
value: { string_value: clawVersion },
|
|
75
|
+
},
|
|
76
|
+
],
|
|
77
|
+
}));
|
|
78
|
+
const payload = {
|
|
79
|
+
resource_logs: [
|
|
80
|
+
{
|
|
81
|
+
instrumentation_library_logs: [
|
|
82
|
+
{
|
|
83
|
+
instrumentation_library: {
|
|
84
|
+
name: 'qbot-launcher-log',
|
|
85
|
+
},
|
|
86
|
+
log_records: logRecordsPayload,
|
|
87
|
+
},
|
|
88
|
+
],
|
|
89
|
+
resource: {
|
|
90
|
+
attributes: [
|
|
91
|
+
{ key: 'telemetry.sdk.language', value: { string_value: 'go' } },
|
|
92
|
+
{ key: 'telemetry.sdk.name', value: { string_value: 'galileo' } },
|
|
93
|
+
{ key: 'telemetry.sdk.version', value: { string_value: '0.0.1' } },
|
|
94
|
+
{ key: 'target', value: { string_value: 'RPC.QBotClaw.Launcher' } },
|
|
95
|
+
{ key: 'namespace', value: { string_value: 'Production' } },
|
|
96
|
+
{ key: 'env', value: { string_value: 'formal' } },
|
|
97
|
+
{ key: 'server', value: { string_value: 'QBotClaw.Launcher' } },
|
|
98
|
+
],
|
|
99
|
+
},
|
|
100
|
+
},
|
|
101
|
+
],
|
|
102
|
+
};
|
|
103
|
+
const data = JSON.stringify(payload);
|
|
104
|
+
return new Promise((resolve, reject) => {
|
|
105
|
+
const options = {
|
|
106
|
+
hostname: 'galileotelemetry.tencent.com',
|
|
107
|
+
port: 443,
|
|
108
|
+
path: '/v1/logs',
|
|
109
|
+
method: 'POST',
|
|
110
|
+
headers: {
|
|
111
|
+
'Content-Type': 'application/json',
|
|
112
|
+
'Content-Length': Buffer.byteLength(data),
|
|
113
|
+
},
|
|
114
|
+
};
|
|
115
|
+
const req = https_1.default.request(options, (res) => {
|
|
116
|
+
let responseBody = '';
|
|
117
|
+
res.on('data', (chunk) => {
|
|
118
|
+
responseBody += chunk.toString();
|
|
119
|
+
});
|
|
120
|
+
res.on('end', () => {
|
|
121
|
+
if (res.statusCode && res.statusCode >= 200 && res.statusCode < 300) {
|
|
122
|
+
resolve();
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
reject(new Error(`日志上报失败,状态码: ${res.statusCode},响应: ${responseBody}`));
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
req.on('error', (err) => {
|
|
130
|
+
reject(new Error(`日志上报请求异常: ${err.message}`));
|
|
131
|
+
});
|
|
132
|
+
req.write(data);
|
|
133
|
+
req.end();
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* 尝试从队列中取出所有日志并发送(带 500ms 节流)
|
|
138
|
+
*/
|
|
139
|
+
function scheduleFlush() {
|
|
140
|
+
if (isSending || logQueue.length === 0)
|
|
141
|
+
return;
|
|
142
|
+
const now = Date.now();
|
|
143
|
+
const elapsed = now - lastSendTime;
|
|
144
|
+
if (elapsed >= THROTTLE_MS) {
|
|
145
|
+
// 距离上次发送已超过 500ms,立刻发送
|
|
146
|
+
doFlush();
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
// 还没到 500ms,排队等候
|
|
150
|
+
if (pendingTimer === null) {
|
|
151
|
+
pendingTimer = setTimeout(() => {
|
|
152
|
+
pendingTimer = null;
|
|
153
|
+
doFlush();
|
|
154
|
+
}, THROTTLE_MS - elapsed);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* 实际执行发送:取出队列中所有日志,发送后继续检查队列
|
|
160
|
+
*/
|
|
161
|
+
function doFlush() {
|
|
162
|
+
if (isSending || logQueue.length === 0)
|
|
163
|
+
return;
|
|
164
|
+
// 取出当前队列中所有日志
|
|
165
|
+
const batch = logQueue.splice(0);
|
|
166
|
+
isSending = true;
|
|
167
|
+
sendLogs(batch)
|
|
168
|
+
.catch(() => {
|
|
169
|
+
// 发送失败静默忽略,不重试(避免阻塞队列)
|
|
170
|
+
})
|
|
171
|
+
.finally(() => {
|
|
172
|
+
lastSendTime = Date.now();
|
|
173
|
+
isSending = false;
|
|
174
|
+
// 发送完后检查队列中是否有新日志
|
|
175
|
+
if (logQueue.length > 0) {
|
|
176
|
+
scheduleFlush();
|
|
177
|
+
}
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* 立刻将队列中所有日志上传(同步等待完成),用于进程退出前调用
|
|
182
|
+
*/
|
|
183
|
+
async function flushLogs() {
|
|
184
|
+
// 清除待执行的定时器
|
|
185
|
+
if (pendingTimer !== null) {
|
|
186
|
+
clearTimeout(pendingTimer);
|
|
187
|
+
pendingTimer = null;
|
|
188
|
+
}
|
|
189
|
+
if (logQueue.length === 0)
|
|
190
|
+
return Promise.resolve();
|
|
191
|
+
const batch = logQueue.splice(0);
|
|
192
|
+
try {
|
|
193
|
+
return await sendLogs(batch);
|
|
194
|
+
}
|
|
195
|
+
catch {
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* 上报日志到 Galileo Telemetry 平台(异步排队,500ms 防抖)
|
|
200
|
+
*
|
|
201
|
+
* 每次调用会立刻捕获当前时间戳和生成独立 trace_id,然后入队等待发送。
|
|
202
|
+
* 两次实际 HTTP 请求之间至少间隔 500ms,期间的日志会合并为一批发送。
|
|
203
|
+
*
|
|
204
|
+
* @param body 日志正文内容
|
|
205
|
+
*/
|
|
206
|
+
function log(body) {
|
|
207
|
+
logQueue.push({
|
|
208
|
+
trace_id: generateTraceId(),
|
|
209
|
+
body,
|
|
210
|
+
time_unix_nano: getCurrentTimeUnixNano(),
|
|
211
|
+
});
|
|
212
|
+
scheduleFlush();
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* 读取 QBotClaw 版本(从 npm 全局安装目录的 package.json 中获取)
|
|
216
|
+
*/
|
|
217
|
+
function readClawVersion() {
|
|
218
|
+
try {
|
|
219
|
+
const pkgPath = path_1.default.join(config_1.NPM_GLOBAL_MODULES, config_1.NPM_PACKAGE_NAME, 'package.json');
|
|
220
|
+
const pkg = JSON.parse(fs_1.default.readFileSync(pkgPath, 'utf-8'));
|
|
221
|
+
return pkg.version || 'unknown';
|
|
222
|
+
}
|
|
223
|
+
catch {
|
|
224
|
+
return 'unknown';
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* 重新读取 QBotClaw 版本并更新上报属性(安装完成后调用)
|
|
229
|
+
*/
|
|
230
|
+
function refreshClawVersion(version) {
|
|
231
|
+
clawVersion = version;
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* 初始化日志上报参数
|
|
235
|
+
*
|
|
236
|
+
* - 读取环境变量 QB_GUID、QB_QIMEI36 替换默认值
|
|
237
|
+
* - 读取自身(launcher)版本
|
|
238
|
+
* - 读取 QBotClaw 版本
|
|
239
|
+
*
|
|
240
|
+
* 应在程序入口处尽早调用一次
|
|
241
|
+
*/
|
|
242
|
+
function initLog() {
|
|
243
|
+
// 读取环境变量
|
|
244
|
+
const envGuid = process.env.QB_GUID;
|
|
245
|
+
const envQimei36 = process.env.QB_QIMEI36;
|
|
246
|
+
if (envGuid)
|
|
247
|
+
logGuid = envGuid;
|
|
248
|
+
if (envQimei36)
|
|
249
|
+
logQimei36 = envQimei36;
|
|
250
|
+
// 读取自身版本(launcher 的 package.json)
|
|
251
|
+
try {
|
|
252
|
+
const launcherPkgPath = path_1.default.resolve(__dirname, '..', 'package.json');
|
|
253
|
+
const launcherPkg = JSON.parse(fs_1.default.readFileSync(launcherPkgPath, 'utf-8'));
|
|
254
|
+
launcherVersion = launcherPkg.version || 'unknown';
|
|
255
|
+
}
|
|
256
|
+
catch {
|
|
257
|
+
launcherVersion = 'unknown';
|
|
258
|
+
}
|
|
259
|
+
// 读取 QBotClaw 版本
|
|
260
|
+
clawVersion = readClawVersion();
|
|
261
|
+
}
|
|
262
|
+
//# sourceMappingURL=reportLog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reportLog.js","sourceRoot":"","sources":["../src/reportLog.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAyBxB,eAAO,MAAM,MAAM,sEA2VjB,CAAC;AAOH,wBAAgB,kBAAkB,CAAC,IAAI,CAAC,EAAE,MAAM,QAgE/C"}
|