@steipete/oracle 0.17.2 → 0.18.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 (96) hide show
  1. package/dist/bin/oracle-cli.js +10 -1
  2. package/dist/bin/oracle-mcp.js +0 -0
  3. package/dist/bin/oracle.js +683 -0
  4. package/dist/docs-site/bridge.html +1 -17
  5. package/dist/docs-site/browser-mode.html +18 -26
  6. package/dist/docs-site/cli-reference.html +6 -6
  7. package/dist/docs-site/configuration.html +7 -33
  8. package/dist/docs-site/followup.html +9 -16
  9. package/dist/docs-site/gemini.html +6 -10
  10. package/dist/docs-site/index.html +7 -7
  11. package/dist/docs-site/install.html +1 -1
  12. package/dist/docs-site/manual-tests.html +2 -4
  13. package/dist/docs-site/mcp.html +5 -28
  14. package/dist/docs-site/mythical-pro-agents.html +10 -10
  15. package/dist/docs-site/openai-endpoints.html +1 -24
  16. package/dist/docs-site/quickstart.html +1 -1
  17. package/dist/docs-site/sessions.html +5 -6
  18. package/dist/docs-site/spec.html +1 -1
  19. package/dist/docs-site/windows-work.html +1 -2
  20. package/dist/docs-site/windows.html +1 -1
  21. package/dist/markdansi/types/index.js +4 -0
  22. package/dist/oracle/bin/oracle-cli.js +472 -0
  23. package/dist/oracle/src/browser/actions/assistantResponse.js +471 -0
  24. package/dist/oracle/src/browser/actions/attachments.js +82 -0
  25. package/dist/oracle/src/browser/actions/modelSelection.js +190 -0
  26. package/dist/oracle/src/browser/actions/navigation.js +75 -0
  27. package/dist/oracle/src/browser/actions/promptComposer.js +167 -0
  28. package/dist/oracle/src/browser/chromeLifecycle.js +104 -0
  29. package/dist/oracle/src/browser/config.js +33 -0
  30. package/dist/oracle/src/browser/constants.js +40 -0
  31. package/dist/oracle/src/browser/cookies.js +210 -0
  32. package/dist/oracle/src/browser/domDebug.js +36 -0
  33. package/dist/oracle/src/browser/index.js +331 -0
  34. package/dist/oracle/src/browser/pageActions.js +5 -0
  35. package/dist/oracle/src/browser/prompt.js +88 -0
  36. package/dist/oracle/src/browser/promptSummary.js +20 -0
  37. package/dist/oracle/src/browser/sessionRunner.js +80 -0
  38. package/dist/oracle/src/browser/types.js +1 -0
  39. package/dist/oracle/src/browser/utils.js +62 -0
  40. package/dist/oracle/src/browserMode.js +1 -0
  41. package/dist/oracle/src/cli/browserConfig.js +44 -0
  42. package/dist/oracle/src/cli/dryRun.js +59 -0
  43. package/dist/oracle/src/cli/engine.js +17 -0
  44. package/dist/oracle/src/cli/errorUtils.js +9 -0
  45. package/dist/oracle/src/cli/help.js +70 -0
  46. package/dist/oracle/src/cli/markdownRenderer.js +15 -0
  47. package/dist/oracle/src/cli/options.js +103 -0
  48. package/dist/oracle/src/cli/promptRequirement.js +14 -0
  49. package/dist/oracle/src/cli/rootAlias.js +30 -0
  50. package/dist/oracle/src/cli/sessionCommand.js +77 -0
  51. package/dist/oracle/src/cli/sessionDisplay.js +270 -0
  52. package/dist/oracle/src/cli/sessionRunner.js +94 -0
  53. package/dist/oracle/src/heartbeat.js +43 -0
  54. package/dist/oracle/src/oracle/client.js +48 -0
  55. package/dist/oracle/src/oracle/config.js +29 -0
  56. package/dist/oracle/src/oracle/errors.js +101 -0
  57. package/dist/oracle/src/oracle/files.js +220 -0
  58. package/dist/oracle/src/oracle/format.js +33 -0
  59. package/dist/oracle/src/oracle/fsAdapter.js +7 -0
  60. package/dist/oracle/src/oracle/oscProgress.js +60 -0
  61. package/dist/oracle/src/oracle/request.js +48 -0
  62. package/dist/oracle/src/oracle/run.js +444 -0
  63. package/dist/oracle/src/oracle/tokenStats.js +39 -0
  64. package/dist/oracle/src/oracle/types.js +1 -0
  65. package/dist/oracle/src/oracle.js +9 -0
  66. package/dist/oracle/src/sessionManager.js +205 -0
  67. package/dist/oracle/src/version.js +39 -0
  68. package/dist/scripts/chrome/browser-tools.js +295 -0
  69. package/dist/src/browser/actions/assistantResponse.js +71 -23
  70. package/dist/src/browser/actions/thinkingTime.js +165 -9
  71. package/dist/src/browser/chromeCookies.js +312 -0
  72. package/dist/src/browser/config.js +2 -3
  73. package/dist/src/browser/index.js +7 -2
  74. package/dist/src/browser/keytarShim.js +56 -0
  75. package/dist/src/browser/policies.js +10 -2
  76. package/dist/src/browser/profileSync.js +141 -0
  77. package/dist/src/browser/projectSourcesRunner.js +6 -3
  78. package/dist/src/browser/reattach.js +50 -35
  79. package/dist/src/browser/windowsCookies.js +219 -0
  80. package/dist/src/cli/browserConfig.js +39 -10
  81. package/dist/src/cli/browserDefaults.js +9 -1
  82. package/dist/src/cli/dryRun.js +1 -0
  83. package/dist/src/cli/projectSources.js +10 -1
  84. package/dist/src/mcp/tools/consult.js +13 -4
  85. package/dist/src/remote/server.js +8 -3
  86. package/dist/vendor/oracle-notifier/OracleNotifier.app/Contents/CodeResources +0 -0
  87. package/dist/vendor/oracle-notifier/OracleNotifier.app/Contents/Info.plist +20 -0
  88. package/dist/vendor/oracle-notifier/OracleNotifier.app/Contents/MacOS/OracleNotifier +0 -0
  89. package/dist/vendor/oracle-notifier/OracleNotifier.app/Contents/Resources/OracleIcon.icns +0 -0
  90. package/dist/vendor/oracle-notifier/OracleNotifier.app/Contents/_CodeSignature/CodeResources +128 -0
  91. package/package.json +8 -8
  92. package/vendor/oracle-notifier/OracleNotifier.app/Contents/CodeResources +0 -0
  93. package/vendor/oracle-notifier/OracleNotifier.app/Contents/Info.plist +20 -0
  94. package/vendor/oracle-notifier/OracleNotifier.app/Contents/MacOS/OracleNotifier +0 -0
  95. package/vendor/oracle-notifier/OracleNotifier.app/Contents/Resources/OracleIcon.icns +0 -0
  96. package/vendor/oracle-notifier/OracleNotifier.app/Contents/_CodeSignature/CodeResources +128 -0
