browserclaw-agent 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent-loop.d.ts +49 -0
- package/dist/agent-loop.d.ts.map +1 -0
- package/dist/agent-loop.js +1574 -0
- package/dist/agent-loop.js.map +1 -0
- package/dist/config.d.ts +33 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +73 -0
- package/dist/config.js.map +1 -0
- package/dist/content-policy.d.ts +5 -0
- package/dist/content-policy.d.ts.map +1 -0
- package/dist/content-policy.js +17 -0
- package/dist/content-policy.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/judge.d.ts +8 -0
- package/dist/judge.d.ts.map +1 -0
- package/dist/judge.js +57 -0
- package/dist/judge.js.map +1 -0
- package/dist/llm.d.ts +46 -0
- package/dist/llm.d.ts.map +1 -0
- package/dist/llm.js +441 -0
- package/dist/llm.js.map +1 -0
- package/dist/logger.d.ts +3 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +10 -0
- package/dist/logger.js.map +1 -0
- package/dist/parse-json-response.d.ts +6 -0
- package/dist/parse-json-response.d.ts.map +1 -0
- package/dist/parse-json-response.js +52 -0
- package/dist/parse-json-response.js.map +1 -0
- package/dist/skills/cdp-utils.d.ts +4 -0
- package/dist/skills/cdp-utils.d.ts.map +1 -0
- package/dist/skills/cdp-utils.js +25 -0
- package/dist/skills/cdp-utils.js.map +1 -0
- package/dist/skills/cloudflare-checkbox.d.ts +3 -0
- package/dist/skills/cloudflare-checkbox.d.ts.map +1 -0
- package/dist/skills/cloudflare-checkbox.js +108 -0
- package/dist/skills/cloudflare-checkbox.js.map +1 -0
- package/dist/skills/dismiss-popup.d.ts +4 -0
- package/dist/skills/dismiss-popup.d.ts.map +1 -0
- package/dist/skills/dismiss-popup.js +147 -0
- package/dist/skills/dismiss-popup.js.map +1 -0
- package/dist/skills/infinite-scroll.d.ts +32 -0
- package/dist/skills/infinite-scroll.d.ts.map +1 -0
- package/dist/skills/infinite-scroll.js +92 -0
- package/dist/skills/infinite-scroll.js.map +1 -0
- package/dist/skills/loop-detection.d.ts +16 -0
- package/dist/skills/loop-detection.d.ts.map +1 -0
- package/dist/skills/loop-detection.js +35 -0
- package/dist/skills/loop-detection.js.map +1 -0
- package/dist/skills/page-state.d.ts +11 -0
- package/dist/skills/page-state.d.ts.map +1 -0
- package/dist/skills/page-state.js +55 -0
- package/dist/skills/page-state.js.map +1 -0
- package/dist/skills/press-and-hold.d.ts +10 -0
- package/dist/skills/press-and-hold.d.ts.map +1 -0
- package/dist/skills/press-and-hold.js +183 -0
- package/dist/skills/press-and-hold.js.map +1 -0
- package/dist/skills/recovery.d.ts +20 -0
- package/dist/skills/recovery.d.ts.map +1 -0
- package/dist/skills/recovery.js +215 -0
- package/dist/skills/recovery.js.map +1 -0
- package/dist/skills/tab-manager.d.ts +18 -0
- package/dist/skills/tab-manager.d.ts.map +1 -0
- package/dist/skills/tab-manager.js +50 -0
- package/dist/skills/tab-manager.js.map +1 -0
- package/dist/types.d.ts +148 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +18 -0
- package/dist/types.js.map +1 -0
- package/dist/web-search.d.ts +2 -0
- package/dist/web-search.d.ts.map +1 -0
- package/dist/web-search.js +77 -0
- package/dist/web-search.js.map +1 -0
- package/package.json +60 -0
package/dist/llm.js
ADDED
|
@@ -0,0 +1,441 @@
|
|
|
1
|
+
import OpenAI from 'openai';
|
|
2
|
+
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
3
|
+
import { parseJsonResponse } from './parse-json-response.js';
|
|
4
|
+
import { logger } from './logger.js';
|
|
5
|
+
import { LlmParseError } from './types.js';
|
|
6
|
+
const LLM_TIMEOUT_MS = parseInt(process.env.LLM_TIMEOUT_MS ?? '30000', 10);
|
|
7
|
+
// ── Sanitization ─────────────────────────────────────────────────────────────
|
|
8
|
+
/** Redact tokens, keys, and credentials from error text before logging. */
|
|
9
|
+
const SENSITIVE_PATTERN = /(?:eyJ[A-Za-z0-9_-]{20,}|sk-[A-Za-z0-9]{20,}|gsk_[A-Za-z0-9]{20,}|xox[bpas]-[A-Za-z0-9-]{20,}|AIza[A-Za-z0-9_-]{20,}|ghp_[A-Za-z0-9]{20,}|[A-Za-z0-9+/]{40,}={0,2})/g;
|
|
10
|
+
export function sanitizeErrorText(text) {
|
|
11
|
+
return text.replace(SENSITIVE_PATTERN, '[REDACTED]').slice(0, 500);
|
|
12
|
+
}
|
|
13
|
+
const sessionLlmStore = new AsyncLocalStorage();
|
|
14
|
+
/**
|
|
15
|
+
* Run an async function with a BYOK LLM config scoped to the current async context.
|
|
16
|
+
* All llm() / llmJson() calls inside `fn` will use the provided config
|
|
17
|
+
* instead of the server's environment variables.
|
|
18
|
+
*/
|
|
19
|
+
export function runWithLlmConfig(config, fn) {
|
|
20
|
+
return sessionLlmStore.run({ llmConfig: config, llmCallCount: 0, inputTokens: 0, outputTokens: 0 }, fn);
|
|
21
|
+
}
|
|
22
|
+
function recordUsage(input, output) {
|
|
23
|
+
const ctx = sessionLlmStore.getStore();
|
|
24
|
+
if (ctx) {
|
|
25
|
+
ctx.inputTokens += input;
|
|
26
|
+
ctx.outputTokens += output;
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
_fallbackInputTokens += input;
|
|
30
|
+
_fallbackOutputTokens += output;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
export const BYOK_PROVIDERS = {
|
|
34
|
+
anthropic: { baseURL: 'https://api.anthropic.com/v1/', useMaxCompletionTokens: false },
|
|
35
|
+
openai: { baseURL: 'https://api.openai.com/v1', useMaxCompletionTokens: true },
|
|
36
|
+
'openai-oauth': { baseURL: 'https://chatgpt.com/backend-api', useMaxCompletionTokens: true },
|
|
37
|
+
gemini: { baseURL: 'https://generativelanguage.googleapis.com/v1beta/openai/', useMaxCompletionTokens: false },
|
|
38
|
+
};
|
|
39
|
+
const PROVIDERS = [
|
|
40
|
+
{
|
|
41
|
+
provider: 'groq',
|
|
42
|
+
label: 'Groq',
|
|
43
|
+
baseURL: 'https://api.groq.com/openai/v1',
|
|
44
|
+
apiKeyEnv: 'GROQ_API_KEY',
|
|
45
|
+
useMaxCompletionTokens: false,
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
provider: 'gemini',
|
|
49
|
+
label: 'Gemini',
|
|
50
|
+
baseURL: 'https://generativelanguage.googleapis.com/v1beta/openai/',
|
|
51
|
+
apiKeyEnv: 'GEMINI_API_KEY',
|
|
52
|
+
useMaxCompletionTokens: false,
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
provider: 'openai',
|
|
56
|
+
label: 'OpenAI',
|
|
57
|
+
baseURL: 'https://api.openai.com/v1',
|
|
58
|
+
apiKeyEnv: 'OPENAI_API_KEY',
|
|
59
|
+
useMaxCompletionTokens: true,
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
provider: 'openai-oauth',
|
|
63
|
+
label: 'OpenAI (Subscription)',
|
|
64
|
+
baseURL: 'https://chatgpt.com/backend-api',
|
|
65
|
+
apiKeyEnv: 'OPENAI_OAUTH_TOKEN',
|
|
66
|
+
useMaxCompletionTokens: true,
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
provider: 'anthropic',
|
|
70
|
+
label: 'Anthropic',
|
|
71
|
+
baseURL: 'https://api.anthropic.com/v1/',
|
|
72
|
+
apiKeyEnv: 'ANTHROPIC_API_KEY',
|
|
73
|
+
useMaxCompletionTokens: false,
|
|
74
|
+
},
|
|
75
|
+
];
|
|
76
|
+
const CLIENT_ID = 'app_EMoamEEZ73f0CkXaXp7hrann';
|
|
77
|
+
const TOKEN_URL = 'https://auth.openai.com/oauth/token';
|
|
78
|
+
const TOKEN_LIFETIME_HOURS = parseInt(process.env.OPENAI_TOKEN_EXPIRATION_IN_HOURS ?? '0', 10);
|
|
79
|
+
const TOKEN_LIFETIME_MS = TOKEN_LIFETIME_HOURS * 60 * 60 * 1000;
|
|
80
|
+
const REFRESH_BUFFER_MS = 60 * 60 * 1000; // refresh 1 hour before expiry
|
|
81
|
+
let oauthTokenIssuedAt = null;
|
|
82
|
+
const clientCache = new Map();
|
|
83
|
+
async function refreshOAuthToken() {
|
|
84
|
+
const refreshToken = process.env.OPENAI_REFRESH_TOKEN;
|
|
85
|
+
if (refreshToken === undefined || refreshToken === '')
|
|
86
|
+
throw new Error('OPENAI_REFRESH_TOKEN is required to refresh the access token');
|
|
87
|
+
logger.info('Refreshing OpenAI OAuth token');
|
|
88
|
+
const res = await fetch(TOKEN_URL, {
|
|
89
|
+
method: 'POST',
|
|
90
|
+
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
|
91
|
+
body: new URLSearchParams({
|
|
92
|
+
grant_type: 'refresh_token',
|
|
93
|
+
client_id: CLIENT_ID,
|
|
94
|
+
refresh_token: refreshToken,
|
|
95
|
+
}),
|
|
96
|
+
});
|
|
97
|
+
if (!res.ok) {
|
|
98
|
+
const text = await res.text();
|
|
99
|
+
throw new Error(`OAuth token refresh failed (${String(res.status)}): ${sanitizeErrorText(text)}`);
|
|
100
|
+
}
|
|
101
|
+
const token = (await res.json());
|
|
102
|
+
process.env.OPENAI_OAUTH_TOKEN = token.access_token;
|
|
103
|
+
if (token.refresh_token !== undefined) {
|
|
104
|
+
process.env.OPENAI_REFRESH_TOKEN = token.refresh_token;
|
|
105
|
+
}
|
|
106
|
+
oauthTokenIssuedAt = Date.now();
|
|
107
|
+
clientCache.delete('openai-oauth');
|
|
108
|
+
logger.info('OpenAI OAuth token refreshed successfully');
|
|
109
|
+
}
|
|
110
|
+
function shouldRefreshOAuthToken() {
|
|
111
|
+
if (oauthTokenIssuedAt === null || TOKEN_LIFETIME_MS === 0)
|
|
112
|
+
return false;
|
|
113
|
+
return Date.now() - oauthTokenIssuedAt > TOKEN_LIFETIME_MS - REFRESH_BUFFER_MS;
|
|
114
|
+
}
|
|
115
|
+
function resolveProvider(name) {
|
|
116
|
+
const found = PROVIDERS.find((p) => p.provider === name);
|
|
117
|
+
if (!found)
|
|
118
|
+
throw new Error(`Unknown provider: ${name}. Valid: ${PROVIDERS.map((p) => p.provider).join(', ')}`);
|
|
119
|
+
const apiKey = process.env[found.apiKeyEnv];
|
|
120
|
+
if (apiKey === undefined || apiKey === '')
|
|
121
|
+
throw new Error(`${found.apiKeyEnv} is required for provider "${name}"`);
|
|
122
|
+
return found;
|
|
123
|
+
}
|
|
124
|
+
function getClient(config) {
|
|
125
|
+
const cached = clientCache.get(config.provider);
|
|
126
|
+
if (cached)
|
|
127
|
+
return cached;
|
|
128
|
+
const client = new OpenAI({
|
|
129
|
+
apiKey: process.env[config.apiKeyEnv],
|
|
130
|
+
baseURL: config.baseURL,
|
|
131
|
+
});
|
|
132
|
+
clientCache.set(config.provider, client);
|
|
133
|
+
return client;
|
|
134
|
+
}
|
|
135
|
+
export function getAvailableProviders() {
|
|
136
|
+
return PROVIDERS.filter((p) => Boolean(process.env[p.apiKeyEnv]));
|
|
137
|
+
}
|
|
138
|
+
export function getActiveProvider() {
|
|
139
|
+
const name = process.env.LLM_PROVIDER;
|
|
140
|
+
if (name === undefined || name === '')
|
|
141
|
+
throw new Error(`LLM_PROVIDER is required. Valid: ${PROVIDERS.map((p) => p.provider).join(', ')}`);
|
|
142
|
+
return resolveProvider(name);
|
|
143
|
+
}
|
|
144
|
+
export function getModel() {
|
|
145
|
+
const model = process.env.LLM_MODEL;
|
|
146
|
+
if (model === undefined || model === '') {
|
|
147
|
+
throw new Error('LLM_MODEL is required but not set');
|
|
148
|
+
}
|
|
149
|
+
return model;
|
|
150
|
+
}
|
|
151
|
+
async function callCodexResponsesAPI(provider, model, req, apiKeyOverride) {
|
|
152
|
+
const apiKey = apiKeyOverride ?? process.env[provider.apiKeyEnv] ?? '';
|
|
153
|
+
const url = `${provider.baseURL}/codex/responses`;
|
|
154
|
+
const res = await fetch(url, {
|
|
155
|
+
method: 'POST',
|
|
156
|
+
headers: {
|
|
157
|
+
Authorization: `Bearer ${apiKey}`,
|
|
158
|
+
'Content-Type': 'application/json',
|
|
159
|
+
originator: 'openclaw',
|
|
160
|
+
'User-Agent': 'openclaw/1.0',
|
|
161
|
+
},
|
|
162
|
+
body: JSON.stringify({
|
|
163
|
+
model,
|
|
164
|
+
instructions: req.system,
|
|
165
|
+
input: [{ role: 'user', content: req.message }],
|
|
166
|
+
store: false,
|
|
167
|
+
stream: true,
|
|
168
|
+
}),
|
|
169
|
+
});
|
|
170
|
+
if (!res.ok) {
|
|
171
|
+
const errText = await res.text();
|
|
172
|
+
throw new Error(`${String(res.status)} ${sanitizeErrorText(errText)}`);
|
|
173
|
+
}
|
|
174
|
+
const body = await res.text();
|
|
175
|
+
const lines = body.split('\n');
|
|
176
|
+
const textParts = [];
|
|
177
|
+
let sawCompleted = false;
|
|
178
|
+
for (const line of lines) {
|
|
179
|
+
if (!line.startsWith('data: '))
|
|
180
|
+
continue;
|
|
181
|
+
let data;
|
|
182
|
+
try {
|
|
183
|
+
data = JSON.parse(line.slice(6));
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
continue;
|
|
187
|
+
}
|
|
188
|
+
if (data.type === 'response.output_text.done') {
|
|
189
|
+
const text = data.text;
|
|
190
|
+
if (text !== undefined && text !== '')
|
|
191
|
+
textParts.push(text);
|
|
192
|
+
}
|
|
193
|
+
else if (data.type === 'response.completed') {
|
|
194
|
+
sawCompleted = true;
|
|
195
|
+
const resp = data.response;
|
|
196
|
+
const usage = resp?.usage;
|
|
197
|
+
if (usage)
|
|
198
|
+
recordUsage(usage.input_tokens ?? 0, usage.output_tokens ?? 0);
|
|
199
|
+
const output = resp?.output?.[0];
|
|
200
|
+
const content = output?.content?.[0];
|
|
201
|
+
const legacyText = content?.text;
|
|
202
|
+
if (legacyText !== undefined && legacyText !== '')
|
|
203
|
+
textParts.push(legacyText);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
if (sawCompleted && textParts.length > 0)
|
|
207
|
+
return { text: textParts.join('') };
|
|
208
|
+
throw new Error('Codex Responses API returned no completed response');
|
|
209
|
+
}
|
|
210
|
+
async function callChatCompletions(provider, model, req, clientOverride) {
|
|
211
|
+
const client = clientOverride ?? getClient(provider);
|
|
212
|
+
const response = await client.chat.completions.create({
|
|
213
|
+
model,
|
|
214
|
+
...(provider.useMaxCompletionTokens ? { max_completion_tokens: req.maxTokens } : { max_tokens: req.maxTokens }),
|
|
215
|
+
messages: [
|
|
216
|
+
{ role: 'system', content: req.system },
|
|
217
|
+
{ role: 'user', content: req.message },
|
|
218
|
+
],
|
|
219
|
+
});
|
|
220
|
+
if (response.usage) {
|
|
221
|
+
recordUsage(response.usage.prompt_tokens, response.usage.completion_tokens);
|
|
222
|
+
}
|
|
223
|
+
const content = response.choices[0]?.message.content ?? null;
|
|
224
|
+
if (content === null)
|
|
225
|
+
throw new Error('LLM returned empty response');
|
|
226
|
+
return { text: content };
|
|
227
|
+
}
|
|
228
|
+
async function callLLM(provider, model, req) {
|
|
229
|
+
if (provider.provider === 'openai-oauth') {
|
|
230
|
+
// Raw fetch — no SDK retries, so we add our own
|
|
231
|
+
return retryTransient(() => callCodexResponsesAPI(provider, model, req), 'Codex API');
|
|
232
|
+
}
|
|
233
|
+
// OpenAI SDK handles its own retries for chat completions
|
|
234
|
+
return callChatCompletions(provider, model, req);
|
|
235
|
+
}
|
|
236
|
+
// Per-session LLM call counter backed by AsyncLocalStorage.
|
|
237
|
+
// Falls back to a module-level counter for calls outside a session context.
|
|
238
|
+
let _fallbackLlmCallCount = 0;
|
|
239
|
+
let _fallbackInputTokens = 0;
|
|
240
|
+
let _fallbackOutputTokens = 0;
|
|
241
|
+
export function getLLMCallCount() {
|
|
242
|
+
const ctx = sessionLlmStore.getStore();
|
|
243
|
+
return ctx ? ctx.llmCallCount : _fallbackLlmCallCount;
|
|
244
|
+
}
|
|
245
|
+
export function getTokenUsage() {
|
|
246
|
+
const ctx = sessionLlmStore.getStore();
|
|
247
|
+
const input = ctx ? ctx.inputTokens : _fallbackInputTokens;
|
|
248
|
+
const output = ctx ? ctx.outputTokens : _fallbackOutputTokens;
|
|
249
|
+
return { input, output, total: input + output };
|
|
250
|
+
}
|
|
251
|
+
export function resetLLMCallCount() {
|
|
252
|
+
const ctx = sessionLlmStore.getStore();
|
|
253
|
+
if (ctx) {
|
|
254
|
+
ctx.llmCallCount = 0;
|
|
255
|
+
ctx.inputTokens = 0;
|
|
256
|
+
ctx.outputTokens = 0;
|
|
257
|
+
}
|
|
258
|
+
else {
|
|
259
|
+
_fallbackLlmCallCount = 0;
|
|
260
|
+
_fallbackInputTokens = 0;
|
|
261
|
+
_fallbackOutputTokens = 0;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
async function withTimeout(promise, timeoutMs, label) {
|
|
265
|
+
if (timeoutMs <= 0)
|
|
266
|
+
return promise;
|
|
267
|
+
let timer;
|
|
268
|
+
const timeout = new Promise((_, reject) => {
|
|
269
|
+
timer = setTimeout(() => {
|
|
270
|
+
reject(new Error(`${label} timed out after ${String(timeoutMs)}ms`));
|
|
271
|
+
}, timeoutMs);
|
|
272
|
+
});
|
|
273
|
+
try {
|
|
274
|
+
return await Promise.race([promise, timeout]);
|
|
275
|
+
}
|
|
276
|
+
finally {
|
|
277
|
+
if (timer !== undefined)
|
|
278
|
+
clearTimeout(timer);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
// ── Transient error retry (for raw-fetch paths without SDK retries) ──────────
|
|
282
|
+
const LLM_MAX_RETRIES = 2;
|
|
283
|
+
const LLM_RETRY_BASE_MS = 1000;
|
|
284
|
+
function isTransientError(err) {
|
|
285
|
+
if (err instanceof OpenAI.APIError) {
|
|
286
|
+
const status = err.status;
|
|
287
|
+
return status === 429 || status === 408 || status === 409 || (status !== undefined && status >= 500);
|
|
288
|
+
}
|
|
289
|
+
if (err instanceof OpenAI.APIConnectionError)
|
|
290
|
+
return true;
|
|
291
|
+
// Raw fetch errors (callCodexResponsesAPI)
|
|
292
|
+
if (err instanceof TypeError && (err.message.includes('fetch') || err.message.includes('network')))
|
|
293
|
+
return true;
|
|
294
|
+
// Our own timeout wrapper or HTTP status codes from callCodexResponsesAPI ("429 ...")
|
|
295
|
+
if (err instanceof Error) {
|
|
296
|
+
if (err.message.includes('timed out after'))
|
|
297
|
+
return true;
|
|
298
|
+
const match = /^(\d{3})\s/.exec(err.message);
|
|
299
|
+
if (match) {
|
|
300
|
+
const status = parseInt(match[1], 10);
|
|
301
|
+
return status === 429 || status === 408 || status >= 500;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
return false;
|
|
305
|
+
}
|
|
306
|
+
async function retryTransient(fn, label) {
|
|
307
|
+
let lastErr;
|
|
308
|
+
for (let attempt = 0; attempt <= LLM_MAX_RETRIES; attempt++) {
|
|
309
|
+
try {
|
|
310
|
+
return await fn();
|
|
311
|
+
}
|
|
312
|
+
catch (err) {
|
|
313
|
+
lastErr = err;
|
|
314
|
+
if (attempt < LLM_MAX_RETRIES && isTransientError(err)) {
|
|
315
|
+
const delayMs = LLM_RETRY_BASE_MS * 2 ** attempt;
|
|
316
|
+
logger.warn({
|
|
317
|
+
attempt: attempt + 1,
|
|
318
|
+
maxRetries: LLM_MAX_RETRIES,
|
|
319
|
+
delayMs,
|
|
320
|
+
error: err instanceof Error ? sanitizeErrorText(err.message) : 'unknown',
|
|
321
|
+
}, `${label}: transient error, retrying`);
|
|
322
|
+
await new Promise((r) => setTimeout(r, delayMs));
|
|
323
|
+
continue;
|
|
324
|
+
}
|
|
325
|
+
throw err;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
throw lastErr;
|
|
329
|
+
}
|
|
330
|
+
function resolveByokProvider(config) {
|
|
331
|
+
const byok = BYOK_PROVIDERS[config.provider];
|
|
332
|
+
if (!byok)
|
|
333
|
+
throw new Error(`Unsupported BYOK provider: ${config.provider}`);
|
|
334
|
+
return {
|
|
335
|
+
provider: config.provider,
|
|
336
|
+
label: config.provider,
|
|
337
|
+
baseURL: byok.baseURL,
|
|
338
|
+
apiKeyEnv: '', // not used for BYOK
|
|
339
|
+
useMaxCompletionTokens: byok.useMaxCompletionTokens,
|
|
340
|
+
};
|
|
341
|
+
}
|
|
342
|
+
function getByokClient(config, providerConfig) {
|
|
343
|
+
return new OpenAI({
|
|
344
|
+
apiKey: config.api_key,
|
|
345
|
+
baseURL: providerConfig.baseURL,
|
|
346
|
+
});
|
|
347
|
+
}
|
|
348
|
+
export async function llm(req) {
|
|
349
|
+
const ctx = sessionLlmStore.getStore();
|
|
350
|
+
if (ctx) {
|
|
351
|
+
ctx.llmCallCount++;
|
|
352
|
+
}
|
|
353
|
+
else {
|
|
354
|
+
_fallbackLlmCallCount++;
|
|
355
|
+
}
|
|
356
|
+
// Check for BYOK session config first
|
|
357
|
+
if (ctx) {
|
|
358
|
+
const byokConfig = ctx.llmConfig;
|
|
359
|
+
const providerConfig = resolveByokProvider(byokConfig);
|
|
360
|
+
if (byokConfig.provider === 'openai-oauth') {
|
|
361
|
+
return await withTimeout(retryTransient(() => callCodexResponsesAPI(providerConfig, byokConfig.model, req, byokConfig.api_key), 'BYOK Codex API'), LLM_TIMEOUT_MS, 'LLM call (BYOK OAuth)');
|
|
362
|
+
}
|
|
363
|
+
// Cache the BYOK client in the session context to avoid creating a new one per call
|
|
364
|
+
ctx.byokClient ??= getByokClient(byokConfig, providerConfig);
|
|
365
|
+
return await withTimeout(callChatCompletions(providerConfig, byokConfig.model, req, ctx.byokClient), LLM_TIMEOUT_MS, 'LLM call (BYOK)');
|
|
366
|
+
}
|
|
367
|
+
// Fall back to server-configured provider
|
|
368
|
+
const provider = getActiveProvider();
|
|
369
|
+
const model = getModel();
|
|
370
|
+
const isSubscription = provider.provider === 'openai-oauth';
|
|
371
|
+
if (isSubscription && shouldRefreshOAuthToken()) {
|
|
372
|
+
await refreshOAuthToken();
|
|
373
|
+
}
|
|
374
|
+
try {
|
|
375
|
+
return await withTimeout(callLLM(provider, model, req), LLM_TIMEOUT_MS, 'LLM call');
|
|
376
|
+
}
|
|
377
|
+
catch (err) {
|
|
378
|
+
if (isSubscription && err instanceof Error && err.message.includes('401')) {
|
|
379
|
+
await refreshOAuthToken();
|
|
380
|
+
return withTimeout(callLLM(provider, model, req), LLM_TIMEOUT_MS, 'LLM call (retry)');
|
|
381
|
+
}
|
|
382
|
+
throw err;
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
export async function llmJson(req) {
|
|
386
|
+
const { text } = await llm(req);
|
|
387
|
+
try {
|
|
388
|
+
return parseJsonResponse(text);
|
|
389
|
+
}
|
|
390
|
+
catch (err) {
|
|
391
|
+
if (err instanceof SyntaxError) {
|
|
392
|
+
throw new LlmParseError(err.message, text);
|
|
393
|
+
}
|
|
394
|
+
throw err;
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
/**
|
|
398
|
+
* Call the LLM with a screenshot image for visual extraction.
|
|
399
|
+
*/
|
|
400
|
+
export async function llmVision(system, message, imageBase64) {
|
|
401
|
+
const ctx = sessionLlmStore.getStore();
|
|
402
|
+
if (ctx) {
|
|
403
|
+
ctx.llmCallCount++;
|
|
404
|
+
}
|
|
405
|
+
else {
|
|
406
|
+
_fallbackLlmCallCount++;
|
|
407
|
+
}
|
|
408
|
+
let provider;
|
|
409
|
+
let model;
|
|
410
|
+
let client;
|
|
411
|
+
if (ctx) {
|
|
412
|
+
provider = resolveByokProvider(ctx.llmConfig);
|
|
413
|
+
model = ctx.llmConfig.model;
|
|
414
|
+
ctx.byokClient ??= getByokClient(ctx.llmConfig, provider);
|
|
415
|
+
client = ctx.byokClient;
|
|
416
|
+
}
|
|
417
|
+
else {
|
|
418
|
+
provider = getActiveProvider();
|
|
419
|
+
model = getModel();
|
|
420
|
+
client = getClient(provider);
|
|
421
|
+
}
|
|
422
|
+
const response = await retryTransient(() => withTimeout(client.chat.completions.create({
|
|
423
|
+
model,
|
|
424
|
+
max_tokens: 2048,
|
|
425
|
+
messages: [
|
|
426
|
+
{ role: 'system', content: system },
|
|
427
|
+
{
|
|
428
|
+
role: 'user',
|
|
429
|
+
content: [
|
|
430
|
+
{ type: 'image_url', image_url: { url: `data:image/png;base64,${imageBase64}` } },
|
|
431
|
+
{ type: 'text', text: message },
|
|
432
|
+
],
|
|
433
|
+
},
|
|
434
|
+
],
|
|
435
|
+
}), LLM_TIMEOUT_MS, 'LLM vision call'), 'LLM vision call');
|
|
436
|
+
if (response.usage) {
|
|
437
|
+
recordUsage(response.usage.prompt_tokens, response.usage.completion_tokens);
|
|
438
|
+
}
|
|
439
|
+
return response.choices[0]?.message.content ?? '';
|
|
440
|
+
}
|
|
441
|
+
//# sourceMappingURL=llm.js.map
|
package/dist/llm.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm.js","sourceRoot":"","sources":["../src/llm.ts"],"names":[],"mappings":"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"}
|
package/dist/logger.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,eAAO,MAAM,MAAM,6BAOjB,CAAC"}
|
package/dist/logger.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,MAAM;IACtC,UAAU,EAAE;QACV,KAAK,CAAC,KAAK;YACT,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QAC1B,CAAC;KACF;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-json-response.d.ts","sourceRoot":"","sources":["../src/parse-json-response.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CA6CvD"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extracts and parses JSON from an LLM response that may be wrapped in
|
|
3
|
+
* markdown code fences or followed by trailing text.
|
|
4
|
+
*/
|
|
5
|
+
export function parseJsonResponse(text) {
|
|
6
|
+
let jsonStr = text.trim();
|
|
7
|
+
// Strip markdown code fences
|
|
8
|
+
const fenceMatch = /```(?:json)?\s*([\s\S]*?)```/.exec(jsonStr);
|
|
9
|
+
if (fenceMatch) {
|
|
10
|
+
jsonStr = fenceMatch[1].trim();
|
|
11
|
+
}
|
|
12
|
+
// Try direct parse first (fast path)
|
|
13
|
+
try {
|
|
14
|
+
return JSON.parse(jsonStr);
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
// Extract first JSON object — handles trailing text after valid JSON
|
|
18
|
+
const start = jsonStr.indexOf('{');
|
|
19
|
+
if (start === -1)
|
|
20
|
+
throw new SyntaxError('No JSON object found in response');
|
|
21
|
+
let depth = 0;
|
|
22
|
+
let inString = false;
|
|
23
|
+
let escape = false;
|
|
24
|
+
for (let i = start; i < jsonStr.length; i++) {
|
|
25
|
+
const ch = jsonStr[i];
|
|
26
|
+
if (escape) {
|
|
27
|
+
escape = false;
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
if (ch === '\\' && inString) {
|
|
31
|
+
escape = true;
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
if (ch === '"') {
|
|
35
|
+
inString = !inString;
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
if (inString)
|
|
39
|
+
continue;
|
|
40
|
+
if (ch === '{')
|
|
41
|
+
depth++;
|
|
42
|
+
else if (ch === '}') {
|
|
43
|
+
depth--;
|
|
44
|
+
if (depth === 0) {
|
|
45
|
+
return JSON.parse(jsonStr.slice(start, i + 1));
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
throw new SyntaxError('Unterminated JSON object in response');
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=parse-json-response.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-json-response.js","sourceRoot":"","sources":["../src/parse-json-response.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,IAAI,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAE1B,6BAA6B;IAC7B,MAAM,UAAU,GAAG,8BAA8B,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAChE,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACjC,CAAC;IAED,qCAAqC;IACrC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAY,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,qEAAqE;QACrE,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,KAAK,KAAK,CAAC,CAAC;YAAE,MAAM,IAAI,WAAW,CAAC,kCAAkC,CAAC,CAAC;QAE5E,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,IAAI,MAAM,GAAG,KAAK,CAAC;QACnB,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5C,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YACtB,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,GAAG,KAAK,CAAC;gBACf,SAAS;YACX,CAAC;YACD,IAAI,EAAE,KAAK,IAAI,IAAI,QAAQ,EAAE,CAAC;gBAC5B,MAAM,GAAG,IAAI,CAAC;gBACd,SAAS;YACX,CAAC;YACD,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;gBACf,QAAQ,GAAG,CAAC,QAAQ,CAAC;gBACrB,SAAS;YACX,CAAC;YACD,IAAI,QAAQ;gBAAE,SAAS;YACvB,IAAI,EAAE,KAAK,GAAG;gBAAE,KAAK,EAAE,CAAC;iBACnB,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;gBACpB,KAAK,EAAE,CAAC;gBACR,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;oBAChB,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,CAAY,CAAC;gBAC5D,CAAC;YACH,CAAC;QACH,CAAC;QACD,MAAM,IAAI,WAAW,CAAC,sCAAsC,CAAC,CAAC;IAChE,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cdp-utils.d.ts","sourceRoot":"","sources":["../../src/skills/cdp-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAYrD;AAED,wBAAsB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAY3F"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export function getCdpBaseUrl(page) {
|
|
2
|
+
// No public getter upstream yet; guard loudly so a rename fails fast.
|
|
3
|
+
const cdpUrl = page.cdpUrl;
|
|
4
|
+
if (typeof cdpUrl !== 'string' || cdpUrl === '') {
|
|
5
|
+
throw new Error('browserclaw internal `cdpUrl` field is missing — browserclaw may have changed its private API, file an upstream issue to expose cdpUrl publicly');
|
|
6
|
+
}
|
|
7
|
+
return cdpUrl
|
|
8
|
+
.replace('ws://', 'http://')
|
|
9
|
+
.replace(/\/devtools\/browser\/.*/, '')
|
|
10
|
+
.replace(/\/$/, '');
|
|
11
|
+
}
|
|
12
|
+
export async function activateCdpTarget(cdpBaseUrl, targetId) {
|
|
13
|
+
const ws = await import('ws');
|
|
14
|
+
const versionRes = await fetch(cdpBaseUrl + '/json/version');
|
|
15
|
+
const versionInfo = (await versionRes.json());
|
|
16
|
+
const browserWs = new ws.default(versionInfo.webSocketDebuggerUrl);
|
|
17
|
+
await new Promise((resolve, reject) => {
|
|
18
|
+
browserWs.on('open', resolve);
|
|
19
|
+
browserWs.on('error', reject);
|
|
20
|
+
});
|
|
21
|
+
browserWs.send(JSON.stringify({ id: 1, method: 'Target.activateTarget', params: { targetId } }));
|
|
22
|
+
await new Promise((r) => setTimeout(r, 300));
|
|
23
|
+
browserWs.close();
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=cdp-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cdp-utils.js","sourceRoot":"","sources":["../../src/skills/cdp-utils.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,aAAa,CAAC,IAAe;IAC3C,sEAAsE;IACtE,MAAM,MAAM,GAAI,IAAuC,CAAC,MAAM,CAAC;IAC/D,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,EAAE,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CACb,iJAAiJ,CAClJ,CAAC;IACJ,CAAC;IACD,OAAO,MAAM;SACV,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC;SAC3B,OAAO,CAAC,yBAAyB,EAAE,EAAE,CAAC;SACtC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AACxB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,UAAkB,EAAE,QAAgB;IAC1E,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;IAC9B,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,UAAU,GAAG,eAAe,CAAC,CAAC;IAC7D,MAAM,WAAW,GAAG,CAAC,MAAM,UAAU,CAAC,IAAI,EAAE,CAAqC,CAAC;IAClF,MAAM,SAAS,GAAG,IAAI,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,oBAAoB,CAAC,CAAC;IACnE,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC1C,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC9B,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IACH,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,uBAAuB,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;IACjG,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IAC7C,SAAS,CAAC,KAAK,EAAE,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloudflare-checkbox.d.ts","sourceRoot":"","sources":["../../src/skills/cloudflare-checkbox.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAiF7C,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CAsC/E"}
|