@steipete/oracle 0.17.3 → 0.19.0

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 (161) hide show
  1. package/README.md +1 -1
  2. package/dist/bin/oracle-cli.js +75 -64
  3. package/dist/bin/oracle-mcp.js +0 -0
  4. package/dist/src/browser/actions/archiveConversation.js +31 -7
  5. package/dist/src/browser/actions/assistantResponse.js +43 -1
  6. package/dist/src/browser/actions/attachmentContext.js +239 -0
  7. package/dist/src/browser/actions/attachmentDataTransfer.js +19 -1
  8. package/dist/src/browser/actions/attachmentEvidence.js +78 -0
  9. package/dist/src/browser/actions/attachmentProgress.js +41 -0
  10. package/dist/src/browser/actions/attachmentPrompt.js +130 -0
  11. package/dist/src/browser/actions/attachments.js +306 -355
  12. package/dist/src/browser/actions/deepResearch.js +2 -1
  13. package/dist/src/browser/actions/modelSelection.js +13 -3
  14. package/dist/src/browser/actions/navigation.js +1 -1
  15. package/dist/src/browser/actions/promptComposer.js +361 -186
  16. package/dist/src/browser/actions/remoteFileTransfer.js +4 -2
  17. package/dist/src/browser/actions/thinkingStatus.js +2 -5
  18. package/dist/src/browser/actions/thinkingTime.js +267 -15
  19. package/dist/src/browser/attachRunning.js +46 -2
  20. package/dist/src/browser/attachmentValidation.js +53 -0
  21. package/dist/src/browser/cancellation.js +105 -0
  22. package/dist/src/browser/chatgptImages.js +2 -0
  23. package/dist/src/browser/chatgptThrottle.js +104 -0
  24. package/dist/src/browser/chromeLifecycle.js +267 -43
  25. package/dist/src/browser/config.js +15 -3
  26. package/dist/src/browser/detect.js +1 -1
  27. package/dist/src/browser/index.js +447 -263
  28. package/dist/src/browser/modelDisplay.js +9 -0
  29. package/dist/src/browser/pageActions.js +2 -2
  30. package/dist/src/browser/policies.js +6 -2
  31. package/dist/src/browser/profileState.js +114 -9
  32. package/dist/src/browser/projectSourcesRunner.js +88 -17
  33. package/dist/src/browser/prompt.js +272 -113
  34. package/dist/src/browser/providers/chatgptDomProvider.js +2 -0
  35. package/dist/src/browser/reattach.js +14 -4
  36. package/dist/src/browser/sessionRunner.js +71 -11
  37. package/dist/src/browser/tabLeaseRegistry.js +414 -38
  38. package/dist/src/browser/utils.js +20 -2
  39. package/dist/src/cli/browserConfig.js +40 -15
  40. package/dist/src/cli/browserDefaults.js +13 -0
  41. package/dist/src/cli/browserTabs.js +12 -29
  42. package/dist/src/cli/detachedSession.js +69 -0
  43. package/dist/src/cli/dryRun.js +58 -47
  44. package/dist/src/cli/harvestIntegrity.js +140 -0
  45. package/dist/src/cli/projectSources.js +5 -3
  46. package/dist/src/cli/serveBrowserConfig.js +24 -0
  47. package/dist/src/cli/sessionDisplay.js +9 -2
  48. package/dist/src/cli/sessionRunner.js +91 -7
  49. package/dist/src/config.js +1 -0
  50. package/dist/src/gemini-web/client.js +67 -21
  51. package/dist/src/gemini-web/executor.js +4 -0
  52. package/dist/src/gemini-web/http.js +15 -0
  53. package/dist/src/gemini-web/models.js +15 -11
  54. package/dist/src/mcp/server.js +11 -14
  55. package/dist/src/mcp/tools/chatgptImage.js +4 -4
  56. package/dist/src/mcp/tools/consult.js +97 -26
  57. package/dist/src/mcp/tools/projectSources.js +4 -6
  58. package/dist/src/mcp/tools/sessionResources.js +1 -1
  59. package/dist/src/mcp/tools/sessions.js +2 -2
  60. package/dist/src/mcp/tools/wait.js +182 -0
  61. package/dist/src/mcp/types.js +7 -0
  62. package/dist/src/oracle/errors.js +11 -0
  63. package/dist/src/oracle/providerRoutePlan.js +3 -2
  64. package/dist/src/remote/client.js +70 -6
  65. package/dist/src/remote/health.js +6 -2
  66. package/dist/src/remote/runSlots.js +83 -0
  67. package/dist/src/remote/server.js +351 -72
  68. package/dist/src/sessionManager.js +36 -1
  69. package/dist/vendor/oracle-notifier/OracleNotifier.app/Contents/CodeResources +0 -0
  70. package/dist/vendor/oracle-notifier/OracleNotifier.app/Contents/MacOS/OracleNotifier +0 -0
  71. package/package.json +25 -23
  72. package/vendor/oracle-notifier/OracleNotifier.app/Contents/CodeResources +0 -0
  73. package/vendor/oracle-notifier/OracleNotifier.app/Contents/MacOS/OracleNotifier +0 -0
  74. package/dist/bin/oracle.js +0 -683
  75. package/dist/docs-site/.nojekyll +0 -0
  76. package/dist/docs-site/CNAME +0 -1
  77. package/dist/docs-site/RELEASING.html +0 -410
  78. package/dist/docs-site/agents.html +0 -374
  79. package/dist/docs-site/anthropic.html +0 -368
  80. package/dist/docs-site/bridge.html +0 -400
  81. package/dist/docs-site/browser-mode.html +0 -588
  82. package/dist/docs-site/chromium-forks.html +0 -347
  83. package/dist/docs-site/cli-reference.html +0 -346
  84. package/dist/docs-site/configuration.html +0 -436
  85. package/dist/docs-site/favicon.svg +0 -14
  86. package/dist/docs-site/followup.html +0 -368
  87. package/dist/docs-site/gemini.html +0 -379
  88. package/dist/docs-site/grok.html +0 -325
  89. package/dist/docs-site/index.html +0 -360
  90. package/dist/docs-site/install.html +0 -335
  91. package/dist/docs-site/linux.html +0 -321
  92. package/dist/docs-site/llms.txt +0 -43
  93. package/dist/docs-site/manual-tests.html +0 -595
  94. package/dist/docs-site/mcp.html +0 -368
  95. package/dist/docs-site/multimodel.html +0 -364
  96. package/dist/docs-site/mythical-pro-agents.html +0 -360
  97. package/dist/docs-site/notifier.html +0 -338
  98. package/dist/docs-site/openai-endpoints.html +0 -387
  99. package/dist/docs-site/openrouter.html +0 -344
  100. package/dist/docs-site/quickstart.html +0 -369
  101. package/dist/docs-site/refactor/ux.html +0 -532
  102. package/dist/docs-site/sessions.html +0 -388
  103. package/dist/docs-site/social-card.png +0 -0
  104. package/dist/docs-site/social-card.svg +0 -79
  105. package/dist/docs-site/spec.html +0 -363
  106. package/dist/docs-site/testing.html +0 -320
  107. package/dist/docs-site/tui-debug.html +0 -326
  108. package/dist/docs-site/windows-work.html +0 -323
  109. package/dist/docs-site/windows.html +0 -320
  110. package/dist/markdansi/types/index.js +0 -4
  111. package/dist/oracle/bin/oracle-cli.js +0 -472
  112. package/dist/oracle/src/browser/actions/assistantResponse.js +0 -471
  113. package/dist/oracle/src/browser/actions/attachments.js +0 -82
  114. package/dist/oracle/src/browser/actions/modelSelection.js +0 -190
  115. package/dist/oracle/src/browser/actions/navigation.js +0 -75
  116. package/dist/oracle/src/browser/actions/promptComposer.js +0 -167
  117. package/dist/oracle/src/browser/chromeLifecycle.js +0 -104
  118. package/dist/oracle/src/browser/config.js +0 -33
  119. package/dist/oracle/src/browser/constants.js +0 -40
  120. package/dist/oracle/src/browser/cookies.js +0 -210
  121. package/dist/oracle/src/browser/domDebug.js +0 -36
  122. package/dist/oracle/src/browser/index.js +0 -331
  123. package/dist/oracle/src/browser/pageActions.js +0 -5
  124. package/dist/oracle/src/browser/prompt.js +0 -88
  125. package/dist/oracle/src/browser/promptSummary.js +0 -20
  126. package/dist/oracle/src/browser/sessionRunner.js +0 -80
  127. package/dist/oracle/src/browser/types.js +0 -1
  128. package/dist/oracle/src/browser/utils.js +0 -62
  129. package/dist/oracle/src/browserMode.js +0 -1
  130. package/dist/oracle/src/cli/browserConfig.js +0 -44
  131. package/dist/oracle/src/cli/dryRun.js +0 -59
  132. package/dist/oracle/src/cli/engine.js +0 -17
  133. package/dist/oracle/src/cli/errorUtils.js +0 -9
  134. package/dist/oracle/src/cli/help.js +0 -70
  135. package/dist/oracle/src/cli/markdownRenderer.js +0 -15
  136. package/dist/oracle/src/cli/options.js +0 -103
  137. package/dist/oracle/src/cli/promptRequirement.js +0 -14
  138. package/dist/oracle/src/cli/rootAlias.js +0 -30
  139. package/dist/oracle/src/cli/sessionCommand.js +0 -77
  140. package/dist/oracle/src/cli/sessionDisplay.js +0 -270
  141. package/dist/oracle/src/cli/sessionRunner.js +0 -94
  142. package/dist/oracle/src/heartbeat.js +0 -43
  143. package/dist/oracle/src/oracle/client.js +0 -48
  144. package/dist/oracle/src/oracle/config.js +0 -29
  145. package/dist/oracle/src/oracle/errors.js +0 -101
  146. package/dist/oracle/src/oracle/files.js +0 -220
  147. package/dist/oracle/src/oracle/format.js +0 -33
  148. package/dist/oracle/src/oracle/fsAdapter.js +0 -7
  149. package/dist/oracle/src/oracle/oscProgress.js +0 -60
  150. package/dist/oracle/src/oracle/request.js +0 -48
  151. package/dist/oracle/src/oracle/run.js +0 -444
  152. package/dist/oracle/src/oracle/tokenStats.js +0 -39
  153. package/dist/oracle/src/oracle/types.js +0 -1
  154. package/dist/oracle/src/oracle.js +0 -9
  155. package/dist/oracle/src/sessionManager.js +0 -205
  156. package/dist/oracle/src/version.js +0 -39
  157. package/dist/scripts/chrome/browser-tools.js +0 -295
  158. package/dist/src/browser/chromeCookies.js +0 -312
  159. package/dist/src/browser/keytarShim.js +0 -56
  160. package/dist/src/browser/profileSync.js +0 -141
  161. package/dist/src/browser/windowsCookies.js +0 -219
