@steipete/oracle 0.9.0 → 0.11.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 (194) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +107 -49
  3. package/dist/bin/oracle-cli.js +551 -410
  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/archiveConversation.js +224 -0
  18. package/dist/src/browser/actions/assistantResponse.js +175 -101
  19. package/dist/src/browser/actions/attachmentDataTransfer.js +49 -47
  20. package/dist/src/browser/actions/attachments.js +246 -150
  21. package/dist/src/browser/actions/deepResearch.js +662 -0
  22. package/dist/src/browser/actions/domEvents.js +2 -2
  23. package/dist/src/browser/actions/modelSelection.js +342 -119
  24. package/dist/src/browser/actions/navigation.js +183 -137
  25. package/dist/src/browser/actions/projectSources.js +491 -0
  26. package/dist/src/browser/actions/promptComposer.js +152 -91
  27. package/dist/src/browser/actions/remoteFileTransfer.js +10 -10
  28. package/dist/src/browser/actions/thinkingStatus.js +391 -0
  29. package/dist/src/browser/actions/thinkingTime.js +207 -110
  30. package/dist/src/browser/artifacts.js +150 -0
  31. package/dist/src/browser/attachRunning.js +31 -0
  32. package/dist/src/browser/chatgptImages.js +315 -0
  33. package/dist/src/browser/chromeLifecycle.js +276 -63
  34. package/dist/src/browser/config.js +59 -16
  35. package/dist/src/browser/constants.js +25 -12
  36. package/dist/src/browser/controlPlan.js +81 -0
  37. package/dist/src/browser/cookies.js +19 -19
  38. package/dist/src/browser/detect.js +250 -77
  39. package/dist/src/browser/domDebug.js +50 -1
  40. package/dist/src/browser/index.js +1559 -692
  41. package/dist/src/browser/liveTabs.js +434 -0
  42. package/dist/src/browser/modelStrategy.js +1 -1
  43. package/dist/src/browser/pageActions.js +5 -5
  44. package/dist/src/browser/policies.js +16 -13
  45. package/dist/src/browser/profileState.js +127 -42
  46. package/dist/src/browser/projectSourcesRunner.js +366 -0
  47. package/dist/src/browser/prompt.js +72 -42
  48. package/dist/src/browser/promptSummary.js +5 -5
  49. package/dist/src/browser/providerDomFlow.js +1 -1
  50. package/dist/src/browser/providers/chatgptDomProvider.js +9 -9
  51. package/dist/src/browser/providers/geminiDeepThinkDomProvider.js +51 -42
  52. package/dist/src/browser/providers/index.js +2 -2
  53. package/dist/src/browser/reattach.js +178 -73
  54. package/dist/src/browser/reattachHelpers.js +32 -27
  55. package/dist/src/browser/sessionRunner.js +89 -25
  56. package/dist/src/browser/tabLeaseRegistry.js +182 -0
  57. package/dist/src/browser/utils.js +9 -9
  58. package/dist/src/browserMode.js +1 -1
  59. package/dist/src/cli/bridge/claudeConfig.js +24 -20
  60. package/dist/src/cli/bridge/client.js +28 -20
  61. package/dist/src/cli/bridge/codexConfig.js +16 -16
  62. package/dist/src/cli/bridge/doctor.js +47 -39
  63. package/dist/src/cli/bridge/host.js +58 -56
  64. package/dist/src/cli/browserConfig.js +102 -48
  65. package/dist/src/cli/browserDefaults.js +51 -26
  66. package/dist/src/cli/browserTabs.js +228 -0
  67. package/dist/src/cli/bundleWarnings.js +1 -1
  68. package/dist/src/cli/clipboard.js +11 -2
  69. package/dist/src/cli/detach.js +2 -2
  70. package/dist/src/cli/dryRun.js +62 -26
  71. package/dist/src/cli/duplicatePromptGuard.js +12 -4
  72. package/dist/src/cli/engine.js +9 -9
  73. package/dist/src/cli/errorUtils.js +1 -1
  74. package/dist/src/cli/fileSize.js +3 -3
  75. package/dist/src/cli/format.js +2 -2
  76. package/dist/src/cli/help.js +28 -28
  77. package/dist/src/cli/hiddenAliases.js +3 -3
  78. package/dist/src/cli/markdownBundle.js +7 -7
  79. package/dist/src/cli/markdownRenderer.js +15 -15
  80. package/dist/src/cli/notifier.js +77 -67
  81. package/dist/src/cli/options.js +131 -106
  82. package/dist/src/cli/oscUtils.js +1 -1
  83. package/dist/src/cli/projectSources.js +116 -0
  84. package/dist/src/cli/promptRequirement.js +2 -2
  85. package/dist/src/cli/renderOutput.js +1 -1
  86. package/dist/src/cli/rootAlias.js +1 -1
  87. package/dist/src/cli/runOptions.js +32 -28
  88. package/dist/src/cli/sessionCommand.js +82 -21
  89. package/dist/src/cli/sessionDisplay.js +213 -87
  90. package/dist/src/cli/sessionLineage.js +6 -2
  91. package/dist/src/cli/sessionRunner.js +149 -95
  92. package/dist/src/cli/sessionTable.js +26 -23
  93. package/dist/src/cli/stdin.js +22 -0
  94. package/dist/src/cli/tagline.js +121 -124
  95. package/dist/src/cli/tui/index.js +139 -128
  96. package/dist/src/cli/writeOutputPath.js +5 -5
  97. package/dist/src/config.js +7 -7
  98. package/dist/src/gemini-web/browserSessionManager.js +19 -15
  99. package/dist/src/gemini-web/client.js +76 -70
  100. package/dist/src/gemini-web/executionMode.js +6 -8
  101. package/dist/src/gemini-web/executor.js +98 -93
  102. package/dist/src/gemini-web/index.js +1 -1
  103. package/dist/src/mcp/consultPresets.js +19 -0
  104. package/dist/src/mcp/server.js +18 -12
  105. package/dist/src/mcp/tools/consult.js +246 -67
  106. package/dist/src/mcp/tools/projectSources.js +123 -0
  107. package/dist/src/mcp/tools/sessionResources.js +12 -12
  108. package/dist/src/mcp/tools/sessions.js +26 -17
  109. package/dist/src/mcp/types.js +12 -5
  110. package/dist/src/mcp/utils.js +21 -8
  111. package/dist/src/oracle/background.js +15 -15
  112. package/dist/src/oracle/claude.js +53 -25
  113. package/dist/src/oracle/client.js +50 -41
  114. package/dist/src/oracle/config.js +96 -66
  115. package/dist/src/oracle/errors.js +38 -38
  116. package/dist/src/oracle/files.js +55 -46
  117. package/dist/src/oracle/finishLine.js +10 -8
  118. package/dist/src/oracle/format.js +3 -3
  119. package/dist/src/oracle/gemini.js +37 -33
  120. package/dist/src/oracle/logging.js +7 -7
  121. package/dist/src/oracle/markdown.js +28 -28
  122. package/dist/src/oracle/modelResolver.js +16 -16
  123. package/dist/src/oracle/multiModelRunner.js +12 -12
  124. package/dist/src/oracle/oscProgress.js +8 -8
  125. package/dist/src/oracle/promptAssembly.js +6 -3
  126. package/dist/src/oracle/request.js +16 -13
  127. package/dist/src/oracle/run.js +160 -135
  128. package/dist/src/oracle/runUtils.js +8 -5
  129. package/dist/src/oracle/tokenEstimate.js +6 -6
  130. package/dist/src/oracle/tokenStats.js +5 -5
  131. package/dist/src/oracle/tokenStringifier.js +5 -5
  132. package/dist/src/oracle.js +12 -12
  133. package/dist/src/oracleHome.js +3 -3
  134. package/dist/src/projectSources/plan.js +27 -0
  135. package/dist/src/projectSources/url.js +23 -0
  136. package/dist/src/remote/client.js +25 -25
  137. package/dist/src/remote/health.js +20 -20
  138. package/dist/src/remote/remoteServiceConfig.js +9 -9
  139. package/dist/src/remote/server.js +129 -118
  140. package/dist/src/sessionManager.js +78 -75
  141. package/dist/src/sessionStore.js +3 -3
  142. package/dist/src/version.js +10 -10
  143. package/dist/vendor/oracle-notifier/README.md +2 -0
  144. package/package.json +67 -62
  145. package/vendor/oracle-notifier/README.md +2 -0
  146. package/dist/markdansi/types/index.js +0 -4
  147. package/dist/oracle/bin/oracle-cli.js +0 -472
  148. package/dist/oracle/src/browser/actions/assistantResponse.js +0 -471
  149. package/dist/oracle/src/browser/actions/attachments.js +0 -82
  150. package/dist/oracle/src/browser/actions/modelSelection.js +0 -190
  151. package/dist/oracle/src/browser/actions/navigation.js +0 -75
  152. package/dist/oracle/src/browser/actions/promptComposer.js +0 -167
  153. package/dist/oracle/src/browser/chromeLifecycle.js +0 -104
  154. package/dist/oracle/src/browser/config.js +0 -33
  155. package/dist/oracle/src/browser/constants.js +0 -40
  156. package/dist/oracle/src/browser/cookies.js +0 -210
  157. package/dist/oracle/src/browser/domDebug.js +0 -36
  158. package/dist/oracle/src/browser/index.js +0 -331
  159. package/dist/oracle/src/browser/pageActions.js +0 -5
  160. package/dist/oracle/src/browser/prompt.js +0 -88
  161. package/dist/oracle/src/browser/promptSummary.js +0 -20
  162. package/dist/oracle/src/browser/sessionRunner.js +0 -80
  163. package/dist/oracle/src/browser/utils.js +0 -62
  164. package/dist/oracle/src/browserMode.js +0 -1
  165. package/dist/oracle/src/cli/browserConfig.js +0 -44
  166. package/dist/oracle/src/cli/dryRun.js +0 -59
  167. package/dist/oracle/src/cli/engine.js +0 -17
  168. package/dist/oracle/src/cli/errorUtils.js +0 -9
  169. package/dist/oracle/src/cli/help.js +0 -70
  170. package/dist/oracle/src/cli/markdownRenderer.js +0 -15
  171. package/dist/oracle/src/cli/options.js +0 -103
  172. package/dist/oracle/src/cli/promptRequirement.js +0 -14
  173. package/dist/oracle/src/cli/rootAlias.js +0 -30
  174. package/dist/oracle/src/cli/sessionCommand.js +0 -77
  175. package/dist/oracle/src/cli/sessionDisplay.js +0 -270
  176. package/dist/oracle/src/cli/sessionRunner.js +0 -94
  177. package/dist/oracle/src/heartbeat.js +0 -43
  178. package/dist/oracle/src/oracle/client.js +0 -48
  179. package/dist/oracle/src/oracle/config.js +0 -29
  180. package/dist/oracle/src/oracle/errors.js +0 -101
  181. package/dist/oracle/src/oracle/files.js +0 -220
  182. package/dist/oracle/src/oracle/format.js +0 -33
  183. package/dist/oracle/src/oracle/fsAdapter.js +0 -7
  184. package/dist/oracle/src/oracle/oscProgress.js +0 -60
  185. package/dist/oracle/src/oracle/request.js +0 -48
  186. package/dist/oracle/src/oracle/run.js +0 -444
  187. package/dist/oracle/src/oracle/tokenStats.js +0 -39
  188. package/dist/oracle/src/oracle/types.js +0 -1
  189. package/dist/oracle/src/oracle.js +0 -9
  190. package/dist/oracle/src/sessionManager.js +0 -205
  191. package/dist/oracle/src/version.js +0 -39
  192. package/dist/scripts/chrome/browser-tools.js +0 -295
  193. package/dist/src/browser/profileSync.js +0 -141
  194. /package/dist/{oracle/src/browser → src/projectSources}/types.js +0 -0
