@steipete/oracle 0.17.1 → 0.17.3

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 (92) hide show
  1. package/dist/bin/oracle-cli.js +1 -1
  2. package/dist/bin/oracle-mcp.js +0 -0
  3. package/dist/bin/oracle.js +683 -0
  4. package/dist/docs-site/bridge.html +1 -17
  5. package/dist/docs-site/browser-mode.html +14 -20
  6. package/dist/docs-site/cli-reference.html +6 -6
  7. package/dist/docs-site/configuration.html +7 -33
  8. package/dist/docs-site/followup.html +9 -16
  9. package/dist/docs-site/gemini.html +6 -10
  10. package/dist/docs-site/index.html +7 -7
  11. package/dist/docs-site/install.html +1 -1
  12. package/dist/docs-site/manual-tests.html +1 -2
  13. package/dist/docs-site/mcp.html +5 -28
  14. package/dist/docs-site/mythical-pro-agents.html +10 -10
  15. package/dist/docs-site/openai-endpoints.html +1 -24
  16. package/dist/docs-site/quickstart.html +1 -1
  17. package/dist/docs-site/sessions.html +5 -6
  18. package/dist/docs-site/spec.html +1 -1
  19. package/dist/docs-site/windows-work.html +0 -1
  20. package/dist/markdansi/types/index.js +4 -0
  21. package/dist/oracle/bin/oracle-cli.js +472 -0
  22. package/dist/oracle/src/browser/actions/assistantResponse.js +471 -0
  23. package/dist/oracle/src/browser/actions/attachments.js +82 -0
  24. package/dist/oracle/src/browser/actions/modelSelection.js +190 -0
  25. package/dist/oracle/src/browser/actions/navigation.js +75 -0
  26. package/dist/oracle/src/browser/actions/promptComposer.js +167 -0
  27. package/dist/oracle/src/browser/chromeLifecycle.js +104 -0
  28. package/dist/oracle/src/browser/config.js +33 -0
  29. package/dist/oracle/src/browser/constants.js +40 -0
  30. package/dist/oracle/src/browser/cookies.js +210 -0
  31. package/dist/oracle/src/browser/domDebug.js +36 -0
  32. package/dist/oracle/src/browser/index.js +331 -0
  33. package/dist/oracle/src/browser/pageActions.js +5 -0
  34. package/dist/oracle/src/browser/prompt.js +88 -0
  35. package/dist/oracle/src/browser/promptSummary.js +20 -0
  36. package/dist/oracle/src/browser/sessionRunner.js +80 -0
  37. package/dist/oracle/src/browser/types.js +1 -0
  38. package/dist/oracle/src/browser/utils.js +62 -0
  39. package/dist/oracle/src/browserMode.js +1 -0
  40. package/dist/oracle/src/cli/browserConfig.js +44 -0
  41. package/dist/oracle/src/cli/dryRun.js +59 -0
  42. package/dist/oracle/src/cli/engine.js +17 -0
  43. package/dist/oracle/src/cli/errorUtils.js +9 -0
  44. package/dist/oracle/src/cli/help.js +70 -0
  45. package/dist/oracle/src/cli/markdownRenderer.js +15 -0
  46. package/dist/oracle/src/cli/options.js +103 -0
  47. package/dist/oracle/src/cli/promptRequirement.js +14 -0
  48. package/dist/oracle/src/cli/rootAlias.js +30 -0
  49. package/dist/oracle/src/cli/sessionCommand.js +77 -0
  50. package/dist/oracle/src/cli/sessionDisplay.js +270 -0
  51. package/dist/oracle/src/cli/sessionRunner.js +94 -0
  52. package/dist/oracle/src/heartbeat.js +43 -0
  53. package/dist/oracle/src/oracle/client.js +48 -0
  54. package/dist/oracle/src/oracle/config.js +29 -0
  55. package/dist/oracle/src/oracle/errors.js +101 -0
  56. package/dist/oracle/src/oracle/files.js +220 -0
  57. package/dist/oracle/src/oracle/format.js +33 -0
  58. package/dist/oracle/src/oracle/fsAdapter.js +7 -0
  59. package/dist/oracle/src/oracle/oscProgress.js +60 -0
  60. package/dist/oracle/src/oracle/request.js +48 -0
  61. package/dist/oracle/src/oracle/run.js +444 -0
  62. package/dist/oracle/src/oracle/tokenStats.js +39 -0
  63. package/dist/oracle/src/oracle/types.js +1 -0
  64. package/dist/oracle/src/oracle.js +9 -0
  65. package/dist/oracle/src/sessionManager.js +205 -0
  66. package/dist/oracle/src/version.js +39 -0
  67. package/dist/scripts/chrome/browser-tools.js +295 -0
  68. package/dist/scripts/git-policy.js +0 -8
  69. package/dist/scripts/runner.js +1 -5
  70. package/dist/src/browser/actions/assistantResponse.js +71 -23
  71. package/dist/src/browser/actions/modelSelection.js +164 -5
  72. package/dist/src/browser/actions/thinkingTime.js +195 -18
  73. package/dist/src/browser/chromeCookies.js +312 -0
  74. package/dist/src/browser/index.js +5 -1
  75. package/dist/src/browser/keytarShim.js +56 -0
  76. package/dist/src/browser/policies.js +4 -0
  77. package/dist/src/browser/profileSync.js +141 -0
  78. package/dist/src/browser/projectSourcesRunner.js +2 -2
  79. package/dist/src/browser/reattach.js +47 -35
  80. package/dist/src/browser/windowsCookies.js +219 -0
  81. package/dist/src/cli/browserConfig.js +13 -4
  82. package/dist/src/cli/browserDefaults.js +6 -1
  83. package/dist/src/cli/options.js +1 -1
  84. package/dist/src/cli/projectSources.js +8 -1
  85. package/dist/src/mcp/tools/consult.js +1 -1
  86. package/dist/src/oracle/thinkingTime.js +6 -0
  87. package/dist/src/sessionManager.js +90 -9
  88. package/dist/vendor/oracle-notifier/OracleNotifier.app/Contents/CodeResources +0 -0
  89. package/dist/vendor/oracle-notifier/OracleNotifier.app/Contents/MacOS/OracleNotifier +0 -0
  90. package/package.json +6 -6
  91. package/vendor/oracle-notifier/OracleNotifier.app/Contents/CodeResources +0 -0
  92. package/vendor/oracle-notifier/OracleNotifier.app/Contents/MacOS/OracleNotifier +0 -0
@@ -251,22 +251,6 @@ body:not(.home) .doc>h1:first-child{display:none}
251
251
  <li><strong>Host (Windows)</strong>: runs <code>oracle bridge host</code> and holds the signed-in ChatGPT session.</li>
252
252
  <li><strong>Client (Linux)</strong>: stores the host connection once and routes browser runs (and MCP browser runs) through the host.</li>
253
253
  </ul>
254
- <h2 id="generated-artifact-transfer"><a class="anchor" href="#generated-artifact-transfer" aria-label="Anchor link">#</a>Generated artifact transfer</h2>
255
- <p>Bridge runs now keep the Windows browser host and Linux client separated while still returning ChatGPT-generated files, such as ZIP, CSV, PDF, wheels, and source distributions, to a cloud-readable path. The host advertises artifact-transfer support from the token-protected <code>GET /health</code> response. The Linux client uses that capability signal in <code>oracle bridge client --test</code> and <code>oracle bridge doctor</code>; older hosts remain usable for text responses, but generated files require manual copy from the Windows browser until both sides are upgraded.</p>
256
- <p>The transfer protocol is pull-based and keeps secrets local to the host:</p>
257
- <ol>
258
- <li>The browser host saves the ChatGPT file to its local session artifacts directory as before.</li>
259
- <li>The host emits only a redacted artifact descriptor over the existing NDJSON run stream: artifact id, safe filename, MIME type, byte size, SHA-256, validation status, and coarse source kind. It does not expose cookies, bearer tokens, signed ChatGPT download URLs, or Windows filesystem paths.</li>
260
- <li>The Linux client fetches <code>GET /runs/&lt;runId&gt;/artifacts/&lt;artifactId&gt;</code> with the same bridge bearer token, writes to <code>~/.oracle/sessions/&lt;sessionId&gt;/artifacts/</code>, verifies size and SHA-256, validates ZIP structure when applicable, and only then publishes the final path in session metadata.</li>
261
- <li>If transfer fails, Oracle keeps the text response and records a warning with manual fallback instructions. Open the ChatGPT browser on the Windows host, use the visible download button/link in the current assistant response, and copy the file to a cloud-readable path yourself.</li>
262
- </ol>
263
- <p>Operational notes:</p>
264
- <ul>
265
- <li>Run the same patched Oracle version on both Windows host and Linux client before relying on automatic file transfer. Mixed versions remain backward compatible for text-only runs.</li>
266
- <li><code>oracle bridge doctor</code> reports <code>Artifact transfer: bridge v1</code> when the host supports the protocol, including the advertised maximum artifact size.</li>
267
- <li>The default bridge transfer size limit is 512 MiB. Larger files stay on the browser host and require manual copy.</li>
268
- <li>Session inspection prints artifact path, size, SHA-256 prefix, validation status, and transfer status so agents can verify whether the returned path is local to the Linux client.</li>
269
- </ul>
270
254
  <h2 id="1-windows-start-the-host-service-recommended"><a class="anchor" href="#1-windows-start-the-host-service-recommended" aria-label="Anchor link">#</a>1) Windows: start the host service (recommended)</h2>
271
255
  <p>Run this on the Windows machine that’s signed into ChatGPT:</p>
272
256
  <pre class="shiki github-dark-dimmed" style="background-color:var(--code-bg);color:var(--code-fg)" tabindex="0"><code class="language-powershell"><span class="line"><span style="color:#ADBAC7">oracle bridge host </span><span style="color:#F47067">--</span><span style="color:#ADBAC7">token auto </span><span style="color:#F47067">--</span><span style="color:#ADBAC7">ssh user@your</span><span style="color:#F47067">-</span><span style="color:#ADBAC7">linux</span><span style="color:#F47067">-</span><span style="color:#ADBAC7">host</span></span></code></pre>
@@ -350,7 +334,7 @@ body:not(.home) .doc>h1:first-child{display:none}
350
334
  <li>The connection artifact and config file contain secrets; keep them private (Oracle writes them with restrictive permissions on Unix).</li>
351
335
  <li>Bridge does <strong>not</strong> extract/decrypt cookies from arbitrary profiles; the Windows machine keeps the authenticated session locally.</li>
352
336
  </ul><nav class="page-nav" aria-label="Pager"><a class="page-nav-prev" href="windows-work.html"><small>Previous</small><span>Windows Work</span></a><a class="page-nav-next" href="agents.html"><small>Next</small><span>Coding Agents</span></a></nav></article>
353
- <nav class="toc" aria-label="On this page"><h2>On this page</h2><a class="toc-l2" href="#concepts">Concepts</a><a class="toc-l2" href="#generated-artifact-transfer">Generated artifact transfer</a><a class="toc-l2" href="#1-windows-start-the-host-service-recommended">1) Windows: start the host service (recommended)</a><a class="toc-l2" href="#2-linux-configure-the-client-once">2) Linux: configure the client once</a><a class="toc-l2" href="#2b-linux-desktop-local-manual-login-no-bridge">2b) Linux desktop: local manual-login (no bridge)</a><a class="toc-l2" href="#3-codex-cli-mcp-integration">3) Codex CLI (MCP) integration</a><a class="toc-l2" href="#3b-claude-code-mcp-integration">3b) Claude Code (MCP) integration</a><a class="toc-l3" href="#macos-local-browser-let-them-fight">macOS local browser: Let Them Fight</a><a class="toc-l2" href="#4-troubleshooting">4) Troubleshooting</a><a class="toc-l2" href="#security-notes">Security notes</a></nav>
337
+ <nav class="toc" aria-label="On this page"><h2>On this page</h2><a class="toc-l2" href="#concepts">Concepts</a><a class="toc-l2" href="#1-windows-start-the-host-service-recommended">1) Windows: start the host service (recommended)</a><a class="toc-l2" href="#2-linux-configure-the-client-once">2) Linux: configure the client once</a><a class="toc-l2" href="#2b-linux-desktop-local-manual-login-no-bridge">2b) Linux desktop: local manual-login (no bridge)</a><a class="toc-l2" href="#3-codex-cli-mcp-integration">3) Codex CLI (MCP) integration</a><a class="toc-l2" href="#3b-claude-code-mcp-integration">3b) Claude Code (MCP) integration</a><a class="toc-l3" href="#macos-local-browser-let-them-fight">macOS local browser: Let Them Fight</a><a class="toc-l2" href="#4-troubleshooting">4) Troubleshooting</a><a class="toc-l2" href="#security-notes">Security notes</a></nav>
354
338
  </div>
