@jrkropp/codex-js 0.1.2 → 0.1.4

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 (134) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/README.md +2 -2
  3. package/dist/ClientNotification-B6-FhXQf.d.ts +5 -0
  4. package/dist/DynamicToolCallResponse-82DFjES2.d.ts +8 -0
  5. package/dist/DynamicToolSpec-CfnhqAYK.d.ts +29 -0
  6. package/dist/PermissionsRequestApprovalResponse-DxzPPDRb.d.ts +55 -0
  7. package/dist/ProviderStatusBanner-BlP6lzwE.d.ts +441 -0
  8. package/dist/ServerRequest-B5cKVJjr.d.ts +2181 -0
  9. package/dist/{session-DPhHN7RZ.d.ts → ThreadResumeResponse-DvmE1juU.d.ts} +3 -306
  10. package/dist/ToolRequestUserInputQuestion-CeZa5X1J.d.ts +23 -0
  11. package/dist/ToolRequestUserInputResponse-zcPLwbiK.d.ts +17 -0
  12. package/dist/TurnSteerResponse-0kBCfplh.d.ts +209 -0
  13. package/dist/WebSearchToolConfig-D3ep0625.d.ts +18 -0
  14. package/dist/chat-runtime-9RkXHC_w.d.ts +382 -0
  15. package/dist/chunk-2DZRMCI2.js +1258 -0
  16. package/dist/chunk-2DZRMCI2.js.map +1 -0
  17. package/dist/chunk-4DPLJPB5.js +396 -0
  18. package/dist/chunk-4DPLJPB5.js.map +1 -0
  19. package/dist/chunk-5JMJ6OI5.js +3 -0
  20. package/dist/chunk-5JMJ6OI5.js.map +1 -0
  21. package/dist/chunk-6ZMJ34KE.js +1153 -0
  22. package/dist/chunk-6ZMJ34KE.js.map +1 -0
  23. package/dist/chunk-CGBS37IU.js +128 -0
  24. package/dist/chunk-CGBS37IU.js.map +1 -0
  25. package/dist/chunk-DCMKA2A6.js +18 -0
  26. package/dist/chunk-DCMKA2A6.js.map +1 -0
  27. package/dist/chunk-DYLHN3HG.js +937 -0
  28. package/dist/chunk-DYLHN3HG.js.map +1 -0
  29. package/dist/{chunk-SVK6PLGO.js → chunk-LWQNX4LI.js} +12009 -18768
  30. package/dist/chunk-LWQNX4LI.js.map +1 -0
  31. package/dist/{chunk-JLDH4U5L.js → chunk-NCI4MAWZ.js} +317 -1967
  32. package/dist/chunk-NCI4MAWZ.js.map +1 -0
  33. package/dist/chunk-O44XP7LH.js +214 -0
  34. package/dist/chunk-O44XP7LH.js.map +1 -0
  35. package/dist/chunk-PST3ZWX2.js +555 -0
  36. package/dist/chunk-PST3ZWX2.js.map +1 -0
  37. package/dist/chunk-SYPHCDRD.js +1133 -0
  38. package/dist/chunk-SYPHCDRD.js.map +1 -0
  39. package/dist/chunk-V4BMZWBM.js +2401 -0
  40. package/dist/chunk-V4BMZWBM.js.map +1 -0
  41. package/dist/chunk-W7S6HFCQ.js +1983 -0
  42. package/dist/chunk-W7S6HFCQ.js.map +1 -0
  43. package/dist/chunk-YHVCFD2D.js +117 -0
  44. package/dist/chunk-YHVCFD2D.js.map +1 -0
  45. package/dist/chunk-Z63UPBS3.js +152 -0
  46. package/dist/chunk-Z63UPBS3.js.map +1 -0
  47. package/dist/client/index.d.ts +16 -4
  48. package/dist/client/index.js +13 -1
  49. package/dist/codex-rs/app-server/index.d.ts +161 -0
  50. package/dist/codex-rs/app-server/index.js +13 -0
  51. package/dist/codex-rs/app-server/index.js.map +1 -0
  52. package/dist/codex-rs/app-server-protocol/index.d.ts +1722 -0
  53. package/dist/codex-rs/app-server-protocol/index.js +6 -0
  54. package/dist/codex-rs/app-server-protocol/index.js.map +1 -0
  55. package/dist/codex-rs/app-server-protocol/protocol.d.ts +19 -0
  56. package/dist/codex-rs/app-server-protocol/protocol.js +4 -0
  57. package/dist/codex-rs/app-server-protocol/protocol.js.map +1 -0
  58. package/dist/codex-rs/codex-api/index.d.ts +104 -0
  59. package/dist/codex-rs/codex-api/index.js +11 -0
  60. package/dist/codex-rs/codex-api/index.js.map +1 -0
  61. package/dist/codex-rs/config/index.d.ts +88 -0
  62. package/dist/codex-rs/config/index.js +4 -0
  63. package/dist/codex-rs/config/index.js.map +1 -0
  64. package/dist/codex-rs/core/config/index.d.ts +61 -0
  65. package/dist/codex-rs/core/config/index.js +5 -0
  66. package/dist/codex-rs/core/config/index.js.map +1 -0
  67. package/dist/codex-rs/core/index.d.ts +1393 -0
  68. package/dist/codex-rs/core/index.js +11 -0
  69. package/dist/codex-rs/core/index.js.map +1 -0
  70. package/dist/codex-rs/model-provider/index.d.ts +2 -0
  71. package/dist/codex-rs/model-provider/index.js +4 -0
  72. package/dist/codex-rs/model-provider/index.js.map +1 -0
  73. package/dist/codex-rs/models-manager/index.d.ts +2 -0
  74. package/dist/codex-rs/models-manager/index.js +4 -0
  75. package/dist/codex-rs/models-manager/index.js.map +1 -0
  76. package/dist/codex-rs/parity.d.ts +26 -0
  77. package/dist/codex-rs/parity.js +3 -0
  78. package/dist/codex-rs/parity.js.map +1 -0
  79. package/dist/codex-rs/thread-store/index.d.ts +5 -0
  80. package/dist/codex-rs/thread-store/index.js +4 -0
  81. package/dist/codex-rs/thread-store/index.js.map +1 -0
  82. package/dist/codex-rs/unsupported.d.ts +15 -0
  83. package/dist/codex-rs/unsupported.js +22 -0
  84. package/dist/codex-rs/unsupported.js.map +1 -0
  85. package/dist/codex-rs/utils/output-truncation.d.ts +21 -0
  86. package/dist/codex-rs/utils/output-truncation.js +4 -0
  87. package/dist/codex-rs/utils/output-truncation.js.map +1 -0
  88. package/dist/codex-rs/utils/string.d.ts +7 -0
  89. package/dist/codex-rs/utils/string.js +3 -0
  90. package/dist/codex-rs/utils/string.js.map +1 -0
  91. package/dist/common-CTyph5x8.d.ts +40 -0
  92. package/dist/event-mapping-CbISdQ1D.d.ts +43 -0
  93. package/dist/history-CfM-4V7b.d.ts +1654 -0
  94. package/dist/index-77U_Oc-a.d.ts +63 -0
  95. package/dist/index-CoDZosq0.d.ts +261 -0
  96. package/dist/index.d.ts +18 -7
  97. package/dist/index.js +16 -2
  98. package/dist/lib-nXlaKiS-.d.ts +48 -0
  99. package/dist/live-thread-BMvlflzM.d.ts +30 -0
  100. package/dist/merge-B_AWVmnI.d.ts +24 -0
  101. package/dist/mod-DYVLSWO4.d.ts +91 -0
  102. package/dist/plan-mode-Cv6KWb_S.d.ts +14 -0
  103. package/dist/proposed-plan-DpN1ma0Y.d.ts +53 -0
  104. package/dist/protocol-mpBcYHrm.d.ts +1655 -0
  105. package/dist/react/index.d.ts +56 -48
  106. package/dist/react/index.js +16 -2
  107. package/dist/{remote-_6TDvg-g.d.ts → remote-ClZbq9KN.d.ts} +3 -1
  108. package/dist/rendered-thread-AOxw3V5b.d.ts +29 -0
  109. package/dist/responses_websocket-BhxSgCzK.d.ts +183 -0
  110. package/dist/runtime-Cm6ml53h.d.ts +528 -0
  111. package/dist/server/index.d.ts +29 -2416
  112. package/dist/server/index.js +13 -1
  113. package/dist/session-BRYzi8OT.d.ts +46 -0
  114. package/dist/shadcn/index.d.ts +1 -1
  115. package/dist/{sidebar-DT2XoitN.d.ts → sidebar-DMMij22z.d.ts} +1 -1
  116. package/dist/spec_plan_types-CmsJ-Tfn.d.ts +260 -0
  117. package/dist/{store-GYldc9EJ.d.ts → store-AGRxhgQ3.d.ts} +2 -1
  118. package/dist/t3code/apps/web/components/chat.d.ts +508 -0
  119. package/dist/t3code/apps/web/components/chat.js +12 -0
  120. package/dist/t3code/apps/web/components/chat.js.map +1 -0
  121. package/dist/t3code/apps/web/index.d.ts +12 -0
  122. package/dist/t3code/apps/web/index.js +13 -0
  123. package/dist/t3code/apps/web/index.js.map +1 -0
  124. package/dist/testing/index.d.ts +9 -91
  125. package/dist/testing/index.js +13 -1
  126. package/dist/thread-history-builder-zW0zeqcS.d.ts +58 -0
  127. package/dist/thread_event_store-C0zYzukG.d.ts +77 -0
  128. package/dist/types-BTeabLYr.d.ts +126 -0
  129. package/package.json +152 -88
  130. package/dist/chat-runtime-D7wu_KbX.d.ts +0 -747
  131. package/dist/chunk-JLDH4U5L.js.map +0 -1
  132. package/dist/chunk-SVK6PLGO.js.map +0 -1
  133. package/dist/index-CB9la6xE.d.ts +0 -112
  134. package/dist/thread_event_store-B9CoQUIA.d.ts +0 -3868