@@ -13,6 +13,12 @@ const DEFAULT_BROWSER_ATTACHMENT_TIMEOUT_MS = 45_000;
13
13
  const DEFAULT_BROWSER_RECHECK_TIMEOUT_MS = 120_000;
14
14
  const DEFAULT_BROWSER_AUTO_REATTACH_TIMEOUT_MS = 120_000;
15
15
  const DEFAULT_CHROME_PROFILE = "Default";
16
+ const CURRENT_CHATGPT_PRO_ALIASES = new Set([
17
+ "gpt-5-pro",
18
+ "gpt-5.1-pro",
19
+ "gpt-5.2-pro",
20
+ "gpt-5.4-pro",
21
+ ]);
16
22
  // Ordered array: most specific models first to ensure correct selection.
17
23
  // The browser label is passed to the model picker which fuzzy-matches against ChatGPT's UI.
18
24
  const BROWSER_MODEL_LABELS = [
@@ -52,11 +58,8 @@ export function normalizeChatGptModelForBrowser(model) {
52
58
  return normalized;
53
59
  }
54
60
  // Pro variants: resolve to the latest Pro model in ChatGPT.
55
- if (normalized === "gpt-5-pro" ||
56
- normalized === "gpt-5.1-pro" ||
57
- normalized === "gpt-5.2-pro" ||
58
- normalized === "gpt-5.4-pro") {
59
- return "gpt-5.5-pro";
61
+ if (isCurrentChatGptProAlias(normalized)) {
62
+ return "gpt-5.6-sol";
60
63
  }
61
64
  // Explicit model variants: keep as-is (they have their own browser labels)
62
65
  if (normalized === "gpt-5.2-thinking" || normalized === "gpt-5.2-instant") {
@@ -68,6 +71,18 @@ export function normalizeChatGptModelForBrowser(model) {
68
71
  }
69
72
  return model;
70
73
  }
74
+ export function isCurrentChatGptProAlias(model) {
75
+ return CURRENT_CHATGPT_PRO_ALIASES.has(model?.trim().toLowerCase() ?? "");
76
+ }
77
+ export function resolveDefaultBrowserThinkingTime({ model, requestedModel, modelStrategy, }) {
78
+ const strategy = normalizeBrowserModelStrategy(modelStrategy) ?? DEFAULT_MODEL_STRATEGY;
79
+ if (strategy !== "select")
80
+ return undefined;
81
+ const normalizedModel = normalizeChatGptModelForBrowser(model);
82
+ return isCurrentChatGptProAlias(requestedModel ?? model) || normalizedModel === "gpt-5.5-pro"
83
+ ? "pro"
84
+ : undefined;
85
+ }
71
86
  export async function buildBrowserConfig(options) {
72
87
  if (options.copyProfile && options.browserKeepBrowser) {
73
88
  throw new Error("--copy-profile cannot be combined with --browser-keep-browser: the copied profile is a throwaway that is deleted after the run, so it must not be retained.");
@@ -85,11 +100,14 @@ export async function buildBrowserConfig(options) {
85
100
  const normalizedOverride = desiredModelOverride?.toLowerCase() ?? "";
86
101
  const baseModel = options.model.toLowerCase();
87
102
  const isChatGptModel = baseModel.startsWith("gpt-") && !baseModel.includes("codex");
88
- const normalizedBrowserModel = normalizeChatGptModelForBrowser(options.model);
89
103
  const shouldUseOverride = !isChatGptModel && normalizedOverride.length > 0 && normalizedOverride !== baseModel;
90
104
  const modelStrategy = normalizeBrowserModelStrategy(options.browserModelStrategy) ?? DEFAULT_MODEL_STRATEGY;
91
105
  const thinkingTime = normalizeThinkingTimeLevel(options.browserThinkingTime) ??
92
- (modelStrategy === "select" && normalizedBrowserModel === "gpt-5.5-pro" ? "pro" : undefined);
106
+ resolveDefaultBrowserThinkingTime({
107
+ model: options.model,
108
+ requestedModel: options.browserRequestedModel,
109
+ modelStrategy,
110
+ });
93
111
  assertBrowserModelAvailable(options.model, modelStrategy);
94
112
  const cookieNames = parseCookieNames(options.browserCookieNames ?? process.env.ORACLE_BROWSER_COOKIE_NAMES);
95
113
  let inline = await resolveInlineCookies({
@@ -99,7 +117,9 @@ export async function buildBrowserConfig(options) {
99
117
  envFile: process.env.ORACLE_BROWSER_COOKIES_FILE,
100
118
  cwd: process.cwd(),
101
119
  });
102
- if (inline?.source?.startsWith("home:") && options.browserNoCookieSync !== true) {
120
+ const chromeCookieSyncRequested = options.browserNoCookieSync !== true &&
121
+ (options.browserCookieSync === true || options.browserManualLoginCookieSync === true);
122
+ if (inline?.source?.startsWith("home:") && chromeCookieSyncRequested) {
103
123
  inline = undefined;
104
124
  }
105
125
  let remoteChrome;
@@ -161,14 +181,21 @@ export async function buildBrowserConfig(options) {
161
181
  cookieSyncWaitMs: options.browserCookieWait
162
182
  ? parseBrowserDuration(options.browserCookieWait, "--browser-cookie-wait", 0)
163
183
  : undefined,
164
- cookieSync: options.browserNoCookieSync ? false : undefined,
184
+ cookieSync: inline?.cookies?.length
185
+ ? true
186
+ : options.browserNoCookieSync
187
+ ? false
188
+ : options.browserCookieSync === true || options.browserManualLoginCookieSync === true
189
+ ? true
190
+ : undefined,
165
191
  cookieNames,
166
192
  inlineCookies: inline?.cookies,
167
193
  inlineCookiesSource: inline?.source ?? null,
168
- headless: undefined, // disable headless; Cloudflare blocks it
194
+ headless: options.browserHeadless === true ? true : undefined,
169
195
  keepBrowser: options.browserKeepBrowser ? true : undefined,
170
196
  manualLogin: options.browserManualLogin === undefined ? undefined : options.browserManualLogin,
171
197
  manualLoginProfileDir: options.browserManualLoginProfileDir ?? undefined,
198
+ manualLoginCookieSync: inline?.cookies?.length ? true : options.browserManualLoginCookieSync,
172
199
  copyProfileSource: options.copyProfile ?? undefined,
173
200
  hideWindow: options.browserHideWindow ? true : undefined,
174
201
  desiredModel,
@@ -201,7 +228,9 @@ function validateAttachRunningOptions(options, { attachRunning, hasInlineCookies
201
228
  const conflicts = [
202
229
  options.browserChromeProfile ? "--browser-chrome-profile" : null,
203
230
  options.browserCookiePath ? "--browser-cookie-path" : null,
231
+ options.browserCookieSync ? "--browser-cookie-sync" : null,
204
232
  options.browserNoCookieSync ? "--browser-no-cookie-sync" : null,
233
+ options.browserHeadless ? "--browser-headless" : null,
205
234
  options.browserHideWindow ? "--browser-hide-window" : null,
206
235
  options.browserKeepBrowser ? "--browser-keep-browser" : null,
207
236
  options.browserManualLogin ? "--browser-manual-login" : null,
@@ -76,7 +76,10 @@ export function applyBrowserDefaultsFromConfig(options, config, getSource) {
76
76
  if (isUnset("browserCookieWait") && typeof browser.cookieSyncWaitMs === "number") {
77
77
  options.browserCookieWait = String(browser.cookieSyncWaitMs);
78
78
  }
79
- if (isUnset("browserHeadless") && browser.headless !== undefined) {
79
+ if (!attachRunningRequested && isUnset("browserCookieSync") && browser.cookieSync !== undefined) {
80
+ options.browserCookieSync = browser.cookieSync;
81
+ }
82
+ if (!attachRunningRequested && isUnset("browserHeadless") && browser.headless !== undefined) {
80
83
  options.browserHeadless = browser.headless;
81
84
  }
82
85
  if (!attachRunningRequested && isUnset("browserHideWindow") && browser.hideWindow !== undefined) {
@@ -111,4 +114,9 @@ export function applyBrowserDefaultsFromConfig(options, config, getSource) {
111
114
  browser.manualLoginProfileDir !== undefined) {
112
115
  options.browserManualLoginProfileDir = browser.manualLoginProfileDir;
113
116
  }
117
+ if (!attachRunningRequested &&
118
+ isUnset("browserManualLoginCookieSync") &&
119
+ browser.manualLoginCookieSync !== undefined) {
120
+ options.browserManualLoginCookieSync = browser.manualLoginCookieSync;
121
+ }
114
122
  }
@@ -110,6 +110,7 @@ export async function runBrowserPreview({ runOptions, cwd, version, previewMode,
110
110
  log(chalk.cyan(headerLine));
111
111
  logBrowserControlPlan(browserConfig, log, "preview");
112
112
  logBrowserFollowUpSummary(runOptions.browserFollowUps, log, "preview");
113
+ logBrowserCookieStrategy(browserConfig, log, "preview");
113
114
  logBrowserFileSummary(artifacts, log, "preview");
114
115
  if (previewMode === "json" || previewMode === "full") {
115
116
  const attachmentSummary = artifacts.attachments.map((attachment) => ({
@@ -71,14 +71,23 @@ export async function buildProjectSourcesBrowserConfig({ options, projectUrl, co
71
71
  envProfileDir ??
72
72
  null)
73
73
  : null;
74
+ const manualLoginCookieSync = flagConfig.manualLoginCookieSync ?? configuredBrowser.manualLoginCookieSync;
75
+ const cookieSync = flagConfig.cookieSync === false
76
+ ? false
77
+ : flagConfig.cookieSync === true
78
+ ? true
79
+ : manualLogin
80
+ ? manualLoginCookieSync === true
81
+ : configuredBrowser.cookieSync === true;
74
82
  return {
75
83
  ...configuredBrowser,
76
84
  ...flagConfig,
77
85
  url: projectUrl,
78
86
  chatgptUrl: projectUrl,
79
- cookieSync: manualLogin ? false : (flagConfig.cookieSync ?? configuredBrowser.cookieSync),
87
+ cookieSync,
80
88
  manualLogin,
81
89
  manualLoginProfileDir,
90
+ manualLoginCookieSync,
82
91
  desiredModel: null,
83
92
  modelStrategy: "ignore",
84
93
  researchMode: "off",
@@ -24,7 +24,7 @@ import { CONSULT_PRESETS, browserThinkingTimeRawSchema, consultInputSchema } fro
24
24
  import { applyConsultPreset } from "../consultPresets.js";
25
25
  import { loadUserConfig } from "../../config.js";
26
26
  import { resolveNotificationSettings } from "../../cli/notifier.js";
27
- import { mapModelToBrowserLabel, resolveBrowserModelLabel } from "../../cli/browserConfig.js";
27
+ import { mapModelToBrowserLabel, resolveBrowserModelLabel, resolveDefaultBrowserThinkingTime, } from "../../cli/browserConfig.js";
28
28
  import { normalizeThinkingTimeLevel } from "../../oracle/thinkingTime.js";
29
29
  // Use raw shapes so the MCP SDK (with its bundled Zod) wraps them and emits valid JSON Schema.
30
30
  const consultInputShape = {
@@ -267,11 +267,14 @@ export function buildConsultBrowserConfig({ userConfig, env, runModel, inputMode
267
267
  ? true
268
268
  : (configuredBrowser.manualLogin ?? process.platform === "win32");
269
269
  const configuredThinkingTime = normalizeThinkingTimeLevel(configuredBrowser.thinkingTime);
270
+ const modelStrategy = browserModelStrategy ?? configuredBrowser.modelStrategy;
270
271
  return {
271
272
  ...configuredBrowser,
272
273
  url: configuredUrl,
273
274
  chatgptUrl: configuredUrl,
274
- cookieSync: !manualLogin,
275
+ cookieSync: manualLogin
276
+ ? configuredBrowser.manualLoginCookieSync === true
277
+ : configuredBrowser.cookieSync === true,
275
278
  headless: configuredBrowser.headless ?? false,
276
279
  hideWindow: configuredBrowser.hideWindow ?? false,
277
280
  keepBrowser: browserKeepBrowser ?? configuredBrowser.keepBrowser ?? false,
@@ -279,8 +282,14 @@ export function buildConsultBrowserConfig({ userConfig, env, runModel, inputMode
279
282
  manualLoginProfileDir: manualLogin
280
283
  ? ((envProfileDir || configuredBrowser.manualLoginProfileDir) ?? null)
281
284
  : null,
282
- thinkingTime: browserThinkingTime ?? configuredThinkingTime ?? undefined,
283
- modelStrategy: browserModelStrategy ?? configuredBrowser.modelStrategy,
285
+ thinkingTime: browserThinkingTime ??
286
+ configuredThinkingTime ??
287
+ resolveDefaultBrowserThinkingTime({
288
+ model: runModel,
289
+ requestedModel: inputModel,
290
+ modelStrategy,
291
+ }),
292
+ modelStrategy,
284
293
  researchMode: browserResearchMode ?? configuredBrowser.researchMode,
285
294
  archiveConversations: browserArchive ?? configuredBrowser.archiveConversations,
286
295
  desiredModel: desiredModelLabel || mapModelToBrowserLabel(runModel),
@@ -192,14 +192,15 @@ export async function createRemoteServer(options = {}, deps = {}) {
192
192
  // Preserve an explicit request to leave the completed conversation tab
193
193
  // open before the service forces `keepBrowser` for process lifetime.
194
194
  const clientRequestedKeepBrowser = payload.browserConfig?.keepBrowser === true;
195
- // Remote runs always rely on the host's own Chrome profile; ignore any inline cookie transfer.
195
+ // Remote runs rely on the host's authentication policy; never accept cookie payloads from clients.
196
196
  if (payload.browserConfig) {
197
197
  payload.browserConfig.inlineCookies = null;
198
198
  payload.browserConfig.inlineCookiesSource = null;
199
- payload.browserConfig.cookieSync = true;
199
+ payload.browserConfig.cookieSync = options.cookieSyncDefault === true;
200
200
  }
201
201
  else {
202
202
  payload.browserConfig = {};
203
+ payload.browserConfig.cookieSync = options.cookieSyncDefault === true;
203
204
  }
204
205
  // Enforce manual-login profile when cookie sync is unavailable (e.g., Windows/WSL).
205
206
  if (options.manualLoginDefault) {
@@ -293,7 +294,10 @@ export async function createRemoteServer(options = {}, deps = {}) {
293
294
  }
294
295
  export async function serveRemote(options = {}) {
295
296
  const manualProfileDir = options.manualLoginProfileDir ?? path.join(os.homedir(), ".oracle", "browser-profile");
296
- const preferManualLogin = options.manualLoginDefault || process.platform === "win32" || isWsl();
297
+ const preferManualLogin = options.manualLoginDefault ||
298
+ options.cookieSyncDefault !== true ||
299
+ process.platform === "win32" ||
300
+ isWsl();
297
301
  let cookies = null;
298
302
  let opened = false;
299
303
  if (isWsl() && process.env.ORACLE_ALLOW_WSL_SERVE !== "1") {
@@ -303,6 +307,7 @@ export async function serveRemote(options = {}) {
303
307
  return;
304
308
  }
305
309
  if (!preferManualLogin) {
310
+ console.log("Warning: Chrome cookie copying can invalidate an active ChatGPT session when tokens rotate. Prefer the default dedicated manual-login profile when possible.");
306
311
  // Warm-up: ensure this host has a ChatGPT login before accepting runs.
307
312
  const result = await loadLocalChatgptCookies(console.log, CHATGPT_URL);
308
313
  cookies = result.cookies;
@@ -0,0 +1,20 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+ <plist version="1.0">
4
+ <dict>
5
+ <key>CFBundleIdentifier</key>
6
+ <string>com.steipete.oracle.notifier</string>
7
+ <key>CFBundleName</key>
8
+ <string>OracleNotifier</string>
9
+ <key>CFBundleDisplayName</key>
10
+ <string>Oracle Notifier</string>
11
+ <key>CFBundleExecutable</key>
12
+ <string>OracleNotifier</string>
13
+ <key>CFBundleIconFile</key>
14
+ <string>OracleIcon</string>
15
+ <key>CFBundlePackageType</key>
16
+ <string>APPL</string>
17
+ <key>LSMinimumSystemVersion</key>
18
+ <string>13.0</string>
19
+ </dict>
20
+ </plist>
@@ -0,0 +1,128 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+ <plist version="1.0">
4
+ <dict>
5
+ <key>files</key>
6
+ <dict>
7
+ <key>Resources/OracleIcon.icns</key>
8
+ <data>
9
+ edUHAMetayIv3xtc3Vb92VXRLfM=
10
+ </data>
11
+ </dict>
12
+ <key>files2</key>
13
+ <dict>
14
+ <key>Resources/OracleIcon.icns</key>
15
+ <dict>
16
+ <key>hash2</key>
17
+ <data>
18
+ AVPJK/6w6IOsDLmZTW4hL+Za+/4wHMxZiIp0t6m3NRA=
19
+ </data>
20
+ </dict>
21
+ </dict>
22
+ <key>rules</key>
23
+ <dict>
24
+ <key>^Resources/</key>
25
+ <true/>
26
+ <key>^Resources/.*\.lproj/</key>
27
+ <dict>
28
+ <key>optional</key>
29
+ <true/>
30
+ <key>weight</key>
31
+ <real>1000</real>
32
+ </dict>
33
+ <key>^Resources/.*\.lproj/locversion.plist$</key>
34
+ <dict>
35
+ <key>omit</key>
36
+ <true/>
37
+ <key>weight</key>
38
+ <real>1100</real>
39
+ </dict>
40
+ <key>^Resources/Base\.lproj/</key>
41
+ <dict>
42
+ <key>weight</key>
43
+ <real>1010</real>
44
+ </dict>
45
+ <key>^version.plist$</key>
46
+ <true/>
47
+ </dict>
48
+ <key>rules2</key>
49
+ <dict>
50
+ <key>.*\.dSYM($|/)</key>
51
+ <dict>
52
+ <key>weight</key>
53
+ <real>11</real>
54
+ </dict>
55
+ <key>^(.*/)?\.DS_Store$</key>
56
+ <dict>
57
+ <key>omit</key>
58
+ <true/>
59
+ <key>weight</key>
60
+ <real>2000</real>
61
+ </dict>
62
+ <key>^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/</key>
63
+ <dict>
64
+ <key>nested</key>
65
+ <true/>
66
+ <key>weight</key>
67
+ <real>10</real>
68
+ </dict>
69
+ <key>^.*</key>
70
+ <true/>
71
+ <key>^Info\.plist$</key>
72
+ <dict>
73
+ <key>omit</key>
74
+ <true/>
75
+ <key>weight</key>
76
+ <real>20</real>
77
+ </dict>
78
+ <key>^PkgInfo$</key>
79
+ <dict>
80
+ <key>omit</key>
81
+ <true/>
82
+ <key>weight</key>
83
+ <real>20</real>
84
+ </dict>
85
+ <key>^Resources/</key>
86
+ <dict>
87
+ <key>weight</key>
88
+ <real>20</real>
89
+ </dict>
90
+ <key>^Resources/.*\.lproj/</key>
91
+ <dict>
92
+ <key>optional</key>
93
+ <true/>
94
+ <key>weight</key>
95
+ <real>1000</real>
96
+ </dict>
97
+ <key>^Resources/.*\.lproj/locversion.plist$</key>
98
+ <dict>
99
+ <key>omit</key>
100
+ <true/>
101
+ <key>weight</key>
102
+ <real>1100</real>
103
+ </dict>
104
+ <key>^Resources/Base\.lproj/</key>
105
+ <dict>
106
+ <key>weight</key>
107
+ <real>1010</real>
108
+ </dict>
109
+ <key>^[^/]+$</key>
110
+ <dict>
111
+ <key>nested</key>
112
+ <true/>
113
+ <key>weight</key>
114
+ <real>10</real>
115
+ </dict>
116
+ <key>^embedded\.provisionprofile$</key>
117
+ <dict>
118
+ <key>weight</key>
119
+ <real>20</real>
120
+ </dict>
121
+ <key>^version\.plist$</key>
122
+ <dict>
123
+ <key>weight</key>
124
+ <real>20</real>
125
+ </dict>
126
+ </dict>
127
+ </dict>
128
+ </plist>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@steipete/oracle",
3
- "version": "0.17.2",
3
+ "version": "0.18.0",
4
4
  "description": "CLI wrapper around OpenAI Responses API with GPT-5.6 Sol, GPT-5.6, GPT-5.5 Pro, GPT-5.5, GPT-5.4, GPT-5.2, GPT-5.1, and GPT-5.1 Codex high reasoning modes.",
5
5
  "keywords": [],
6
6
  "homepage": "https://askoracle.sh",
@@ -77,9 +77,9 @@
77
77
  "openai": "^7.4.0",
78
78
  "osc-progress": "^0.3.2",
79
79
  "qs": "^6.15.3",
80
- "shiki": "^4.4.3",
80
+ "shiki": "^4.4.2",
81
81
  "toasted-notifier": "^10.1.0",
82
- "tokentally": "^0.1.4",
82
+ "tokentally": "^0.1.3",
83
83
  "zod": "^4.4.3"
84
84
  },
85
85
  "devDependencies": {
@@ -90,11 +90,11 @@
90
90
  "@vitest/coverage-v8": "4.1.10",
91
91
  "devtools-protocol": "0.0.1676105",
92
92
  "es-toolkit": "^1.50.0",
93
- "esbuild": "^0.28.2",
94
- "oxfmt": "0.63.0",
95
- "oxlint": "^1.78.0",
93
+ "esbuild": "^0.28.1",
94
+ "oxfmt": "0.62.0",
95
+ "oxlint": "^1.77.0",
96
96
  "puppeteer-core": "^25.5.0",
97
- "tsx": "^4.23.12",
97
+ "tsx": "^4.23.11",
98
98
  "typescript": "^7.0.2",
99
99
  "vitest": "^4.1.10"
100
100
  },
@@ -109,5 +109,5 @@
109
109
  "engines": {
110
110
  "node": ">=24"
111
111
  },
112
- "packageManager": "pnpm@10.34.5"
112
+ "packageManager": "pnpm@11.20.0"
113
113
  }
@@ -0,0 +1,20 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+ <plist version="1.0">
4
+ <dict>
5
+ <key>CFBundleIdentifier</key>
6
+ <string>com.steipete.oracle.notifier</string>
7
+ <key>CFBundleName</key>
8
+ <string>OracleNotifier</string>
9
+ <key>CFBundleDisplayName</key>
10
+ <string>Oracle Notifier</string>
11
+ <key>CFBundleExecutable</key>
12
+ <string>OracleNotifier</string>
13
+ <key>CFBundleIconFile</key>
14
+ <string>OracleIcon</string>
15
+ <key>CFBundlePackageType</key>
16
+ <string>APPL</string>
17
+ <key>LSMinimumSystemVersion</key>
18
+ <string>13.0</string>
19
+ </dict>
20
+ </plist>
@@ -0,0 +1,128 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+ <plist version="1.0">
4
+ <dict>
5
+ <key>files</key>
6
+ <dict>
7
+ <key>Resources/OracleIcon.icns</key>
8
+ <data>
9
+ edUHAMetayIv3xtc3Vb92VXRLfM=
10
+ </data>
11
+ </dict>
12
+ <key>files2</key>
13
+ <dict>
14
+ <key>Resources/OracleIcon.icns</key>
15
+ <dict>
16
+ <key>hash2</key>
17
+ <data>
18
+ AVPJK/6w6IOsDLmZTW4hL+Za+/4wHMxZiIp0t6m3NRA=
19
+ </data>
20
+ </dict>
21
+ </dict>
22
+ <key>rules</key>
23
+ <dict>
24
+ <key>^Resources/</key>
25
+ <true/>
26
+ <key>^Resources/.*\.lproj/</key>
27
+ <dict>
28
+ <key>optional</key>
29
+ <true/>
30
+ <key>weight</key>
31
+ <real>1000</real>
32
+ </dict>
33
+ <key>^Resources/.*\.lproj/locversion.plist$</key>
34
+ <dict>
35
+ <key>omit</key>
36
+ <true/>
37
+ <key>weight</key>
38
+ <real>1100</real>
39
+ </dict>
40
+ <key>^Resources/Base\.lproj/</key>
41
+ <dict>
42
+ <key>weight</key>
43
+ <real>1010</real>
44
+ </dict>
45
+ <key>^version.plist$</key>
46
+ <true/>
47
+ </dict>
48
+ <key>rules2</key>
49
+ <dict>
50
+ <key>.*\.dSYM($|/)</key>
51
+ <dict>
52
+ <key>weight</key>
53
+ <real>11</real>
54
+ </dict>
55
+ <key>^(.*/)?\.DS_Store$</key>
56
+ <dict>
57
+ <key>omit</key>
58
+ <true/>
59
+ <key>weight</key>
60
+ <real>2000</real>
61
+ </dict>
62
+ <key>^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/</key>
63
+ <dict>
64
+ <key>nested</key>
65
+ <true/>
66
+ <key>weight</key>
67
+ <real>10</real>
68
+ </dict>
69
+ <key>^.*</key>
70
+ <true/>
71
+ <key>^Info\.plist$</key>
72
+ <dict>
73
+ <key>omit</key>
74
+ <true/>
75
+ <key>weight</key>
76
+ <real>20</real>
77
+ </dict>
78
+ <key>^PkgInfo$</key>
79
+ <dict>
80
+ <key>omit</key>
81
+ <true/>
82
+ <key>weight</key>
83
+ <real>20</real>
84
+ </dict>
85
+ <key>^Resources/</key>
86
+ <dict>
87
+ <key>weight</key>
88
+ <real>20</real>
89
+ </dict>
90
+ <key>^Resources/.*\.lproj/</key>
91
+ <dict>
92
+ <key>optional</key>
93
+ <true/>
94
+ <key>weight</key>
95
+ <real>1000</real>
96
+ </dict>
97
+ <key>^Resources/.*\.lproj/locversion.plist$</key>
98
+ <dict>
99
+ <key>omit</key>
100
+ <true/>
101
+ <key>weight</key>
102
+ <real>1100</real>
103
+ </dict>
104
+ <key>^Resources/Base\.lproj/</key>
105
+ <dict>
106
+ <key>weight</key>
107
+ <real>1010</real>
108
+ </dict>
109
+ <key>^[^/]+$</key>
110
+ <dict>
111
+ <key>nested</key>
112
+ <true/>
113
+ <key>weight</key>
114
+ <real>10</real>
115
+ </dict>
116
+ <key>^embedded\.provisionprofile$</key>
117
+ <dict>
118
+ <key>weight</key>
119
+ <real>20</real>
120
+ </dict>
121
+ <key>^version\.plist$</key>
122
+ <dict>
123
+ <key>weight</key>
124
+ <real>20</real>
125
+ </dict>
126
+ </dict>
127
+ </dict>
128
+ </plist>