@steipete/oracle 0.21.1 → 0.21.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/dist/bin/oracle-cli.js +6 -10
  2. package/dist/src/browser/profileState.js +2 -0
  3. package/package.json +10 -10
  4. package/dist/docs-site/.nojekyll +0 -0
  5. package/dist/docs-site/CNAME +0 -1
  6. package/dist/docs-site/RELEASING.html +0 -403
  7. package/dist/docs-site/advisor.html +0 -317
  8. package/dist/docs-site/agents.html +0 -375
  9. package/dist/docs-site/anthropic.html +0 -368
  10. package/dist/docs-site/bridge.html +0 -421
  11. package/dist/docs-site/browser-mode.html +0 -637
  12. package/dist/docs-site/chromium-forks.html +0 -355
  13. package/dist/docs-site/cli-reference.html +0 -347
  14. package/dist/docs-site/configuration.html +0 -464
  15. package/dist/docs-site/favicon.svg +0 -14
  16. package/dist/docs-site/followup.html +0 -375
  17. package/dist/docs-site/gemini.html +0 -388
  18. package/dist/docs-site/grok.html +0 -325
  19. package/dist/docs-site/index.html +0 -360
  20. package/dist/docs-site/install.html +0 -335
  21. package/dist/docs-site/linux.html +0 -321
  22. package/dist/docs-site/llms.txt +0 -44
  23. package/dist/docs-site/manual-tests.html +0 -621
  24. package/dist/docs-site/mcp.html +0 -412
  25. package/dist/docs-site/multimodel.html +0 -364
  26. package/dist/docs-site/mythical-pro-agents.html +0 -360
  27. package/dist/docs-site/notifier.html +0 -338
  28. package/dist/docs-site/openai-endpoints.html +0 -417
  29. package/dist/docs-site/openrouter.html +0 -344
  30. package/dist/docs-site/quickstart.html +0 -369
  31. package/dist/docs-site/refactor/ux.html +0 -321
  32. package/dist/docs-site/sessions.html +0 -397
  33. package/dist/docs-site/social-card.png +0 -0
  34. package/dist/docs-site/social-card.svg +0 -79
  35. package/dist/docs-site/spec.html +0 -363
  36. package/dist/docs-site/testing.html +0 -323
  37. package/dist/docs-site/tui-debug.html +0 -326
  38. package/dist/docs-site/windows-work.html +0 -348
  39. package/dist/docs-site/windows.html +0 -320