355
339
  </main>
356
340
  </div>
@@ -252,7 +252,7 @@ body:not(.home) .doc>h1:first-child{display:none}
252
252
  <li><strong>Gemini web mode</strong> (Gemini models): talks directly to <code>gemini.google.com</code> using your signed-in Chrome cookies (no ChatGPT automation).</li>
253
253
  </ul>
254
254
  <p>If you’re running Gemini, also see <code>docs/gemini.md</code>.</p>
255
- <p><code>oracle --engine browser</code> routes the assembled prompt bundle through the ChatGPT web UI instead of the Responses API. (Legacy <code>--browser</code> still maps to <code>--engine browser</code>, but it will be removed.) If you omit <code>--engine</code>, Oracle first honors <code>ORACLE_ENGINE</code>, then any <code>engine</code> value in the effective config, including project <code>.oracle/config.json</code> files layered over <code>~/.oracle/config.json</code>. It auto-picks API when <code>OPENAI_API_KEY</code> is available and falls back to browser otherwise. The CLI writes the same session metadata/logs as API runs, and by default pastes the payload into ChatGPT via a temporary Chrome profile (manual-login mode can reuse a persistent automation profile).</p>
255
+ <p><code>oracle --engine browser</code> routes the assembled prompt bundle through the ChatGPT web UI instead of the Responses API. (Legacy <code>--browser</code> still maps to <code>--engine browser</code>, but it will be removed.) If you omit <code>--engine</code>, Oracle first honors any <code>engine</code> value in <code>~/.oracle/config.json</code>, then auto-picks API when <code>OPENAI_API_KEY</code> is available and falls back to browser otherwise. The CLI writes the same session metadata/logs as API runs, and by default pastes the payload into ChatGPT via a temporary Chrome profile (manual-login mode can reuse a persistent automation profile).</p>
256
256
  <p><code>--preview</code> now works with <code>--engine browser</code>: it renders the composed prompt, lists which files would be uploaded vs inlined, and shows the bundle location when bundling is enabled, without launching Chrome.</p>
257
257
  <h2 id="quick-example-browser-mode-with-custom-cookies"><a class="anchor" href="#quick-example-browser-mode-with-custom-cookies" aria-label="Anchor link">#</a>Quick example: browser mode with custom cookies</h2>
258
258
  <pre class="shiki github-dark-dimmed" style="background-color:var(--code-bg);color:var(--code-fg)" tabindex="0"><code class="language-bash"><span class="line"><span style="color:#768390"># Minimal inline-cookies flow: keep ChatGPT logged in without Keychain</span></span>
@@ -302,7 +302,7 @@ body:not(.home) .doc>h1:first-child{display:none}
302
302
  <li>Attach-running mode reads local <code>DevToolsActivePort</code> metadata for the selected local port, connects to the browser websocket, opens a dedicated tab, and reuses the same DOM automation/capture flow against that attached browser.</li>
303
303
  <li>Launcher mode can optionally copy cookies from the requested browser profile via Oracle’s built-in cookie reader (Keychain/DPAPI aware) so you stay signed in.</li>
304
304
  <li>Navigates to <code>chatgpt.com</code>, switches the model to the requested GPT-5.5 / GPT-5.4 / GPT-5.2 variant, optionally activates Deep Research, pastes the prompt, waits for completion, and copies the markdown via the built-in “copy turn” button.</li>
305
- <li>Immediately probes the cookie-authenticated <code>/api/auth/session</code> endpoint in the ChatGPT tab and checks only whether it contains a user; returned tokens are never logged. If that endpoint is unavailable, Oracle falls back to the legacy <code>/backend-api/me</code> probe and a visible composer plus profile or chat-history authentication signals. Auth pages, visible login controls, resolved sessions without a user, composer-only shells, and pages without profile/history signals still fail with login guidance.</li>
305
+ <li>Immediately probes <code>/backend-api/me</code> in the ChatGPT tab to verify the session is authenticated; if the endpoint returns 401/403 we abort early with a login-specific error instead of timing out waiting for the composer.</li>
306
306
  <li>When <code>--file</code> inputs would push the pasted composer content over ~60k characters, we switch to uploading attachments (optionally bundled) and wait for ChatGPT to re-enable the send button before submitting the combined system+user prompt.</li>
307
307
  <li>Launcher mode cleans up the temporary profile unless <code>--browser-keep-browser</code> is passed.</li>
308
308
  </ul>
@@ -317,33 +317,29 @@ body:not(.home) .doc>h1:first-child{display:none}
317
317
  <li><code>--browser-cookie-path</code>: explicit path to the Chrome/Chromium/Edge <code>Cookies</code> SQLite DB. Handy when you launch a fork via <code>--browser-chrome-path</code> and want to copy its session cookies; see <a href="chromium-forks.html">docs/chromium-forks.md</a> for examples.</li>
318
318
  <li><code>--browser-attach-running</code>: attach to a local already-running browser instead of launching Chrome directly. Defaults to <code>127.0.0.1:9222</code>; combine with <code>--remote-chrome &lt;host:port&gt;</code> to use a different local attach hint.</li>