@@ -1,436 +0,0 @@
1
- <!doctype html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="utf-8">
5
- <meta name="viewport" content="width=device-width, initial-scale=1">
6
- <title>Local configuration (JSON5) — oracle</title>
7
- <meta name="description" content="Local configuration (JSON5) — oracle CLI documentation.">
8
- <link rel="canonical" href="https://askoracle.sh/configuration.html">
9
- <meta property="og:type" content="website">
10
- <meta property="og:site_name" content="oracle">
11
- <meta property="og:title" content="Local configuration (JSON5) — oracle">
12
- <meta property="og:description" content="Local configuration (JSON5) — oracle CLI documentation.">
13
- <meta property="og:url" content="https://askoracle.sh/configuration.html">
14
- <meta property="og:image" content="https://askoracle.sh/social-card.png">
15
- <meta property="og:image:width" content="1200">
16
- <meta property="og:image:height" content="630">
17
- <meta name="twitter:card" content="summary_large_image">
18
- <meta name="twitter:title" content="Local configuration (JSON5) — oracle">
19
- <meta name="twitter:description" content="Local configuration (JSON5) — oracle CLI documentation.">
20
- <meta name="twitter:image" content="https://askoracle.sh/social-card.png">
21
- <link rel="icon" href="favicon.svg" type="image/svg+xml">
22
- <link rel="preconnect" href="https://fonts.googleapis.com">
23
- <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
24
- <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
25
- <script>(function(){var s;try{s=localStorage.getItem('theme')}catch(e){}var d=window.matchMedia&&matchMedia('(prefers-color-scheme: dark)').matches;document.documentElement.dataset.theme=s||(d?'dark':'light')})();</script>
26
- <style>
27
- :root{
28
- --ink:#0e0a1f;
29
- --text:#1d1832;
30
- --muted:#6b6582;
31
- --subtle:#9c95b5;
32
- --bg:#fafaff;
33
- --paper:#ffffff;
34
- --accent:#7c3aed;
35
- --accent-soft:rgba(124,58,237,.10);
36
- --accent-strong:#5b21b6;
37
- --accent-2:#0ea5e9;
38
- --accent-glow:#a78bfa;
39
- --line:#e7e3f0;
40
- --line-soft:#f2eff8;
41
- --code-bg:#0c0a1a;
42
- --code-fg:#e9e6f5;
43
- --code-inline-fg:#1c1734;
44
- --pill-border:#dcd5ec;
45
- --shadow-card:0 4px 14px rgba(14,10,31,.08);
46
- --scrollbar:#cbc4dc;
47
- }
48
- :root[data-theme="dark"]{
49
- --ink:#f5f2ff;
50
- --text:#cec7e4;
51
- --muted:#9189a8;
52
- --subtle:#6a6383;
53
- --bg:#0a0815;
54
- --paper:#15102a;
55
- --accent:#a78bfa;
56
- --accent-soft:rgba(167,139,250,.18);
57
- --accent-strong:#c4b5fd;
58
- --accent-2:#38bdf8;
59
- --accent-glow:#c4b5fd;
60
- --line:#272140;
61
- --line-soft:#1c1734;
62
- --code-bg:#06040d;
63
- --code-fg:#e9e6f5;
64
- --code-inline-fg:#e9e6f5;
65
- --pill-border:#2c2549;
66
- --shadow-card:0 4px 18px rgba(0,0,0,.45);
67
- --scrollbar:#3a3358;
68
- }
69
- :root{color-scheme:light}
70
- :root[data-theme="dark"]{color-scheme:dark}
71
- *{box-sizing:border-box}
72
- html{scroll-behavior:smooth;scroll-padding-top:24px}
73
- body{margin:0;background:var(--bg);color:var(--text);font-family:"Inter",ui-sans-serif,system-ui,-apple-system,Segoe UI,sans-serif;line-height:1.65;overflow-x:hidden;-webkit-font-smoothing:antialiased;font-feature-settings:"cv02","cv03","cv04","cv11";transition:background-color .18s,color .18s}
74
- ::selection{background:var(--accent);color:#fff}
75
- a{color:var(--accent);text-decoration:none;transition:color .12s}
76
- a:hover{text-decoration:underline;text-underline-offset:.2em}
77
- .shell{display:grid;grid-template-columns:268px minmax(0,1fr);min-height:100vh}
78
- .sidebar{position:sticky;top:0;height:100vh;overflow:auto;padding:24px 22px;background:var(--paper);border-right:1px solid var(--line);scrollbar-width:thin;scrollbar-color:var(--line) transparent;transition:background-color .18s,border-color .18s}
79
- .sidebar::-webkit-scrollbar{width:6px}
80
- .sidebar::-webkit-scrollbar-thumb{background:var(--line);border-radius:6px}
81
- .sidebar-head{display:flex;align-items:center;gap:10px;margin-bottom:24px}
82
- .brand{display:flex;align-items:center;gap:11px;color:var(--ink);text-decoration:none;flex:1;min-width:0}
83
- .brand:hover{text-decoration:none}
84
- .brand .mark{flex:0 0 30px;width:30px;height:30px;border-radius:50%;background:radial-gradient(circle at 32% 32%,#fff 0,#e0d4ff 22%,#7c3aed 60%,#1e1240 100%);box-shadow:0 0 0 1px rgba(124,58,237,.35),0 6px 18px rgba(124,58,237,.35);position:relative}
85
- .brand .mark::after{content:"";position:absolute;left:50%;top:50%;width:9px;height:9px;border-radius:50%;background:#0c0820;transform:translate(-50%,-50%)}
86
- .brand strong{display:block;font-size:1.05rem;line-height:1.1;font-weight:600;letter-spacing:0;color:var(--ink)}
87
- .brand small{display:block;color:var(--muted);font-size:.74rem;margin-top:3px;font-weight:400}
88
- .theme-toggle{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;width:34px;height:34px;border-radius:8px;border:1px solid var(--line);background:var(--paper);color:var(--muted);cursor:pointer;padding:0;transition:border-color .15s,color .15s,background-color .15s,transform .12s}
89
- .theme-toggle:hover{border-color:var(--ink);color:var(--ink)}
90
- .theme-toggle:active{transform:scale(.94)}
91
- .theme-toggle svg{width:16px;height:16px;display:block}
92
- .theme-icon-sun{display:none}
93
- :root[data-theme="dark"] .theme-icon-sun{display:block}
94
- :root[data-theme="dark"] .theme-icon-moon{display:none}
95
- .search{display:block;margin:0 0 22px}
96
- .search span{display:block;color:var(--muted);font-size:.7rem;font-weight:600;text-transform:uppercase;letter-spacing:0;margin-bottom:7px}
97
- .search input{width:100%;border:1px solid var(--line);background:var(--paper);border-radius:8px;padding:9px 12px;font:inherit;font-size:.9rem;color:var(--text);outline:none;transition:border-color .15s,box-shadow .15s,background-color .18s}
98
- .search input:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft)}
99
- nav section{margin:0 0 18px}
100
- nav h2{font-size:.68rem;color:var(--muted);text-transform:uppercase;letter-spacing:0;margin:0 0 6px;font-weight:600}
101
- .nav-link{display:block;color:var(--text);text-decoration:none;border-radius:6px;padding:5px 10px;margin:1px 0;font-size:.9rem;line-height:1.4;transition:background .12s,color .12s}
102
- .nav-link:hover{background:var(--line-soft);color:var(--ink);text-decoration:none}
103
- .nav-link.active{background:var(--accent-soft);color:var(--accent);font-weight:600}
104
- main{min-width:0;padding:32px clamp(20px,4.5vw,56px) 80px;max-width:1180px;margin:0 auto;width:100%}
105
- .hero{display:flex;align-items:flex-end;justify-content:space-between;gap:22px;border-bottom:1px solid var(--line);padding:8px 0 22px;margin-bottom:8px;flex-wrap:wrap}
106
- .hero-text{min-width:0;flex:1 1 320px}
107
- .eyebrow{margin:0 0 8px;color:var(--muted);font-weight:600;text-transform:uppercase;letter-spacing:0;font-size:.7rem}
108
- .hero h1{font-size:2.25rem;line-height:1.1;letter-spacing:0;margin:0;font-weight:700;color:var(--ink)}
109
- .hero-meta{display:flex;gap:8px;flex:0 0 auto;flex-wrap:wrap}
110
- .repo,.edit,.btn-ghost{border:1px solid var(--line);color:var(--text);text-decoration:none;border-radius:7px;padding:6px 11px;font-weight:500;font-size:.83rem;background:var(--paper);transition:border-color .15s,color .15s,background .15s}
111
- .repo:hover,.edit:hover,.btn-ghost:hover{border-color:var(--ink);color:var(--ink);text-decoration:none}
112
- .edit{color:var(--muted)}
113
- .home-hero{position:relative;padding:24px 0 32px;margin-bottom:8px;border-bottom:1px solid var(--line)}
114
- .home-hero>*{position:relative;z-index:1}
115
- .home-hero h1{font-size:3.4rem;line-height:1.04;letter-spacing:0;margin:0 0 .35em;font-weight:700;color:var(--ink);background:linear-gradient(135deg,var(--ink) 0,#7c3aed 60%,#0ea5e9 100%);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent}
116
- :root[data-theme="dark"] .home-hero h1{background:linear-gradient(135deg,#f5f2ff 0,#c4b5fd 50%,#7dd3fc 100%);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent}
117
- .home-hero .lede{font-size:1.18rem;line-height:1.55;color:var(--text);margin:0 0 1.2em;max-width:62ch}
118
- .home-cta{display:flex;flex-wrap:wrap;gap:10px;align-items:center;margin:0 0 18px}
119
- .home-cta .btn{display:inline-flex;align-items:center;gap:7px;border-radius:8px;padding:10px 16px;font-weight:600;font-size:.92rem;text-decoration:none;transition:background .15s,border-color .15s,color .15s,transform .12s}
120
- .home-cta .btn-primary{background:linear-gradient(135deg,var(--accent),var(--accent-strong));color:#fff;border:1px solid var(--accent);box-shadow:0 4px 14px rgba(124,58,237,.35)}
121
- .home-cta .btn-primary:hover{background:var(--accent-strong);border-color:var(--accent-strong);text-decoration:none;transform:translateY(-1px)}
122
- .home-cta .btn-ghost{padding:10px 16px}
123
- .home-install{display:flex;align-items:center;gap:12px;background:var(--code-bg);color:var(--code-fg);border-radius:8px;padding:10px 10px 10px 16px;font:500 .9rem/1.2 "JetBrains Mono","SF Mono",ui-monospace,monospace;max-width:34em;border:1px solid #1f1840}
124
- .home-install .prompt{color:#6f63a3;user-select:none;flex:0 0 auto}
125
- .home-install code{flex:1;background:transparent;border:0;color:var(--code-fg);font:inherit;padding:0;white-space:pre;overflow:hidden;text-overflow:ellipsis}
126
- .home-install .copy{flex:0 0 auto;background:rgba(255,255,255,.08);color:var(--code-fg);border:1px solid rgba(255,255,255,.16);border-radius:6px;padding:5px 11px;font:500 .72rem/1 "Inter",sans-serif;cursor:pointer;transition:background .15s,border-color .15s}
127
- .home-install .copy:hover{background:rgba(255,255,255,.16)}
128
- .home-install .copy.copied{background:var(--accent);border-color:var(--accent)}
129
- .home-services{display:flex;flex-wrap:wrap;gap:6px;margin:6px 0 18px}
130
- .home-services span{display:inline-block;padding:3px 10px;border:1px solid var(--pill-border);border-radius:999px;font-size:.78rem;color:var(--muted);background:var(--paper)}
131
- .home-services span.pill-pro{background:var(--accent-soft);color:var(--accent);border-color:transparent;font-weight:600}
132
- .home-visual{display:block;width:min(100%,620px);height:auto;margin:22px 0 0;border-radius:8px;border:1px solid var(--line);box-shadow:var(--shadow-card);background:var(--paper)}
133
- .doc-grid{display:grid;grid-template-columns:minmax(0,1fr);gap:48px;margin-top:24px}
134
- .doc-grid-home{margin-top:8px}
135
- @media(min-width:1180px){.doc-grid{grid-template-columns:minmax(0,72ch) 200px;justify-content:start}.doc-grid-home{grid-template-columns:minmax(0,76ch);justify-content:start}}
136
- .doc{min-width:0;max-width:72ch;overflow-wrap:break-word}
137
- .doc-home{max-width:76ch}
138
- .doc h1{font-size:2.6rem;line-height:1.08;letter-spacing:0;margin:0 0 .4em;font-weight:700;color:var(--ink)}
139
- body:not(.home) .doc>h1:first-child{display:none}
140
- .doc h2{font-size:1.45rem;line-height:1.2;margin:2em 0 .5em;font-weight:600;letter-spacing:0;color:var(--ink);position:relative}
141
- .doc h3{font-size:1.1rem;margin:1.7em 0 .35em;position:relative;font-weight:600;color:var(--ink);letter-spacing:0}
142
- .doc h4{font-size:.98rem;margin:1.4em 0 .25em;color:var(--ink);position:relative;font-weight:600}
143
- .doc h2:first-child,.doc h3:first-child,.doc h4:first-child{margin-top:.2em}
144
- .doc :is(h2,h3,h4) .anchor{position:absolute;left:-1.05em;top:0;color:var(--subtle);opacity:0;text-decoration:none;font-weight:400;padding-right:.3em;transition:opacity .12s,color .12s}
145
- .doc :is(h2,h3,h4):hover .anchor{opacity:.7}
146
- .doc :is(h2,h3,h4) .anchor:hover{opacity:1;color:var(--accent);text-decoration:none}
147
- .doc p{margin:0 0 1.05em}
148
- .doc ul,.doc ol{padding-left:1.3rem;margin:0 0 1.15em}
149
- .doc li{margin:.25em 0}
150
- .doc li>p{margin:0 0 .4em}
151
- .doc strong{font-weight:600;color:var(--ink)}
152
- .doc em{font-style:italic}
153
- .doc code{font-family:"JetBrains Mono","SF Mono",ui-monospace,monospace;font-size:.84em;background:var(--line-soft);border:1px solid var(--line);border-radius:5px;padding:.08em .35em;color:var(--code-inline-fg)}
154
- .doc pre{position:relative;overflow:auto;background:var(--code-bg);color:var(--code-fg);border-radius:8px;padding:14px 18px;margin:1.3em 0;font-size:.85em;line-height:1.6;scrollbar-width:thin;scrollbar-color:#3a3358 transparent;border:1px solid #221c40}
155
- .doc pre.shiki{background:var(--code-bg)!important;color:var(--code-fg)!important}
156
- .doc pre::-webkit-scrollbar{height:8px;width:8px}
157
- .doc pre::-webkit-scrollbar-thumb{background:#3a3358;border-radius:8px}
158
- .doc pre code{display:block;background:transparent;border:0;color:inherit;padding:0;font-size:1em;white-space:pre}
159
- .doc pre code .line{display:block;min-height:1.6em}
160
- .doc pre .copy{position:absolute;top:8px;right:8px;background:rgba(255,255,255,.06);color:var(--code-fg);border:1px solid rgba(255,255,255,.16);border-radius:6px;padding:3px 9px;font:500 .7rem/1 "Inter",sans-serif;cursor:pointer;opacity:0;transition:opacity .15s,background .15s,border-color .15s}
161
- .doc pre:hover .copy,.doc pre .copy:focus{opacity:1}
162
- .doc pre .copy:hover{background:rgba(255,255,255,.12)}
163
- .doc pre .copy.copied{background:var(--accent);border-color:var(--accent);opacity:1}
164
- .doc blockquote{margin:1.4em 0;padding:10px 16px;border-left:3px solid var(--accent);background:var(--accent-soft);border-radius:0 8px 8px 0;color:var(--text)}
165
- .doc blockquote p:last-child{margin-bottom:0}
166
- .doc table{width:100%;border-collapse:collapse;margin:1.2em 0;font-size:.92em}
167
- .doc th,.doc td{border-bottom:1px solid var(--line);padding:9px 10px;text-align:left;vertical-align:top}
168
- .doc th{font-weight:600;color:var(--ink);background:var(--line-soft);border-bottom:1px solid var(--line)}
169
- .doc hr{border:0;border-top:1px solid var(--line);margin:2.2em 0}
170
- .toc{position:sticky;top:24px;align-self:start;font-size:.84rem;padding-left:14px;border-left:1px solid var(--line);max-height:calc(100vh - 48px);overflow:auto;scrollbar-width:thin;scrollbar-color:var(--line) transparent}
171
- .toc::-webkit-scrollbar{width:5px}
172
- .toc::-webkit-scrollbar-thumb{background:var(--line);border-radius:5px}
173
- .toc h2{font-size:.66rem;color:var(--muted);text-transform:uppercase;letter-spacing:0;margin:0 0 10px;font-weight:600}
174
- .toc a{display:block;color:var(--muted);text-decoration:none;padding:4px 0 4px 10px;line-height:1.35;border-left:2px solid transparent;margin-left:-12px;transition:color .12s,border-color .12s}
175
- .toc a:hover{color:var(--ink);text-decoration:none}
176
- .toc a.active{color:var(--accent);border-left-color:var(--accent);font-weight:500}
177
- .toc-l3{padding-left:22px!important;font-size:.94em}
178
- @media(max-width:1179px){.toc{display:none}}
179
- .page-nav{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin-top:48px;border-top:1px solid var(--line);padding-top:20px}
180
- .page-nav>a{display:block;border:1px solid var(--line);background:var(--paper);border-radius:9px;padding:13px 16px;text-decoration:none;color:var(--text);transition:border-color .15s,transform .15s,box-shadow .15s,background-color .18s}
181
- .page-nav>a:hover{border-color:var(--accent);text-decoration:none;color:var(--ink)}
182
- .page-nav small{display:block;color:var(--muted);font-size:.7rem;text-transform:uppercase;letter-spacing:0;margin-bottom:5px;font-weight:600}
183
- .page-nav span{display:block;font-weight:600;line-height:1.3;color:var(--ink)}
184
- .page-nav-prev{text-align:left}
185
- .page-nav-next{text-align:right;grid-column:2}
186
- .page-nav-prev:only-child{grid-column:1}
187
- .nav-toggle{display:none;position:fixed;top:14px;right:14px;top:calc(14px + env(safe-area-inset-top, 0px));right:calc(14px + env(safe-area-inset-right, 0px));z-index:20;width:40px;height:40px;border-radius:9px;background:var(--paper);border:1px solid var(--line);color:var(--ink);cursor:pointer;padding:10px 9px;flex-direction:column;align-items:stretch;justify-content:space-between;box-shadow:var(--shadow-card)}
188
- .nav-toggle span{display:block;width:100%;height:2px;flex:0 0 2px;background:currentColor;border-radius:2px;transition:transform .2s,opacity .2s}
189
- .nav-toggle[aria-expanded="true"] span:nth-child(1){transform:translateY(8px) rotate(45deg)}
190
- .nav-toggle[aria-expanded="true"] span:nth-child(2){opacity:0}
191
- .nav-toggle[aria-expanded="true"] span:nth-child(3){transform:translateY(-8px) rotate(-45deg)}
192
- @media(max-width:900px){
193
- .shell{display:block}
194
- .sidebar{position:fixed;inset:0 30% 0 0;max-width:320px;height:100vh;z-index:15;transform:translateX(-100%);transition:transform .25s ease,background-color .18s,border-color .18s;box-shadow:0 18px 40px rgba(0,0,0,.18);background:var(--paper);pointer-events:none}
195
- .sidebar.open{transform:translateX(0);pointer-events:auto}
196
- .nav-toggle{display:flex}
197
- main{padding:64px 18px 56px}
198
- .hero{padding-top:6px}
199
- .hero h1{font-size:1.8rem}
200
- .home-hero h1{font-size:2.45rem}
201
- .doc h1{font-size:2.1rem}
202
- .hero-meta{width:100%;justify-content:flex-start}
203
- .home-hero{padding-top:8px}
204
- .home-visual{margin-top:18px}
205
- .doc{padding:0}
206
- .doc-grid{margin-top:18px;gap:24px}
207
- .doc :is(h2,h3,h4) .anchor{display:none}
208
- }
209
- @media(max-width:520px){
210
- main{padding:60px 14px 48px}
211
- .doc pre{margin-left:-14px;margin-right:-14px;border-radius:0;border-left:0;border-right:0}
212
- .home-install{flex-wrap:wrap}
213
- }
214
- </style>
215
- </head>
216
- <body>
217
- <button class="nav-toggle" type="button" aria-label="Toggle navigation" aria-expanded="false">
218
- <span aria-hidden="true"></span><span aria-hidden="true"></span><span aria-hidden="true"></span>
219
- </button>
220
- <div class="shell">
221
- <aside class="sidebar">
222
- <div class="sidebar-head">
223
- <a class="brand" href="./" aria-label="oracle docs home">
224
- <span class="mark" aria-hidden="true"></span>
225
- <span><strong>oracle</strong><small>askoracle.sh</small></span>
226
- </a>
227
- <button class="theme-toggle" type="button" aria-label="Toggle dark mode" aria-pressed="false" data-theme-toggle>
228
- <svg class="theme-icon-moon" viewBox="0 0 20 20" aria-hidden="true"><path d="M14.6 12.1A6.5 6.5 0 0 1 7.4 2.7a6.5 6.5 0 1 0 7.2 9.4z" fill="currentColor"/></svg>
229
- <svg class="theme-icon-sun" viewBox="0 0 20 20" aria-hidden="true"><circle cx="10" cy="10" r="3.4" fill="currentColor"/><g stroke="currentColor" stroke-width="1.6" stroke-linecap="round"><line x1="10" y1="2" x2="10" y2="4"/><line x1="10" y1="16" x2="10" y2="18"/><line x1="2" y1="10" x2="4" y2="10"/><line x1="16" y1="10" x2="18" y2="10"/><line x1="4.2" y1="4.2" x2="5.6" y2="5.6"/><line x1="14.4" y1="14.4" x2="15.8" y2="15.8"/><line x1="4.2" y1="15.8" x2="5.6" y2="14.4"/><line x1="14.4" y1="5.6" x2="15.8" y2="4.2"/></g></svg>
230
- </button>
231
- </div>
232
- <label class="search"><span>Search</span><input id="doc-search" type="search" placeholder="browser, mcp, sessions"></label>
233
- <nav><section><h2>Start</h2><a class="nav-link" href="./">Overview</a><a class="nav-link" href="install.html">Install</a><a class="nav-link" href="quickstart.html">Quickstart</a><a class="nav-link active" href="configuration.html">Local configuration (JSON5)</a></section><section><h2>Mythical Pro Agents</h2><a class="nav-link" href="mythical-pro-agents.html">Mythical Pro Agents</a><a class="nav-link" href="openai-endpoints.html">OpenAI-Compatible Endpoints</a><a class="nav-link" href="anthropic.html">Anthropic (Claude) Integration Plan</a><a class="nav-link" href="gemini.html">Gemini Integration</a><a class="nav-link" href="openrouter.html">OpenRouter</a><a class="nav-link" href="grok.html">Grok 4.1 (xAI) Support</a></section><section><h2>Browser Mode</h2><a class="nav-link" href="browser-mode.html">Browser Mode</a><a class="nav-link" href="chromium-forks.html">Chromium-based browsers (Chromium, Edge, Brave variants)</a><a class="nav-link" href="linux.html">Linux Notes</a><a class="nav-link" href="windows.html">Windows compatibility notes</a><a class="nav-link" href="windows-work.html">Windows Work</a><a class="nav-link" href="bridge.html">Bridge (Windows-hosted ChatGPT session → Linux clients)</a></section><section><h2>Agents &amp; MCP</h2><a class="nav-link" href="agents.html">Coding Agents</a><a class="nav-link" href="mcp.html">MCP Server</a></section><section><h2>Workflows</h2><a class="nav-link" href="sessions.html">Sessions</a><a class="nav-link" href="followup.html">Followups &amp; Lineage</a><a class="nav-link" href="multimodel.html">Multi-Model Execution</a></section><section><h2>Reference</h2><a class="nav-link" href="cli-reference.html">CLI Reference</a><a class="nav-link" href="spec.html">Spec</a><a class="nav-link" href="notifier.html">Session completion notifications</a><a class="nav-link" href="tui-debug.html">TUI navigation crash notes (2025-11-19)</a><a class="nav-link" href="manual-tests.html">Manual Test Suite (Browser Mode + Live API)</a><a class="nav-link" href="testing.html">Testing quickstart</a><a class="nav-link" href="RELEASING.html">Release Checklist (npm + Homebrew)</a></section></nav>
234
- </aside>
235
- <main>
236
- <header class="hero">
237
- <div class="hero-text">
238
- <p class="eyebrow">Start</p>
239
- <h1>Local configuration (JSON5)</h1>
240
- </div>
241
- <div class="hero-meta">
242
- <a class="repo" href="https://github.com/steipete/oracle" rel="noopener">GitHub</a>
243
- <a class="edit" href="https://github.com/steipete/oracle/edit/main/docs/configuration.md" rel="noopener">Edit page</a>
244
- </div>
245
- </header>
246
- <div class="doc-grid">
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>. The file uses JSON5 parsing, so trailing commas and comments are allowed.</p>
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
- <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
- <span class="line"><span style="color:#768390"> // Default engine when neither CLI flag nor env decide</span></span>
252
- <span class="line"><span style="color:#96D0FF"> engine</span><span style="color:#ADBAC7">: </span><span style="color:#96D0FF">"api"</span><span style="color:#ADBAC7">, </span><span style="color:#768390">// or "browser"</span></span>
253
- <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 style="color:#768390">// older gpt-5.x-pro aliases → gpt-5.5-pro</span></span>
254
- <span class="line"><span style="color:#96D0FF"> search</span><span style="color:#ADBAC7">: </span><span style="color:#96D0FF">"on"</span><span style="color:#ADBAC7">, </span><span style="color:#768390">// "on" | "off"</span></span>
255
- <span class="line"></span>
256
- <span class="line"><span style="color:#96D0FF"> notify</span><span style="color:#ADBAC7">: {</span></span>
257
- <span class="line"><span style="color:#96D0FF"> enabled</span><span style="color:#ADBAC7">: </span><span style="color:#6CB6FF">true</span><span style="color:#ADBAC7">, </span><span style="color:#768390">// default notifications (still auto-mutes in CI/SSH unless forced on)</span></span>
258
- <span class="line"><span style="color:#96D0FF"> sound</span><span style="color:#ADBAC7">: </span><span style="color:#6CB6FF">false</span><span style="color:#ADBAC7">, </span><span style="color:#768390">// play a sound on completion</span></span>
259
- <span class="line"><span style="color:#96D0FF"> muteIn</span><span style="color:#ADBAC7">: [</span><span style="color:#96D0FF">"CI"</span><span style="color:#ADBAC7">, </span><span style="color:#96D0FF">"SSH"</span><span style="color:#ADBAC7">], </span><span style="color:#768390">// auto-disable when these env vars are set</span></span>
260
- <span class="line"><span style="color:#ADBAC7"> },</span></span>
261
- <span class="line"></span>
262
- <span class="line"><span style="color:#96D0FF"> browser</span><span style="color:#ADBAC7">: {</span></span>
263
- <span class="line"><span style="color:#96D0FF"> chromeProfile</span><span style="color:#ADBAC7">: </span><span style="color:#96D0FF">"Default"</span><span style="color:#ADBAC7">,</span></span>
264
- <span class="line"><span style="color:#96D0FF"> chromePath</span><span style="color:#ADBAC7">: </span><span style="color:#6CB6FF">null</span><span style="color:#ADBAC7">,</span></span>
265
- <span class="line"><span style="color:#96D0FF"> chromeCookiePath</span><span style="color:#ADBAC7">: </span><span style="color:#6CB6FF">null</span><span style="color:#ADBAC7">,</span></span>
266
- <span class="line"><span style="color:#96D0FF"> chatgptUrl</span><span style="color:#ADBAC7">: </span><span style="color:#96D0FF">"https://chatgpt.com/"</span><span style="color:#ADBAC7">, </span><span style="color:#768390">// root is fine; folder URLs also work</span></span>
267
- <span class="line"><span style="color:#96D0FF"> url</span><span style="color:#ADBAC7">: </span><span style="color:#6CB6FF">null</span><span style="color:#ADBAC7">, </span><span style="color:#768390">// alias for chatgptUrl (kept for back-compat)</span></span>
268
- <span class="line"><span style="color:#768390"> // Remote browser bridge (preferred place to store remote host settings)</span></span>
269
- <span class="line"><span style="color:#96D0FF"> remoteHost</span><span style="color:#ADBAC7">: </span><span style="color:#96D0FF">"127.0.0.1:9473"</span><span style="color:#ADBAC7">,</span></span>
270
- <span class="line"><span style="color:#96D0FF"> remoteToken</span><span style="color:#ADBAC7">: </span><span style="color:#96D0FF">"…"</span><span style="color:#ADBAC7">, </span><span style="color:#768390">// written by `oracle bridge client` (kept private; not printed by default)</span></span>
271
- <span class="line"><span style="color:#96D0FF"> remoteViaSshReverseTunnel</span><span style="color:#ADBAC7">: { </span><span style="color:#96D0FF">ssh</span><span style="color:#ADBAC7">: </span><span style="color:#96D0FF">"user@linux-host"</span><span style="color:#ADBAC7">, </span><span style="color:#96D0FF">remotePort</span><span style="color:#ADBAC7">: </span><span style="color:#6CB6FF">9473</span><span style="color:#ADBAC7"> }, </span><span style="color:#768390">// optional metadata</span></span>
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
- <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
- <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"> 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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
289
- <span class="line"><span style="color:#96D0FF"> headless</span><span style="color:#ADBAC7">: </span><span style="color:#6CB6FF">false</span><span style="color:#ADBAC7">,</span></span>
290
- <span class="line"><span style="color:#96D0FF"> hideWindow</span><span style="color:#ADBAC7">: </span><span style="color:#6CB6FF">false</span><span style="color:#ADBAC7">,</span></span>
291
- <span class="line"><span style="color:#96D0FF"> keepBrowser</span><span style="color:#ADBAC7">: </span><span style="color:#6CB6FF">false</span><span style="color:#ADBAC7">,</span></span>
292
- <span class="line"><span style="color:#96D0FF"> manualLoginCookieSync</span><span style="color:#ADBAC7">: </span><span style="color:#6CB6FF">false</span><span style="color:#ADBAC7">, </span><span style="color:#768390">// allow cookie sync even in manual-login mode</span></span>
293
- <span class="line"><span style="color:#ADBAC7"> },</span></span>
294
- <span class="line"></span>
295
- <span class="line"><span style="color:#768390"> // Azure OpenAI defaults (only used when endpoint is set)</span></span>
296
- <span class="line"><span style="color:#96D0FF"> azure</span><span style="color:#ADBAC7">: {</span></span>
297
- <span class="line"><span style="color:#96D0FF"> endpoint</span><span style="color:#ADBAC7">: </span><span style="color:#96D0FF">"https://your-resource-name.openai.azure.com/"</span><span style="color:#ADBAC7">,</span></span>
298
- <span class="line"><span style="color:#96D0FF"> deployment</span><span style="color:#ADBAC7">: </span><span style="color:#96D0FF">"gpt-5-1-pro"</span><span style="color:#ADBAC7">,</span></span>
299
- <span class="line"><span style="color:#96D0FF"> apiVersion</span><span style="color:#ADBAC7">: </span><span style="color:#96D0FF">"2025-04-01-preview"</span><span style="color:#ADBAC7">, </span><span style="color:#768390">// optional legacy knob; Azure v1 Responses runs do not require it</span></span>
300
- <span class="line"><span style="color:#ADBAC7"> },</span></span>
301
- <span class="line"></span>
302
- <span class="line"><span style="color:#96D0FF"> heartbeatSeconds</span><span style="color:#ADBAC7">: </span><span style="color:#6CB6FF">30</span><span style="color:#ADBAC7">, </span><span style="color:#768390">// default heartbeat interval</span></span>
303
- <span class="line"><span style="color:#96D0FF"> maxFileSizeBytes</span><span style="color:#ADBAC7">: </span><span style="color:#6CB6FF">2097152</span><span style="color:#ADBAC7">, </span><span style="color:#768390">// raise/lower the per-file attachment guard (bytes)</span></span>
304
- <span class="line"><span style="color:#96D0FF"> filesReport</span><span style="color:#ADBAC7">: </span><span style="color:#6CB6FF">false</span><span style="color:#ADBAC7">, </span><span style="color:#768390">// default per-file token report</span></span>
305
- <span class="line"><span style="color:#96D0FF"> background</span><span style="color:#ADBAC7">: </span><span style="color:#6CB6FF">true</span><span style="color:#ADBAC7">, </span><span style="color:#768390">// default background mode for API runs</span></span>
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>
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>
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>
309
- <span class="line"><span style="color:#ADBAC7">}</span></span></code></pre>
310
- <h2 id="precedence"><a class="anchor" href="#precedence" aria-label="Anchor link">#</a>Precedence</h2>
311
- <p>CLI flags → <code>config.json</code> → environment → built-in defaults.</p>
312
- <ul>
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>
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>
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>
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>
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>
318
- <li><code>ORACLE_NOTIFY*</code> env vars still layer on top of the config’s <code>notify</code> block.</li>
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>
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>
321
- <li><code>browser.chatgptUrl</code> accepts either the root ChatGPT URL (<code>https://chatgpt.com/</code>) or a folder/workspace URL (e.g., <code>https://chatgpt.com/g/.../project</code>); <code>browser.url</code> remains as a legacy alias.</li>
322
- <li>Browser automation defaults can be set under <code>browser.*</code>, including <code>browser.manualLogin</code>, <code>browser.manualLoginProfileDir</code>, <code>browser.attachRunning</code>, <code>browser.thinkingTime</code> (CLI override: <code>--browser-thinking-time</code>), and <code>browser.researchMode</code> (CLI override: <code>--browser-research</code>). On Windows, <code>browser.manualLogin</code> defaults to <code>true</code> when omitted.</li>
323
- </ul>
324
- <p>If the config is missing or invalid, Oracle falls back to defaults and prints a warning for parse errors.</p>
325
- <p>Chromium-based browsers usually need both <code>chromePath</code> (binary) and <code>chromeCookiePath</code> (cookie DB) set so automation can launch the right executable and reuse your login. See <a href="chromium-forks.html">docs/chromium-forks.md</a> for detailed paths per browser/OS.</p>
326
- <h2 id="session-retention"><a class="anchor" href="#session-retention" aria-label="Anchor link">#</a>Session retention</h2>
327
- <p>Each invocation can optionally prune cached sessions before starting new work:</p>
328
- <ul>
329
- <li><code>--retain-hours &lt;n&gt;</code> deletes sessions older than <code>&lt;n&gt;</code> hours right before the run begins. Use <code>0</code> (or omit the flag) to skip pruning.</li>
330
- <li>In <code>config.json</code>, set <code>sessionRetentionHours</code> to apply pruning automatically for every CLI/TUI/MCP invocation.</li>
331
- <li>Set <code>ORACLE_RETAIN_HOURS</code> in the environment to override the config on shared machines without editing the JSON file.</li>
332
- </ul>
333
- <p>Under the hood, pruning removes entire session directories (metadata + logs). The command-line cleanup command (<code>oracle session --clear</code>) still exists when you need to wipe everything manually.</p>
334
- <h2 id="follow-up-chaining"><a class="anchor" href="#follow-up-chaining" aria-label="Anchor link">#</a>Follow-up chaining</h2>
335
- <p><code>--followup</code> and <code>--followup-model</code> are CLI run flags (not persisted defaults in <code>config.json</code>).</p>
336
- <ul>
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>
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>
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>
340
- <li>If the session id is wrong, Oracle now prints actionable guidance and suggests close matches from local session history.</li>
341
- </ul>
342
- <p>Example:</p>
343
- <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:#F47067"> \</span></span>
344
- <span class="line"><span style="color:#6CB6FF"> --engine</span><span style="color:#96D0FF"> api</span><span style="color:#F47067"> \</span></span>
345
- <span class="line"><span style="color:#6CB6FF"> --model</span><span style="color:#96D0FF"> gpt-5.2-pro</span><span style="color:#F47067"> \</span></span>
346
- <span class="line"><span style="color:#6CB6FF"> --followup</span><span style="color:#96D0FF"> release-readiness-audit</span><span style="color:#F47067"> \</span></span>
347
- <span class="line"><span style="color:#6CB6FF"> --followup-model</span><span style="color:#96D0FF"> gpt-5.2-pro</span><span style="color:#F47067"> \</span></span>
348
- <span class="line"><span style="color:#6CB6FF"> -p</span><span style="color:#96D0FF"> "Follow-up: revise the plan with these files."</span><span style="color:#F47067"> \</span></span>
349
- <span class="line"><span style="color:#6CB6FF"> --file</span><span style="color:#96D0FF"> "src/**/*.ts"</span></span></code></pre>
350
- <h2 id="api-timeouts"><a class="anchor" href="#api-timeouts" aria-label="Anchor link">#</a>API timeouts</h2>
351
- <ul>
352
- <li><code>--timeout &lt;seconds|duration|auto&gt;</code> controls the overall API deadline for a run. Bare numbers are seconds; duration values such as <code>10m</code> and <code>2h</code> are supported.</li>
353
- <li><code>--http-timeout &lt;ms|s|m|h&gt;</code> overrides the HTTP client timeout for API requests. If omitted, explicit <code>--timeout</code> values are reused for transport.</li>
354
- <li>Explicit <code>--timeout</code> values also set the stale-session cutoff unless <code>--zombie-timeout</code> is provided.</li>
355
- <li>Defaults: <code>auto</code> = 60 m for Pro models; non-pro API models use <code>120s</code> if you don’t set a value.</li>
356
- <li>Heartbeat messages print the live remaining time so you can see when the client-side deadline will fire.</li>
357
- </ul>
358
- <h2 id="zombie-session-staleness"><a class="anchor" href="#zombie-session-staleness" aria-label="Anchor link">#</a>Zombie/session staleness</h2>
359
- <ul>
360
- <li><code>--zombie-timeout &lt;ms|s|m|h&gt;</code> overrides the stale-session cutoff used by <code>oracle status</code>.</li>
361
- <li><code>--zombie-last-activity</code> uses last log activity instead of start time to detect stale sessions.</li>
362
- </ul>
363
- <h2 id="performance-traces"><a class="anchor" href="#performance-traces" aria-label="Anchor link">#</a>Performance traces</h2>
364
- <ul>
365
- <li><code>--perf-trace</code> writes a JSON timing trace with startup, first output, root command, and exit marks.</li>
366
- <li><code>--perf-trace-path /tmp/oracle.json</code> or <code>--perf-trace=/tmp/oracle.json</code> writes to an explicit path.</li>
367
- <li><code>ORACLE_PERF_TRACE=1</code> writes <code>.oracle-perf-&lt;timestamp&gt;-&lt;pid&gt;.json</code> in the current directory.</li>
368
- <li><code>ORACLE_PERF_TRACE=/tmp/oracle.json</code> writes to an explicit path.</li>
369
- <li>Trace args are secret-safe: prompt text, tokens, cookie payloads, inline cookies, and API key-like values are redacted.</li>
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>
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>
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>
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>
374
- </div>
375
- </main>
376
- </div>
377
- <script>
378
- const themeRoot=document.documentElement;
379
- function applyTheme(mode){themeRoot.dataset.theme=mode;document.querySelectorAll('[data-theme-toggle]').forEach(b=>b.setAttribute('aria-pressed',mode==='dark'?'true':'false'))}
380
- function storedTheme(){try{return localStorage.getItem('theme')}catch(e){return null}}
381
- function persistTheme(mode){try{localStorage.setItem('theme',mode)}catch(e){}}
382
- applyTheme(themeRoot.dataset.theme==='dark'?'dark':'light');
383
- document.querySelectorAll('[data-theme-toggle]').forEach(btn=>{btn.addEventListener('click',()=>{const next=themeRoot.dataset.theme==='dark'?'light':'dark';applyTheme(next);persistTheme(next)})});
384
- const systemDark=window.matchMedia&&matchMedia('(prefers-color-scheme: dark)');
385
- function onSystemChange(e){if(storedTheme())return;applyTheme(e.matches?'dark':'light')}
386
- if(systemDark){if(systemDark.addEventListener)systemDark.addEventListener('change',onSystemChange);else if(systemDark.addListener)systemDark.addListener(onSystemChange)}
387
- const sidebar=document.querySelector('.sidebar');
388
- const toggle=document.querySelector('.nav-toggle');
389
- const mobileNav=window.matchMedia('(max-width: 900px)');
390
- const sidebarFocusable='a[href],button,input,select,textarea,[tabindex]';
391
- function setSidebarFocusable(enabled){
392
- sidebar?.querySelectorAll(sidebarFocusable).forEach((el)=>{
393
- if(enabled){
394
- if(el.dataset.sidebarTabindex!==undefined){
395
- if(el.dataset.sidebarTabindex)el.setAttribute('tabindex',el.dataset.sidebarTabindex);
396
- else el.removeAttribute('tabindex');
397
- delete el.dataset.sidebarTabindex;
398
- }
399
- }else if(el.dataset.sidebarTabindex===undefined){
400
- el.dataset.sidebarTabindex=el.getAttribute('tabindex')??'';
401
- el.setAttribute('tabindex','-1');
402
- }
403
- });
404
- }
405
- function setSidebarOpen(open){
406
- if(!sidebar||!toggle)return;
407
- sidebar.classList.toggle('open',open);
408
- toggle.setAttribute('aria-expanded',open?'true':'false');
409
- if(mobileNav.matches){
410
- sidebar.inert=!open;
411
- if(open)sidebar.removeAttribute('aria-hidden');
412
- else sidebar.setAttribute('aria-hidden','true');
413
- setSidebarFocusable(open);
414
- }else{
415
- sidebar.inert=false;
416
- sidebar.removeAttribute('aria-hidden');
417
- setSidebarFocusable(true);
418
- }
419
- }
420
- setSidebarOpen(false);
421
- toggle?.addEventListener('click',()=>setSidebarOpen(!sidebar?.classList.contains('open')));
422
- document.addEventListener('click',(e)=>{if(!sidebar?.classList.contains('open'))return;if(sidebar.contains(e.target)||toggle?.contains(e.target))return;setSidebarOpen(false)});
423
- document.addEventListener('keydown',(e)=>{if(e.key==='Escape')setSidebarOpen(false)});
424
- const syncSidebarForViewport=()=>setSidebarOpen(sidebar?.classList.contains('open')??false);
425
- if(mobileNav.addEventListener)mobileNav.addEventListener('change',syncSidebarForViewport);
426
- else mobileNav.addListener?.(syncSidebarForViewport);
427
- const input=document.getElementById('doc-search');
428
- input?.addEventListener('input',()=>{const q=input.value.trim().toLowerCase();document.querySelectorAll('nav section').forEach(sec=>{let any=false;sec.querySelectorAll('.nav-link').forEach(a=>{const m=!q||a.textContent.toLowerCase().includes(q);a.style.display=m?'block':'none';if(m)any=true});sec.style.display=any?'block':'none'})});
429
- function attachCopy(target,getText){const btn=document.createElement('button');btn.type='button';btn.className='copy';btn.textContent='Copy';btn.addEventListener('click',async()=>{try{await navigator.clipboard.writeText(getText());btn.textContent='Copied';btn.classList.add('copied');setTimeout(()=>{btn.textContent='Copy';btn.classList.remove('copied')},1400)}catch{btn.textContent='Failed';setTimeout(()=>{btn.textContent='Copy'},1400)}});target.appendChild(btn)}
430
- document.querySelectorAll('.doc pre').forEach(pre=>attachCopy(pre,()=>pre.querySelector('code')?.textContent??''));
431
- document.querySelectorAll('.home-install').forEach(el=>attachCopy(el,()=>el.querySelector('code')?.textContent??''));
432
- const tocLinks=document.querySelectorAll('.toc a');
433
- if(tocLinks.length){const map=new Map();tocLinks.forEach(a=>{const id=a.getAttribute('href').slice(1);const el=document.getElementById(id);if(el)map.set(el,a)});const setActive=l=>{tocLinks.forEach(x=>x.classList.remove('active'));l.classList.add('active')};const obs=new IntersectionObserver(entries=>{const visible=entries.filter(e=>e.isIntersecting).sort((a,b)=>a.boundingClientRect.top-b.boundingClientRect.top);if(visible.length){const link=map.get(visible[0].target);if(link)setActive(link)}},{rootMargin:'-15% 0px -65% 0px',threshold:0});map.forEach((_,el)=>obs.observe(el))}
434
- </script>
435
- </body>
436
- </html>
@@ -1,14 +0,0 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" role="img" aria-label="oracle">
2
- <defs>
3
- <radialGradient id="orb" cx="35%" cy="32%" r="65%">
4
- <stop offset="0" stop-color="#ffffff"/>
5
- <stop offset="0.18" stop-color="#e0d4ff"/>
6
- <stop offset="0.55" stop-color="#7c3aed"/>
7
- <stop offset="1" stop-color="#1e1240"/>
8
- </radialGradient>
9
- </defs>
10
- <rect width="64" height="64" rx="14" fill="#0c0a1a"/>
11
- <circle cx="32" cy="32" r="20" fill="url(#orb)"/>
12
- <circle cx="32" cy="32" r="5.6" fill="#0c0820"/>
13
- <circle cx="38.5" cy="26.5" r="2.4" fill="#ffffff" opacity="0.85"/>
14
- </svg>