@steipete/oracle 0.8.6 → 0.10.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 (181) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +130 -45
  3. package/dist/bin/oracle-cli.js +613 -379
  4. package/dist/bin/oracle-mcp.js +2 -2
  5. package/dist/bin/oracle.js +165 -279
  6. package/dist/scripts/agent-send.js +31 -31
  7. package/dist/scripts/check.js +6 -6
  8. package/dist/scripts/debug/extract-chatgpt-response.js +10 -10
  9. package/dist/scripts/docs-list.js +30 -30
  10. package/dist/scripts/git-policy.js +25 -23
  11. package/dist/scripts/run-cli.js +8 -8
  12. package/dist/scripts/runner.js +203 -195
  13. package/dist/scripts/test-browser.js +21 -18
  14. package/dist/scripts/test-remote-chrome.js +20 -20
  15. package/dist/src/bridge/connection.js +18 -18
  16. package/dist/src/bridge/userConfigFile.js +7 -7
  17. package/dist/src/browser/actions/assistantResponse.js +149 -101
  18. package/dist/src/browser/actions/attachmentDataTransfer.js +49 -47
  19. package/dist/src/browser/actions/attachments.js +246 -150
  20. package/dist/src/browser/actions/domEvents.js +2 -2
  21. package/dist/src/browser/actions/modelSelection.js +314 -104
  22. package/dist/src/browser/actions/navigation.js +161 -136
  23. package/dist/src/browser/actions/promptComposer.js +100 -64
  24. package/dist/src/browser/actions/remoteFileTransfer.js +10 -10
  25. package/dist/src/browser/actions/thinkingTime.js +207 -110
  26. package/dist/src/browser/chromeLifecycle.js +62 -60
  27. package/dist/src/browser/config.js +34 -15
  28. package/dist/src/browser/constants.js +17 -12
  29. package/dist/src/browser/cookies.js +19 -19
  30. package/dist/src/browser/detect.js +62 -62
  31. package/dist/src/browser/domDebug.js +1 -1
  32. package/dist/src/browser/index.js +452 -303
  33. package/dist/src/browser/modelStrategy.js +1 -1
  34. package/dist/src/browser/pageActions.js +5 -5
  35. package/dist/src/browser/policies.js +16 -13
  36. package/dist/src/browser/profileState.js +44 -39
  37. package/dist/src/browser/prompt.js +72 -42
  38. package/dist/src/browser/promptSummary.js +5 -5
  39. package/dist/src/browser/providerDomFlow.js +17 -0
  40. package/dist/src/browser/providers/chatgptDomProvider.js +49 -0
  41. package/dist/src/browser/providers/geminiDeepThinkDomProvider.js +254 -0
  42. package/dist/src/browser/providers/index.js +2 -0
  43. package/dist/src/browser/reattach.js +67 -34
  44. package/dist/src/browser/reattachHelpers.js +31 -26
  45. package/dist/src/browser/sessionRunner.js +37 -25
  46. package/dist/src/browser/utils.js +9 -9
  47. package/dist/src/browserMode.js +1 -1
  48. package/dist/src/cli/bridge/claudeConfig.js +16 -16
  49. package/dist/src/cli/bridge/client.js +28 -20
  50. package/dist/src/cli/bridge/codexConfig.js +16 -16
  51. package/dist/src/cli/bridge/doctor.js +47 -39
  52. package/dist/src/cli/bridge/host.js +58 -56
  53. package/dist/src/cli/browserConfig.js +65 -45
  54. package/dist/src/cli/browserDefaults.js +27 -26
  55. package/dist/src/cli/bundleWarnings.js +1 -1
  56. package/dist/src/cli/clipboard.js +11 -2
  57. package/dist/src/cli/detach.js +7 -4
  58. package/dist/src/cli/dryRun.js +29 -25
  59. package/dist/src/cli/duplicatePromptGuard.js +3 -3
  60. package/dist/src/cli/engine.js +9 -9
  61. package/dist/src/cli/errorUtils.js +1 -1
  62. package/dist/src/cli/fileSize.js +11 -0
  63. package/dist/src/cli/format.js +2 -2
  64. package/dist/src/cli/help.js +28 -28
  65. package/dist/src/cli/hiddenAliases.js +3 -3
  66. package/dist/src/cli/markdownBundle.js +12 -8
  67. package/dist/src/cli/markdownRenderer.js +15 -15
  68. package/dist/src/cli/notifier.js +77 -67
  69. package/dist/src/cli/options.js +145 -87
  70. package/dist/src/cli/oscUtils.js +1 -1
  71. package/dist/src/cli/promptRequirement.js +2 -2
  72. package/dist/src/cli/renderOutput.js +1 -1
  73. package/dist/src/cli/rootAlias.js +1 -1
  74. package/dist/src/cli/runOptions.js +37 -25
  75. package/dist/src/cli/sessionCommand.js +31 -21
  76. package/dist/src/cli/sessionDisplay.js +182 -79
  77. package/dist/src/cli/sessionLineage.js +60 -0
  78. package/dist/src/cli/sessionRunner.js +118 -90
  79. package/dist/src/cli/sessionTable.js +28 -24
  80. package/dist/src/cli/stdin.js +22 -0
  81. package/dist/src/cli/tagline.js +121 -124
  82. package/dist/src/cli/tui/index.js +140 -127
  83. package/dist/src/cli/writeOutputPath.js +5 -5
  84. package/dist/src/config.js +7 -7
  85. package/dist/src/gemini-web/browserSessionManager.js +80 -0
  86. package/dist/src/gemini-web/client.js +81 -64
  87. package/dist/src/gemini-web/executionMode.js +16 -0
  88. package/dist/src/gemini-web/executor.js +327 -169
  89. package/dist/src/gemini-web/index.js +1 -1
  90. package/dist/src/mcp/server.js +16 -12
  91. package/dist/src/mcp/tools/consult.js +81 -64
  92. package/dist/src/mcp/tools/sessionResources.js +12 -12
  93. package/dist/src/mcp/tools/sessions.js +26 -17
  94. package/dist/src/mcp/types.js +5 -5
  95. package/dist/src/mcp/utils.js +15 -7
  96. package/dist/src/oracle/background.js +15 -15
  97. package/dist/src/oracle/claude.js +53 -25
  98. package/dist/src/oracle/client.js +84 -46
  99. package/dist/src/oracle/config.js +124 -58
  100. package/dist/src/oracle/errors.js +38 -38
  101. package/dist/src/oracle/files.js +69 -45
  102. package/dist/src/oracle/finishLine.js +10 -8
  103. package/dist/src/oracle/format.js +3 -3
  104. package/dist/src/oracle/gemini.js +37 -30
  105. package/dist/src/oracle/logging.js +7 -7
  106. package/dist/src/oracle/markdown.js +28 -28
  107. package/dist/src/oracle/modelResolver.js +16 -16
  108. package/dist/src/oracle/multiModelRunner.js +12 -12
  109. package/dist/src/oracle/oscProgress.js +8 -8
  110. package/dist/src/oracle/promptAssembly.js +6 -3
  111. package/dist/src/oracle/request.js +23 -15
  112. package/dist/src/oracle/run.js +172 -140
  113. package/dist/src/oracle/runUtils.js +8 -5
  114. package/dist/src/oracle/tokenEstimate.js +6 -6
  115. package/dist/src/oracle/tokenStats.js +5 -5
  116. package/dist/src/oracle/tokenStringifier.js +5 -5
  117. package/dist/src/oracle.js +12 -12
  118. package/dist/src/oracleHome.js +3 -3
  119. package/dist/src/remote/client.js +25 -25
  120. package/dist/src/remote/health.js +20 -20
  121. package/dist/src/remote/remoteServiceConfig.js +9 -9
  122. package/dist/src/remote/server.js +129 -118
  123. package/dist/src/sessionManager.js +81 -75
  124. package/dist/src/sessionStore.js +3 -3
  125. package/dist/src/version.js +10 -10
  126. package/dist/vendor/oracle-notifier/OracleNotifier.app/Contents/CodeResources +0 -0
  127. package/dist/vendor/oracle-notifier/OracleNotifier.app/Contents/MacOS/OracleNotifier +0 -0
  128. package/dist/vendor/oracle-notifier/README.md +2 -0
  129. package/package.json +69 -65
  130. package/vendor/oracle-notifier/OracleNotifier.app/Contents/CodeResources +0 -0
  131. package/vendor/oracle-notifier/OracleNotifier.app/Contents/MacOS/OracleNotifier +0 -0
  132. package/vendor/oracle-notifier/README.md +2 -0
  133. package/dist/markdansi/types/index.js +0 -4
  134. package/dist/oracle/bin/oracle-cli.js +0 -472
  135. package/dist/oracle/src/browser/actions/assistantResponse.js +0 -471
  136. package/dist/oracle/src/browser/actions/attachments.js +0 -82
  137. package/dist/oracle/src/browser/actions/modelSelection.js +0 -190
  138. package/dist/oracle/src/browser/actions/navigation.js +0 -75
  139. package/dist/oracle/src/browser/actions/promptComposer.js +0 -167
  140. package/dist/oracle/src/browser/chromeLifecycle.js +0 -104
  141. package/dist/oracle/src/browser/config.js +0 -33
  142. package/dist/oracle/src/browser/constants.js +0 -40
  143. package/dist/oracle/src/browser/cookies.js +0 -210
  144. package/dist/oracle/src/browser/domDebug.js +0 -36
  145. package/dist/oracle/src/browser/index.js +0 -331
  146. package/dist/oracle/src/browser/pageActions.js +0 -5
  147. package/dist/oracle/src/browser/prompt.js +0 -88
  148. package/dist/oracle/src/browser/promptSummary.js +0 -20
  149. package/dist/oracle/src/browser/sessionRunner.js +0 -80
  150. package/dist/oracle/src/browser/utils.js +0 -62
  151. package/dist/oracle/src/browserMode.js +0 -1
  152. package/dist/oracle/src/cli/browserConfig.js +0 -44
  153. package/dist/oracle/src/cli/dryRun.js +0 -59
  154. package/dist/oracle/src/cli/engine.js +0 -17
  155. package/dist/oracle/src/cli/errorUtils.js +0 -9
  156. package/dist/oracle/src/cli/help.js +0 -70
  157. package/dist/oracle/src/cli/markdownRenderer.js +0 -15
  158. package/dist/oracle/src/cli/options.js +0 -103
  159. package/dist/oracle/src/cli/promptRequirement.js +0 -14
  160. package/dist/oracle/src/cli/rootAlias.js +0 -30
  161. package/dist/oracle/src/cli/sessionCommand.js +0 -77
  162. package/dist/oracle/src/cli/sessionDisplay.js +0 -270
  163. package/dist/oracle/src/cli/sessionRunner.js +0 -94
  164. package/dist/oracle/src/heartbeat.js +0 -43
  165. package/dist/oracle/src/oracle/client.js +0 -48
  166. package/dist/oracle/src/oracle/config.js +0 -29
  167. package/dist/oracle/src/oracle/errors.js +0 -101
  168. package/dist/oracle/src/oracle/files.js +0 -220
  169. package/dist/oracle/src/oracle/format.js +0 -33
  170. package/dist/oracle/src/oracle/fsAdapter.js +0 -7
  171. package/dist/oracle/src/oracle/oscProgress.js +0 -60
  172. package/dist/oracle/src/oracle/request.js +0 -48
  173. package/dist/oracle/src/oracle/run.js +0 -444
  174. package/dist/oracle/src/oracle/tokenStats.js +0 -39
  175. package/dist/oracle/src/oracle/types.js +0 -1
  176. package/dist/oracle/src/oracle.js +0 -9
  177. package/dist/oracle/src/sessionManager.js +0 -205
  178. package/dist/oracle/src/version.js +0 -39
  179. package/dist/scripts/chrome/browser-tools.js +0 -295
  180. package/dist/src/browser/profileSync.js +0 -141
  181. /package/dist/{oracle/src/browser/types.js → src/gemini-web/executionClients.js} +0 -0
