@steipete/oracle 0.14.0 → 0.14.1

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 (69) hide show
  1. package/README.md +2 -2
  2. package/dist/bin/oracle-cli.js +8 -8
  3. package/dist/src/browser/actions/assistantResponse.js +2 -1
  4. package/dist/src/browser/actions/modelSelection.js +344 -29
  5. package/dist/src/browser/actions/thinkingTime.js +239 -46
  6. package/dist/src/browser/chatgptImages.js +126 -24
  7. package/dist/src/browser/index.js +63 -8
  8. package/dist/src/browser/projectSourcesRunner.js +2 -1
  9. package/dist/src/browser/prompt.js +151 -22
  10. package/dist/src/cli/browserConfig.js +2 -1
  11. package/dist/src/cli/browserDefaults.js +2 -1
  12. package/dist/src/cli/options.js +8 -0
  13. package/dist/src/mcp/tools/chatgptImage.js +8 -3
  14. package/dist/src/mcp/tools/consult.js +9 -8
  15. package/dist/src/mcp/types.js +11 -2
  16. package/dist/src/oracle/thinkingTime.js +40 -0
  17. package/dist/vendor/oracle-notifier/build-notifier.sh +0 -0
  18. package/package.json +32 -34
  19. package/vendor/oracle-notifier/build-notifier.sh +0 -0
  20. package/dist/bin/oracle.js +0 -569
  21. package/dist/docs-site/.nojekyll +0 -0
  22. package/dist/docs-site/CNAME +0 -1
  23. package/dist/docs-site/RELEASING.html +0 -410
  24. package/dist/docs-site/agents.html +0 -374
  25. package/dist/docs-site/anthropic.html +0 -368
  26. package/dist/docs-site/bridge.html +0 -400
  27. package/dist/docs-site/browser-mode.html +0 -593
  28. package/dist/docs-site/chromium-forks.html +0 -347
  29. package/dist/docs-site/cli-reference.html +0 -346
  30. package/dist/docs-site/configuration.html +0 -452
  31. package/dist/docs-site/favicon.svg +0 -14
  32. package/dist/docs-site/followup.html +0 -375
  33. package/dist/docs-site/gemini.html +0 -383
  34. package/dist/docs-site/grok.html +0 -325
  35. package/dist/docs-site/index.html +0 -360
  36. package/dist/docs-site/install.html +0 -335
  37. package/dist/docs-site/linux.html +0 -321
  38. package/dist/docs-site/llms.txt +0 -43
  39. package/dist/docs-site/manual-tests.html +0 -596
  40. package/dist/docs-site/mcp.html +0 -391
  41. package/dist/docs-site/multimodel.html +0 -364
  42. package/dist/docs-site/mythical-pro-agents.html +0 -360
  43. package/dist/docs-site/notifier.html +0 -338
  44. package/dist/docs-site/openai-endpoints.html +0 -387
  45. package/dist/docs-site/openrouter.html +0 -344
  46. package/dist/docs-site/quickstart.html +0 -369
  47. package/dist/docs-site/refactor/ux.html +0 -532
  48. package/dist/docs-site/sessions.html +0 -388
  49. package/dist/docs-site/social-card.png +0 -0
  50. package/dist/docs-site/social-card.svg +0 -79
  51. package/dist/docs-site/spec.html +0 -363
  52. package/dist/docs-site/testing.html +0 -320
  53. package/dist/docs-site/tui-debug.html +0 -326
  54. package/dist/docs-site/windows-work.html +0 -323
  55. package/dist/docs-site/windows.html +0 -320
  56. package/dist/src/browser/chromeCookies.js +0 -312
  57. package/dist/src/browser/keytarShim.js +0 -56
  58. package/dist/src/browser/windowsCookies.js +0 -219
  59. package/dist/vendor/oracle-notifier/OracleNotifier.app/Contents/CodeResources +0 -0
  60. package/dist/vendor/oracle-notifier/OracleNotifier.app/Contents/Info.plist +0 -20
  61. package/dist/vendor/oracle-notifier/OracleNotifier.app/Contents/MacOS/OracleNotifier +0 -0
  62. package/dist/vendor/oracle-notifier/OracleNotifier.app/Contents/Resources/OracleIcon.icns +0 -0
  63. package/dist/vendor/oracle-notifier/OracleNotifier.app/Contents/_CodeSignature/CodeResources +0 -128
  64. package/vendor/oracle-notifier/OracleNotifier.app/Contents/CodeResources +0 -0
  65. package/vendor/oracle-notifier/OracleNotifier.app/Contents/Info.plist +0 -20
  66. package/vendor/oracle-notifier/OracleNotifier.app/Contents/MacOS/OracleNotifier +0 -0
  67. package/vendor/oracle-notifier/OracleNotifier.app/Contents/Resources/OracleIcon.icns +0 -0
  68. package/vendor/oracle-notifier/OracleNotifier.app/Contents/_CodeSignature/CodeResources +0 -128
  69. package/vendor/oracle-notifier/README.md +0 -26
