@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.
Files changed (47) hide show
  1. package/dist/bin/oracle-cli.js +14 -15
  2. package/dist/src/browser/executor.js +9 -4
  3. package/dist/src/browser/profileState.js +2 -0
  4. package/dist/src/browser/provider.js +15 -1
  5. package/dist/src/browser/sessionRunner.js +2 -2
  6. package/dist/src/gemini-web/browserSessionManager.js +15 -2
  7. package/dist/src/gemini-web/executor.js +1 -1
  8. package/dist/src/gemini-web/http.js +11 -2
  9. package/dist/src/remote/client.js +25 -9
  10. package/dist/src/remote/server.js +19 -5
  11. package/package.json +11 -10
  12. package/dist/docs-site/.nojekyll +0 -0
  13. package/dist/docs-site/CNAME +0 -1
  14. package/dist/docs-site/RELEASING.html +0 -403
  15. package/dist/docs-site/advisor.html +0 -317
  16. package/dist/docs-site/agents.html +0 -375
  17. package/dist/docs-site/anthropic.html +0 -368
  18. package/dist/docs-site/bridge.html +0 -421
  19. package/dist/docs-site/browser-mode.html +0 -636
  20. package/dist/docs-site/chromium-forks.html +0 -355
  21. package/dist/docs-site/cli-reference.html +0 -347
  22. package/dist/docs-site/configuration.html +0 -464
  23. package/dist/docs-site/favicon.svg +0 -14
  24. package/dist/docs-site/followup.html +0 -375
  25. package/dist/docs-site/gemini.html +0 -387
  26. package/dist/docs-site/grok.html +0 -325
  27. package/dist/docs-site/index.html +0 -360
  28. package/dist/docs-site/install.html +0 -335
  29. package/dist/docs-site/linux.html +0 -321
  30. package/dist/docs-site/llms.txt +0 -44
  31. package/dist/docs-site/manual-tests.html +0 -621
  32. package/dist/docs-site/mcp.html +0 -412
  33. package/dist/docs-site/multimodel.html +0 -364
  34. package/dist/docs-site/mythical-pro-agents.html +0 -360
  35. package/dist/docs-site/notifier.html +0 -338
  36. package/dist/docs-site/openai-endpoints.html +0 -417
  37. package/dist/docs-site/openrouter.html +0 -344
  38. package/dist/docs-site/quickstart.html +0 -369
  39. package/dist/docs-site/refactor/ux.html +0 -321
  40. package/dist/docs-site/sessions.html +0 -397
  41. package/dist/docs-site/social-card.png +0 -0
  42. package/dist/docs-site/social-card.svg +0 -79
  43. package/dist/docs-site/spec.html +0 -363
  44. package/dist/docs-site/testing.html +0 -323
  45. package/dist/docs-site/tui-debug.html +0 -326
  46. package/dist/docs-site/windows-work.html +0 -348
  47. package/dist/docs-site/windows.html +0 -320
@@ -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.opts();
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 { createRemoteBrowserExecutor } = await import("../src/remote/client.js");
1461
+ const { resolveBrowserExecutor } = await import("../src/browser/executor.js");
1466
1462
  browserDeps = {
1467
- executeBrowser: createRemoteBrowserExecutor({ host: remoteHost, token: remoteToken }),
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 { createRemoteBrowserExecutor } = await import("../src/remote/client.js");
1775
+ const { resolveBrowserExecutor } = await import("../src/browser/executor.js");
1780
1776
  browserDeps = {
1781
- executeBrowser: createRemoteBrowserExecutor({ host: remoteHost, token: remoteToken }),
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 resolveLocalBrowserExecutor(options) {
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
- if (provider === "chatgpt")
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 const REMOTE_GEMINI_UNSUPPORTED_MESSAGE = "Gemini browser runs are supported locally; remote browser services support ChatGPT only.";
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 { resolveLocalBrowserExecutor } from "./executor.js";
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 resolveLocalBrowserExecutor(runOptions));
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
- return await fetch(url, init);
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 Node's configured limit. Start Oracle with NODE_OPTIONS=--max-http-header-size=65536 (preserving any existing Node options) and retry.", { cause: error });
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, REMOTE_GEMINI_UNSUPPORTED_MESSAGE } from "../browser/provider.js";
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
- if (options.model !== undefined && !resolveBrowserProvider(options.model)) {
19
- throw new Error(`Unsupported browser model: ${options.model}. Remote services support ChatGPT only.`);
20
- }
21
- if (resolveBrowserProvider(options.model) === "gemini" ||
22
- resolveBrowserProvider(options.config?.desiredModel) === "gemini") {
23
- throw new Error(REMOTE_GEMINI_UNSUPPORTED_MESSAGE);
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: options.config ?? {},
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 { runBrowserMode } from "../browserMode.js";
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, REMOTE_GEMINI_UNSUPPORTED_MESSAGE } from "../browser/provider.js";
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
- if (resolveBrowserProvider(payload.browserConfig?.desiredModel) === "gemini") {
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: REMOTE_GEMINI_UNSUPPORTED_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.0",
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.22.0",
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.3",
76
- "openai": "^7.15.0",
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.5.1",
89
- "@vitest/coverage-v8": "5.0.0",
90
- "devtools-protocol": "0.0.1695952",
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.67.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.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.26.0"
112
+ "packageManager": "pnpm@11.27.0"
112
113
  }
File without changes
@@ -1 +0,0 @@
1
- askoracle.sh