@@ -1,15 +1,45 @@
1
- import { countTokens as countTokensGpt5 } from 'gpt-tokenizer/model/gpt-5';
2
- import { countTokens as countTokensGpt5Pro } from 'gpt-tokenizer/model/gpt-5-pro';
3
- import { countTokens as countTokensAnthropicRaw } from '@anthropic-ai/tokenizer';
4
- import { stringifyTokenizerInput } from './tokenStringifier.js';
5
- export const DEFAULT_MODEL = 'gpt-5.4-pro';
6
- export const PRO_MODELS = new Set(['gpt-5.4-pro', 'gpt-5.1-pro', 'gpt-5-pro', 'gpt-5.2-pro', 'claude-4.5-sonnet', 'claude-4.1-opus']);
1
+ import { countTokens as countTokensGpt5 } from "gpt-tokenizer/model/gpt-5";
2
+ import { countTokens as countTokensGpt5Pro } from "gpt-tokenizer/model/gpt-5-pro";
3
+ import { countTokens as countTokensAnthropicRaw } from "@anthropic-ai/tokenizer";
4
+ import { stringifyTokenizerInput } from "./tokenStringifier.js";
5
+ export const DEFAULT_MODEL = "gpt-5.5-pro";
6
+ export const PRO_MODELS = new Set([
7
+ "gpt-5.5-pro",
8
+ "gpt-5.4-pro",
9
+ "gpt-5.1-pro",
10
+ "gpt-5-pro",
11
+ "gpt-5.2-pro",
12
+ "claude-4.6-sonnet",
13
+ "claude-4.1-opus",
14
+ ]);
7
15
  const countTokensAnthropic = (input) => countTokensAnthropicRaw(stringifyTokenizerInput(input));