@@ -1,123 +1,123 @@
1
- import chalk from 'chalk';
1
+ import chalk from "chalk";
2
2
  const TAGLINES = [
3
- 'Whispering your tokens to the silicon sage.',
4
- 'Turning scattered files into one sharp question.',
5
- 'One slug to gather them all.',
6
- 'Token thrift, oracle lift.',
7
- 'Globs to gospel, minus the incense.',
8
- 'Your repo, neatly bottled, gently shaken.',
9
- 'Clarity, with a hint of smoke.',
10
- 'Questions in, clarity out.',
11
- 'Globs become guidance.',
12
- 'Token-aware, omen-ready.',
13
- 'Globs go in; citations and costs come out.',
14
- 'Keeps 196k tokens feeling roomy, not risky.',
15
- 'Remembers your paths, forgets your past runs.',
16
- 'A TUI when you want it, a one-liner when you do not.',
17
- 'Less ceremony, more certainty.',
18
- 'Guidance without the guesswork.',
19
- 'One prompt fanned out, no echoes wasted.',
20
- 'Detached runs, tethered results.',
21
- 'Calm CLI, loud answers.',
22
- 'Single scroll, many seers.',
23
- 'Background magic with foreground receipts.',
24
- 'Paths aligned, models attuned.',
25
- 'Light spell, heavy insight.',
26
- 'Signal first, sorcery second.',
27
- 'One command, several seers; results stay grounded.',
28
- 'Context braided, answers sharpened.',
29
- 'Short incantation, long provenance.',
30
- 'Attach, cast, reattach later.',
31
- 'Spell once, cite always.',
32
- 'Edge cases foretold, receipts attached.',
33
- 'Silent run, loud receipts.',
34
- 'Detours gone; clarity walks in.',
35
- 'Tokens tallied, omens tallied.',
36
- 'Calm prompt, converged truths.',
37
- 'Single spell, multiple verdicts.',
38
- 'Prompt once, harvest many omens.',
39
- 'Light on ceremony, heavy on receipts.',
40
- 'From globs to guidance in one breath.',
41
- 'Quiet prompt, thunderous answers.',
42
- 'Balanced mystique, measurable results.',
43
- 'Debugger by day, oracle by night.',
3
+ "Whispering your tokens to the silicon sage.",
4
+ "Turning scattered files into one sharp question.",
5
+ "One slug to gather them all.",
6
+ "Token thrift, oracle lift.",
7
+ "Globs to gospel, minus the incense.",
8
+ "Your repo, neatly bottled, gently shaken.",
9
+ "Clarity, with a hint of smoke.",
10
+ "Questions in, clarity out.",
11
+ "Globs become guidance.",
12
+ "Token-aware, omen-ready.",
13
+ "Globs go in; citations and costs come out.",
14
+ "Keeps 196k tokens feeling roomy, not risky.",
15
+ "Remembers your paths, forgets your past runs.",
16
+ "A TUI when you want it, a one-liner when you do not.",
17
+ "Less ceremony, more certainty.",
18
+ "Guidance without the guesswork.",
19
+ "One prompt fanned out, no echoes wasted.",
20
+ "Detached runs, tethered results.",
21
+ "Calm CLI, loud answers.",
22
+ "Single scroll, many seers.",
23
+ "Background magic with foreground receipts.",
24
+ "Paths aligned, models attuned.",
25
+ "Light spell, heavy insight.",
26
+ "Signal first, sorcery second.",
27
+ "One command, several seers; results stay grounded.",
28
+ "Context braided, answers sharpened.",
29
+ "Short incantation, long provenance.",
30
+ "Attach, cast, reattach later.",
31
+ "Spell once, cite always.",
32
+ "Edge cases foretold, receipts attached.",
33
+ "Silent run, loud receipts.",
34
+ "Detours gone; clarity walks in.",
35
+ "Tokens tallied, omens tallied.",
36
+ "Calm prompt, converged truths.",
37
+ "Single spell, multiple verdicts.",
38
+ "Prompt once, harvest many omens.",
39
+ "Light on ceremony, heavy on receipts.",
40
+ "From globs to guidance in one breath.",
41
+ "Quiet prompt, thunderous answers.",
42
+ "Balanced mystique, measurable results.",
43
+ "Debugger by day, oracle by night.",
44
44
  "Your code's confessional booth.",
45
- 'Edge cases fear this inbox.',
46
- 'Slop in, sharp answers out.',
45
+ "Edge cases fear this inbox.",
46
+ "Slop in, sharp answers out.",
47
47
  "Your AI coworker's quality control.",
48
48
  "Because vibes aren't a deliverable.",
49
- 'When the other agents shrug, the oracle ships.',
50
- 'Hallucinations checked at the door.',
51
- 'Context police for overeager LLMs.',
52
- 'Turns prompt spaghetti into ship-ready sauce.',
53
- 'Lint for large language models.',
49
+ "When the other agents shrug, the oracle ships.",
50
+ "Hallucinations checked at the door.",
51
+ "Context police for overeager LLMs.",
52
+ "Turns prompt spaghetti into ship-ready sauce.",
53
+ "Lint for large language models.",
54
54
  "Slaps wrists before they hit 'ship'.",
55
55
  "Because 'let the model figure it out' is not QA.",
56
56
  "Fine, I'll write the test for the AI too.",
57
- 'We bring receipts; they bring excuses.',
58
- 'Less swagger, more citations.',
59
- 'LLM babysitter with a shipping agenda.',
60
- 'Ships facts, not vibes.',
61
- 'Context sanitizer for reckless prompts.',
62
- 'AI babysitter with merge rights.',
63
- 'Stops the hallucination before it hits prod.',
64
- 'Slop filter set to aggressive.',
65
- 'We debug the debugger.',
66
- 'Model said maybe; oracle says ship/no.',
67
- 'Less lorem, more logic.',
57
+ "We bring receipts; they bring excuses.",
58
+ "Less swagger, more citations.",
59
+ "LLM babysitter with a shipping agenda.",
60
+ "Ships facts, not vibes.",
61
+ "Context sanitizer for reckless prompts.",
62
+ "AI babysitter with merge rights.",
63
+ "Stops the hallucination before it hits prod.",
64
+ "Slop filter set to aggressive.",
65
+ "We debug the debugger.",
66
+ "Model said maybe; oracle says ship/no.",
67
+ "Less lorem, more logic.",
68
68
  "Your prompt's adult supervision.",
69
- 'Cleanup crew for AI messes.',
70
- 'AI wrote it? Oracle babysits it.',
71
- 'Turning maybe into mergeable.',
72
- 'The AI said vibes; we said tests.',
73
- 'Cleanup crew for model-made messes—now with citations.',
74
- 'Less hallucination, more escalation.',
69
+ "Cleanup crew for AI messes.",
70
+ "AI wrote it? Oracle babysits it.",
71
+ "Turning maybe into mergeable.",
72
+ "The AI said vibes; we said tests.",
73
+ "Cleanup crew for model-made messes—now with citations.",
74
+ "Less hallucination, more escalation.",
75
75
  "Your AI's ghostwriter, but with citations.",
76
- 'Where prompt soup becomes production code.',
77
- 'From shruggy agents to shippable PRs.',
78
- 'Token mop for agent spillover.',
79
- 'We QA the AI so you can ship the code.',
80
- 'Less improv, more implementation.',
81
- 'Ships facts faster than agents make excuses.',
82
- 'From prompt chaos to PR-ready prose.',
76
+ "Where prompt soup becomes production code.",
77
+ "From shruggy agents to shippable PRs.",
78
+ "Token mop for agent spillover.",
79
+ "We QA the AI so you can ship the code.",
80
+ "Less improv, more implementation.",
81
+ "Ships facts faster than agents make excuses.",
82
+ "From prompt chaos to PR-ready prose.",
83
83
  "Your AI's hot take, fact-checked.",
84
- 'Cleanup crew for LLM loose ends.',
85
- 'We babysit the bot; you ship the build.',
86
- 'Prompt drama in; release notes out.',
87
- 'AI confidence filtered through reality.',
84
+ "Cleanup crew for LLM loose ends.",
85
+ "We babysit the bot; you ship the build.",
86
+ "Prompt drama in; release notes out.",
87
+ "AI confidence filtered through reality.",
88
88
  "From 'it told me so' to 'tests say so'.",
89
89
  "We refactor the model's hubris before it hits prod.",
90
- 'Prompt chaos triaged, answers discharged.',
91
- 'Oracle babysits; you merge.',
92
- 'Vibes quarantined; facts admitted.',
93
- 'The cleanup crew for speculative stack traces.',
94
- 'Ship-ready answers, minus the AI improv.',
90
+ "Prompt chaos triaged, answers discharged.",
91
+ "Oracle babysits; you merge.",
92
+ "Vibes quarantined; facts admitted.",
93
+ "The cleanup crew for speculative stack traces.",
94
+ "Ship-ready answers, minus the AI improv.",
95
95
  "We pre-empt the hallucination so you don't triage it at 2am.",
96
- 'AI confidence monitored, citations required.',
97
- 'Ship logs, not lore.',
98
- 'Hallucinations flagged, reality shipped.',
99
- 'We lint the lore so you can ship the code.',
100
- 'Hallucination hotline: we answer, not the pager.',
101
- 'Less mystique, more mergeability.',
102
- 'Slop filter set past 11.',
103
- 'Bottled prompt chaos, filtered answers.',
96
+ "AI confidence monitored, citations required.",
97
+ "Ship logs, not lore.",
98
+ "Hallucinations flagged, reality shipped.",
99
+ "We lint the lore so you can ship the code.",
100
+ "Hallucination hotline: we answer, not the pager.",
101
+ "Less mystique, more mergeability.",
102
+ "Slop filter set past 11.",
103
+ "Bottled prompt chaos, filtered answers.",
104
104
  "Your AI's swagger, audited.",
105
- 'New year, same oracle: resolutions shipped, not wished.',
106
- 'Lunar New Year sweep: clear caches, invite good deploys.',
107
- 'Eid Mubarak: feast on clarity, fast from hallucinations.',
108
- 'Diwali: lights on, incident lights off.',
109
- 'Holi colors on dashboards, not in logs.',
105
+ "New year, same oracle: resolutions shipped, not wished.",
106
+ "Lunar New Year sweep: clear caches, invite good deploys.",
107
+ "Eid Mubarak: feast on clarity, fast from hallucinations.",
108
+ "Diwali: lights on, incident lights off.",
109
+ "Holi colors on dashboards, not in logs.",
110
110
  "Workers' Day: let oracle haul the heavy context.",
111
- 'Earth Day: trim carbon, trim token waste.',
112
- 'Halloween: ship treats, not trick exceptions.',
113
- 'Independence Day: sparkles in the sky, not in the error console.',
114
- 'Christmas: all is calm, all is shipped.',
115
- 'Nowruz reset: sweep caches, welcome clean deploys.',
116
- 'Hanukkah lights, zero prod fires.',
117
- 'Ramadan focus: fast from scope creep, feast on clarity.',
118
- 'Pride Month: more color on the streets, less red in CI.',
119
- 'Thanksgiving: grateful for green builds, no turkey outages.',
120
- 'Solstice deploy: longest day, shortest incident list.',
111
+ "Earth Day: trim carbon, trim token waste.",
112
+ "Halloween: ship treats, not trick exceptions.",
113
+ "Independence Day: sparkles in the sky, not in the error console.",
114
+ "Christmas: all is calm, all is shipped.",
115
+ "Nowruz reset: sweep caches, welcome clean deploys.",
116
+ "Hanukkah lights, zero prod fires.",
117
+ "Ramadan focus: fast from scope creep, feast on clarity.",
118
+ "Pride Month: more color on the streets, less red in CI.",
119
+ "Thanksgiving: grateful for green builds, no turkey outages.",
120
+ "Solstice deploy: longest day, shortest incident list.",
121
121
  ];
