@steipete/oracle 0.21.0 → 0.21.2
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/bin/oracle-cli.js +14 -15
- package/dist/src/browser/executor.js +9 -4
- package/dist/src/browser/profileState.js +2 -0
- package/dist/src/browser/provider.js +15 -1
- package/dist/src/browser/sessionRunner.js +2 -2
- package/dist/src/gemini-web/browserSessionManager.js +15 -2
- package/dist/src/gemini-web/executor.js +1 -1
- package/dist/src/gemini-web/http.js +11 -2
- package/dist/src/remote/client.js +25 -9
- package/dist/src/remote/server.js +19 -5
- package/package.json +11 -10
- package/dist/docs-site/.nojekyll +0 -0
- package/dist/docs-site/CNAME +0 -1
- package/dist/docs-site/RELEASING.html +0 -403
- package/dist/docs-site/advisor.html +0 -317
- package/dist/docs-site/agents.html +0 -375
- package/dist/docs-site/anthropic.html +0 -368
- package/dist/docs-site/bridge.html +0 -421
- package/dist/docs-site/browser-mode.html +0 -636
- package/dist/docs-site/chromium-forks.html +0 -355
- package/dist/docs-site/cli-reference.html +0 -347
- package/dist/docs-site/configuration.html +0 -464
- package/dist/docs-site/favicon.svg +0 -14
- package/dist/docs-site/followup.html +0 -375
- package/dist/docs-site/gemini.html +0 -387
- package/dist/docs-site/grok.html +0 -325
- package/dist/docs-site/index.html +0 -360
- package/dist/docs-site/install.html +0 -335
- package/dist/docs-site/linux.html +0 -321
- package/dist/docs-site/llms.txt +0 -44
- package/dist/docs-site/manual-tests.html +0 -621
- package/dist/docs-site/mcp.html +0 -412
- package/dist/docs-site/multimodel.html +0 -364
- package/dist/docs-site/mythical-pro-agents.html +0 -360
- package/dist/docs-site/notifier.html +0 -338
- package/dist/docs-site/openai-endpoints.html +0 -417
- package/dist/docs-site/openrouter.html +0 -344
- package/dist/docs-site/quickstart.html +0 -369
- package/dist/docs-site/refactor/ux.html +0 -321
- package/dist/docs-site/sessions.html +0 -397
- package/dist/docs-site/social-card.png +0 -0
- package/dist/docs-site/social-card.svg +0 -79
- package/dist/docs-site/spec.html +0 -363
- package/dist/docs-site/testing.html +0 -323
- package/dist/docs-site/tui-debug.html +0 -326
- package/dist/docs-site/windows-work.html +0 -348
- package/dist/docs-site/windows.html +0 -320
package/dist/bin/oracle-cli.js
CHANGED
|
@@ -368,6 +368,12 @@ program
|
|
|
368
368
|
.addOption(new Option("--wait").default(undefined))
|
|
369
369
|
.addOption(new Option("--no-wait").default(undefined).hideHelp())
|
|
370
370
|
.showHelpAfterError("(use --help for usage)");
|
|
371
|
+
program.on("afterHelp", ({ error }) => {
|
|
372
|
+
if (!error && program.opts().verbose) {
|
|
373
|
+
console.log("");
|
|
374
|
+
printDebugHelp(program.name());
|
|
375
|
+
}
|
|
376
|
+
});
|
|
371
377
|
program.addHelpText("after", `
|
|
372
378
|
Examples:
|
|
373
379
|
# Quick API run with two files
|
|
@@ -651,7 +657,7 @@ program
|
|
|
651
657
|
.option("--remote-host <host:port>", "Delegate browser runs to a remote `oracle serve` instance.")
|
|
652
658
|
.option("--remote-token <token>", "Access token for the remote `oracle serve` instance.")
|
|
653
659
|
.action(async (sessionId, _options, cmd) => {
|
|
654
|
-
const restartOptions = cmd.
|
|
660
|
+
const restartOptions = cmd.optsWithGlobals();
|
|
655
661
|
await restartSession(sessionId, restartOptions);
|
|
656
662
|
});
|
|
657
663
|
function buildRunOptions(options, overrides = {}) {
|
|
@@ -986,7 +992,6 @@ async function runRootCommand(options) {
|
|
|
986
992
|
return;
|
|
987
993
|
}
|
|
988
994
|
const userConfig = (await loadUserConfig()).config;
|
|
989
|
-
const helpRequested = rawCliArgs.some((arg) => arg === "--help" || arg === "-h");
|
|
990
995
|
const multiModelProvided = Array.isArray(options.models) && options.models.length > 0;
|
|
991
996
|
const optionUsesDefault = (name) => {
|
|
992
997
|
// Commander reports undefined for untouched options, so treat undefined/default the same
|
|
@@ -996,15 +1001,6 @@ async function runRootCommand(options) {
|
|
|
996
1001
|
if (multiModelProvided && !optionUsesDefault("model") && normalizeModelOption(options.model)) {
|
|
997
1002
|
throw new Error("--models cannot be combined with --model.");
|
|
998
1003
|
}
|
|
999
|
-
if (helpRequested) {
|
|
1000
|
-
if (options.verbose) {
|
|
1001
|
-
console.log("");
|
|
1002
|
-
printDebugHelp(program.name());
|
|
1003
|
-
console.log("");
|
|
1004
|
-
}
|
|
1005
|
-
program.help({ error: false });
|
|
1006
|
-
return;
|
|
1007
|
-
}
|
|
1008
1004
|
const previewMode = resolvePreviewMode(options.dryRun || options.preview);
|
|
1009
1005
|
const mergedFileInputs = mergePathLikeOptions(options.file, options.include, options.files, options.path, options.paths);
|
|
1010
1006
|
if (mergedFileInputs.length > 0) {
|
|
@@ -1462,9 +1458,9 @@ async function runRootCommand(options) {
|
|
|
1462
1458
|
});
|
|
1463
1459
|
let browserDeps;
|
|
1464
1460
|
if (browserConfig && remoteHost) {
|
|
1465
|
-
const {
|
|
1461
|
+
const { resolveBrowserExecutor } = await import("../src/browser/executor.js");
|
|
1466
1462
|
browserDeps = {
|
|
1467
|
-
executeBrowser:
|
|
1463
|
+
executeBrowser: await resolveBrowserExecutor({ ...resolvedOptions, model: activeModel }, { host: remoteHost, token: remoteToken }),
|
|
1468
1464
|
};
|
|
1469
1465
|
console.log(chalk.dim(`Routing browser automation to remote host ${remoteHost}`));
|
|
1470
1466
|
}
|
|
@@ -1776,9 +1772,12 @@ async function restartSession(sessionId, options) {
|
|
|
1776
1772
|
}
|
|
1777
1773
|
let browserDeps;
|
|
1778
1774
|
if (browserConfig && remoteHost) {
|
|
1779
|
-
const {
|
|
1775
|
+
const { resolveBrowserExecutor } = await import("../src/browser/executor.js");
|
|
1780
1776
|
browserDeps = {
|
|
1781
|
-
executeBrowser:
|
|
1777
|
+
executeBrowser: await resolveBrowserExecutor(runOptions, {
|
|
1778
|
+
host: remoteHost,
|
|
1779
|
+
token: remoteToken,
|
|
1780
|
+
}),
|
|
1782
1781
|
};
|
|
1783
1782
|
console.log(chalk.dim(`Routing browser automation to remote host ${remoteHost}`));
|
|
1784
1783
|
}
|
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
import { resolveBrowserProvider } from "./provider.js";
|
|
2
|
-
export async function
|
|
2
|
+
export async function resolveBrowserExecutor(options, remote) {
|
|
3
3
|
const provider = resolveBrowserProvider(options.model);
|
|
4
|
+
if (!provider) {
|
|
5
|
+
throw new Error(`Unsupported browser model: ${options.model}. Use a GPT or Gemini model.`);
|
|
6
|
+
}
|
|
7
|
+
if (remote) {
|
|
8
|
+
const { createRemoteBrowserExecutor } = await import("../remote/client.js");
|
|
9
|
+
return createRemoteBrowserExecutor({ ...remote, runOptions: options });
|
|
10
|
+
}
|
|
4
11
|
if (provider === "gemini") {
|
|
5
12
|
const { createGeminiWebExecutor } = await import("../gemini-web/index.js");
|
|
6
13
|
return createGeminiWebExecutor({
|
|
@@ -13,7 +20,5 @@ export async function resolveLocalBrowserExecutor(options) {
|
|
|
13
20
|
allowModelFallback: options.geminiAllowModelFallback,
|
|
14
21
|
});
|
|
15
22
|
}
|
|
16
|
-
|
|
17
|
-
return (await import("../browserMode.js")).runBrowserMode;
|
|
18
|
-
throw new Error(`Unsupported browser model: ${options.model}. Use a GPT or Gemini model.`);
|
|
23
|
+
return (await import("../browserMode.js")).runBrowserMode;
|
|
19
24
|
}
|
|
@@ -248,6 +248,8 @@ async function queryProcessStartTimeMs(pid) {
|
|
|
248
248
|
maxBuffer: 1024 * 1024,
|
|
249
249
|
windowsHide: true,
|
|
250
250
|
timeout: 5000,
|
|
251
|
+
// Keep ps timestamps parseable regardless of the user's locale.
|
|
252
|
+
env: { ...process.env, LC_ALL: "C" },
|
|
251
253
|
});
|
|
252
254
|
const startedAt = Date.parse(String(stdout ?? "").trim());
|
|
253
255
|
return Number.isFinite(startedAt) ? startedAt : null;
|
|
@@ -8,4 +8,18 @@ export function resolveBrowserProvider(model) {
|
|
|
8
8
|
return "chatgpt";
|
|
9
9
|
return undefined;
|
|
10
10
|
}
|
|
11
|
-
export
|
|
11
|
+
export function resolveRemoteBrowserModel(model, desiredModel) {
|
|
12
|
+
if (model !== undefined) {
|
|
13
|
+
if (typeof model === "string" && resolveBrowserProvider(model))
|
|
14
|
+
return model;
|
|
15
|
+
throw new Error(`Unsupported browser model: ${String(model)}. Use a GPT or Gemini model.`);
|
|
16
|
+
}
|
|
17
|
+
if (typeof desiredModel === "string" && resolveBrowserProvider(desiredModel))
|
|
18
|
+
return desiredModel;
|
|
19
|
+
// Older ChatGPT clients send only a picker label, or omit the selection entirely.
|
|
20
|
+
if (desiredModel == null ||
|
|
21
|
+
(typeof desiredModel === "string" &&
|
|
22
|
+
/^(?:|latest|auto|pro|thinking|instant)(?:\s.*)?$/i.test(desiredModel.trim())))
|
|
23
|
+
return undefined;
|
|
24
|
+
throw new Error(`Unsupported browser model: ${String(desiredModel)}. Use a GPT or Gemini model.`);
|
|
25
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import chalk from "chalk";
|
|
2
2
|
import { formatTokenCount } from "../oracle/runUtils.js";
|
|
3
3
|
import { formatFinishLine } from "../oracle/finishLine.js";
|
|
4
|
-
import {
|
|
4
|
+
import { resolveBrowserExecutor } from "./executor.js";
|
|
5
5
|
import { DEFAULT_BROWSER_CONFIG } from "./config.js";
|
|
6
6
|
import { redactBrowserConfigForDebugLog } from "./configLogging.js";
|
|
7
7
|
import { assembleBrowserPrompt, cleanupGeneratedBrowserBundles, materializeBrowserFallback, } from "./prompt.js";
|
|
@@ -67,7 +67,7 @@ export async function runBrowserSessionExecution({ runOptions, browserConfig, cw
|
|
|
67
67
|
if (signal?.aborted) {
|
|
68
68
|
throw new BrowserRunCancelledError();
|
|
69
69
|
}
|
|
70
|
-
const executeBrowser = deps.executeBrowser ?? (await
|
|
70
|
+
const executeBrowser = deps.executeBrowser ?? (await resolveBrowserExecutor(runOptions));
|
|
71
71
|
try {
|
|
72
72
|
promptArtifacts = await Promise.race([
|
|
73
73
|
assemblePrompt(runOptions, { cwd }).then(async (artifacts) => {
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
2
|
import os from "node:os";
|
|
3
3
|
import { mkdir } from "node:fs/promises";
|
|
4
|
-
import { launchChrome, connectWithNewTab, closeTab } from "../browser/chromeLifecycle.js";
|
|
4
|
+
import { launchChrome, connectWithNewTab, connectToRemoteChrome, closeTab, } from "../browser/chromeLifecycle.js";
|
|
5
|
+
import { resolveAttachRunningConnection } from "../browser/attachRunning.js";
|
|
5
6
|
import { resolveBrowserConfig } from "../browser/config.js";
|
|
6
7
|
import { readDevToolsPort, writeDevToolsActivePort, writeChromePid, cleanupStaleProfileState, verifyDevToolsReachable, } from "../browser/profileState.js";
|
|
7
8
|
export async function openGeminiBrowserSession(input) {
|
|
@@ -12,8 +13,20 @@ export async function openGeminiBrowserSession(input) {
|
|
|
12
13
|
keepBrowser: browserConfig?.keepBrowser ?? keepBrowserDefault,
|
|
13
14
|
});
|
|
14
15
|
const profileDir = resolvedConfig.manualLoginProfileDir ?? path.join(os.homedir(), ".oracle", "browser-profile");
|
|
15
|
-
await mkdir(profileDir, { recursive: true });
|
|
16
16
|
const keepBrowser = Boolean(resolvedConfig.keepBrowser);
|
|
17
|
+
if (resolvedConfig.attachRunning || resolvedConfig.remoteChrome) {
|
|
18
|
+
const logger = log ?? (() => { });
|
|
19
|
+
const endpoint = await resolveAttachRunningConnection(resolvedConfig, logger);
|
|
20
|
+
const connection = await connectToRemoteChrome(endpoint.host, endpoint.port, logger, "about:blank", endpoint.browserWSEndpoint, { approvalWaitMs: resolvedConfig.approvalWaitMs, fallbackToDefault: false });
|
|
21
|
+
return {
|
|
22
|
+
profileDir: endpoint.profileRoot ?? profileDir,
|
|
23
|
+
port: endpoint.port,
|
|
24
|
+
client: connection.client,
|
|
25
|
+
targetId: connection.targetId,
|
|
26
|
+
close: () => connection.close({ preserveTarget: keepBrowser }),
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
await mkdir(profileDir, { recursive: true });
|
|
17
30
|
let port = await readDevToolsPort(profileDir);
|
|
18
31
|
let launchedChrome = null;
|
|
19
32
|
let chromeWasLaunched = false;
|
|
@@ -228,7 +228,7 @@ async function loadGeminiCookies(browserConfig, log, options) {
|
|
|
228
228
|
if (hasInlineRequired) {
|
|
229
229
|
return inlineResult;
|
|
230
230
|
}
|
|
231
|
-
const manualNoKeychain = Boolean(browserConfig?.manualLogin) || Boolean(options?.preferManualNoKeychain);
|
|
231
|
+
const manualNoKeychain = Boolean(browserConfig?.manualLogin || browserConfig?.attachRunning || browserConfig?.remoteChrome) || Boolean(options?.preferManualNoKeychain);
|
|
232
232
|
if (manualNoKeychain) {
|
|
233
233
|
log?.("[gemini-web] Using manual-login cookie extraction path (no keychain cookie read).");
|
|
234
234
|
const cdpResult = await loadGeminiCookiesFromCDP(browserConfig, log);
|
|
@@ -1,6 +1,15 @@
|
|
|
1
|
+
import { EnvHttpProxyAgent } from "undici";
|
|
2
|
+
// Gemini's /app policy/reporting headers exceed Node's default 16 KiB limit.
|
|
3
|
+
const GEMINI_MAX_HEADER_SIZE = 64 * 1024;
|
|
4
|
+
let geminiDispatcher;
|
|
5
|
+
export function createGeminiWebDispatcher(options = {}) {
|
|
6
|
+
return new EnvHttpProxyAgent({ ...options, maxHeaderSize: GEMINI_MAX_HEADER_SIZE });
|
|
7
|
+
}
|
|
1
8
|
export async function fetchGeminiWebResource(url, init = {}) {
|
|
2
9
|
try {
|
|
3
|
-
|
|
10
|
+
const dispatcher = init.dispatcher ?? (geminiDispatcher ??= createGeminiWebDispatcher());
|
|
11
|
+
const options = { ...init, dispatcher };
|
|
12
|
+
return await fetch(url, options);
|
|
4
13
|
}
|
|
5
14
|
catch (error) {
|
|
6
15
|
const cause = error instanceof Error ? error.cause : undefined;
|
|
@@ -8,7 +17,7 @@ export async function fetchGeminiWebResource(url, init = {}) {
|
|
|
8
17
|
typeof cause === "object" &&
|
|
9
18
|
"code" in cause &&
|
|
10
19
|
cause.code === "UND_ERR_HEADERS_OVERFLOW") {
|
|
11
|
-
throw new Error("Gemini response headers exceed
|
|
20
|
+
throw new Error("Gemini response headers exceed the HTTP transport's configured limit (Oracle's default is 64 KiB).", { cause: error });
|
|
12
21
|
}
|
|
13
22
|
throw error;
|
|
14
23
|
}
|
|
@@ -11,16 +11,18 @@ import { checkRemoteHealth } from "./health.js";
|
|
|
11
11
|
import { parseHostPort } from "../bridge/connection.js";
|
|
12
12
|
import { BrowserRunCancelledError } from "../oracle/errors.js";
|
|
13
13
|
import { resolveSiblingImagePath } from "../browser/chatgptImages.js";
|
|
14
|
-
import { resolveBrowserProvider,
|
|
15
|
-
export function createRemoteBrowserExecutor({ host, token }) {
|
|
14
|
+
import { resolveBrowserProvider, resolveRemoteBrowserModel } from "../browser/provider.js";
|
|
15
|
+
export function createRemoteBrowserExecutor({ host, token, runOptions }) {
|
|
16
16
|
// Return a drop-in replacement for runBrowserMode so the browser session runner can stay unchanged.
|
|
17
17
|
return async function remoteBrowserExecutor(options) {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
18
|
+
const model = resolveRemoteBrowserModel(options.model ?? runOptions?.model, options.config?.desiredModel);
|
|
19
|
+
const gemini = resolveBrowserProvider(model) === "gemini";
|
|
20
|
+
if (gemini &&
|
|
21
|
+
(runOptions?.editImage ||
|
|
22
|
+
runOptions?.generateImage ||
|
|
23
|
+
options.generateImagePath ||
|
|
24
|
+
options.outputPath)) {
|
|
25
|
+
throw new Error("Remote Gemini image generation and editing are not supported; run these requests locally.");
|
|
24
26
|
}
|
|
25
27
|
if (options.config?.researchMode === "search") {
|
|
26
28
|
throw new Error("Web Search is a local browser pilot; --remote-host does not negotiate this capability yet. Use local Chrome or --browser-attach-running.");
|
|
@@ -46,8 +48,22 @@ export function createRemoteBrowserExecutor({ host, token }) {
|
|
|
46
48
|
prompt: options.prompt,
|
|
47
49
|
attachments: await serializeAttachments(options.attachments ?? []),
|
|
48
50
|
fallbackSubmission: await serializeFallback(options.fallbackSubmission, { host, token }),
|
|
49
|
-
browserConfig:
|
|
51
|
+
browserConfig: {
|
|
52
|
+
...options.config,
|
|
53
|
+
// Keep old hosts fail-closed for Gemini even when the picker label is unrelated.
|
|
54
|
+
...(gemini ? { desiredModel: model } : {}),
|
|
55
|
+
inlineCookies: null,
|
|
56
|
+
inlineCookiesSource: null,
|
|
57
|
+
},
|
|
50
58
|
options: {
|
|
59
|
+
model,
|
|
60
|
+
...(gemini
|
|
61
|
+
? {
|
|
62
|
+
youtube: runOptions?.youtube,
|
|
63
|
+
geminiShowThoughts: runOptions?.geminiShowThoughts,
|
|
64
|
+
geminiAllowModelFallback: runOptions?.geminiAllowModelFallback,
|
|
65
|
+
}
|
|
66
|
+
: {}),
|
|
51
67
|
heartbeatIntervalMs: options.heartbeatIntervalMs,
|
|
52
68
|
verbose: options.verbose,
|
|
53
69
|
sessionId: options.sessionId,
|
|
@@ -9,7 +9,7 @@ import { spawn, spawnSync } from "node:child_process";
|
|
|
9
9
|
import { mkdtemp, rm, mkdir, writeFile, stat, realpath } from "node:fs/promises";
|
|
10
10
|
import chalk from "chalk";
|
|
11
11
|
import { materializeStagedFallbackBundle } from "../browser/prompt.js";
|
|
12
|
-
import {
|
|
12
|
+
import { resolveBrowserExecutor } from "../browser/executor.js";
|
|
13
13
|
import { resolveBrowserConfig } from "../browser/config.js";
|
|
14
14
|
import { RunSlots } from "./runSlots.js";
|
|
15
15
|
export { RunSlots } from "./runSlots.js";
|
|
@@ -19,7 +19,7 @@ import { getCookies } from "@steipete/sweet-cookie";
|
|
|
19
19
|
import { CHATGPT_URL } from "../browser/constants.js";
|
|
20
20
|
import { getCliVersion } from "../version.js";
|
|
21
21
|
import { getOracleHomeDir } from "../oracleHome.js";
|
|
22
|
-
import { resolveBrowserProvider,
|
|
22
|
+
import { resolveBrowserProvider, resolveRemoteBrowserModel } from "../browser/provider.js";
|
|
23
23
|
import { cleanupStaleProfileState, readDevToolsPort, verifyDevToolsReachable, writeChromePid, writeDevToolsActivePort, } from "../browser/profileState.js";
|
|
24
24
|
import { normalizeChatgptUrl } from "../browser/utils.js";
|
|
25
25
|
import { computeFileSha256, resolveSessionArtifactsDir, sanitizeArtifactFilename, sanitizeArtifactMimeType, validateArtifactFile, } from "../browser/artifacts.js";
|
|
@@ -60,7 +60,6 @@ function validateAdmissionOptions(options) {
|
|
|
60
60
|
throw new Error("--max-queued-runs must be a nonnegative integer.");
|
|
61
61
|
}
|
|
62
62
|
export async function createRemoteServer(options = {}, deps = {}) {
|
|
63
|
-
const runBrowser = deps.runBrowser ?? runBrowserMode;
|
|
64
63
|
const attachedBrowser = usesHostBrowserAttachment(options.browserConfig);
|
|
65
64
|
const manualLoginDefault = !attachedBrowser && options.manualLoginDefault;
|
|
66
65
|
const hostBrowserConfig = options.browserConfig
|
|
@@ -231,13 +230,20 @@ export async function createRemoteServer(options = {}, deps = {}) {
|
|
|
231
230
|
await abandon();
|
|
232
231
|
return;
|
|
233
232
|
}
|
|
234
|
-
|
|
233
|
+
let model;
|
|
234
|
+
try {
|
|
235
|
+
model = resolveRemoteBrowserModel(payload.options.model, payload.browserConfig?.desiredModel);
|
|
236
|
+
if (resolveBrowserProvider(model) === "gemini" && payload.options.imageOutputRequested) {
|
|
237
|
+
throw new Error("Remote Gemini image generation and editing are not supported; run these requests locally.");
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
catch (error) {
|
|
235
241
|
await abandon();
|
|
236
242
|
if (!res.destroyed) {
|
|
237
243
|
res.writeHead(400, { "Content-Type": "application/json" });
|
|
238
244
|
res.end(JSON.stringify({
|
|
239
245
|
error: "unsupported_browser_provider",
|
|
240
|
-
message:
|
|
246
|
+
message: error instanceof Error ? error.message : String(error),
|
|
241
247
|
}));
|
|
242
248
|
}
|
|
243
249
|
return;
|
|
@@ -362,8 +368,16 @@ export async function createRemoteServer(options = {}, deps = {}) {
|
|
|
362
368
|
logger(`[serve] Enforcing manual-login profile at ${options.manualLoginProfileDir ?? "default"} for remote run ${runId}`);
|
|
363
369
|
}
|
|
364
370
|
}
|
|
371
|
+
const runBrowser = deps.runBrowser ??
|
|
372
|
+
(await resolveBrowserExecutor({
|
|
373
|
+
model: model ?? "gpt-5.5",
|
|
374
|
+
youtube: typeof payload.options.youtube === "string" ? payload.options.youtube : undefined,
|
|
375
|
+
geminiShowThoughts: payload.options.geminiShowThoughts === true,
|
|
376
|
+
geminiAllowModelFallback: payload.options.geminiAllowModelFallback !== false,
|
|
377
|
+
}));
|
|
365
378
|
const result = await runBrowser({
|
|
366
379
|
prompt: payload.prompt,
|
|
380
|
+
model,
|
|
367
381
|
attachments,
|
|
368
382
|
fallbackSubmission,
|
|
369
383
|
config: payload.browserConfig,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@steipete/oracle",
|
|
3
|
-
"version": "0.21.
|
|
3
|
+
"version": "0.21.2",
|
|
4
4
|
"description": "CLI wrapper around OpenAI Responses API with GPT-5.6 Sol, GPT-5.6, GPT-5.5 Pro, GPT-5.5, GPT-5.4, GPT-5.2, GPT-5.1, and GPT-5.1 Codex high reasoning modes.",
|
|
5
5
|
"keywords": [],
|
|
6
6
|
"homepage": "https://askoracle.sh",
|
|
@@ -58,7 +58,7 @@
|
|
|
58
58
|
},
|
|
59
59
|
"dependencies": {
|
|
60
60
|
"@anthropic-ai/tokenizer": "^0.0.4",
|
|
61
|
-
"@google/genai": "^2.
|
|
61
|
+
"@google/genai": "^2.23.0",
|
|
62
62
|
"@modelcontextprotocol/server": "^2.0.0",
|
|
63
63
|
"@steipete/sweet-cookie": "^0.4.3",
|
|
64
64
|
"chalk": "^6.0.0",
|
|
@@ -72,30 +72,31 @@
|
|
|
72
72
|
"inquirer": "14.2.2",
|
|
73
73
|
"json5": "^2.2.3",
|
|
74
74
|
"kleur": "^4.1.5",
|
|
75
|
-
"markdansi": "0.3.
|
|
76
|
-
"openai": "^7.
|
|
75
|
+
"markdansi": "0.3.4",
|
|
76
|
+
"openai": "^7.20.0",
|
|
77
77
|
"osc-progress": "^0.3.3",
|
|
78
78
|
"qs": "^6.16.0",
|
|
79
79
|
"shiki": "^4.4.3",
|
|
80
80
|
"toasted-notifier": "^10.1.0",
|
|
81
81
|
"tokentally": "^0.1.6",
|
|
82
|
+
"undici": "^7.29.1",
|
|
82
83
|
"zod": "^4.6.2"
|
|
83
84
|
},
|
|
84
85
|
"devDependencies": {
|
|
85
86
|
"@modelcontextprotocol/client": "^2.0.0",
|
|
86
87
|
"@modelcontextprotocol/sdk": "^1.30.0",
|
|
87
88
|
"@types/chrome-remote-interface": "^0.34.0",
|
|
88
|
-
"@types/node": "^26.
|
|
89
|
-
"@vitest/coverage-v8": "5.0.
|
|
90
|
-
"devtools-protocol": "0.0.
|
|
89
|
+
"@types/node": "^26.6.2",
|
|
90
|
+
"@vitest/coverage-v8": "5.0.1",
|
|
91
|
+
"devtools-protocol": "0.0.1701330",
|
|
91
92
|
"es-toolkit": "^1.52.0",
|
|
92
93
|
"esbuild": "^0.28.2",
|
|
93
|
-
"oxfmt": "0.
|
|
94
|
+
"oxfmt": "0.68.0",
|
|
94
95
|
"oxlint": "^1.82.0",
|
|
95
96
|
"puppeteer-core": "^25.10.0",
|
|
96
97
|
"tsx": "^4.23.13",
|
|
97
98
|
"typescript": "^7.0.2",
|
|
98
|
-
"vitest": "5.0.
|
|
99
|
+
"vitest": "5.0.1"
|
|
99
100
|
},
|
|
100
101
|
"devEngines": {
|
|
101
102
|
"runtime": [
|
|
@@ -108,5 +109,5 @@
|
|
|
108
109
|
"engines": {
|
|
109
110
|
"node": ">=24"
|
|
110
111
|
},
|
|
111
|
-
"packageManager": "pnpm@11.
|
|
112
|
+
"packageManager": "pnpm@11.27.0"
|
|
112
113
|
}
|
package/dist/docs-site/.nojekyll
DELETED
|
File without changes
|
package/dist/docs-site/CNAME
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
askoracle.sh
|