8
16
  export const MODEL_CONFIGS = {
9
- 'gpt-5.1-pro': {
10
- model: 'gpt-5.1-pro',
11
- apiModel: 'gpt-5.4-pro',
12
- provider: 'openai',
17
+ "gpt-5.5-pro": {
18
+ model: "gpt-5.5-pro",
19
+ provider: "openai",
20
+ tokenizer: countTokensGpt5Pro,
21
+ inputLimit: 1_050_000,
22
+ pricing: {
23
+ inputPerToken: 30 / 1_000_000,
24
+ outputPerToken: 180 / 1_000_000,
25
+ },
26
+ reasoning: { effort: "xhigh" },
27
+ },
28
+ "gpt-5.5": {
29
+ model: "gpt-5.5",
30
+ provider: "openai",
31
+ tokenizer: countTokensGpt5,
32
+ inputLimit: 1_050_000,
33
+ pricing: {
34
+ inputPerToken: 5 / 1_000_000,
35
+ outputPerToken: 30 / 1_000_000,
36
+ },
37
+ reasoning: { effort: "xhigh" },
38
+ },
39
+ "gpt-5.1-pro": {
40
+ model: "gpt-5.1-pro",
41
+ apiModel: "gpt-5.5-pro",
42
+ provider: "openai",
13
43
  tokenizer: countTokensGpt5Pro,
14
44
  inputLimit: 196000,
15
45
  pricing: {
@@ -18,9 +48,9 @@ export const MODEL_CONFIGS = {
18
48
  },
19
49
  reasoning: null,
20
50
  },
21
- 'gpt-5-pro': {
22
- model: 'gpt-5-pro',
23
- provider: 'openai',
51
+ "gpt-5-pro": {
52
+ model: "gpt-5-pro",
53
+ provider: "openai",
24
54
  tokenizer: countTokensGpt5Pro,
25
55
  inputLimit: 196000,
26
56
  pricing: {
@@ -29,65 +59,65 @@ export const MODEL_CONFIGS = {
29
59
  },
30
60
  reasoning: null,
31
61
  },
32
- 'gpt-5.1': {
33
- model: 'gpt-5.1',
34
- provider: 'openai',
62
+ "gpt-5.1": {
63
+ model: "gpt-5.1",
64
+ provider: "openai",
35
65
  tokenizer: countTokensGpt5,
36
66
  inputLimit: 196000,
37
67
  pricing: {
38
68
  inputPerToken: 1.25 / 1_000_000,
39
69
  outputPerToken: 10 / 1_000_000,
40
70
  },
41
- reasoning: { effort: 'high' },
71
+ reasoning: { effort: "high" },
42
72
  },
43
- 'gpt-5.1-codex': {
44
- model: 'gpt-5.1-codex',
45
- provider: 'openai',
73
+ "gpt-5.1-codex": {
74
+ model: "gpt-5.1-codex",
75
+ provider: "openai",
46
76
  tokenizer: countTokensGpt5,
47
77
  inputLimit: 196000,
48
78
  pricing: {
49
79
  inputPerToken: 1.25 / 1_000_000,
50
80
  outputPerToken: 10 / 1_000_000,
51
81
  },
52
- reasoning: { effort: 'high' },
82
+ reasoning: { effort: "high" },
53
83
  },
54
- 'gpt-5.4': {
55
- model: 'gpt-5.4',
56
- provider: 'openai',
84
+ "gpt-5.4": {
85
+ model: "gpt-5.4",
86
+ provider: "openai",
57
87
  tokenizer: countTokensGpt5,
58
88
  inputLimit: 196000,
59
89
  pricing: {
60
90
  inputPerToken: 2.5 / 1_000_000,
61
91
  outputPerToken: 15 / 1_000_000,
62
92
  },
63
- reasoning: { effort: 'xhigh' },
93
+ reasoning: { effort: "xhigh" },
64
94
  },
65
- 'gpt-5.4-pro': {
66
- model: 'gpt-5.4-pro',
67
- provider: 'openai',
95
+ "gpt-5.4-pro": {
96
+ model: "gpt-5.4-pro",
97
+ provider: "openai",
68
98
  tokenizer: countTokensGpt5Pro,
69
99
  inputLimit: 196000,
70
100
  pricing: {
71
101
  inputPerToken: 30 / 1_000_000,
72
102
  outputPerToken: 180 / 1_000_000,
73
103
  },
74
- reasoning: { effort: 'xhigh' },
104
+ reasoning: { effort: "xhigh" },
75
105
  },
76
- 'gpt-5.2': {
77
- model: 'gpt-5.2',
78
- provider: 'openai',
106
+ "gpt-5.2": {
107
+ model: "gpt-5.2",
108
+ provider: "openai",
79
109
  tokenizer: countTokensGpt5,
80
110
  inputLimit: 196000,
81
111
  pricing: {
82
112
  inputPerToken: 1.75 / 1_000_000,
83
113
  outputPerToken: 14 / 1_000_000,
84
114
  },
85
- reasoning: { effort: 'xhigh' },
115
+ reasoning: { effort: "xhigh" },
86
116
  },
87
- 'gpt-5.2-instant': {
88
- model: 'gpt-5.2-instant',
89
- apiModel: 'gpt-5.2-chat-latest',
90
- provider: 'openai',
117
+ "gpt-5.2-instant": {
118
+ model: "gpt-5.2-instant",
119
+ apiModel: "gpt-5.2-chat-latest",
120
+ provider: "openai",
91
121
  tokenizer: countTokensGpt5,
92
122
  inputLimit: 196000,
93
123
  pricing: {
@@ -96,21 +126,21 @@ export const MODEL_CONFIGS = {
96
126
  },
97
127
  reasoning: null,
98
128
  },
99
- 'gpt-5.2-pro': {
100
- model: 'gpt-5.2-pro',
101
- apiModel: 'gpt-5.4-pro',
102
- provider: 'openai',
129
+ "gpt-5.2-pro": {
130
+ model: "gpt-5.2-pro",
131
+ apiModel: "gpt-5.5-pro",
132
+ provider: "openai",
103
133
  tokenizer: countTokensGpt5Pro,
104
134
  inputLimit: 196000,
105
135
  pricing: {
106
136
  inputPerToken: 30 / 1_000_000,
107
137
  outputPerToken: 180 / 1_000_000,
108
138
  },
109
- reasoning: { effort: 'xhigh' },
139
+ reasoning: { effort: "xhigh" },
110
140
  },
111
- 'gemini-3.1-pro': {
112
- model: 'gemini-3.1-pro',
113
- provider: 'google',
141
+ "gemini-3.1-pro": {
142
+ model: "gemini-3.1-pro",
143
+ provider: "google",
114
144
  tokenizer: countTokensGpt5Pro,
115
145
  inputLimit: 200000,
116
146
  pricing: {
@@ -121,9 +151,9 @@ export const MODEL_CONFIGS = {
121
151
  supportsBackground: false,
122
152
  supportsSearch: true,
123
153
  },
124
- 'gemini-3-pro': {
125
- model: 'gemini-3-pro',
126
- provider: 'google',
154
+ "gemini-3-pro": {
155
+ model: "gemini-3-pro",
156
+ provider: "google",
127
157
  tokenizer: countTokensGpt5Pro,
128
158
  inputLimit: 200000,
129
159
  pricing: {
@@ -134,10 +164,10 @@ export const MODEL_CONFIGS = {
134
164
  supportsBackground: false,
135
165
  supportsSearch: true,
136
166
  },
137
- 'claude-4.5-sonnet': {
138
- model: 'claude-4.5-sonnet',
139
- apiModel: 'claude-sonnet-4-5',
140
- provider: 'anthropic',
167
+ "claude-4.6-sonnet": {
168
+ model: "claude-4.6-sonnet",
169
+ apiModel: "claude-sonnet-4-6",
170
+ provider: "anthropic",
141
171
  tokenizer: countTokensAnthropic,
142
172
  inputLimit: 200000,
143
173
  pricing: {
@@ -148,24 +178,24 @@ export const MODEL_CONFIGS = {
148
178
  supportsBackground: false,
149
179
  supportsSearch: false,
150
180
  },
151
- 'claude-4.1-opus': {
152
- model: 'claude-4.1-opus',
153
- apiModel: 'claude-opus-4-1',
154
- provider: 'anthropic',
181
+ "claude-4.1-opus": {
182
+ model: "claude-4.1-opus",
183
+ apiModel: "claude-opus-4-1",
184
+ provider: "anthropic",
155
185
  tokenizer: countTokensAnthropic,
156
186
  inputLimit: 200000,
157
187
  pricing: {
158
188
  inputPerToken: 15 / 1_000_000,
159
189
  outputPerToken: 75 / 1_000_000,
160
190
  },
161
- reasoning: { effort: 'high' },
191
+ reasoning: { effort: "high" },
162
192
  supportsBackground: false,
163
193
  supportsSearch: false,
164
194
  },
165
- 'grok-4.1': {
166
- model: 'grok-4.1',
167
- apiModel: 'grok-4-1-fast-reasoning',
168
- provider: 'xai',
195
+ "grok-4.1": {
196
+ model: "grok-4.1",
197
+ apiModel: "grok-4-1-fast-reasoning",
198
+ provider: "xai",
169
199
  tokenizer: countTokensGpt5Pro,
170
200
  inputLimit: 2_000_000,
171
201
  pricing: {
@@ -175,11 +205,11 @@ export const MODEL_CONFIGS = {
175
205
  reasoning: null,
176
206
  supportsBackground: false,
177
207
  supportsSearch: true,
178
- searchToolType: 'web_search',
208
+ searchToolType: "web_search",
179
209
  },
180
210
  };
181
211
  export const DEFAULT_SYSTEM_PROMPT = [
182
- 'You are Oracle, a focused one-shot problem solver.',
183
- 'Emphasize direct answers and cite any files referenced.',
184
- ].join(' ');
185
- export const TOKENIZER_OPTIONS = { allowedSpecial: 'all' };
212
+ "You are Oracle, a focused one-shot problem solver.",
213
+ "Emphasize direct answers and cite any files referenced.",
214
+ ].join(" ");
215
+ export const TOKENIZER_OPTIONS = { allowedSpecial: "all" };
@@ -1,12 +1,12 @@
1
- import { APIConnectionError, APIConnectionTimeoutError, APIUserAbortError } from 'openai';
2
- import { APIError } from 'openai/error';
3
- import { formatElapsed } from './format.js';
1
+ import { APIConnectionError, APIConnectionTimeoutError, APIUserAbortError } from "openai";
2
+ import { APIError } from "openai/error";
3
+ import { formatElapsed } from "./format.js";
4
4
  export class OracleUserError extends Error {
5
5
  category;
6
6
  details;
7
7
  constructor(category, message, details, cause) {
8
8
  super(message);
9
- this.name = 'OracleUserError';
9
+ this.name = "OracleUserError";
10
10
  this.category = category;
11
11
  this.details = details;
12
12
  if (cause) {
@@ -16,20 +16,20 @@ export class OracleUserError extends Error {
16
16
  }
17
17
  export class FileValidationError extends OracleUserError {
18
18
  constructor(message, details, cause) {
19
- super('file-validation', message, details, cause);
20
- this.name = 'FileValidationError';
19
+ super("file-validation", message, details, cause);
20
+ this.name = "FileValidationError";
21
21
  }
22
22
  }
23
23
  export class BrowserAutomationError extends OracleUserError {
24
24
  constructor(message, details, cause) {
25
- super('browser-automation', message, details, cause);
26
- this.name = 'BrowserAutomationError';
25
+ super("browser-automation", message, details, cause);
26
+ this.name = "BrowserAutomationError";
27
27
  }
28
28
  }
29
29
  export class PromptValidationError extends OracleUserError {
30
30
  constructor(message, details, cause) {
31
- super('prompt-validation', message, details, cause);
32
- this.name = 'PromptValidationError';
31
+ super("prompt-validation", message, details, cause);
32
+ this.name = "PromptValidationError";
33
33
  }
34
34
  }
35
35
  export function asOracleUserError(error) {
@@ -42,7 +42,7 @@ export class OracleTransportError extends Error {
42
42
  reason;
43
43
  constructor(reason, message, cause) {
44
44
  super(message);
45
- this.name = 'OracleTransportError';
45
+ this.name = "OracleTransportError";
46
46
  this.reason = reason;
47
47
  if (cause) {
48
48
  this.cause = cause;
@@ -54,7 +54,7 @@ export class OracleResponseError extends Error {
54
54
  response;
55
55
  constructor(message, response) {
56
56
  super(message);
57
- this.name = 'OracleResponseError';
57
+ this.name = "OracleResponseError";
58
58
  this.response = response;
59
59
  this.metadata = extractResponseMetadata(response);
60
60
  }
@@ -79,54 +79,54 @@ export function toTransportError(error, model) {
79
79
  return error;
80
80
  }
81
81
  if (error instanceof APIConnectionTimeoutError) {
82
- return new OracleTransportError('client-timeout', 'OpenAI request timed out before completion.', error);
82
+ return new OracleTransportError("client-timeout", "OpenAI request timed out before completion.", error);
83
83
  }
84
84
  if (error instanceof APIUserAbortError) {
85
- return new OracleTransportError('client-abort', 'The request was aborted before OpenAI finished responding.', error);
85
+ return new OracleTransportError("client-abort", "The request was aborted before OpenAI finished responding.", error);
86
86
  }
87
87
  if (error instanceof APIConnectionError) {
88
- return new OracleTransportError('connection-lost', 'Connection to OpenAI dropped before the response completed.', error);
88
+ return new OracleTransportError("connection-lost", "Connection to OpenAI dropped before the response completed.", error);
89
89
  }
90
- const isApiError = error instanceof APIError || error?.name === 'APIError';
90
+ const isApiError = error instanceof APIError || error?.name === "APIError";
91
91
  if (isApiError) {
92
92
  const apiError = error;
93
93
  const code = apiError.code ?? apiError.error?.code;
94
- const messageText = apiError.message?.toLowerCase?.() ?? '';
94
+ const messageText = apiError.message?.toLowerCase?.() ?? "";
95
95
  const apiMessage = apiError.error?.message ||
96
96
  apiError.message ||
97
- (apiError.status ? `${apiError.status} OpenAI API error` : 'OpenAI API error');
97
+ (apiError.status ? `${apiError.status} OpenAI API error` : "OpenAI API error");
98
98
  // Friendly guidance when a pro-tier model isn't available on this base URL / API key.
99
- if (model === 'gpt-5.4-pro' &&
100
- (code === 'model_not_found' ||
101
- messageText.includes('does not exist') ||
102
- messageText.includes('unknown model') ||
103
- messageText.includes('model_not_found'))) {
104
- return new OracleTransportError('model-unavailable', 'gpt-5.4-pro is not available on this API base/key. Try gpt-5-pro or gpt-5.4, or switch to the browser engine.', apiError);
99
+ if ((model === "gpt-5.5-pro" || model === "gpt-5.4-pro") &&
100
+ (code === "model_not_found" ||
101
+ messageText.includes("does not exist") ||
102
+ messageText.includes("unknown model") ||
103
+ messageText.includes("model_not_found"))) {
104
+ return new OracleTransportError("model-unavailable", `${model} is not available on this API base/key. Try gpt-5.5, gpt-5-pro, or switch to the browser engine.`, apiError);
105
105
  }
106
106
  if (apiError.status === 404 || apiError.status === 405) {
107
- return new OracleTransportError('unsupported-endpoint', 'HTTP 404/405 from the Responses API; this base URL or gateway likely does not expose /v1/responses. Set OPENAI_BASE_URL to api.openai.com/v1, update your Azure API version/deployment, or use the browser engine.', apiError);
107
+ return new OracleTransportError("unsupported-endpoint", "HTTP 404/405 from the Responses API; this base URL or gateway likely does not expose /v1/responses. Set OPENAI_BASE_URL to api.openai.com/v1, update your Azure API version/deployment, or use the browser engine.", apiError);
108
108
  }
109
- return new OracleTransportError('api-error', apiMessage, apiError);
109
+ return new OracleTransportError("api-error", apiMessage, apiError);
110
110
  }
111
- return new OracleTransportError('unknown', error instanceof Error ? error.message : 'Unknown transport failure.', error);
111
+ return new OracleTransportError("unknown", error instanceof Error ? error.message : "Unknown transport failure.", error);
112
112
  }
113
113
  export function describeTransportError(error, deadlineMs) {
114
114
  switch (error.reason) {
115
- case 'client-timeout':
115
+ case "client-timeout":
116
116
  return deadlineMs
117
117
  ? `Client-side timeout: OpenAI streaming call exceeded the ${formatElapsed(deadlineMs)} deadline.`
118
- : 'Client-side timeout: OpenAI streaming call exceeded the configured deadline.';
119
- case 'connection-lost':
120
- return 'Connection to OpenAI ended unexpectedly before the response completed.';
121
- case 'client-abort':
122
- return 'Request was aborted before OpenAI completed the response.';
123
- case 'api-error':
118
+ : "Client-side timeout: OpenAI streaming call exceeded the configured deadline.";
119
+ case "connection-lost":
120
+ return "Connection to OpenAI ended unexpectedly before the response completed.";
121
+ case "client-abort":
122
+ return "Request was aborted before OpenAI completed the response.";
123
+ case "api-error":
124
124
  return error.message;
125
- case 'model-unavailable':
125
+ case "model-unavailable":
126
126
  return error.message;
127
- case 'unsupported-endpoint':
128
- return 'The Responses API returned 404/405 — your base URL/gateway probably lacks /v1/responses (check OPENAI_BASE_URL or switch to api.openai.com / browser engine).';
127
+ case "unsupported-endpoint":
128
+ return "The Responses API returned 404/405 — your base URL/gateway probably lacks /v1/responses (check OPENAI_BASE_URL or switch to api.openai.com / browser engine).";
129
129
  default:
130
- return 'OpenAI streaming call ended with an unknown transport error.';
130
+ return "OpenAI streaming call ended with an unknown transport error.";
131
131
  }
132
132
  }