@@ -0,0 +1,555 @@
1
+ import { BASE_INSTRUCTIONS_DEFAULT } from './chunk-O44XP7LH.js';
2
+
3
+ // src/upstream/codex-rs/core/src/auth.ts
4
+ var AuthMode = {
5
+ ApiKey: "apiKey",
6
+ Chatgpt: "chatgpt"
7
+ };
8
+ var CODEX_CHATGPT_OAUTH_CLIENT_ID = "app_EMoamEEZ73f0CkXaXp7hrann";
9
+ var CODEX_CHATGPT_OAUTH_ISSUER = "https://auth.openai.com";
10
+ var CODEX_CHATGPT_OAUTH_SCOPE = "openid profile email offline_access api.connectors.read api.connectors.invoke";
11
+ var CODEX_CHATGPT_OAUTH_PRIMARY_PORT = 1455;
12
+ var CODEX_CHATGPT_OAUTH_FALLBACK_PORT = 1457;
13
+ var CODEX_CHATGPT_OAUTH_CALLBACK_PATH = "/auth/callback";
14
+ var CODEX_CHATGPT_OAUTH_ORIGINATOR = "codex_cli_rs";
15
+ function resolvedAuthMode(auth) {
16
+ if (auth.auth_mode) {
17
+ return auth.auth_mode;
18
+ }
19
+ if (auth.openai_api_key) {
20
+ return AuthMode.ApiKey;
21
+ }
22
+ return AuthMode.Chatgpt;
23
+ }
24
+ function parseJwtPayload(token) {
25
+ const [, payload] = token.split(".");
26
+ if (!payload) {
27
+ return {};
28
+ }
29
+ try {
30
+ const normalized = payload.replace(/-/g, "+").replace(/_/g, "/");
31
+ const padded = normalized.padEnd(
32
+ normalized.length + (4 - normalized.length % 4) % 4,
33
+ "="
34
+ );
35
+ const decoded = atob(padded);
36
+ const bytes = Uint8Array.from(decoded, (char) => char.charCodeAt(0));
37
+ return JSON.parse(new TextDecoder().decode(bytes));
38
+ } catch {
39
+ return {};
40
+ }
41
+ }
42
+ function openAiAuthClaims(token) {
43
+ const payload = parseJwtPayload(token);
44
+ const nested = payload["https://api.openai.com/auth"];
45
+ if (nested && typeof nested === "object" && !Array.isArray(nested)) {
46
+ return nested;
47
+ }
48
+ return payload;
49
+ }
50
+ function normalizePlanType(value) {
51
+ if (typeof value !== "string") {
52
+ return "unknown";
53
+ }
54
+ const normalized = value.toLowerCase();
55
+ if (normalized === "free" || normalized === "plus" || normalized === "pro" || normalized === "team" || normalized === "enterprise" || normalized === "edu") {
56
+ return normalized;
57
+ }
58
+ return "unknown";
59
+ }
60
+ function chatgptAuthFromAuthDotJson(auth) {
61
+ const tokens = auth.tokens;
62
+ const claims = tokens?.id_token ? openAiAuthClaims(tokens.id_token) : {};
63
+ const email = typeof claims.email === "string" ? claims.email : null;
64
+ const accountId = (typeof claims.chatgpt_account_id === "string" ? claims.chatgpt_account_id : tokens?.account_id) ?? null;
65
+ const planType = normalizePlanType(claims.chatgpt_plan_type);
66
+ return {
67
+ type: AuthMode.Chatgpt,
68
+ auth,
69
+ account_id: accountId,
70
+ email,
71
+ plan_type: planType
72
+ };
73
+ }
74
+ function codexAuthToAccountState(auth) {
75
+ if (!auth) {
76
+ return { account: null, requires_openai_auth: true };
77
+ }
78
+ if (auth.type === AuthMode.ApiKey) {
79
+ return {
80
+ account: { type: AuthMode.ApiKey },
81
+ requires_openai_auth: true
82
+ };
83
+ }
84
+ return {
85
+ account: {
86
+ type: AuthMode.Chatgpt,
87
+ email: auth.email ?? "",
88
+ plan_type: auth.plan_type ?? "unknown"
89
+ },
90
+ requires_openai_auth: true
91
+ };
92
+ }
93
+ function authDotJsonToOpenAiApiKey(auth) {
94
+ if (auth.openai_api_key?.trim()) {
95
+ return auth.openai_api_key.trim();
96
+ }
97
+ return null;
98
+ }
99
+ function authDotJsonToBearerToken(auth) {
100
+ return authDotJsonToOpenAiApiKey(auth) ?? auth.tokens?.access_token?.trim() ?? null;
101
+ }
102
+
103
+ // src/upstream/codex-rs/core/src/model-provider.ts
104
+ var OPENAI_PROVIDER_ID = "openai";
105
+ var CHATGPT_CODEX_PROVIDER_ID = "chatgpt-codex";
106
+ var OPENAI_PROVIDER_NAME = "OpenAI";
107
+ var CHATGPT_CODEX_PROVIDER_NAME = "ChatGPT Codex";
108
+ var OPENAI_RESPONSES_BASE_URL = "https://api.openai.com/v1";
109
+ var CHATGPT_CODEX_BASE_URL = "https://chatgpt.com/backend-api/codex";
110
+ var defaultCodexModel = "gpt-5.5";
111
+ var defaultCodexReasoningEffort = "medium";
112
+ var defaultRequestMaxRetries = 4;
113
+ var defaultStreamMaxRetries = 5;
114
+ var defaultStreamIdleTimeoutMs = 3e5;
115
+ var defaultWebsocketConnectTimeoutMs = 15e3;
116
+ var maxRequestMaxRetries = 100;
117
+ var maxStreamMaxRetries = 100;
118
+ var PERSONALITY_PLACEHOLDER = "{{ personality }}";
119
+ var DEFAULT_EFFECTIVE_CONTEXT_WINDOW_PERCENT = 95;
120
+ function get_model_instructions(model_info, personality) {
121
+ const template = model_info.model_messages?.instructions_template;
122
+ if (template) {
123
+ const personalityMessage = model_info.model_messages?.instructions_variables?.personality?.[personality ?? ""] ?? "";
124
+ return template.replace(PERSONALITY_PLACEHOLDER, personalityMessage);
125
+ }
126
+ return model_info.base_instructions || BASE_INSTRUCTIONS_DEFAULT;
127
+ }
128
+ function resolvedContextWindow(modelInfo) {
129
+ return finitePositiveInteger(modelInfo.context_window) ?? finitePositiveInteger(modelInfo.max_context_window) ?? null;
130
+ }
131
+ function effectiveContextWindow(modelInfo) {
132
+ const contextWindow = resolvedContextWindow(modelInfo);
133
+ if (contextWindow === null) {
134
+ return null;
135
+ }
136
+ const percent = finitePositiveInteger(modelInfo.effective_context_window_percent) ?? DEFAULT_EFFECTIVE_CONTEXT_WINDOW_PERCENT;
137
+ return Math.trunc(contextWindow * percent / 100);
138
+ }
139
+ function autoCompactTokenLimit(modelInfo) {
140
+ const contextWindow = resolvedContextWindow(modelInfo);
141
+ const configuredLimit = finitePositiveInteger(modelInfo.auto_compact_token_limit);
142
+ if (contextWindow === null) {
143
+ return configuredLimit;
144
+ }
145
+ const contextLimit = Math.trunc(contextWindow * 9 / 10);
146
+ return configuredLimit === null ? contextLimit : Math.min(configuredLimit, contextLimit);
147
+ }
148
+ var reasoningOptions = [
149
+ { reasoning_effort: "low", description: "Fast responses with lighter reasoning." },
150
+ { reasoning_effort: "medium", description: "Balanced speed and reasoning depth." },
151
+ { reasoning_effort: "high", description: "Deeper reasoning for complex planning." },
152
+ { reasoning_effort: "xhigh", description: "Maximum reasoning depth for hard tasks." }
153
+ ];
154
+ var defaultProviderCapabilities = {
155
+ namespace_tools: true,
156
+ image_generation: true,
157
+ web_search: true
158
+ };
159
+ function createOpenAiModelProviderInfo(base_url = null) {
160
+ return {
161
+ name: OPENAI_PROVIDER_NAME,
162
+ base_url,
163
+ env_key: null,
164
+ env_key_instructions: null,
165
+ experimental_bearer_token: null,
166
+ auth: null,
167
+ aws: null,
168
+ wire_api: "responses",
169
+ query_params: null,
170
+ http_headers: { version: "codex-assistant" },
171
+ env_http_headers: {
172
+ "OpenAI-Organization": "OPENAI_ORGANIZATION",
173
+ "OpenAI-Project": "OPENAI_PROJECT"
174
+ },
175
+ request_max_retries: null,
176
+ stream_max_retries: null,
177
+ stream_idle_timeout_ms: null,
178
+ websocket_connect_timeout_ms: null,
179
+ requires_openai_auth: true,
180
+ supports_websockets: true
181
+ };
182
+ }
183
+ function createChatgptCodexModelProviderInfo() {
184
+ return {
185
+ ...createOpenAiModelProviderInfo(CHATGPT_CODEX_BASE_URL),
186
+ name: CHATGPT_CODEX_PROVIDER_NAME,
187
+ supports_websockets: false
188
+ };
189
+ }
190
+ function validateModelProviderInfo(provider) {
191
+ const wireApi = provider.wire_api ?? "responses";
192
+ if (wireApi === "chat") {
193
+ throw new Error(
194
+ '`wire_api = "chat"` is no longer supported. Set `wire_api = "responses"`.'
195
+ );
196
+ }
197
+ if (wireApi !== "responses") {
198
+ throw new Error(`unknown wire_api: ${String(wireApi)}`);
199
+ }
200
+ if (provider.aws) {
201
+ const conflicts = conflictFields(provider, [
202
+ "env_key",
203
+ "experimental_bearer_token",
204
+ "auth",
205
+ "requires_openai_auth"
206
+ ]);
207
+ if (provider.supports_websockets) {
208
+ conflicts.push("supports_websockets");
209
+ }
210
+ if (conflicts.length > 0) {
211
+ throw new Error(`provider aws cannot be combined with ${conflicts.join(", ")}`);
212
+ }
213
+ }
214
+ if (provider.auth) {
215
+ if (!provider.auth.command.trim()) {
216
+ throw new Error("provider auth.command must not be empty");
217
+ }
218
+ const conflicts = conflictFields(provider, [
219
+ "env_key",
220
+ "experimental_bearer_token",
221
+ "requires_openai_auth"
222
+ ]);
223
+ if (conflicts.length > 0) {
224
+ throw new Error(`provider auth cannot be combined with ${conflicts.join(", ")}`);
225
+ }
226
+ }
227
+ }
228
+ var ConfiguredModelProvider = class {
229
+ providerInfo;
230
+ accountState;
231
+ providerCapabilities;
232
+ manager;
233
+ constructor(input) {
234
+ validateModelProviderInfo(input.info);
235
+ this.providerInfo = { ...input.info, wire_api: input.info.wire_api ?? "responses" };
236
+ this.accountState = input.account_state ?? {
237
+ account: null,
238
+ requires_openai_auth: this.providerInfo.requires_openai_auth ?? false
239
+ };
240
+ this.providerCapabilities = input.capabilities ?? defaultProviderCapabilities;
241
+ this.manager = input.models_manager ?? new StaticModelsManager();
242
+ }
243
+ info() {
244
+ return this.providerInfo;
245
+ }
246
+ account_state() {
247
+ return this.accountState;
248
+ }
249
+ capabilities() {
250
+ return this.providerCapabilities;
251
+ }
252
+ runtime_config(auth) {
253
+ return providerRuntimeConfig(this.providerInfo, auth ?? null);
254
+ }
255
+ models_manager() {
256
+ return this.manager;
257
+ }
258
+ };
259
+ var StaticModelsManager = class {
260
+ models;
261
+ constructor(models = defaultCodexModelInfo()) {
262
+ this.models = [...models];
263
+ }
264
+ list_models(params = {}) {
265
+ const presets = this.build_available_models();
266
+ const visible = params.include_hidden ? presets : presets.filter((model) => !model.hidden);
267
+ const total = visible.length;
268
+ const limit = Math.max(1, Math.min(total || 1, params.limit ?? (total || 1)));
269
+ const start = params.cursor ? Number.parseInt(params.cursor, 10) : 0;
270
+ if (!Number.isInteger(start) || start < 0 || start > total) {
271
+ throw new Error(`invalid cursor: ${params.cursor}`);
272
+ }
273
+ const end = Math.min(total, start + limit);
274
+ return {
275
+ data: visible.slice(start, end),
276
+ next_cursor: end < total ? String(end) : null
277
+ };
278
+ }
279
+ raw_model_catalog() {
280
+ return { models: [...this.models] };
281
+ }
282
+ get_model_info(model) {
283
+ return findModelByLongestPrefix(model, this.models) ?? findModelByNamespacedSuffix(model, this.models) ?? modelInfoFromSlug(model);
284
+ }
285
+ get_default_model(model) {
286
+ if (model) {
287
+ return model;
288
+ }
289
+ const selected = this.build_available_models().find((preset) => preset.is_default);
290
+ return selected?.model ?? this.build_available_models()[0]?.model ?? defaultCodexModel;
291
+ }
292
+ default_reasoning_effort(model) {
293
+ const info = this.get_model_info(this.get_default_model(model));
294
+ return info.default_reasoning_level ?? defaultCodexReasoningEffort;
295
+ }
296
+ build_available_models() {
297
+ const sorted = [...this.models].sort((left, right) => left.priority - right.priority);
298
+ const presets = sorted.map(modelInfoToPreset);
299
+ markDefaultByPickerVisibility(presets);
300
+ return presets;
301
+ }
302
+ };
303
+ function createModelProvider(input = {}) {
304
+ return new ConfiguredModelProvider({
305
+ info: input.info ?? createOpenAiModelProviderInfo(),
306
+ account_state: input.account_state ?? codexAuthToProviderAccountState(input.auth ?? null, true),
307
+ capabilities: input.capabilities,
308
+ models_manager: input.models_manager
309
+ });
310
+ }
311
+ function defaultModelsManager() {
312
+ return new StaticModelsManager();
313
+ }
314
+ function listDefaultCodexModels(params = {}) {
315
+ return defaultModelsManager().list_models(params);
316
+ }
317
+ function defaultCodexModels() {
318
+ return listDefaultCodexModels({ include_hidden: true }).data;
319
+ }
320
+ function defaultCodexModelInfo() {
321
+ return [
322
+ {
323
+ slug: "gpt-5.5",
324
+ display_name: "GPT-5.5",
325
+ description: "Frontier model for complex planning and implementation.",
326
+ default_reasoning_level: defaultCodexReasoningEffort,
327
+ supported_reasoning_levels: reasoningOptions,
328
+ visibility: "list",
329
+ supported_in_api: true,
330
+ priority: 0,
331
+ upgrade: null,
332
+ upgrade_info: null,
333
+ availability_nux: null,
334
+ input_modalities: ["text", "image"],
335
+ supports_personality: true,
336
+ additional_speed_tiers: [],
337
+ service_tiers: [],
338
+ base_instructions: BASE_INSTRUCTIONS_DEFAULT,
339
+ model_messages: null,
340
+ context_window: 272e3,
341
+ max_context_window: null,
342
+ auto_compact_token_limit: null,
343
+ effective_context_window_percent: DEFAULT_EFFECTIVE_CONTEXT_WINDOW_PERCENT
344
+ },
345
+ {
346
+ slug: "gpt-5.4",
347
+ display_name: "GPT-5.4",
348
+ description: "Strong everyday model for coding and product work.",
349
+ default_reasoning_level: defaultCodexReasoningEffort,
350
+ supported_reasoning_levels: reasoningOptions,
351
+ visibility: "list",
352
+ supported_in_api: true,
353
+ priority: 1,
354
+ upgrade: null,
355
+ upgrade_info: null,
356
+ availability_nux: null,
357
+ input_modalities: ["text", "image"],
358
+ supports_personality: true,
359
+ additional_speed_tiers: [],
360
+ service_tiers: [],
361
+ base_instructions: BASE_INSTRUCTIONS_DEFAULT,
362
+ model_messages: null,
363
+ context_window: 272e3,
364
+ max_context_window: null,
365
+ auto_compact_token_limit: null,
366
+ effective_context_window_percent: DEFAULT_EFFECTIVE_CONTEXT_WINDOW_PERCENT
367
+ },
368
+ {
369
+ slug: "gpt-5.4-mini",
370
+ display_name: "GPT-5.4 Mini",
371
+ description: "Faster, smaller model for simple chat and iteration.",
372
+ default_reasoning_level: defaultCodexReasoningEffort,
373
+ supported_reasoning_levels: reasoningOptions.filter(
374
+ (option) => option.reasoning_effort !== "xhigh"
375
+ ),
376
+ visibility: "list",
377
+ supported_in_api: true,
378
+ priority: 2,
379
+ upgrade: null,
380
+ upgrade_info: null,
381
+ availability_nux: null,
382
+ input_modalities: ["text", "image"],
383
+ supports_personality: true,
384
+ additional_speed_tiers: [],
385
+ service_tiers: [],
386
+ base_instructions: BASE_INSTRUCTIONS_DEFAULT,
387
+ model_messages: null,
388
+ context_window: 128e3,
389
+ max_context_window: null,
390
+ auto_compact_token_limit: null,
391
+ effective_context_window_percent: DEFAULT_EFFECTIVE_CONTEXT_WINDOW_PERCENT
392
+ }
393
+ ];
394
+ }
395
+ function defaultModelProviderAccountState() {
396
+ return {
397
+ account: null,
398
+ requires_openai_auth: true
399
+ };
400
+ }
401
+ function apiKeyProviderAccountState() {
402
+ return {
403
+ account: { type: AuthMode.ApiKey },
404
+ requires_openai_auth: true
405
+ };
406
+ }
407
+ function providerRuntimeConfig(provider, auth) {
408
+ validateModelProviderInfo(provider);
409
+ const baseUrl = provider.base_url ?? (auth?.type === AuthMode.Chatgpt ? CHATGPT_CODEX_BASE_URL : OPENAI_RESPONSES_BASE_URL);
410
+ const headers = {
411
+ ...provider.http_headers ?? {}
412
+ };
413
+ return {
414
+ name: provider.name,
415
+ base_url: baseUrl,
416
+ responses_url: `${baseUrl.replace(/\/$/, "")}/responses`,
417
+ query_params: provider.query_params ?? null,
418
+ headers,
419
+ request_max_retries: clampRetry(
420
+ provider.request_max_retries,
421
+ defaultRequestMaxRetries,
422
+ maxRequestMaxRetries
423
+ ),
424
+ stream_max_retries: clampRetry(
425
+ provider.stream_max_retries,
426
+ defaultStreamMaxRetries,
427
+ maxStreamMaxRetries
428
+ ),
429
+ stream_idle_timeout_ms: provider.stream_idle_timeout_ms ?? defaultStreamIdleTimeoutMs,
430
+ websocket_connect_timeout_ms: provider.websocket_connect_timeout_ms ?? defaultWebsocketConnectTimeoutMs,
431
+ supports_websockets: provider.supports_websockets ?? false
432
+ };
433
+ }
434
+ function modelInfoToPreset(info) {
435
+ return {
436
+ id: info.slug,
437
+ model: info.slug,
438
+ upgrade: info.upgrade,
439
+ upgrade_info: info.upgrade_info,
440
+ availability_nux: info.availability_nux,
441
+ display_name: info.display_name,
442
+ description: info.description ?? info.display_name,
443
+ hidden: info.visibility !== "list",
444
+ supported_reasoning_efforts: info.supported_reasoning_levels,
445
+ default_reasoning_effort: info.default_reasoning_level ?? defaultCodexReasoningEffort,
446
+ input_modalities: info.input_modalities,
447
+ supports_personality: info.supports_personality,
448
+ additional_speed_tiers: info.additional_speed_tiers,
449
+ service_tiers: info.service_tiers,
450
+ is_default: false,
451
+ supported_in_api: info.supported_in_api
452
+ };
453
+ }
454
+ function modelInfoFromSlug(slug) {
455
+ const known = defaultCodexModelInfo().find((model) => model.slug === slug);
456
+ if (known) {
457
+ return known;
458
+ }
459
+ return {
460
+ slug,
461
+ display_name: slug,
462
+ description: null,
463
+ default_reasoning_level: defaultCodexReasoningEffort,
464
+ supported_reasoning_levels: reasoningOptions,
465
+ visibility: "none",
466
+ supported_in_api: true,
467
+ priority: 99,
468
+ upgrade: null,
469
+ upgrade_info: null,
470
+ availability_nux: null,
471
+ input_modalities: ["text", "image"],
472
+ supports_personality: false,
473
+ additional_speed_tiers: [],
474
+ service_tiers: [],
475
+ base_instructions: BASE_INSTRUCTIONS_DEFAULT,
476
+ model_messages: null,
477
+ context_window: null,
478
+ max_context_window: null,
479
+ auto_compact_token_limit: null,
480
+ effective_context_window_percent: DEFAULT_EFFECTIVE_CONTEXT_WINDOW_PERCENT
481
+ };
482
+ }
483
+ function isReasoningEffortSupported(model, effort, manager = defaultModelsManager()) {
484
+ if (!effort) {
485
+ return false;
486
+ }
487
+ return manager.get_model_info(model).supported_reasoning_levels.some((option) => option.reasoning_effort === effort);
488
+ }
489
+ function resolveReasoningEffortForModel(model, effort, manager = defaultModelsManager()) {
490
+ return isReasoningEffortSupported(model, effort, manager) ? effort : manager.default_reasoning_effort(model);
491
+ }
492
+ function codexAuthToProviderAccountState(auth, requiresOpenAiAuth) {
493
+ if (!auth) {
494
+ return { account: null, requires_openai_auth: requiresOpenAiAuth };
495
+ }
496
+ if (auth.type === AuthMode.ApiKey) {
497
+ return apiKeyProviderAccountState();
498
+ }
499
+ const email = auth.email;
500
+ const planType = auth.plan_type;
501
+ return {
502
+ account: email && planType ? { type: AuthMode.Chatgpt, email, plan_type: planType } : null,
503
+ requires_openai_auth: requiresOpenAiAuth
504
+ };
505
+ }
506
+ function conflictFields(provider, fields) {
507
+ return fields.filter((field) => {
508
+ const value = provider[field];
509
+ return value !== void 0 && value !== null && value !== false;
510
+ });
511
+ }
512
+ function clampRetry(value, fallback, max) {
513
+ return Math.min(Math.max(0, value ?? fallback), max);
514
+ }
515
+ function markDefaultByPickerVisibility(presets) {
516
+ for (const preset of presets) {
517
+ preset.is_default = false;
518
+ }
519
+ const visibleDefault = presets.find((preset) => preset.model === defaultCodexModel && !preset.hidden) ?? presets.find((preset) => !preset.hidden) ?? presets[0];
520
+ if (visibleDefault) {
521
+ visibleDefault.is_default = true;
522
+ }
523
+ }
524
+ function findModelByLongestPrefix(model, candidates) {
525
+ let best = null;
526
+ for (const candidate of candidates) {
527
+ if (!model.startsWith(candidate.slug)) {
528
+ continue;
529
+ }
530
+ if (!best || candidate.slug.length > best.slug.length) {
531
+ best = candidate;
532
+ }
533
+ }
534
+ return best;
535
+ }
536
+ function findModelByNamespacedSuffix(model, candidates) {
537
+ const [namespace, suffix, extra] = model.split("/");
538
+ if (!namespace || !suffix || extra) {
539
+ return null;
540
+ }
541
+ if (!/^[A-Za-z0-9_-]+$/.test(namespace)) {
542
+ return null;
543
+ }
544
+ return findModelByLongestPrefix(suffix, candidates);
545
+ }
546
+ function finitePositiveInteger(value) {
547
+ if (typeof value !== "number" || !Number.isFinite(value) || value <= 0) {
548
+ return null;
549
+ }
550
+ return Math.trunc(value);
551
+ }
552
+
553
+ export { AuthMode, CHATGPT_CODEX_BASE_URL, CHATGPT_CODEX_PROVIDER_ID, CHATGPT_CODEX_PROVIDER_NAME, CODEX_CHATGPT_OAUTH_CALLBACK_PATH, CODEX_CHATGPT_OAUTH_CLIENT_ID, CODEX_CHATGPT_OAUTH_FALLBACK_PORT, CODEX_CHATGPT_OAUTH_ISSUER, CODEX_CHATGPT_OAUTH_ORIGINATOR, CODEX_CHATGPT_OAUTH_PRIMARY_PORT, CODEX_CHATGPT_OAUTH_SCOPE, ConfiguredModelProvider, OPENAI_PROVIDER_ID, OPENAI_PROVIDER_NAME, OPENAI_RESPONSES_BASE_URL, StaticModelsManager, apiKeyProviderAccountState, authDotJsonToBearerToken, authDotJsonToOpenAiApiKey, autoCompactTokenLimit, chatgptAuthFromAuthDotJson, codexAuthToAccountState, createChatgptCodexModelProviderInfo, createModelProvider, createOpenAiModelProviderInfo, defaultCodexModelInfo, defaultCodexModels, defaultModelProviderAccountState, defaultModelsManager, defaultProviderCapabilities, effectiveContextWindow, get_model_instructions, isReasoningEffortSupported, listDefaultCodexModels, modelInfoFromSlug, modelInfoToPreset, normalizePlanType, openAiAuthClaims, parseJwtPayload, providerRuntimeConfig, resolveReasoningEffortForModel, resolvedAuthMode, resolvedContextWindow, validateModelProviderInfo };
554
+ //# sourceMappingURL=chunk-PST3ZWX2.js.map
555
+ //# sourceMappingURL=chunk-PST3ZWX2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/upstream/codex-rs/core/src/auth.ts","../src/upstream/codex-rs/core/src/model-provider.ts"],"names":[],"mappings":"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","file":"chunk-PST3ZWX2.js","sourcesContent":["export const AuthMode = {\n\tApiKey: \"apiKey\",\n\tChatgpt: \"chatgpt\",\n} as const;\n\nexport const CODEX_CHATGPT_OAUTH_CLIENT_ID = \"app_EMoamEEZ73f0CkXaXp7hrann\";\nexport const CODEX_CHATGPT_OAUTH_ISSUER = \"https://auth.openai.com\";\nexport const CODEX_CHATGPT_OAUTH_SCOPE =\n\t\"openid profile email offline_access api.connectors.read api.connectors.invoke\";\nexport const CODEX_CHATGPT_OAUTH_PRIMARY_PORT = 1455;\nexport const CODEX_CHATGPT_OAUTH_FALLBACK_PORT = 1457;\nexport const CODEX_CHATGPT_OAUTH_CALLBACK_PATH = \"/auth/callback\";\nexport const CODEX_CHATGPT_OAUTH_ORIGINATOR = \"codex_cli_rs\";\n\nexport type AuthMode = (typeof AuthMode)[keyof typeof AuthMode];\n\nexport type PlanType =\n\t| \"free\"\n\t| \"plus\"\n\t| \"pro\"\n\t| \"team\"\n\t| \"enterprise\"\n\t| \"edu\"\n\t| \"unknown\";\n\nexport type TokenData = {\n\taccess_token: string;\n\trefresh_token: string;\n\tid_token: string;\n\taccount_id?: string | null;\n\texpires_at?: number | null;\n};\n\nexport type AuthDotJson = {\n\tauth_mode?: AuthMode | null;\n\topenai_api_key?: string | null;\n\ttokens?: TokenData | null;\n\tlast_refresh?: string | null;\n};\n\nexport type CodexAuth =\n\t| {\n\t\t\ttype: typeof AuthMode.ApiKey;\n\t\t\tapi_key: string;\n\t }\n\t| {\n\t\t\ttype: typeof AuthMode.Chatgpt;\n\t\t\tauth: AuthDotJson;\n\t\t\taccount_id?: string | null;\n\t\t\temail?: string | null;\n\t\t\tplan_type?: PlanType | null;\n\t };\n\nexport type ProviderAccount =\n\t| {\n\t\t\ttype: typeof AuthMode.ApiKey;\n\t }\n\t| {\n\t\t\ttype: typeof AuthMode.Chatgpt;\n\t\t\temail: string;\n\t\t\tplan_type: PlanType;\n\t };\n\nexport type ProviderAccountState = {\n\taccount: ProviderAccount | null;\n\trequires_openai_auth: boolean;\n};\n\nexport type GetAccountResponse = ProviderAccountState;\n\nexport type ChatgptOAuthTokenExchangeRequest = {\n\tcode: string;\n\tredirect_uri: string;\n\tcode_verifier: string;\n};\n\nexport type ChatgptOAuthTokenExchangeResponse = {\n\tcredential_jwe: string;\n\taccount: ProviderAccountState;\n};\n\nexport function resolvedAuthMode(auth: AuthDotJson): AuthMode {\n\tif (auth.auth_mode) {\n\t\treturn auth.auth_mode;\n\t}\n\n\tif (auth.openai_api_key) {\n\t\treturn AuthMode.ApiKey;\n\t}\n\n\treturn AuthMode.Chatgpt;\n}\n\nexport function parseJwtPayload(token: string): Record<string, unknown> {\n\tconst [, payload] = token.split(\".\");\n\tif (!payload) {\n\t\treturn {};\n\t}\n\n\ttry {\n\t\tconst normalized = payload.replace(/-/g, \"+\").replace(/_/g, \"/\");\n\t\tconst padded = normalized.padEnd(\n\t\t\tnormalized.length + ((4 - (normalized.length % 4)) % 4),\n\t\t\t\"=\",\n\t\t);\n\t\tconst decoded = atob(padded);\n\t\tconst bytes = Uint8Array.from(decoded, (char) => char.charCodeAt(0));\n\t\treturn JSON.parse(new TextDecoder().decode(bytes)) as Record<string, unknown>;\n\t} catch {\n\t\treturn {};\n\t}\n}\n\nexport function openAiAuthClaims(token: string): Record<string, unknown> {\n\tconst payload = parseJwtPayload(token);\n\tconst nested = payload[\"https://api.openai.com/auth\"];\n\n\tif (nested && typeof nested === \"object\" && !Array.isArray(nested)) {\n\t\treturn nested as Record<string, unknown>;\n\t}\n\n\treturn payload;\n}\n\nexport function normalizePlanType(value: unknown): PlanType {\n\tif (typeof value !== \"string\") {\n\t\treturn \"unknown\";\n\t}\n\n\tconst normalized = value.toLowerCase();\n\tif (\n\t\tnormalized === \"free\" ||\n\t\tnormalized === \"plus\" ||\n\t\tnormalized === \"pro\" ||\n\t\tnormalized === \"team\" ||\n\t\tnormalized === \"enterprise\" ||\n\t\tnormalized === \"edu\"\n\t) {\n\t\treturn normalized;\n\t}\n\n\treturn \"unknown\";\n}\n\nexport function chatgptAuthFromAuthDotJson(auth: AuthDotJson): CodexAuth {\n\tconst tokens = auth.tokens;\n\tconst claims = tokens?.id_token ? openAiAuthClaims(tokens.id_token) : {};\n\tconst email = typeof claims.email === \"string\" ? claims.email : null;\n\tconst accountId =\n\t\t(typeof claims.chatgpt_account_id === \"string\"\n\t\t\t? claims.chatgpt_account_id\n\t\t\t: tokens?.account_id) ?? null;\n\tconst planType = normalizePlanType(claims.chatgpt_plan_type);\n\n\treturn {\n\t\ttype: AuthMode.Chatgpt,\n\t\tauth,\n\t\taccount_id: accountId,\n\t\temail,\n\t\tplan_type: planType,\n\t};\n}\n\nexport function codexAuthToAccountState(auth: CodexAuth | null): ProviderAccountState {\n\tif (!auth) {\n\t\treturn { account: null, requires_openai_auth: true };\n\t}\n\n\tif (auth.type === AuthMode.ApiKey) {\n\t\treturn {\n\t\t\taccount: { type: AuthMode.ApiKey },\n\t\t\trequires_openai_auth: true,\n\t\t};\n\t}\n\n\treturn {\n\t\taccount: {\n\t\t\ttype: AuthMode.Chatgpt,\n\t\t\temail: auth.email ?? \"\",\n\t\t\tplan_type: auth.plan_type ?? \"unknown\",\n\t\t},\n\t\trequires_openai_auth: true,\n\t};\n}\n\nexport function authDotJsonToOpenAiApiKey(auth: AuthDotJson): string | null {\n\tif (auth.openai_api_key?.trim()) {\n\t\treturn auth.openai_api_key.trim();\n\t}\n\n\treturn null;\n}\n\nexport function authDotJsonToBearerToken(auth: AuthDotJson): string | null {\n\treturn authDotJsonToOpenAiApiKey(auth) ?? auth.tokens?.access_token?.trim() ?? null;\n}\n","import { AuthMode, type CodexAuth, type ProviderAccountState } from \"./auth\";\nimport { BASE_INSTRUCTIONS_DEFAULT, type Personality } from \"./protocol\";\n\nexport const OPENAI_PROVIDER_ID = \"openai\";\nexport const CHATGPT_CODEX_PROVIDER_ID = \"chatgpt-codex\";\nexport const OPENAI_PROVIDER_NAME = \"OpenAI\";\nexport const CHATGPT_CODEX_PROVIDER_NAME = \"ChatGPT Codex\";\nexport const OPENAI_RESPONSES_BASE_URL = \"https://api.openai.com/v1\";\nexport const CHATGPT_CODEX_BASE_URL = \"https://chatgpt.com/backend-api/codex\";\n\nconst defaultCodexModel: string = \"gpt-5.5\";\nconst defaultCodexReasoningEffort = \"medium\";\nconst defaultRequestMaxRetries = 4;\nconst defaultStreamMaxRetries = 5;\nconst defaultStreamIdleTimeoutMs = 300_000;\nconst defaultWebsocketConnectTimeoutMs = 15_000;\nconst maxRequestMaxRetries = 100;\nconst maxStreamMaxRetries = 100;\n\nexport type WireApi = \"responses\";\n\nexport type ModelProviderAuthInfo = {\n\tcommand: string;\n\targs?: string[] | null;\n\tenv?: Record<string, string> | null;\n};\n\nexport type ModelProviderAwsAuthInfo = {\n\tprofile?: string | null;\n\tregion?: string | null;\n};\n\nexport type ModelProviderInfo = {\n\tname: string;\n\tbase_url?: string | null;\n\tenv_key?: string | null;\n\tenv_key_instructions?: string | null;\n\texperimental_bearer_token?: string | null;\n\tauth?: ModelProviderAuthInfo | null;\n\taws?: ModelProviderAwsAuthInfo | null;\n\twire_api?: WireApi;\n\tquery_params?: Record<string, string> | null;\n\thttp_headers?: Record<string, string> | null;\n\tenv_http_headers?: Record<string, string> | null;\n\trequest_max_retries?: number | null;\n\tstream_max_retries?: number | null;\n\tstream_idle_timeout_ms?: number | null;\n\twebsocket_connect_timeout_ms?: number | null;\n\trequires_openai_auth?: boolean;\n\tsupports_websockets?: boolean;\n};\n\nexport type ProviderCapabilities = {\n\tnamespace_tools: boolean;\n\timage_generation: boolean;\n\tweb_search: boolean;\n};\n\nexport type ProviderRuntimeConfig = {\n\tname: string;\n\tbase_url: string;\n\tresponses_url: string;\n\tquery_params: Record<string, string> | null;\n\theaders: Record<string, string>;\n\trequest_max_retries: number;\n\tstream_max_retries: number;\n\tstream_idle_timeout_ms: number;\n\twebsocket_connect_timeout_ms: number;\n\tsupports_websockets: boolean;\n};\n\nexport type ModelServiceTier = {\n\tid: string;\n\tname: string;\n\tdescription: string;\n};\n\nexport type ReasoningEffortOption = {\n\treasoning_effort: string;\n\tdescription: string;\n};\n\nexport type ModelInfo = {\n\tslug: string;\n\tdisplay_name: string;\n\tdescription: string | null;\n\tdefault_reasoning_level: string | null;\n\tsupported_reasoning_levels: ReasoningEffortOption[];\n\tvisibility: \"list\" | \"hide\" | \"none\";\n\tsupported_in_api: boolean;\n\tpriority: number;\n\tupgrade: string | null;\n\tupgrade_info: null;\n\tavailability_nux: null;\n\tinput_modalities: string[];\n\tsupports_personality: boolean;\n\tadditional_speed_tiers: string[];\n\tservice_tiers: ModelServiceTier[];\n\tbase_instructions: string;\n\tmodel_messages?: ModelMessages | null;\n\tcontext_window?: number | null;\n\tmax_context_window?: number | null;\n\tauto_compact_token_limit?: number | null;\n\teffective_context_window_percent?: number | null;\n};\n\nexport type ModelMessages = {\n\tinstructions_template?: string | null;\n\tinstructions_variables?: ModelInstructionsVariables | null;\n};\n\nexport type ModelInstructionsVariables = {\n\tpersonality?: Record<string, string> | null;\n};\n\nexport type ModelPreset = {\n\tid: string;\n\tmodel: string;\n\tupgrade: string | null;\n\tupgrade_info: null;\n\tavailability_nux: null;\n\tdisplay_name: string;\n\tdescription: string;\n\thidden: boolean;\n\tsupported_reasoning_efforts: ReasoningEffortOption[];\n\tdefault_reasoning_effort: string;\n\tinput_modalities: string[];\n\tsupports_personality: boolean;\n\tadditional_speed_tiers: string[];\n\tservice_tiers: ModelServiceTier[];\n\tis_default: boolean;\n\tsupported_in_api: boolean;\n};\n\nexport type Model = ModelPreset;\n\nexport type ModelListParams = {\n\tcursor?: string | null;\n\tlimit?: number | null;\n\tinclude_hidden?: boolean | null;\n};\n\nexport type ModelListResponse = {\n\tdata: ModelPreset[];\n\tnext_cursor: string | null;\n};\n\nexport type RefreshStrategy = \"online\" | \"offline\" | \"online_if_uncached\";\n\nexport type ModelsManager = {\n\tlist_models(params?: ModelListParams): ModelListResponse;\n\traw_model_catalog(refresh_strategy?: RefreshStrategy): { models: ModelInfo[] };\n\tget_model_info(model: string): ModelInfo;\n\tget_default_model(model?: string | null): string;\n\tdefault_reasoning_effort(model?: string | null): string;\n};\n\nconst PERSONALITY_PLACEHOLDER = \"{{ personality }}\";\nconst DEFAULT_EFFECTIVE_CONTEXT_WINDOW_PERCENT = 95;\n\nexport function get_model_instructions(\n\tmodel_info: ModelInfo,\n\tpersonality?: Personality | null,\n): string {\n\tconst template = model_info.model_messages?.instructions_template;\n\tif (template) {\n\t\tconst personalityMessage =\n\t\t\tmodel_info.model_messages?.instructions_variables?.personality?.[\n\t\t\t\tpersonality ?? \"\"\n\t\t\t] ?? \"\";\n\t\treturn template.replace(PERSONALITY_PLACEHOLDER, personalityMessage);\n\t}\n\treturn model_info.base_instructions || BASE_INSTRUCTIONS_DEFAULT;\n}\n\nexport function resolvedContextWindow(modelInfo: ModelInfo): number | null {\n\treturn finitePositiveInteger(modelInfo.context_window) ??\n\t\tfinitePositiveInteger(modelInfo.max_context_window) ??\n\t\tnull;\n}\n\nexport function effectiveContextWindow(modelInfo: ModelInfo): number | null {\n\tconst contextWindow = resolvedContextWindow(modelInfo);\n\tif (contextWindow === null) {\n\t\treturn null;\n\t}\n\tconst percent =\n\t\tfinitePositiveInteger(modelInfo.effective_context_window_percent) ??\n\t\tDEFAULT_EFFECTIVE_CONTEXT_WINDOW_PERCENT;\n\treturn Math.trunc((contextWindow * percent) / 100);\n}\n\nexport function autoCompactTokenLimit(modelInfo: ModelInfo): number | null {\n\tconst contextWindow = resolvedContextWindow(modelInfo);\n\tconst configuredLimit = finitePositiveInteger(modelInfo.auto_compact_token_limit);\n\tif (contextWindow === null) {\n\t\treturn configuredLimit;\n\t}\n\tconst contextLimit = Math.trunc((contextWindow * 9) / 10);\n\treturn configuredLimit === null ? contextLimit : Math.min(configuredLimit, contextLimit);\n}\n\nexport type ModelProvider = {\n\tinfo(): ModelProviderInfo;\n\taccount_state(): ProviderAccountState;\n\tcapabilities(): ProviderCapabilities;\n\truntime_config(auth?: CodexAuth | null): ProviderRuntimeConfig;\n\tmodels_manager(): ModelsManager;\n};\n\nconst reasoningOptions: ReasoningEffortOption[] = [\n\t{ reasoning_effort: \"low\", description: \"Fast responses with lighter reasoning.\" },\n\t{ reasoning_effort: \"medium\", description: \"Balanced speed and reasoning depth.\" },\n\t{ reasoning_effort: \"high\", description: \"Deeper reasoning for complex planning.\" },\n\t{ reasoning_effort: \"xhigh\", description: \"Maximum reasoning depth for hard tasks.\" },\n];\n\nexport const defaultProviderCapabilities: ProviderCapabilities = {\n\tnamespace_tools: true,\n\timage_generation: true,\n\tweb_search: true,\n};\n\nexport function createOpenAiModelProviderInfo(\n\tbase_url: string | null = null,\n): ModelProviderInfo {\n\treturn {\n\t\tname: OPENAI_PROVIDER_NAME,\n\t\tbase_url,\n\t\tenv_key: null,\n\t\tenv_key_instructions: null,\n\t\texperimental_bearer_token: null,\n\t\tauth: null,\n\t\taws: null,\n\t\twire_api: \"responses\",\n\t\tquery_params: null,\n\t\thttp_headers: { version: \"codex-assistant\" },\n\t\tenv_http_headers: {\n\t\t\t\"OpenAI-Organization\": \"OPENAI_ORGANIZATION\",\n\t\t\t\"OpenAI-Project\": \"OPENAI_PROJECT\",\n\t\t},\n\t\trequest_max_retries: null,\n\t\tstream_max_retries: null,\n\t\tstream_idle_timeout_ms: null,\n\t\twebsocket_connect_timeout_ms: null,\n\t\trequires_openai_auth: true,\n\t\tsupports_websockets: true,\n\t};\n}\n\nexport function createChatgptCodexModelProviderInfo(): ModelProviderInfo {\n\treturn {\n\t\t...createOpenAiModelProviderInfo(CHATGPT_CODEX_BASE_URL),\n\t\tname: CHATGPT_CODEX_PROVIDER_NAME,\n\t\tsupports_websockets: false,\n\t};\n}\n\nexport function validateModelProviderInfo(provider: ModelProviderInfo): void {\n\tconst wireApi = (provider as { wire_api?: unknown }).wire_api ?? \"responses\";\n\tif (wireApi === \"chat\") {\n\t\tthrow new Error(\n\t\t\t'`wire_api = \"chat\"` is no longer supported. Set `wire_api = \"responses\"`.',\n\t\t);\n\t}\n\tif (wireApi !== \"responses\") {\n\t\tthrow new Error(`unknown wire_api: ${String(wireApi)}`);\n\t}\n\tif (provider.aws) {\n\t\tconst conflicts = conflictFields(provider, [\n\t\t\t\"env_key\",\n\t\t\t\"experimental_bearer_token\",\n\t\t\t\"auth\",\n\t\t\t\"requires_openai_auth\",\n\t\t]);\n\t\tif (provider.supports_websockets) {\n\t\t\tconflicts.push(\"supports_websockets\");\n\t\t}\n\t\tif (conflicts.length > 0) {\n\t\t\tthrow new Error(`provider aws cannot be combined with ${conflicts.join(\", \")}`);\n\t\t}\n\t}\n\tif (provider.auth) {\n\t\tif (!provider.auth.command.trim()) {\n\t\t\tthrow new Error(\"provider auth.command must not be empty\");\n\t\t}\n\t\tconst conflicts = conflictFields(provider, [\n\t\t\t\"env_key\",\n\t\t\t\"experimental_bearer_token\",\n\t\t\t\"requires_openai_auth\",\n\t\t]);\n\t\tif (conflicts.length > 0) {\n\t\t\tthrow new Error(`provider auth cannot be combined with ${conflicts.join(\", \")}`);\n\t\t}\n\t}\n}\n\nexport class ConfiguredModelProvider implements ModelProvider {\n\tprivate readonly providerInfo: ModelProviderInfo;\n\tprivate readonly accountState: ProviderAccountState;\n\tprivate readonly providerCapabilities: ProviderCapabilities;\n\tprivate readonly manager: ModelsManager;\n\n\tconstructor(input: {\n\t\tinfo: ModelProviderInfo;\n\t\taccount_state?: ProviderAccountState;\n\t\tcapabilities?: ProviderCapabilities;\n\t\tmodels_manager?: ModelsManager;\n\t}) {\n\t\tvalidateModelProviderInfo(input.info);\n\t\tthis.providerInfo = { ...input.info, wire_api: input.info.wire_api ?? \"responses\" };\n\t\tthis.accountState =\n\t\t\tinput.account_state ??\n\t\t\t({\n\t\t\t\taccount: null,\n\t\t\t\trequires_openai_auth: this.providerInfo.requires_openai_auth ?? false,\n\t\t\t} satisfies ProviderAccountState);\n\t\tthis.providerCapabilities = input.capabilities ?? defaultProviderCapabilities;\n\t\tthis.manager = input.models_manager ?? new StaticModelsManager();\n\t}\n\n\tinfo(): ModelProviderInfo {\n\t\treturn this.providerInfo;\n\t}\n\n\taccount_state(): ProviderAccountState {\n\t\treturn this.accountState;\n\t}\n\n\tcapabilities(): ProviderCapabilities {\n\t\treturn this.providerCapabilities;\n\t}\n\n\truntime_config(auth?: CodexAuth | null): ProviderRuntimeConfig {\n\t\treturn providerRuntimeConfig(this.providerInfo, auth ?? null);\n\t}\n\n\tmodels_manager(): ModelsManager {\n\t\treturn this.manager;\n\t}\n}\n\nexport class StaticModelsManager implements ModelsManager {\n\tprivate readonly models: ModelInfo[];\n\n\tconstructor(models: ModelInfo[] = defaultCodexModelInfo()) {\n\t\tthis.models = [...models];\n\t}\n\n\tlist_models(params: ModelListParams = {}): ModelListResponse {\n\t\tconst presets = this.build_available_models();\n\t\tconst visible = params.include_hidden\n\t\t\t? presets\n\t\t\t: presets.filter((model) => !model.hidden);\n\t\tconst total = visible.length;\n\t\tconst limit = Math.max(1, Math.min(total || 1, params.limit ?? (total || 1)));\n\t\tconst start = params.cursor ? Number.parseInt(params.cursor, 10) : 0;\n\n\t\tif (!Number.isInteger(start) || start < 0 || start > total) {\n\t\t\tthrow new Error(`invalid cursor: ${params.cursor}`);\n\t\t}\n\n\t\tconst end = Math.min(total, start + limit);\n\t\treturn {\n\t\t\tdata: visible.slice(start, end),\n\t\t\tnext_cursor: end < total ? String(end) : null,\n\t\t};\n\t}\n\n\traw_model_catalog(): { models: ModelInfo[] } {\n\t\treturn { models: [...this.models] };\n\t}\n\n\tget_model_info(model: string): ModelInfo {\n\t\treturn (\n\t\t\tfindModelByLongestPrefix(model, this.models) ??\n\t\t\tfindModelByNamespacedSuffix(model, this.models) ??\n\t\t\tmodelInfoFromSlug(model)\n\t\t);\n\t}\n\n\tget_default_model(model?: string | null): string {\n\t\tif (model) {\n\t\t\treturn model;\n\t\t}\n\t\tconst selected = this.build_available_models().find((preset) => preset.is_default);\n\t\treturn selected?.model ?? this.build_available_models()[0]?.model ?? defaultCodexModel;\n\t}\n\n\tdefault_reasoning_effort(model?: string | null): string {\n\t\tconst info = this.get_model_info(this.get_default_model(model));\n\t\treturn info.default_reasoning_level ?? defaultCodexReasoningEffort;\n\t}\n\n\tprivate build_available_models(): ModelPreset[] {\n\t\tconst sorted = [...this.models].sort((left, right) => left.priority - right.priority);\n\t\tconst presets = sorted.map(modelInfoToPreset);\n\t\tmarkDefaultByPickerVisibility(presets);\n\t\treturn presets;\n\t}\n}\n\nexport function createModelProvider(input: {\n\tinfo?: ModelProviderInfo;\n\tauth?: CodexAuth | null;\n\taccount_state?: ProviderAccountState;\n\tcapabilities?: ProviderCapabilities;\n\tmodels_manager?: ModelsManager;\n} = {}): ModelProvider {\n\treturn new ConfiguredModelProvider({\n\t\tinfo: input.info ?? createOpenAiModelProviderInfo(),\n\t\taccount_state:\n\t\t\tinput.account_state ??\n\t\t\tcodexAuthToProviderAccountState(input.auth ?? null, true),\n\t\tcapabilities: input.capabilities,\n\t\tmodels_manager: input.models_manager,\n\t});\n}\n\nexport function defaultModelsManager(): ModelsManager {\n\treturn new StaticModelsManager();\n}\n\nexport function listDefaultCodexModels(\n\tparams: ModelListParams = {},\n): ModelListResponse {\n\treturn defaultModelsManager().list_models(params);\n}\n\nexport function defaultCodexModels(): Model[] {\n\treturn listDefaultCodexModels({ include_hidden: true }).data;\n}\n\nexport function defaultCodexModelInfo(): ModelInfo[] {\n\treturn [\n\t\t{\n\t\t\tslug: \"gpt-5.5\",\n\t\t\tdisplay_name: \"GPT-5.5\",\n\t\t\tdescription: \"Frontier model for complex planning and implementation.\",\n\t\t\tdefault_reasoning_level: defaultCodexReasoningEffort,\n\t\t\tsupported_reasoning_levels: reasoningOptions,\n\t\t\tvisibility: \"list\",\n\t\t\tsupported_in_api: true,\n\t\t\tpriority: 0,\n\t\t\tupgrade: null,\n\t\t\tupgrade_info: null,\n\t\t\tavailability_nux: null,\n\t\t\tinput_modalities: [\"text\", \"image\"],\n\t\t\tsupports_personality: true,\n\t\t\tadditional_speed_tiers: [],\n\t\t\tservice_tiers: [],\n\t\t\tbase_instructions: BASE_INSTRUCTIONS_DEFAULT,\n\t\t\tmodel_messages: null,\n\t\t\tcontext_window: 272_000,\n\t\t\tmax_context_window: null,\n\t\t\tauto_compact_token_limit: null,\n\t\t\teffective_context_window_percent: DEFAULT_EFFECTIVE_CONTEXT_WINDOW_PERCENT,\n\t\t},\n\t\t{\n\t\t\tslug: \"gpt-5.4\",\n\t\t\tdisplay_name: \"GPT-5.4\",\n\t\t\tdescription: \"Strong everyday model for coding and product work.\",\n\t\t\tdefault_reasoning_level: defaultCodexReasoningEffort,\n\t\t\tsupported_reasoning_levels: reasoningOptions,\n\t\t\tvisibility: \"list\",\n\t\t\tsupported_in_api: true,\n\t\t\tpriority: 1,\n\t\t\tupgrade: null,\n\t\t\tupgrade_info: null,\n\t\t\tavailability_nux: null,\n\t\t\tinput_modalities: [\"text\", \"image\"],\n\t\t\tsupports_personality: true,\n\t\t\tadditional_speed_tiers: [],\n\t\t\tservice_tiers: [],\n\t\t\tbase_instructions: BASE_INSTRUCTIONS_DEFAULT,\n\t\t\tmodel_messages: null,\n\t\t\tcontext_window: 272_000,\n\t\t\tmax_context_window: null,\n\t\t\tauto_compact_token_limit: null,\n\t\t\teffective_context_window_percent: DEFAULT_EFFECTIVE_CONTEXT_WINDOW_PERCENT,\n\t\t},\n\t\t{\n\t\t\tslug: \"gpt-5.4-mini\",\n\t\t\tdisplay_name: \"GPT-5.4 Mini\",\n\t\t\tdescription: \"Faster, smaller model for simple chat and iteration.\",\n\t\t\tdefault_reasoning_level: defaultCodexReasoningEffort,\n\t\t\tsupported_reasoning_levels: reasoningOptions.filter(\n\t\t\t\t(option) => option.reasoning_effort !== \"xhigh\",\n\t\t\t),\n\t\t\tvisibility: \"list\",\n\t\t\tsupported_in_api: true,\n\t\t\tpriority: 2,\n\t\t\tupgrade: null,\n\t\t\tupgrade_info: null,\n\t\t\tavailability_nux: null,\n\t\t\tinput_modalities: [\"text\", \"image\"],\n\t\t\tsupports_personality: true,\n\t\t\tadditional_speed_tiers: [],\n\t\t\tservice_tiers: [],\n\t\t\tbase_instructions: BASE_INSTRUCTIONS_DEFAULT,\n\t\t\tmodel_messages: null,\n\t\t\tcontext_window: 128_000,\n\t\t\tmax_context_window: null,\n\t\t\tauto_compact_token_limit: null,\n\t\t\teffective_context_window_percent: DEFAULT_EFFECTIVE_CONTEXT_WINDOW_PERCENT,\n\t\t},\n\t];\n}\n\nexport function defaultModelProviderAccountState(): ProviderAccountState {\n\treturn {\n\t\taccount: null,\n\t\trequires_openai_auth: true,\n\t};\n}\n\nexport function apiKeyProviderAccountState(): ProviderAccountState {\n\treturn {\n\t\taccount: { type: AuthMode.ApiKey },\n\t\trequires_openai_auth: true,\n\t};\n}\n\nexport function providerRuntimeConfig(\n\tprovider: ModelProviderInfo,\n\tauth: CodexAuth | null,\n): ProviderRuntimeConfig {\n\tvalidateModelProviderInfo(provider);\n\tconst baseUrl =\n\t\tprovider.base_url ??\n\t\t(auth?.type === AuthMode.Chatgpt\n\t\t\t? CHATGPT_CODEX_BASE_URL\n\t\t\t: OPENAI_RESPONSES_BASE_URL);\n\tconst headers = {\n\t\t...(provider.http_headers ?? {}),\n\t};\n\treturn {\n\t\tname: provider.name,\n\t\tbase_url: baseUrl,\n\t\tresponses_url: `${baseUrl.replace(/\\/$/, \"\")}/responses`,\n\t\tquery_params: provider.query_params ?? null,\n\t\theaders,\n\t\trequest_max_retries: clampRetry(\n\t\t\tprovider.request_max_retries,\n\t\t\tdefaultRequestMaxRetries,\n\t\t\tmaxRequestMaxRetries,\n\t\t),\n\t\tstream_max_retries: clampRetry(\n\t\t\tprovider.stream_max_retries,\n\t\t\tdefaultStreamMaxRetries,\n\t\t\tmaxStreamMaxRetries,\n\t\t),\n\t\tstream_idle_timeout_ms:\n\t\t\tprovider.stream_idle_timeout_ms ?? defaultStreamIdleTimeoutMs,\n\t\twebsocket_connect_timeout_ms:\n\t\t\tprovider.websocket_connect_timeout_ms ?? defaultWebsocketConnectTimeoutMs,\n\t\tsupports_websockets: provider.supports_websockets ?? false,\n\t};\n}\n\nexport function modelInfoToPreset(info: ModelInfo): ModelPreset {\n\treturn {\n\t\tid: info.slug,\n\t\tmodel: info.slug,\n\t\tupgrade: info.upgrade,\n\t\tupgrade_info: info.upgrade_info,\n\t\tavailability_nux: info.availability_nux,\n\t\tdisplay_name: info.display_name,\n\t\tdescription: info.description ?? info.display_name,\n\t\thidden: info.visibility !== \"list\",\n\t\tsupported_reasoning_efforts: info.supported_reasoning_levels,\n\t\tdefault_reasoning_effort:\n\t\t\tinfo.default_reasoning_level ?? defaultCodexReasoningEffort,\n\t\tinput_modalities: info.input_modalities,\n\t\tsupports_personality: info.supports_personality,\n\t\tadditional_speed_tiers: info.additional_speed_tiers,\n\t\tservice_tiers: info.service_tiers,\n\t\tis_default: false,\n\t\tsupported_in_api: info.supported_in_api,\n\t};\n}\n\nexport function modelInfoFromSlug(slug: string): ModelInfo {\n\tconst known = defaultCodexModelInfo().find((model) => model.slug === slug);\n\tif (known) {\n\t\treturn known;\n\t}\n\treturn {\n\t\tslug,\n\t\tdisplay_name: slug,\n\t\tdescription: null,\n\t\tdefault_reasoning_level: defaultCodexReasoningEffort,\n\t\tsupported_reasoning_levels: reasoningOptions,\n\t\tvisibility: \"none\",\n\t\tsupported_in_api: true,\n\t\tpriority: 99,\n\t\tupgrade: null,\n\t\tupgrade_info: null,\n\t\tavailability_nux: null,\n\t\tinput_modalities: [\"text\", \"image\"],\n\t\tsupports_personality: false,\n\t\tadditional_speed_tiers: [],\n\t\tservice_tiers: [],\n\t\tbase_instructions: BASE_INSTRUCTIONS_DEFAULT,\n\t\tmodel_messages: null,\n\t\tcontext_window: null,\n\t\tmax_context_window: null,\n\t\tauto_compact_token_limit: null,\n\t\teffective_context_window_percent: DEFAULT_EFFECTIVE_CONTEXT_WINDOW_PERCENT,\n\t};\n}\n\nexport function isReasoningEffortSupported(\n\tmodel: string,\n\teffort: string | null | undefined,\n\tmanager: ModelsManager = defaultModelsManager(),\n): boolean {\n\tif (!effort) {\n\t\treturn false;\n\t}\n\treturn manager\n\t\t.get_model_info(model)\n\t\t.supported_reasoning_levels.some((option) => option.reasoning_effort === effort);\n}\n\nexport function resolveReasoningEffortForModel(\n\tmodel: string,\n\teffort: string | null | undefined,\n\tmanager: ModelsManager = defaultModelsManager(),\n): string {\n\treturn isReasoningEffortSupported(model, effort, manager)\n\t\t? effort!\n\t\t: manager.default_reasoning_effort(model);\n}\n\nfunction codexAuthToProviderAccountState(\n\tauth: CodexAuth | null,\n\trequiresOpenAiAuth: boolean,\n): ProviderAccountState {\n\tif (!auth) {\n\t\treturn { account: null, requires_openai_auth: requiresOpenAiAuth };\n\t}\n\tif (auth.type === AuthMode.ApiKey) {\n\t\treturn apiKeyProviderAccountState();\n\t}\n\tconst email = auth.email;\n\tconst planType = auth.plan_type;\n\treturn {\n\t\taccount:\n\t\t\temail && planType\n\t\t\t\t? { type: AuthMode.Chatgpt, email, plan_type: planType }\n\t\t\t\t: null,\n\t\trequires_openai_auth: requiresOpenAiAuth,\n\t};\n}\n\nfunction conflictFields(\n\tprovider: ModelProviderInfo,\n\tfields: Array<keyof ModelProviderInfo>,\n): string[] {\n\treturn fields.filter((field) => {\n\t\tconst value = provider[field];\n\t\treturn value !== undefined && value !== null && value !== false;\n\t});\n}\n\nfunction clampRetry(value: number | null | undefined, fallback: number, max: number): number {\n\treturn Math.min(Math.max(0, value ?? fallback), max);\n}\n\nfunction markDefaultByPickerVisibility(presets: ModelPreset[]): void {\n\tfor (const preset of presets) {\n\t\tpreset.is_default = false;\n\t}\n\tconst visibleDefault =\n\t\tpresets.find((preset) => preset.model === defaultCodexModel && !preset.hidden) ??\n\t\tpresets.find((preset) => !preset.hidden) ??\n\t\tpresets[0];\n\tif (visibleDefault) {\n\t\tvisibleDefault.is_default = true;\n\t}\n}\n\nfunction findModelByLongestPrefix(\n\tmodel: string,\n\tcandidates: readonly ModelInfo[],\n): ModelInfo | null {\n\tlet best: ModelInfo | null = null;\n\tfor (const candidate of candidates) {\n\t\tif (!model.startsWith(candidate.slug)) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (!best || candidate.slug.length > best.slug.length) {\n\t\t\tbest = candidate;\n\t\t}\n\t}\n\treturn best;\n}\n\nfunction findModelByNamespacedSuffix(\n\tmodel: string,\n\tcandidates: readonly ModelInfo[],\n): ModelInfo | null {\n\tconst [namespace, suffix, extra] = model.split(\"/\");\n\tif (!namespace || !suffix || extra) {\n\t\treturn null;\n\t}\n\tif (!/^[A-Za-z0-9_-]+$/.test(namespace)) {\n\t\treturn null;\n\t}\n\treturn findModelByLongestPrefix(suffix, candidates);\n}\n\nfunction finitePositiveInteger(value: number | null | undefined): number | null {\n\tif (typeof value !== \"number\" || !Number.isFinite(value) || value <= 0) {\n\t\treturn null;\n\t}\n\treturn Math.trunc(value);\n}\n"]}