@@ -3,6 +3,7 @@ import { parseDuration } from "../duration.js";
3
3
  import path from "node:path";
4
4
  import fg from "fast-glob";
5
5
  import { DEFAULT_MODEL, MODEL_CONFIGS } from "../oracle/config.js";
6
+ import { normalizeThinkingTimeLevel } from "../oracle/thinkingTime.js";
6
7
  export function collectPaths(value, previous = []) {
7
8
  if (!value) {
8
9
  return previous;
@@ -127,6 +128,13 @@ export function parseSearchOption(value) {
127
128
  }
128
129
  throw new InvalidArgumentError('Search mode must be "on" or "off".');
129
130
  }
131
+ export function parseThinkingTimeOption(value) {
132
+ const normalized = normalizeThinkingTimeLevel(value);
133
+ if (normalized) {
134
+ return normalized;
135
+ }
136
+ throw new InvalidArgumentError('Thinking time must be one of "light", "standard", "extended", "heavy", or a ChatGPT UI alias like "instant", "medium", "high", or "extra-high".');
137
+ }
130
138
  export function normalizeModelOption(value) {
131
139
  return (value ?? "").trim();
132
140
  }
@@ -2,6 +2,7 @@ import path from "node:path";
2
2
  import { randomUUID } from "node:crypto";
3
3
  import { z } from "zod";
4
4
  import { getOracleHomeDir } from "../../oracleHome.js";
5
+ import { browserThinkingTimeInputSchema, browserThinkingTimeRawSchema, } from "../types.js";
5
6
  import { consultOutputShape, runConsultTool } from "./consult.js";
6
7
  const chatGptImageInputShape = {
7
8
  prompt: z.string().min(1, "Prompt is required.").describe("Image generation prompt."),
@@ -29,8 +30,7 @@ const chatGptImageInputShape = {
29
30
  .enum(["auto", "never", "always"])
30
31
  .optional()
31
32
  .describe('How to deliver files. Defaults to "always" when files are present so reference images are uploaded.'),
32
- browserThinkingTime: z
33
- .enum(["light", "standard", "extended", "heavy"])
33
+ browserThinkingTime: browserThinkingTimeRawSchema
34
34
  .optional()
35
35
  .describe("Set ChatGPT thinking time when supported by the chosen model."),
36
36
  browserModelStrategy: z
@@ -58,7 +58,12 @@ const chatGptImageOutputShape = {
58
58
  ...consultOutputShape,
59
59
  requestedOutputPath: z.string(),
60
60
  };
61
- const chatGptImageInputSchema = z.object(chatGptImageInputShape).strict();
61
+ const chatGptImageInputSchema = z
62
+ .object({
63
+ ...chatGptImageInputShape,
64
+ browserThinkingTime: browserThinkingTimeInputSchema.optional(),
65
+ })
66
+ .strict();
62
67
  function resolveDefaultImageOutputPath() {
63
68
  // Include a random token so concurrent agent calls in the same millisecond do
64
69
  // not resolve to the same default path and overwrite each other.
@@ -20,11 +20,12 @@ async function readSessionLogTail(sessionId, maxBytes) {
20
20
  import { performSessionRun } from "../../cli/sessionRunner.js";
21
21
  import { runDryRunSummary } from "../../cli/dryRun.js";
22
22
  import { CHATGPT_URL } from "../../browser/constants.js";
23
- import { CONSULT_PRESETS, consultInputSchema } from "../types.js";
23
+ import { CONSULT_PRESETS, browserThinkingTimeRawSchema, consultInputSchema } from "../types.js";
24
24
  import { applyConsultPreset } from "../consultPresets.js";
25
25
  import { loadUserConfig } from "../../config.js";
26
26
  import { resolveNotificationSettings } from "../../cli/notifier.js";
27
27
  import { mapModelToBrowserLabel, resolveBrowserModelLabel } from "../../cli/browserConfig.js";
28
+ import { normalizeThinkingTimeLevel } from "../../oracle/thinkingTime.js";
28
29
  // Use raw shapes so the MCP SDK (with its bundled Zod) wraps them and emits valid JSON Schema.
29
30
  const consultInputShape = {
30
31
  preset: z
@@ -61,11 +62,10 @@ const consultInputShape = {
61
62
  .optional()
62
63
  .describe("Browser-only: bundle many files into a single upload (helps with upload limits)."),
63
64
  browserBundleFormat: z
64
- .enum(["text", "zip"])
65
+ .enum(["auto", "text", "zip"])
65
66
  .optional()
66
- .describe('Browser-only: bundle upload format when browserBundleFiles is true or auto-bundling is needed. Defaults to "text"; "zip" preserves individual file names in one uploaded archive.'),
67
- browserThinkingTime: z
68
- .enum(["light", "standard", "extended", "heavy"])
67
+ .describe('Browser-only: bundle upload format when browserBundleFiles is true or auto-bundling is needed. Defaults to "auto"; "auto" uses ZIP when bundled inputs include raw/binary files.'),
68
+ browserThinkingTime: browserThinkingTimeRawSchema
69
69
  .optional()
70
70
  .describe("Browser-only: set ChatGPT thinking time when supported by the chosen model."),
71
71
  browserModelStrategy: z
@@ -166,7 +166,7 @@ const consultDryRunResolvedShape = z.object({
166
166
  researchMode: z.string().nullable().optional(),
167
167
  attachments: z.string().optional(),
168
168
  bundleFiles: z.boolean().optional(),
169
- bundleFormat: z.enum(["text", "zip"]).optional(),
169
+ bundleFormat: z.enum(["auto", "text", "zip"]).optional(),
170
170
  keepBrowser: z.boolean().optional(),
171
171
  manualLogin: z.boolean().optional(),
172
172
  profileDir: z.string().nullable().optional(),
@@ -266,6 +266,7 @@ export function buildConsultBrowserConfig({ userConfig, env, runModel, inputMode
266
266
  const manualLogin = hasProfileDir
267
267
  ? true
268
268
  : (configuredBrowser.manualLogin ?? process.platform === "win32");
269
+ const configuredThinkingTime = normalizeThinkingTimeLevel(configuredBrowser.thinkingTime);
269
270
  return {
270
271
  ...configuredBrowser,
271
272
  url: configuredUrl,
@@ -278,7 +279,7 @@ export function buildConsultBrowserConfig({ userConfig, env, runModel, inputMode
278
279
  manualLoginProfileDir: manualLogin
279
280
  ? ((envProfileDir || configuredBrowser.manualLoginProfileDir) ?? null)
280
281
  : null,
281
- thinkingTime: browserThinkingTime ?? configuredBrowser.thinkingTime,
282
+ thinkingTime: browserThinkingTime ?? configuredThinkingTime ?? undefined,
282
283
  modelStrategy: browserModelStrategy ?? configuredBrowser.modelStrategy,
283
284
  researchMode: browserResearchMode ?? configuredBrowser.researchMode,
284
285
  archiveConversations: browserArchive ?? configuredBrowser.archiveConversations,
@@ -358,7 +359,7 @@ export function formatConsultDryRunResolved(details) {
358
359
  lines.push(` browser research mode: ${details.browser.researchMode ?? "off"}`);
359
360
  lines.push(` browser attachments: ${details.browser.attachments ?? "auto"}`);
360
361
  lines.push(` browser bundle files: ${details.browser.bundleFiles ? "yes" : "no"}`);
361
- lines.push(` browser bundle format: ${details.browser.bundleFormat ?? "text"}`);
362
+ lines.push(` browser bundle format: ${details.browser.bundleFormat ?? "auto"}`);
362
363
  lines.push(` browser keep browser: ${details.browser.keepBrowser ? "yes" : "no"}`);
363
364
  lines.push(` browser manual login: ${details.browser.manualLogin ? "yes" : "no"}`);
364
365
  if (details.browser.profileDir) {
@@ -1,5 +1,14 @@
1
1
  import { z } from "zod";
2
+ import { THINKING_TIME_INPUT_VALUES, normalizeThinkingTimeLevel } from "../oracle/thinkingTime.js";
2
3
  export const CONSULT_PRESETS = ["chatgpt-pro-heavy"];
4
+ export const browserThinkingTimeRawSchema = z.enum(THINKING_TIME_INPUT_VALUES);
5
+ export const browserThinkingTimeInputSchema = browserThinkingTimeRawSchema.transform((value) => {
6
+ const normalized = normalizeThinkingTimeLevel(value);
7
+ if (!normalized) {
8
+ throw new Error(`Unknown browserThinkingTime value: ${value}`);
9
+ }
10
+ return normalized;
11
+ });
3
12
  export const consultInputSchema = z
4
13
  .object({
5
14
  preset: z.enum(CONSULT_PRESETS).optional(),
@@ -11,8 +20,8 @@ export const consultInputSchema = z
11
20
  browserModelLabel: z.string().optional(),
12
21
  browserAttachments: z.enum(["auto", "never", "always"]).optional(),
13
22
  browserBundleFiles: z.boolean().optional(),
14
- browserBundleFormat: z.enum(["text", "zip"]).optional(),
15
- browserThinkingTime: z.enum(["light", "standard", "extended", "heavy"]).optional(),
23
+ browserBundleFormat: z.enum(["auto", "text", "zip"]).optional(),
24
+ browserThinkingTime: browserThinkingTimeInputSchema.optional(),
16
25
  browserModelStrategy: z.enum(["select", "current", "ignore"]).optional(),
17
26
  browserResearchMode: z.enum(["deep"]).optional(),
18
27
  browserArchive: z.enum(["auto", "always", "never"]).optional(),
@@ -0,0 +1,40 @@
1
+ export const THINKING_TIME_LEVELS = ["light", "standard", "extended", "heavy"];
2
+ export const THINKING_TIME_ALIASES = [
3
+ "instant",
4
+ "low",
5
+ "medium",
6
+ "high",
7
+ "extra-high",
8
+ "extra high",
9
+ "extrahigh",
10
+ "xhigh",
11
+ ];
12
+ export const THINKING_TIME_INPUT_VALUES = [
13
+ ...THINKING_TIME_LEVELS,
14
+ ...THINKING_TIME_ALIASES,
15
+ ];
16
+ export function normalizeThinkingTimeLevel(value) {
17
+ const normalized = (value ?? "")
18
+ .trim()
19
+ .toLowerCase()
20
+ .replace(/[_\s]+/g, "-");
21
+ switch (normalized) {
22
+ case "light":
23
+ case "instant":
24
+ case "low":
25
+ return "light";
26
+ case "standard":
27
+ case "medium":
28
+ return "standard";
29
+ case "extended":
30
+ case "high":
31
+ return "extended";
32
+ case "heavy":
33
+ case "extra-high":
34
+ case "extrahigh":
35
+ case "xhigh":
36
+ return "heavy";
37
+ default:
38
+ return null;
39
+ }
40
+ }
File without changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@steipete/oracle",
3
- "version": "0.14.0",
3
+ "version": "0.14.1",
4
4
  "description": "CLI wrapper around OpenAI Responses API with 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",
@@ -28,40 +28,12 @@
28
28
  ],
29
29
  "type": "module",
30
30
  "main": "dist/bin/oracle-cli.js",
31
- "scripts": {
32
- "docs:list": "tsx scripts/docs-list.ts",
33
- "docs:check": "node --no-deprecation --import tsx bin/oracle-cli.ts docs check",
34
- "docs:site": "node scripts/build-docs-site.mjs",
35
- "build": "tsgo -p tsconfig.build.json && pnpm run build:vendor",
36
- "build:vendor": "node -e \"const fs=require('fs'); const path=require('path'); const vendorRoot=path.join('dist','vendor'); fs.rmSync(vendorRoot,{recursive:true,force:true}); const vendors=[['oracle-notifier']]; vendors.forEach(([name])=>{const src=path.join('vendor',name); const dest=path.join(vendorRoot,name); fs.mkdirSync(dest,{recursive:true}); if(fs.existsSync(src)){fs.cpSync(src,dest,{recursive:true,force:true});}});\"",
37
- "start": "pnpm run build && node ./dist/scripts/run-cli.js",
38
- "oracle": "pnpm start",
39
- "check": "pnpm run format:check && pnpm run lint",
40
- "typecheck": "tsgo --noEmit",
41
- "format": "oxfmt --write .",
42
- "format:check": "oxfmt --check .",
43
- "format:diff": "oxfmt --write . && git --no-pager diff",
44
- "lint": "pnpm run typecheck && oxlint",
45
- "lint:fix": "oxlint --fix && pnpm run format",
46
- "test": "vitest run",
47
- "test:mcp": "pnpm run build && pnpm run test:mcp:unit && pnpm run test:mcp:mcporter",
48
- "test:mcp:unit": "vitest run tests/mcp*.test.ts tests/mcp/**/*.test.ts",
49
- "test:mcp:mcporter": "CHROME_DEVTOOLS_URL=http://127.0.0.1:0 pnpm dlx mcporter list oracle-local --schema --config config/mcporter.json && CHROME_DEVTOOLS_URL=http://127.0.0.1:0 pnpm dlx mcporter call oracle-local.sessions limit:1 --config config/mcporter.json",
50
- "test:browser": "pnpm run build && tsx scripts/test-browser.ts && ./scripts/browser-smoke.sh",
51
- "test:packed-cli": "node scripts/packed-cli-smoke.mjs",
52
- "test:live": "ORACLE_LIVE_TEST=1 vitest run tests/live --exclude tests/live/openai-live.test.ts",
53
- "test:live:fast": "ORACLE_LIVE_TEST=1 ORACLE_LIVE_TEST_FAST=1 vitest run tests/live/browser-fast-live.test.ts",
54
- "test:pro": "ORACLE_LIVE_TEST=1 vitest run tests/live/openai-live.test.ts",
55
- "test:coverage": "vitest run --coverage",
56
- "prepare": "pnpm run build",
57
- "mcp": "pnpm run build && node ./dist/bin/oracle-mcp.js"
58
- },
59
31
  "dependencies": {
60
32
  "@anthropic-ai/tokenizer": "^0.0.4",
61
33
  "@google/genai": "^2.8.0",
62
34
  "@google/generative-ai": "^0.24.1",
63
35
  "@modelcontextprotocol/sdk": "^1.29.0",
64
- "@steipete/sweet-cookie": "^0.3.0",
36
+ "@steipete/sweet-cookie": "^0.4.0",
65
37
  "chalk": "^5.6.2",
66
38
  "chrome-launcher": "^1.2.1",
67
39
  "chrome-remote-interface": "^0.34.0",
@@ -73,7 +45,7 @@
73
45
  "inquirer": "14.0.2",
74
46
  "json5": "^2.2.3",
75
47
  "kleur": "^4.1.5",
76
- "markdansi": "0.2.1",
48
+ "markdansi": "0.3.1",
77
49
  "openai": "^6.42.0",
78
50
  "osc-progress": "^0.3.0",
79
51
  "qs": "^6.15.2",
@@ -87,7 +59,7 @@
87
59
  "@types/chrome-remote-interface": "^0.34.0",
88
60
  "@types/inquirer": "^9.0.9",
89
61
  "@types/node": "^25.9.2",
90
- "@typescript/native-preview": "7.0.0-dev.20260609.1",
62
+ "@typescript/native-preview": "7.0.0-dev.20260612.1",
91
63
  "@vitest/coverage-v8": "4.1.8",
92
64
  "devtools-protocol": "0.0.1643702",
93
65
  "es-toolkit": "^1.47.0",
@@ -110,5 +82,31 @@
110
82
  "engines": {
111
83
  "node": ">=24"
112
84
  },
113
- "packageManager": "pnpm@10.33.2"
114
- }
85
+ "scripts": {
86
+ "docs:list": "tsx scripts/docs-list.ts",
87
+ "docs:check": "node --no-deprecation --import tsx bin/oracle-cli.ts docs check",
88
+ "docs:site": "node scripts/build-docs-site.mjs",
89
+ "build": "tsgo -p tsconfig.build.json && pnpm run build:vendor",
90
+ "build:vendor": "node -e \"const fs=require('fs'); const path=require('path'); const vendorRoot=path.join('dist','vendor'); fs.rmSync(vendorRoot,{recursive:true,force:true}); const vendors=[['oracle-notifier']]; vendors.forEach(([name])=>{const src=path.join('vendor',name); const dest=path.join(vendorRoot,name); fs.mkdirSync(dest,{recursive:true}); if(fs.existsSync(src)){fs.cpSync(src,dest,{recursive:true,force:true});}});\"",
91
+ "start": "pnpm run build && node ./dist/scripts/run-cli.js",
92
+ "oracle": "pnpm start",
93
+ "check": "pnpm run format:check && pnpm run lint",
94
+ "typecheck": "tsgo --noEmit",
95
+ "format": "oxfmt --write .",
96
+ "format:check": "oxfmt --check .",
97
+ "format:diff": "oxfmt --write . && git --no-pager diff",
98
+ "lint": "pnpm run typecheck && oxlint",
99
+ "lint:fix": "oxlint --fix && pnpm run format",
100
+ "test": "vitest run",
101
+ "test:mcp": "pnpm run build && pnpm run test:mcp:unit && pnpm run test:mcp:mcporter",
102
+ "test:mcp:unit": "vitest run tests/mcp*.test.ts tests/mcp/**/*.test.ts",
103
+ "test:mcp:mcporter": "CHROME_DEVTOOLS_URL=http://127.0.0.1:0 pnpm dlx mcporter list oracle-local --schema --config config/mcporter.json && CHROME_DEVTOOLS_URL=http://127.0.0.1:0 pnpm dlx mcporter call oracle-local.sessions limit:1 --config config/mcporter.json",
104
+ "test:browser": "pnpm run build && tsx scripts/test-browser.ts && ./scripts/browser-smoke.sh",
105
+ "test:packed-cli": "node scripts/packed-cli-smoke.mjs",
106
+ "test:live": "ORACLE_LIVE_TEST=1 vitest run tests/live --exclude tests/live/openai-live.test.ts",
107
+ "test:live:fast": "ORACLE_LIVE_TEST=1 ORACLE_LIVE_TEST_FAST=1 vitest run tests/live/browser-fast-live.test.ts",
108
+ "test:pro": "ORACLE_LIVE_TEST=1 vitest run tests/live/openai-live.test.ts",
109
+ "test:coverage": "vitest run --coverage",
110
+ "mcp": "pnpm run build && node ./dist/bin/oracle-mcp.js"
111
+ }
112
+ }
File without changes