Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@

## 0.17.1 — Unreleased

### Fixed

- Browser: keep `--browser-thinking-time extra-high` as Extra High (non-Pro) on GPT-5.6 Sol; reserve `heavy` for explicit Pro selection. Fixes #353.

## 0.17.0 — 2026-08-02

### Added
Expand Down
4 changes: 2 additions & 2 deletions bin/oracle-cli.ts
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,7 @@ interface CliOptions extends OptionValues {
browserManualLogin?: boolean;
browserManualLoginProfileDir?: string;
copyProfile?: string;
browserThinkingTime?: "light" | "standard" | "extended" | "heavy";
browserThinkingTime?: "light" | "standard" | "extended" | "extra-high" | "heavy";
browserResearch?: "off" | "deep";
browserFollowUp?: string[];
browserAllowCookieErrors?: boolean;
Expand Down Expand Up @@ -801,7 +801,7 @@ program
.addOption(
new Option(
"--browser-thinking-time <level>",
"Thinking time intensity for Thinking/Pro models: light, standard, extended, heavy, or ChatGPT UI aliases.",
"Thinking time intensity for Thinking/Pro models: light, standard, extended, extra-high (Extra High), heavy (Pro), or ChatGPT UI aliases.",
)
.argParser(parseThinkingTimeOption)
.hideHelp(),
Expand Down
6 changes: 3 additions & 3 deletions docs/browser-mode.md
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ Notes:
- If an assistant response still times out (common with long Pro runs), Oracle marks the session as an incomplete capture, stores reattach/runtime diagnostics, and keeps enough browser metadata for `oracle session <id>` to recover the final answer. Visible ChatGPT rate-limit, temporary-unavailable, and authentication/challenge warnings are included in the error and session metadata instead of being reduced to a generic timeout. Increase `--browser-timeout` only when the browser session is truly unrecoverable.
- `--browser-model-strategy <select|current|ignore>`: control ChatGPT model selection. `select` (default) switches to the requested model; `current` keeps the active model and logs its label; `ignore` skips the picker entirely. (Ignored for Gemini web runs.)
- Temporary Chat can reduce account-sidebar clutter for one-shot browser consults, but it is a different ChatGPT workflow: Oracle skips archive attempts there and the local transcript/artifacts are the durable record. Verify live behavior before relying on Project Sources, Deep Research reports, or multi-turn persistence.
- `--browser-thinking-time <light|standard|extended|heavy>`: set the ChatGPT thinking-time intensity (Thinking/Pro models only). You can also set a default in `~/.oracle/config.json` via `browser.thinkingTime`.
- `--browser-thinking-time <light|standard|extended|extra-high|heavy>`: set the ChatGPT thinking-time intensity (Thinking/Pro models only). On GPT-5.6 Sol, `extra-high` selects Extra High and `heavy` selects Pro. You can also set a default in `~/.oracle/config.json` via `browser.thinkingTime`.
- GPT-5.5 Pro Extended is verified from the selected item in ChatGPT's standalone Pro/Thinking effort pill or compatible Intelligence/model-picker menu. A run **fails closed** if Extended cannot be confirmed rather than silently submitting at a weaker effort. Detection failures write a bounded, redacted model-picker diagnostic to the normal session log.
- `--browser-research deep`: activate ChatGPT Deep Research before submitting the prompt. Use this for broad public-web research and final cited reports, not as a replacement for GPT-5.x Pro Heavy code review or pure reasoning.
- `--browser-follow-up <prompt>`: submit another prompt in the same ChatGPT conversation after the initial answer. Repeat the flag for multi-turn reviews such as “challenge your recommendation”, “compare against this constraint”, then “give the final decision”. Deep Research has its own report lifecycle, so browser follow-ups are rejected when `--browser-research deep` is enabled.
Expand Down Expand Up @@ -167,7 +167,7 @@ Oracle activates ChatGPT Deep Research through the composer tools menu, recogniz

If ChatGPT initially exposes only `Called tool` / `Used tool`, Oracle treats that as an incomplete capture for Deep Research rather than a final answer. Reattach the existing session with `oracle session <id> --render` so Oracle can recover the lazy-loaded report from the existing Chrome tab; do not rerun the research unless the browser session is unrecoverable.

Deep Research is browser-only. It does not use connected apps in v1; give it public-web scope, uploaded files, and any domain/source guidance in the prompt. For deep thinking over code or architecture without web search, prefer a normal browser run with a Pro/Thinking model and `--browser-thinking-time heavy`.
Deep Research is browser-only. It does not use connected apps in v1; give it public-web scope, uploaded files, and any domain/source guidance in the prompt. For deep thinking over code or architecture without web search, prefer a normal browser run with GPT-5.6 Sol and `--browser-thinking-time extra-high`, or a Pro model with `--browser-thinking-time extended`.

Completed browser sessions also save durable artifacts under `~/.oracle/sessions/<id>/artifacts/`. Deep Research writes the extracted report to `deep-research-report.md`, and every browser run writes `transcript.md` with the prompt, final answer, conversation URL, and saved artifact references. Use `--write-output <path>` when you also need a copy of just the final answer at a specific path.

Expand Down Expand Up @@ -214,7 +214,7 @@ Use browser follow-ups when a one-shot review would be too easy for the model to
```bash
oracle --engine browser \
--model gpt-5.5-pro \
--browser-thinking-time heavy \
--browser-thinking-time extended \
-p "Review this migration plan and identify the top risks." \
--file docs/migration-plan.md \
--browser-follow-up "Challenge your previous recommendation. What would fail in production?" \
Expand Down
2 changes: 1 addition & 1 deletion docs/cli-reference.md
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ See [OpenAI / Azure / OpenRouter](openai-endpoints.md) and [OpenRouter](openrout
| `--browser-manual-login` | Use persistent profile + manual login (no Keychain). |
| `--browser-attach-running` | Attach to your already-running Chrome via DevTools. |
| `--browser-tab <ref>` | Reuse an existing tab (`current`, id, URL, title substring). |
| `--browser-thinking-time <light\|standard\|extended\|heavy>` | Pro / Thinking model intensity. |
| `--browser-thinking-time <light\|standard\|extended\|extra-high\|heavy>` | Effort intensity (`extra-high` = Extra High; `heavy` = Pro). |
| `--browser-research deep` | Activate Deep Research mode. |
| `--browser-follow-up <prompt>` | Multi-turn in the same ChatGPT conversation. |
| `--browser-port <port>` | Pin Chrome DevTools port. |
Expand Down
2 changes: 1 addition & 1 deletion docs/configuration.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ JSON5 parsing, so trailing commas and comments are allowed.
autoReattachIntervalMs: 0, // interval between auto-reattach attempts (0 = disabled)
autoReattachTimeoutMs: 120000, // time budget per auto-reattach attempt (default: 2m)
modelStrategy: "select", // select | current | ignore (ChatGPT only; ignored for Gemini web)
thinkingTime: "extended", // light | standard | extended | heavy (ChatGPT Thinking/Pro models)
thinkingTime: "extended", // light | standard | extended | extra-high | heavy (ChatGPT Thinking/Pro models)
researchMode: "off", // off | deep (ChatGPT Deep Research; browser only)
manualLogin: false, // set true to reuse a persistent automation profile and sign in once (Windows defaults to true when unset)
manualLoginProfileDir: null, // override profile dir (or set ORACLE_BROWSER_PROFILE_DIR)
Expand Down
4 changes: 2 additions & 2 deletions docs/mcp.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,11 @@ Claude Code can call `oracle-mcp` and ask a subscription-backed ChatGPT browser

- Inputs: `prompt` (required), `files?: string[]` (globs), `model?: string` (defaults to CLI), `engine?: "api" | "browser"` (optional; Oracle follows CLI defaults: `ORACLE_ENGINE` and the effective config first, then API when `OPENAI_API_KEY` is set, otherwise browser), `slug?: string`.
- Presets: `preset?: "chatgpt-pro-heavy"` applies browser mode + current Pro model alias + extended thinking, unless the request overrides those fields.
- Browser-only extras: `browserAttachments?: "auto"|"never"|"always"`, `browserBundleFiles?: boolean`, `browserBundleFormat?: "auto"|"text"|"zip"`, `browserThinkingTime?: "light"|"standard"|"extended"|"heavy"`, `browserResearchMode?: "deep"`, `browserFollowUps?: string[]`, `browserArchive?: "auto"|"always"|"never"`, `browserKeepBrowser?: boolean`, `browserModelLabel?: string`, `browserModelStrategy?: "select"|"current"|"ignore"`, `generateImage?: string`, `outputPath?: string`.
- Browser-only extras: `browserAttachments?: "auto"|"never"|"always"`, `browserBundleFiles?: boolean`, `browserBundleFormat?: "auto"|"text"|"zip"`, `browserThinkingTime?: "light"|"standard"|"extended"|"extra-high"|"heavy"`, `browserResearchMode?: "deep"`, `browserFollowUps?: string[]`, `browserArchive?: "auto"|"always"|"never"`, `browserKeepBrowser?: boolean`, `browserModelLabel?: string`, `browserModelStrategy?: "select"|"current"|"ignore"`, `generateImage?: string`, `outputPath?: string`.
- Dry runs: set `dryRun: true` to preview the resolved request without creating a session or touching the browser.
- Behavior: starts a session, runs it with the chosen engine, returns final output + metadata. Background/foreground follows the CLI (e.g., GPT‑5 Pro detaches by default). If API mode fails because `OPENAI_API_KEY` is missing and you have ChatGPT Pro, retry with `engine: "browser"` or `preset: "chatgpt-pro-heavy"` to use your signed-in ChatGPT session instead of an API key.
- Logging: emits MCP logs (`info` per line, `debug` for streamed chunks with byte sizes). If browser prerequisites are missing, returns an error payload instead of running.
- Research mode: set `browserResearchMode:"deep"` for broad public-web research and cited reports. Use normal browser runs with `gpt-5.5-pro` + `browserThinkingTime:"extended"` for Pro Extended code review, or `gpt-5.5` + `browserThinkingTime:"heavy"` when you explicitly want Thinking Heavy.
- Research mode: set `browserResearchMode:"deep"` for broad public-web research and cited reports. Use normal browser runs with `gpt-5.5-pro` + `browserThinkingTime:"extended"` for Pro Extended code review, `gpt-5.6-sol` + `browserThinkingTime:"extra-high"` for Extra High, or `browserThinkingTime:"heavy"` when you explicitly want Pro.
- Multi-turn consults: set `browserFollowUps:["Challenge your recommendation", "Give the final decision"]` to keep one ChatGPT browser conversation open and ask sequential follow-up prompts. Use one-shot calls for narrow bugs and exact file-set reviews; use multi-turn for ambiguous architecture/product decisions where a challenge pass and final recommendation are useful; use Deep Research for broad public-web work with citations. Oracle never invents follow-ups automatically.
- Archiving: set `browserArchive:"auto"|"always"|"never"` to control ChatGPT conversation cleanup. `auto` archives only successful browser one-shots after local artifacts are saved, and skips project, Deep Research, multi-turn, failed, and incomplete sessions.
- ChatGPT image generation: set `engine:"browser"` and `generateImage` to a path under `ORACLE_HOME_DIR/generated` to use the same image-aware wait/download path as CLI `--generate-image`. Saved files are returned in `structuredContent.images` and recorded as session artifacts; multiple images save as numbered siblings. Agent-supplied `generateImage` / `outputPath` are constrained to that generated-output directory by default (set `ORACLE_MCP_ALLOW_EXTERNAL_OUTPUT=1` to allow external paths).
Expand Down
13 changes: 7 additions & 6 deletions docs/mythical-pro-agents.md
Original file line number Diff line number Diff line change
Expand Up @@ -86,12 +86,13 @@ The captured report lands at `~/.oracle/sessions/<id>/artifacts/deep-research-re

Pro / Thinking models in browser mode accept a `--browser-thinking-time` knob:

| Level | What it maps to in ChatGPT |
| ---------- | -------------------------------- |
| `light` | Quick |
| `standard` | Default |
| `extended` | Pro Extended / Thinking Extended |
| `heavy` | Heavy thinking |
| Level | What it maps to in ChatGPT |
| ------------- | --------------------------------------------------- |
| `light` | Instant / Quick |
| `standard` | Medium / Standard |
| `extended` | High / Pro Extended / Thinking Extended |
| `extra-high` | Extra High (GPT-5.6 Sol non-Pro max) |
| `heavy` | Pro (GPT-5.6 Sol) / Heavy thinking on older layouts |

```bash
oracle --engine browser --model gpt-5.5-pro \
Expand Down
7 changes: 4 additions & 3 deletions skills/oracle/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,8 @@ Recommended defaults:

- Engine: browser (`--engine browser`)
- Base Sol: `--model gpt-5.6-sol`
- Base Sol maximum reasoning: `--browser-thinking-time heavy` (Extra High)
- Base Sol maximum reasoning: `--browser-thinking-time extra-high` (Extra High)
- Explicit Pro effort on GPT-5.6 Sol: `--browser-thinking-time heavy` (Pro UI)
- Browser Pro: `--model gpt-5-pro`, without a thinking-time flag
- API Pro maximum reasoning: `--model gpt-5.6-sol --reasoning-mode pro --reasoning-effort max`
- Fallback: explicitly use `--model gpt-5.5-pro` when GPT-5.6 is unavailable
Expand All @@ -44,7 +45,7 @@ For base Sol, use:

```bash
oracle --engine browser --model gpt-5.6-sol \
--browser-thinking-time heavy \
--browser-thinking-time extra-high \
-p "<task>" --file "src/**"
```

Expand Down Expand Up @@ -108,7 +109,7 @@ and a live browser run records strict GPT-5.6 selection evidence.
- `npx -y @steipete/oracle --dry-run summary --files-report -p "<task>" --file "src/**"`

- Browser run:
- `oracle --engine browser --model gpt-5.6-sol --browser-thinking-time heavy -p "<task>" --file "src/**"`
- `oracle --engine browser --model gpt-5.6-sol --browser-thinking-time extra-high -p "<task>" --file "src/**"`

- Manual paste fallback:
- `npx -y @steipete/oracle --render-markdown --copy-markdown -p "<task>" --file "src/**"`
Expand Down
13 changes: 7 additions & 6 deletions src/browser/actions/thinkingTime.ts
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ export async function ensureThinkingTime(
/**
* Best-effort selection of a thinking time level in ChatGPT's composer pill menu.
* Safe by default: if the pill/menu/option isn't present, we continue without throwing.
* @param level - The thinking time intensity: 'light', 'standard', 'extended', or 'heavy'
* @param level - The thinking time intensity: 'light', 'standard', 'extended', 'extra-high', or 'heavy'
*/
export async function ensureThinkingTimeIfAvailable(
Runtime: ChromeClient["Runtime"],
Expand Down Expand Up @@ -206,7 +206,8 @@ function buildThinkingTimeExpression(
light: ['light', 'instant', '轻', '极速'],
standard: ['standard', 'medium', '标准', '中'],
extended: ['extended', 'high', '扩展', '深度', '加强', '高'],
heavy: ['heavy', 'extra high', '重度', '加重', '极高'],
'extra-high': ['extra high', '极高'],
heavy: ['heavy', '重度', '加重'],
};
const targetTokens = LEVEL_TOKENS[TARGET_LEVEL] || [TARGET_LEVEL];

Expand Down Expand Up @@ -488,10 +489,10 @@ function buildThinkingTimeExpression(
return item;
}
}
if (TARGET_LEVEL === 'heavy') {
// Older Chinese layouts used bare 高 for the highest effort. Keep it
// only as a second-pass exact fallback so a current 高 row can never
// win before the primary 极高 row.
if (TARGET_LEVEL === 'extra-high') {
// Older Chinese layouts used bare 高 for the highest non-Pro effort.
// Keep it only as a second-pass exact fallback so a current 高 row can
// never win before the primary 极高 row.
for (const item of items) {
const itemText = normalize(item.textContent ?? '');
const ariaLabel = normalize(item.getAttribute?.('aria-label') ?? '');
Expand Down
2 changes: 1 addition & 1 deletion src/cli/browserConfig.ts
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ export interface BrowserFlagOptions {
browserManualLoginProfileDir?: string | null;
copyProfile?: string;
remoteHost?: string;
/** Thinking time intensity: 'light', 'standard', 'extended', 'heavy' */
/** Thinking time intensity: 'light', 'standard', 'extended', 'extra-high', 'heavy' */
browserThinkingTime?: ThinkingTimeLevel;
browserResearch?: BrowserResearchMode;
browserArchive?: BrowserArchiveMode;
Expand Down
2 changes: 1 addition & 1 deletion src/cli/options.ts
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,7 @@ export function parseThinkingTimeOption(value: string): ThinkingTimeLevel {
return normalized;
}
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".',
'Thinking time must be one of "light", "standard", "extended", "extra-high", "heavy", or a ChatGPT UI alias like "instant", "medium", "high", or "xhigh".',
);
}

Expand Down
2 changes: 1 addition & 1 deletion src/mcp/tools/consult.ts
Original file line number Diff line number Diff line change
Expand Up @@ -328,7 +328,7 @@ export function buildConsultBrowserConfig({
runModel: string;
inputModel?: string;
browserModelLabel?: string;
browserThinkingTime?: "light" | "standard" | "extended" | "heavy";
browserThinkingTime?: "light" | "standard" | "extended" | "extra-high" | "heavy";
browserModelStrategy?: BrowserModelStrategy;
browserResearchMode?: "deep";
browserArchive?: "auto" | "always" | "never";
Expand Down
12 changes: 9 additions & 3 deletions src/oracle/thinkingTime.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,17 @@
import type { ThinkingTimeLevel } from "./types.js";

export const THINKING_TIME_LEVELS = ["light", "standard", "extended", "heavy"] as const;
export const THINKING_TIME_LEVELS = [
"light",
"standard",
"extended",
"extra-high",
"heavy",
] as const;
export const THINKING_TIME_ALIASES = [
"instant",
"low",
"medium",
"high",
"extra-high",
"extra high",
"extrahigh",
"xhigh",
Expand Down Expand Up @@ -37,10 +42,11 @@ export function normalizeThinkingTimeLevel(
case "extended":
case "high":
return "extended";
case "heavy":
case "extra-high":
case "extrahigh":
case "xhigh":
return "extra-high";
case "heavy":
return "heavy";
default:
return null;
Expand Down
7 changes: 6 additions & 1 deletion src/oracle/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,12 @@ export type ProModelName =
export type ReasoningEffort = "none" | "low" | "medium" | "high" | "xhigh" | "max";
export type ReasoningMode = "standard" | "pro";

export type ThinkingTimeLevel = "light" | "standard" | "extended" | "heavy";
export type ThinkingTimeLevel =
| "light"
| "standard"
| "extended"
| "extra-high"
| "heavy";

export type BrowserBundleFormat = "auto" | "text" | "zip";

Expand Down
Loading