@quukk/opencode-clawmessenger 0.3.0 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +71 -623
- package/bin/opencode-clawmessenger +2 -2
- package/bin/opencode-clawmessenger-setup +5 -5
- package/dist/cli.d.ts +0 -1
- package/dist/cli.js +1 -288
- package/dist/core/auto-register.d.ts +0 -1
- package/dist/core/auto-register.js +1 -174
- package/dist/core/auto-serve.d.ts +13 -0
- package/dist/core/auto-serve.js +1 -0
- package/dist/core/config.d.ts +2 -3
- package/dist/core/config.js +1 -80
- package/dist/core/daemon.d.ts +0 -1
- package/dist/core/daemon.js +1 -77
- package/dist/core/dedup.d.ts +0 -1
- package/dist/core/dedup.js +1 -25
- package/dist/core/hook-manager.d.ts +0 -1
- package/dist/core/hook-manager.js +1 -33
- package/dist/core/logger.d.ts +0 -1
- package/dist/core/logger.js +1 -49
- package/dist/core/mac-address.d.ts +0 -1
- package/dist/core/mac-address.js +1 -43
- package/dist/core/message-handler.d.ts +0 -1
- package/dist/core/message-handler.js +1 -988
- package/dist/core/ops-assistant.d.ts +0 -1
- package/dist/core/ops-assistant.js +1 -270
- package/dist/core/qr-crypto.d.ts +0 -1
- package/dist/core/qr-crypto.js +1 -66
- package/dist/core/session-manager.d.ts +0 -1
- package/dist/core/session-manager.js +1 -144
- package/dist/core/types.d.ts +1 -2
- package/dist/core/types.js +1 -26
- package/dist/index.d.ts +0 -1
- package/dist/index.js +1 -16
- package/dist/openclaw/client.d.ts +0 -1
- package/dist/openclaw/client.js +1 -494
- package/dist/opencode/client.d.ts +0 -1
- package/dist/opencode/client.js +1 -279
- package/dist/opencode/event-handler.d.ts +0 -1
- package/dist/opencode/event-handler.js +1 -467
- package/dist/plugin.d.ts +0 -1
- package/dist/plugin.js +1 -148
- package/dist/rongcloud/client.d.ts +0 -1
- package/dist/rongcloud/client.js +1 -292
- package/dist/rongcloud/env-polyfill.d.ts +0 -1
- package/dist/rongcloud/env-polyfill.js +1 -107
- package/dist/rongcloud/server-api.d.ts +0 -1
- package/dist/rongcloud/server-api.js +1 -157
- package/dist/standalone.d.ts +0 -1
- package/dist/standalone.js +1 -229
- package/dist/types/plugin.d.ts +0 -1
- package/dist/types/plugin.js +1 -2
- package/dist/websocket/client.d.ts +0 -1
- package/dist/websocket/client.js +1 -88
- package/dist/websocket/server-client.d.ts +0 -1
- package/dist/websocket/server-client.js +1 -98
- package/package.json +83 -81
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/core/auto-register.d.ts.map +0 -1
- package/dist/core/auto-register.js.map +0 -1
- package/dist/core/config.d.ts.map +0 -1
- package/dist/core/config.js.map +0 -1
- package/dist/core/daemon.d.ts.map +0 -1
- package/dist/core/daemon.js.map +0 -1
- package/dist/core/dedup.d.ts.map +0 -1
- package/dist/core/dedup.js.map +0 -1
- package/dist/core/hook-manager.d.ts.map +0 -1
- package/dist/core/hook-manager.js.map +0 -1
- package/dist/core/logger.d.ts.map +0 -1
- package/dist/core/logger.js.map +0 -1
- package/dist/core/mac-address.d.ts.map +0 -1
- package/dist/core/mac-address.js.map +0 -1
- package/dist/core/message-handler.d.ts.map +0 -1
- package/dist/core/message-handler.js.map +0 -1
- package/dist/core/ops-assistant.d.ts.map +0 -1
- package/dist/core/ops-assistant.js.map +0 -1
- package/dist/core/qr-crypto.d.ts.map +0 -1
- package/dist/core/qr-crypto.js.map +0 -1
- package/dist/core/session-manager.d.ts.map +0 -1
- package/dist/core/session-manager.js.map +0 -1
- package/dist/core/types.d.ts.map +0 -1
- package/dist/core/types.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/openclaw/client.d.ts.map +0 -1
- package/dist/openclaw/client.js.map +0 -1
- package/dist/opencode/client.d.ts.map +0 -1
- package/dist/opencode/client.js.map +0 -1
- package/dist/opencode/event-handler.d.ts.map +0 -1
- package/dist/opencode/event-handler.js.map +0 -1
- package/dist/plugin.d.ts.map +0 -1
- package/dist/plugin.js.map +0 -1
- package/dist/rongcloud/client.d.ts.map +0 -1
- package/dist/rongcloud/client.js.map +0 -1
- package/dist/rongcloud/env-polyfill.d.ts.map +0 -1
- package/dist/rongcloud/env-polyfill.js.map +0 -1
- package/dist/rongcloud/server-api.d.ts.map +0 -1
- package/dist/rongcloud/server-api.js.map +0 -1
- package/dist/standalone.d.ts.map +0 -1
- package/dist/standalone.js.map +0 -1
- package/dist/types/plugin.d.ts.map +0 -1
- package/dist/types/plugin.js.map +0 -1
- package/dist/websocket/client.d.ts.map +0 -1
- package/dist/websocket/client.js.map +0 -1
- package/dist/websocket/server-client.d.ts.map +0 -1
- package/dist/websocket/server-client.js.map +0 -1
package/dist/openclaw/client.js
CHANGED
|
@@ -1,494 +1 @@
|
|
|
1
|
-
import { spawn } from 'child_process';
|
|
2
|
-
import net from 'net';
|
|
3
|
-
import os from 'os';
|
|
4
|
-
import fs from 'fs';
|
|
5
|
-
import path from 'path';
|
|
6
|
-
import axios from 'axios';
|
|
7
|
-
import { createLogger } from '../core/logger.js';
|
|
8
|
-
const log = createLogger('OpenClawClient');
|
|
9
|
-
const DEFAULT_GATEWAY_PORT = 18789;
|
|
10
|
-
function getRealHomeDir() {
|
|
11
|
-
const envHome = process.env.CLAW_SERVICE_HOME || process.env.USERPROFILE || process.env.HOME;
|
|
12
|
-
if (envHome && !envHome.includes('systemprofile')) {
|
|
13
|
-
return envHome;
|
|
14
|
-
}
|
|
15
|
-
const homeDir = os.homedir();
|
|
16
|
-
if (!homeDir.includes('systemprofile')) {
|
|
17
|
-
return homeDir;
|
|
18
|
-
}
|
|
19
|
-
const usersDir = 'C:\\Users';
|
|
20
|
-
if (fs.existsSync(usersDir)) {
|
|
21
|
-
const entries = fs.readdirSync(usersDir, { withFileTypes: true });
|
|
22
|
-
for (const entry of entries) {
|
|
23
|
-
if (entry.isDirectory() && !['Public', 'Default', 'All Users', 'Default User'].includes(entry.name)) {
|
|
24
|
-
const candidate = path.join(usersDir, entry.name);
|
|
25
|
-
if (fs.existsSync(path.join(candidate, '.openclaw'))) {
|
|
26
|
-
return candidate;
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
return homeDir;
|
|
32
|
-
}
|
|
33
|
-
function getOpenClawEnv(baseEnv = process.env) {
|
|
34
|
-
const realHome = getRealHomeDir();
|
|
35
|
-
const env = { ...baseEnv };
|
|
36
|
-
const systemHome = os.homedir();
|
|
37
|
-
env.USERPROFILE = realHome;
|
|
38
|
-
env.HOME = realHome;
|
|
39
|
-
if (process.platform === 'win32') {
|
|
40
|
-
const match = realHome.match(/^([A-Za-z]:)(.*)$/);
|
|
41
|
-
if (match) {
|
|
42
|
-
env.HOMEDRIVE = match[1];
|
|
43
|
-
env.HOMEPATH = match[2];
|
|
44
|
-
}
|
|
45
|
-
const fixPath = (originalPath) => {
|
|
46
|
-
if (!originalPath)
|
|
47
|
-
return null;
|
|
48
|
-
const lowerOriginal = originalPath.toLowerCase();
|
|
49
|
-
const lowerSystemHome = systemHome.toLowerCase();
|
|
50
|
-
if (lowerOriginal.includes(lowerSystemHome)) {
|
|
51
|
-
const idx = lowerOriginal.indexOf(lowerSystemHome);
|
|
52
|
-
return originalPath.substring(0, idx) + realHome + originalPath.substring(idx + systemHome.length);
|
|
53
|
-
}
|
|
54
|
-
return null;
|
|
55
|
-
};
|
|
56
|
-
if (baseEnv.APPDATA) {
|
|
57
|
-
const fixed = fixPath(baseEnv.APPDATA);
|
|
58
|
-
if (fixed)
|
|
59
|
-
env.APPDATA = fixed;
|
|
60
|
-
}
|
|
61
|
-
if (!env.APPDATA) {
|
|
62
|
-
env.APPDATA = path.join(realHome, 'AppData', 'Roaming');
|
|
63
|
-
}
|
|
64
|
-
if (baseEnv.LOCALAPPDATA) {
|
|
65
|
-
const fixed = fixPath(baseEnv.LOCALAPPDATA);
|
|
66
|
-
if (fixed)
|
|
67
|
-
env.LOCALAPPDATA = fixed;
|
|
68
|
-
}
|
|
69
|
-
if (!env.LOCALAPPDATA) {
|
|
70
|
-
env.LOCALAPPDATA = path.join(realHome, 'AppData', 'Local');
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
return env;
|
|
74
|
-
}
|
|
75
|
-
function getGatewayToken() {
|
|
76
|
-
const homeDir = getRealHomeDir();
|
|
77
|
-
const possibleFiles = [
|
|
78
|
-
path.join(homeDir, '.openclaw', 'openclaw.json'),
|
|
79
|
-
path.join(homeDir, '.openclaw', 'config.json'),
|
|
80
|
-
path.join(homeDir, '.openclaw', 'tools.json'),
|
|
81
|
-
path.join(homeDir, '.openclaw', 'settings.json'),
|
|
82
|
-
];
|
|
83
|
-
for (const filePath of possibleFiles) {
|
|
84
|
-
try {
|
|
85
|
-
if (fs.existsSync(filePath)) {
|
|
86
|
-
const content = fs.readFileSync(filePath, 'utf-8');
|
|
87
|
-
const config = JSON.parse(content);
|
|
88
|
-
const token = config.gatewayToken
|
|
89
|
-
|| config.gateway?.auth?.token
|
|
90
|
-
|| config.token
|
|
91
|
-
|| config.apiKey
|
|
92
|
-
|| config.api_key
|
|
93
|
-
|| config.password;
|
|
94
|
-
if (token)
|
|
95
|
-
return String(token);
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
catch {
|
|
99
|
-
// ignore
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
return null;
|
|
103
|
-
}
|
|
104
|
-
function checkPort(port) {
|
|
105
|
-
return new Promise((resolve) => {
|
|
106
|
-
const sock = new net.Socket();
|
|
107
|
-
sock.setTimeout(3000);
|
|
108
|
-
sock.once('connect', () => {
|
|
109
|
-
sock.destroy();
|
|
110
|
-
resolve(true);
|
|
111
|
-
});
|
|
112
|
-
sock.once('error', () => {
|
|
113
|
-
sock.destroy();
|
|
114
|
-
resolve(false);
|
|
115
|
-
});
|
|
116
|
-
sock.once('timeout', () => {
|
|
117
|
-
sock.destroy();
|
|
118
|
-
resolve(false);
|
|
119
|
-
});
|
|
120
|
-
sock.connect(port, '127.0.0.1');
|
|
121
|
-
});
|
|
122
|
-
}
|
|
123
|
-
function ensureChatCompletionsConfig() {
|
|
124
|
-
const realHome = getRealHomeDir();
|
|
125
|
-
const openclawDir = path.join(realHome, '.openclaw');
|
|
126
|
-
const configPath = path.join(openclawDir, 'openclaw.json');
|
|
127
|
-
let settings = {};
|
|
128
|
-
let existed = false;
|
|
129
|
-
try {
|
|
130
|
-
if (fs.existsSync(configPath)) {
|
|
131
|
-
const content = fs.readFileSync(configPath, 'utf-8');
|
|
132
|
-
settings = JSON.parse(content);
|
|
133
|
-
existed = true;
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
catch {
|
|
137
|
-
settings = {};
|
|
138
|
-
}
|
|
139
|
-
const gateway = settings.gateway || {};
|
|
140
|
-
const http = gateway.http || {};
|
|
141
|
-
const endpoints = http.endpoints || {};
|
|
142
|
-
const chatCompletions = endpoints.chatCompletions || {};
|
|
143
|
-
if (chatCompletions.enabled === true) {
|
|
144
|
-
log.info('openclaw.json 中 chatCompletions 已启用');
|
|
145
|
-
return;
|
|
146
|
-
}
|
|
147
|
-
endpoints.chatCompletions = { enabled: true };
|
|
148
|
-
http.endpoints = endpoints;
|
|
149
|
-
gateway.http = http;
|
|
150
|
-
settings.gateway = gateway;
|
|
151
|
-
try {
|
|
152
|
-
if (!fs.existsSync(openclawDir)) {
|
|
153
|
-
fs.mkdirSync(openclawDir, { recursive: true });
|
|
154
|
-
}
|
|
155
|
-
fs.writeFileSync(configPath, JSON.stringify(settings, null, 2), 'utf-8');
|
|
156
|
-
log.info(`已自动在 openclaw.json 中启用 chatCompletions (${existed ? '更新' : '新建'})`);
|
|
157
|
-
}
|
|
158
|
-
catch (err) {
|
|
159
|
-
log.warn({ err }, '写入 openclaw.json 失败');
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
function startOpenClawGateway() {
|
|
163
|
-
return new Promise((resolve) => {
|
|
164
|
-
ensureChatCompletionsConfig();
|
|
165
|
-
log.info('正在启动 OpenClaw gateway...');
|
|
166
|
-
const child = spawn('openclaw', ['gateway'], {
|
|
167
|
-
shell: true,
|
|
168
|
-
windowsHide: true,
|
|
169
|
-
detached: true,
|
|
170
|
-
stdio: 'ignore',
|
|
171
|
-
env: getOpenClawEnv(),
|
|
172
|
-
});
|
|
173
|
-
child.unref();
|
|
174
|
-
let attempts = 0;
|
|
175
|
-
const maxAttempts = 20;
|
|
176
|
-
const interval = setInterval(async () => {
|
|
177
|
-
attempts++;
|
|
178
|
-
const gatewayRunning = await checkPort(DEFAULT_GATEWAY_PORT);
|
|
179
|
-
if (gatewayRunning) {
|
|
180
|
-
clearInterval(interval);
|
|
181
|
-
log.info(`OpenClaw gateway 启动成功 (${DEFAULT_GATEWAY_PORT})`);
|
|
182
|
-
resolve(true);
|
|
183
|
-
}
|
|
184
|
-
else if (attempts >= maxAttempts) {
|
|
185
|
-
clearInterval(interval);
|
|
186
|
-
log.warn('OpenClaw gateway 启动超时');
|
|
187
|
-
resolve(false);
|
|
188
|
-
}
|
|
189
|
-
}, 1000);
|
|
190
|
-
child.on('error', (err) => {
|
|
191
|
-
log.error({ err }, '启动 gateway 失败');
|
|
192
|
-
clearInterval(interval);
|
|
193
|
-
resolve(false);
|
|
194
|
-
});
|
|
195
|
-
});
|
|
196
|
-
}
|
|
197
|
-
export class OpenClawClient {
|
|
198
|
-
constructor(gatewayUrl = `http://127.0.0.1:${DEFAULT_GATEWAY_PORT}`) {
|
|
199
|
-
this.gatewayStarting = false;
|
|
200
|
-
this.gatewayStarted = false;
|
|
201
|
-
this.gatewayUrl = gatewayUrl;
|
|
202
|
-
}
|
|
203
|
-
static async acquireSlot() {
|
|
204
|
-
if (OpenClawClient.runningCount < OpenClawClient.maxConcurrency) {
|
|
205
|
-
OpenClawClient.runningCount++;
|
|
206
|
-
return;
|
|
207
|
-
}
|
|
208
|
-
return new Promise((resolve) => OpenClawClient.waitQueue.push(resolve));
|
|
209
|
-
}
|
|
210
|
-
static releaseSlot() {
|
|
211
|
-
OpenClawClient.runningCount--;
|
|
212
|
-
if (OpenClawClient.waitQueue.length > 0) {
|
|
213
|
-
const next = OpenClawClient.waitQueue.shift();
|
|
214
|
-
OpenClawClient.runningCount++;
|
|
215
|
-
next?.();
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
async ensureGatewayRunning() {
|
|
219
|
-
const gatewayRunning = await checkPort(DEFAULT_GATEWAY_PORT);
|
|
220
|
-
if (gatewayRunning) {
|
|
221
|
-
this.gatewayStarted = true;
|
|
222
|
-
return true;
|
|
223
|
-
}
|
|
224
|
-
this.gatewayStarted = false;
|
|
225
|
-
if (this.gatewayStarting) {
|
|
226
|
-
for (let i = 0; i < 25; i++) {
|
|
227
|
-
await new Promise((r) => setTimeout(r, 1000));
|
|
228
|
-
if (await checkPort(DEFAULT_GATEWAY_PORT)) {
|
|
229
|
-
this.gatewayStarted = true;
|
|
230
|
-
return true;
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
return false;
|
|
234
|
-
}
|
|
235
|
-
this.gatewayStarting = true;
|
|
236
|
-
try {
|
|
237
|
-
const started = await startOpenClawGateway();
|
|
238
|
-
this.gatewayStarted = started;
|
|
239
|
-
return started;
|
|
240
|
-
}
|
|
241
|
-
finally {
|
|
242
|
-
this.gatewayStarting = false;
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
_getConversationHistory(fromUser) {
|
|
246
|
-
return OpenClawClient.conversationHistory.get(fromUser) || [];
|
|
247
|
-
}
|
|
248
|
-
_addToHistory(fromUser, role, content) {
|
|
249
|
-
let history = this._getConversationHistory(fromUser);
|
|
250
|
-
const truncated = content.length > OpenClawClient.maxMessageLength
|
|
251
|
-
? content.substring(0, OpenClawClient.maxMessageLength) + '...'
|
|
252
|
-
: content;
|
|
253
|
-
history.push({ role, content: truncated });
|
|
254
|
-
const maxMessages = OpenClawClient.maxHistoryRounds * 2;
|
|
255
|
-
if (history.length > maxMessages) {
|
|
256
|
-
history = history.slice(history.length - maxMessages);
|
|
257
|
-
}
|
|
258
|
-
OpenClawClient.conversationHistory.set(fromUser, history);
|
|
259
|
-
}
|
|
260
|
-
clearHistory(fromUser) {
|
|
261
|
-
OpenClawClient.conversationHistory.delete(fromUser);
|
|
262
|
-
}
|
|
263
|
-
_buildMessagesWithHistory(fromUser, currentMessage) {
|
|
264
|
-
const history = this._getConversationHistory(fromUser);
|
|
265
|
-
return [...history, { role: 'user', content: currentMessage }];
|
|
266
|
-
}
|
|
267
|
-
cancelActiveRequest(fromUser) {
|
|
268
|
-
const active = OpenClawClient.activeRequests.get(fromUser);
|
|
269
|
-
if (active) {
|
|
270
|
-
log.info({ fromUser }, '取消用户活跃请求');
|
|
271
|
-
active.abort();
|
|
272
|
-
OpenClawClient.activeRequests.delete(fromUser);
|
|
273
|
-
return true;
|
|
274
|
-
}
|
|
275
|
-
return false;
|
|
276
|
-
}
|
|
277
|
-
async chatStream(message, fromUser, onDelta, onDone, onError) {
|
|
278
|
-
if (!message || !message.trim()) {
|
|
279
|
-
onError?.(new Error('消息内容为空'));
|
|
280
|
-
return;
|
|
281
|
-
}
|
|
282
|
-
const gatewayReady = await this.ensureGatewayRunning();
|
|
283
|
-
if (!gatewayReady) {
|
|
284
|
-
const err = new Error('OpenClaw gateway 启动失败');
|
|
285
|
-
log.error(err.message);
|
|
286
|
-
onError?.(err);
|
|
287
|
-
return;
|
|
288
|
-
}
|
|
289
|
-
this.cancelActiveRequest(fromUser);
|
|
290
|
-
log.info({ fromUser }, '准备 SSE 流式调用 OpenClaw');
|
|
291
|
-
const gatewayToken = getGatewayToken();
|
|
292
|
-
const sessionId = `clawmessenger-${fromUser}`;
|
|
293
|
-
const messagesWithHistory = this._buildMessagesWithHistory(fromUser, message);
|
|
294
|
-
const endpoints = [
|
|
295
|
-
`${this.gatewayUrl}/v1/chat/completions`,
|
|
296
|
-
`${this.gatewayUrl}/v1/responses`,
|
|
297
|
-
];
|
|
298
|
-
for (let i = 0; i < endpoints.length; i++) {
|
|
299
|
-
const apiUrl = endpoints[i];
|
|
300
|
-
try {
|
|
301
|
-
const fullText = await this._doChatStream(apiUrl, gatewayToken, sessionId, fromUser, messagesWithHistory, onDelta);
|
|
302
|
-
this._addToHistory(fromUser, 'user', message);
|
|
303
|
-
this._addToHistory(fromUser, 'assistant', fullText);
|
|
304
|
-
return;
|
|
305
|
-
}
|
|
306
|
-
catch (err) {
|
|
307
|
-
if (err.name === 'AbortError' || err.message?.includes('aborted')) {
|
|
308
|
-
log.info({ fromUser }, '请求被用户取消');
|
|
309
|
-
return;
|
|
310
|
-
}
|
|
311
|
-
const is404 = err.response?.status === 404;
|
|
312
|
-
const isLast = i === endpoints.length - 1;
|
|
313
|
-
if (is404 && !isLast) {
|
|
314
|
-
log.warn(`SSE 端点 ${apiUrl} 返回 404,尝试备用端点`);
|
|
315
|
-
continue;
|
|
316
|
-
}
|
|
317
|
-
if (is404 && isLast) {
|
|
318
|
-
log.error('所有 SSE 端点均返回 404。OpenClaw responses 端点未启用。');
|
|
319
|
-
log.error('请检查 ~/.openclaw/openclaw.json 中是否包含: gateway.http.endpoints.responses.enabled = true');
|
|
320
|
-
}
|
|
321
|
-
else {
|
|
322
|
-
log.error(`SSE 请求失败: ${err.message}`);
|
|
323
|
-
}
|
|
324
|
-
throw err;
|
|
325
|
-
}
|
|
326
|
-
}
|
|
327
|
-
}
|
|
328
|
-
async _downloadImageAsBase64(imageUrl) {
|
|
329
|
-
const response = await axios.get(imageUrl, {
|
|
330
|
-
responseType: 'arraybuffer',
|
|
331
|
-
timeout: 30000,
|
|
332
|
-
maxContentLength: 10 * 1024 * 1024,
|
|
333
|
-
});
|
|
334
|
-
const buffer = Buffer.from(response.data);
|
|
335
|
-
const base64 = buffer.toString('base64');
|
|
336
|
-
const mediaType = response.headers['content-type'] || 'image/jpeg';
|
|
337
|
-
return { base64, mediaType };
|
|
338
|
-
}
|
|
339
|
-
async _doChatStream(apiUrl, gatewayToken, sessionId, fromUser, messages, onDelta) {
|
|
340
|
-
const headers = {
|
|
341
|
-
'Content-Type': 'application/json',
|
|
342
|
-
Accept: 'text/event-stream',
|
|
343
|
-
};
|
|
344
|
-
if (gatewayToken) {
|
|
345
|
-
headers.Authorization = `Bearer ${gatewayToken}`;
|
|
346
|
-
}
|
|
347
|
-
const lastMessage = messages[messages.length - 1];
|
|
348
|
-
const messageContent = lastMessage?.content || '';
|
|
349
|
-
const imageUrlMatch = messageContent.match(/\[图片\]\s*(https?:\/\/[^\s]+)/);
|
|
350
|
-
let payload;
|
|
351
|
-
if (imageUrlMatch) {
|
|
352
|
-
const imageUrl = imageUrlMatch[1];
|
|
353
|
-
const textContent = messageContent.replace(/\[图片\]\s*https?:\/\/[^\s]+/, '').trim();
|
|
354
|
-
try {
|
|
355
|
-
const imageData = await this._downloadImageAsBase64(imageUrl);
|
|
356
|
-
const messagesWithImage = messages.slice(0, -1).concat([{
|
|
357
|
-
role: 'user',
|
|
358
|
-
content: [
|
|
359
|
-
{ type: 'text', text: textContent || '' },
|
|
360
|
-
{
|
|
361
|
-
type: 'image_url',
|
|
362
|
-
image_url: { url: `data:${imageData.mediaType};base64,${imageData.base64}` },
|
|
363
|
-
},
|
|
364
|
-
],
|
|
365
|
-
}]);
|
|
366
|
-
payload = {
|
|
367
|
-
model: 'openclaw',
|
|
368
|
-
messages: messagesWithImage,
|
|
369
|
-
stream: true,
|
|
370
|
-
max_tokens: 2048,
|
|
371
|
-
};
|
|
372
|
-
}
|
|
373
|
-
catch (err) {
|
|
374
|
-
log.warn({ err: err.message }, '图片处理失败,回退到文本模式');
|
|
375
|
-
payload = {
|
|
376
|
-
model: 'openclaw',
|
|
377
|
-
messages,
|
|
378
|
-
stream: true,
|
|
379
|
-
max_tokens: 2048,
|
|
380
|
-
};
|
|
381
|
-
}
|
|
382
|
-
}
|
|
383
|
-
else {
|
|
384
|
-
payload = {
|
|
385
|
-
model: 'openclaw',
|
|
386
|
-
messages,
|
|
387
|
-
stream: true,
|
|
388
|
-
max_tokens: 2048,
|
|
389
|
-
};
|
|
390
|
-
}
|
|
391
|
-
log.info({ apiUrl, payloadSummary: JSON.stringify(payload).substring(0, 200) }, 'SSE 请求');
|
|
392
|
-
const abortController = new AbortController();
|
|
393
|
-
OpenClawClient.activeRequests.set(fromUser, abortController);
|
|
394
|
-
const response = await axios.post(apiUrl, payload, {
|
|
395
|
-
headers,
|
|
396
|
-
responseType: 'stream',
|
|
397
|
-
timeout: 600000,
|
|
398
|
-
signal: abortController.signal,
|
|
399
|
-
});
|
|
400
|
-
return new Promise((resolve, reject) => {
|
|
401
|
-
let fullText = '';
|
|
402
|
-
let buffer = '';
|
|
403
|
-
let lastChunkData = null;
|
|
404
|
-
let hasError = false;
|
|
405
|
-
let errorMsg = '';
|
|
406
|
-
response.data.on('data', (chunk) => {
|
|
407
|
-
buffer += chunk.toString();
|
|
408
|
-
const lines = buffer.split('\n');
|
|
409
|
-
buffer = lines.pop() || '';
|
|
410
|
-
for (const line of lines) {
|
|
411
|
-
const trimmed = line.trim();
|
|
412
|
-
if (!trimmed || !trimmed.startsWith('data: '))
|
|
413
|
-
continue;
|
|
414
|
-
const dataStr = trimmed.slice(6).trim();
|
|
415
|
-
if (dataStr === '[DONE]')
|
|
416
|
-
continue;
|
|
417
|
-
try {
|
|
418
|
-
const data = JSON.parse(dataStr);
|
|
419
|
-
lastChunkData = data;
|
|
420
|
-
if (data.error) {
|
|
421
|
-
hasError = true;
|
|
422
|
-
errorMsg = typeof data.error === 'string' ? data.error : data.error?.message || JSON.stringify(data.error);
|
|
423
|
-
log.error({ error: errorMsg }, 'SSE chunk error');
|
|
424
|
-
continue;
|
|
425
|
-
}
|
|
426
|
-
const choice = data.choices?.[0];
|
|
427
|
-
let delta = null;
|
|
428
|
-
if (choice) {
|
|
429
|
-
const deltaObj = choice.delta;
|
|
430
|
-
delta = deltaObj?.content
|
|
431
|
-
?? choice.message?.content
|
|
432
|
-
?? choice.text
|
|
433
|
-
?? deltaObj?.text
|
|
434
|
-
?? deltaObj?.reasoning_content
|
|
435
|
-
?? null;
|
|
436
|
-
}
|
|
437
|
-
if (delta === null || delta === undefined) {
|
|
438
|
-
delta = data.content ?? data.delta ?? data.text ?? null;
|
|
439
|
-
}
|
|
440
|
-
if (typeof delta === 'string' && delta.length > 0) {
|
|
441
|
-
fullText += delta;
|
|
442
|
-
Promise.resolve(onDelta(delta)).catch(reject);
|
|
443
|
-
}
|
|
444
|
-
}
|
|
445
|
-
catch {
|
|
446
|
-
// ignore parse error
|
|
447
|
-
}
|
|
448
|
-
}
|
|
449
|
-
});
|
|
450
|
-
response.data.on('end', async () => {
|
|
451
|
-
OpenClawClient.activeRequests.delete(fromUser);
|
|
452
|
-
log.info({ fullTextLength: fullText.length }, 'SSE 流结束');
|
|
453
|
-
if (hasError) {
|
|
454
|
-
reject(new Error(`OpenClaw SSE 错误: ${errorMsg}`));
|
|
455
|
-
return;
|
|
456
|
-
}
|
|
457
|
-
if (fullText.length === 0) {
|
|
458
|
-
const choices = lastChunkData?.choices;
|
|
459
|
-
const message = choices?.[0]?.message;
|
|
460
|
-
const lastContent = message?.content;
|
|
461
|
-
if (typeof lastContent === 'string' && lastContent.length > 0) {
|
|
462
|
-
fullText = lastContent;
|
|
463
|
-
}
|
|
464
|
-
}
|
|
465
|
-
if (fullText.length === 0) {
|
|
466
|
-
reject(new Error('OpenClaw SSE 返回空内容'));
|
|
467
|
-
return;
|
|
468
|
-
}
|
|
469
|
-
try {
|
|
470
|
-
await onDelta('');
|
|
471
|
-
resolve(fullText);
|
|
472
|
-
}
|
|
473
|
-
catch (err) {
|
|
474
|
-
reject(err);
|
|
475
|
-
}
|
|
476
|
-
});
|
|
477
|
-
response.data.on('error', (err) => {
|
|
478
|
-
OpenClawClient.activeRequests.delete(fromUser);
|
|
479
|
-
log.error({ err: err.message }, 'SSE 流错误');
|
|
480
|
-
reject(err);
|
|
481
|
-
});
|
|
482
|
-
});
|
|
483
|
-
}
|
|
484
|
-
}
|
|
485
|
-
OpenClawClient.maxConcurrency = 2;
|
|
486
|
-
OpenClawClient.runningCount = 0;
|
|
487
|
-
OpenClawClient.waitQueue = [];
|
|
488
|
-
OpenClawClient.sessionLocks = new Map();
|
|
489
|
-
OpenClawClient.conversationHistory = new Map();
|
|
490
|
-
OpenClawClient.maxHistoryRounds = 50;
|
|
491
|
-
OpenClawClient.maxMessageLength = 2000;
|
|
492
|
-
OpenClawClient.activeRequests = new Map();
|
|
493
|
-
export { getRealHomeDir, getOpenClawEnv, getGatewayToken, checkPort, ensureChatCompletionsConfig };
|
|
494
|
-
//# sourceMappingURL=client.js.map
|
|
1
|
+
const a0_0x3415ee=a0_0x2661;(function(_0x32bcf6,_0x3f54ba){const _0x28a0b9=a0_0x2661,_0x1a4bcb=_0x32bcf6();while(!![]){try{const _0x441f53=-parseInt(_0x28a0b9(0x1d0))/0x1*(-parseInt(_0x28a0b9(0x196))/0x2)+parseInt(_0x28a0b9(0x24f))/0x3+parseInt(_0x28a0b9(0x235))/0x4*(-parseInt(_0x28a0b9(0x1e8))/0x5)+-parseInt(_0x28a0b9(0x18c))/0x6+-parseInt(_0x28a0b9(0x214))/0x7*(parseInt(_0x28a0b9(0x236))/0x8)+-parseInt(_0x28a0b9(0x1e3))/0x9+parseInt(_0x28a0b9(0x1ce))/0xa*(parseInt(_0x28a0b9(0x206))/0xb);if(_0x441f53===_0x3f54ba)break;else _0x1a4bcb['push'](_0x1a4bcb['shift']());}catch(_0x10e1c2){_0x1a4bcb['push'](_0x1a4bcb['shift']());}}}(a0_0xc6e7,0xa0a09));import{spawn}from'child_process';import a0_0x5d9274 from'net';import a0_0x5a68bf from'os';import a0_0x49986b from'fs';import a0_0x47e01d from'path';import a0_0x35c6fa from'axios';import{createLogger}from'../core/logger.js';const log=createLogger('OpenClawClient'),DEFAULT_GATEWAY_PORT=0x4965;function getRealHomeDir(){const _0x48fbc7=a0_0x2661,_0x4b7fcb={'ueeAl':function(_0x597059,_0x5c547c){return _0x597059(_0x5c547c);},'rbhMg':'systemprofile','WyKMz':function(_0x4dbaa1,_0x32f77a){return _0x4dbaa1!==_0x32f77a;},'ohsbe':_0x48fbc7(0x260),'KaEik':_0x48fbc7(0x19a),'vqPqB':_0x48fbc7(0x1a0),'umoyi':function(_0x3e2351,_0x440501){return _0x3e2351===_0x440501;},'DmZwo':_0x48fbc7(0x1da),'CWyKD':_0x48fbc7(0x16e),'NQrmJ':_0x48fbc7(0x178),'jIgDM':_0x48fbc7(0x1ee),'zSvmR':_0x48fbc7(0x17b),'VaBxp':_0x48fbc7(0x1ba),'HblRf':_0x48fbc7(0x265),'EJXNN':_0x48fbc7(0x221),'ITbvF':'LPCer','etttF':function(_0x5f09e1,_0x50dbb0){return _0x5f09e1===_0x50dbb0;},'FjgrH':_0x48fbc7(0x1f9)},_0x253e73=process.env.CLAW_SERVICE_HOME||process.env.USERPROFILE||process.env.HOME;if(_0x253e73&&!_0x253e73[_0x48fbc7(0x25a)](_0x4b7fcb[_0x48fbc7(0x1c8)]))return _0x253e73;const _0x39f2c5=a0_0x5a68bf['homedir']();if(!_0x39f2c5[_0x48fbc7(0x25a)](_0x48fbc7(0x187))){if(_0x4b7fcb[_0x48fbc7(0x190)](_0x4b7fcb[_0x48fbc7(0x1ec)],_0x4b7fcb[_0x48fbc7(0x1cf)]))return _0x39f2c5;else _0x8e939d=_0x329385;}const _0x12e631=_0x4b7fcb[_0x48fbc7(0x1f1)];if(a0_0x49986b[_0x48fbc7(0x242)](_0x12e631)){if(_0x4b7fcb['umoyi'](_0x4b7fcb[_0x48fbc7(0x282)],_0x4b7fcb[_0x48fbc7(0x1ac)]))return this['gatewayStarted']=!![],!![];else{const _0x5a683d=a0_0x49986b['readdirSync'](_0x12e631,{'withFileTypes':!![]});for(const _0x507483 of _0x5a683d){if(_0x4b7fcb['WyKMz'](_0x4b7fcb['NQrmJ'],_0x4b7fcb[_0x48fbc7(0x158)])){if(_0x507483['isDirectory']()&&![_0x4b7fcb[_0x48fbc7(0x1e0)],_0x4b7fcb[_0x48fbc7(0x21d)],_0x4b7fcb['HblRf'],_0x4b7fcb['EJXNN']]['includes'](_0x507483[_0x48fbc7(0x20f)])){if(_0x4b7fcb[_0x48fbc7(0x190)](_0x4b7fcb[_0x48fbc7(0x295)],_0x4b7fcb['ITbvF'])){if(_0x315b8a[_0x48fbc7(0x17f)]<_0x52b8c1[_0x48fbc7(0x1ff)]){_0x34cd98[_0x48fbc7(0x17f)]++;return;}return new _0x5bb204(_0x36b666=>_0x514392[_0x48fbc7(0x1d9)][_0x48fbc7(0x16f)](_0x36b666));}else{const _0x31a3ad=a0_0x47e01d[_0x48fbc7(0x1d1)](_0x12e631,_0x507483[_0x48fbc7(0x20f)]);if(a0_0x49986b['existsSync'](a0_0x47e01d[_0x48fbc7(0x1d1)](_0x31a3ad,'.openclaw'))){if(_0x4b7fcb[_0x48fbc7(0x241)](_0x4b7fcb[_0x48fbc7(0x21b)],_0x48fbc7(0x208)))_0x24a7be[_0x48fbc7(0x1d5)]=_0x7dfbe[0x1],_0x45c188[_0x48fbc7(0x216)]=_0x2fe83a[0x2];else return _0x31a3ad;}}}}else{_0x4b7fcb['ueeAl'](_0x433f68,new _0x57bf94(_0x48fbc7(0x286)+_0x391b93));return;}}}}return _0x39f2c5;}function getOpenClawEnv(_0xbc78ef=process.env){const _0x1a0fe3=a0_0x2661,_0x10695c={'Lzyjt':_0x1a0fe3(0x1a4),'OcTBm':function(_0x1e2d22,_0x7fd6f0){return _0x1e2d22!==_0x7fd6f0;},'JgnXI':_0x1a0fe3(0x27c),'FavjC':function(_0x5d0662,_0x19fc53){return _0x5d0662+_0x19fc53;},'xIrZS':function(_0x285b62,_0x4a4d97){return _0x285b62+_0x4a4d97;},'XKQVV':function(_0x111d0f){return _0x111d0f();},'rDuLv':function(_0x154b04,_0x536985){return _0x154b04===_0x536985;},'WyrqJ':_0x1a0fe3(0x19b),'csMpa':function(_0x5fad13,_0x24f4cc){return _0x5fad13(_0x24f4cc);},'qHTYX':_0x1a0fe3(0x22d),'Xytbq':_0x1a0fe3(0x181),'MJnAs':function(_0x587556,_0x4874e2){return _0x587556(_0x4874e2);},'qigGS':'Local'},_0x1a23c1=_0x10695c[_0x1a0fe3(0x166)](getRealHomeDir),_0x55139b={..._0xbc78ef},_0x54af0b=a0_0x5a68bf['homedir']();_0x55139b[_0x1a0fe3(0x296)]=_0x1a23c1,_0x55139b[_0x1a0fe3(0x259)]=_0x1a23c1;if(_0x10695c[_0x1a0fe3(0x28e)](process[_0x1a0fe3(0x170)],_0x10695c[_0x1a0fe3(0x203)])){const _0x1412c5=_0x1a23c1[_0x1a0fe3(0x194)](/^([A-Za-z]:)(.*)$/);_0x1412c5&&(_0x55139b[_0x1a0fe3(0x1d5)]=_0x1412c5[0x1],_0x55139b[_0x1a0fe3(0x216)]=_0x1412c5[0x2]);const _0x2711ff=_0xaca32e=>{const _0x1080f7=_0x1a0fe3,_0x441a0f={'bILEl':_0x10695c[_0x1080f7(0x245)]};if(_0x10695c[_0x1080f7(0x1e2)](_0x10695c['JgnXI'],_0x1080f7(0x27c)))!_0x1a3a01[_0x1080f7(0x242)](_0x384487)&&_0x31f87c['mkdirSync'](_0x52ad0f,{'recursive':!![]}),_0x27fb97['writeFileSync'](_0x2a4c0b,_0x5ce853[_0x1080f7(0x19c)](_0x36f26a,null,0x2),_0x441a0f[_0x1080f7(0x21f)]),_0x3b1086['info']('已自动在\x20openclaw.json\x20中启用\x20chatCompletions\x20('+(_0x2f4a7b?'更新':'新建')+')');else{if(!_0xaca32e)return null;const _0x75f9c2=_0xaca32e[_0x1080f7(0x1a7)](),_0x5dd995=_0x54af0b['toLowerCase']();if(_0x75f9c2[_0x1080f7(0x25a)](_0x5dd995)){const _0x4e778c=_0x75f9c2[_0x1080f7(0x1e4)](_0x5dd995);return _0x10695c['FavjC'](_0x10695c['FavjC'](_0xaca32e[_0x1080f7(0x1fe)](0x0,_0x4e778c),_0x1a23c1),_0xaca32e['substring'](_0x10695c['xIrZS'](_0x4e778c,_0x54af0b['length'])));}return null;}};if(_0xbc78ef[_0x1a0fe3(0x257)]){const _0x53c48d=_0x10695c[_0x1a0fe3(0x234)](_0x2711ff,_0xbc78ef[_0x1a0fe3(0x257)]);if(_0x53c48d)_0x55139b[_0x1a0fe3(0x257)]=_0x53c48d;}!_0x55139b[_0x1a0fe3(0x257)]&&(_0x55139b[_0x1a0fe3(0x257)]=a0_0x47e01d[_0x1a0fe3(0x1d1)](_0x1a23c1,_0x10695c[_0x1a0fe3(0x1bf)],_0x10695c['Xytbq']));if(_0xbc78ef['LOCALAPPDATA']){const _0x5c0770=_0x10695c['MJnAs'](_0x2711ff,_0xbc78ef['LOCALAPPDATA']);if(_0x5c0770)_0x55139b['LOCALAPPDATA']=_0x5c0770;}!_0x55139b[_0x1a0fe3(0x1b7)]&&(_0x55139b[_0x1a0fe3(0x1b7)]=a0_0x47e01d[_0x1a0fe3(0x1d1)](_0x1a23c1,_0x10695c['qHTYX'],_0x10695c[_0x1a0fe3(0x1e9)]));}return _0x55139b;}function getGatewayToken(){const _0xf2af9=a0_0x2661,_0x236844={'KkYbK':function(_0x4d5be5){return _0x4d5be5();},'RhynU':'openclaw.json','NmlFv':_0xf2af9(0x1e7),'asdvb':'tools.json','xTDOG':function(_0x43eb35,_0x4bb050){return _0x43eb35===_0x4bb050;},'JdFsD':'ZrbfP','uWYfM':_0xf2af9(0x1a4)},_0x4eb15a=_0x236844[_0xf2af9(0x21c)](getRealHomeDir),_0x5246e2=[a0_0x47e01d['join'](_0x4eb15a,_0xf2af9(0x1e7),_0x236844[_0xf2af9(0x248)]),a0_0x47e01d[_0xf2af9(0x1d1)](_0x4eb15a,_0x236844[_0xf2af9(0x162)],_0xf2af9(0x298)),a0_0x47e01d[_0xf2af9(0x1d1)](_0x4eb15a,_0x236844['NmlFv'],_0x236844[_0xf2af9(0x28d)]),a0_0x47e01d[_0xf2af9(0x1d1)](_0x4eb15a,_0x236844[_0xf2af9(0x162)],_0xf2af9(0x22a))];for(const _0x20978c of _0x5246e2){try{if(a0_0x49986b[_0xf2af9(0x242)](_0x20978c)){if(_0x236844[_0xf2af9(0x207)](_0x236844[_0xf2af9(0x261)],_0xf2af9(0x157))){const _0x176a57=a0_0x49986b[_0xf2af9(0x243)](_0x20978c,_0x236844['uWYfM']),_0x3f6129=JSON[_0xf2af9(0x1bd)](_0x176a57),_0x54a244=_0x3f6129['gatewayToken']||_0x3f6129[_0xf2af9(0x1cb)]?.[_0xf2af9(0x1b4)]?.[_0xf2af9(0x27b)]||_0x3f6129[_0xf2af9(0x27b)]||_0x3f6129[_0xf2af9(0x174)]||_0x3f6129[_0xf2af9(0x182)]||_0x3f6129[_0xf2af9(0x1fc)];if(_0x54a244)return String(_0x54a244);}else _0x41e7e0[_0xf2af9(0x1ea)]=_0xf2af9(0x1c4)+_0x57ee48;}}catch{}}return null;}function checkPort(_0x1d619f){const _0x23317a=a0_0x2661,_0x446352={'wovHB':function(_0x3ba431,_0x42e508){return _0x3ba431(_0x42e508);},'xXFxD':function(_0x152ca4,_0x583469){return _0x152ca4(_0x583469);},'nHDQb':function(_0x274b3b,_0x3c94a1){return _0x274b3b!==_0x3c94a1;},'nVLhD':_0x23317a(0x277),'INGWG':_0x23317a(0x1df),'eHgqa':_0x23317a(0x280),'ZwJTM':_0x23317a(0x200),'SmZjX':'timeout'};return new Promise(_0x23ec2d=>{const _0x454c67=_0x23317a,_0xab4254={'jTvzc':function(_0x23d005,_0x121b40){const _0x3064f2=a0_0x2661;return _0x446352[_0x3064f2(0x172)](_0x23d005,_0x121b40);}};if(_0x446352[_0x454c67(0x1eb)](_0x446352[_0x454c67(0x22c)],_0x446352[_0x454c67(0x1ed)])){const _0x962377=new a0_0x5d9274[(_0x454c67(0x16b))]();_0x962377[_0x454c67(0x191)](0xbb8),_0x962377['once'](_0x446352['eHgqa'],()=>{const _0x1d9a31=_0x454c67;_0x962377[_0x1d9a31(0x28f)](),_0x446352['wovHB'](_0x23ec2d,!![]);}),_0x962377[_0x454c67(0x240)](_0x446352[_0x454c67(0x1a9)],()=>{const _0x1fb1bf=_0x454c67;_0x962377['destroy'](),_0xab4254[_0x1fb1bf(0x26b)](_0x23ec2d,![]);}),_0x962377[_0x454c67(0x240)](_0x446352['SmZjX'],()=>{const _0x4431af=_0x454c67;_0x962377[_0x4431af(0x28f)](),_0x23ec2d(![]);}),_0x962377[_0x454c67(0x280)](_0x1d619f,_0x454c67(0x197));}else return _0x2c42da;});}function ensureChatCompletionsConfig(){const _0x5e86d7=a0_0x2661,_0x555cee={'gZIIN':function(_0x28df6c){return _0x28df6c();},'sldIu':'.openclaw','SixoO':_0x5e86d7(0x16c),'mwtNR':function(_0x2f71d5,_0x10326f){return _0x2f71d5===_0x10326f;},'TgBFW':_0x5e86d7(0x284),'TCYpA':'utf-8','VASLI':'写入\x20openclaw.json\x20失败'},_0x5eea4b=_0x555cee['gZIIN'](getRealHomeDir),_0x5bce81=a0_0x47e01d[_0x5e86d7(0x1d1)](_0x5eea4b,_0x555cee['sldIu']),_0x1e7c7f=a0_0x47e01d[_0x5e86d7(0x1d1)](_0x5bce81,_0x555cee[_0x5e86d7(0x1d7)]);let _0x255d26={},_0x405a39=![];try{if(a0_0x49986b['existsSync'](_0x1e7c7f)){const _0xa796=a0_0x49986b[_0x5e86d7(0x243)](_0x1e7c7f,'utf-8');_0x255d26=JSON['parse'](_0xa796),_0x405a39=!![];}}catch{_0x255d26={};}const _0x30d5ab=_0x255d26[_0x5e86d7(0x1cb)]||{},_0xfb739e=_0x30d5ab[_0x5e86d7(0x167)]||{},_0x1a0873=_0xfb739e['endpoints']||{},_0x17e30f=_0x1a0873[_0x5e86d7(0x1e6)]||{};if(_0x555cee[_0x5e86d7(0x294)](_0x17e30f[_0x5e86d7(0x249)],!![])){log[_0x5e86d7(0x219)](_0x555cee[_0x5e86d7(0x1b9)]);return;}_0x1a0873[_0x5e86d7(0x1e6)]={'enabled':!![]},_0xfb739e[_0x5e86d7(0x1fa)]=_0x1a0873,_0x30d5ab['http']=_0xfb739e,_0x255d26['gateway']=_0x30d5ab;try{!a0_0x49986b[_0x5e86d7(0x242)](_0x5bce81)&&a0_0x49986b[_0x5e86d7(0x1b8)](_0x5bce81,{'recursive':!![]}),a0_0x49986b['writeFileSync'](_0x1e7c7f,JSON[_0x5e86d7(0x19c)](_0x255d26,null,0x2),_0x555cee[_0x5e86d7(0x251)]),log[_0x5e86d7(0x219)](_0x5e86d7(0x285)+(_0x405a39?'更新':'新建')+')');}catch(_0x4eb3d2){log[_0x5e86d7(0x1b1)]({'err':_0x4eb3d2},_0x555cee['VASLI']);}}function startOpenClawGateway(){const _0x175c34=a0_0x2661,_0x56385f={'Kpcej':function(_0xbc9832,_0x2071db){return _0xbc9832(_0x2071db);},'jDyoQ':function(_0x137b1a,_0x1d56a2){return _0x137b1a(_0x1d56a2);},'eOyRn':function(_0x5a1b01,_0x276c03){return _0x5a1b01>=_0x276c03;},'nTLuR':function(_0x36f7a5,_0x275d71){return _0x36f7a5!==_0x275d71;},'FXMYf':_0x175c34(0x210),'PWfTb':function(_0x421dc6,_0x1d045f){return _0x421dc6(_0x1d045f);},'Nwddc':_0x175c34(0x269),'YEFPY':function(_0x501cc1,_0x1b65a5){return _0x501cc1(_0x1b65a5);},'UuxiC':'正在启动\x20OpenClaw\x20gateway...','XxmBY':function(_0x124309,_0x3b742d,_0x59c797,_0x222506){return _0x124309(_0x3b742d,_0x59c797,_0x222506);},'BhLpe':_0x175c34(0x231),'hubKB':_0x175c34(0x1cb),'aKwkS':_0x175c34(0x1c0),'TQYxM':function(_0x503404,_0x3a6ae0,_0x5941fe){return _0x503404(_0x3a6ae0,_0x5941fe);},'qGboM':'error'};return new Promise(_0x3b74b0=>{const _0x44194a=_0x175c34,_0x391cd7={'iXcCj':_0x44194a(0x213),'GkBKc':function(_0x2bd9d7,_0x194bfa){return _0x2bd9d7(_0x194bfa);}};ensureChatCompletionsConfig(),log['info'](_0x56385f[_0x44194a(0x17d)]);const _0x54827a=_0x56385f[_0x44194a(0x27e)](spawn,_0x56385f[_0x44194a(0x237)],[_0x56385f['hubKB']],{'shell':!![],'windowsHide':!![],'detached':!![],'stdio':_0x56385f[_0x44194a(0x1dd)],'env':getOpenClawEnv()});_0x54827a[_0x44194a(0x193)]();let _0x58c025=0x0;const _0x5e44c7=0x14,_0x2c74a3=_0x56385f[_0x44194a(0x23c)](setInterval,async()=>{const _0xfc0924=_0x44194a,_0x183a17={'cSyoN':function(_0x23b4f8,_0x5756fc){return _0x56385f['Kpcej'](_0x23b4f8,_0x5756fc);}};_0x58c025++;const _0x180243=await _0x56385f[_0xfc0924(0x218)](checkPort,DEFAULT_GATEWAY_PORT);if(_0x180243)_0x56385f[_0xfc0924(0x218)](clearInterval,_0x2c74a3),log['info'](_0xfc0924(0x1f4)+DEFAULT_GATEWAY_PORT+')'),_0x56385f[_0xfc0924(0x15d)](_0x3b74b0,!![]);else{if(_0x56385f['eOyRn'](_0x58c025,_0x5e44c7)){if(_0x56385f[_0xfc0924(0x175)](_0x56385f[_0xfc0924(0x223)],'AJuId'))_0x56385f[_0xfc0924(0x177)](clearInterval,_0x2c74a3),log['warn'](_0x56385f['Nwddc']),_0x56385f['YEFPY'](_0x3b74b0,![]);else{const _0x4e2125=eHeqye[_0xfc0924(0x25e)](_0x2a60fd,_0x57abe9[_0xfc0924(0x1b7)]);if(_0x4e2125)_0x1c3032[_0xfc0924(0x1b7)]=_0x4e2125;}}}},0x3e8);_0x54827a['on'](_0x56385f[_0x44194a(0x1b5)],_0x1ba29b=>{const _0x1fbd54=_0x44194a;log[_0x1fbd54(0x200)]({'err':_0x1ba29b},_0x391cd7[_0x1fbd54(0x199)]),_0x391cd7['GkBKc'](clearInterval,_0x2c74a3),_0x391cd7[_0x1fbd54(0x205)](_0x3b74b0,![]);});});}export class OpenClawClient{constructor(_0x32f34d=a0_0x3415ee(0x1f2)+DEFAULT_GATEWAY_PORT){const _0x15a552=a0_0x3415ee;this[_0x15a552(0x1f8)]=![],this[_0x15a552(0x1a6)]=![],this[_0x15a552(0x222)]=_0x32f34d;}static async[a0_0x3415ee(0x1bc)](){const _0x230c4d=a0_0x3415ee,_0x21f5ae={'MMAaj':function(_0x41744b,_0x2d47be){return _0x41744b<_0x2d47be;}};if(_0x21f5ae[_0x230c4d(0x232)](OpenClawClient[_0x230c4d(0x17f)],OpenClawClient['maxConcurrency'])){OpenClawClient['runningCount']++;return;}return new Promise(_0x298680=>OpenClawClient[_0x230c4d(0x1d9)][_0x230c4d(0x16f)](_0x298680));}static[a0_0x3415ee(0x24b)](){const _0x56b683=a0_0x3415ee,_0x22b538={'LFWtu':function(_0x3941a2,_0x22017f){return _0x3941a2>_0x22017f;},'qtMYD':function(_0x1a50a4,_0x5e06d9){return _0x1a50a4===_0x5e06d9;},'RHkbF':_0x56b683(0x1c1)};OpenClawClient[_0x56b683(0x17f)]--;if(_0x22b538[_0x56b683(0x26a)](OpenClawClient[_0x56b683(0x1d9)][_0x56b683(0x1c2)],0x0)){if(_0x22b538[_0x56b683(0x1b6)](_0x22b538[_0x56b683(0x159)],_0x22b538[_0x56b683(0x159)])){const _0x28c141=OpenClawClient[_0x56b683(0x1d9)]['shift']();OpenClawClient[_0x56b683(0x17f)]++,_0x28c141?.();}else _0x4c49b8[_0x56b683(0x200)](_0x56b683(0x246)+_0x43bd70[_0x56b683(0x254)]);}}async[a0_0x3415ee(0x1a5)](){const _0x4b6716=a0_0x3415ee,_0x969692={'eQEsG':function(_0x55c682,_0x23d5b3){return _0x55c682+_0x23d5b3;},'KZYYJ':function(_0xc1d3f1,_0x1d75e4){return _0xc1d3f1+_0x1d75e4;},'qyzZJ':function(_0x1ec683,_0x514e97){return _0x1ec683>_0x514e97;},'ykuLr':function(_0x157877){return _0x157877?.();},'dGWQO':_0x4b6716(0x1a4),'ihIJL':function(_0x47d8db,_0x3a3791){return _0x47d8db(_0x3a3791);},'WdOlj':'sbSGQ','yCpEx':_0x4b6716(0x163),'MqAEh':function(_0x1f7f0b,_0x477119){return _0x1f7f0b!==_0x477119;},'sWySm':_0x4b6716(0x264),'CouJL':function(_0x52eca5,_0x3b2ef2){return _0x52eca5<_0x3b2ef2;},'LaIxU':function(_0x55dd32,_0x35a687){return _0x55dd32(_0x35a687);},'QObmZ':function(_0x20acef,_0x320d66){return _0x20acef===_0x320d66;},'pJxNm':_0x4b6716(0x1ae),'gSCwu':_0x4b6716(0x26c),'AqeKn':_0x4b6716(0x1c3),'Xomdv':'kLJBr'},_0x321da9=await _0x969692[_0x4b6716(0x266)](checkPort,DEFAULT_GATEWAY_PORT);if(_0x321da9){if(_0x969692[_0x4b6716(0x161)]===_0x969692[_0x4b6716(0x258)]){if(!_0x3d361e)return null;const _0x2228ba=_0x3b027f[_0x4b6716(0x1a7)](),_0xd438ce=_0x5596d7[_0x4b6716(0x1a7)]();if(_0x2228ba['includes'](_0xd438ce)){const _0x72e395=_0x2228ba[_0x4b6716(0x1e4)](_0xd438ce);return LHLBvY[_0x4b6716(0x25b)](_0x2897f8[_0x4b6716(0x1fe)](0x0,_0x72e395)+_0xb01650,_0x485666['substring'](LHLBvY['KZYYJ'](_0x72e395,_0x12bf36['length'])));}return null;}else return this['gatewayStarted']=!![],!![];}this[_0x4b6716(0x1a6)]=![];if(this[_0x4b6716(0x1f8)]){if(_0x969692[_0x4b6716(0x1d4)](_0x969692[_0x4b6716(0x1b2)],_0x969692[_0x4b6716(0x1b2)]))return _0x18c561[_0x4b6716(0x1d3)][_0x4b6716(0x274)](_0x4f6d25)||[];else{for(let _0x30dd26=0x0;_0x969692[_0x4b6716(0x28b)](_0x30dd26,0x19);_0x30dd26++){await new Promise(_0x5ed3d8=>setTimeout(_0x5ed3d8,0x3e8));if(await _0x969692[_0x4b6716(0x27a)](checkPort,DEFAULT_GATEWAY_PORT))return _0x969692['QObmZ'](_0x969692[_0x4b6716(0x1ab)],'kQngU')?(this[_0x4b6716(0x1a6)]=!![],!![]):(this[_0x4b6716(0x1a6)]=!![],!![]);}return![];}}this[_0x4b6716(0x1f8)]=!![];try{if(_0x969692[_0x4b6716(0x1c9)](_0x4b6716(0x165),_0x969692[_0x4b6716(0x25c)])){_0x47b7c0['runningCount']--;if(LHLBvY[_0x4b6716(0x1bb)](_0x26cb31['waitQueue'][_0x4b6716(0x1c2)],0x0)){const _0x28f7b4=_0x466503[_0x4b6716(0x1d9)]['shift']();_0x5ea100[_0x4b6716(0x17f)]++,LHLBvY[_0x4b6716(0x244)](_0x28f7b4);}}else{const _0x491233=await startOpenClawGateway();return this[_0x4b6716(0x1a6)]=_0x491233,_0x491233;}}finally{if(_0x969692[_0x4b6716(0x18d)]===_0x969692[_0x4b6716(0x15f)]){const _0x12b9e0=_0x2a9b8d[_0x4b6716(0x243)](_0xd6e003,LHLBvY['dGWQO']);_0xc66739=_0x23b575[_0x4b6716(0x1bd)](_0x12b9e0),_0x11120a=!![];}else this['gatewayStarting']=![];}}['_getConversationHistory'](_0x30d7c3){const _0x1aed7a=a0_0x3415ee;return OpenClawClient['conversationHistory'][_0x1aed7a(0x274)](_0x30d7c3)||[];}[a0_0x3415ee(0x15c)](_0x230b47,_0x5792c4,_0x396ff7){const _0x2913e4=a0_0x3415ee,_0x167c88={'OUYJH':_0x2913e4(0x1a4),'ngSdj':function(_0x1be0b2,_0x200ff1){return _0x1be0b2(_0x200ff1);},'wMfBb':function(_0xa5f636,_0xc24c57){return _0xa5f636+_0xc24c57;},'hpelG':_0x2913e4(0x168),'wtxXD':function(_0x3e2a3e,_0x888e11){return _0x3e2a3e*_0x888e11;},'LTtBl':function(_0x367664,_0x2f480a){return _0x367664>_0x2f480a;},'VlvUQ':_0x2913e4(0x1af),'tefSz':function(_0xb333c1,_0x1c67d6){return _0xb333c1-_0x1c67d6;}};let _0x5122cc=this['_getConversationHistory'](_0x230b47);const _0x38ba23=_0x396ff7[_0x2913e4(0x1c2)]>OpenClawClient[_0x2913e4(0x16d)]?_0x167c88[_0x2913e4(0x1fd)](_0x396ff7[_0x2913e4(0x1fe)](0x0,OpenClawClient['maxMessageLength']),_0x167c88[_0x2913e4(0x19e)]):_0x396ff7;_0x5122cc['push']({'role':_0x5792c4,'content':_0x38ba23});const _0x53388e=_0x167c88['wtxXD'](OpenClawClient['maxHistoryRounds'],0x2);if(_0x167c88[_0x2913e4(0x16a)](_0x5122cc[_0x2913e4(0x1c2)],_0x53388e)){if('abLHS'===_0x167c88[_0x2913e4(0x18b)])_0x5122cc=_0x5122cc[_0x2913e4(0x198)](_0x167c88[_0x2913e4(0x273)](_0x5122cc['length'],_0x53388e));else try{if(_0x2d35bd[_0x2913e4(0x242)](_0x3c3a4f)){const _0x51b5a2=_0x2411fd[_0x2913e4(0x243)](_0xdd154a,YeiaNE['OUYJH']),_0x1e1f9b=_0xdf853d['parse'](_0x51b5a2),_0x4d8d07=_0x1e1f9b['gatewayToken']||_0x1e1f9b[_0x2913e4(0x1cb)]?.[_0x2913e4(0x1b4)]?.['token']||_0x1e1f9b[_0x2913e4(0x27b)]||_0x1e1f9b[_0x2913e4(0x174)]||_0x1e1f9b['api_key']||_0x1e1f9b[_0x2913e4(0x1fc)];if(_0x4d8d07)return YeiaNE[_0x2913e4(0x22b)](_0x54dd80,_0x4d8d07);}}catch{}}OpenClawClient[_0x2913e4(0x1d3)][_0x2913e4(0x1dc)](_0x230b47,_0x5122cc);}[a0_0x3415ee(0x27d)](_0x73bf5a){const _0x1ac189=a0_0x3415ee;OpenClawClient['conversationHistory'][_0x1ac189(0x211)](_0x73bf5a);}[a0_0x3415ee(0x21a)](_0x253a83,_0x5c4ee3){const _0x4ad4f6=a0_0x3415ee,_0x1e3096=this[_0x4ad4f6(0x1f6)](_0x253a83);return[..._0x1e3096,{'role':_0x4ad4f6(0x276),'content':_0x5c4ee3}];}['cancelActiveRequest'](_0x3701b3){const _0x3a4b33=a0_0x3415ee,_0x3850c2={'EIcpb':function(_0x176300,_0xc23119){return _0x176300(_0xc23119);},'CTYTJ':function(_0x1af6c1,_0x32bbd8){return _0x1af6c1===_0x32bbd8;},'xjRyq':_0x3a4b33(0x227),'RBxuk':'SnEWr'},_0x5a1e4e=OpenClawClient[_0x3a4b33(0x15e)][_0x3a4b33(0x274)](_0x3701b3);if(_0x5a1e4e){if(_0x3850c2[_0x3a4b33(0x1be)](_0x3850c2[_0x3a4b33(0x293)],_0x3850c2['RBxuk'])){const _0x5e3781=ckOctn[_0x3a4b33(0x1a8)](_0x4209b1,_0x531a31[_0x3a4b33(0x257)]);if(_0x5e3781)_0x424b11[_0x3a4b33(0x257)]=_0x5e3781;}else return log[_0x3a4b33(0x219)]({'fromUser':_0x3701b3},_0x3a4b33(0x23f)),_0x5a1e4e[_0x3a4b33(0x160)](),OpenClawClient[_0x3a4b33(0x15e)][_0x3a4b33(0x211)](_0x3701b3),!![];}return![];}async[a0_0x3415ee(0x20b)](_0x4603ce,_0x52912b,_0x4bc090,_0x295503,_0x470397){const _0x416e14=a0_0x3415ee,_0x124a84={'rBHIe':_0x416e14(0x269),'FEmyq':function(_0x34346b,_0x80ab2a){return _0x34346b>_0x80ab2a;},'gwaua':function(_0x579af4,_0x39092c){return _0x579af4+_0x39092c;},'hrabP':_0x416e14(0x168),'YIXRM':function(_0x20729d,_0x42c866){return _0x20729d*_0x42c866;},'JXzDd':function(_0x31e84a,_0xa5806a){return _0x31e84a>_0xa5806a;},'WkYkU':function(_0x14a6b4,_0x76924){return _0x14a6b4-_0x76924;},'htbJb':function(_0x575253,_0x1453bc){return _0x575253===_0x1453bc;},'NAhdZ':_0x416e14(0x275),'HsiKN':_0x416e14(0x288),'RhSrr':function(_0x401c9a,_0x52d711){return _0x401c9a?.(_0x52d711);},'zvzqR':_0x416e14(0x292),'PvdfU':function(_0x2b5878,_0x313ba0){return _0x2b5878!==_0x313ba0;},'EDrGV':function(_0x4e03ff,_0x178c50){return _0x4e03ff?.(_0x178c50);},'ffBfT':_0x416e14(0x209),'HBaHh':function(_0x4e973d){return _0x4e973d();},'zjxZm':function(_0x4a547f,_0x2a3271){return _0x4a547f<_0x2a3271;},'CSbNq':'GDsSi','HgpeM':'GdsbE','IhbPq':'AbortError','QZPQk':_0x416e14(0x262),'ZqDDO':function(_0x2685c2,_0x4e6d9c){return _0x2685c2===_0x4e6d9c;},'leUAj':function(_0x1d2201,_0x1dab73){return _0x1d2201&&_0x1dab73;},'fQLQc':function(_0x18975d,_0x5160f4){return _0x18975d&&_0x5160f4;},'QfnsU':_0x416e14(0x256)};if(!_0x4603ce||!_0x4603ce[_0x416e14(0x28c)]()){if(_0x124a84[_0x416e14(0x1c5)](_0x124a84[_0x416e14(0x1f7)],_0x124a84['HsiKN']))this[_0x416e14(0x1f8)]=![];else{_0x124a84[_0x416e14(0x25f)](_0x470397,new Error(_0x124a84[_0x416e14(0x184)]));return;}}const _0x542a2f=await this[_0x416e14(0x1a5)]();if(!_0x542a2f){if(_0x124a84[_0x416e14(0x17e)](_0x416e14(0x290),_0x416e14(0x290)))_0x54f28d(_0x313c28),_0x515d12[_0x416e14(0x1b1)](PoQGEo['rBHIe']),_0x5c42eb(![]);else{const _0x382336=new Error(_0x416e14(0x26f));log['error'](_0x382336[_0x416e14(0x254)]),_0x124a84['EDrGV'](_0x470397,_0x382336);return;}}this['cancelActiveRequest'](_0x52912b),log[_0x416e14(0x219)]({'fromUser':_0x52912b},_0x124a84[_0x416e14(0x192)]);const _0x376b58=_0x124a84[_0x416e14(0x18e)](getGatewayToken),_0x449d5d='clawmessenger-'+_0x52912b,_0x3aa6f6=this['_buildMessagesWithHistory'](_0x52912b,_0x4603ce),_0x2934aa=[this['gatewayUrl']+_0x416e14(0x186),this[_0x416e14(0x222)]+_0x416e14(0x1b3)];for(let _0x2d5bdf=0x0;_0x124a84[_0x416e14(0x24c)](_0x2d5bdf,_0x2934aa[_0x416e14(0x1c2)]);_0x2d5bdf++){const _0x1c9be0=_0x2934aa[_0x2d5bdf];try{if(_0x124a84[_0x416e14(0x17e)](_0x124a84[_0x416e14(0x18f)],_0x124a84[_0x416e14(0x23a)])){const _0x52b541=await this[_0x416e14(0x217)](_0x1c9be0,_0x376b58,_0x449d5d,_0x52912b,_0x3aa6f6,_0x4bc090);this[_0x416e14(0x15c)](_0x52912b,_0x416e14(0x276),_0x4603ce),this[_0x416e14(0x15c)](_0x52912b,_0x416e14(0x278),_0x52b541);return;}else{let _0x17b1df=this['_getConversationHistory'](_0x5d5009);const _0x4d4c30=PoQGEo[_0x416e14(0x24a)](_0x34c4d0[_0x416e14(0x1c2)],_0x5cdaa3[_0x416e14(0x16d)])?PoQGEo['gwaua'](_0x105510[_0x416e14(0x1fe)](0x0,_0x65658f[_0x416e14(0x16d)]),PoQGEo[_0x416e14(0x299)]):_0x2a574a;_0x17b1df[_0x416e14(0x16f)]({'role':_0x102d48,'content':_0x4d4c30});const _0x302f12=PoQGEo[_0x416e14(0x19d)](_0x55c920[_0x416e14(0x271)],0x2);PoQGEo[_0x416e14(0x289)](_0x17b1df[_0x416e14(0x1c2)],_0x302f12)&&(_0x17b1df=_0x17b1df['slice'](PoQGEo[_0x416e14(0x169)](_0x17b1df[_0x416e14(0x1c2)],_0x302f12))),_0x132c05[_0x416e14(0x1d3)][_0x416e14(0x1dc)](_0x1564ff,_0x17b1df);}}catch(_0x1fa89d){if(_0x124a84['htbJb'](_0x1fa89d[_0x416e14(0x20f)],_0x124a84['IhbPq'])||_0x1fa89d['message']?.['includes'](_0x416e14(0x212))){log['info']({'fromUser':_0x52912b},_0x124a84[_0x416e14(0x22f)]);return;}const _0x5de219=_0x124a84[_0x416e14(0x1de)](_0x1fa89d[_0x416e14(0x195)]?.['status'],0x194),_0x2657f1=_0x124a84[_0x416e14(0x1de)](_0x2d5bdf,_0x124a84[_0x416e14(0x169)](_0x2934aa[_0x416e14(0x1c2)],0x1));if(_0x124a84[_0x416e14(0x20d)](_0x5de219,!_0x2657f1)){log[_0x416e14(0x1b1)]('SSE\x20端点\x20'+_0x1c9be0+_0x416e14(0x25d));continue;}_0x124a84[_0x416e14(0x1a1)](_0x5de219,_0x2657f1)?(log[_0x416e14(0x200)](_0x124a84['QfnsU']),log['error'](_0x416e14(0x1cd))):log[_0x416e14(0x200)](_0x416e14(0x246)+_0x1fa89d[_0x416e14(0x254)]);throw _0x1fa89d;}}}async['_downloadImageAsBase64'](_0x502ae2){const _0x4aee60=a0_0x3415ee,_0x5426ff={'CWooY':_0x4aee60(0x1db),'qiHzb':function(_0x3460b8,_0x4095a9){return _0x3460b8*_0x4095a9;},'uubUP':'base64','SUJeP':_0x4aee60(0x253)},_0x450f61=await a0_0x35c6fa[_0x4aee60(0x274)](_0x502ae2,{'responseType':_0x5426ff[_0x4aee60(0x1f5)],'timeout':0x7530,'maxContentLength':_0x5426ff[_0x4aee60(0x19f)](0xa,0x400)*0x400}),_0x45e905=Buffer[_0x4aee60(0x287)](_0x450f61['data']),_0x1bd41d=_0x45e905[_0x4aee60(0x220)](_0x5426ff[_0x4aee60(0x27f)]),_0x193258=_0x450f61[_0x4aee60(0x1f0)][_0x5426ff[_0x4aee60(0x176)]]||_0x4aee60(0x201);return{'base64':_0x1bd41d,'mediaType':_0x193258};}async['_doChatStream'](_0x14ff70,_0x685cbc,_0x22a10a,_0x419902,_0x143000,_0x3bf06b){const _0x365f2e=a0_0x3415ee,_0x14c905={'EfBCp':_0x365f2e(0x256),'mFwWG':_0x365f2e(0x1cd),'lydra':'user','EcGad':function(_0x578701,_0x28f321){return _0x578701?.(_0x28f321);},'qOcRx':'消息内容为空','cAoET':function(_0x6e8475,_0x5ce80d){return _0x6e8475===_0x5ce80d;},'dzSBP':'sCIWG','mGACk':_0x365f2e(0x179),'mXGXw':_0x365f2e(0x1e5),'gGtGP':_0x365f2e(0x23e),'pXwEP':'string','zJGHb':_0x365f2e(0x1a2),'tpIet':function(_0x2a90ce,_0x268154){return _0x2a90ce===_0x268154;},'ckRBR':_0x365f2e(0x15b),'IUhkW':function(_0x2ac406,_0x4982d9){return _0x2ac406===_0x4982d9;},'WccCd':function(_0x167ade,_0x142c3a){return _0x167ade===_0x142c3a;},'Fjyhs':function(_0x4c5653,_0x1e6921){return _0x4c5653>_0x1e6921;},'Thogs':function(_0x35e899,_0x9bc549){return _0x35e899(_0x9bc549);},'UhhuD':_0x365f2e(0x173),'SOOFt':function(_0x19a476,_0x1aac38){return _0x19a476(_0x1aac38);},'TDMWS':function(_0x2ce3e5,_0xda675c){return _0x2ce3e5!==_0xda675c;},'PcWEr':_0x365f2e(0x204),'iqGCL':_0x365f2e(0x247),'fZxnp':_0x365f2e(0x1b0),'JpkJF':function(_0x2bd40d,_0x52ebac){return _0x2bd40d(_0x52ebac);},'gApyr':_0x365f2e(0x1e7),'UhFHc':_0x365f2e(0x183),'PjQbX':_0x365f2e(0x1e1),'laPtG':_0x365f2e(0x23d),'BRfuf':_0x365f2e(0x200),'jZdSr':function(_0x2fa9fb,_0x74fc29){return _0x2fa9fb-_0x74fc29;},'ZFRpX':_0x365f2e(0x1fb),'ZgisA':'text','oEFvT':_0x365f2e(0x22e),'ljZyN':_0x365f2e(0x231),'IJxvP':_0x365f2e(0x26d),'ScHME':_0x365f2e(0x1d6),'poxyG':_0x365f2e(0x225),'kzelw':'IOLte','aykfa':_0x365f2e(0x268)},_0x564339={'Content-Type':_0x365f2e(0x252),'Accept':_0x365f2e(0x1a3)};_0x685cbc&&(_0x564339[_0x365f2e(0x1ea)]='Bearer\x20'+_0x685cbc);const _0xfeb322=_0x143000[_0x14c905['jZdSr'](_0x143000['length'],0x1)],_0x4d0ae5=_0xfeb322?.['content']||'',_0x286d88=_0x4d0ae5['match'](/\[图片\]\s*(https?:\/\/[^\s]+)/);let _0x4de2b2;if(_0x286d88){const _0x13f657=_0x286d88[0x1],_0x4a5a5c=_0x4d0ae5[_0x365f2e(0x171)](/\[图片\]\s*https?:\/\/[^\s]+/,'')[_0x365f2e(0x28c)]();try{if(_0x365f2e(0x1fb)===_0x14c905['ZFRpX']){const _0x34ee9a=await this['_downloadImageAsBase64'](_0x13f657),_0x5da0ae=_0x143000['slice'](0x0,-0x1)[_0x365f2e(0x189)]([{'role':_0x365f2e(0x276),'content':[{'type':_0x14c905[_0x365f2e(0x281)],'text':_0x4a5a5c||''},{'type':_0x14c905['oEFvT'],'image_url':{'url':_0x365f2e(0x26e)+_0x34ee9a[_0x365f2e(0x239)]+_0x365f2e(0x1cc)+_0x34ee9a[_0x365f2e(0x23b)]}}]}]);_0x4de2b2={'model':_0x14c905[_0x365f2e(0x1d8)],'messages':_0x5da0ae,'stream':!![],'max_tokens':0x800};}else _0x41d6f5[_0x365f2e(0x200)](MmDbrG[_0x365f2e(0x229)]),_0x284c87['error'](MmDbrG[_0x365f2e(0x238)]);}catch(_0x360f39){if(_0x14c905[_0x365f2e(0x1ef)](_0x14c905[_0x365f2e(0x224)],'Acanz'))log[_0x365f2e(0x1b1)]({'err':_0x360f39[_0x365f2e(0x254)]},_0x14c905['ScHME']),_0x4de2b2={'model':_0x14c905[_0x365f2e(0x1d8)],'messages':_0x143000,'stream':!![],'max_tokens':0x800};else{const _0x1c00fa=this[_0x365f2e(0x1f6)](_0x246619);return[..._0x1c00fa,{'role':MmDbrG[_0x365f2e(0x233)],'content':_0x181f69}];}}}else{if(_0x14c905['tpIet'](_0x14c905['poxyG'],_0x14c905[_0x365f2e(0x230)])){MmDbrG[_0x365f2e(0x20c)](_0x5a044b,new _0x2983fd(MmDbrG[_0x365f2e(0x267)]));return;}else _0x4de2b2={'model':_0x14c905[_0x365f2e(0x1d8)],'messages':_0x143000,'stream':!![],'max_tokens':0x800};}log[_0x365f2e(0x219)]({'apiUrl':_0x14ff70,'payloadSummary':JSON[_0x365f2e(0x19c)](_0x4de2b2)['substring'](0x0,0xc8)},_0x365f2e(0x283));const _0x20062f=new AbortController();OpenClawClient[_0x365f2e(0x15e)][_0x365f2e(0x1dc)](_0x419902,_0x20062f);const _0x567ede=await a0_0x35c6fa[_0x365f2e(0x1c7)](_0x14ff70,_0x4de2b2,{'headers':_0x564339,'responseType':_0x14c905[_0x365f2e(0x226)],'timeout':0x927c0,'signal':_0x20062f[_0x365f2e(0x202)]});return new Promise((_0x21e354,_0x579da1)=>{const _0x3011f6=_0x365f2e,_0x5bfeb9={'ZKMoi':_0x14c905['gApyr'],'VVIPF':_0x14c905[_0x3011f6(0x263)]};let _0x381bf9='',_0x8a4d87='',_0x4eee4b=null,_0xd3cd5e=![],_0x296a88='';_0x567ede[_0x3011f6(0x1e1)]['on'](_0x14c905['PjQbX'],_0x21fbac=>{const _0x5d1c10=_0x3011f6;if(_0x14c905[_0x5d1c10(0x28a)](_0x14c905[_0x5d1c10(0x17c)],_0x14c905[_0x5d1c10(0x15a)]))_0x134b4d[_0x5d1c10(0x1b8)](_0x2285a9,{'recursive':!![]});else{_0x8a4d87+=_0x21fbac['toString']();const _0x1052b0=_0x8a4d87[_0x5d1c10(0x297)]('\x0a');_0x8a4d87=_0x1052b0['pop']()||'';for(const _0x313b00 of _0x1052b0){const _0x2c3c8b=_0x313b00[_0x5d1c10(0x28c)]();if(!_0x2c3c8b||!_0x2c3c8b['startsWith'](_0x14c905[_0x5d1c10(0x164)]))continue;const _0x38ee21=_0x2c3c8b['slice'](0x6)[_0x5d1c10(0x28c)]();if(_0x14c905['cAoET'](_0x38ee21,_0x5d1c10(0x279)))continue;try{const _0x94c810=JSON[_0x5d1c10(0x1bd)](_0x38ee21);_0x4eee4b=_0x94c810;if(_0x94c810[_0x5d1c10(0x200)]){if(_0x14c905['gGtGP']===_0x14c905[_0x5d1c10(0x21e)]){_0xd3cd5e=!![],_0x296a88=_0x14c905[_0x5d1c10(0x28a)](typeof _0x94c810[_0x5d1c10(0x200)],_0x14c905[_0x5d1c10(0x215)])?_0x94c810[_0x5d1c10(0x200)]:_0x94c810[_0x5d1c10(0x200)]?.[_0x5d1c10(0x254)]||JSON['stringify'](_0x94c810[_0x5d1c10(0x200)]),log['error']({'error':_0x296a88},_0x14c905[_0x5d1c10(0x1aa)]);continue;}else _0x816ed3[_0x5d1c10(0x257)]=_0xd3f7d2['join'](_0xc49c9d,'AppData',_0x5d1c10(0x181));}const _0x375d88=_0x94c810['choices']?.[0x0];let _0x39745a=null;if(_0x375d88){if(_0x14c905[_0x5d1c10(0x17a)](_0x14c905['ckRBR'],'XTzqC')){const _0x1b91f5=_0x375d88[_0x5d1c10(0x272)];_0x39745a=_0x1b91f5?.[_0x5d1c10(0x250)]??_0x375d88[_0x5d1c10(0x254)]?.[_0x5d1c10(0x250)]??_0x375d88[_0x5d1c10(0x20a)]??_0x1b91f5?.['text']??_0x1b91f5?.[_0x5d1c10(0x18a)]??null;}else{const _0x1e3e40=_0x2ee9e3[_0x5d1c10(0x1d1)](_0x362e65,_0x33c2fb[_0x5d1c10(0x20f)]);if(_0x5df261[_0x5d1c10(0x242)](_0x394959[_0x5d1c10(0x1d1)](_0x1e3e40,EwqjkG[_0x5d1c10(0x228)])))return _0x1e3e40;}}(_0x14c905[_0x5d1c10(0x185)](_0x39745a,null)||_0x14c905[_0x5d1c10(0x185)](_0x39745a,undefined))&&(_0x39745a=_0x94c810[_0x5d1c10(0x250)]??_0x94c810['delta']??_0x94c810[_0x5d1c10(0x20a)]??null),_0x14c905[_0x5d1c10(0x1ca)](typeof _0x39745a,_0x14c905[_0x5d1c10(0x215)])&&_0x14c905['Fjyhs'](_0x39745a['length'],0x0)&&(_0x381bf9+=_0x39745a,Promise[_0x5d1c10(0x291)](_0x14c905[_0x5d1c10(0x1d2)](_0x3bf06b,_0x39745a))[_0x5d1c10(0x1f3)](_0x579da1));}catch{}}}}),_0x567ede[_0x3011f6(0x1e1)]['on'](_0x14c905[_0x3011f6(0x20e)],async()=>{const _0x417e80=_0x3011f6;OpenClawClient['activeRequests']['delete'](_0x419902),log[_0x417e80(0x219)]({'fullTextLength':_0x381bf9['length']},_0x14c905[_0x417e80(0x1ad)]);if(_0xd3cd5e){_0x14c905[_0x417e80(0x255)](_0x579da1,new Error(_0x417e80(0x286)+_0x296a88));return;}if(_0x14c905['WccCd'](_0x381bf9['length'],0x0)){const _0x2089c0=_0x4eee4b?.[_0x417e80(0x270)],_0x2dc248=_0x2089c0?.[0x0]?.['message'],_0x1e3851=_0x2dc248?.[_0x417e80(0x250)];typeof _0x1e3851===_0x14c905[_0x417e80(0x215)]&&_0x14c905[_0x417e80(0x1c6)](_0x1e3851[_0x417e80(0x1c2)],0x0)&&(_0x14c905['TDMWS'](_0x14c905[_0x417e80(0x24e)],_0x14c905[_0x417e80(0x24d)])?_0x381bf9=_0x1e3851:(this[_0x417e80(0x1f8)]=![],this['gatewayStarted']=![],this['gatewayUrl']=_0x226446));}if(_0x14c905[_0x417e80(0x17a)](_0x381bf9[_0x417e80(0x1c2)],0x0)){_0x14c905[_0x417e80(0x1d2)](_0x579da1,new Error(_0x14c905['fZxnp']));return;}try{await _0x14c905[_0x417e80(0x255)](_0x3bf06b,''),_0x21e354(_0x381bf9);}catch(_0x23b8d2){_0x14c905['JpkJF'](_0x579da1,_0x23b8d2);}}),_0x567ede['data']['on'](_0x14c905['BRfuf'],_0x48efba=>{const _0x2ee30d=_0x3011f6;OpenClawClient[_0x2ee30d(0x15e)][_0x2ee30d(0x211)](_0x419902),log[_0x2ee30d(0x200)]({'err':_0x48efba[_0x2ee30d(0x254)]},_0x5bfeb9[_0x2ee30d(0x188)]),_0x579da1(_0x48efba);});});}}OpenClawClient[a0_0x3415ee(0x1ff)]=0x2,OpenClawClient[a0_0x3415ee(0x17f)]=0x0,OpenClawClient[a0_0x3415ee(0x1d9)]=[],OpenClawClient[a0_0x3415ee(0x180)]=new Map(),OpenClawClient[a0_0x3415ee(0x1d3)]=new Map(),OpenClawClient['maxHistoryRounds']=0x32,OpenClawClient['maxMessageLength']=0x7d0,OpenClawClient[a0_0x3415ee(0x15e)]=new Map();function a0_0x2661(_0x3a7fcf,_0x101926){_0x3a7fcf=_0x3a7fcf-0x157;const _0xc6e708=a0_0xc6e7();let _0x2661d0=_0xc6e708[_0x3a7fcf];if(a0_0x2661['tUgUVn']===undefined){var _0x13227e=function(_0x536e32){const _0x8f34bf='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x297458='',_0x2c42da='';for(let _0x16b3a6=0x0,_0x29e99f,_0x4496c2,_0x3405a6=0x0;_0x4496c2=_0x536e32['charAt'](_0x3405a6++);~_0x4496c2&&(_0x29e99f=_0x16b3a6%0x4?_0x29e99f*0x40+_0x4496c2:_0x4496c2,_0x16b3a6++%0x4)?_0x297458+=String['fromCharCode'](0xff&_0x29e99f>>(-0x2*_0x16b3a6&0x6)):0x0){_0x4496c2=_0x8f34bf['indexOf'](_0x4496c2);}for(let _0x47b2b5=0x0,_0x246e13=_0x297458['length'];_0x47b2b5<_0x246e13;_0x47b2b5++){_0x2c42da+='%'+('00'+_0x297458['charCodeAt'](_0x47b2b5)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x2c42da);};a0_0x2661['CrcjJa']=_0x13227e,a0_0x2661['ypFMEr']={},a0_0x2661['tUgUVn']=!![];}const _0x40f26a=_0xc6e708[0x0],_0x2a28e2=_0x3a7fcf+_0x40f26a,_0x3c50d3=a0_0x2661['ypFMEr'][_0x2a28e2];return!_0x3c50d3?(_0x2661d0=a0_0x2661['CrcjJa'](_0x2661d0),a0_0x2661['ypFMEr'][_0x2a28e2]=_0x2661d0):_0x2661d0=_0x3c50d3,_0x2661d0;}export{getRealHomeDir,getOpenClawEnv,getGatewayToken,checkPort,ensureChatCompletionsConfig};function a0_0xc6e7(){const _0x5e70a5=['nZKYoeDYr1jQuq','qMHmCgu','Buz3v0C','BwvKAwfuExbL','sgDWzu0','yMfZzty0','vffzEe0','zw5K','uuTVs0i','5y+w5RAi55sO5OI35Rs76lEd6k+35Rgc','B25Jzq','zxr0Dey','zxHPC3rZu3LUyW','CMvHzezPBgvtEw5J','EwT1thi','thP5ANq','u1nfioIVT+AXGUwKSEI0PtOG','wvznEgC','uMH5BLu','zw5HyMXLza','rKvTExe','CMvSzwfZzvnSB3q','EMP4wM0','Axfhq0W','ugnxrxi','mtK5nJi1n0XIBvrkyq','y29UDgvUDa','venzCee','yxbWBgLJyxrPB24VANnVBG','y29UDgvUDc10ExbL','BwvZC2fNzq','u09prNq','5OMa5PYjifntrsdNQ6/NGRNLNyFOV5tLM54Gnda044cct3bLBKnSyxCGCMvZCg9UC2vZioERR+EcUEACQUwqR+EuQooaGG','qvbqrefuqq','EunWrxG','se9nrq','Aw5JBhvKzxm','zvffC0C','z1ndD3u','ioI/LowBNIa0mdtVViZLSj3OR5xLPiFNLkJNQ6/NGRK','y1n5B04','uMHtCNi','thfizhq','sMrgC0q','6k+35Rgc6kkR55sO5OI35y+w5RAi','vwHgsgm','CLPos3u','qwXSifvZzxjZ','AwHjsKW','Cu9JuNG','C3rYzwfT','t3bLBKnSyxCGz2f0zxDHEsdLKk/LIQJOTOxML7y','tezxDhu','ALr2EMm','CMfAwKW','C3nRs2y','zgf0ytO','t3bLBKnSyxCGz2f0zxDHEsdLKk/LIQJLPlhOTku','y2HVAwnLCW','Bwf4sgLZDg9YEvjVDw5KCW','zgvSDge','DgvMu3O','z2v0','qvb1vMe','DxnLCG','zvDrB1u','yxnZAxn0yw50','w0rptKvD','tgfjEfu','Dg9Rzw4','renQBMq','y2XLyxjiAxn0B3j5','whHTqLK','DxvIvva','y29UBMvJDa','wMDPC0e','rg1AD28','u1nfioIVT+AXGG','B3bLBMnSyxCUANnVBIdKUk0Gy2HHDenVBxbSzxrPB25Ziow3SUwqR+EuQa','5BEY6iEQ5yQO5zYOig9Wzw5JBgf3lMPZB24G5lIT5zcV55sOignOyxrdB21WBgv0Aw9UCYaO','t3bLBKnSyxCGu1nfioMuMEIVRZOG','zNjVBq','B1PsA3C','sLH6rgq','y0fVrvq','q291sKW','DhjPBq','yxnKDMi','CKr1thy','zgvZDhjVEq','t1bhyu8','CMvZB2X2zq','5RAi5OgV5yAf5A655lI656M6','EgPsExe','BxD0tLi','svrIDKy','vvnfuLbst0zjteu','C3bSAxq','y29UzMLNlMPZB24','AhjHyLa','wNjIzLa','AKLNre0','uKHRyKy','BuDbq2S','wfr6Cum','x2fKzfrVsgLZDg9YEq','AKr5B1e','ywn0AxzLuMvXDwvZDhm','wg9Tzhy','ywjVCNq','v2rpBgO','tM1SrNy','qvDNDKC','BvHhwhC','rxDTqNu','weTrvLy','Ahr0Ca','lI4U','v2TzA1u','tfr0qMW','u29JA2v0','B3bLBMnSyxCUANnVBG','Bwf4twvZC2fNzuXLBMD0Aa','swPiAw8','ChvZAa','CgXHDgzVCM0','CMvWBgfJzq','EfHgEeq','u1nfioA1GEE7K+ADNW','yxbPs2v5','BLrmDvi','u1vkzva','ufDMvgi','vMXWqM0','zMXhEuG','Dhbjzxq','uhvIBgLJ','zhPtqLa','vxv4Aum','uhzKzLu','CNvUBMLUz0nVDw50','C2vZC2LVBKXVy2TZ','uM9HBwLUzW','yxbPx2TLEq','u1nfioA1GEMuMEIVRW','ENz6Cvi','svvOA1C','l3yXl2nOyxqVy29TCgXLDgLVBNm','C3LZDgvTChjVzMLSzq','vLzjuey','y29Uy2f0','CMvHC29UAw5Nx2nVBNrLBNq','vMX2vve','odm3mJuYBufLqK1o','qxfLs24','sejHsgG','q1nItNe','v3LltxO','C2v0vgLTzw91Da','zMzczLq','Dw5Yzwy','Bwf0y2G','CMvZCg9UC2u','mZa4DM1xwffi','mti3lJaUmc4X','C2XPy2u','AvHJq2O','r3HVt08','D2LUmZi','C3rYAw5NAwz5','wuLyuK0','AhbLBeC','CwLiEMi','qZPCvxnLCNm','zLfmuwm','u1nfignODw5RigvYCM9Y','Dgv4Dc9LDMvUDc1ZDhjLyw0','DxrMltG','zw5ZDxjLr2f0zxDHEvj1BM5PBMC','z2f0zxDHEvn0yxj0zwq','Dg9mB3DLCKnHC2u','ruLJCgi','wNDkve0','EKPhsgi','CeP4tM0','q1D5s0q','vwHODuq','s05Quhu','ywjmsfm','t3bLBKnSyxCGu1nfioI/LowBNUEPUUwgHEwUUq','D2fYBG','C1D5u20','l3yXl3jLC3bVBNnLCW','yxv0Aa','CuDIB00','Cxrnwuq','te9dquXbufbeqvrb','BwTKAxjtEw5J','vgDcrLC','rgvMyxvSDa','CxL6wKO','ywnXDwLYzvnSB3q','CgfYC2u','q1rzveO','CuHuwvG','AwDUB3jL','uMPXsLK','BgvUz3rO','u1zvBuS','qMvHCMvYia','AhrIsMi','rMP5Ahm','Cg9ZDa','CMjOtwC','uu9IBvO','v2nJq2q','z2f0zxDHEq','o2jHC2u2ncW','6k+35Qoa5P+Lih4VlM9Wzw5JBgf3l29Wzw5JBgf3lMPZB24G5lIT5PIV5zcM5yYf5zcRoIbNyxrLD2f5lMH0DhaUzw5KCg9PBNrZlNjLC3bVBNnLCY5LBMfIBgvKid0GDhj1zq','nZi0oty3mgXIzvPruW','s2ffAwS','mJm3ne5iDe9UDa','AM9PBG','vgHVz3m','y29UDMvYC2f0Aw9UsgLZDg9YEq','txfbrwG','se9nrurssvzf','5zU+54Mh5Ase55cg5AsX6lsL77Ym5zUE6yca5yIW5PAh5PYS5QIH5BYp','u2L4B08','BgPAEu4','D2fPDff1zxvL','BMPrBMy','yxjYyxLIDwzMzxi','C2v0','yuT3A1m','wNfere8','wvnHvKy','ELn2Bvi','zgf0yq','t2nuqM0','mte3nZGZmen0wMzgtG','Aw5KzxHpzG','zgf0ytOG','y2HHDenVBxbSzxrPB25Z','lM9Wzw5JBgf3','mJKWy2jesMfw','CwLNr1m','qxv0Ag9YAxPHDgLVBG','BKHeuwi','B2HZyMu','su5hv0C','AwHPuxi','vernv1m','AgvHzgvYCW','DNfqCui','Ahr0CdOVlZeYnY4WlJaUmtO','y2f0y2G','t3bLBKnSyxCGz2f0zxDHEsdLKk/LIQJMIjdLIP8Gka','q1DVB1K','x2DLDenVBNzLCNnHDgLVBKHPC3rVCNK','tKfOzfO','z2f0zxDHEvn0yxj0Aw5N','wLbbELC','zw5KCg9PBNrZ','v2rjyw8','CgfZC3DVCMq','D01MqMi','C3vIC3rYAw5N','Bwf4q29Uy3vYCMvUy3K','zxjYB3i','Aw1Hz2uVANbLzW','C2LNBMfS','v3LYCuO','Ae5nrxK','r2Tcs2m','mtfcBwfgy2C','Efret0C','A2nZEMq','5yEg5AshifntrsdMTyhLVi/OSipNLkGGt3bLBKnSyxC','Dgv4Da','y2HHDfn0CMvHBq','rwnhywq','BgvvqwO','BgfqDeC','BMfTzq','q3bbDLe','zgvSzxrL','ywjVCNrLza','5zcV5yQOigDHDgv3yxKG5AsX6lsL','mZa1oxzfD2Pizq','CfH3rva','se9nrvbbveG','x2rVq2HHDfn0CMvHBq','s3bJzwO','Aw5MBW','x2j1AwXKtwvZC2fNzxnxAxrOsgLZDg9YEq','rMPNCKG','s2TzyKS','vMfcEha','z0D0r1a','yKLmrwW','Dg9tDhjPBMC','rgvMyxvSDcbvC2vY','z2f0zxDHEvvYBa','rLHnwwy','suP4DLa','t2PvDLG','yxLRzMe','D3jmtNu','wKTnB2K','rwzcq3a','C2v0DgLUz3mUANnVBG','BMDtzgO','BLzmAeq','qxbWrgf0yq','Aw1Hz2vFDxjS','uvPquwS','A3PLBhC','B3bLBMnSyxC','tu1bywO','BhLKCMe','y3nnCge','mJCYmtjtyvvyswG'];a0_0xc6e7=function(){return _0x5e70a5;};return a0_0xc6e7();}
|