319
319
  <li><code>--chatgpt-url</code>: override the ChatGPT base URL. Works with the root homepage (<code>https://chatgpt.com/</code>), Temporary Chat (<code>https://chatgpt.com/?temporary-chat=true</code>), <strong>or</strong> a specific workspace/folder link such as <code>https://chatgpt.com/g/.../project</code>. <code>--browser-url</code> stays as a hidden alias.</li>
320
- <li><code>--browser-timeout</code>, <code>--browser-input-timeout</code>, <code>--browser-attachment-timeout</code>: <code>1200s (20m)</code>/<code>60s</code>/<code>45s</code> defaults. The attachment timeout controls upload/readiness before clicking Send and can also be set with <code>ORACLE_BROWSER_ATTACHMENT_TIMEOUT</code> or <code>browser.attachmentTimeoutMs</code>. Durations accept <code>ms</code>, <code>s</code>, <code>m</code>, or <code>h</code> and can be chained (<code>1h2m10s</code>).</li>
320
+ <li><code>--browser-timeout</code>, <code>--browser-input-timeout</code>: <code>1200s (20m)</code>/<code>60s</code> defaults. Durations accept <code>ms</code>, <code>s</code>, <code>m</code>, or <code>h</code> and can be chained (<code>1h2m10s</code>).</li>
321
321
  <li><code>--browser-recheck-delay</code>, <code>--browser-recheck-timeout</code>: after an assistant timeout, wait the delay, revisit the conversation, and retry capture (default recheck timeout 120s). Useful for Pro runs that finish later.</li>
322
322
  <li><code>--browser-reuse-wait</code>: wait for a shared Chrome profile (DevToolsActivePort) to appear before launching a new Chrome. Helps multiple parallel runs reuse the same Chromium instance.</li>
323
323
  <li><code>--browser-profile-lock-timeout</code>: wait for the shared manual-login profile lock before sending, serializing parallel runs that share a Chrome profile.</li>
324
- <li><code>--browser-max-concurrent-tabs</code>: soft limit for simultaneous ChatGPT tabs sharing one manual-login profile (default <code>3</code>). Set <code>ORACLE_BROWSER_MAX_CONCURRENT_TABS</code> for a per-host default; explicit CLI/config values win. Additional runs wait up to the browser timeout for a slot and log <code>[browser] Waiting for ChatGPT browser slot...</code>.</li>
324
+ <li><code>--browser-max-concurrent-tabs</code>: soft limit for simultaneous ChatGPT tabs sharing one manual-login profile (default <code>3</code>). Additional runs wait up to the browser timeout for a slot and log <code>[browser] Waiting for ChatGPT browser slot...</code>.</li>
325
325
  <li><code>--browser-auto-reattach-delay</code>, <code>--browser-auto-reattach-interval</code>, <code>--browser-auto-reattach-timeout</code>: after a timeout, start periodic auto-reattach attempts (delay before first attempt, repeat interval, per-attempt timeout). This lets Oracle keep polling a finished Pro response without manual <code>oracle session</code> runs.</li>
326
326
  <li><code>--heartbeat</code>: browser mode uses this interval to emit long-run ChatGPT status. When ChatGPT exposes a Thinking/Reasoning disclosure, Oracle opens it and logs only liveness metadata such as sidecar presence, UI progress percentage, elapsed time, and last-change age. It does not log the reasoning text.</li>
327
- <li>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 <code>oracle session &lt;id&gt;</code> 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 <code>--browser-timeout</code> only when the browser session is truly unrecoverable.</li>
327
+ <li>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 <code>oracle session &lt;id&gt;</code> to recover the final answer. Increase <code>--browser-timeout</code> only when the browser session is truly unrecoverable.</li>
328
328
  <li><code>--browser-model-strategy &lt;select|current|ignore&gt;</code>: control ChatGPT model selection. <code>select</code> (default) switches to the requested model; <code>current</code> keeps the active model and logs its label; <code>ignore</code> skips the picker entirely. (Ignored for Gemini web runs.)</li>
329
329
  <li>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.</li>
330
- <li><code>--browser-thinking-time &lt;light|standard|extended|extra-high|heavy&gt;</code>: set the ChatGPT thinking-time intensity (Thinking/Pro models only). On GPT-5.6 Sol, <code>extra-high</code> selects Extra High; a <code>heavy</code> request accepts an already-selected Pro pill but otherwise selects only a matching Heavy row. Effort rows are matched in English, German (<code>Sofort</code>/<code>Mittel</code>/<code>Hoch</code>/<code>Sehr hoch</code>), and Chinese; when the requested tier has no row in the current UI language, Oracle keeps the effort already selected in the tab instead of switching the model. You can also set a default in <code>~/.oracle/config.json</code> via <code>browser.thinkingTime</code>.</li>
331
- <li>GPT-5.5 Pro Extended is verified from the selected item in ChatGPT&#39;s standalone Pro/Thinking effort pill or compatible Intelligence/model-picker menu. A run <strong>fails closed</strong> 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.</li>
330
+ <li><code>--browser-thinking-time &lt;light|standard|extended|heavy&gt;</code>: set the ChatGPT thinking-time intensity (Thinking/Pro models only). You can also set a default in <code>~/.oracle/config.json</code> via <code>browser.thinkingTime</code>.</li>
332
331
  <li><code>--browser-research deep</code>: 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.</li>
333
332
  <li><code>--browser-follow-up &lt;prompt&gt;</code>: 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 <code>--browser-research deep</code> is enabled.</li>
334
- <li><code>--followup &lt;session-id&gt;</code>: reopen the exact saved ChatGPT conversation from a completed browser session. Oracle inherits the parent browser profile, configuration, and model, then verifies the thread and prior turns before submitting.</li>
335
333
  <li><code>--browser-archive &lt;auto|always|never&gt;</code>: archive completed ChatGPT conversations after local artifacts are saved. The default <code>auto</code> archives only successful one-shot chats and skips project, Deep Research, multi-turn, failed, and incomplete sessions.</li>
336
334
  <li><code>--browser-port &lt;port&gt;</code> (alias: <code>--browser-debug-port</code>; env: <code>ORACLE_BROWSER_PORT</code>/<code>ORACLE_BROWSER_DEBUG_PORT</code>): pin the DevTools port (handy on WSL/Windows firewalls). When omitted, a random open port is chosen.</li>
337
- <li><code>ORACLE_CHATGPT_ACCOUNT_EMAIL</code>: exact saved-account email to select if ChatGPT shows its “Welcome back” account picker. Set it on the machine running browser automation. Oracle never logs the address; without it, Oracle selects only a single unambiguous saved account and fails closed when several are present.</li>
338
335
  <li><code>--browser-no-cookie-sync</code>, <code>--browser-manual-login</code> (persistent automation profile + user-driven login), <code>--browser-headless</code>, <code>--browser-hide-window</code>, <code>--browser-keep-browser</code>, and the global <code>-v/--verbose</code> flag for detailed automation logs.</li>
339
- <li><code>--copy-profile &lt;dir&gt;</code>: copy a signed-in Chrome user-data directory (e.g. <code>&quot;$HOME/Library/Application Support/Google/Chrome&quot;</code>) to a throwaway profile and run against it, reusing your live ChatGPT session with no manual sign-in. Oracle copies the profile recorded as active in <code>Local State</code>; pass <code>--browser-chrome-profile &lt;name&gt;</code> to select another direct child profile. The copy is launched with the real Keychain (not mocked) so its encrypted cookies decrypt, and is always deleted afterward—including setup/launch failures, incomplete captures, Cloudflare challenges, and interrupts. Copied-profile runs cannot be kept or reattached. Not compatible with <code>--browser-keep-browser</code>, <code>--browser-manual-login</code>, <code>--browser-attach-running</code>, <code>--remote-chrome</code>, or <code>--remote-host</code>, and fails fast if the required <code>Local State</code> cannot be copied. macOS/Linux; requires <code>rsync</code>.</li>
340
336
  <li><code>--browser-url</code>: override ChatGPT base URL if needed.</li>
341
- <li><code>--browser-attachments &lt;auto|never|always&gt;</code>: control how <code>--file</code> inputs are delivered in browser mode. Default <code>auto</code> pastes text contents inline up to ~60k characters and uploads larger or raw files. <code>never</code> requires inline-compatible text inputs and rejects raw/binary files.</li>
337
+ <li><code>--browser-attachments &lt;auto|never|always&gt;</code>: control how <code>--file</code> inputs are delivered in browser mode. Default <code>auto</code> pastes file contents inline up to ~60k characters and switches to uploads above that.</li>
342
338
  <li><code>--browser-inline-files</code>: alias for <code>--browser-attachments never</code> (forces inline paste; never uploads attachments).</li>
343
339
  <li><code>--browser-bundle-files</code>: bundle all resolved attachments into a single temp file before uploading (only used when uploads are enabled/selected).</li>
344
- <li><code>--browser-bundle-format &lt;auto|text|zip&gt;</code>: choose the bundle format. <code>auto</code> uses a text bundle for text-only inputs and a byte-preserving ZIP when bundled inputs include raw files; <code>text</code> keeps the single Markdown-style text bundle; <code>zip</code> archives the original file bytes. ZIP bundle inputs are capped at 128 MiB because bundle creation is in-memory.</li>
340
+ <li><code>--browser-bundle-format &lt;text|zip&gt;</code>: choose the bundle format. <code>text</code> keeps the existing single Markdown-style text bundle; <code>zip</code> preserves individual file names in one uploaded archive.</li>
345
341
  <li>sqlite bindings: automatic rebuilds now require <code>ORACLE_ALLOW_SQLITE_REBUILD=1</code>. Without it, the CLI logs instructions instead of running <code>pnpm rebuild</code> on your behalf.</li>
346
- <li><code>--model</code>: the same GPT-5.6 aliases work in API and browser mode. Use <code>gpt-5.6</code> for the current GPT-5.6 default or <code>gpt-5.6-sol</code> to pin Sol; browser mode maps either alias to the <code>GPT-5.6 Sol</code> picker entry, while API mode sends the corresponding first-party OpenAI model ID. GPT-5.2 base, Instant, and Thinking aliases remain available through the API but browser mode rejects them because ChatGPT retired those picker entries. Legacy Pro aliases still resolve to the latest Pro picker target.</li>
342
+ <li><code>--model</code>: the same flag used for API runs is accepted, but the ChatGPT automation path supports GPT-5.5, GPT-5.4, and GPT-5.2 variants. Use <code>gpt-5.5-pro</code>, <code>gpt-5.5</code>, <code>gpt-5.4-pro</code>, <code>gpt-5.4</code>, <code>gpt-5.2</code>, <code>gpt-5.2-thinking</code>, <code>gpt-5.2-instant</code>, or <code>gpt-5.2-pro</code>. Legacy Pro aliases still resolve to the latest Pro picker target.</li>
347
343
  <li>Cookie sync is mandatory—if we can’t copy cookies from Chrome, the run exits early. By default Oracle copies a small ChatGPT auth/Cloudflare allowlist to avoid oversized request headers; use <code>--browser-cookie-names</code> only when you need to override that set. Use the hidden <code>--browser-allow-cookie-errors</code> flag only when you’re intentionally running logged out (it skips the early exit but still warns).</li>
348
344
  <li>Attach-running mode is mutually exclusive with launcher-owned flags such as <code>--browser-manual-login</code>, <code>--browser-chrome-profile</code>, <code>--browser-cookie-path</code>, <code>--browser-hide-window</code>, <code>--browser-keep-browser</code>, and <code>--browser-port</code>. <code>--remote-chrome</code> is allowed in attach-running mode, but only as the local host:port hint used to find matching <code>DevToolsActivePort</code> metadata. <code>--browser-chrome-path</code> is accepted but ignored.</li>
349
345
  <li>Experimental cookie controls (hidden flags/env):</li>
@@ -362,11 +358,10 @@ body:not(.home) .doc>h1:first-child{display:none}
362
358
  <span class="line"><span style="color:#6CB6FF"> --browser-manual-login</span><span style="color:#F47067"> \</span></span>
363
359
  <span class="line"><span style="color:#6CB6FF"> --browser-research</span><span style="color:#96D0FF"> deep</span><span style="color:#F47067"> \</span></span>
364
360
  <span class="line"><span style="color:#6CB6FF"> -p</span><span style="color:#96D0FF"> "Research the current browser support for WebGPU in enterprise-managed Chrome and cite sources."</span></span></code></pre>
365
- <p>Oracle activates ChatGPT Deep Research through the composer tools menu, recognizing both the <code>Deep research</code> label and current <code>Get a detailed report</code> menu variants. It waits for the research plan to auto-confirm, logs high-level progress, then captures the final report from the Deep Research report surface instead of trusting the assistant tool-call wrapper.</p>
361
+ <p>Oracle activates ChatGPT Deep Research through the composer <code>/Deepresearch</code> command and falls back to the composer tools menu when the slash flow is not available. It waits for the research plan to auto-confirm, logs high-level progress, then captures the final report from the Deep Research report surface instead of trusting the assistant tool-call wrapper.</p>
366
362
  <p>If ChatGPT initially exposes only <code>Called tool</code> / <code>Used tool</code>, Oracle treats that as an incomplete capture for Deep Research rather than a final answer. Reattach the existing session with <code>oracle session &lt;id&gt; --render</code> so Oracle can recover the lazy-loaded report from the existing Chrome tab; do not rerun the research unless the browser session is unrecoverable.</p>
367
- <p>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 <code>--browser-thinking-time extra-high</code>, or a Pro model with <code>--browser-thinking-time extended</code>.</p>
363
+ <p>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 <code>--browser-thinking-time heavy</code>.</p>
368
364
  <p>Completed browser sessions also save durable artifacts under <code>~/.oracle/sessions/&lt;id&gt;/artifacts/</code>. Deep Research writes the extracted report to <code>deep-research-report.md</code>, and every browser run writes <code>transcript.md</code> with the prompt, final answer, conversation URL, and saved artifact references. Use <code>--write-output &lt;path&gt;</code> when you also need a copy of just the final answer at a specific path.</p>
369
- <p>When ChatGPT generates downloadable files in the assistant response (for example a ZIP, wheel, source distribution, CSV, or PDF), Oracle saves those files beside the transcript before any archive attempt. The downloader is intentionally narrow: it only follows ChatGPT-owned file/download URLs from the assistant response and uses <code>sandbox:/mnt/data/...</code> links as source metadata and filename hints, not as arbitrary fetch targets. External links in the response are left in the transcript but are not downloaded. In bridge mode, a patched Windows host advertises artifact-transfer capability through <code>/health</code>; the Linux client then pulls each saved file over the authenticated bridge endpoint, stores it under the Linux session <code>artifacts/</code> directory, and verifies safe filename, byte size, SHA-256, and ZIP structure where applicable. If either side is older or transfer validation fails, the text response still completes and Oracle prints a manual-copy fallback instead of leaking host paths or signed download URLs.</p>
370
365
  <h3 id="conversation-archiving"><a class="anchor" href="#conversation-archiving" aria-label="Anchor link">#</a>Conversation archiving</h3>
371
366
  <p>Browser mode keeps the local session as the source of truth, so Oracle can optionally archive the ChatGPT conversation after a successful run. The default <code>--browser-archive auto</code> archives only successful non-project, non-Deep-Research, non-multi-turn one-shot chats after <code>transcript.md</code>, generated artifacts, the final answer, and the conversation URL are saved locally.</p>
372
367
  <p>Oracle does not auto-archive failed, incomplete, running, project, Deep Research, or multi-turn sessions. Use <code>--browser-archive never</code> to disable archiving, or <code>--browser-archive always</code> when you explicitly want a successful browser conversation archived even outside the default one-shot policy. Archived chats are still visible and manageable from ChatGPT&#39;s own archive UI.</p>
@@ -395,7 +390,7 @@ body:not(.home) .doc>h1:first-child{display:none}
395
390
  <p>Use browser follow-ups when a one-shot review would be too easy for the model to answer shallowly. Oracle keeps the same ChatGPT conversation open, waits for each answer, then submits the next follow-up:</p>
396
391
  <pre class="shiki github-dark-dimmed" style="background-color:var(--code-bg);color:var(--code-fg)" tabindex="0"><code class="language-bash"><span class="line"><span style="color:#F69D50">oracle</span><span style="color:#6CB6FF"> --engine</span><span style="color:#96D0FF"> browser</span><span style="color:#F47067"> \</span></span>
397
392
  <span class="line"><span style="color:#6CB6FF"> --model</span><span style="color:#96D0FF"> gpt-5.5-pro</span><span style="color:#F47067"> \</span></span>
398
- <span class="line"><span style="color:#6CB6FF"> --browser-thinking-time</span><span style="color:#96D0FF"> extended</span><span style="color:#F47067"> \</span></span>
393
+ <span class="line"><span style="color:#6CB6FF"> --browser-thinking-time</span><span style="color:#96D0FF"> heavy</span><span style="color:#F47067"> \</span></span>
399
394
  <span class="line"><span style="color:#6CB6FF"> -p</span><span style="color:#96D0FF"> "Review this migration plan and identify the top risks."</span><span style="color:#F47067"> \</span></span>
400
395
  <span class="line"><span style="color:#6CB6FF"> --file</span><span style="color:#96D0FF"> docs/migration-plan.md</span><span style="color:#F47067"> \</span></span>
401
396
  <span class="line"><span style="color:#6CB6FF"> --browser-follow-up</span><span style="color:#96D0FF"> "Challenge your previous recommendation. What would fail in production?"</span><span style="color:#F47067"> \</span></span>
@@ -416,7 +411,6 @@ body:not(.home) .doc>h1:first-child{display:none}
416
411
  <span class="line"><span style="color:#6CB6FF"> --generate-image</span><span style="color:#96D0FF"> /tmp/oracle-image.png</span><span style="color:#F47067"> \</span></span>
417
412
  <span class="line"><span style="color:#6CB6FF"> -p</span><span style="color:#96D0FF"> "Create a simple product icon on a transparent background."</span></span></code></pre>
418
413
  <p>If ChatGPT returns multiple images, the first image saves to the requested path and the rest save as numbered siblings. Without <code>--generate-image</code>, Oracle writes images to the session <code>artifacts/</code> directory.</p>
419
- <p>MCP agents should prefer the <code>chatgpt_image</code> tool. It wraps the same behavior with a smaller input shape, uploads reference files by default, and returns saved files in <code>structuredContent.images</code>. Advanced callers can still pass <code>generateImage</code> to <code>consult</code> directly.</p>
420
414
  <h3 id="manual-login-mode-persistent-profile-no-cookie-copy"><a class="anchor" href="#manual-login-mode-persistent-profile-no-cookie-copy" aria-label="Anchor link">#</a>Manual login mode (persistent profile, no cookie copy)</h3>
421
415
  <p>Use <code>--browser-manual-login</code> when cookie decrypt is blocked (e.g., Windows app-bound cookies) or you prefer to sign in explicitly. You can also make it the default via <code>browser.manualLogin</code> in <code>~/.oracle/config.json</code>.</p>
422
416
  <pre class="shiki github-dark-dimmed" style="background-color:var(--code-bg);color:var(--code-fg)" tabindex="0"><code class="language-bash"><span class="line"><span style="color:#F69D50">oracle</span><span style="color:#6CB6FF"> --engine</span><span style="color:#96D0FF"> browser</span><span style="color:#F47067"> \</span></span>
@@ -435,7 +429,7 @@ body:not(.home) .doc>h1:first-child{display:none}
435
429
  </ul>
436
430
  <h3 id="concurrent-agents-and-long-pro-runs"><a class="anchor" href="#concurrent-agents-and-long-pro-runs" aria-label="Anchor link">#</a>Concurrent agents and long Pro runs</h3>
437
431
  <p>When Codex, Claude Code, or another Oracle caller share the same manual-login profile, each browser run now acquires a tab slot before opening a ChatGPT tab. The default allows three simultaneous ChatGPT tabs; the fourth caller waits instead of failing because another agent is already using the browser. This is most useful for long Pro/Thinking runs where one agent may wait for a response while another agent needs to start a separate consult.</p>
438
- <p>Use <code>--browser-max-concurrent-tabs &lt;n&gt;</code>, <code>browser.maxConcurrentTabs</code>, or <code>ORACLE_BROWSER_MAX_CONCURRENT_TABS</code> to tune the soft limit. Precedence is explicit CLI/config value, then environment, then the default of <code>3</code>; invalid or non-positive environment values fall back instead of disabling the cap. Keep the value modest: too many concurrent ChatGPT tabs can make the UI unstable or trigger account-side throttling. Oracle also serializes manual-login Chrome startup for the shared profile, then reuses the first reachable DevTools session instead of racing multiple Chrome launches against the same <code>user-data-dir</code>. The short profile lock still serializes the send/upload moment so separate agents do not type into the same composer.</p>
432
+ <p>Use <code>--browser-max-concurrent-tabs &lt;n&gt;</code> or <code>browser.maxConcurrentTabs</code> to tune the soft limit. Keep the value modest: too many concurrent ChatGPT tabs can make the UI unstable or trigger account-side throttling. Oracle also serializes manual-login Chrome startup for the shared profile, then reuses the first reachable DevTools session instead of racing multiple Chrome launches against the same <code>user-data-dir</code>. The short profile lock still serializes the send/upload moment so separate agents do not type into the same composer.</p>
439
433
  <p>For live concurrency smoke, the most stable path is one already-running signed-in Chrome with remote debugging enabled, plus <code>--remote-chrome &lt;host:port&gt;</code>. Direct parallel launch is supported defensively, but a persistent shared Chrome gives clearer ownership and avoids account/login churn across agents.</p>
440
434
  <h2 id="remote-chrome-sessions-headless-server-workflows"><a class="anchor" href="#remote-chrome-sessions-headless-server-workflows" aria-label="Anchor link">#</a>Remote Chrome Sessions (headless/server workflows)</h2>
441
435
  <p>Oracle can reuse an already-running Chrome/Edge instance on another machine by tunneling over the Chrome DevTools Protocol. This is handy when:</p>
@@ -517,7 +511,7 @@ body:not(.home) .doc>h1:first-child{display:none}
517
511
  <h2 id="limitations-follow-up-plan"><a class="anchor" href="#limitations-follow-up-plan" aria-label="Anchor link">#</a>Limitations / Follow-Up Plan</h2>
518
512
  <ul>
519
513
  <li><strong>Attachment lifecycle</strong> – in <code>auto</code> mode we prefer inlining files into the composer (fewer moving parts). When we do upload, each <code>--file</code> path is uploaded separately (or bundled) so ChatGPT can ingest filenames/content. The automation waits for uploads to finish (send button enabled, upload chips visible) before submitting. When inline paste is rejected by ChatGPT (too large), Oracle retries automatically with uploads.</li>
520
- <li><strong>Model picker drift</strong> – we rely on heuristics to pick GPT-5.6 / GPT-5.5 / GPT-5.4 / GPT-5.2 variants. If OpenAI changes the DOM we need to refresh the selectors quickly. Consider snapshot tests or a small “self check” command.</li>
514
+ <li><strong>Model picker drift</strong> – we rely on heuristics to pick GPT-5.5 / GPT-5.4 / GPT-5.2 variants. If OpenAI changes the DOM we need to refresh the selectors quickly. Consider snapshot tests or a small “self check” command.</li>
521
515
  <li><strong>Non-mac platforms</strong> – window hiding uses AppleScript today; Linux/Windows just ignore the flag. We should detect platforms explicitly and document the behavior.</li>
522
516
  <li><strong>Streaming UX</strong> – browser runs cannot stream tokens, so we emit heartbeat/status logs while waiting. Investigate whether we can stream clipboard deltas via mutation observers for a closer UX.</li>
523
517
  </ul>
@@ -250,21 +250,21 @@ body:not(.home) .doc>h1:first-child{display:none}
250
250
  <h2 id="core-consult-flags"><a class="anchor" href="#core-consult-flags" aria-label="Anchor link">#</a>Core consult flags</h2>
251
251
  <table><thead><tr><th>Flag</th><th>Purpose</th></tr></thead><tbody><tr><td><code>-p, --prompt &lt;text&gt;</code></td><td>Required prompt.</td></tr><tr><td><code>-f, --file &lt;paths...&gt;</code></td><td>Files / dirs / globs. Repeatable. <code>!</code> prefix = exclude.</td></tr><tr><td><code>-e, --engine &lt;api|browser&gt;</code></td><td>Force engine. Default: auto-pick.</td></tr><tr><td><code>-m, --model &lt;name&gt;</code></td><td>Single model. See <a href="mythical-pro-agents.html">Mythical Pro Agents</a>.</td></tr><tr><td><code>--models &lt;list&gt;</code></td><td>Comma-separated multi-model run (API only).</td></tr><tr><td><code>--slug &lt;name&gt;</code></td><td>Stable session slug.</td></tr><tr><td><code>--render</code></td><td>Print the assembled bundle to stdout.</td></tr><tr><td><code>--copy</code></td><td>Copy the bundle to the clipboard.</td></tr><tr><td><code>--write-output &lt;path&gt;</code></td><td>Save the final answer to a file; multi-model runs add per-model files plus <code>&lt;stem&gt;.oracle.json</code>.</td></tr><tr><td><code>--files-report</code></td><td>Print per-file token usage.</td></tr><tr><td><code>--dry-run [summary|json|full]</code></td><td>Preview without sending.</td></tr></tbody></table>
252
252
  <h2 id="followup-lineage"><a class="anchor" href="#followup-lineage" aria-label="Anchor link">#</a>Followup / lineage</h2>
253
- <table><thead><tr><th>Flag</th><th>Purpose</th></tr></thead><tbody><tr><td><code>--followup &lt;id|slug|resp_…&gt;</code></td><td>Continue a saved ChatGPT browser or OpenAI/Azure Responses API session.</td></tr><tr><td><code>--followup-model &lt;model&gt;</code></td><td>Pick API lineage when the parent used <code>--models</code>.</td></tr></tbody></table>
253
+ <table><thead><tr><th>Flag</th><th>Purpose</th></tr></thead><tbody><tr><td><code>--followup &lt;id|slug|resp_…&gt;</code></td><td>Continue an OpenAI/Azure Responses API run.</td></tr><tr><td><code>--followup-model &lt;model&gt;</code></td><td>Pick lineage when the parent used <code>--models</code>.</td></tr></tbody></table>
254
254
  <h2 id="run-control"><a class="anchor" href="#run-control" aria-label="Anchor link">#</a>Run control</h2>
255
- <table><thead><tr><th>Flag</th><th>Purpose</th></tr></thead><tbody><tr><td><code>--wait</code></td><td>Keep the original CLI attached until the session completes.</td></tr><tr><td><code>--timeout &lt;seconds|duration|auto&gt;</code></td><td>Overall API deadline. <code>auto</code> = 60m for Pro, 120s otherwise; accepts values like <code>10m</code>.</td></tr><tr><td><code>--background</code>, <code>--no-background</code></td><td>Force Responses API background mode on/off.</td></tr><tr><td><code>--http-timeout &lt;ms|s|m|h&gt;</code></td><td>Override the HTTP client timeout; explicit <code>--timeout</code> values are reused when omitted.</td></tr><tr><td><code>--allow-partial</code>, <code>--partial &lt;mode&gt;</code></td><td>Accept partial multi-model success when mode is <code>ok</code>; default mode is <code>fail</code>.</td></tr><tr><td><code>--preflight</code></td><td>Check redacted provider readiness for requested API model(s), then exit.</td></tr><tr><td><code>--perf-trace</code>, <code>--perf-trace-path &lt;path&gt;</code></td><td>Write CLI startup / first-output timing trace JSON.</td></tr><tr><td><code>--heartbeat &lt;seconds&gt;</code></td><td>Emit progress heartbeats; browser mode reports thinking-sidecar liveness.</td></tr></tbody></table>
255
+ <table><thead><tr><th>Flag</th><th>Purpose</th></tr></thead><tbody><tr><td><code>--wait</code></td><td>Block on background API runs.</td></tr><tr><td><code>--timeout &lt;seconds|duration|auto&gt;</code></td><td>Overall API deadline. <code>auto</code> = 60m for Pro, 120s otherwise; accepts values like <code>10m</code>.</td></tr><tr><td><code>--background</code>, <code>--no-background</code></td><td>Force Responses API background mode on/off.</td></tr><tr><td><code>--http-timeout &lt;ms|s|m|h&gt;</code></td><td>Override the HTTP client timeout; explicit <code>--timeout</code> values are reused when omitted.</td></tr><tr><td><code>--allow-partial</code>, <code>--partial &lt;mode&gt;</code></td><td>Accept partial multi-model success when mode is <code>ok</code>; default mode is <code>fail</code>.</td></tr><tr><td><code>--preflight</code></td><td>Check redacted provider readiness for requested API model(s), then exit.</td></tr><tr><td><code>--perf-trace</code>, <code>--perf-trace-path &lt;path&gt;</code></td><td>Write CLI startup / first-output timing trace JSON.</td></tr><tr><td><code>--heartbeat &lt;seconds&gt;</code></td><td>Emit progress heartbeats; browser mode reports thinking-sidecar liveness.</td></tr></tbody></table>
256
256
  <p>Notes:</p>
257
257
  <ul>
258
258
  <li><code>--dry-run</code> is mutually exclusive with <code>--render</code> / <code>--render-markdown</code>; choose the preview or rendered bundle path.</li>
259
259
  <li>Missing root prompts exit nonzero after help so scripts fail closed.</li>
260
- <li>Ctrl-C exits foreground API runs with code 130 and stops an attached local Pro browser worker. Unexpected foreground termination leaves the detached browser worker running so the session can still finish.</li>
260
+ <li>Ctrl-C exits foreground API runs with code 130. Browser runs still keep their cleanup / reattach path.</li>
261
261
  <li><code>--perf-trace=/tmp/oracle.json</code> is accepted in addition to <code>--perf-trace-path</code>; <code>ORACLE_PERF_TRACE=1</code> writes a local <code>.oracle-perf-…json</code> file.</li>
262
262
  </ul>
263
263
  <h2 id="api-endpoints"><a class="anchor" href="#api-endpoints" aria-label="Anchor link">#</a>API endpoints</h2>
264
264
  <table><thead><tr><th>Flag</th><th>Purpose</th></tr></thead><tbody><tr><td><code>--base-url &lt;url&gt;</code></td><td>LiteLLM / Azure / OpenRouter / proxy.</td></tr><tr><td><code>--provider &lt;mode&gt;</code></td><td>API route: <code>auto</code>, <code>openai</code>, or <code>azure</code>.</td></tr><tr><td><code>--no-azure</code></td><td>Ignore Azure env/config for this run.</td></tr><tr><td><code>--route</code></td><td>Print redacted API route plan, then exit.</td></tr><tr><td><code>--azure-endpoint</code></td><td>Azure OpenAI endpoint.</td></tr><tr><td><code>--azure-deployment</code></td><td>Azure deployment name.</td></tr><tr><td><code>--azure-api-version</code></td><td>Azure API version.</td></tr></tbody></table>
265
265
  <p>See <a href="openai-endpoints.html">OpenAI / Azure / OpenRouter</a> and <a href="openrouter.html">OpenRouter</a>.</p>
266
266
  <h2 id="browser-mode"><a class="anchor" href="#browser-mode" aria-label="Anchor link">#</a>Browser mode</h2>
267
- <table><thead><tr><th>Flag</th><th>Purpose</th></tr></thead><tbody><tr><td><code>--chatgpt-url &lt;url&gt;</code></td><td>Target a ChatGPT workspace / project folder.</td></tr><tr><td><code>--browser-model-strategy &lt;select|current|ignore&gt;</code></td><td>Control ChatGPT model picker.</td></tr><tr><td><code>--browser-manual-login</code></td><td>Use persistent profile + manual login (no Keychain).</td></tr><tr><td><code>--browser-attach-running</code></td><td>Attach to your already-running Chrome via DevTools.</td></tr><tr><td><code>--browser-tab &lt;ref&gt;</code></td><td>Reuse an existing tab (<code>current</code>, id, URL, title substring).</td></tr><tr><td><code>--browser-thinking-time &lt;light|standard|extended|extra-high|heavy&gt;</code></td><td>Effort intensity; unmatched tiers keep the current effort.</td></tr><tr><td><code>--browser-research deep</code></td><td>Activate Deep Research mode.</td></tr><tr><td><code>--browser-follow-up &lt;prompt&gt;</code></td><td>Multi-turn in the same ChatGPT conversation.</td></tr><tr><td><code>--browser-port &lt;port&gt;</code></td><td>Pin Chrome DevTools port.</td></tr><tr><td><code>--browser-inline-cookies[(-file)] &lt;…&gt;</code></td><td>Supply cookies inline (no Keychain / Chrome).</td></tr><tr><td><code>--browser-timeout</code>, <code>--browser-input-timeout</code>, <code>--browser-attachment-timeout</code></td><td>Overall / input / attachment readiness timeouts (h/m/s/ms).</td></tr><tr><td><code>--browser-recheck-delay</code>, <code>--browser-recheck-timeout</code></td><td>Delayed retry after a timeout.</td></tr><tr><td><code>--browser-auto-reattach-delay/-interval/-timeout</code></td><td>Poll the existing tab when ChatGPT redirects mid-load.</td></tr><tr><td><code>--browser-reuse-wait</code></td><td>Wait for shared Chrome profile before launching.</td></tr><tr><td><code>--browser-profile-lock-timeout</code></td><td>Wait for the manual-login profile lock.</td></tr><tr><td><code>--browser-max-concurrent-tabs</code></td><td>Soft limit for shared-profile parallel runs (default 3).</td></tr><tr><td><code>--browser-keep-browser</code></td><td>Keep the browser open after the run.</td></tr><tr><td><code>--browser-headless</code>, <code>--browser-hide-window</code></td><td>Visibility controls.</td></tr><tr><td><code>--browser-attachments &lt;auto|never|always&gt;</code></td><td>Attach files inline vs upload.</td></tr><tr><td><code>--browser-bundle-files</code>, <code>--browser-bundle-format &lt;auto|text|zip&gt;</code></td><td>Bundle browser uploads as text or byte-preserving ZIP.</td></tr><tr><td><code>--browser-chrome-path</code>, <code>--browser-cookie-path</code></td><td>Override Chrome / cookie store discovery (Linux / Windows).</td></tr></tbody></table>
267
+ <table><thead><tr><th>Flag</th><th>Purpose</th></tr></thead><tbody><tr><td><code>--chatgpt-url &lt;url&gt;</code></td><td>Target a ChatGPT workspace / project folder.</td></tr><tr><td><code>--browser-model-strategy &lt;select|current|ignore&gt;</code></td><td>Control ChatGPT model picker.</td></tr><tr><td><code>--browser-manual-login</code></td><td>Use persistent profile + manual login (no Keychain).</td></tr><tr><td><code>--browser-attach-running</code></td><td>Attach to your already-running Chrome via DevTools.</td></tr><tr><td><code>--browser-tab &lt;ref&gt;</code></td><td>Reuse an existing tab (<code>current</code>, id, URL, title substring).</td></tr><tr><td><code>--browser-thinking-time &lt;light|standard|extended|heavy&gt;</code></td><td>Pro / Thinking model intensity.</td></tr><tr><td><code>--browser-research deep</code></td><td>Activate Deep Research mode.</td></tr><tr><td><code>--browser-follow-up &lt;prompt&gt;</code></td><td>Multi-turn in the same ChatGPT conversation.</td></tr><tr><td><code>--browser-port &lt;port&gt;</code></td><td>Pin Chrome DevTools port.</td></tr><tr><td><code>--browser-inline-cookies[(-file)] &lt;…&gt;</code></td><td>Supply cookies inline (no Keychain / Chrome).</td></tr><tr><td><code>--browser-timeout</code>, <code>--browser-input-timeout</code></td><td>Overall / input timeouts (h/m/s/ms).</td></tr><tr><td><code>--browser-recheck-delay</code>, <code>--browser-recheck-timeout</code></td><td>Delayed retry after a timeout.</td></tr><tr><td><code>--browser-auto-reattach-delay/-interval/-timeout</code></td><td>Poll the existing tab when ChatGPT redirects mid-load.</td></tr><tr><td><code>--browser-reuse-wait</code></td><td>Wait for shared Chrome profile before launching.</td></tr><tr><td><code>--browser-profile-lock-timeout</code></td><td>Wait for the manual-login profile lock.</td></tr><tr><td><code>--browser-max-concurrent-tabs</code></td><td>Soft limit for shared-profile parallel runs (default 3).</td></tr><tr><td><code>--browser-keep-browser</code></td><td>Keep the browser open after the run.</td></tr><tr><td><code>--browser-headless</code>, <code>--browser-hide-window</code></td><td>Visibility controls.</td></tr><tr><td><code>--browser-attachments &lt;auto|never|always&gt;</code></td><td>Attach files inline vs upload.</td></tr><tr><td><code>--browser-bundle-files</code>, <code>--browser-bundle-format &lt;text|zip&gt;</code></td><td>Bundle browser uploads as text or ZIP.</td></tr><tr><td><code>--browser-chrome-path</code>, <code>--browser-cookie-path</code></td><td>Override Chrome / cookie store discovery (Linux / Windows).</td></tr></tbody></table>
268
268
  <p>See <a href="browser-mode.html">Browser Mode</a> for usage.</p>
269
269
  <h2 id="remote-browser"><a class="anchor" href="#remote-browser" aria-label="Anchor link">#</a>Remote browser</h2>
270
270
  <table><thead><tr><th>Flag</th><th>Purpose</th></tr></thead><tbody><tr><td><code>--remote-host &lt;host:port&gt;</code></td><td>Use a remote <code>oracle serve</code> host.</td></tr><tr><td><code>--remote-token &lt;secret&gt;</code></td><td>Auth for the remote host.</td></tr><tr><td><code>--remote-chrome &lt;host:port&gt;</code></td><td>Attach to an existing remote Chrome session.</td></tr></tbody></table>
@@ -273,12 +273,12 @@ body:not(.home) .doc>h1:first-child{display:none}
273
273
  <h2 id="stale-session-detection"><a class="anchor" href="#stale-session-detection" aria-label="Anchor link">#</a>Stale session detection</h2>
274
274
  <table><thead><tr><th>Flag</th><th>Purpose</th></tr></thead><tbody><tr><td><code>--zombie-timeout &lt;…&gt;</code></td><td>Cutoff for &quot;stale&quot; sessions.</td></tr><tr><td><code>--zombie-last-activity</code></td><td>Use last log entry instead of session start.</td></tr></tbody></table>
275
275
  <h2 id="environment-variables"><a class="anchor" href="#environment-variables" aria-label="Anchor link">#</a>Environment variables</h2>
276
- <table><thead><tr><th>Var</th><th>Effect</th></tr></thead><tbody><tr><td><code>OPENAI_API_KEY</code></td><td>Enables OpenAI API mode.</td></tr><tr><td><code>AZURE_OPENAI_API_KEY</code> etc.</td><td>Enables Azure mode (paired with endpoint / deployment).</td></tr><tr><td><code>GEMINI_API_KEY</code></td><td>Enables Gemini API mode.</td></tr><tr><td><code>ANTHROPIC_API_KEY</code></td><td>Enables Claude API mode.</td></tr><tr><td><code>OPENROUTER_API_KEY</code></td><td>Enables OpenRouter ids.</td></tr><tr><td><code>ORACLE_HOME_DIR</code></td><td>Override <code>~/.oracle/</code> root.</td></tr><tr><td><code>ORACLE_MAX_FILE_SIZE_BYTES</code></td><td>Per-file size cap (default 1 MB).</td></tr><tr><td><code>ORACLE_BROWSER_COOKIES_JSON</code></td><td>Inline ChatGPT cookies (JSON / base64).</td></tr><tr><td><code>ORACLE_BROWSER_COOKIES_FILE</code></td><td>Path to cookies JSON.</td></tr><tr><td><code>ORACLE_BROWSER_ATTACHMENT_TIMEOUT</code></td><td>Attachment upload/readiness timeout for browser mode.</td></tr><tr><td><code>ORACLE_CHATGPT_ACCOUNT_EMAIL</code></td><td>Exact saved account for the Welcome back picker.</td></tr></tbody></table>
276
+ <table><thead><tr><th>Var</th><th>Effect</th></tr></thead><tbody><tr><td><code>OPENAI_API_KEY</code></td><td>Enables OpenAI API mode.</td></tr><tr><td><code>AZURE_OPENAI_API_KEY</code> etc.</td><td>Enables Azure mode (paired with endpoint / deployment).</td></tr><tr><td><code>GEMINI_API_KEY</code></td><td>Enables Gemini API mode.</td></tr><tr><td><code>ANTHROPIC_API_KEY</code></td><td>Enables Claude API mode.</td></tr><tr><td><code>OPENROUTER_API_KEY</code></td><td>Enables OpenRouter ids.</td></tr><tr><td><code>ORACLE_HOME_DIR</code></td><td>Override <code>~/.oracle/</code> root.</td></tr><tr><td><code>ORACLE_MAX_FILE_SIZE_BYTES</code></td><td>Per-file size cap (default 1 MB).</td></tr><tr><td><code>ORACLE_BROWSER_COOKIES_JSON</code></td><td>Inline ChatGPT cookies (JSON / base64).</td></tr><tr><td><code>ORACLE_BROWSER_COOKIES_FILE</code></td><td>Path to cookies JSON.</td></tr></tbody></table>
277
277
  <h2 id="see-also"><a class="anchor" href="#see-also" aria-label="Anchor link">#</a>See also</h2>
278
278
  <ul>
279
279
  <li><code>oracle --help</code> — short usage.</li>
280
280
  <li><code>oracle --help --verbose</code> — every flag, including hidden ones.</li>
281
- <li><a href="configuration.html">Configuration</a> — <code>~/.oracle/config.json</code> and project <code>.oracle/config.json</code> defaults.</li>
281
+ <li><a href="configuration.html">Configuration</a> — <code>~/.oracle/config.json</code> defaults.</li>
282
282
  </ul><nav class="page-nav" aria-label="Pager"><a class="page-nav-prev" href="multimodel.html"><small>Previous</small><span>Multi-Model Execution</span></a><a class="page-nav-next" href="spec.html"><small>Next</small><span>Spec</span></a></nav></article>
283
283
  <nav class="toc" aria-label="On this page"><h2>On this page</h2><a class="toc-l2" href="#commands">Commands</a><a class="toc-l2" href="#core-consult-flags">Core consult flags</a><a class="toc-l2" href="#followup-lineage">Followup / lineage</a><a class="toc-l2" href="#run-control">Run control</a><a class="toc-l2" href="#api-endpoints">API endpoints</a><a class="toc-l2" href="#browser-mode">Browser mode</a><a class="toc-l2" href="#remote-browser">Remote browser</a><a class="toc-l2" href="#image-media-browser">Image / media (browser)</a><a class="toc-l2" href="#stale-session-detection">Stale session detection</a><a class="toc-l2" href="#environment-variables">Environment variables</a><a class="toc-l2" href="#see-also">See also</a></nav>
284
284
  </div>
@@ -245,7 +245,7 @@ body:not(.home) .doc>h1:first-child{display:none}
245
245
  </header>
246
246
  <div class="doc-grid">
247
247
  <article class="doc"><h1 id="local-configuration-json5">Local configuration (JSON5)</h1>
248
- <p>Oracle reads an optional per-user config from <code>~/.oracle/config.json</code>, then layers project configs from <code>.oracle/config.json</code> files discovered from your working directory upward, stopping before your home directory. All config files use JSON5 parsing, so trailing commas and comments are allowed.</p>
248
+ <p>Oracle reads an optional per-user config from <code>~/.oracle/config.json</code>. The file uses JSON5 parsing, so trailing commas and comments are allowed.</p>
249
249
  <h2 id="example-oracle-config-json"><a class="anchor" href="#example-oracle-config-json" aria-label="Anchor link">#</a>Example (<code>~/.oracle/config.json</code>)</h2>
250
250
  <pre class="shiki github-dark-dimmed" style="background-color:var(--code-bg);color:var(--code-fg)" tabindex="0"><code class="language-json5"><span class="line"><span style="color:#ADBAC7">{</span></span>
251
251
  <span class="line"><span style="color:#768390"> // Default engine when neither CLI flag nor env decide</span></span>
@@ -272,18 +272,17 @@ body:not(.home) .doc>h1:first-child{display:none}
272
272
  <span class="line"><span style="color:#96D0FF"> debugPort</span><span style="color:#ADBAC7">: </span><span style="color:#6CB6FF">null</span><span style="color:#ADBAC7">, </span><span style="color:#768390">// fixed DevTools port (env: ORACLE_BROWSER_PORT / ORACLE_BROWSER_DEBUG_PORT)</span></span>
273
273
  <span class="line"><span style="color:#96D0FF"> timeoutMs</span><span style="color:#ADBAC7">: </span><span style="color:#6CB6FF">1200000</span><span style="color:#ADBAC7">,</span></span>
274
274
  <span class="line"><span style="color:#96D0FF"> inputTimeoutMs</span><span style="color:#ADBAC7">: </span><span style="color:#6CB6FF">30000</span><span style="color:#ADBAC7">,</span></span>
275
- <span class="line"><span style="color:#96D0FF"> attachmentTimeoutMs</span><span style="color:#ADBAC7">: </span><span style="color:#6CB6FF">90000</span><span style="color:#ADBAC7">, </span><span style="color:#768390">// wait for file upload/readiness before clicking Send (default: 45s)</span></span>
276
275
  <span class="line"><span style="color:#96D0FF"> cookieSyncWaitMs</span><span style="color:#ADBAC7">: </span><span style="color:#6CB6FF">0</span><span style="color:#ADBAC7">, </span><span style="color:#768390">// wait (ms) before retrying cookie sync when Chrome cookies are empty/locked</span></span>
277
276
  <span class="line"><span style="color:#96D0FF"> assistantRecheckDelayMs</span><span style="color:#ADBAC7">: </span><span style="color:#6CB6FF">0</span><span style="color:#ADBAC7">, </span><span style="color:#768390">// wait this long after timeout, then retry capture (0 = disabled)</span></span>
278
277
  <span class="line"><span style="color:#96D0FF"> assistantRecheckTimeoutMs</span><span style="color:#ADBAC7">: </span><span style="color:#6CB6FF">120000</span><span style="color:#ADBAC7">, </span><span style="color:#768390">// time budget for the recheck attempt (default: 2m)</span></span>
279
278
  <span class="line"><span style="color:#96D0FF"> reuseChromeWaitMs</span><span style="color:#ADBAC7">: </span><span style="color:#6CB6FF">10000</span><span style="color:#ADBAC7">, </span><span style="color:#768390">// wait for a shared Chrome profile to appear before launching (parallel runs)</span></span>
280
279
  <span class="line"><span style="color:#96D0FF"> profileLockTimeoutMs</span><span style="color:#ADBAC7">: </span><span style="color:#6CB6FF">300000</span><span style="color:#ADBAC7">, </span><span style="color:#768390">// wait for the manual-login profile lock before sending (parallel runs)</span></span>
281
- <span class="line"><span style="color:#96D0FF"> maxConcurrentTabs</span><span style="color:#ADBAC7">: </span><span style="color:#6CB6FF">3</span><span style="color:#ADBAC7">, </span><span style="color:#768390">// soft limit for concurrent ChatGPT tabs using one manual-login profile (or set ORACLE_BROWSER_MAX_CONCURRENT_TABS)</span></span>
280
+ <span class="line"><span style="color:#96D0FF"> maxConcurrentTabs</span><span style="color:#ADBAC7">: </span><span style="color:#6CB6FF">3</span><span style="color:#ADBAC7">, </span><span style="color:#768390">// soft limit for concurrent ChatGPT tabs using one manual-login profile</span></span>
282
281
  <span class="line"><span style="color:#96D0FF"> autoReattachDelayMs</span><span style="color:#ADBAC7">: </span><span style="color:#6CB6FF">0</span><span style="color:#ADBAC7">, </span><span style="color:#768390">// delay before starting periodic auto-reattach attempts (0 = disabled)</span></span>
283
282
  <span class="line"><span style="color:#96D0FF"> autoReattachIntervalMs</span><span style="color:#ADBAC7">: </span><span style="color:#6CB6FF">0</span><span style="color:#ADBAC7">, </span><span style="color:#768390">// interval between auto-reattach attempts (0 = disabled)</span></span>
284
283
  <span class="line"><span style="color:#96D0FF"> autoReattachTimeoutMs</span><span style="color:#ADBAC7">: </span><span style="color:#6CB6FF">120000</span><span style="color:#ADBAC7">, </span><span style="color:#768390">// time budget per auto-reattach attempt (default: 2m)</span></span>
285
284
  <span class="line"><span style="color:#96D0FF"> modelStrategy</span><span style="color:#ADBAC7">: </span><span style="color:#96D0FF">"select"</span><span style="color:#ADBAC7">, </span><span style="color:#768390">// select | current | ignore (ChatGPT only; ignored for Gemini web)</span></span>
286
- <span class="line"><span style="color:#96D0FF"> thinkingTime</span><span style="color:#ADBAC7">: </span><span style="color:#96D0FF">"extended"</span><span style="color:#ADBAC7">, </span><span style="color:#768390">// light | standard | extended | extra-high | heavy (ChatGPT Thinking/Pro models)</span></span>
285
+ <span class="line"><span style="color:#96D0FF"> thinkingTime</span><span style="color:#ADBAC7">: </span><span style="color:#96D0FF">"extended"</span><span style="color:#ADBAC7">, </span><span style="color:#768390">// light | standard | extended | heavy (ChatGPT Thinking/Pro models)</span></span>
287
286
  <span class="line"><span style="color:#96D0FF"> researchMode</span><span style="color:#ADBAC7">: </span><span style="color:#96D0FF">"off"</span><span style="color:#ADBAC7">, </span><span style="color:#768390">// off | deep (ChatGPT Deep Research; browser only)</span></span>
288
287
  <span class="line"><span style="color:#96D0FF"> manualLogin</span><span style="color:#ADBAC7">: </span><span style="color:#6CB6FF">false</span><span style="color:#ADBAC7">, </span><span style="color:#768390">// set true to reuse a persistent automation profile and sign in once (Windows defaults to true when unset)</span></span>
289
288
  <span class="line"><span style="color:#96D0FF"> manualLoginProfileDir</span><span style="color:#ADBAC7">: </span><span style="color:#6CB6FF">null</span><span style="color:#ADBAC7">, </span><span style="color:#768390">// override profile dir (or set ORACLE_BROWSER_PROFILE_DIR)</span></span>
@@ -307,40 +306,15 @@ body:not(.home) .doc>h1:first-child{display:none}
307
306
  <span class="line"><span style="color:#96D0FF"> sessionRetentionHours</span><span style="color:#ADBAC7">: </span><span style="color:#6CB6FF">72</span><span style="color:#ADBAC7">, </span><span style="color:#768390">// prune cached sessions older than 72h before each run (0 disables)</span></span>
308
307
  <span class="line"><span style="color:#96D0FF"> promptSuffix</span><span style="color:#ADBAC7">: </span><span style="color:#96D0FF">"// signed-off by me"</span><span style="color:#ADBAC7">, </span><span style="color:#768390">// appended to every prompt</span></span>
309
308
  <span class="line"><span style="color:#96D0FF"> apiBaseUrl</span><span style="color:#ADBAC7">: </span><span style="color:#96D0FF">"https://api.openai.com/v1"</span><span style="color:#ADBAC7">, </span><span style="color:#768390">// override for LiteLLM / custom gateways</span></span>
310
- <span class="line"><span style="color:#768390"> // API-only, user-config-only overrides for known model keys.</span></span>
311
- <span class="line"><span style="color:#96D0FF"> modelOverrides</span><span style="color:#ADBAC7">: {</span></span>
312
- <span class="line"><span style="color:#96D0FF"> "gpt-5.5"</span><span style="color:#ADBAC7">: {</span></span>
313
- <span class="line"><span style="color:#96D0FF"> apiModel</span><span style="color:#ADBAC7">: </span><span style="color:#96D0FF">"gateway-model"</span><span style="color:#ADBAC7">, </span><span style="color:#768390">// on-wire id exposed by the gateway</span></span>
314
- <span class="line"><span style="color:#96D0FF"> reasoning</span><span style="color:#ADBAC7">: { </span><span style="color:#96D0FF">effort</span><span style="color:#ADBAC7">: </span><span style="color:#96D0FF">"xhigh"</span><span style="color:#ADBAC7"> }, </span><span style="color:#768390">// or null to clear the bundled effort</span></span>
315
- <span class="line"><span style="color:#96D0FF"> inputLimit</span><span style="color:#ADBAC7">: </span><span style="color:#6CB6FF">1050000</span><span style="color:#ADBAC7">,</span></span>
316
- <span class="line"><span style="color:#96D0FF"> pricing</span><span style="color:#ADBAC7">: { </span><span style="color:#96D0FF">inputPerToken</span><span style="color:#ADBAC7">: </span><span style="color:#6CB6FF">0.000005</span><span style="color:#ADBAC7">, </span><span style="color:#96D0FF">outputPerToken</span><span style="color:#ADBAC7">: </span><span style="color:#6CB6FF">0.00003</span><span style="color:#ADBAC7"> },</span></span>
317
- <span class="line"><span style="color:#ADBAC7"> },</span></span>
318
- <span class="line"><span style="color:#ADBAC7"> },</span></span>
319
- <span class="line"><span style="color:#ADBAC7">}</span></span></code></pre>
320
- <h2 id="project-configs"><a class="anchor" href="#project-configs" aria-label="Anchor link">#</a>Project configs</h2>
321
- <p>Put a project-level config at <code>.oracle/config.json</code> inside any project folder:</p>
322
- <pre class="shiki github-dark-dimmed" style="background-color:var(--code-bg);color:var(--code-fg)" tabindex="0"><code class="language-json5"><span class="line"><span style="color:#ADBAC7">{</span></span>
323
- <span class="line"><span style="color:#96D0FF"> engine</span><span style="color:#ADBAC7">: </span><span style="color:#96D0FF">"browser"</span><span style="color:#ADBAC7">,</span></span>
324
- <span class="line"><span style="color:#96D0FF"> model</span><span style="color:#ADBAC7">: </span><span style="color:#96D0FF">"gpt-5.5-pro"</span><span style="color:#ADBAC7">,</span></span>
325
- <span class="line"><span style="color:#96D0FF"> browser</span><span style="color:#ADBAC7">: {</span></span>
326
- <span class="line"><span style="color:#96D0FF"> chatgptUrl</span><span style="color:#ADBAC7">: </span><span style="color:#96D0FF">"https://chatgpt.com/g/g-p-example/project"</span><span style="color:#ADBAC7">,</span></span>
327
- <span class="line"><span style="color:#96D0FF"> modelStrategy</span><span style="color:#ADBAC7">: </span><span style="color:#96D0FF">"current"</span><span style="color:#ADBAC7">,</span></span>
328
- <span class="line"><span style="color:#96D0FF"> archiveConversations</span><span style="color:#ADBAC7">: </span><span style="color:#96D0FF">"never"</span><span style="color:#ADBAC7">,</span></span>
329
- <span class="line"><span style="color:#ADBAC7"> },</span></span>
330
309
  <span class="line"><span style="color:#ADBAC7">}</span></span></code></pre>
331
- <p>Oracle discovers every <code>.oracle/config.json</code> from the current directory upward until your home directory, then applies them from parent to child after the user config. Nested objects are merged, while scalars and arrays replace earlier values. This lets a parent folder set broad defaults and override a specific ChatGPT Project URL in a package subdirectory.</p>
332
- <p>Project configs intentionally support only workflow defaults. They cannot set provider routing or secret/executable fields such as <code>apiBaseUrl</code>, <code>modelOverrides</code>, <code>azure</code>, <code>browser.remoteHost</code>, <code>browser.remoteToken</code>, <code>browser.chromePath</code>, or <code>browser.chromeCookiePath</code>. Keep tokens and machine-local executable/profile paths in <code>~/.oracle/config.json</code>, environment variables, or explicit CLI flags.</p>
333
310
  <h2 id="precedence"><a class="anchor" href="#precedence" aria-label="Anchor link">#</a>Precedence</h2>
334
- <p>CLI flags and explicit override environment variables effective config (project <code>.oracle/config.json</code> files over <code>~/.oracle/config.json</code>)auto-detected environment → built-in defaults.</p>
311
+ <p>CLI flags → <code>config.json</code> → environment → built-in defaults.</p>
335
312
  <ul>
336
- <li>The effective config starts with <code>~/.oracle/config.json</code>, then layers project <code>.oracle/config.json</code> files from parent to child. <code>engine</code>, <code>model</code>, <code>search</code>, <code>filesReport</code>, <code>heartbeatSeconds</code>, <code>maxFileSizeBytes</code>, and <code>apiBaseUrl</code> in the effective config override auto-detected values unless explicitly set on the CLI or through a supported override environment variable.</li>
337
- <li>Project <code>.oracle/config.json</code> files can override safe workflow defaults such as <code>engine</code>, <code>model</code>, <code>search</code>, <code>filesReport</code>, <code>heartbeatSeconds</code>, <code>maxFileSizeBytes</code>, <code>promptSuffix</code>, and allowed <code>browser.*</code> workflow settings.</li>
338
- <li>Provider routing and machine-local fields (<code>apiBaseUrl</code>, <code>modelOverrides</code>, <code>azure</code>, remote browser host/token defaults, Chrome binary/profile paths, cookie DB paths, and session retention cleanup) are ignored in project configs and are read only from the user config, environment variables, or explicit CLI flags.</li>
313
+ <li><code>engine</code>, <code>model</code>, <code>search</code>, <code>filesReport</code>, <code>heartbeatSeconds</code>, <code>maxFileSizeBytes</code>, and <code>apiBaseUrl</code> in <code>config.json</code> override the auto-detected values unless explicitly set on the CLI.</li>
339
314
  <li><code>ORACLE_ENGINE=api|browser</code> is a global override for engine selection (useful for MCP/Codex setups); it wins over <code>config.json</code>.</li>
340
315
  <li>If <code>azure.endpoint</code> (or <code>--azure-endpoint</code>) is set, Oracle reads <code>AZURE_OPENAI_API_KEY</code> first and falls back to <code>OPENAI_API_KEY</code> for GPT models.</li>
341
316
  <li>Remote browser defaults follow the same order: <code>--remote-host/--remote-token</code> win, then <code>browser.remoteHost</code> / <code>browser.remoteToken</code> in the config, then <code>ORACLE_REMOTE_HOST</code> / <code>ORACLE_REMOTE_TOKEN</code> if still unset.</li>
342
317
  <li><code>OPENAI_API_KEY</code> only influences engine selection when neither the CLI nor <code>config.json</code> specify an engine (API when present, otherwise browser).</li>
343
- <li><code>modelOverrides</code> applies only to API runs and existing built-in model keys. It can replace the on-wire <code>apiModel</code>, reasoning effort, input limit, and per-token pricing; unspecified fields and the bundled tokenizer remain unchanged. Invalid override values are ignored. Project configs cannot set this field.</li>
344
318
  <li><code>ORACLE_NOTIFY*</code> env vars still layer on top of the config’s <code>notify</code> block.</li>
345
319
  <li><code>sessionRetentionHours</code> controls the default value for <code>--retain-hours</code>. When unset, <code>ORACLE_RETAIN_HOURS</code> (if present) becomes the fallback, and the CLI flag still wins over both.</li>
346
320
  <li><code>ORACLE_MAX_FILE_SIZE_BYTES</code> overrides <code>maxFileSizeBytes</code> when set. Oracle validates it as a positive integer number of bytes before reading any <code>--file</code> inputs.</li>
@@ -360,7 +334,7 @@ body:not(.home) .doc>h1:first-child{display:none}
360
334
  <h2 id="follow-up-chaining"><a class="anchor" href="#follow-up-chaining" aria-label="Anchor link">#</a>Follow-up chaining</h2>
361
335
  <p><code>--followup</code> and <code>--followup-model</code> are CLI run flags (not persisted defaults in <code>config.json</code>).</p>
362
336
  <ul>
363
- <li><code>--followup &lt;sessionId|responseId&gt;</code> continues a saved ChatGPT browser conversation or an OpenAI/Azure Responses API run. Browser followup reopens the exact conversation and inherits the parent&#39;s browser profile, configuration, and model; API followup accepts a stored Oracle session id or a <code>resp_...</code> Responses API id.</li>
337
+ <li><code>--followup &lt;sessionId|responseId&gt;</code> continues an OpenAI/Azure Responses API run from either a stored Oracle session id or a <code>resp_...</code> Responses API id.</li>
364
338
  <li>For multi-model OpenAI/Azure parent sessions, add <code>--followup-model &lt;model&gt;</code> to choose which parent model response to chain from.</li>
365
339
  <li>Gemini/Claude API runs and custom <code>--base-url</code> providers are intentionally excluded because Oracle cannot preserve <code>previous_response_id</code> through those adapters.</li>
366
340
  <li>If the session id is wrong, Oracle now prints actionable guidance and suggests close matches from local session history.</li>
@@ -396,7 +370,7 @@ body:not(.home) .doc>h1:first-child{display:none}
396
370
  <li>Detached API runs write a session-suffixed child trace beside the requested trace path so startup and background execution can be inspected separately.</li>
397
371
  <li>Useful events: <code>cli-module-ready</code>, <code>pre-action</code>, <code>root-command-start</code>, <code>first-output</code>, <code>command-action-complete</code>, and <code>exit</code>.</li>
398
372
  </ul><nav class="page-nav" aria-label="Pager"><a class="page-nav-prev" href="quickstart.html"><small>Previous</small><span>Quickstart</span></a><a class="page-nav-next" href="mythical-pro-agents.html"><small>Next</small><span>Mythical Pro Agents</span></a></nav></article>
399
- <nav class="toc" aria-label="On this page"><h2>On this page</h2><a class="toc-l2" href="#example-oracle-config-json">Example (~/.oracle/config.json)</a><a class="toc-l2" href="#project-configs">Project configs</a><a class="toc-l2" href="#precedence">Precedence</a><a class="toc-l2" href="#session-retention">Session retention</a><a class="toc-l2" href="#follow-up-chaining">Follow-up chaining</a><a class="toc-l2" href="#api-timeouts">API timeouts</a><a class="toc-l2" href="#zombie-session-staleness">Zombie/session staleness</a><a class="toc-l2" href="#performance-traces">Performance traces</a></nav>
373
+ <nav class="toc" aria-label="On this page"><h2>On this page</h2><a class="toc-l2" href="#example-oracle-config-json">Example (~/.oracle/config.json)</a><a class="toc-l2" href="#precedence">Precedence</a><a class="toc-l2" href="#session-retention">Session retention</a><a class="toc-l2" href="#follow-up-chaining">Follow-up chaining</a><a class="toc-l2" href="#api-timeouts">API timeouts</a><a class="toc-l2" href="#zombie-session-staleness">Zombie/session staleness</a><a class="toc-l2" href="#performance-traces">Performance traces</a></nav>
400
374
  </div>
401
375
  </main>
402
376
  </div>
@@ -4,19 +4,19 @@
4
4
  <meta charset="utf-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1">
6
6
  <title>Followups &amp; Lineage — oracle</title>
7
- <meta name="description" content="Continue a saved ChatGPT browser conversation or an OpenAI / Azure Responses API run.">
7
+ <meta name="description" content="Continue an OpenAI / Azure Responses API run with new files. Multi-model parents pick lineage via --followup-model.">
8
8
  <link rel="canonical" href="https://askoracle.sh/followup.html">
9
9
  <meta property="og:type" content="website">
10
10
  <meta property="og:site_name" content="oracle">
11
11
  <meta property="og:title" content="Followups &amp; Lineage — oracle">
12
- <meta property="og:description" content="Continue a saved ChatGPT browser conversation or an OpenAI / Azure Responses API run.">
12
+ <meta property="og:description" content="Continue an OpenAI / Azure Responses API run with new files. Multi-model parents pick lineage via --followup-model.">
13
13
  <meta property="og:url" content="https://askoracle.sh/followup.html">
14
14
  <meta property="og:image" content="https://askoracle.sh/social-card.png">
15
15
  <meta property="og:image:width" content="1200">
16
16
  <meta property="og:image:height" content="630">
17
17
  <meta name="twitter:card" content="summary_large_image">
18
18
  <meta name="twitter:title" content="Followups &amp; Lineage — oracle">
19
- <meta name="twitter:description" content="Continue a saved ChatGPT browser conversation or an OpenAI / Azure Responses API run.">
19
+ <meta name="twitter:description" content="Continue an OpenAI / Azure Responses API run with new files. Multi-model parents pick lineage via --followup-model.">
20
20
  <meta name="twitter:image" content="https://askoracle.sh/social-card.png">
21
21
  <link rel="icon" href="favicon.svg" type="image/svg+xml">
22
22
  <link rel="preconnect" href="https://fonts.googleapis.com">
@@ -244,7 +244,7 @@ body:not(.home) .doc>h1:first-child{display:none}
244
244
  </div>
245
245
  </header>
246
246
  <div class="doc-grid">
247
- <article class="doc"><p><code>--followup</code> chains a new run onto an existing session. Oracle selects the continuation path from the parent: ChatGPT browser sessions reopen the exact saved conversation, while OpenAI and Azure Responses API sessions use the stored provider response id. You can supply an additional prompt + files, and <code>oracle status</code> shows the parent/child lineage.</p>
247
+ <article class="doc"><p><code>--followup</code> chains a new run onto an existing OpenAI or Azure Responses API session. The model keeps its prior reasoning context; you supply additional prompt + files. Lineage is tracked in <code>oracle status</code> so you can see the whole tree at a glance.</p>
248
248
  <h2 id="why-followup-instead-of-starting-fresh"><a class="anchor" href="#why-followup-instead-of-starting-fresh" aria-label="Anchor link">#</a>Why followup instead of starting fresh</h2>
249
249
  <ul>
250
250
  <li><strong>Cheaper.</strong> You don&#39;t re-pay for the original input tokens.</li>
@@ -261,18 +261,12 @@ body:not(.home) .doc>h1:first-child{display:none}
261
261
  <span class="line"><span style="color:#F69D50">oracle</span><span style="color:#6CB6FF"> --followup</span><span style="color:#96D0FF"> arch-review</span><span style="color:#F47067"> \</span></span>
262
262
  <span class="line"><span style="color:#6CB6FF"> -p</span><span style="color:#96D0FF"> "Re-evaluate now that the rate-limiter is wired in."</span><span style="color:#F47067"> \</span></span>
263
263
  <span class="line"><span style="color:#6CB6FF"> --file</span><span style="color:#96D0FF"> "src/auth/rate-limiter.ts"</span></span></code></pre>
264
- <p>For API sessions, <code>--followup</code> accepts:</p>
264
+ <p><code>--followup</code> accepts:</p>
265
265
  <ul>
266
266
  <li>A stored session id (<code>a1b2c3…</code>)</li>
267
267
  <li>A session slug (<code>arch-review</code>)</li>
268
268
  <li>An OpenAI / Azure response id (<code>resp_abc1234…</code>) — useful for chaining onto runs that didn&#39;t originate in Oracle.</li>
269
269
  </ul>
270
- <p>For a saved ChatGPT browser session, pass its session id or slug:</p>
271
- <pre class="shiki github-dark-dimmed" style="background-color:var(--code-bg);color:var(--code-fg)" tabindex="0"><code class="language-bash"><span class="line"><span style="color:#F69D50">oracle</span><span style="color:#6CB6FF"> --followup</span><span style="color:#96D0FF"> browser-architecture-review</span><span style="color:#F47067"> \</span></span>
272
- <span class="line"><span style="color:#6CB6FF"> -p</span><span style="color:#96D0FF"> "Review this additional file in the same conversation."</span><span style="color:#F47067"> \</span></span>
273
- <span class="line"><span style="color:#6CB6FF"> --file</span><span style="color:#96D0FF"> "src/auth/rate-limiter.ts"</span></span></code></pre>
274
- <p>Oracle creates a child session, reopens the parent&#39;s exact ChatGPT conversation, and submits the new prompt there. It inherits the parent&#39;s browser profile, browser configuration, and model, bypasses the model picker, disables Deep Research for the resumed turn, and leaves the conversation unarchived.</p>
275
- <p>Browser resume is fail-closed: Oracle refuses to submit if the saved URL is not a recoverable HTTPS ChatGPT conversation, the page has no stable prior turns, or the browser lands on a different conversation.</p>
276
270
  <h2 id="multi-model-parents"><a class="anchor" href="#multi-model-parents" aria-label="Anchor link">#</a>Multi-model parents</h2>
277
271
  <p>When the parent used <code>--models a,b,c</code>, pick which lineage to continue from with <code>--followup-model</code>:</p>
278
272
  <pre class="shiki github-dark-dimmed" style="background-color:var(--code-bg);color:var(--code-fg)" tabindex="0"><code class="language-bash"><span class="line"><span style="color:#F69D50">oracle</span><span style="color:#6CB6FF"> --followup</span><span style="color:#96D0FF"> arch-review</span><span style="color:#6CB6FF"> --followup-model</span><span style="color:#96D0FF"> gpt-5.5-pro</span><span style="color:#F47067"> \</span></span>
@@ -280,10 +274,10 @@ body:not(.home) .doc>h1:first-child{display:none}
280
274
  <span class="line"><span style="color:#6CB6FF"> --file</span><span style="color:#96D0FF"> "src/auth/rate-limiter.ts"</span></span></code></pre>
281
275
  <p>Without <code>--followup-model</code>, Oracle errors with the available lineage.</p>
282
276
  <h2 id="what-s-chainable"><a class="anchor" href="#what-s-chainable" aria-label="Anchor link">#</a>What&#39;s chainable</h2>
283
- <table><thead><tr><th>Provider</th><th>Followup support</th></tr></thead><tbody><tr><td>OpenAI Responses API</td><td>✅ via <code>previous_response_id</code></td></tr><tr><td>Azure OpenAI (Responses)</td><td>✅ via <code>previous_response_id</code></td></tr><tr><td>ChatGPT browser mode</td><td>✅ saved sessions; see <a href="#same-run-browser-multi-turn">Same-run browser multi-turn</a></td></tr><tr><td>Anthropic</td><td>❌ no Oracle-side response id chaining yet</td></tr><tr><td>Gemini</td><td>❌</td></tr><tr><td>OpenRouter</td><td>❌</td></tr><tr><td>Custom <code>--base-url</code></td><td>❌ — unknown whether the upstream preserves the id</td></tr></tbody></table>
277
+ <table><thead><tr><th>Provider</th><th>Followup support</th></tr></thead><tbody><tr><td>OpenAI Responses API</td><td>✅ via <code>previous_response_id</code></td></tr><tr><td>Azure OpenAI (Responses)</td><td>✅ via <code>previous_response_id</code></td></tr><tr><td>Anthropic</td><td>❌ no Oracle-side response id chaining yet</td></tr><tr><td>Gemini</td><td>❌</td></tr><tr><td>OpenRouter</td><td>❌</td></tr><tr><td>Custom <code>--base-url</code></td><td>❌ — unknown whether the upstream preserves the id</td></tr><tr><td>Browser mode (ChatGPT)</td><td>partial — see <a href="#browser-multi-turn">Browser multi-turn</a></td></tr></tbody></table>
284
278
  <p>If you try to follow up on an unsupported provider, Oracle errors clearly instead of silently starting fresh.</p>
285
- <h2 id="same-run-browser-multi-turn"><a class="anchor" href="#same-run-browser-multi-turn" aria-label="Anchor link">#</a>Same-run browser multi-turn</h2>
286
- <p>In browser mode, <code>--browser-follow-up</code> adds planned prompts to the <em>same ChatGPT conversation</em> during one Oracle run:</p>
279
+ <h2 id="browser-multi-turn"><a class="anchor" href="#browser-multi-turn" aria-label="Anchor link">#</a>Browser multi-turn</h2>
280
+ <p>In browser mode, <code>--browser-follow-up</code> adds extra prompts to the <em>same ChatGPT conversation</em>, which is the closest equivalent to a chained API followup:</p>
287
281
  <pre class="shiki github-dark-dimmed" style="background-color:var(--code-bg);color:var(--code-fg)" tabindex="0"><code class="language-bash"><span class="line"><span style="color:#F69D50">oracle</span><span style="color:#6CB6FF"> --engine</span><span style="color:#96D0FF"> browser</span><span style="color:#6CB6FF"> --model</span><span style="color:#96D0FF"> gpt-5.5-pro</span><span style="color:#F47067"> \</span></span>
288
282
  <span class="line"><span style="color:#6CB6FF"> -p</span><span style="color:#96D0FF"> "Review this migration plan"</span><span style="color:#6CB6FF"> --file</span><span style="color:#96D0FF"> docs/migration.md</span><span style="color:#F47067"> \</span></span>
289
283
  <span class="line"><span style="color:#6CB6FF"> --browser-follow-up</span><span style="color:#96D0FF"> "Challenge your previous recommendation"</span><span style="color:#F47067"> \</span></span>
@@ -305,11 +299,10 @@ body:not(.home) .doc>h1:first-child{display:none}
305
299
  <h2 id="limitations"><a class="anchor" href="#limitations" aria-label="Anchor link">#</a>Limitations</h2>
306
300
  <ul>
307
301
  <li>Followups don&#39;t move between providers. You can&#39;t follow up an OpenAI run with a Gemini one — open a new session and re-bundle.</li>
308
- <li>Browser followup requires a recoverable HTTPS ChatGPT conversation URL and an authenticated browser profile. Gemini web sessions are not supported.</li>
309
302
  <li><code>previous_response_id</code> retention on OpenAI / Azure varies by tier. If a followup fails with &quot;response not found,&quot; the parent has aged out — start fresh.</li>
310
303
  <li>Custom <code>--base-url</code> proxies (LiteLLM, etc.) often strip the response id. Test once before relying on it.</li>
311
304
  </ul><nav class="page-nav" aria-label="Pager"><a class="page-nav-prev" href="sessions.html"><small>Previous</small><span>Sessions</span></a><a class="page-nav-next" href="multimodel.html"><small>Next</small><span>Multi-Model Execution</span></a></nav></article>
312
- <nav class="toc" aria-label="On this page"><h2>On this page</h2><a class="toc-l2" href="#why-followup-instead-of-starting-fresh">Why followup instead of starting fresh</a><a class="toc-l2" href="#basic-flow">Basic flow</a><a class="toc-l2" href="#multi-model-parents">Multi-model parents</a><a class="toc-l2" href="#what-s-chainable">What&amp;#39;s chainable</a><a class="toc-l2" href="#same-run-browser-multi-turn">Same-run browser multi-turn</a><a class="toc-l2" href="#lineage-in-oracle-status">Lineage in oracle status</a><a class="toc-l2" href="#common-patterns">Common patterns</a><a class="toc-l2" href="#limitations">Limitations</a></nav>
305
+ <nav class="toc" aria-label="On this page"><h2>On this page</h2><a class="toc-l2" href="#why-followup-instead-of-starting-fresh">Why followup instead of starting fresh</a><a class="toc-l2" href="#basic-flow">Basic flow</a><a class="toc-l2" href="#multi-model-parents">Multi-model parents</a><a class="toc-l2" href="#what-s-chainable">What&amp;#39;s chainable</a><a class="toc-l2" href="#browser-multi-turn">Browser multi-turn</a><a class="toc-l2" href="#lineage-in-oracle-status">Lineage in oracle status</a><a class="toc-l2" href="#common-patterns">Common patterns</a><a class="toc-l2" href="#limitations">Limitations</a></nav>
313
306
  </div>
314
307
  </main>
315
308
  </div>