@@ -1,347 +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>CLI Reference — oracle</title>
7
- <meta name="description" content="Every flag you&#39;ll actually use, grouped by what it does. Run `oracle --help --verbose` for the full hidden list.">
8
- <link rel="canonical" href="https://askoracle.sh/cli-reference.html">
9
- <meta property="og:type" content="website">
10
- <meta property="og:site_name" content="oracle">
11
- <meta property="og:title" content="CLI Reference — oracle">
12
- <meta property="og:description" content="Every flag you&#39;ll actually use, grouped by what it does. Run `oracle --help --verbose` for the full hidden list.">
13
- <meta property="og:url" content="https://askoracle.sh/cli-reference.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="CLI Reference — oracle">
19
- <meta name="twitter:description" content="Every flag you&#39;ll actually use, grouped by what it does. Run `oracle --help --verbose` for the full hidden list.">
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" 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 active" 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">Reference</p>
239
- <h1>CLI Reference</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/cli-reference.md" rel="noopener">Edit page</a>
244
- </div>
245
- </header>
246
- <div class="doc-grid">
247
- <article class="doc"><p>This is the curated cheatsheet. The authoritative source is always <code>oracle --help</code> (and <code>oracle --help --verbose</code> for advanced flags).</p>
248
- <h2 id="commands"><a class="anchor" href="#commands" aria-label="Anchor link">#</a>Commands</h2>
249
- <table><thead><tr><th>Command</th><th>What it does</th></tr></thead><tbody><tr><td><code>oracle [flags] -p &quot;&lt;prompt&gt;&quot;</code></td><td>Run a consult.</td></tr><tr><td><code>oracle status</code></td><td>List recent sessions (see <a href="sessions.html">Sessions</a>).</td></tr><tr><td><code>oracle session &lt;id&gt;</code></td><td>Replay or block on a stored session.</td></tr><tr><td><code>oracle restart &lt;id&gt;</code></td><td>Re-run with the same prompt + files.</td></tr><tr><td><code>oracle docs check</code></td><td>Check documented flags against CLI help metadata.</td></tr><tr><td><code>oracle serve</code></td><td>Run the remote browser host (see <a href="browser-mode.html">Browser Mode</a>).</td></tr><tr><td><code>oracle bridge claude-config</code></td><td>Emit a <code>.mcp.json</code> for Claude Code (see <a href="mcp.html">MCP</a>).</td></tr><tr><td><code>oracle tui</code></td><td>Interactive TUI (humans only).</td></tr><tr><td><code>oracle-mcp</code></td><td>Stdio MCP server entrypoint.</td></tr></tbody></table>
250
- <h2 id="core-consult-flags"><a class="anchor" href="#core-consult-flags" aria-label="Anchor link">#</a>Core consult flags</h2>
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>--write-artifacts</code></td><td>Browser runs only: also copy captured files beside <code>--write-output</code>, preserving canonical artifacts and existing destination files.</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
- <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>
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>
256
- <p>Notes:</p>
257
- <ul>
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
- <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>
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
- </ul>
263
- <h2 id="api-endpoints"><a class="anchor" href="#api-endpoints" aria-label="Anchor link">#</a>API endpoints</h2>
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
- <p>See <a href="openai-endpoints.html">OpenAI / Azure / OpenRouter</a> and <a href="openrouter.html">OpenRouter</a>.</p>
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-cookie-sync</code></td><td>Explicitly copy cookies from live Chrome; prefer manual login because token rotation can invalidate the live session.</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|pro|heavy&gt;</code></td><td>Effort intensity; <code>pro</code> selects the Pro tier and fails closed if unconfirmed, other unmatched tiers keep the current effort.</td></tr><tr><td><code>--browser-research &lt;mode&gt;</code></td><td>Select <code>off</code>, <code>search</code> (Web Search), or <code>deep</code> (Deep Research); default off.</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>Multi-file source uploads bundle by default; <code>auto</code> keeps flattened text unless ZIP is selected or raw files are present.</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
- <p>See <a href="browser-mode.html">Browser Mode</a> for usage.</p>
269
- <h2 id="remote-browser"><a class="anchor" href="#remote-browser" aria-label="Anchor link">#</a>Remote browser</h2>
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><tr><td><code>serve --max-concurrent-runs &lt;count&gt;</code></td><td>Opt into bounded concurrent admission; effective capacity cannot exceed the host browser tab cap.</td></tr><tr><td><code>serve --max-queued-runs &lt;count&gt;</code></td><td>Waiting requests in opt-in mode (default 8; zero disables waiting).</td></tr></tbody></table>
271
- <h2 id="image-media-browser"><a class="anchor" href="#image-media-browser" aria-label="Anchor link">#</a>Image / media (browser)</h2>
272
- <table><thead><tr><th>Flag</th><th>Purpose</th></tr></thead><tbody><tr><td><code>--generate-image &lt;file&gt;</code></td><td>Save generated image (Gemini browser; ChatGPT also saves artifacts).</td></tr><tr><td><code>--edit-image &lt;file&gt;</code></td><td>Edit an image (Gemini browser).</td></tr><tr><td><code>--aspect &lt;ratio&gt;</code></td><td>Aspect ratio for image gen.</td></tr><tr><td><code>--youtube &lt;url&gt;</code></td><td>Analyze a YouTube video (Gemini browser).</td></tr></tbody></table>
273
- <h2 id="stale-session-detection"><a class="anchor" href="#stale-session-detection" aria-label="Anchor link">#</a>Stale session detection</h2>
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
- <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>
277
- <h2 id="see-also"><a class="anchor" href="#see-also" aria-label="Anchor link">#</a>See also</h2>
278
- <ul>
279
- <li><code>oracle --help</code> — short usage.</li>
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>
282
- </ul>
283
- <p>Provider-native evidence: <code>--browser-capture-provider-native</code> saves the full ChatGPT conversation record and independent text digests with session artifacts. It is opt-in; <code>--no-browser-capture-provider-native</code> overrides a saved preference. See <a href="browser-mode.html#provider-native-conversation-evidence">provider-native evidence</a> for retained data, fidelity, and fallback behavior.</p><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>
284
- <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>
285
- </div>
286
- </main>
287
- </div>
288
- <script>
289
- const themeRoot=document.documentElement;
290
- function applyTheme(mode){themeRoot.dataset.theme=mode;document.querySelectorAll('[data-theme-toggle]').forEach(b=>b.setAttribute('aria-pressed',mode==='dark'?'true':'false'))}
291
- function storedTheme(){try{return localStorage.getItem('theme')}catch(e){return null}}
292
- function persistTheme(mode){try{localStorage.setItem('theme',mode)}catch(e){}}
293
- applyTheme(themeRoot.dataset.theme==='dark'?'dark':'light');
294
- document.querySelectorAll('[data-theme-toggle]').forEach(btn=>{btn.addEventListener('click',()=>{const next=themeRoot.dataset.theme==='dark'?'light':'dark';applyTheme(next);persistTheme(next)})});
295
- const systemDark=window.matchMedia&&matchMedia('(prefers-color-scheme: dark)');
296
- function onSystemChange(e){if(storedTheme())return;applyTheme(e.matches?'dark':'light')}
297
- if(systemDark){if(systemDark.addEventListener)systemDark.addEventListener('change',onSystemChange);else if(systemDark.addListener)systemDark.addListener(onSystemChange)}
298
- const sidebar=document.querySelector('.sidebar');
299
- const toggle=document.querySelector('.nav-toggle');
300
- const mobileNav=window.matchMedia('(max-width: 900px)');
301
- const sidebarFocusable='a[href],button,input,select,textarea,[tabindex]';
302
- function setSidebarFocusable(enabled){
303
- sidebar?.querySelectorAll(sidebarFocusable).forEach((el)=>{
304
- if(enabled){
305
- if(el.dataset.sidebarTabindex!==undefined){
306
- if(el.dataset.sidebarTabindex)el.setAttribute('tabindex',el.dataset.sidebarTabindex);
307
- else el.removeAttribute('tabindex');
308
- delete el.dataset.sidebarTabindex;
309
- }
310
- }else if(el.dataset.sidebarTabindex===undefined){
311
- el.dataset.sidebarTabindex=el.getAttribute('tabindex')??'';
312
- el.setAttribute('tabindex','-1');
313
- }
314
- });
315
- }
316
- function setSidebarOpen(open){
317
- if(!sidebar||!toggle)return;
318
- sidebar.classList.toggle('open',open);
319
- toggle.setAttribute('aria-expanded',open?'true':'false');
320
- if(mobileNav.matches){
321
- sidebar.inert=!open;
322
- if(open)sidebar.removeAttribute('aria-hidden');
323
- else sidebar.setAttribute('aria-hidden','true');
324
- setSidebarFocusable(open);
325
- }else{
326
- sidebar.inert=false;
327
- sidebar.removeAttribute('aria-hidden');
328
- setSidebarFocusable(true);
329
- }
330
- }
331
- setSidebarOpen(false);
332
- toggle?.addEventListener('click',()=>setSidebarOpen(!sidebar?.classList.contains('open')));
333
- document.addEventListener('click',(e)=>{if(!sidebar?.classList.contains('open'))return;if(sidebar.contains(e.target)||toggle?.contains(e.target))return;setSidebarOpen(false)});
334
- document.addEventListener('keydown',(e)=>{if(e.key==='Escape')setSidebarOpen(false)});
335
- const syncSidebarForViewport=()=>setSidebarOpen(sidebar?.classList.contains('open')??false);
336
- if(mobileNav.addEventListener)mobileNav.addEventListener('change',syncSidebarForViewport);
337
- else mobileNav.addListener?.(syncSidebarForViewport);
338
- const input=document.getElementById('doc-search');
339
- 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'})});
340
- 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)}
341
- document.querySelectorAll('.doc pre').forEach(pre=>attachCopy(pre,()=>pre.querySelector('code')?.textContent??''));
342
- document.querySelectorAll('.home-install').forEach(el=>attachCopy(el,()=>el.querySelector('code')?.textContent??''));
343
- const tocLinks=document.querySelectorAll('.toc a');
344
- 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))}
345
- </script>
346
- </body>
347
- </html>