@qqbrowser/qbot-claw-launcher 0.9.63 → 0.9.64

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.
@@ -0,0 +1,215 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AuthClient = exports.AuthExpiredError = exports.AUTH_ERROR_CODES = void 0;
4
+ const reportLog_1 = require("../reportLog");
5
+ const qb_pipe_client_1 = require("./qb-pipe-client");
6
+ exports.AUTH_ERROR_CODES = {
7
+ SOCIAL_TOKEN_EXPIRED: '-28',
8
+ QB_TOKEN_EXPIRED: '-34',
9
+ };
10
+ class AuthExpiredError extends Error {
11
+ constructor(code, message) {
12
+ super(message);
13
+ this.name = 'AuthExpiredError';
14
+ this.code = code;
15
+ }
16
+ }
17
+ exports.AuthExpiredError = AuthExpiredError;
18
+ class AuthClient {
19
+ constructor(options = {}) {
20
+ this.pipeClient = null;
21
+ this.pipeInitPromise = null;
22
+ this.cachedAccountInfo = null;
23
+ this.cachedDeviceInfo = null;
24
+ this.loginInfo = options.loginInfo;
25
+ this.onTokenRefresh = options.onTokenRefresh;
26
+ this.maxRetry = options.maxRetry ?? 1;
27
+ this.usePipe = options.usePipe ?? false;
28
+ if (this.usePipe && !this.onTokenRefresh) {
29
+ this.onTokenRefresh = (expiredCode) => this._refreshViaPipe(expiredCode);
30
+ }
31
+ }
32
+ setLoginInfo(loginInfo) {
33
+ this.loginInfo = loginInfo;
34
+ }
35
+ getLoginInfo() {
36
+ return this.loginInfo;
37
+ }
38
+ setTokenRefreshCallback(cb) {
39
+ this.onTokenRefresh = cb;
40
+ }
41
+ async ensureLoginInfo() {
42
+ if (this.loginInfo && !this.usePipe) {
43
+ return;
44
+ }
45
+ if (this.loginInfo && this.cachedAccountInfo) {
46
+ return;
47
+ }
48
+ if (!this.usePipe) {
49
+ return;
50
+ }
51
+ if (this.pipeInitPromise) {
52
+ await this.pipeInitPromise;
53
+ return;
54
+ }
55
+ this.pipeInitPromise = this._initFromPipe();
56
+ try {
57
+ await this.pipeInitPromise;
58
+ }
59
+ finally {
60
+ this.pipeInitPromise = null;
61
+ }
62
+ }
63
+ getCachedAccountInfo() {
64
+ return this.cachedAccountInfo;
65
+ }
66
+ getCachedDeviceInfo() {
67
+ return this.cachedDeviceInfo;
68
+ }
69
+ buildOverRideInfo() {
70
+ if (!this.cachedDeviceInfo) {
71
+ return undefined;
72
+ }
73
+ const qua2 = String(this.cachedDeviceInfo.qua2 || this.cachedDeviceInfo.qua || '');
74
+ const qimei36 = String(this.cachedDeviceInfo.qimei36 || '');
75
+ if (!qua2 && !qimei36) {
76
+ return undefined;
77
+ }
78
+ return {
79
+ 'q-qua2': qua2,
80
+ 'q-qimei36': qimei36,
81
+ };
82
+ }
83
+ getPipeClient() {
84
+ return this.pipeClient;
85
+ }
86
+ closePipe() {
87
+ if (this.pipeClient) {
88
+ this.pipeClient.close();
89
+ this.pipeClient = null;
90
+ }
91
+ }
92
+ async _initFromPipe() {
93
+ (0, reportLog_1.log)('[AuthClient] 通过 QB Pipe 获取账号信息...');
94
+ await this._ensurePipeConnected();
95
+ const [accountResponse, deviceResponse] = await Promise.all([
96
+ this.pipeClient.getAccountInfo(),
97
+ this.pipeClient.getBrowserParam(),
98
+ ]);
99
+ if (accountResponse.error) {
100
+ throw new Error(`获取账号信息失败: ${accountResponse.error}`);
101
+ }
102
+ if (!accountResponse.result) {
103
+ throw new Error('获取账号信息返回空结果');
104
+ }
105
+ const accountInfo = accountResponse.result;
106
+ if (!accountInfo.isLogin) {
107
+ throw new Error('QB 浏览器未登录,请先登录后再试');
108
+ }
109
+ this.cachedAccountInfo = accountInfo;
110
+ if (deviceResponse.result) {
111
+ this.cachedDeviceInfo = deviceResponse.result;
112
+ (0, reportLog_1.log)(`[AuthClient] 设备信息获取成功: qua2=${this.cachedDeviceInfo.qua2 || this.cachedDeviceInfo.qua || ''}, qimei36=${this.cachedDeviceInfo.qimei36 || ''}`);
113
+ }
114
+ else {
115
+ (0, reportLog_1.log)(`[AuthClient] 设备信息获取失败(非关键): ${deviceResponse.error || '空结果'}`);
116
+ }
117
+ this.loginInfo = this._mapToLoginInfo(accountInfo);
118
+ (0, reportLog_1.log)(`[AuthClient] 账号信息获取成功,qbid=${accountInfo.qbid}`);
119
+ }
120
+ async _ensurePipeConnected() {
121
+ if (this.pipeClient?.isConnected()) {
122
+ return;
123
+ }
124
+ this.pipeClient = new qb_pipe_client_1.QBPipeClient();
125
+ await this.pipeClient.connect();
126
+ }
127
+ async _refreshViaPipe(expiredCode) {
128
+ (0, reportLog_1.log)(`[AuthClient] 通过 QB Pipe 刷新票据 (code=${expiredCode})...`);
129
+ await this._ensurePipeConnected();
130
+ const tokenType = expiredCode === exports.AUTH_ERROR_CODES.QB_TOKEN_EXPIRED ? 'qbtoken' : 'token';
131
+ const refreshResponse = await this.pipeClient.refreshToken(tokenType);
132
+ if (refreshResponse.error) {
133
+ throw new Error(`刷新票据失败: ${refreshResponse.error}`);
134
+ }
135
+ (0, reportLog_1.log)(`[AuthClient] Pipe 刷新票据成功,重新获取账号信息...`);
136
+ const accountResponse = await this.pipeClient.getAccountInfo();
137
+ if (accountResponse.error || !accountResponse.result) {
138
+ throw new Error(`刷新后获取账号信息失败: ${accountResponse.error}`);
139
+ }
140
+ this.cachedAccountInfo = accountResponse.result;
141
+ this.loginInfo = this._mapToLoginInfo(accountResponse.result);
142
+ (0, reportLog_1.log)(`[AuthClient] 票据刷新完成,qbid=${accountResponse.result.qbid}`);
143
+ return this.loginInfo;
144
+ }
145
+ _mapToLoginInfo(info) {
146
+ return {
147
+ guid: info.guid,
148
+ openid: info.openid,
149
+ access_token: info.access_token,
150
+ qbaccess_token: info.qbaccess_token,
151
+ qbid: info.qbid,
152
+ appid: info.appid,
153
+ account_type: String(info.account_type),
154
+ };
155
+ }
156
+ async callWithAuth(apiFn) {
157
+ if (this.usePipe) {
158
+ await this.ensureLoginInfo();
159
+ }
160
+ const overRideInfo = this.buildOverRideInfo();
161
+ let lastError;
162
+ for (let attempt = 0; attempt <= this.maxRetry; attempt++) {
163
+ try {
164
+ return await apiFn(this.loginInfo, overRideInfo);
165
+ }
166
+ catch (err) {
167
+ lastError = err;
168
+ const errorCode = this.extractAuthErrorCode(err);
169
+ if (!errorCode) {
170
+ throw err;
171
+ }
172
+ const errorType = errorCode === exports.AUTH_ERROR_CODES.SOCIAL_TOKEN_EXPIRED ? '社交票据' : 'QB票据';
173
+ (0, reportLog_1.log)(`[AuthClient] ${errorType}过期 (code=${errorCode}),第 ${attempt + 1}/${this.maxRetry + 1} 次尝试`);
174
+ if (attempt >= this.maxRetry) {
175
+ (0, reportLog_1.log)(`[AuthClient] 已达最大重试次数,抛出 AuthExpiredError`);
176
+ throw new AuthExpiredError(errorCode, `${errorType}过期且刷新失败 (code=${errorCode})`);
177
+ }
178
+ if (!this.onTokenRefresh) {
179
+ (0, reportLog_1.log)(`[AuthClient] 未设置刷票回调,无法自动刷新`);
180
+ throw new AuthExpiredError(errorCode, `${errorType}过期但未配置刷新回调 (code=${errorCode})`);
181
+ }
182
+ try {
183
+ const newLoginInfo = await this.onTokenRefresh(errorCode);
184
+ this.loginInfo = newLoginInfo;
185
+ (0, reportLog_1.log)(`[AuthClient] 刷票成功,使用新 loginInfo 重试`);
186
+ }
187
+ catch (refreshErr) {
188
+ (0, reportLog_1.log)(`[AuthClient] 刷票回调执行失败: ${refreshErr?.message}`);
189
+ throw new AuthExpiredError(errorCode, `${errorType}过期且刷新失败: ${refreshErr?.message}`);
190
+ }
191
+ }
192
+ }
193
+ throw lastError;
194
+ }
195
+ extractAuthErrorCode(err) {
196
+ const code = String(err?.err?.code ?? err?.code ?? '');
197
+ if (code === exports.AUTH_ERROR_CODES.SOCIAL_TOKEN_EXPIRED ||
198
+ code === exports.AUTH_ERROR_CODES.QB_TOKEN_EXPIRED) {
199
+ return code;
200
+ }
201
+ try {
202
+ const errStr = typeof err === 'string' ? err : JSON.stringify(err);
203
+ for (const authCode of Object.values(exports.AUTH_ERROR_CODES)) {
204
+ if (errStr.includes(`"code":"${authCode}"`) || errStr.includes(`"code": "${authCode}"`)) {
205
+ return authCode;
206
+ }
207
+ }
208
+ }
209
+ catch {
210
+ }
211
+ return null;
212
+ }
213
+ }
214
+ exports.AuthClient = AuthClient;
215
+ //# sourceMappingURL=auth-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-client.js","sourceRoot":"","sources":["../../src/api/auth-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.reviewText = exports.ContentReviewFailedError = exports.contentReviewApi = exports.getUserBaseInfo = exports.AuditContentType = void 0;
4
+ const trpc_1 = require("./trpc");
5
+ const reportLog_1 = require("../reportLog");
6
+ var AuditContentType;
7
+ (function (AuditContentType) {
8
+ AuditContentType[AuditContentType["UNSPECIFIED"] = 0] = "UNSPECIFIED";
9
+ AuditContentType[AuditContentType["INPUT"] = 1] = "INPUT";
10
+ AuditContentType[AuditContentType["OUTPUT"] = 2] = "OUTPUT";
11
+ AuditContentType[AuditContentType["THINKING"] = 3] = "THINKING";
12
+ })(AuditContentType || (exports.AuditContentType = AuditContentType = {}));
13
+ const getUserBaseInfo = async (authClient) => {
14
+ const deviceInfo = authClient?.getCachedDeviceInfo();
15
+ const loginInfo = authClient?.getLoginInfo();
16
+ const guid = String(loginInfo?.guid || process.env.QB_GUID || '');
17
+ const qimei36 = String(deviceInfo?.qimei36 || process.env.QB_QIMEI36 || '');
18
+ const qua2 = String(deviceInfo?.qua2 || deviceInfo?.qua || process.env.QB_QUA2 || '');
19
+ return { guid, qimei36, qua2 };
20
+ };
21
+ exports.getUserBaseInfo = getUserBaseInfo;
22
+ class ContentReviewApi extends trpc_1.TrpcApi {
23
+ constructor() {
24
+ super({
25
+ servantName: 'trpc_mtt_content_review_ContentReview',
26
+ scene: trpc_1.Scene.external,
27
+ isAuth: true,
28
+ });
29
+ this.getReviewResult = (body, loginInfo, overRideInfo) => this.callOrThrow('GetReviewResult', body, {
30
+ ...(loginInfo ? { loginInfo } : {}),
31
+ ...(overRideInfo ? { overRideInfo } : {}),
32
+ });
33
+ }
34
+ }
35
+ exports.contentReviewApi = new ContentReviewApi();
36
+ class ContentReviewFailedError extends Error {
37
+ constructor(fallbackMsg) {
38
+ super('内容审核未通过');
39
+ this.name = 'ContentReviewFailedError';
40
+ this.fallbackMsg = fallbackMsg;
41
+ }
42
+ }
43
+ exports.ContentReviewFailedError = ContentReviewFailedError;
44
+ const reviewText = async (text, auditContentType, sessionId, authOrLoginInfo) => {
45
+ const isAuthClient = authOrLoginInfo && 'callWithAuth' in authOrLoginInfo;
46
+ const authClient = isAuthClient ? authOrLoginInfo : undefined;
47
+ if (authClient) {
48
+ await authClient.ensureLoginInfo();
49
+ (0, reportLog_1.log)(`[content-review] AuthClient 状态: loginInfo=${JSON.stringify(authClient.getLoginInfo())}, deviceInfo=${JSON.stringify(authClient.getCachedDeviceInfo())}`);
50
+ }
51
+ const userBaseInfo = await (0, exports.getUserBaseInfo)(authClient);
52
+ (0, reportLog_1.log)(`[content-review] userBaseInfo: ${JSON.stringify(userBaseInfo)}`);
53
+ const body = {
54
+ user_base_info: userBaseInfo,
55
+ session_id: sessionId,
56
+ text,
57
+ audit_content_type: auditContentType,
58
+ };
59
+ let rsp;
60
+ if (authClient) {
61
+ rsp = await authClient.callWithAuth((loginInfo, overRideInfo) => exports.contentReviewApi.getReviewResult(body, loginInfo, overRideInfo));
62
+ }
63
+ else {
64
+ rsp = await exports.contentReviewApi.getReviewResult(body, authOrLoginInfo);
65
+ }
66
+ if (!rsp.pass) {
67
+ throw new ContentReviewFailedError(rsp.fallback_msg);
68
+ }
69
+ return rsp.session_id;
70
+ };
71
+ exports.reviewText = reviewText;
72
+ //# sourceMappingURL=content-review.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content-review.js","sourceRoot":"","sources":["../../src/api/content-review.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.fetchLlmToken = exports.TokenExhaustedError = exports.llmAccessProxyApi = exports.getUserBase = void 0;
4
+ const trpc_1 = require("./trpc");
5
+ const reportLog_1 = require("../reportLog");
6
+ const getUserBase = async (authClient) => {
7
+ const deviceInfo = authClient?.getCachedDeviceInfo();
8
+ const qimei36 = String(deviceInfo?.qimei36 || process.env.QB_QIMEI36 || '');
9
+ const qua2 = String(deviceInfo?.qua2 || deviceInfo?.qua || process.env.QB_QUA2 || '');
10
+ return { qimei36, qua2 };
11
+ };
12
+ exports.getUserBase = getUserBase;
13
+ class LlmAccessProxyApi extends trpc_1.TrpcApi {
14
+ constructor() {
15
+ super({
16
+ servantName: 'trpc_mtt_llm_access_proxy_LlmAccessProxy',
17
+ scene: trpc_1.Scene.external,
18
+ isAuth: true,
19
+ });
20
+ this.encodeToken = (body, loginInfo, overRideInfo) => this.callOrThrow('EncodeToken', body, {
21
+ ...(loginInfo ? { loginInfo } : {}),
22
+ ...(overRideInfo ? { overRideInfo } : {}),
23
+ });
24
+ }
25
+ }
26
+ exports.llmAccessProxyApi = new LlmAccessProxyApi();
27
+ class TokenExhaustedError extends Error {
28
+ constructor() {
29
+ super('当日Token已耗尽,请切换模型或明日再试');
30
+ this.name = 'TokenExhaustedError';
31
+ }
32
+ }
33
+ exports.TokenExhaustedError = TokenExhaustedError;
34
+ const fetchLlmToken = async (authOrLoginInfo) => {
35
+ const isAuthClient = authOrLoginInfo && 'callWithAuth' in authOrLoginInfo;
36
+ const authClient = isAuthClient ? authOrLoginInfo : undefined;
37
+ if (authClient) {
38
+ await authClient.ensureLoginInfo();
39
+ (0, reportLog_1.log)(`[openai-proxy] AuthClient 状态: loginInfo=${JSON.stringify(authClient.getLoginInfo())}, accountInfo=${JSON.stringify(authClient.getCachedAccountInfo())}, deviceInfo=${JSON.stringify(authClient.getCachedDeviceInfo())}, overRideInfo=${JSON.stringify(authClient.buildOverRideInfo())}`);
40
+ }
41
+ const base = await (0, exports.getUserBase)(authClient);
42
+ (0, reportLog_1.log)(`[openai-proxy] base: ${JSON.stringify(base)}`);
43
+ let rsp;
44
+ if (authClient) {
45
+ rsp = await authClient.callWithAuth((loginInfo, overRideInfo) => exports.llmAccessProxyApi.encodeToken({ base }, loginInfo, overRideInfo));
46
+ }
47
+ else {
48
+ rsp = await exports.llmAccessProxyApi.encodeToken({ base }, authOrLoginInfo);
49
+ }
50
+ if (rsp.rsp?.ret === 1101) {
51
+ throw new TokenExhaustedError();
52
+ }
53
+ if (!rsp.token) {
54
+ throw new Error(`EncodeToken returned empty token (ret=${rsp.rsp?.ret}, reason=${rsp.rsp?.reason})`);
55
+ }
56
+ return rsp.token;
57
+ };
58
+ exports.fetchLlmToken = fetchLlmToken;
59
+ //# sourceMappingURL=llm-access-proxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-access-proxy.js","sourceRoot":"","sources":["../../src/api/llm-access-proxy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,183 @@
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.QBPipeClient = void 0;
7
+ const net_1 = __importDefault(require("net"));
8
+ const fs_1 = __importDefault(require("fs"));
9
+ const path_1 = __importDefault(require("path"));
10
+ const os_1 = __importDefault(require("os"));
11
+ const reportLog_1 = require("../reportLog");
12
+ function convertAccountType(mode) {
13
+ if (!mode) {
14
+ return 4;
15
+ }
16
+ if (mode === 3) {
17
+ return 2;
18
+ }
19
+ else if (mode === 2 || mode === 5) {
20
+ return 4;
21
+ }
22
+ return mode;
23
+ }
24
+ class QBPipeClient {
25
+ constructor() {
26
+ this.pipePath = null;
27
+ this.token = null;
28
+ this._id = 0;
29
+ this.client = null;
30
+ this._pendingCallbacks = new Map();
31
+ this._buffer = '';
32
+ this._accountInfoCache = null;
33
+ }
34
+ _getTokenFilePath() {
35
+ if (process.platform === 'darwin') {
36
+ return path_1.default.join(os_1.default.homedir(), 'Library', 'Application Support', 'QQBrowser3', 'ipc_token');
37
+ }
38
+ else if (process.platform === 'win32') {
39
+ return path_1.default.join(process.env.LOCALAPPDATA || '', 'QQBrowser3', 'User Data', 'ipc_token');
40
+ }
41
+ else if (process.platform === 'linux') {
42
+ return path_1.default.join(os_1.default.homedir(), '.config', 'qqbrowser', 'ipc_token');
43
+ }
44
+ throw new Error(`不支持的平台: ${process.platform}`);
45
+ }
46
+ _discover() {
47
+ const tokenFile = this._getTokenFilePath();
48
+ if (!fs_1.default.existsSync(tokenFile)) {
49
+ throw new Error(`QB浏览器未启动或未开启IPC服务\nToken 文件不存在: ${tokenFile}`);
50
+ }
51
+ const lines = fs_1.default.readFileSync(tokenFile, 'utf-8').trim().split('\n');
52
+ if (lines.length < 3) {
53
+ throw new Error(`Token 文件格式错误,期望3行(PID/Token/PipePath),实际${lines.length}行`);
54
+ }
55
+ return {
56
+ pid: parseInt(lines[0], 10),
57
+ token: lines[1],
58
+ pipePath: lines[2],
59
+ };
60
+ }
61
+ async connect() {
62
+ const discovery = this._discover();
63
+ this.pipePath = discovery.pipePath;
64
+ this.token = discovery.token;
65
+ return new Promise((resolve, reject) => {
66
+ this.client = net_1.default.createConnection({ path: this.pipePath }, async () => {
67
+ (0, reportLog_1.log)(`[QBPipeClient] 已连接到 QB 浏览器 (${this.pipePath})`);
68
+ this.client.on('data', (data) => this._onData(data));
69
+ try {
70
+ const authResult = await this._call('auth', { token: this.token });
71
+ if (authResult.error) {
72
+ reject(new Error(`鉴权失败: ${authResult.error}`));
73
+ return;
74
+ }
75
+ if (authResult.result?.authenticated) {
76
+ (0, reportLog_1.log)('[QBPipeClient] 鉴权成功');
77
+ resolve();
78
+ }
79
+ else {
80
+ reject(new Error(`鉴权失败: ${JSON.stringify(authResult)}`));
81
+ }
82
+ }
83
+ catch (e) {
84
+ reject(e);
85
+ }
86
+ });
87
+ this.client.on('error', (err) => {
88
+ reject(new Error(`连接错误: ${err.message}`));
89
+ });
90
+ this.client.on('close', () => {
91
+ (0, reportLog_1.log)('[QBPipeClient] 连接已关闭');
92
+ for (const [, cb] of this._pendingCallbacks) {
93
+ cb.reject(new Error('连接已关闭'));
94
+ }
95
+ this._pendingCallbacks.clear();
96
+ });
97
+ });
98
+ }
99
+ close() {
100
+ if (this.client) {
101
+ this.client.end();
102
+ this.client = null;
103
+ }
104
+ }
105
+ isConnected() {
106
+ return this.client !== null && !this.client.destroyed;
107
+ }
108
+ _onData(data) {
109
+ this._buffer += data.toString();
110
+ let pos;
111
+ while ((pos = this._buffer.indexOf('\n')) !== -1) {
112
+ const line = this._buffer.substring(0, pos);
113
+ this._buffer = this._buffer.substring(pos + 1);
114
+ if (line.trim()) {
115
+ try {
116
+ const response = JSON.parse(line);
117
+ const cb = this._pendingCallbacks.get(response.id);
118
+ if (cb) {
119
+ this._pendingCallbacks.delete(response.id);
120
+ clearTimeout(cb.timer);
121
+ cb.resolve(response);
122
+ }
123
+ }
124
+ catch (e) {
125
+ (0, reportLog_1.log)(`[QBPipeClient] 解析响应失败: ${e.message}`);
126
+ }
127
+ }
128
+ }
129
+ }
130
+ _call(method, params) {
131
+ return new Promise((resolve, reject) => {
132
+ if (!this.client || this.client.destroyed) {
133
+ reject(new Error('未连接到 QB 浏览器'));
134
+ return;
135
+ }
136
+ this._id++;
137
+ const id = this._id;
138
+ const request = { id, method };
139
+ if (params) {
140
+ request.params = params;
141
+ }
142
+ const timer = setTimeout(() => {
143
+ if (this._pendingCallbacks.has(id)) {
144
+ this._pendingCallbacks.delete(id);
145
+ reject(new Error(`请求超时: ${method}`));
146
+ }
147
+ }, 5000);
148
+ this._pendingCallbacks.set(id, {
149
+ resolve: resolve,
150
+ reject,
151
+ timer,
152
+ });
153
+ this.client.write(JSON.stringify(request) + '\n');
154
+ });
155
+ }
156
+ async getAccountInfo() {
157
+ if (this._accountInfoCache) {
158
+ return this._accountInfoCache;
159
+ }
160
+ const resp = await this._call('getAccountInfo');
161
+ if (resp.result) {
162
+ resp.result.account_type = convertAccountType(resp.result.account_type);
163
+ }
164
+ this._accountInfoCache = resp;
165
+ return resp;
166
+ }
167
+ clearAccountInfoCache() {
168
+ this._accountInfoCache = null;
169
+ }
170
+ async refreshToken(tokenType = 'token') {
171
+ const resp = await this._call('refreshToken', { tokenType });
172
+ this.clearAccountInfoCache();
173
+ return resp;
174
+ }
175
+ async getBrowserParam() {
176
+ return this._call('getBrowserParam');
177
+ }
178
+ async isLogin() {
179
+ return this._call('isLogin');
180
+ }
181
+ }
182
+ exports.QBPipeClient = QBPipeClient;
183
+ //# sourceMappingURL=qb-pipe-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qb-pipe-client.js","sourceRoot":"","sources":["../../src/api/qb-pipe-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TrpcError = exports.TrpcClient = exports.Scene = void 0;
4
+ const qb_auth_send_h5_1 = require("@tencent/qb-auth-send-h5");
5
+ Object.defineProperty(exports, "Scene", { enumerable: true, get: function () { return qb_auth_send_h5_1.Scene; } });
6
+ class TrpcClient {
7
+ constructor(options) {
8
+ this.defaultServantName = options.servantName;
9
+ this.defaultScene = options.scene ?? qb_auth_send_h5_1.Scene.windows;
10
+ this.defaultIsAuth = options.isAuth ?? false;
11
+ this.defaultDebug = options.debug ?? false;
12
+ }
13
+ async request(funcName, body, config = {}) {
14
+ const { servantName = this.defaultServantName, scene = this.defaultScene, isAuth = this.defaultIsAuth, debug = this.defaultDebug, loginInfo, overRideInfo, ...restConfig } = config;
15
+ const authOptions = {
16
+ servantName,
17
+ funcName,
18
+ scene,
19
+ isAuth,
20
+ debug,
21
+ ...restConfig,
22
+ };
23
+ const extInfo = loginInfo || overRideInfo
24
+ ? { loginInfo, overRideInfo }
25
+ : undefined;
26
+ return (0, qb_auth_send_h5_1.authSend)(authOptions, body, extInfo);
27
+ }
28
+ async requestOrThrow(funcName, body, config = {}) {
29
+ const res = await this.request(funcName, body, config);
30
+ const safeRes = typeof res === 'string' ? JSON.parse(res) : res;
31
+ return safeRes;
32
+ }
33
+ }
34
+ exports.TrpcClient = TrpcClient;
35
+ class TrpcError extends Error {
36
+ constructor(code, msg, response) {
37
+ super(msg);
38
+ this.name = 'TrpcError';
39
+ this.code = code;
40
+ this.response = response;
41
+ }
42
+ }
43
+ exports.TrpcError = TrpcError;
44
+ //# sourceMappingURL=trpc-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trpc-client.js","sourceRoot":"","sources":["../../src/api/trpc-client.ts"],"names":[],"mappings":";;;AAAA,8DAA+G;AAkCtG,sFAlCU,uBAAK,OAkCV;AAkBd,MAAa,UAAU;IAMrB,YAAY,OAA0B;QACpC,IAAI,CAAC,kBAAkB,GAAG,OAAO,CAAC,WAAW,CAAC;QAC9C,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,KAAK,IAAI,uBAAK,CAAC,OAAO,CAAC;QACnD,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC;QAC7C,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC;IAC7C,CAAC;IASS,KAAK,CAAC,OAAO,CACrB,QAAgB,EAChB,IAAW,EACX,SAA4B,EAAE;QAE9B,MAAM,EACJ,WAAW,GAAG,IAAI,CAAC,kBAAkB,EACrC,KAAK,GAAG,IAAI,CAAC,YAAY,EACzB,MAAM,GAAG,IAAI,CAAC,aAAa,EAC3B,KAAK,GAAG,IAAI,CAAC,YAAY,EACzB,SAAS,EACT,YAAY,EACZ,GAAG,UAAU,EACd,GAAG,MAAM,CAAC;QAEX,MAAM,WAAW,GAAoB;YACnC,WAAW;YACX,QAAQ;YACR,KAAK;YACL,MAAM;YACN,KAAK;YACL,GAAG,UAAU;SACd,CAAC;QAEF,MAAM,OAAO,GAAwB,SAAS,IAAI,YAAY;YAC5D,CAAC,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE;YAC7B,CAAC,CAAC,SAAS,CAAC;QAEd,OAAO,IAAA,0BAAQ,EAAC,WAAW,EAAE,IAAI,EAAE,OAAO,CAAgC,CAAC;IAC7E,CAAC;IAMS,KAAK,CAAC,cAAc,CAC5B,QAAgB,EAChB,IAAW,EACX,SAA4B,EAAE;QAE9B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAe,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QACrE,MAAM,OAAO,GAAG,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QAChE,OAAO,OAAO,CAAC;IACjB,CAAC;CACF;AAhED,gCAgEC;AAKD,MAAa,SAAU,SAAQ,KAAK;IAIlC,YAAY,IAAY,EAAE,GAAW,EAAE,QAAqB;QAC1D,KAAK,CAAC,GAAG,CAAC,CAAC;QACX,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;CACF;AAVD,8BAUC"}
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TrpcApi = exports.Scene = void 0;
4
+ const trpc_client_1 = require("./trpc-client");
5
+ Object.defineProperty(exports, "Scene", { enumerable: true, get: function () { return trpc_client_1.Scene; } });
6
+ class TrpcApi extends trpc_client_1.TrpcClient {
7
+ call(funcName, body, config) {
8
+ return this.request(funcName, body, config);
9
+ }
10
+ callOrThrow(funcName, body, config) {
11
+ return this.requestOrThrow(funcName, body, config);
12
+ }
13
+ }
14
+ exports.TrpcApi = TrpcApi;
15
+ //# sourceMappingURL=trpc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trpc.js","sourceRoot":"","sources":["../../src/api/trpc.ts"],"names":[],"mappings":";;;AAAA,+CAAoH;AAG3G,sFAH8E,mBAAK,OAG9E;AA8Bd,MAAa,OAAQ,SAAQ,wBAAU;IAI3B,IAAI,CACZ,QAAgB,EAChB,IAAW,EACX,MAA0B;QAE1B,OAAO,IAAI,CAAC,OAAO,CAAe,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAC5D,CAAC;IAMS,WAAW,CACnB,QAAgB,EAChB,IAAW,EACX,MAA0B;QAE1B,OAAO,IAAI,CAAC,cAAc,CAAe,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IACnE,CAAC;CACF;AAvBD,0BAuBC"}
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.verifyServiceToken=s,exports.verifyOrigin=n,exports.authenticateRequest=u;const o=["https://quickstart.imtt.qq.com","https://quickstarttest.imtt.qq.com","https://browser.qq.com"];function s(t,e){return!0}function n(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 o.some(i=>{try{return new URL(i).origin===r}catch{return!1}})}catch{return!1}}function u(t,e){return s(t,e)?n(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"}}
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.verifyOrigin=r,exports.authenticateRequest=u;const n=["https://quickstart.imtt.qq.com","https://quickstarttest.imtt.qq.com","https://browser.qq.com"];function r(e){const t=e.headers.origin;if(!t)return!1;if(t.startsWith("chrome-extension://")||t.startsWith("moz-extension://"))return!0;try{const s=new URL(t).origin;return n.some(i=>{try{return new URL(i).origin===s}catch{return!1}})}catch{return!1}}function u(e){return r(e)?{ok:!0,statusCode:200,message:""}:{ok:!1,statusCode:403,message:"\u8BF7\u6C42\u6765\u6E90\u4E0D\u5728\u5141\u8BB8\u5217\u8868\u4E2D"}}
package/dist/installer.js CHANGED
@@ -1,6 +1,6 @@
1
- "use strict";var d=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=A,exports.configAndRunQBotClaw=N,exports.runInstall=$;const c=d(require("fs")),u=d(require("path")),_=require("child_process"),s=require("./config"),w=require("./utils"),p=require("./state"),f=require("./quarantine"),a=require("./reportLog");function g(t,o,r,i){if(t&&t.writable){const e=o>0?Math.round(r/o*1e4)/100:0;try{t.write(JSON.stringify({status:"downloading",progress:e,totalSteps:o,currentStep:r,message:i})+`
2
- `)}catch{}}}exports.installState={status:"idle",message:"\u672A\u5F00\u59CB"},exports.isInstalling=!1,exports.PYTHON_DIR=u.default.join(s.QBOT_CLAW_DIR,"python");function A(t,o){return new Promise(r=>{const i=(0,_.spawn)(s.QBOTCLAW_BIN,t,{stdio:["ignore","pipe","pipe"],env:{PATH:s.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}`),r()}),i.on("error",e=>{(0,a.log)(`[QBotClaw] \u542F\u52A8\u5931\u8D25: ${e.message}`),r()})})}function I(){c.default.existsSync(s.QBOT_CLAW_DIR)||c.default.mkdirSync(s.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 C(t){if(c.default.existsSync(s.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,r)=>{const i=(0,_.spawn)(s.NPM_BIN,["--userconfig",s.NPM_RC,"install","-g","mcporter"],{stdio:["ignore","pipe","pipe"],env:{...process.env,PATH:`${u.default.dirname(s.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()):r(new Error(`mcporter \u5B89\u88C5\u5931\u8D25\uFF0C\u9000\u51FA\u7801: ${e}`))}),i.on("error",r)})}function P(t,o){return new Promise((r,i)=>{const e=(0,_.spawn)(s.NPM_BIN,["--userconfig",s.NPM_RC,...t],{stdio:["ignore","pipe","pipe"],env:{...process.env,PATH:`${u.default.dirname(s.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`),r()):i(new Error(`${o} \u5931\u8D25\uFF0C\u9000\u51FA\u7801: ${n}`))}),e.on("error",i)})}async function E(t){const o=`${s.NPM_PACKAGE_NAME}@${t}`;(0,a.log)(`\u5F00\u59CB\u5B89\u88C5 ${o}\uFF08--ignore-scripts\uFF0C\u4EC5\u4E0B\u8F7D\u89E3\u538B\uFF09...`),await P(["install","-g","--ignore-scripts",o],`${o} \u4E0B\u8F7D\u89E3\u538B`)}async function O(t){const o=`${s.NPM_PACKAGE_NAME}@${t}`;(0,a.log)("\u5F00\u59CB npm rebuild\uFF08\u6267\u884C postinstall \u811A\u672C\uFF09..."),await P(["rebuild","-g",s.NPM_PACKAGE_NAME],`${o} rebuild`),(0,a.log)(`${o} \u5B89\u88C5\u6210\u529F`)}async function y(t,o,r,i){let e;if((0,a.log)(`\u8986\u76D6\u7528\u6237\u5DF2\u6709\u914D\u7F6E: ${i}`),!i&&c.default.existsSync(s.QBOT_CLAW_CONFIG_PATH))e=s.QBOT_CLAW_CONFIG_PATH,(0,a.log)(`\u4F7F\u7528\u5DF2\u6709\u914D\u7F6E\u6587\u4EF6: ${e}`);else{const l=u.default.join(s.NPM_GLOBAL_MODULES,s.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:r,httpPort:o},(0,a.log)(`\u5DF2\u5C06 x5use-browser-control wsPort=${r}, httpPort=${o} \u5199\u5165\u914D\u7F6E`),c.default.writeFileSync(s.QBOT_CLAW_CONFIG_PATH,JSON.stringify(n,null,2),"utf-8"),(0,a.log)(`\u914D\u7F6E\u6587\u4EF6\u5DF2\u5199\u5165: ${s.QBOT_CLAW_CONFIG_PATH}`)}async function N(t){const o=(0,p.readState)();let r;o.gatewayPort&&!await(0,p.isPortAvailable)(o.gatewayPort)?(r=o.gatewayPort,(0,a.log)(`\u68C0\u6D4B\u5230 QBotClaw gateway \u5DF2\u5728\u7AEF\u53E3 ${r} \u8FD0\u884C\uFF0C\u590D\u7528\u539F\u7AEF\u53E3`)):r=await(0,w.findAvailablePort)(),(0,a.log)(`\u540E\u53F0\u542F\u52A8 QBotClaw gateway run --port ${r} --force`);const i=await(0,w.findAvailablePort)(s.DEFAULT_MCP_HTTP_PORT),e=await(0,w.findAvailablePort)();await y(r,i,e,t);const n=(0,_.spawn)(s.QBOTCLAW_BIN,["gateway","run","--port",String(r),"--force"],{stdio:"ignore",env:{PATH:s.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||""}});n.unref();const l=n.pid;(0,a.log)(`QBotClaw gateway \u5DF2\u5728\u540E\u53F0\u542F\u52A8\uFF0CPID: ${l}\uFF0C\u7AEF\u53E3: ${r}`),(0,p.writeState)({...(0,p.readState)(),gatewayPid:l,gatewayPort:r,mcpHttpPort:i,mcpWsPort:e})}function $(t,o,r){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 ${s.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 C(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 O(o),e++,g(t,i,e,"npmRebuildQBotClaw \u5B8C\u6210");try{c.default.existsSync(s.OPENCLAW_BIN)||(c.default.symlinkSync(s.QBOTCLAW_BIN,s.OPENCLAW_BIN),(0,a.log)(`\u5DF2\u521B\u5EFA\u8F6F\u94FE\u63A5: ${s.OPENCLAW_BIN} -> ${s.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(r),e++,t.writable)try{t.end(JSON.stringify({status:"done",progress:100,message:"\u5B89\u88C5\u6210\u529F"})+`
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})+`
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=N,exports.configAndRunQBotClaw=C,exports.runInstall=B;const c=P(require("fs")),u=P(require("path")),_=require("child_process"),i=require("./config"),w=require("./utils"),p=require("./state"),f=require("./quarantine"),o=require("./reportLog"),d=require("./service"),A=require("./openai-proxy");function g(t,a,s,r){if(t&&t.writable){const n=a>0?Math.round(s/a*1e4)/100:0;try{t.write(JSON.stringify({status:"downloading",progress:n,totalSteps:a,currentStep:s,message:r})+`
2
+ `)}catch{}}}exports.installState={status:"idle",message:"\u672A\u5F00\u59CB"},exports.isInstalling=!1,exports.PYTHON_DIR=u.default.join(i.QBOT_CLAW_DIR,"python");function N(t,a){return new Promise(s=>{const r=(0,p.readState)(),n=(0,_.spawn)(i.QBOTCLAW_BIN,t,{stdio:["ignore","pipe","pipe"],env:{PATH:i.NODE_BIN_DIR,HOME:process.env.HOME,OPENCLAW_TELEMETRY_GALIELO_GUID:process.env.QB_GUID||"",OPENCLAW_TELEMETRY_GALIELO_QIEMI36:process.env.QB_QIMEI36||"",QBOTCLAW_PROXY_URL:`http://127.0.0.1:${r.port}/v1`,QBOTCLAW_PROXY_API_KEY:A.proxyApiKey}});(0,o.log)(`[QBotClaw] \u6267\u884C: QBotClaw ${t.join(" ")}`),n.stdout.on("data",e=>{const l=e.toString();if(a&&a.writable)try{a.write(l)}catch{}}),n.stderr.on("data",e=>{const l=e.toString();if(a&&a.writable)try{a.write(l)}catch{}}),n.on("close",e=>{(0,o.log)(`[QBotClaw] \u6267\u884C\u5B8C\u6210\uFF0C\u9000\u51FA\u7801: ${e}`),s()}),n.on("error",e=>{(0,o.log)(`[QBotClaw] \u542F\u52A8\u5931\u8D25: ${e.message}`),s()})})}function I(){c.default.existsSync(i.QBOT_CLAW_DIR)||c.default.mkdirSync(i.QBOT_CLAW_DIR,{recursive:!0})}function m(){const t=u.default.join(exports.PYTHON_DIR,"pip.conf");if(c.default.existsSync(t)){(0,o.log)("pip.conf \u5DF2\u5B58\u5728\uFF0C\u8DF3\u8FC7");return}const a=["[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,a,"utf-8"),(0,o.log)(`\u5DF2\u5199\u5165 pip.conf: ${t}`)}async function y(t){if(c.default.existsSync(i.MCPORTER_BIN)){(0,o.log)("mcporter \u5DF2\u5B89\u88C5\uFF0C\u8DF3\u8FC7");return}(0,o.log)("\u5F00\u59CB\u5B89\u88C5 mcporter..."),await new Promise((a,s)=>{const r=(0,_.spawn)(i.NPM_BIN,["--userconfig",i.NPM_RC,"install","-g","mcporter"],{stdio:["ignore","pipe","pipe"],env:{...process.env,PATH:`${u.default.dirname(i.NPM_BIN)}:${process.env.PATH}`}});r.stdout.on("data",n=>{const e=`[mcporter] ${n.toString().trim()}`;(0,o.log)(e),g(t,0,0,e)}),r.stderr.on("data",n=>{const e=`[mcporter] ${n.toString().trim()}`;(0,o.log)(e),g(t,0,0,e)}),r.on("close",n=>{n===0?((0,o.log)("mcporter \u5B89\u88C5\u6210\u529F"),a()):s(new Error(`mcporter \u5B89\u88C5\u5931\u8D25\uFF0C\u9000\u51FA\u7801: ${n}`))}),r.on("error",s)})}function O(t,a){return new Promise((s,r)=>{const n=(0,_.spawn)(i.NPM_BIN,["--userconfig",i.NPM_RC,...t],{stdio:["ignore","pipe","pipe"],env:{...process.env,PATH:`${u.default.dirname(i.NPM_BIN)}:${process.env.PATH}`}});n.stdout.on("data",e=>{const l=`[npm] ${e.toString().trim()}`;(0,o.log)(l)}),n.stderr.on("data",e=>{const l=`[npm] ${e.toString().trim()}`;(0,o.log)(l)}),n.on("close",e=>{e===0?((0,o.log)(`${a} \u6210\u529F`),s()):r(new Error(`${a} \u5931\u8D25\uFF0C\u9000\u51FA\u7801: ${e}`))}),n.on("error",r)})}async function E(t){const a=`${i.NPM_PACKAGE_NAME}@${t}`;(0,o.log)(`\u5F00\u59CB\u5B89\u88C5 ${a}\uFF08--ignore-scripts\uFF0C\u4EC5\u4E0B\u8F7D\u89E3\u538B\uFF09...`),await O(["install","-g","--ignore-scripts",a],`${a} \u4E0B\u8F7D\u89E3\u538B`)}async function T(t){const a=`${i.NPM_PACKAGE_NAME}@${t}`;(0,o.log)("\u5F00\u59CB npm rebuild\uFF08\u6267\u884C postinstall \u811A\u672C\uFF09..."),await O(["rebuild","-g",i.NPM_PACKAGE_NAME],`${a} rebuild`),(0,o.log)(`${a} \u5B89\u88C5\u6210\u529F`)}async function $(t,a,s,r){let n;if((0,o.log)(`\u8986\u76D6\u7528\u6237\u5DF2\u6709\u914D\u7F6E: ${r}`),!r&&c.default.existsSync(i.QBOT_CLAW_CONFIG_PATH))n=i.QBOT_CLAW_CONFIG_PATH,(0,o.log)(`\u4F7F\u7528\u5DF2\u6709\u914D\u7F6E\u6587\u4EF6: ${n}`);else{const l=u.default.join(i.NPM_GLOBAL_MODULES,i.NPM_PACKAGE_NAME,"preset-config.json");if(!c.default.existsSync(l)){(0,o.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}n=l,(0,o.log)(`\u4F7F\u7528 npm \u5168\u5C40\u5B89\u88C5\u76EE\u5F55\u4E2D\u7684\u914D\u7F6E: ${n}`)}let e;try{e=JSON.parse(c.default.readFileSync(n,"utf-8")),(0,o.log)(`\u5DF2\u8BFB\u53D6\u914D\u7F6E: ${n}`)}catch(l){(0,o.log)(`\u8BFB\u53D6\u914D\u7F6E\u5931\u8D25: ${n}\uFF0C${l.message}\uFF0C\u8DF3\u8FC7\u914D\u7F6E\u5199\u5165`);return}t!==void 0&&(e.gateway={...e.gateway??{},port:t},(0,o.log)(`\u5DF2\u5C06 gateway.port=${t} \u5199\u5165\u914D\u7F6E`)),e.plugins=e.plugins??{},e.plugins.entries=e.plugins.entries??{},e.plugins.entries["x5use-browser-control"]=e.plugins.entries["x5use-browser-control"]??{},e.plugins.entries["x5use-browser-control"].config={...e.plugins.entries["x5use-browser-control"].config??{},wsPort:s,httpPort:a},(0,o.log)(`\u5DF2\u5C06 x5use-browser-control wsPort=${s}, httpPort=${a} \u5199\u5165\u914D\u7F6E`),c.default.writeFileSync(i.QBOT_CLAW_CONFIG_PATH,JSON.stringify(e,null,2),"utf-8"),(0,o.log)(`\u914D\u7F6E\u6587\u4EF6\u5DF2\u5199\u5165: ${i.QBOT_CLAW_CONFIG_PATH}`)}async function C(t){const a=(0,p.readState)();let s;a.gatewayPort&&!await(0,p.isPortAvailable)(a.gatewayPort)?(s=a.gatewayPort,(0,o.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,o.log)(`\u540E\u53F0\u542F\u52A8 QBotClaw gateway run --port ${s} --force`);const r=await(0,w.findAvailablePort)(i.DEFAULT_MCP_HTTP_PORT),n=await(0,w.findAvailablePort)();await $(s,r,n,t);const e=(0,_.spawn)(i.QBOTCLAW_BIN,["gateway","run","--port",String(s),"--force"],{stdio:"ignore",env:{PATH:i.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)(),QBOTCLAW_PROXY_URL:`http://127.0.0.1:${a.port}/v1`,QBOTCLAW_PROXY_API_KEY:A.proxyApiKey}});e.unref();const l=e.pid;(0,o.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:r,mcpWsPort:n})}function B(t,a,s){if(exports.isInstalling){if((0,o.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,o.log)(`\u5F00\u59CB\u5B89\u88C5 ${i.NPM_PACKAGE_NAME}@${a}`),(async()=>{try{(0,p.stopGateway)(),I(),m();const r=5;let n=0;g(t,r,n,"\u5F00\u59CB\u5B89\u88C5 mcporter..."),await y(t),n++,g(t,r,n,"\u5F00\u59CB\u4E0B\u8F7D\u89E3\u538B QBotClaw..."),await E(a),n++,g(t,r,n,"npmDownloadQBotClaw \u5B8C\u6210"),await(0,f.fullScanClearQuarantine)("npm install --ignore-scripts \u5B8C\u6210\u540E\uFF0Crebuild \u524D"),n++,await(0,f.watchWorkspaceQuarantine)().catch(e=>{(0,o.log)(`[quarantine] watchWorkspaceQuarantine \u542F\u52A8\u5F02\u5E38: ${e.message}`)}),g(t,r,n,"\u5F00\u59CB npm rebuild..."),await T(a),n++,g(t,r,n,"npmRebuildQBotClaw \u5B8C\u6210");try{c.default.existsSync(i.OPENCLAW_BIN)||(c.default.symlinkSync(i.QBOTCLAW_BIN,i.OPENCLAW_BIN),(0,o.log)(`\u5DF2\u521B\u5EFA\u8F6F\u94FE\u63A5: ${i.OPENCLAW_BIN} -> ${i.QBOTCLAW_BIN}`))}catch(e){(0,o.log)(`\u521B\u5EFA openclaw \u8F6F\u94FE\u63A5\u5931\u8D25: ${e.message}`)}if(await(0,f.stopWatchWorkspaceQuarantine)().catch(e=>{(0,o.log)(`[quarantine] stopWatchWorkspaceQuarantine \u5F02\u5E38: ${e.message}`)}),exports.installState={status:"success",message:"\u5B89\u88C5\u6210\u529F",endTime:new Date().toISOString()},(0,o.log)("\u5B89\u88C5\u6210\u529F"),(0,o.refreshClawVersion)(a),g(t,r,n,"\u5F00\u59CB\u914D\u7F6E\u5E76\u542F\u52A8 QBotClaw gateway..."),await C(s),n++,t.writable)try{const e=(0,d.getOrCreateGatewayToken)();t.end(JSON.stringify({status:"done",progress:100,message:"\u5B89\u88C5\u6210\u529F",gatewayToken:e})+`
5
+ `)}catch{}}catch(r){if(await(0,f.stopWatchWorkspaceQuarantine)().catch(()=>{}),exports.installState={status:"failed",message:r.message,endTime:new Date().toISOString()},(0,o.log)(`\u5B89\u88C5\u5931\u8D25: ${r.message}`),t&&t.writable)try{t.end(JSON.stringify({status:"failed",progress:0,message:r.message})+`
6
6
  `)}catch{}}finally{exports.isInstalling=!1}})()}
@@ -0,0 +1,7 @@
1
+ "use strict";var I=exports&&exports.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.proxyApiKey=void 0,exports.handleOpenAIProxy=re;const z=I(require("crypto")),V=I(require("http")),X=I(require("https")),C=require("url"),n=require("./reportLog"),K=require("./api/llm-access-proxy"),Q=require("./api/auth-client"),m=require("./api/content-review");exports.proxyApiKey=z.default.randomBytes(32).toString("base64url");const Z={enabled:!0,targetBaseUrl:"https://qbqaproxy.imtt.qq.com/openapi",allowedApiKeys:[exports.proxyApiKey],timeout:12e4};function ee(r){const t=r.headers.authorization;if(!t||typeof t!="string")return null;const i=t.match(/^Bearer\s+(.+)$/i);return i?i[1]:null}function l(r,t,i,d,o){const h=JSON.stringify({error:{message:i,type:d,code:o}});r.writeHead(t,{"Content-Type":"application/json","Content-Length":Buffer.byteLength(h)}),r.end(h)}function te(){return Math.random().toString(36).substring(2,10)}function U(r){try{const i=JSON.parse(r)?.choices?.[0]?.delta?.content;return typeof i=="string"?i:""}catch{return""}}function oe(r,t){const i=JSON.stringify({error:{message:t,type:"content_filter_error",code:"content_review_failed"}});r.writable&&(r.write(`data: ${i}
2
+
3
+ `),r.write(`data: [DONE]
4
+
5
+ `),r.end())}function ne(r){return new Promise((t,i)=>{const d=[];r.on("data",o=>d.push(o)),r.on("end",()=>t(Buffer.concat(d))),r.on("error",i)})}async function re(r,t,i){const d=r.url||"";if(!d.startsWith("/v1/"))return!1;const o=te(),h=r.method||"GET",_=Date.now();(0,n.log)(`[openai-proxy][${o}] \u6536\u5230\u8BF7\u6C42: ${h} ${d}`);const x=Z;if(!x.enabled)return(0,n.log)(`[openai-proxy][${o}] \u4EE3\u7406\u672A\u542F\u7528\uFF0C\u8FD4\u56DE 404`),l(t,404,"Not Found","invalid_request_error","not_found"),!0;const O=ee(r);if(!O)return(0,n.log)(`[openai-proxy][${o}] \u7F3A\u5C11 API Key`),l(t,401,"You didn't provide an API key. You need to provide your API key in an Authorization header using Bearer auth.","invalid_request_error","missing_api_key"),!0;if(!x.allowedApiKeys.includes(O))return(0,n.log)(`[openai-proxy][${o}] API Key \u6821\u9A8C\u5931\u8D25`),l(t,401,"Incorrect API key provided. You can check your API key in the proxy configuration.","invalid_request_error","invalid_api_key"),!0;let w;try{w=await ne(r)}catch(e){return(0,n.log)(`[openai-proxy][${o}] \u8BFB\u53D6\u8BF7\u6C42\u4F53\u5931\u8D25: ${e.message}`),l(t,400,"Failed to read request body","invalid_request_error","bad_request"),!0}let S="",A=!1;if((0,n.log)(`[openai-proxy][${o}] \u8BF7\u6C42\u4F53\u957F\u5EA6: ${w.length}, URL\u5339\u914Dchat/completions: ${d.includes("/chat/completions")}`),d.includes("/chat/completions")&&w.length>0)try{const e=JSON.parse(w.toString("utf-8"));A=e.stream===!0,(0,n.log)(`[openai-proxy][${o}] stream=${e.stream}, messages\u6570\u91CF=${Array.isArray(e.messages)?e.messages.length:0}`);const c=[];if(Array.isArray(e.messages))for(const u of e.messages)u.role==="user"&&typeof u.content=="string"&&c.push(u.content);if(c.length>0){const u=c.join(`
6
+ `);(0,n.log)(`[openai-proxy][${o}] \u5F00\u59CB\u8F93\u5165\u5185\u5BB9\u5BA1\u6838\uFF0C\u6587\u672C\u957F\u5EA6: ${u.length}`),S=await(0,m.reviewText)(u,m.AuditContentType.INPUT,"",i),(0,n.log)(`[openai-proxy][${o}] \u8F93\u5165\u5185\u5BB9\u5BA1\u6838\u901A\u8FC7\uFF0CsessionId: ${S}`)}}catch(e){if(e instanceof m.ContentReviewFailedError)return(0,n.log)(`[openai-proxy][${o}] \u8F93\u5165\u5185\u5BB9\u5BA1\u6838\u672A\u901A\u8FC7: ${e.fallbackMsg}`),l(t,400,e.fallbackMsg||"\u8F93\u5165\u5185\u5BB9\u5305\u542B\u8FDD\u89C4\u4FE1\u606F\uFF0C\u8BF7\u4FEE\u6539\u540E\u91CD\u8BD5","content_filter_error","content_review_failed"),!0;(0,n.log)(`[openai-proxy][${o}] \u8F93\u5165\u5185\u5BB9\u5BA1\u6838\u5F02\u5E38\uFF08\u4E0D\u963B\u585E\uFF09: ${e.message}`)}const P=new C.URL(x.targetBaseUrl),H=P.pathname.replace(/\/+$/,""),j=d.replace(/^\/v1/,""),g=new C.URL(H+j,P.origin),B=g.protocol==="https:",F=B?X.default:V.default,G=B?443:80,v={};for(const[e,c]of Object.entries(r.headers)){if(!c)continue;const u=e.toLowerCase();["host","connection","keep-alive","transfer-encoding","upgrade"].includes(u)||(v[e]=c)}v.host=g.host;let T;try{T=await(0,K.fetchLlmToken)(i),(0,n.log)(`[openai-proxy][${o}] \u6210\u529F\u83B7\u53D6 LLM Token ${T}`)}catch(e){if(e instanceof K.TokenExhaustedError)return(0,n.log)(`[openai-proxy][${o}] Token \u5DF2\u8017\u5C3D: ${e.message}`),l(t,429,e.message,"insufficient_quota","token_exhausted"),!0;if(e instanceof Q.AuthExpiredError)return(0,n.log)(`[openai-proxy][${o}] \u7968\u636E\u8FC7\u671F: ${e.message}`),l(t,401,`Auth token expired: ${e.message}`,"authentication_error","auth_expired"),!0;const c=e instanceof Error?e.message:JSON.stringify(e);return(0,n.log)(`[openai-proxy][${o}] \u83B7\u53D6 LLM Token \u5931\u8D25: ${c}`),l(t,500,`Failed to obtain auth token: ${c}`,"server_error","token_fetch_error"),!0}v.authorization=`Bearer ${T}`;const J={hostname:g.hostname,port:g.port||G,path:g.pathname+g.search,method:h,headers:v,timeout:x.timeout||12e4};(0,n.log)(`[openai-proxy][${o}] \u8F6C\u53D1\u5230: ${h} ${g.href}`);const k=F.request(J,e=>{const c=e.statusCode||502,u=e.headers["content-type"]||"",D=u.includes("text/event-stream")||A,R=Date.now()-_;(0,n.log)(`[openai-proxy][${o}] \u76EE\u6807\u54CD\u5E94: ${c} ${u} (${R}ms)${D?" [SSE\u6D41\u5F0F]":""} (isStreamRequest=${A})`);const L={};for(const[a,p]of Object.entries(e.headers)){if(!p)continue;const f=a.toLowerCase();["connection","keep-alive","upgrade"].includes(f)||(L[a]=p)}if(t.writeHead(c,L),D){let a="",p="",f=!1,q=S;const W=100,M=async(s,$)=>{if(!s||f)return;const b=m.AuditContentType.OUTPUT;try{(0,n.log)(`[openai-proxy][${o}] \u8F93\u51FA\u5185\u5BB9\u5BA1\u6838${$?"(\u6700\u7EC8)":""}\uFF0C\u6587\u672C\u957F\u5EA6: ${s.length}`),q=await(0,m.reviewText)(s,b,q,i),(0,n.log)(`[openai-proxy][${o}] \u8F93\u51FA\u5185\u5BB9\u5BA1\u6838\u901A\u8FC7\uFF0CsessionId: ${q}`)}catch(y){if(y instanceof m.ContentReviewFailedError){(0,n.log)(`[openai-proxy][${o}] \u8F93\u51FA\u5185\u5BB9\u5BA1\u6838\u672A\u901A\u8FC7: ${y.fallbackMsg}`),f=!0,oe(t,y.fallbackMsg||"\u8F93\u51FA\u5185\u5BB9\u5305\u542B\u8FDD\u89C4\u4FE1\u606F"),e.destroy();return}(0,n.log)(`[openai-proxy][${o}] \u8F93\u51FA\u5185\u5BB9\u5BA1\u6838\u5F02\u5E38\uFF08\u4E0D\u963B\u585E\uFF09: ${y.message}`)}};e.on("data",s=>{if(f||!t.writable)return;const $=s.toString("utf-8");p+=$;const b=p.split(`
7
+ `);p=b.pop()||"";for(const y of b){const E=y.trim();if(E.startsWith("data: ")&&E!=="data: [DONE]"){const Y=E.slice(6),N=U(Y);N&&(a+=N)}}if(t.write(s),a.length>=W){const y=a;a="",M(y,!1)}}),e.on("end",async()=>{if(p.trim()){const s=p.trim();if(s.startsWith("data: ")&&s!=="data: [DONE]"){const $=U(s.slice(6));$&&(a+=$)}}if(a.length>0&&!f&&await M(a,!0),!f){const s=Date.now()-_;(0,n.log)(`[openai-proxy][${o}] \u8BF7\u6C42\u5B8C\u6210\uFF0C\u603B\u8017\u65F6: ${s}ms`),t.end()}}),e.on("error",s=>{(0,n.log)(`[openai-proxy][${o}] \u8BFB\u53D6\u76EE\u6807\u54CD\u5E94\u5931\u8D25: ${s.message}`),t.headersSent?f||t.end():l(t,502,`Bad Gateway: ${s.message}`,"server_error","proxy_error")})}else e.on("data",a=>{t.writable&&t.write(a)}),e.on("end",()=>{const a=Date.now()-_;(0,n.log)(`[openai-proxy][${o}] \u8BF7\u6C42\u5B8C\u6210\uFF0C\u603B\u8017\u65F6: ${a}ms`),t.end()}),e.on("error",a=>{(0,n.log)(`[openai-proxy][${o}] \u8BFB\u53D6\u76EE\u6807\u54CD\u5E94\u5931\u8D25: ${a.message}`),t.headersSent?t.end():l(t,502,`Bad Gateway: ${a.message}`,"server_error","proxy_error")})});return k.on("error",e=>{const c=Date.now()-_;(0,n.log)(`[openai-proxy][${o}] \u8F6C\u53D1\u8BF7\u6C42\u5931\u8D25 (${c}ms): ${e.message}`),t.headersSent?t.end():l(t,502,`Bad Gateway: ${e.message}`,"server_error","proxy_error")}),k.on("timeout",()=>{const e=Date.now()-_;(0,n.log)(`[openai-proxy][${o}] \u8BF7\u6C42\u8D85\u65F6 (${e}ms)`),k.destroy(),t.headersSent?t.end():l(t,504,"Gateway Timeout","server_error","gateway_timeout")}),k.end(w),!0}
package/dist/reportLog.js CHANGED
@@ -1 +1,2 @@
1
- "use strict";var l=exports&&exports.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.flushLogs=O,exports.log=I,exports.refreshClawVersion=B,exports.initLog=D;const b=l(require("https")),E=require("crypto"),P=l(require("fs")),T=l(require("path")),f=require("./config"),q=require("./version"),r=[];let d=0,o=null,a=!1;const v=500;let y="guidxxx",h="qimei36",m="unknown",u="unknown";function N(){return(0,E.randomUUID)().replace(/-/g,"")}function S(){return Date.now()*1e6}function p(e){if(e.length===0)return Promise.resolve();const n=e.map(i=>({trace_id:i.trace_id,body:{string_value:i.body},time_unix_nano:i.time_unix_nano,severity_number:"SEVERITY_NUMBER_INFO",severity_text:"INFO",flags:1,attributes:[{key:"guid",value:{string_value:y}},{key:"qimei36",value:{string_value:h}},{key:"launcher_version",value:{string_value:m}},{key:"claw_version",value:{string_value:u}}]})),c=JSON.stringify({resource_logs:[{instrumentation_library_logs:[{instrumentation_library:{name:"qbot-launcher-log"},log_records:n}],resource:{attributes:[{key:"telemetry.sdk.language",value:{string_value:"go"}},{key:"telemetry.sdk.name",value:{string_value:"galileo"}},{key:"telemetry.sdk.version",value:{string_value:"0.0.1"}},{key:"target",value:{string_value:"RPC.QBotClaw.Launcher"}},{key:"namespace",value:{string_value:"Production"}},{key:"env",value:{string_value:"formal"}},{key:"server",value:{string_value:"QBotClaw.Launcher"}}]}}]});return new Promise((i,g)=>{const C={hostname:"galileotelemetry.tencent.com",port:443,path:"/v1/logs",method:"POST",headers:{"Content-Type":"application/json","Content-Length":Buffer.byteLength(c)}},s=b.default.request(C,t=>{let _="";t.on("data",L=>{_+=L.toString()}),t.on("end",()=>{t.statusCode&&t.statusCode>=200&&t.statusCode<300?i():g(new Error(`\u65E5\u5FD7\u4E0A\u62A5\u5931\u8D25\uFF0C\u72B6\u6001\u7801: ${t.statusCode}\uFF0C\u54CD\u5E94: ${_}`))})});s.on("error",t=>{g(new Error(`\u65E5\u5FD7\u4E0A\u62A5\u8BF7\u6C42\u5F02\u5E38: ${t.message}`))}),s.write(c),s.end()})}function k(){if(a||r.length===0)return;const n=Date.now()-d;n>=v?w():o===null&&(o=setTimeout(()=>{o=null,w()},v-n))}function w(){if(a||r.length===0)return;const e=r.splice(0);a=!0,p(e).catch(()=>{}).finally(()=>{d=Date.now(),a=!1,r.length>0&&k()})}async function O(){if(o!==null&&(clearTimeout(o),o=null),r.length===0)return Promise.resolve();const e=r.splice(0);try{return await p(e)}catch{}}function I(e){r.push({trace_id:N(),body:e,time_unix_nano:S()}),k()}function M(){try{const e=T.default.join(f.NPM_GLOBAL_MODULES,f.NPM_PACKAGE_NAME,"package.json");return JSON.parse(P.default.readFileSync(e,"utf-8")).version||"unknown"}catch{return"unknown"}}function B(e){u=e}function D(){const e=process.env.QB_GUID,n=process.env.QB_QIMEI36;e&&(y=e),n&&(h=n),m=q.LAUNCHER_VERSION,u=M()}
1
+ "use strict";var _=exports&&exports.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.flushLogs=Q,exports.log=q,exports.refreshClawVersion=R,exports.initLog=F;const T=_(require("https")),D=require("crypto"),r=_(require("fs")),d=_(require("path")),o=require("./config"),M=require("./version"),l=d.default.join(o.QBOT_CLAW_DIR,"launcher.log"),b=5*1024*1024,A=d.default.join(o.QBOT_CLAW_DIR,"launcher.log.old"),a=[];let p=0,i=null,u=!1;const m=500;let L="guidxxx",S="qimei36",w="unknown",f="unknown";function B(){return(0,D.randomUUID)().replace(/-/g,"")}function P(){return Date.now()*1e6}function k(e){if(e.length===0)return Promise.resolve();const t=e.map(s=>({trace_id:s.trace_id,body:{string_value:s.body},time_unix_nano:s.time_unix_nano,severity_number:"SEVERITY_NUMBER_INFO",severity_text:"INFO",flags:1,attributes:[{key:"guid",value:{string_value:L}},{key:"qimei36",value:{string_value:S}},{key:"launcher_version",value:{string_value:w}},{key:"claw_version",value:{string_value:f}}]})),c=JSON.stringify({resource_logs:[{instrumentation_library_logs:[{instrumentation_library:{name:"qbot-launcher-log"},log_records:t}],resource:{attributes:[{key:"telemetry.sdk.language",value:{string_value:"go"}},{key:"telemetry.sdk.name",value:{string_value:"galileo"}},{key:"telemetry.sdk.version",value:{string_value:"0.0.1"}},{key:"target",value:{string_value:"RPC.QBotClaw.Launcher"}},{key:"namespace",value:{string_value:"Production"}},{key:"env",value:{string_value:"formal"}},{key:"server",value:{string_value:"QBotClaw.Launcher"}}]}}]});return new Promise((s,v)=>{const I={hostname:"galileotelemetry.tencent.com",port:443,path:"/v1/logs",method:"POST",headers:{"Content-Type":"application/json","Content-Length":Buffer.byteLength(c)}},g=T.default.request(I,n=>{let h="";n.on("data",E=>{h+=E.toString()}),n.on("end",()=>{n.statusCode&&n.statusCode>=200&&n.statusCode<300?s():v(new Error(`\u65E5\u5FD7\u4E0A\u62A5\u5931\u8D25\uFF0C\u72B6\u6001\u7801: ${n.statusCode}\uFF0C\u54CD\u5E94: ${h}`))})});g.on("error",n=>{v(new Error(`\u65E5\u5FD7\u4E0A\u62A5\u8BF7\u6C42\u5F02\u5E38: ${n.message}`))}),g.write(c),g.end()})}function C(){if(u||a.length===0)return;const t=Date.now()-p;t>=m?O():i===null&&(i=setTimeout(()=>{i=null,O()},m-t))}function O(){if(u||a.length===0)return;const e=a.splice(0);u=!0,k(e).catch(()=>{}).finally(()=>{p=Date.now(),u=!1,a.length>0&&C()})}async function Q(){if(i!==null&&(clearTimeout(i),i=null),a.length===0)return Promise.resolve();const e=a.splice(0);try{return await k(e)}catch{}}function x(e){try{if(r.default.existsSync(o.QBOT_CLAW_DIR)||r.default.mkdirSync(o.QBOT_CLAW_DIR,{recursive:!0}),r.default.existsSync(l))try{r.default.statSync(l).size>=b&&r.default.renameSync(l,A)}catch{}const t=new Date,y=t.getFullYear()+"-"+String(t.getMonth()+1).padStart(2,"0")+"-"+String(t.getDate()).padStart(2,"0")+" "+String(t.getHours()).padStart(2,"0")+":"+String(t.getMinutes()).padStart(2,"0")+":"+String(t.getSeconds()).padStart(2,"0")+"."+String(t.getMilliseconds()).padStart(3,"0");r.default.appendFileSync(l,`[${y}] ${e}
2
+ `)}catch{}}function q(e){a.push({trace_id:B(),body:e,time_unix_nano:P()}),C()}function N(){try{const e=d.default.join(o.NPM_GLOBAL_MODULES,o.NPM_PACKAGE_NAME,"package.json");return JSON.parse(r.default.readFileSync(e,"utf-8")).version||"unknown"}catch{return"unknown"}}function R(e){f=e}function F(){const e=process.env.QB_GUID,t=process.env.QB_QIMEI36;e&&(L=e),t&&(S=t),w=M.LAUNCHER_VERSION,f=N()}
package/dist/server.js CHANGED
@@ -1,6 +1,6 @@
1
- "use strict";var R=exports&&exports.__importDefault||function(f){return f&&f.__esModule?f:{default:f}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.server=void 0,exports.watchParentProcess=x;const F=R(require("http")),S=R(require("fs")),T=R(require("path")),u=require("./config"),a=require("./utils"),i=require("./reportLog"),$=require("./installer"),W=require("./version"),w=require("./state"),E=require("child_process"),v=require("./filePicker"),k=require("./fileSecurityCheck"),b="\u9009\u62E9\u6587\u4EF6",J=10485760,B=10,M=!1,h={CANCELLED:"CANCELLED",INVALID_PARAMS:"INVALID_PARAMS",DIALOG_BUSY:"DIALOG_BUSY",DIALOG_TIMEOUT:"DIALOG_TIMEOUT",PLATFORM_NOT_SUPPORTED:"PLATFORM_NOT_SUPPORTED",INTERNAL_ERROR:"INTERNAL_ERROR"},I={"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 U(f){for(const[s,m]of Object.entries(I))f.setHeader(s,m)}exports.server=F.default.createServer(async(f,s)=>{const m=f.url||"";if(U(s),f.method==="OPTIONS"){s.writeHead(204,I),s.end();return}if(m==="/api/version"){let n="unknown";try{n=(await(0,a.execCommand)(`"${u.NODE_BIN}" -v`)).trim(),(0,i.log)(`[version] node \u7248\u672C: ${n}`)}catch(c){(0,i.log)(`[version] \u83B7\u53D6 node \u7248\u672C\u5931\u8D25: ${c.message}`),n=`error: ${c.message}`}const o=await(0,a.getQBotClawVersion)()??"0.0.0";(0,i.log)(`[version] qbotclaw \u7248\u672C: ${o}`);let t="0.0.0";if(S.default.existsSync(u.MCPORTER_BIN))try{t=(await(0,a.execCommand)(`"${u.NODE_BIN}" "${u.MCPORTER_BIN}" --version`)).trim(),(0,i.log)(`[version] mcporter \u7248\u672C: ${t}`)}catch(c){(0,i.log)(`[version] \u83B7\u53D6 mcporter \u7248\u672C\u5931\u8D25: ${c.message}`),t=`error: ${c.message}`}let l="0.0.0";if(S.default.existsSync(u.PYTHON_BIN))try{l=(await(0,a.execCommand)(`"${u.PYTHON_BIN}" --version`)).trim(),(0,i.log)(`[version] python \u7248\u672C: ${l}`)}catch(c){(0,i.log)(`[version] \u83B7\u53D6 python \u7248\u672C\u5931\u8D25: ${c.message}`),l=`error: ${c.message}`}(0,a.sendJSON)(s,200,{status:"\u6210\u529F",launcher:W.LAUNCHER_VERSION,node:n,qbotclaw:o,mcporter:t,python:l});return}if(m==="/api/port"){const n=exports.server.address(),o=n&&typeof n=="object"?n.port:null,t=(0,w.readState)();(0,a.sendJSON)(s,200,{status:"\u6210\u529F",launcher:o,qbotclaw:t.gatewayPort??2e3,mcpHttp:t.mcpHttpPort??u.DEFAULT_MCP_HTTP_PORT,mcpWs:t.mcpWsPort??8765});return}if(m==="/api/status"){const n=(0,w.readState)(),o=[];if(n.gatewayPid)try{process.kill(n.gatewayPid,0)}catch{o.push(`gateway \u8FDB\u7A0B (pid: ${n.gatewayPid}) \u5DF2\u9000\u51FA`)}else o.push("gateway \u8FDB\u7A0B\u672A\u542F\u52A8\uFF08\u72B6\u6001\u4E2D\u65E0 gatewayPid\uFF09");const t=[{name:"gateway",port:n.gatewayPort},{name:"mcpHttp",port:n.mcpHttpPort},{name:"mcpWs",port:n.mcpWsPort}];for(const{name:l,port:c}of t){if(!c){o.push(`${l} \u7AEF\u53E3\u672A\u914D\u7F6E\uFF08\u72B6\u6001\u4E2D\u65E0\u5BF9\u5E94\u7AEF\u53E3\u53F7\uFF09`);continue}await(0,w.isPortAvailable)(c)&&o.push(`${l} \u7AEF\u53E3 (${c}) \u65E0\u670D\u52A1\u76D1\u542C`)}o.length===0?(0,a.sendJSON)(s,200,{ok:!0,message:"\u6240\u6709\u670D\u52A1\u8FD0\u884C\u6B63\u5E38"}):(0,a.sendJSON)(s,200,{ok:!1,message:o.join("\uFF1B")});return}if(m==="/api/restart"){try{const n=(0,w.readState)();if(n.gatewayPid)try{process.kill(n.gatewayPid,"SIGTERM"),(0,i.log)(`[restart] \u5DF2\u53D1\u9001 SIGTERM \u7ED9\u65E7 gateway \u8FDB\u7A0B pid: ${n.gatewayPid}`)}catch{(0,i.log)(`[restart] \u65E7 gateway \u8FDB\u7A0B ${n.gatewayPid} \u53EF\u80FD\u5DF2\u9000\u51FA\uFF0C\u5FFD\u7565`)}const{gatewayPid:o,gatewayPort:t,mcpHttpPort:l,mcpWsPort:c,...g}=n;(0,w.writeState)(g),(0,i.log)("[restart] \u5DF2\u6E05\u9664 gatewayPid, gatewayPort, mcpHttpPort, mcpWsPort"),await(0,$.configAndRunQBotClaw)(),(0,i.log)("[restart] QBotClaw gateway \u91CD\u542F\u5B8C\u6210");const d=(0,w.readState)(),e=exports.server.address(),r=e&&typeof e=="object"?e.port:null;(0,a.sendJSON)(s,200,{ok:!0,message:"QBotClaw gateway \u91CD\u542F\u6210\u529F",launcher:r,qbotclaw:d.gatewayPort??2e3,mcpHttp:d.mcpHttpPort??u.DEFAULT_MCP_HTTP_PORT,mcpWs:d.mcpWsPort??8765})}catch(n){(0,i.log)(`[restart] \u91CD\u542F\u5931\u8D25: ${n.message}`),(0,a.sendJSON)(s,500,{ok:!1,message:`\u91CD\u542F\u5931\u8D25: ${n.message}`})}return}if(m==="/api/wechat/history"){try{if(!S.default.existsSync(u.SESSIONS_FILE)){(0,a.sendJSON)(s,404,{ok:!1,sessionKey:"",message:"\u672A\u627E\u5230\u4F1A\u8BDD\u6587\u4EF6"});return}const n=JSON.parse(S.default.readFileSync(u.SESSIONS_FILE,"utf-8"));let o=null,t=0;for(const[g,d]of Object.entries(n))if(g.includes("openclaw-weixin")){const r=d.updatedAt??0;r>t&&(t=r,o=g)}if(!o){(0,a.sendJSON)(s,404,{ok:!1,sessionKey:"",message:"\u672A\u627E\u5230\u5FAE\u4FE1\u4F1A\u8BDD"});return}const c=o.split(":").slice(4).join(":");(0,a.sendJSON)(s,200,{ok:!0,sessionKey:c,message:"\u83B7\u53D6\u6210\u529F"})}catch(n){(0,i.log)(`[wechat/history] \u8BFB\u53D6\u5FAE\u4FE1\u4F1A\u8BDD\u5931\u8D25: ${n.message}`),(0,a.sendJSON)(s,500,{ok:!1,sessionKey:"",message:`\u8BFB\u53D6\u5FAE\u4FE1\u4F1A\u8BDD\u5931\u8D25: ${n.message}`})}return}if(m==="/api/installing"){(0,a.sendJSON)(s,200,{installing:$.isInstalling});return}if(m==="/api/install"||m.startsWith("/api/install?")){if($.installState.status==="downloading"){(0,a.sendJSON)(s,200,{ok:"downloading",message:"\u6B63\u5728\u5B89\u88C5\u4E2D..."});return}const n=new URL(m,"http://localhost"),o=n.searchParams.get("version")||void 0,t=n.searchParams.get("overrideConfig")==="true";if(!o){(0,a.sendJSON)(s,400,{status:"\u5931\u8D25",message:"\u7F3A\u5C11\u5FC5\u8981\u53C2\u6570 version\uFF0C\u7528\u6CD5: GET /api/install?version=x.x.x"});return}s.writeHead(200,{...I,"Content-Type":"text/plain; charset=utf-8","Transfer-Encoding":"chunked","Cache-Control":"no-cache"}),(0,$.runInstall)(s,o,t);return}if(m.startsWith("/api/watch")){const o=new URL(m,"http://localhost").searchParams.get("ppid");if(!o||isNaN(Number(o))){(0,a.sendJSON)(s,400,{status:"\u5931\u8D25",message:"\u7F3A\u5C11\u6709\u6548\u7684 ppid \u53C2\u6570\uFF0C\u7528\u6CD5: GET /api/watch?ppid=12345"});return}const t=parseInt(o,10);try{process.kill(t,0)}catch{(0,a.sendJSON)(s,400,{status:"\u5931\u8D25",message:`\u8FDB\u7A0B ${t} \u4E0D\u5B58\u5728`});return}const l=(0,w.readState)();(0,w.writeState)({...l,ppid:t}),x(t),(0,a.sendJSON)(s,200,{status:"\u6210\u529F",message:`\u5DF2\u5F00\u59CB\u76D1\u63A7\u7236\u8FDB\u7A0B ppid: ${t}`});return}if(m==="/api/qbotclaw"&&f.method==="POST"){let n="";f.on("data",o=>{n+=o.toString()}),f.on("end",()=>{let o;try{const t=JSON.parse(n);if(!Array.isArray(t.args)||t.args.length===0){(0,a.sendJSON)(s,400,{status:"\u5931\u8D25",message:"\u53C2\u6570 args \u5FC5\u987B\u662F\u975E\u7A7A\u6570\u7EC4"});return}o=t.args.map(l=>String(l))}catch{(0,a.sendJSON)(s,400,{status:"\u5931\u8D25",message:"\u8BF7\u6C42\u4F53\u5FC5\u987B\u662F\u5408\u6CD5\u7684 JSON"});return}if(!S.default.existsSync(u.QBOTCLAW_BIN)){(0,a.sendJSON)(s,404,{status:"\u5931\u8D25",message:`qbotclaw \u53EF\u6267\u884C\u6587\u4EF6\u4E0D\u5B58\u5728: ${u.QBOTCLAW_BIN}`});return}s.writeHead(200,{...I,"Content-Type":"text/plain; charset=utf-8","Transfer-Encoding":"chunked","Cache-Control":"no-cache"}),(0,$.runQBotClaw)(o,s).then(()=>{s.end(`
1
+ "use strict";var L=exports&&exports.__importDefault||function(d){return d&&d.__esModule?d:{default:d}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.server=void 0,exports.setGlobalAuthClient=z,exports.getGlobalAuthClient=K,exports.watchParentProcess=W;const U=L(require("http")),w=L(require("fs")),I=L(require("path")),u=require("./config"),a=require("./utils"),r=require("./reportLog"),$=require("./installer"),G=require("./version"),y=require("./state"),R=require("child_process"),Q=require("./service"),J=require("./filePicker"),x=require("./fileSecurityCheck"),B=require("./authMiddleware"),H="\u9009\u62E9\u6587\u4EF6",M=10485760,F=10,b=!1,P={CANCELLED:"CANCELLED",INVALID_PARAMS:"INVALID_PARAMS",DIALOG_BUSY:"DIALOG_BUSY",DIALOG_TIMEOUT:"DIALOG_TIMEOUT",PLATFORM_NOT_SUPPORTED:"PLATFORM_NOT_SUPPORTED",INTERNAL_ERROR:"INTERNAL_ERROR"},q=require("./openai-proxy"),V=require("./api/auth-client");let v=new V.AuthClient({usePipe:!0});function z(d){v=d}function K(){return v}const C={"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 j(d){for(const[e,f]of Object.entries(C))d.setHeader(e,f)}exports.server=U.default.createServer(async(d,e)=>{const f=d.url||"";if(j(e),d.method==="OPTIONS"){e.writeHead(204,C),e.end();return}if(f.startsWith("/v1/")){await(0,q.handleOpenAIProxy)(d,e,v);return}if(f==="/api/version"){let n="unknown";try{n=(await(0,a.execCommand)(`"${u.NODE_BIN}" -v`)).trim(),(0,r.log)(`[version] node \u7248\u672C: ${n}`)}catch(g){(0,r.log)(`[version] \u83B7\u53D6 node \u7248\u672C\u5931\u8D25: ${g.message}`),n=`error: ${g.message}`}const o=await(0,a.getQBotClawVersion)()??"0.0.0";(0,r.log)(`[version] qbotclaw \u7248\u672C: ${o}`);let s="0.0.0";if(w.default.existsSync(u.MCPORTER_BIN))try{s=(await(0,a.execCommand)(`"${u.NODE_BIN}" "${u.MCPORTER_BIN}" --version`)).trim(),(0,r.log)(`[version] mcporter \u7248\u672C: ${s}`)}catch(g){(0,r.log)(`[version] \u83B7\u53D6 mcporter \u7248\u672C\u5931\u8D25: ${g.message}`),s=`error: ${g.message}`}let i="0.0.0";if(w.default.existsSync(u.PYTHON_BIN))try{i=(await(0,a.execCommand)(`"${u.PYTHON_BIN}" --version`)).trim(),(0,r.log)(`[version] python \u7248\u672C: ${i}`)}catch(g){(0,r.log)(`[version] \u83B7\u53D6 python \u7248\u672C\u5931\u8D25: ${g.message}`),i=`error: ${g.message}`}(0,a.sendJSON)(e,200,{status:"\u6210\u529F",launcher:G.LAUNCHER_VERSION,node:n,qbotclaw:o,mcporter:s,python:i});return}if(f==="/api/port"){const n=exports.server.address(),o=n&&typeof n=="object"?n.port:null,s=(0,y.readState)();(0,a.sendJSON)(e,200,{status:"\u6210\u529F",launcher:o,qbotclaw:s.gatewayPort??2e3,mcpHttp:s.mcpHttpPort??u.DEFAULT_MCP_HTTP_PORT,mcpWs:s.mcpWsPort??8765});return}if(f==="/api/status"){const n=(0,y.readState)(),o=[];if(n.gatewayPid)try{process.kill(n.gatewayPid,0)}catch{o.push(`gateway \u8FDB\u7A0B (pid: ${n.gatewayPid}) \u5DF2\u9000\u51FA`)}else o.push("gateway \u8FDB\u7A0B\u672A\u542F\u52A8\uFF08\u72B6\u6001\u4E2D\u65E0 gatewayPid\uFF09");const s=[{name:"gateway",port:n.gatewayPort},{name:"mcpHttp",port:n.mcpHttpPort},{name:"mcpWs",port:n.mcpWsPort}];for(const{name:i,port:g}of s){if(!g){o.push(`${i} \u7AEF\u53E3\u672A\u914D\u7F6E\uFF08\u72B6\u6001\u4E2D\u65E0\u5BF9\u5E94\u7AEF\u53E3\u53F7\uFF09`);continue}await(0,y.isPortAvailable)(g)&&o.push(`${i} \u7AEF\u53E3 (${g}) \u65E0\u670D\u52A1\u76D1\u542C`)}o.length===0?(0,a.sendJSON)(e,200,{ok:!0,message:"\u6240\u6709\u670D\u52A1\u8FD0\u884C\u6B63\u5E38"}):(0,a.sendJSON)(e,200,{ok:!1,message:o.join("\uFF1B")});return}if(f==="/api/restart"){try{const n=(0,y.readState)();if(n.gatewayPid)try{process.kill(n.gatewayPid,"SIGTERM"),(0,r.log)(`[restart] \u5DF2\u53D1\u9001 SIGTERM \u7ED9\u65E7 gateway \u8FDB\u7A0B pid: ${n.gatewayPid}`)}catch{(0,r.log)(`[restart] \u65E7 gateway \u8FDB\u7A0B ${n.gatewayPid} \u53EF\u80FD\u5DF2\u9000\u51FA\uFF0C\u5FFD\u7565`)}const{gatewayPid:o,gatewayPort:s,mcpHttpPort:i,mcpWsPort:g,...m}=n;(0,y.writeState)(m),(0,r.log)("[restart] \u5DF2\u6E05\u9664 gatewayPid, gatewayPort, mcpHttpPort, mcpWsPort"),await(0,$.configAndRunQBotClaw)(),(0,r.log)("[restart] QBotClaw gateway \u91CD\u542F\u5B8C\u6210");const c=(0,y.readState)(),l=exports.server.address(),t=l&&typeof l=="object"?l.port:null;(0,a.sendJSON)(e,200,{ok:!0,message:"QBotClaw gateway \u91CD\u542F\u6210\u529F",launcher:t,qbotclaw:c.gatewayPort??2e3,mcpHttp:c.mcpHttpPort??u.DEFAULT_MCP_HTTP_PORT,mcpWs:c.mcpWsPort??8765,gatewayToken:(0,Q.getOrCreateGatewayToken)()})}catch(n){(0,r.log)(`[restart] \u91CD\u542F\u5931\u8D25: ${n.message}`),(0,a.sendJSON)(e,500,{ok:!1,message:`\u91CD\u542F\u5931\u8D25: ${n.message}`})}return}if(f==="/api/wechat/history"){try{if(!w.default.existsSync(u.SESSIONS_FILE)){(0,a.sendJSON)(e,404,{ok:!1,sessionKey:"",message:"\u672A\u627E\u5230\u4F1A\u8BDD\u6587\u4EF6"});return}const n=JSON.parse(w.default.readFileSync(u.SESSIONS_FILE,"utf-8"));let o=null,s=0;for(const[m,c]of Object.entries(n))if(m.includes("openclaw-weixin")){const t=c.updatedAt??0;t>s&&(s=t,o=m)}if(!o){(0,a.sendJSON)(e,404,{ok:!1,sessionKey:"",message:"\u672A\u627E\u5230\u5FAE\u4FE1\u4F1A\u8BDD"});return}const g=o.split(":").slice(4).join(":");(0,a.sendJSON)(e,200,{ok:!0,sessionKey:g,message:"\u83B7\u53D6\u6210\u529F"})}catch(n){(0,r.log)(`[wechat/history] \u8BFB\u53D6\u5FAE\u4FE1\u4F1A\u8BDD\u5931\u8D25: ${n.message}`),(0,a.sendJSON)(e,500,{ok:!1,sessionKey:"",message:`\u8BFB\u53D6\u5FAE\u4FE1\u4F1A\u8BDD\u5931\u8D25: ${n.message}`})}return}if(f==="/api/installing"){(0,a.sendJSON)(e,200,{installing:$.isInstalling});return}if(f==="/api/install"||f.startsWith("/api/install?")){if($.installState.status==="downloading"){(0,a.sendJSON)(e,200,{ok:"downloading",message:"\u6B63\u5728\u5B89\u88C5\u4E2D..."});return}const n=new URL(f,"http://localhost"),o=n.searchParams.get("version")||void 0,s=n.searchParams.get("overrideConfig")==="true";if(!o){(0,a.sendJSON)(e,400,{status:"\u5931\u8D25",message:"\u7F3A\u5C11\u5FC5\u8981\u53C2\u6570 version\uFF0C\u7528\u6CD5: GET /api/install?version=x.x.x"});return}e.writeHead(200,{...C,"Content-Type":"text/plain; charset=utf-8","Transfer-Encoding":"chunked","Cache-Control":"no-cache"}),(0,$.runInstall)(e,o,s);return}if(f.startsWith("/api/watch")){const o=new URL(f,"http://localhost").searchParams.get("ppid");if(!o||isNaN(Number(o))){(0,a.sendJSON)(e,400,{status:"\u5931\u8D25",message:"\u7F3A\u5C11\u6709\u6548\u7684 ppid \u53C2\u6570\uFF0C\u7528\u6CD5: GET /api/watch?ppid=12345"});return}const s=parseInt(o,10);try{process.kill(s,0)}catch{(0,a.sendJSON)(e,400,{status:"\u5931\u8D25",message:`\u8FDB\u7A0B ${s} \u4E0D\u5B58\u5728`});return}const i=(0,y.readState)();(0,y.writeState)({...i,ppid:s}),W(s),(0,a.sendJSON)(e,200,{status:"\u6210\u529F",message:`\u5DF2\u5F00\u59CB\u76D1\u63A7\u7236\u8FDB\u7A0B ppid: ${s}`});return}if(f==="/api/qbotclaw"&&d.method==="POST"){let n="";d.on("data",o=>{n+=o.toString()}),d.on("end",()=>{let o;try{const s=JSON.parse(n);if(!Array.isArray(s.args)||s.args.length===0){(0,a.sendJSON)(e,400,{status:"\u5931\u8D25",message:"\u53C2\u6570 args \u5FC5\u987B\u662F\u975E\u7A7A\u6570\u7EC4"});return}o=s.args.map(i=>String(i))}catch{(0,a.sendJSON)(e,400,{status:"\u5931\u8D25",message:"\u8BF7\u6C42\u4F53\u5FC5\u987B\u662F\u5408\u6CD5\u7684 JSON"});return}if(!w.default.existsSync(u.QBOTCLAW_BIN)){(0,a.sendJSON)(e,404,{status:"\u5931\u8D25",message:`qbotclaw \u53EF\u6267\u884C\u6587\u4EF6\u4E0D\u5B58\u5728: ${u.QBOTCLAW_BIN}`});return}e.writeHead(200,{...C,"Content-Type":"text/plain; charset=utf-8","Transfer-Encoding":"chunked","Cache-Control":"no-cache"}),(0,$.runQBotClaw)(o,e).then(()=>{e.end(`
2
2
  [\u6267\u884C\u6210\u529F]
3
- `)}).catch(t=>{s.end(`
4
- [\u542F\u52A8\u5931\u8D25: ${t.message}]
5
- `)})});return}if(m.startsWith("/api/uninstall")){const o=new URL(m,"http://localhost").searchParams.get("keepWorkspace")==="true";s.writeHead(200,{...I,"Content-Type":"text/plain; charset=utf-8","Transfer-Encoding":"chunked","Cache-Control":"no-cache"});const t=(l,c,g)=>{if(s.writable)try{s.write(JSON.stringify({status:l,file:c,msg:g})+`
6
- `)}catch{}};try{t("\u6210\u529F","","\u6B63\u5728\u505C\u6B62 QBotClaw...");const l=(0,w.readState)();if(l.gatewayPid)try{process.kill(l.gatewayPid,"SIGTERM"),(0,i.log)(`[uninstall] \u5DF2\u505C\u6B62 QBotClaw gateway \u8FDB\u7A0B pid: ${l.gatewayPid}`),t("\u6210\u529F","",`\u5DF2\u505C\u6B62 QBotClaw gateway \u8FDB\u7A0B pid: ${l.gatewayPid}`)}catch{(0,i.log)(`[uninstall] QBotClaw gateway \u8FDB\u7A0B ${l.gatewayPid} \u53EF\u80FD\u5DF2\u9000\u51FA`),t("\u6210\u529F","",`QBotClaw gateway \u8FDB\u7A0B ${l.gatewayPid} \u53EF\u80FD\u5DF2\u9000\u51FA`)}else t("\u6210\u529F","","QBotClaw \u672A\u5728\u8FD0\u884C");t("\u6210\u529F","",`\u6B63\u5728\u6267\u884C npm uninstall -g ${u.NPM_PACKAGE_NAME}...`);try{await new Promise((g,d)=>{const e=(0,E.spawn)(u.NPM_BIN,["--userconfig",u.NPM_RC,"uninstall","-g",u.NPM_PACKAGE_NAME],{env:{...process.env,PATH:`${u.NODE_BIN_DIR}:${process.env.PATH}`}});e.stdout?.on("data",r=>{(0,i.log)(`[uninstall] npm: ${r.toString().trim()}`)}),e.stderr?.on("data",r=>{(0,i.log)(`[uninstall] npm stderr: ${r.toString().trim()}`)}),e.on("close",r=>{r===0?g():d(new Error(`npm uninstall \u9000\u51FA\u7801: ${r}`))}),e.on("error",r=>d(r))}),(0,i.log)(`[uninstall] npm uninstall -g ${u.NPM_PACKAGE_NAME} \u6210\u529F`),t("\u6210\u529F","",`npm uninstall -g ${u.NPM_PACKAGE_NAME} \u6210\u529F`)}catch(g){(0,i.log)(`[uninstall] npm uninstall \u5931\u8D25: ${g.message}`),t("\u5931\u8D25","",`npm uninstall \u5931\u8D25: ${g.message}`)}t("\u6210\u529F","",`\u6B63\u5728\u6E05\u7406\u76EE\u5F55 ${u.QBOT_CLAW_DIR}...`);const c=[];if(S.default.existsSync(u.QBOT_CLAW_DIR)){const g=S.default.readdirSync(u.QBOT_CLAW_DIR);for(const d of g){const e=T.default.join(u.QBOT_CLAW_DIR,d);if(o&&d==="workspace"){t("\u6210\u529F",e,"\u4FDD\u7559 workspace \u76EE\u5F55");continue}try{S.default.statSync(e).isDirectory()?S.default.rmSync(e,{recursive:!0,force:!0}):S.default.unlinkSync(e),t("\u6210\u529F",e,"\u5DF2\u5220\u9664")}catch(r){(0,i.log)(`[uninstall] \u5220\u9664\u5931\u8D25: ${e} - ${r.message}`),t("\u5931\u8D25",e,`\u5220\u9664\u5931\u8D25: ${r.message}`),c.push(e)}}if(c.length>0){t("\u6210\u529F","",`${c.length} \u4E2A\u9879\u76EE\u5220\u9664\u5931\u8D25\uFF0C\u4F7F\u7528 rm \u547D\u4EE4\u91CD\u8BD5...`);for(const d of c)try{(0,E.execSync)(`rm -rf "${d}"`),(0,i.log)(`[uninstall] rm -rf \u91CD\u8BD5\u6210\u529F: ${d}`),t("\u6210\u529F",d,"rm \u91CD\u8BD5\u5220\u9664\u6210\u529F")}catch(e){(0,i.log)(`[uninstall] rm -rf \u91CD\u8BD5\u4E5F\u5931\u8D25: ${d} - ${e.message}`),t("\u5931\u8D25",d,`rm \u91CD\u8BD5\u4E5F\u5931\u8D25: ${e.message}`)}}if(o)t("\u6210\u529F",u.QBOT_CLAW_DIR,"\u4FDD\u7559\u6839\u76EE\u5F55\uFF08workspace \u6A21\u5F0F\uFF09");else try{S.default.rmSync(u.QBOT_CLAW_DIR,{recursive:!0,force:!0}),t("\u6210\u529F",u.QBOT_CLAW_DIR,"\u5DF2\u5220\u9664\u6839\u76EE\u5F55")}catch(d){(0,i.log)(`[uninstall] \u5220\u9664\u6839\u76EE\u5F55\u5931\u8D25: ${d.message}`);try{(0,E.execSync)(`rm -rf "${u.QBOT_CLAW_DIR}"`),t("\u6210\u529F",u.QBOT_CLAW_DIR,"rm \u91CD\u8BD5\u5220\u9664\u6839\u76EE\u5F55\u6210\u529F")}catch(e){t("\u5931\u8D25",u.QBOT_CLAW_DIR,`\u5220\u9664\u6839\u76EE\u5F55\u5931\u8D25: ${e.message}`)}}}else t("\u6210\u529F",u.QBOT_CLAW_DIR,"\u76EE\u5F55\u4E0D\u5B58\u5728\uFF0C\u65E0\u9700\u6E05\u7406");t("\u6210\u529F","","\u5378\u8F7D\u5B8C\u6210")}catch(l){(0,i.log)(`[uninstall] \u5378\u8F7D\u8FC7\u7A0B\u5F02\u5E38: ${l.message}`),t("\u5931\u8D25","",`\u5378\u8F7D\u8FC7\u7A0B\u5F02\u5E38: ${l.message}`)}s.end(),setTimeout(()=>{(0,i.log)("[uninstall] \u5378\u8F7D\u6D41\u7A0B\u7ED3\u675F\uFF0Clauncher \u8FDB\u7A0B\u9000\u51FA"),process.exit(0)},500);return}if(m==="/api/file-picker"&&f.method==="POST"){if((0,v.isFilePickerBusy)()){(0,a.sendJSON)(s,409,{ok:!1,code:h.DIALOG_BUSY,files:[],message:"\u5DF2\u6709\u6587\u4EF6\u9009\u62E9\u5BF9\u8BDD\u6846\u6B63\u5728\u663E\u793A\uFF0C\u8BF7\u7B49\u5F85\u5F53\u524D\u5BF9\u8BDD\u6846\u5173\u95ED\u540E\u91CD\u8BD5"});return}let n="";f.on("data",o=>{n+=o.toString()}),f.on("end",async()=>{let o=[],t=!1,l=b,c=J,g=B,d=M;if(n){let e;try{e=JSON.parse(n)}catch{(0,a.sendJSON)(s,400,{ok:!1,code:h.INVALID_PARAMS,files:[],message:"\u8BF7\u6C42\u4F53\u5FC5\u987B\u662F\u5408\u6CD5\u7684 JSON"});return}if(e.extensions!==void 0){if(!Array.isArray(e.extensions)||!e.extensions.every(r=>typeof r=="string")){(0,a.sendJSON)(s,400,{ok:!1,code:h.INVALID_PARAMS,files:[],message:"\u53C2\u6570 extensions \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\u6570\u7EC4"});return}o=e.extensions}if(e.multiple!==void 0){if(typeof e.multiple!="boolean"){(0,a.sendJSON)(s,400,{ok:!1,code:h.INVALID_PARAMS,files:[],message:"\u53C2\u6570 multiple \u5FC5\u987B\u662F\u5E03\u5C14\u503C"});return}t=e.multiple}if(e.title!==void 0){if(typeof e.title!="string"||e.title.length>200){(0,a.sendJSON)(s,400,{ok:!1,code:h.INVALID_PARAMS,files:[],message:"\u53C2\u6570 title \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\u4E14\u957F\u5EA6\u4E0D\u8D85\u8FC7 200"});return}l=e.title}if(e.maxFileSize!==void 0){if(typeof e.maxFileSize!="number"||e.maxFileSize<=0||!Number.isFinite(e.maxFileSize)){(0,a.sendJSON)(s,400,{ok:!1,code:h.INVALID_PARAMS,files:[],message:"\u53C2\u6570 maxFileSize \u5FC5\u987B\u662F\u6B63\u6570"});return}c=Math.min(e.maxFileSize,J)}if(e.maxFileCount!==void 0){if(typeof e.maxFileCount!="number"||e.maxFileCount<=0||!Number.isInteger(e.maxFileCount)){(0,a.sendJSON)(s,400,{ok:!1,code:h.INVALID_PARAMS,files:[],message:"\u53C2\u6570 maxFileCount \u5FC5\u987B\u662F\u6B63\u6574\u6570"});return}g=Math.min(e.maxFileCount,B)}if(M&&e.allowDirectory!==void 0){if(typeof e.allowDirectory!="boolean"){(0,a.sendJSON)(s,400,{ok:!1,code:h.INVALID_PARAMS,files:[],message:"\u53C2\u6570 allowDirectory \u5FC5\u987B\u662F\u5E03\u5C14\u503C"});return}d=e.allowDirectory}}t||(g=1);try{const e=await(0,v.showFilePicker)({extensions:o,multiple:t,title:l,allowDirectory:d});if(!e||e.length===0){(0,a.sendJSON)(s,200,{ok:!1,code:h.CANCELLED,files:[],message:"\u7528\u6237\u53D6\u6D88\u4E86\u6587\u4EF6\u9009\u62E9"});return}if(d){const O=e.slice(0,g).map(D=>({name:T.default.basename(D),path:D,size:0,mimeType:"inode/directory"})),p=e.length>g;(0,a.sendJSON)(s,200,{ok:!0,files:O,message:p?`\u5DF2\u9009\u62E9 ${O.length} \u4E2A\u76EE\u5F55\uFF08\u5171\u9009\u62E9 ${e.length} \u4E2A\uFF0C\u8D85\u51FA\u4E0A\u9650 ${g} \u4E2A\u5DF2\u622A\u65AD\uFF09`:`\u5DF2\u9009\u62E9 ${O.length} \u4E2A\u76EE\u5F55`});return}let r=!1,N=e;e.length>g&&(N=e.slice(0,g),r=!0);const _=[],P=[];for(const O of N){const p=(0,k.readFileInfo)(O,c);p.ok?_.push({name:p.name,path:p.path,size:p.size,mimeType:p.mimeType}):P.push({path:p.path,reason:p.reason,code:p.code})}const y=[];if(_.length>0&&y.push(`\u6210\u529F\u8BFB\u53D6 ${_.length} \u4E2A\u6587\u4EF6`),P.length>0){const O=P.map(p=>`${T.default.basename(p.path)}: ${p.reason}`).join("\uFF1B");y.push(`${P.length} \u4E2A\u6587\u4EF6\u5931\u8D25\uFF08${O}\uFF09`)}r&&y.push(`\u5171\u9009\u62E9 ${e.length} \u4E2A\u6587\u4EF6\uFF0C\u8D85\u51FA\u4E0A\u9650 ${g} \u4E2A\u5DF2\u622A\u65AD`);const L=_.length===0&&P.length>0;(0,a.sendJSON)(s,200,{ok:!L,code:L?P[0].code:void 0,files:_,failedFiles:P.length>0?P:void 0,message:y.join("\uFF1B")||"\u6587\u4EF6\u9009\u62E9\u6210\u529F"})}catch(e){(0,i.log)(`[file-picker] \u6587\u4EF6\u9009\u62E9\u5931\u8D25: ${e.message}`);let r=h.INTERNAL_ERROR;e.message.includes("\u8D85\u65F6")?r=h.DIALOG_TIMEOUT:e.message.includes("\u4E0D\u652F\u6301\u7684\u64CD\u4F5C\u7CFB\u7EDF\u5E73\u53F0")&&(r=h.PLATFORM_NOT_SUPPORTED),(0,a.sendJSON)(s,500,{ok:!1,code:r,files:[],message:`\u6587\u4EF6\u9009\u62E9\u5931\u8D25: ${e.message}`})}});return}if(m.startsWith("/api/reveal")){const o=new URL(m,"http://localhost").searchParams.get("path");if(!o){(0,a.sendJSON)(s,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 t;try{t=Buffer.from(o,"base64").toString("utf-8")}catch{(0,a.sendJSON)(s,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(!t||t.trim()===""){(0,a.sendJSON)(s,400,{status:"\u5931\u8D25",message:"Base64 \u89E3\u7801\u540E\u8DEF\u5F84\u4E3A\u7A7A"});return}const l=(0,k.validateFilePath)(t);if(!l.valid){const r=l.reason;r.includes("\u975E\u6CD5\u5B57\u7B26")?(0,a.sendJSON)(s,400,{status:"\u5931\u8D25",message:r}):r.includes("\u4E0D\u5B58\u5728")?(0,a.sendJSON)(s,404,{status:"\u5931\u8D25",message:r}):r.includes("\u65E0\u6CD5\u89E3\u6790")?(0,a.sendJSON)(s,400,{status:"\u5931\u8D25",message:r}):((0,i.log)(`[reveal] \u5B89\u5168\u68C0\u67E5\u88AB\u62D2\u7EDD: ${t}\uFF0C\u539F\u56E0: ${r}`),(0,a.sendJSON)(s,403,{status:"\u5931\u8D25",message:r}));return}const c=T.default.resolve(t),g=process.platform;let d,e;g==="darwin"?(d="open",e=["-R",c]):g==="win32"?(d="explorer",e=[`/select,${c}`]):(d="xdg-open",e=[T.default.dirname(c)]);try{await new Promise((r,N)=>{const _=(0,E.spawn)(d,e,{stdio:"ignore"}),P=setTimeout(()=>{_.kill(),N(new Error("\u6253\u5F00\u6587\u4EF6\u7BA1\u7406\u5668\u8D85\u65F6\uFF085\u79D2\uFF09"))},5e3);_.on("close",y=>{clearTimeout(P),y===0||y===1?r():N(new Error(`\u8FDB\u7A0B\u9000\u51FA\u7801: ${y}`))}),_.on("error",y=>{clearTimeout(P),N(y)})}),(0,i.log)(`[reveal] \u5DF2\u5728\u6587\u4EF6\u7BA1\u7406\u5668\u4E2D\u663E\u793A: ${c}`),(0,a.sendJSON)(s,200,{status:"\u6210\u529F",message:`\u5DF2\u5728\u6587\u4EF6\u7BA1\u7406\u5668\u4E2D\u663E\u793A: ${c}`})}catch(r){(0,i.log)(`[reveal] \u6253\u5F00\u6587\u4EF6\u7BA1\u7406\u5668\u5931\u8D25: ${r.message}`),(0,a.sendJSON)(s,500,{status:"\u5931\u8D25",message:`\u6253\u5F00\u6587\u4EF6\u7BA1\u7406\u5668\u5931\u8D25: ${r.message}`})}return}(0,a.sendJSON)(s,404,{status:"\u5931\u8D25",message:"\u63A5\u53E3\u4E0D\u5B58\u5728"})});let A=null,C=null;function x(f){if(!f)return;if(A&&C===f){(0,i.log)(`[watchParentProcess] \u5DF2\u5728\u76D1\u63A7\u7236\u8FDB\u7A0B ppid: ${f}\uFF0C\u8DF3\u8FC7\u91CD\u590D\u76D1\u542C`);return}A?((0,i.log)(`[watchParentProcess] \u5DF2\u6709\u76D1\u63A7\uFF08ppid: ${C}\uFF09\uFF0C\u505C\u6B62\u65E7\u7684\u76D1\u63A7\uFF0C\u91CD\u65B0\u76D1\u63A7 ppid: ${f}`),clearInterval(A),A=null,C=null):(0,i.log)(`[watchParentProcess] \u5F00\u59CB\u76D1\u63A7\u7236\u8FDB\u7A0B ppid: ${f}`);const s=setInterval(()=>{try{process.kill(f,0)}catch{(0,i.log)(`[watchParentProcess] \u7236\u8FDB\u7A0B ${f} \u5DF2\u9000\u51FA\uFF0C\u5F00\u59CB\u6E05\u7406\u5E76\u9000\u51FA`),clearInterval(s),A=null,C=null;const m=(0,w.readState)();if(m.gatewayPid)try{process.kill(m.gatewayPid,"SIGTERM"),(0,i.log)(`[watchParentProcess] \u5DF2\u53D1\u9001 SIGTERM \u7ED9 qbotclaw \u8FDB\u7A0B pid: ${m.gatewayPid}`)}catch{(0,i.log)(`[watchParentProcess] qbotclaw \u8FDB\u7A0B ${m.gatewayPid} \u53EF\u80FD\u5DF2\u9000\u51FA\uFF0C\u5FFD\u7565`)}(0,w.clearState)(),(0,i.log)("[watchParentProcess] \u72B6\u6001\u5DF2\u6E05\u7406\uFF0C\u5173\u95ED server \u5E76\u9000\u51FA"),exports.server.close(()=>{(0,i.log)("[watchParentProcess] server \u5DF2\u5173\u95ED\uFF0C\u8FDB\u7A0B\u9000\u51FA"),process.exit(0)}),setTimeout(()=>{(0,i.log)("[watchParentProcess] server.close \u8D85\u65F6\uFF0C\u5F3A\u5236\u9000\u51FA"),process.exit(0)},3e3).unref()}},3e3);s.unref(),A=s,C=f}
3
+ `)}).catch(s=>{e.end(`
4
+ [\u542F\u52A8\u5931\u8D25: ${s.message}]
5
+ `)})});return}if(f.startsWith("/api/uninstall")){const o=new URL(f,"http://localhost").searchParams.get("keepWorkspace")==="true";e.writeHead(200,{...C,"Content-Type":"text/plain; charset=utf-8","Transfer-Encoding":"chunked","Cache-Control":"no-cache"});const s=(i,g,m)=>{if(e.writable)try{e.write(JSON.stringify({status:i,file:g,msg:m})+`
6
+ `)}catch{}};try{s("\u6210\u529F","","\u6B63\u5728\u505C\u6B62 QBotClaw...");const i=(0,y.readState)();if(i.gatewayPid)try{process.kill(i.gatewayPid,"SIGTERM"),(0,r.log)(`[uninstall] \u5DF2\u505C\u6B62 QBotClaw gateway \u8FDB\u7A0B pid: ${i.gatewayPid}`),s("\u6210\u529F","",`\u5DF2\u505C\u6B62 QBotClaw gateway \u8FDB\u7A0B pid: ${i.gatewayPid}`)}catch{(0,r.log)(`[uninstall] QBotClaw gateway \u8FDB\u7A0B ${i.gatewayPid} \u53EF\u80FD\u5DF2\u9000\u51FA`),s("\u6210\u529F","",`QBotClaw gateway \u8FDB\u7A0B ${i.gatewayPid} \u53EF\u80FD\u5DF2\u9000\u51FA`)}else s("\u6210\u529F","","QBotClaw \u672A\u5728\u8FD0\u884C");s("\u6210\u529F","",`\u6B63\u5728\u6267\u884C npm uninstall -g ${u.NPM_PACKAGE_NAME}...`);try{await new Promise((m,c)=>{const l=(0,R.spawn)(u.NPM_BIN,["--userconfig",u.NPM_RC,"uninstall","-g",u.NPM_PACKAGE_NAME],{env:{...process.env,PATH:`${u.NODE_BIN_DIR}:${process.env.PATH}`}});l.stdout?.on("data",t=>{(0,r.log)(`[uninstall] npm: ${t.toString().trim()}`)}),l.stderr?.on("data",t=>{(0,r.log)(`[uninstall] npm stderr: ${t.toString().trim()}`)}),l.on("close",t=>{t===0?m():c(new Error(`npm uninstall \u9000\u51FA\u7801: ${t}`))}),l.on("error",t=>c(t))}),(0,r.log)(`[uninstall] npm uninstall -g ${u.NPM_PACKAGE_NAME} \u6210\u529F`),s("\u6210\u529F","",`npm uninstall -g ${u.NPM_PACKAGE_NAME} \u6210\u529F`)}catch(m){(0,r.log)(`[uninstall] npm uninstall \u5931\u8D25: ${m.message}`),s("\u5931\u8D25","",`npm uninstall \u5931\u8D25: ${m.message}`)}s("\u6210\u529F","",`\u6B63\u5728\u6E05\u7406\u76EE\u5F55 ${u.QBOT_CLAW_DIR}...`);const g=[];if(w.default.existsSync(u.QBOT_CLAW_DIR)){const m=w.default.readdirSync(u.QBOT_CLAW_DIR);for(const c of m){const l=I.default.join(u.QBOT_CLAW_DIR,c);if(o&&c==="workspace"){s("\u6210\u529F",l,"\u4FDD\u7559 workspace \u76EE\u5F55");continue}try{w.default.statSync(l).isDirectory()?w.default.rmSync(l,{recursive:!0,force:!0}):w.default.unlinkSync(l),s("\u6210\u529F",l,"\u5DF2\u5220\u9664")}catch(t){(0,r.log)(`[uninstall] \u5220\u9664\u5931\u8D25: ${l} - ${t.message}`),s("\u5931\u8D25",l,`\u5220\u9664\u5931\u8D25: ${t.message}`),g.push(l)}}if(g.length>0){s("\u6210\u529F","",`${g.length} \u4E2A\u9879\u76EE\u5220\u9664\u5931\u8D25\uFF0C\u4F7F\u7528 rm \u547D\u4EE4\u91CD\u8BD5...`);for(const c of g)try{(0,R.execSync)(`rm -rf "${c}"`),(0,r.log)(`[uninstall] rm -rf \u91CD\u8BD5\u6210\u529F: ${c}`),s("\u6210\u529F",c,"rm \u91CD\u8BD5\u5220\u9664\u6210\u529F")}catch(l){(0,r.log)(`[uninstall] rm -rf \u91CD\u8BD5\u4E5F\u5931\u8D25: ${c} - ${l.message}`),s("\u5931\u8D25",c,`rm \u91CD\u8BD5\u4E5F\u5931\u8D25: ${l.message}`)}}if(o)s("\u6210\u529F",u.QBOT_CLAW_DIR,"\u4FDD\u7559\u6839\u76EE\u5F55\uFF08workspace \u6A21\u5F0F\uFF09");else try{w.default.rmSync(u.QBOT_CLAW_DIR,{recursive:!0,force:!0}),s("\u6210\u529F",u.QBOT_CLAW_DIR,"\u5DF2\u5220\u9664\u6839\u76EE\u5F55")}catch(c){(0,r.log)(`[uninstall] \u5220\u9664\u6839\u76EE\u5F55\u5931\u8D25: ${c.message}`);try{(0,R.execSync)(`rm -rf "${u.QBOT_CLAW_DIR}"`),s("\u6210\u529F",u.QBOT_CLAW_DIR,"rm \u91CD\u8BD5\u5220\u9664\u6839\u76EE\u5F55\u6210\u529F")}catch(l){s("\u5931\u8D25",u.QBOT_CLAW_DIR,`\u5220\u9664\u6839\u76EE\u5F55\u5931\u8D25: ${l.message}`)}}}else s("\u6210\u529F",u.QBOT_CLAW_DIR,"\u76EE\u5F55\u4E0D\u5B58\u5728\uFF0C\u65E0\u9700\u6E05\u7406");s("\u6210\u529F","","\u5378\u8F7D\u5B8C\u6210")}catch(i){(0,r.log)(`[uninstall] \u5378\u8F7D\u8FC7\u7A0B\u5F02\u5E38: ${i.message}`),s("\u5931\u8D25","",`\u5378\u8F7D\u8FC7\u7A0B\u5F02\u5E38: ${i.message}`)}e.end(),setTimeout(()=>{(0,r.log)("[uninstall] \u5378\u8F7D\u6D41\u7A0B\u7ED3\u675F\uFF0Clauncher \u8FDB\u7A0B\u9000\u51FA"),process.exit(0)},500);return}if(f==="/api/file-picker"&&d.method==="POST"){const n=(0,B.authenticateRequest)(d);if(!n.ok){(0,a.sendJSON)(e,n.statusCode,{ok:!1,message:n.message});return}if((0,J.isFilePickerBusy)()){(0,a.sendJSON)(e,409,{ok:!1,code:P.DIALOG_BUSY,files:[],message:"\u5DF2\u6709\u6587\u4EF6\u9009\u62E9\u5BF9\u8BDD\u6846\u6B63\u5728\u663E\u793A\uFF0C\u8BF7\u7B49\u5F85\u5F53\u524D\u5BF9\u8BDD\u6846\u5173\u95ED\u540E\u91CD\u8BD5"});return}let o="";d.on("data",s=>{o+=s.toString()}),d.on("end",async()=>{let s=[],i=!1,g=H,m=M,c=F,l=b;if(o){let t;try{t=JSON.parse(o)}catch{(0,a.sendJSON)(e,400,{ok:!1,code:P.INVALID_PARAMS,files:[],message:"\u8BF7\u6C42\u4F53\u5FC5\u987B\u662F\u5408\u6CD5\u7684 JSON"});return}if(t.extensions!==void 0){if(!Array.isArray(t.extensions)||!t.extensions.every(p=>typeof p=="string")){(0,a.sendJSON)(e,400,{ok:!1,code:P.INVALID_PARAMS,files:[],message:"\u53C2\u6570 extensions \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\u6570\u7EC4"});return}s=t.extensions}if(t.multiple!==void 0){if(typeof t.multiple!="boolean"){(0,a.sendJSON)(e,400,{ok:!1,code:P.INVALID_PARAMS,files:[],message:"\u53C2\u6570 multiple \u5FC5\u987B\u662F\u5E03\u5C14\u503C"});return}i=t.multiple}if(t.title!==void 0){if(typeof t.title!="string"||t.title.length>200){(0,a.sendJSON)(e,400,{ok:!1,code:P.INVALID_PARAMS,files:[],message:"\u53C2\u6570 title \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\u4E14\u957F\u5EA6\u4E0D\u8D85\u8FC7 200"});return}g=t.title}if(t.maxFileSize!==void 0){if(typeof t.maxFileSize!="number"||t.maxFileSize<=0||!Number.isFinite(t.maxFileSize)){(0,a.sendJSON)(e,400,{ok:!1,code:P.INVALID_PARAMS,files:[],message:"\u53C2\u6570 maxFileSize \u5FC5\u987B\u662F\u6B63\u6570"});return}m=Math.min(t.maxFileSize,M)}if(t.maxFileCount!==void 0){if(typeof t.maxFileCount!="number"||t.maxFileCount<=0||!Number.isInteger(t.maxFileCount)){(0,a.sendJSON)(e,400,{ok:!1,code:P.INVALID_PARAMS,files:[],message:"\u53C2\u6570 maxFileCount \u5FC5\u987B\u662F\u6B63\u6574\u6570"});return}c=Math.min(t.maxFileCount,F)}if(b&&t.allowDirectory!==void 0){if(typeof t.allowDirectory!="boolean"){(0,a.sendJSON)(e,400,{ok:!1,code:P.INVALID_PARAMS,files:[],message:"\u53C2\u6570 allowDirectory \u5FC5\u987B\u662F\u5E03\u5C14\u503C"});return}l=t.allowDirectory}}i||(c=1);try{const t=await(0,J.showFilePicker)({extensions:s,multiple:i,title:g,allowDirectory:l});if(!t||t.length===0){(0,a.sendJSON)(e,200,{ok:!1,code:P.CANCELLED,files:[],message:"\u7528\u6237\u53D6\u6D88\u4E86\u6587\u4EF6\u9009\u62E9"});return}if(l){const N=t.slice(0,c).map(D=>({name:I.default.basename(D),path:D,size:0,mimeType:"inode/directory"})),h=t.length>c;(0,a.sendJSON)(e,200,{ok:!0,files:N,message:h?`\u5DF2\u9009\u62E9 ${N.length} \u4E2A\u76EE\u5F55\uFF08\u5171\u9009\u62E9 ${t.length} \u4E2A\uFF0C\u8D85\u51FA\u4E0A\u9650 ${c} \u4E2A\u5DF2\u622A\u65AD\uFF09`:`\u5DF2\u9009\u62E9 ${N.length} \u4E2A\u76EE\u5F55`});return}let p=!1,A=t;t.length>c&&(A=t.slice(0,c),p=!0);const O=[],S=[];for(const N of A){const h=(0,x.readFileInfo)(N,m);h.ok?O.push({name:h.name,path:h.path,size:h.size,mimeType:h.mimeType}):S.push({path:h.path,reason:h.reason,code:h.code})}const _=[];if(O.length>0&&_.push(`\u6210\u529F\u8BFB\u53D6 ${O.length} \u4E2A\u6587\u4EF6`),S.length>0){const N=S.map(h=>`${I.default.basename(h.path)}: ${h.reason}`).join("\uFF1B");_.push(`${S.length} \u4E2A\u6587\u4EF6\u5931\u8D25\uFF08${N}\uFF09`)}p&&_.push(`\u5171\u9009\u62E9 ${t.length} \u4E2A\u6587\u4EF6\uFF0C\u8D85\u51FA\u4E0A\u9650 ${c} \u4E2A\u5DF2\u622A\u65AD`);const k=O.length===0&&S.length>0;(0,a.sendJSON)(e,200,{ok:!k,code:k?S[0].code:void 0,files:O,failedFiles:S.length>0?S:void 0,message:_.join("\uFF1B")||"\u6587\u4EF6\u9009\u62E9\u6210\u529F"})}catch(t){(0,r.log)(`[file-picker] \u6587\u4EF6\u9009\u62E9\u5931\u8D25: ${t.message}`);let p=P.INTERNAL_ERROR;t.message.includes("\u8D85\u65F6")?p=P.DIALOG_TIMEOUT:t.message.includes("\u4E0D\u652F\u6301\u7684\u64CD\u4F5C\u7CFB\u7EDF\u5E73\u53F0")&&(p=P.PLATFORM_NOT_SUPPORTED),(0,a.sendJSON)(e,500,{ok:!1,code:p,files:[],message:`\u6587\u4EF6\u9009\u62E9\u5931\u8D25: ${t.message}`})}});return}if(f.startsWith("/api/reveal")){const n=(0,B.authenticateRequest)(d);if(!n.ok){(0,a.sendJSON)(e,n.statusCode,{status:"\u5931\u8D25",message:n.message});return}const s=new URL(f,"http://localhost").searchParams.get("path");if(!s){(0,a.sendJSON)(e,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 i;try{i=Buffer.from(s,"base64").toString("utf-8")}catch{(0,a.sendJSON)(e,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(!i||i.trim()===""){(0,a.sendJSON)(e,400,{status:"\u5931\u8D25",message:"Base64 \u89E3\u7801\u540E\u8DEF\u5F84\u4E3A\u7A7A"});return}const g=(0,x.validateFilePath)(i);if(!g.valid){const p=g.reason;p.includes("\u975E\u6CD5\u5B57\u7B26")?(0,a.sendJSON)(e,400,{status:"\u5931\u8D25",message:p}):p.includes("\u4E0D\u5B58\u5728")?(0,a.sendJSON)(e,404,{status:"\u5931\u8D25",message:p}):p.includes("\u65E0\u6CD5\u89E3\u6790")?(0,a.sendJSON)(e,400,{status:"\u5931\u8D25",message:p}):((0,r.log)(`[reveal] \u5B89\u5168\u68C0\u67E5\u88AB\u62D2\u7EDD: ${i}\uFF0C\u539F\u56E0: ${p}`),(0,a.sendJSON)(e,403,{status:"\u5931\u8D25",message:p}));return}const m=I.default.resolve(i),c=process.platform;let l,t;c==="darwin"?(l="open",t=["-R",m]):c==="win32"?(l="explorer",t=[`/select,${m}`]):(l="xdg-open",t=[I.default.dirname(m)]);try{await new Promise((p,A)=>{const O=(0,R.spawn)(l,t,{stdio:"ignore"}),S=setTimeout(()=>{O.kill(),A(new Error("\u6253\u5F00\u6587\u4EF6\u7BA1\u7406\u5668\u8D85\u65F6\uFF085\u79D2\uFF09"))},5e3);O.on("close",_=>{clearTimeout(S),_===0||_===1?p():A(new Error(`\u8FDB\u7A0B\u9000\u51FA\u7801: ${_}`))}),O.on("error",_=>{clearTimeout(S),A(_)})}),(0,r.log)(`[reveal] \u5DF2\u5728\u6587\u4EF6\u7BA1\u7406\u5668\u4E2D\u663E\u793A: ${m}`),(0,a.sendJSON)(e,200,{status:"\u6210\u529F",message:`\u5DF2\u5728\u6587\u4EF6\u7BA1\u7406\u5668\u4E2D\u663E\u793A: ${m}`})}catch(p){(0,r.log)(`[reveal] \u6253\u5F00\u6587\u4EF6\u7BA1\u7406\u5668\u5931\u8D25: ${p.message}`),(0,a.sendJSON)(e,500,{status:"\u5931\u8D25",message:`\u6253\u5F00\u6587\u4EF6\u7BA1\u7406\u5668\u5931\u8D25: ${p.message}`})}return}(0,a.sendJSON)(e,404,{status:"\u5931\u8D25",message:"\u63A5\u53E3\u4E0D\u5B58\u5728"})});let T=null,E=null;function W(d){if(!d)return;if(T&&E===d){(0,r.log)(`[watchParentProcess] \u5DF2\u5728\u76D1\u63A7\u7236\u8FDB\u7A0B ppid: ${d}\uFF0C\u8DF3\u8FC7\u91CD\u590D\u76D1\u542C`);return}T?((0,r.log)(`[watchParentProcess] \u5DF2\u6709\u76D1\u63A7\uFF08ppid: ${E}\uFF09\uFF0C\u505C\u6B62\u65E7\u7684\u76D1\u63A7\uFF0C\u91CD\u65B0\u76D1\u63A7 ppid: ${d}`),clearInterval(T),T=null,E=null):(0,r.log)(`[watchParentProcess] \u5F00\u59CB\u76D1\u63A7\u7236\u8FDB\u7A0B ppid: ${d}`);const e=setInterval(()=>{try{process.kill(d,0)}catch{(0,r.log)(`[watchParentProcess] \u7236\u8FDB\u7A0B ${d} \u5DF2\u9000\u51FA\uFF0C\u5F00\u59CB\u6E05\u7406\u5E76\u9000\u51FA`),clearInterval(e),T=null,E=null;const f=(0,y.readState)();if(f.gatewayPid)try{process.kill(f.gatewayPid,"SIGTERM"),(0,r.log)(`[watchParentProcess] \u5DF2\u53D1\u9001 SIGTERM \u7ED9 qbotclaw \u8FDB\u7A0B pid: ${f.gatewayPid}`)}catch{(0,r.log)(`[watchParentProcess] qbotclaw \u8FDB\u7A0B ${f.gatewayPid} \u53EF\u80FD\u5DF2\u9000\u51FA\uFF0C\u5FFD\u7565`)}(0,y.clearState)(),(0,r.log)("[watchParentProcess] \u72B6\u6001\u5DF2\u6E05\u7406\uFF0C\u5173\u95ED server \u5E76\u9000\u51FA"),exports.server.close(()=>{(0,r.log)("[watchParentProcess] server \u5DF2\u5173\u95ED\uFF0C\u8FDB\u7A0B\u9000\u51FA"),process.exit(0)}),setTimeout(()=>{(0,r.log)("[watchParentProcess] server.close \u8D85\u65F6\uFF0C\u5F3A\u5236\u9000\u51FA"),process.exit(0)},3e3).unref()}},3e3);e.unref(),T=e,E=d}
package/dist/service.js CHANGED
@@ -1,6 +1,6 @@
1
- "use strict";var l=exports&&exports.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.getServiceToken=_,exports.startService=h,exports.stopService=R;const f=l(require("fs")),S=l(require("http")),g=require("crypto"),p=require("./server"),e=require("./state"),w=require("./config"),u=require("./version"),y=require("./installer"),v=require("./utils"),o=require("./reportLog");let c=null;function _(){return c}function k(t){return new Promise(r=>{const s=S.default.get(`http://127.0.0.1:${t}/api/version`,a=>{let n="";a.on("data",i=>{n+=i.toString()}),a.on("end",()=>{try{const i=JSON.parse(n);r(i.launcher??null)}catch{r(null)}})});s.on("error",()=>r(null)),s.setTimeout(3e3,()=>{s.destroy(),r(null)})})}async function q(){const t=(0,e.readState)();if(!t.pid||!t.port)return null;try{process.kill(t.pid,0)}catch{return(0,e.clearState)(),null}if(await(0,e.isPortAvailable)(t.port))return(0,o.log)("\u7AEF\u53E3\u672A\u88AB\u5360\u7528\uFF0C\u8BF4\u660E\u72B6\u6001\u6587\u4EF6\u8FC7\u671F"),(0,e.clearState)(),null;const s=await k(t.port);if((0,o.log)(`[service] \u68C0\u6D4B\u5230\u6B63\u5728\u8FD0\u884C\u7684\u670D\u52A1\u7248\u672C: ${s??"unknown"}\uFF0C\u5F53\u524D\u7248\u672C: ${u.LAUNCHER_VERSION}`),s===u.LAUNCHER_VERSION)return(0,o.log)(`[service] \u7248\u672C\u4E00\u81F4\uFF0C\u590D\u7528\u5DF2\u6709\u670D\u52A1 (pid: ${t.pid}, port: ${t.port})`),!1;(0,o.log)(`[service] \u7248\u672C\u4E0D\u4E00\u81F4 (\u8FD0\u884C\u4E2D: ${s??"unknown"}, \u5F53\u524D: ${u.LAUNCHER_VERSION})\uFF0C\u6740\u6389\u65E7\u8FDB\u7A0B pid: ${t.pid}\uFF0C\u91CD\u65B0\u542F\u52A8`);try{process.kill(t.pid,"SIGTERM")}catch{}return(0,e.clearState)(),!0}async function h(t,r){if(await q()===!1){const n=(0,e.readState)();c=n.token??null,process.stdout.write(JSON.stringify({state:"success",pid:n.pid,port:n.port,token:c})+`
2
- `),process.stdout.uncork();return}const a=await(0,e.findAvailablePort)();c=(0,g.randomUUID)(),p.server.listen(a,"127.0.0.1",()=>{if((0,e.writeState)({pid:process.pid,port:a,token:c,...t?{ppid:t}:{}}),process.stdout.write(JSON.stringify({state:"success",pid:process.pid,port:a,token:c})+`
3
- `),process.stdout.uncork(),(0,p.watchParentProcess)(t),!f.default.existsSync(w.QBOTCLAW_BIN)){(0,o.log)("[service] qbotclaw \u672A\u5B89\u88C5\uFF0C\u4E0D\u81EA\u52A8\u542F\u52A8");return}(0,v.getQBotClawVersion)().then(n=>{const i=(0,e.readState)();if(n!==r){(0,o.log)(`[service] qbotclaw \u672C\u5730\u7248\u672C (${n??"unknown"}) \u4E0E\u671F\u671B\u7248\u672C (${r}) \u4E0D\u4E00\u81F4\uFF0C\u505C\u6B62\u5F53\u524D qbotclaw \u8FDB\u7A0B`),(0,e.stopGateway)();return}else i.gatewayPid&&i.gatewayPort?(0,o.log)(`[service] qbotclaw \u5DF2\u5728\u8FD0\u884C\uFF0Cpid: ${i.gatewayPid}, port: ${i.gatewayPort}`):((0,o.log)("[service] \u68C0\u6D4B\u5230 qbotclaw\uFF0C\u7248\u672C\u5339\u914D\uFF0C\u81EA\u52A8\u542F\u52A8 gateway..."),(0,y.configAndRunQBotClaw)().catch(d=>{(0,o.log)(`[service] \u81EA\u52A8\u542F\u52A8 gateway \u5931\u8D25: ${d.message}`)}))})}),process.on("SIGTERM",()=>{(0,e.stopGateway)(),(0,e.clearState)(),(0,o.flushLogs)().finally(()=>{process.exit(0)})})}function R(){const t=(0,e.readState)();if(!t.pid){process.stdout.write(JSON.stringify({state:"err",pid:0,port:0})+`
4
- `),process.stdout.uncork();return}try{process.kill(t.pid,"SIGTERM");const r=t.pid,s=t.port??0;(0,e.clearState)(),process.stdout.write(JSON.stringify({state:"success",pid:r,port:s})+`
1
+ "use strict";var d=exports&&exports.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.getOrCreateGatewayToken=g,exports.startService=O,exports.stopService=R;const S=d(require("fs")),y=d(require("http")),_=require("crypto"),f=require("./server"),e=require("./state"),v=require("./config"),l=require("./version"),k=require("./installer"),q=require("./utils"),s=require("./reportLog");let p,u;function g(){return u||(u=require("crypto").randomBytes(24).toString("hex"),u||"0526bec85002fe65ef10d33df0a8dfbe76917cd125f5a4ad")}function h(t){return new Promise(r=>{const o=y.default.get(`http://127.0.0.1:${t}/api/version`,a=>{let n="";a.on("data",i=>{n+=i.toString()}),a.on("end",()=>{try{const i=JSON.parse(n);r(i.launcher??null)}catch{r(null)}})});o.on("error",()=>r(null)),o.setTimeout(3e3,()=>{o.destroy(),r(null)})})}async function $(){const t=(0,e.readState)();if(!t.pid||!t.port)return null;try{process.kill(t.pid,0)}catch{return(0,e.clearState)(),null}if(await(0,e.isPortAvailable)(t.port))return(0,s.log)("\u7AEF\u53E3\u672A\u88AB\u5360\u7528\uFF0C\u8BF4\u660E\u72B6\u6001\u6587\u4EF6\u8FC7\u671F"),(0,e.clearState)(),null;const o=await h(t.port);if((0,s.log)(`[service] \u68C0\u6D4B\u5230\u6B63\u5728\u8FD0\u884C\u7684\u670D\u52A1\u7248\u672C: ${o??"unknown"}\uFF0C\u5F53\u524D\u7248\u672C: ${l.LAUNCHER_VERSION}`),o===l.LAUNCHER_VERSION)return(0,s.log)(`[service] \u7248\u672C\u4E00\u81F4\uFF0C\u590D\u7528\u5DF2\u6709\u670D\u52A1 (pid: ${t.pid}, port: ${t.port})`),!1;(0,s.log)(`[service] \u7248\u672C\u4E0D\u4E00\u81F4 (\u8FD0\u884C\u4E2D: ${o??"unknown"}, \u5F53\u524D: ${l.LAUNCHER_VERSION})\uFF0C\u6740\u6389\u65E7\u8FDB\u7A0B pid: ${t.pid}\uFF0C\u91CD\u65B0\u542F\u52A8`);try{process.kill(t.pid,"SIGTERM")}catch{}return(0,e.clearState)(),!0}async function O(t,r){if(await $()===!1){const n=(0,e.readState)();process.stdout.write(JSON.stringify({state:"success",pid:n.pid,port:n.port})+`
2
+ `),process.stdout.uncork(),(0,s.log)(`[service] \u7248\u672C\u4E00\u81F4\uFF0C\u590D\u7528\u5DF2\u6709\u670D\u52A1 (pid: ${n.pid}, port: ${n.port})`);return}const a=await(0,e.findAvailablePort)();f.server.listen(a,"127.0.0.1",()=>{p=(0,_.randomUUID)();const n=g();if((0,e.writeState)({pid:process.pid,port:a,token:p,...t?{ppid:t}:{}}),process.stdout.write(JSON.stringify({state:"success",pid:process.pid,port:a,token:p,gatewayToken:n})+`
3
+ `),process.stdout.uncork(),(0,f.watchParentProcess)(t),!S.default.existsSync(v.QBOTCLAW_BIN)){(0,s.log)("[service] qbotclaw \u672A\u5B89\u88C5\uFF0C\u4E0D\u81EA\u52A8\u542F\u52A8");return}(0,q.getQBotClawVersion)().then(i=>{const c=(0,e.readState)();if(i!==r){(0,s.log)(`[service] qbotclaw \u672C\u5730\u7248\u672C (${i??"unknown"}) \u4E0E\u671F\u671B\u7248\u672C (${r}) \u4E0D\u4E00\u81F4\uFF0C\u505C\u6B62\u5F53\u524D qbotclaw \u8FDB\u7A0B`),(0,e.stopGateway)();return}else c.gatewayPid&&c.gatewayPort?(0,s.log)(`[service] qbotclaw \u5DF2\u5728\u8FD0\u884C\uFF0Cpid: ${c.gatewayPid}, port: ${c.gatewayPort}`):((0,s.log)("[service] \u68C0\u6D4B\u5230 qbotclaw\uFF0C\u7248\u672C\u5339\u914D\uFF0C\u81EA\u52A8\u542F\u52A8 gateway..."),(0,k.configAndRunQBotClaw)().catch(w=>{(0,s.log)(`[service] \u81EA\u52A8\u542F\u52A8 gateway \u5931\u8D25: ${w.message}`)}))})}),process.on("SIGTERM",()=>{(0,e.stopGateway)(),(0,e.clearState)(),(0,s.flushLogs)().finally(()=>{process.exit(0)})})}function R(){const t=(0,e.readState)();if(!t.pid){process.stdout.write(JSON.stringify({state:"err",pid:0,port:0})+`
4
+ `),process.stdout.uncork();return}try{process.kill(t.pid,"SIGTERM");const r=t.pid,o=t.port??0;(0,e.clearState)(),process.stdout.write(JSON.stringify({state:"success",pid:r,port:o})+`
5
5
  `),process.stdout.uncork()}catch(r){r.code==="ESRCH"&&(0,e.clearState)(),process.stdout.write(JSON.stringify({state:"err",pid:0,port:0})+`
6
6
  `),process.stdout.uncork()}}
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.63";
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.LAUNCHER_VERSION=void 0,exports.LAUNCHER_VERSION="0.9.64";
@@ -1,11 +1,11 @@
1
1
  const {createWrapper} = require('./wrapper');
2
2
 
3
- // 直接加载本地编译的 Universal Binary (.node 文件)
3
+ // 直接加载预编译的 Universal Binary (.node 文件)
4
4
  let binding;
5
5
  try {
6
6
  binding = require('./build/Release/watcher.node');
7
7
  } catch (err) {
8
- throw new Error(`No local build of @parcel/watcher found. Please run "bash scripts/build-parcel-watcher.sh" to compile the native module. Error: ${err.message}`);
8
+ throw new Error(`No prebuild of @parcel/watcher found. Please run the build scripts to compile the native module. Error: ${err.message}`);
9
9
  }
10
10
 
11
11
  const wrapper = createWrapper(binding);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qqbrowser/qbot-claw-launcher",
3
- "version": "0.9.63",
3
+ "version": "0.9.64",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -16,10 +16,11 @@
16
16
  ],
17
17
  "scripts": {
18
18
  "build": "node scripts/inject-version.js && tsc && node scripts/obfuscate.js && chmod +x dist/index.js",
19
- "prepack": "bash scripts/build-fs-xattr.sh && bash scripts/build-parcel-watcher.sh && rm -rf node_modules/fs-xattr && cp -r fs-xattr node_modules/fs-xattr && rm -rf node_modules/@parcel/watcher && mkdir -p node_modules/@parcel && cp -r parcel-watcher node_modules/@parcel/watcher && bash scripts/clean-native-sources.sh && bash scripts/verify-universal-binary.sh",
19
+ "prepare": "test -d prebuilds && mkdir -p fs-xattr/build/Release parcel-watcher/build/Release && cp prebuilds/xattr.node fs-xattr/build/Release/ && cp prebuilds/watcher.node parcel-watcher/build/Release/ && echo '✅ prebuilds copied' || true",
20
+ "prepack": "rm -rf node_modules/fs-xattr && cp -r fs-xattr node_modules/fs-xattr && rm -rf node_modules/@parcel/watcher && mkdir -p node_modules/@parcel && cp -r parcel-watcher node_modules/@parcel/watcher && mkdir -p node_modules/fs-xattr/build/Release && cp prebuilds/xattr.node node_modules/fs-xattr/build/Release/ && mkdir -p node_modules/@parcel/watcher/build/Release && cp prebuilds/watcher.node node_modules/@parcel/watcher/build/Release/ && bash scripts/clean-native-sources.sh && bash scripts/verify-universal-binary.sh",
20
21
  "start": "node dist/index.js",
21
22
  "dev": "ts-node src/index.ts",
22
- "test": "jest --verbose"
23
+ "test": "echo \"Error: no test specified\" && exit 1"
23
24
  },
24
25
  "publishConfig": {
25
26
  "registry": "https://registry.npmjs.org"
@@ -28,20 +29,14 @@
28
29
  "author": "",
29
30
  "license": "ISC",
30
31
  "devDependencies": {
31
- "@types/jest": "^30.0.0",
32
32
  "@types/node": "^20.0.0",
33
33
  "esbuild": "0.25.10",
34
- "jest": "^30.3.0",
35
- "ts-jest": "^29.4.6",
36
34
  "ts-node": "10.9.2",
37
35
  "typescript": "5.9.3"
38
36
  },
39
37
  "dependencies": {
40
38
  "@parcel/watcher": "file:./parcel-watcher",
41
- "fs-xattr": "file:./fs-xattr"
42
- },
43
- "bundleDependencies": [
44
- "fs-xattr",
45
- "@parcel/watcher"
46
- ]
39
+ "fs-xattr": "file:./fs-xattr",
40
+ "@tencent/qb-auth-send-h5": "^2.5.0"
41
+ }
47
42
  }