122
122
  const DAY_MS = 24 * 60 * 60 * 1000;
123
123
  function utcParts(date) {
@@ -160,9 +160,9 @@ const isFourthThursdayOfNovember = (date) => {
160
160
  return parts.day === fourthThursday;
161
161
  };
162
162
  const HOLIDAY_RULES = new Map([
163
- ['New year, same oracle: resolutions shipped, not wished.', onMonthDay(0, 1)],
163
+ ["New year, same oracle: resolutions shipped, not wished.", onMonthDay(0, 1)],
164
164
  [
165
- 'Lunar New Year sweep: clear caches, invite good deploys.',
165
+ "Lunar New Year sweep: clear caches, invite good deploys.",
166
166
  onSpecificDates([
167
167
  [2025, 0, 29],
168
168
  [2026, 1, 17],
@@ -170,7 +170,7 @@ const HOLIDAY_RULES = new Map([
170
170
  ], 1),
171
171
  ],
172
172
  [
173
- 'Eid Mubarak: feast on clarity, fast from hallucinations.',
173
+ "Eid Mubarak: feast on clarity, fast from hallucinations.",
174
174
  onSpecificDates([
175
175
  [2025, 2, 31],
176
176
  [2026, 2, 20],
@@ -178,7 +178,7 @@ const HOLIDAY_RULES = new Map([
178
178
  ], 1),
179
179
  ],
180
180
  [
181
- 'Diwali: lights on, incident lights off.',
181
+ "Diwali: lights on, incident lights off.",
182
182
  onSpecificDates([
183
183
  [2025, 9, 20],
184
184
  [2026, 10, 8],
@@ -186,7 +186,7 @@ const HOLIDAY_RULES = new Map([
186
186
  ], 1),
187
187
  ],
188
188
  [
189
- 'Holi colors on dashboards, not in logs.',
189
+ "Holi colors on dashboards, not in logs.",
190
190
  onSpecificDates([
191
191
  [2025, 2, 14],
192
192
  [2026, 2, 3],
@@ -194,16 +194,13 @@ const HOLIDAY_RULES = new Map([
194
194
  ], 1),
195
195
  ],
196
196
  ["Workers' Day: let oracle haul the heavy context.", onMonthDay(4, 1)],
197
- ['Earth Day: trim carbon, trim token waste.', onMonthDay(3, 22)],
198
- ['Halloween: ship treats, not trick exceptions.', onMonthDay(9, 31)],
197
+ ["Earth Day: trim carbon, trim token waste.", onMonthDay(3, 22)],
198
+ ["Halloween: ship treats, not trick exceptions.", onMonthDay(9, 31)],
199
+ ["Independence Day: sparkles in the sky, not in the error console.", onMonthDay(6, 4)],
200
+ ["Christmas: all is calm, all is shipped.", onMonthDay(11, 25)],
201
+ ["Nowruz reset: sweep caches, welcome clean deploys.", onMonthDay(2, 20)],
199
202
  [
200
- 'Independence Day: sparkles in the sky, not in the error console.',
201
- onMonthDay(6, 4),
202
- ],
203
- ['Christmas: all is calm, all is shipped.', onMonthDay(11, 25)],
204
- ['Nowruz reset: sweep caches, welcome clean deploys.', onMonthDay(2, 20)],
205
- [
206
- 'Hanukkah lights, zero prod fires.',
203
+ "Hanukkah lights, zero prod fires.",
207
204
  inYearWindow([
208
205
  { year: 2025, month: 11, day: 14, duration: 8 },
209
206
  { year: 2026, month: 11, day: 4, duration: 8 },
@@ -211,16 +208,16 @@ const HOLIDAY_RULES = new Map([
211
208
  ]),
212
209
  ],
213
210
  [
214
- 'Ramadan focus: fast from scope creep, feast on clarity.',
211
+ "Ramadan focus: fast from scope creep, feast on clarity.",
215
212
  inYearWindow([
216
213
  { year: 2025, month: 1, day: 28, duration: 30 },
217
214
  { year: 2026, month: 1, day: 17, duration: 30 },
218
215
  { year: 2027, month: 1, day: 7, duration: 30 },
219
216
  ]),
220
217
  ],
221
- ['Pride Month: more color on the streets, less red in CI.', (date) => utcParts(date).month === 5],
222
- ['Thanksgiving: grateful for green builds, no turkey outages.', isFourthThursdayOfNovember],
223
- ['Solstice deploy: longest day, shortest incident list.', onMonthDay(5, 21)],
218
+ ["Pride Month: more color on the streets, less red in CI.", (date) => utcParts(date).month === 5],
219
+ ["Thanksgiving: grateful for green builds, no turkey outages.", isFourthThursdayOfNovember],
220
+ ["Solstice deploy: longest day, shortest incident list.", onMonthDay(5, 21)],
224
221
  ]);
225
222
  function isTaglineActive(tagline, date) {
226
223
  const rule = HOLIDAY_RULES.get(tagline);
@@ -251,7 +248,7 @@ export function formatIntroLine(version, options = {}) {
251
248
  const tagline = pickTagline(options);
252
249
  const rich = options.richTty ?? true;
253
250
  if (rich && chalk.level > 0) {
254
- return `${chalk.bold('🧿 oracle')} ${version} — ${tagline}`;
251
+ return `${chalk.bold("🧿 oracle")} ${version} — ${tagline}`;
255
252
  }
256
253
  return `🧿 oracle ${version} — ${tagline}`;
257
254
  }