ai-sdk-provider-codex-cli 1.1.0 → 1.2.1

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.
package/README.md CHANGED
@@ -10,7 +10,7 @@
10
10
  [![PRs welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](https://github.com/ben-vargas/ai-sdk-provider-codex-cli/issues)
11
11
  [![Latest Release](https://img.shields.io/github/v/release/ben-vargas/ai-sdk-provider-codex-cli?display_name=tag)](https://github.com/ben-vargas/ai-sdk-provider-codex-cli/releases/latest)
12
12
 
13
- A community provider for Vercel AI SDK v6 that integrates OpenAI's Codex CLI with GPT‑5.1 / GPT‑5.2 class models (`gpt-5.1`, `gpt-5.2`, the Codex-specific `gpt-5.3-codex` / `gpt-5.2-codex`, the flagship `*-codex-max`, and the lightweight `*-codex-mini` slugs) using your ChatGPT Plus/Pro subscription.
13
+ A community provider for Vercel AI SDK v6 that integrates OpenAI's Codex CLI with current GPT models such as `gpt-5.5`, `gpt-5.2`, and `gpt-5.1`, plus Codex-specific slugs like `gpt-5.3-codex`, `gpt-5.2-codex`, `*-codex-max`, and `*-codex-mini`, using your ChatGPT Plus/Pro subscription.
14
14
 
15
15
  This package ships two provider modes:
16
16
 
@@ -54,7 +54,7 @@ npm i ai ai-sdk-provider-codex-cli
54
54
  npm i ai@^5.0.0 ai-sdk-provider-codex-cli@ai-sdk-v5
55
55
  ```
56
56
 
57
- > **⚠️ Codex CLI Version**: Requires Codex CLI **>= 0.105.0** for full support of both provider modes (`codexExec` and `codexAppServer`). If you supply your own Codex CLI (global install or custom `codexPath`), check it with `codex --version` and upgrade if needed. The optional dependency `@openai/codex` in this package pulls a compatible version automatically.
57
+ > **⚠️ Codex CLI Version**: Requires the current stable Codex CLI **0.130.x** for full support of both provider modes (`codexExec` and `codexAppServer`). This package pins its optional `@openai/codex` dependency to `^0.130.0`, the latest non-alpha release validated for this maintenance update. If you supply your own Codex CLI (global install or custom `codexPath`), check it with `codex --version` and upgrade if needed.
58
58
  >
59
59
  > ```bash
60
60
  > npm i -g @openai/codex@latest
@@ -68,7 +68,7 @@ npm i ai@^5.0.0 ai-sdk-provider-codex-cli@ai-sdk-v5
68
68
  import { generateText } from 'ai';
69
69
  import { codexExec } from 'ai-sdk-provider-codex-cli';
70
70
 
71
- const model = codexExec('gpt-5.3-codex', {
71
+ const model = codexExec('gpt-5.5', {
72
72
  allowNpx: true,
73
73
  skipGitRepoCheck: true,
74
74
  approvalMode: 'on-failure',
@@ -90,14 +90,14 @@ import { createCodexAppServer } from 'ai-sdk-provider-codex-cli';
90
90
 
91
91
  const provider = createCodexAppServer({
92
92
  defaultSettings: {
93
- minCodexVersion: '0.105.0',
93
+ minCodexVersion: '0.130.0',
94
94
  autoApprove: false,
95
95
  personality: 'pragmatic',
96
96
  },
97
97
  });
98
98
 
99
99
  const { textStream } = await streamText({
100
- model: provider('gpt-5.3-codex'),
100
+ model: provider('gpt-5.5'),
101
101
  prompt: 'Write two short lines of encouragement.',
102
102
  });
103
103
  for await (const chunk of textStream) process.stdout.write(chunk);
@@ -107,7 +107,7 @@ await provider.close();
107
107
 
108
108
  ### App-server stateful threads (optional)
109
109
 
110
- By default, `codexAppServer` is stateless (new ephemeral thread per call). To continue a prior conversation, pass `threadId` in `providerOptions['codex-app-server']`.
110
+ By default, `codexAppServer` is stateless (new ephemeral thread per call). To continue a prior conversation across calls, start a persistent thread and then pass its `threadId` in `providerOptions['codex-app-server']`.
111
111
 
112
112
  ```js
113
113
  import { generateText } from 'ai';
@@ -116,14 +116,17 @@ import { createCodexAppServer } from 'ai-sdk-provider-codex-cli';
116
116
  const provider = createCodexAppServer();
117
117
 
118
118
  const first = await generateText({
119
- model: provider('gpt-5.3-codex'),
119
+ model: provider('gpt-5.5'),
120
120
  prompt: 'Start a migration checklist.',
121
+ providerOptions: {
122
+ 'codex-app-server': { threadMode: 'persistent' },
123
+ },
121
124
  });
122
125
 
123
126
  const threadId = first.providerMetadata?.['codex-app-server']?.threadId;
124
127
 
125
128
  const second = await generateText({
126
- model: provider('gpt-5.3-codex'),
129
+ model: provider('gpt-5.5'),
127
130
  prompt: 'Continue from step 2.',
128
131
  providerOptions: {
129
132
  'codex-app-server': { threadId },
@@ -142,7 +145,7 @@ import { codexExec } from 'ai-sdk-provider-codex-cli';
142
145
 
143
146
  const schema = z.object({ name: z.string(), age: z.number().int() });
144
147
  const { object } = await generateObject({
145
- model: codexExec('gpt-5.3-codex', { allowNpx: true, skipGitRepoCheck: true }),
148
+ model: codexExec('gpt-5.5', { allowNpx: true, skipGitRepoCheck: true }),
146
149
  schema,
147
150
  prompt: 'Generate a small user profile.',
148
151
  });
@@ -175,7 +178,7 @@ import { generateText } from 'ai';
175
178
  import { codexExec } from 'ai-sdk-provider-codex-cli';
176
179
  import { readFileSync } from 'fs';
177
180
 
178
- const model = codexExec('gpt-5.3-codex', { allowNpx: true, skipGitRepoCheck: true });
181
+ const model = codexExec('gpt-5.5', { allowNpx: true, skipGitRepoCheck: true });
179
182
  const imageBuffer = readFileSync('./screenshot.png');
180
183
 
181
184
  const { text } = await generateText({
@@ -217,7 +220,7 @@ import { streamText } from 'ai';
217
220
  import { codexExec } from 'ai-sdk-provider-codex-cli';
218
221
 
219
222
  const result = await streamText({
220
- model: codexExec('gpt-5.3-codex', { allowNpx: true, skipGitRepoCheck: true }),
223
+ model: codexExec('gpt-5.5', { allowNpx: true, skipGitRepoCheck: true }),
221
224
  prompt: 'List files and count lines in the largest one',
222
225
  });
223
226
 
@@ -253,20 +256,20 @@ Control logging verbosity and integrate with your observability stack:
253
256
  import { codexExec } from 'ai-sdk-provider-codex-cli';
254
257
 
255
258
  // Default: warn/error only (clean production output)
256
- const model = codexExec('gpt-5.3-codex', {
259
+ const model = codexExec('gpt-5.5', {
257
260
  allowNpx: true,
258
261
  skipGitRepoCheck: true,
259
262
  });
260
263
 
261
264
  // Verbose mode: enable debug/info logs for troubleshooting
262
- const verboseModel = codexExec('gpt-5.3-codex', {
265
+ const verboseModel = codexExec('gpt-5.5', {
263
266
  allowNpx: true,
264
267
  skipGitRepoCheck: true,
265
268
  verbose: true, // Shows all log levels
266
269
  });
267
270
 
268
271
  // Custom logger: integrate with Winston, Pino, Datadog, etc.
269
- const customModel = codexExec('gpt-5.3-codex', {
272
+ const customModel = codexExec('gpt-5.5', {
270
273
  allowNpx: true,
271
274
  skipGitRepoCheck: true,
272
275
  verbose: true,
@@ -279,7 +282,7 @@ const customModel = codexExec('gpt-5.3-codex', {
279
282
  });
280
283
 
281
284
  // Silent: disable all logging
282
- const silentModel = codexExec('gpt-5.3-codex', {
285
+ const silentModel = codexExec('gpt-5.5', {
283
286
  allowNpx: true,
284
287
  skipGitRepoCheck: true,
285
288
  logger: false, // No logs at all
@@ -388,7 +391,7 @@ Control reasoning effort, verbosity, and advanced Codex features at model creati
388
391
  ```ts
389
392
  import { codexExec } from 'ai-sdk-provider-codex-cli';
390
393
 
391
- const model = codexExec('gpt-5.3-codex', {
394
+ const model = codexExec('gpt-5.5', {
392
395
  allowNpx: true,
393
396
  skipGitRepoCheck: true,
394
397
  addDirs: ['../shared'],
@@ -442,7 +445,7 @@ values take precedence over constructor defaults while leaving other settings in
442
445
  import { generateText } from 'ai';
443
446
  import { codexExec } from 'ai-sdk-provider-codex-cli';
444
447
 
445
- const model = codexExec('gpt-5.3-codex', {
448
+ const model = codexExec('gpt-5.5', {
446
449
  allowNpx: true,
447
450
  reasoningEffort: 'medium',
448
451
  modelVerbosity: 'medium',
@@ -482,7 +485,7 @@ import { createCodexAppServer } from 'ai-sdk-provider-codex-cli';
482
485
  const appServerProvider = createCodexAppServer();
483
486
 
484
487
  const response = await generateText({
485
- model: appServerProvider('gpt-5.3-codex'),
488
+ model: appServerProvider('gpt-5.5'),
486
489
  prompt: 'Continue this task.',
487
490
  providerOptions: {
488
491
  'codex-app-server': {
package/dist/index.cjs CHANGED
@@ -1056,6 +1056,25 @@ function mergeStringRecord(base, override) {
1056
1056
  if (base) return { ...base };
1057
1057
  return void 0;
1058
1058
  }
1059
+ function omitAuthorizationHeader(headers) {
1060
+ if (headers === void 0) return void 0;
1061
+ return Object.fromEntries(
1062
+ Object.entries(headers).filter(([key]) => key.toLowerCase() !== "authorization")
1063
+ );
1064
+ }
1065
+ function mcpHttpHeadersWithBearerToken(server) {
1066
+ const headers = server.httpHeaders ? { ...server.httpHeaders } : void 0;
1067
+ if (server.bearerToken === void 0) {
1068
+ return headers;
1069
+ }
1070
+ const hasAuthorizationHeader = Object.keys(headers ?? {}).some(
1071
+ (key) => key.toLowerCase() === "authorization"
1072
+ );
1073
+ return {
1074
+ ...headers ?? {},
1075
+ ...hasAuthorizationHeader ? {} : { Authorization: `Bearer ${server.bearerToken}` }
1076
+ };
1077
+ }
1059
1078
  function mergeSingleMcpServer(existing, incoming) {
1060
1079
  if (!existing || existing.transport !== incoming.transport) {
1061
1080
  return { ...incoming };
@@ -1080,12 +1099,13 @@ function mergeSingleMcpServer(existing, incoming) {
1080
1099
  const hasIncomingAuth = incoming.bearerToken !== void 0 || incoming.bearerTokenEnvVar !== void 0;
1081
1100
  const bearerToken = hasIncomingAuth ? incoming.bearerToken : baseHttp.bearerToken;
1082
1101
  const bearerTokenEnvVar = hasIncomingAuth ? incoming.bearerTokenEnvVar : baseHttp.bearerTokenEnvVar;
1102
+ const baseHttpHeaders = hasIncomingAuth ? omitAuthorizationHeader(baseHttp.httpHeaders) : baseHttp.httpHeaders;
1083
1103
  const result = {
1084
1104
  transport: "http",
1085
1105
  url: incoming.url,
1086
1106
  bearerToken,
1087
1107
  bearerTokenEnvVar,
1088
- httpHeaders: mergeStringRecord(baseHttp.httpHeaders, incoming.httpHeaders),
1108
+ httpHeaders: mergeStringRecord(baseHttpHeaders, incoming.httpHeaders),
1089
1109
  envHttpHeaders: mergeStringRecord(baseHttp.envHttpHeaders, incoming.envHttpHeaders),
1090
1110
  enabled: incoming.enabled ?? existing.enabled,
1091
1111
  startupTimeoutSec: incoming.startupTimeoutSec ?? existing.startupTimeoutSec,
@@ -1171,13 +1191,11 @@ function mcpServersToConfigOverrides(mcpServers, rmcpClient) {
1171
1191
  if (server.cwd) setOverride(`${prefix}.cwd`, server.cwd);
1172
1192
  } else {
1173
1193
  setOverride(`${prefix}.url`, server.url);
1174
- if (server.bearerToken !== void 0)
1175
- setOverride(`${prefix}.bearer_token`, server.bearerToken);
1176
1194
  if (server.bearerTokenEnvVar !== void 0) {
1177
1195
  setOverride(`${prefix}.bearer_token_env_var`, server.bearerTokenEnvVar);
1178
1196
  }
1179
- if (server.httpHeaders !== void 0)
1180
- setOverride(`${prefix}.http_headers`, server.httpHeaders);
1197
+ const httpHeaders = mcpHttpHeadersWithBearerToken(server);
1198
+ if (httpHeaders !== void 0) setOverride(`${prefix}.http_headers`, httpHeaders);
1181
1199
  if (server.envHttpHeaders !== void 0) {
1182
1200
  setOverride(`${prefix}.env_http_headers`, server.envHttpHeaders);
1183
1201
  }
@@ -1418,12 +1436,11 @@ var ExecLanguageModel = class {
1418
1436
  if (server.cwd) this.addConfigOverride(args, `${prefix}.cwd`, server.cwd);
1419
1437
  } else {
1420
1438
  this.addConfigOverride(args, `${prefix}.url`, server.url);
1421
- if (server.bearerToken !== void 0)
1422
- this.addConfigOverride(args, `${prefix}.bearer_token`, server.bearerToken);
1423
1439
  if (server.bearerTokenEnvVar)
1424
1440
  this.addConfigOverride(args, `${prefix}.bearer_token_env_var`, server.bearerTokenEnvVar);
1425
- if (server.httpHeaders !== void 0)
1426
- this.addConfigOverride(args, `${prefix}.http_headers`, server.httpHeaders);
1441
+ const httpHeaders = mcpHttpHeadersWithBearerToken(server);
1442
+ if (httpHeaders !== void 0)
1443
+ this.addConfigOverride(args, `${prefix}.http_headers`, httpHeaders);
1427
1444
  if (server.envHttpHeaders !== void 0)
1428
1445
  this.addConfigOverride(args, `${prefix}.env_http_headers`, server.envHttpHeaders);
1429
1446
  }
@@ -1606,7 +1623,13 @@ var ExecLanguageModel = class {
1606
1623
  }
1607
1624
  emitToolInvocation(controller, toolCallId, toolName, inputPayload) {
1608
1625
  const inputString = safeStringify(inputPayload);
1609
- controller.enqueue({ type: "tool-input-start", id: toolCallId, toolName });
1626
+ controller.enqueue({
1627
+ type: "tool-input-start",
1628
+ id: toolCallId,
1629
+ toolName,
1630
+ providerExecuted: true,
1631
+ dynamic: true
1632
+ });
1610
1633
  if (inputString) {
1611
1634
  controller.enqueue({ type: "tool-input-delta", id: toolCallId, delta: inputString });
1612
1635
  }
@@ -1616,7 +1639,8 @@ var ExecLanguageModel = class {
1616
1639
  toolCallId,
1617
1640
  toolName,
1618
1641
  input: inputString,
1619
- providerExecuted: true
1642
+ providerExecuted: true,
1643
+ dynamic: true
1620
1644
  });
1621
1645
  }
1622
1646
  emitToolResult(controller, toolCallId, toolName, item, resultPayload, metadata) {
@@ -1644,6 +1668,7 @@ var ExecLanguageModel = class {
1644
1668
  toolCallId,
1645
1669
  toolName,
1646
1670
  result: resultPayload ?? {},
1671
+ dynamic: true,
1647
1672
  ...isError ? { isError: true } : {},
1648
1673
  ...Object.keys(providerMetadataEntries).length ? { providerMetadata: { "codex-cli": providerMetadataEntries } } : {}
1649
1674
  });
@@ -2302,10 +2327,10 @@ function normalizeItemType(type) {
2302
2327
  function mapTool(item) {
2303
2328
  const type = normalizeItemType(item.type);
2304
2329
  if (type === "commandexecution") {
2305
- return { toolName: "exec" };
2330
+ return { toolName: "exec", dynamic: true };
2306
2331
  }
2307
2332
  if (type === "filechange") {
2308
- return { toolName: "patch" };
2333
+ return { toolName: "patch", dynamic: true };
2309
2334
  }
2310
2335
  if (type === "mcptoolcall") {
2311
2336
  const server = typeof item.server === "string" ? item.server || "server" : "server";
@@ -2316,7 +2341,7 @@ function mapTool(item) {
2316
2341
  };
2317
2342
  }
2318
2343
  if (type === "websearch") {
2319
- return { toolName: "web_search" };
2344
+ return { toolName: "web_search", dynamic: true };
2320
2345
  }
2321
2346
  return void 0;
2322
2347
  }
@@ -2383,7 +2408,8 @@ function createNotificationHandlers(context) {
2383
2408
  context.emitter.emitToolOutputDelta(
2384
2409
  itemId,
2385
2410
  tracked?.toolName ?? defaultToolName,
2386
- params.delta
2411
+ params.delta,
2412
+ tracked?.dynamic ?? true
2387
2413
  );
2388
2414
  };
2389
2415
  return {
@@ -2612,6 +2638,8 @@ var AppServerStreamEmitter = class {
2612
2638
  this.options = options;
2613
2639
  this.jsonModeLastTextBlockOnly = Boolean(options.jsonModeLastTextBlockOnly);
2614
2640
  }
2641
+ controller;
2642
+ options;
2615
2643
  textId;
2616
2644
  reasoningId;
2617
2645
  jsonModeLastTextBlockOnly;
@@ -2713,7 +2741,7 @@ var AppServerStreamEmitter = class {
2713
2741
  ...dynamic ? { dynamic: true } : {}
2714
2742
  });
2715
2743
  }
2716
- emitToolOutputDelta(toolCallId, toolName, delta) {
2744
+ emitToolOutputDelta(toolCallId, toolName, delta, dynamic) {
2717
2745
  this.safeEnqueue({
2718
2746
  type: "tool-result",
2719
2747
  toolCallId,
@@ -2722,7 +2750,8 @@ var AppServerStreamEmitter = class {
2722
2750
  result: {
2723
2751
  type: "output-delta",
2724
2752
  delta
2725
- }
2753
+ },
2754
+ ...dynamic ? { dynamic: true } : {}
2726
2755
  });
2727
2756
  }
2728
2757
  emitToolResult(toolCallId, toolName, result, dynamic, isError) {
@@ -2848,6 +2877,7 @@ var TurnStreamController = class {
2848
2877
  constructor(options) {
2849
2878
  this.options = options;
2850
2879
  }
2880
+ options;
2851
2881
  state = "created";
2852
2882
  usage = createEmptyCodexUsage();
2853
2883
  turnId;
@@ -3305,7 +3335,7 @@ async function createLocalMcpServer(options) {
3305
3335
  }
3306
3336
 
3307
3337
  // src/tools/sdk-mcp-server.ts
3308
- var SDK_MCP_SERVER_MARKER = Symbol.for("ai-sdk-provider-codex-cli.sdkMcpServer");
3338
+ var SDK_MCP_SERVER_MARKER = /* @__PURE__ */ Symbol.for("ai-sdk-provider-codex-cli.sdkMcpServer");
3309
3339
  function createSdkMcpServer(options) {
3310
3340
  const { name, cacheKey, tools } = options;
3311
3341
  let server;
@@ -4617,7 +4647,7 @@ var AppServerRpcClient = class extends events.EventEmitter {
4617
4647
  if (this.serverCapabilities?.modelList === false) {
4618
4648
  throw new UnsupportedFeatureError({
4619
4649
  feature: "model/list",
4620
- minCodexVersion: this.settings.minCodexVersion ?? "0.105.0",
4650
+ minCodexVersion: this.settings.minCodexVersion ?? "0.130.0",
4621
4651
  serverVersion: this.serverVersion
4622
4652
  });
4623
4653
  }
@@ -4630,7 +4660,7 @@ var AppServerRpcClient = class extends events.EventEmitter {
4630
4660
  if (error instanceof JsonRpcRequestError && error.code === -32601) {
4631
4661
  throw new UnsupportedFeatureError({
4632
4662
  feature: "model/list",
4633
- minCodexVersion: this.settings.minCodexVersion ?? "0.105.0",
4663
+ minCodexVersion: this.settings.minCodexVersion ?? "0.130.0",
4634
4664
  serverVersion: this.serverVersion
4635
4665
  });
4636
4666
  }
@@ -4787,7 +4817,7 @@ var AppServerRpcClient = class extends events.EventEmitter {
4787
4817
  const message = String(error?.message ?? error);
4788
4818
  if (message.includes("ENOENT") || message.includes("unknown subcommand")) {
4789
4819
  throw new Error(
4790
- "codex app-server requires codex CLI >= 0.105.0. Run 'codex --version' to check."
4820
+ "codex app-server requires codex CLI >= 0.130.0. Run 'codex --version' to check."
4791
4821
  );
4792
4822
  }
4793
4823
  throw createAPICallError({
@@ -4809,7 +4839,7 @@ var AppServerRpcClient = class extends events.EventEmitter {
4809
4839
  return;
4810
4840
  }
4811
4841
  this.serverVersion = detected;
4812
- const minVersion = this.settings.minCodexVersion ?? "0.105.0";
4842
+ const minVersion = this.settings.minCodexVersion ?? "0.130.0";
4813
4843
  const compared = compareSemver(detected, minVersion);
4814
4844
  if (compared === void 0) {
4815
4845
  this.logger.warn(
package/dist/index.d.cts CHANGED
@@ -13,7 +13,7 @@ interface Logger {
13
13
  /**
14
14
  * Known Codex-capable model IDs with string fallback for forward compatibility.
15
15
  */
16
- type CodexModelId = 'gpt-5.3-codex' | 'gpt-5.2-codex' | 'gpt-5.2-codex-max' | 'gpt-5.2-codex-mini' | 'gpt-5.1' | 'gpt-5.2' | (string & {});
16
+ type CodexModelId = 'gpt-5.5' | 'gpt-5.3-codex' | 'gpt-5.2-codex' | 'gpt-5.2-codex-max' | 'gpt-5.2-codex-mini' | 'gpt-5.1' | 'gpt-5.2' | (string & {});
17
17
  type ApprovalMode = 'untrusted' | 'on-failure' | 'on-request' | 'never';
18
18
  type SandboxMode = 'read-only' | 'workspace-write' | 'danger-full-access';
19
19
  type ReasoningEffort = 'none' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh';
@@ -687,7 +687,7 @@ interface CodexAppServerProvider extends ProviderV3 {
687
687
  * @example
688
688
  * ```ts
689
689
  * const provider = createCodexAppServer({
690
- * defaultSettings: { minCodexVersion: '0.105.0-alpha.0' },
690
+ * defaultSettings: { minCodexVersion: '0.130.0' },
691
691
  * });
692
692
  *
693
693
  * try {
package/dist/index.d.ts CHANGED
@@ -13,7 +13,7 @@ interface Logger {
13
13
  /**
14
14
  * Known Codex-capable model IDs with string fallback for forward compatibility.
15
15
  */
16
- type CodexModelId = 'gpt-5.3-codex' | 'gpt-5.2-codex' | 'gpt-5.2-codex-max' | 'gpt-5.2-codex-mini' | 'gpt-5.1' | 'gpt-5.2' | (string & {});
16
+ type CodexModelId = 'gpt-5.5' | 'gpt-5.3-codex' | 'gpt-5.2-codex' | 'gpt-5.2-codex-max' | 'gpt-5.2-codex-mini' | 'gpt-5.1' | 'gpt-5.2' | (string & {});
17
17
  type ApprovalMode = 'untrusted' | 'on-failure' | 'on-request' | 'never';
18
18
  type SandboxMode = 'read-only' | 'workspace-write' | 'danger-full-access';
19
19
  type ReasoningEffort = 'none' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh';
@@ -687,7 +687,7 @@ interface CodexAppServerProvider extends ProviderV3 {
687
687
  * @example
688
688
  * ```ts
689
689
  * const provider = createCodexAppServer({
690
- * defaultSettings: { minCodexVersion: '0.105.0-alpha.0' },
690
+ * defaultSettings: { minCodexVersion: '0.130.0' },
691
691
  * });
692
692
  *
693
693
  * try {
package/dist/index.js CHANGED
@@ -1048,6 +1048,25 @@ function mergeStringRecord(base, override) {
1048
1048
  if (base) return { ...base };
1049
1049
  return void 0;
1050
1050
  }
1051
+ function omitAuthorizationHeader(headers) {
1052
+ if (headers === void 0) return void 0;
1053
+ return Object.fromEntries(
1054
+ Object.entries(headers).filter(([key]) => key.toLowerCase() !== "authorization")
1055
+ );
1056
+ }
1057
+ function mcpHttpHeadersWithBearerToken(server) {
1058
+ const headers = server.httpHeaders ? { ...server.httpHeaders } : void 0;
1059
+ if (server.bearerToken === void 0) {
1060
+ return headers;
1061
+ }
1062
+ const hasAuthorizationHeader = Object.keys(headers ?? {}).some(
1063
+ (key) => key.toLowerCase() === "authorization"
1064
+ );
1065
+ return {
1066
+ ...headers ?? {},
1067
+ ...hasAuthorizationHeader ? {} : { Authorization: `Bearer ${server.bearerToken}` }
1068
+ };
1069
+ }
1051
1070
  function mergeSingleMcpServer(existing, incoming) {
1052
1071
  if (!existing || existing.transport !== incoming.transport) {
1053
1072
  return { ...incoming };
@@ -1072,12 +1091,13 @@ function mergeSingleMcpServer(existing, incoming) {
1072
1091
  const hasIncomingAuth = incoming.bearerToken !== void 0 || incoming.bearerTokenEnvVar !== void 0;
1073
1092
  const bearerToken = hasIncomingAuth ? incoming.bearerToken : baseHttp.bearerToken;
1074
1093
  const bearerTokenEnvVar = hasIncomingAuth ? incoming.bearerTokenEnvVar : baseHttp.bearerTokenEnvVar;
1094
+ const baseHttpHeaders = hasIncomingAuth ? omitAuthorizationHeader(baseHttp.httpHeaders) : baseHttp.httpHeaders;
1075
1095
  const result = {
1076
1096
  transport: "http",
1077
1097
  url: incoming.url,
1078
1098
  bearerToken,
1079
1099
  bearerTokenEnvVar,
1080
- httpHeaders: mergeStringRecord(baseHttp.httpHeaders, incoming.httpHeaders),
1100
+ httpHeaders: mergeStringRecord(baseHttpHeaders, incoming.httpHeaders),
1081
1101
  envHttpHeaders: mergeStringRecord(baseHttp.envHttpHeaders, incoming.envHttpHeaders),
1082
1102
  enabled: incoming.enabled ?? existing.enabled,
1083
1103
  startupTimeoutSec: incoming.startupTimeoutSec ?? existing.startupTimeoutSec,
@@ -1163,13 +1183,11 @@ function mcpServersToConfigOverrides(mcpServers, rmcpClient) {
1163
1183
  if (server.cwd) setOverride(`${prefix}.cwd`, server.cwd);
1164
1184
  } else {
1165
1185
  setOverride(`${prefix}.url`, server.url);
1166
- if (server.bearerToken !== void 0)
1167
- setOverride(`${prefix}.bearer_token`, server.bearerToken);
1168
1186
  if (server.bearerTokenEnvVar !== void 0) {
1169
1187
  setOverride(`${prefix}.bearer_token_env_var`, server.bearerTokenEnvVar);
1170
1188
  }
1171
- if (server.httpHeaders !== void 0)
1172
- setOverride(`${prefix}.http_headers`, server.httpHeaders);
1189
+ const httpHeaders = mcpHttpHeadersWithBearerToken(server);
1190
+ if (httpHeaders !== void 0) setOverride(`${prefix}.http_headers`, httpHeaders);
1173
1191
  if (server.envHttpHeaders !== void 0) {
1174
1192
  setOverride(`${prefix}.env_http_headers`, server.envHttpHeaders);
1175
1193
  }
@@ -1410,12 +1428,11 @@ var ExecLanguageModel = class {
1410
1428
  if (server.cwd) this.addConfigOverride(args, `${prefix}.cwd`, server.cwd);
1411
1429
  } else {
1412
1430
  this.addConfigOverride(args, `${prefix}.url`, server.url);
1413
- if (server.bearerToken !== void 0)
1414
- this.addConfigOverride(args, `${prefix}.bearer_token`, server.bearerToken);
1415
1431
  if (server.bearerTokenEnvVar)
1416
1432
  this.addConfigOverride(args, `${prefix}.bearer_token_env_var`, server.bearerTokenEnvVar);
1417
- if (server.httpHeaders !== void 0)
1418
- this.addConfigOverride(args, `${prefix}.http_headers`, server.httpHeaders);
1433
+ const httpHeaders = mcpHttpHeadersWithBearerToken(server);
1434
+ if (httpHeaders !== void 0)
1435
+ this.addConfigOverride(args, `${prefix}.http_headers`, httpHeaders);
1419
1436
  if (server.envHttpHeaders !== void 0)
1420
1437
  this.addConfigOverride(args, `${prefix}.env_http_headers`, server.envHttpHeaders);
1421
1438
  }
@@ -1598,7 +1615,13 @@ var ExecLanguageModel = class {
1598
1615
  }
1599
1616
  emitToolInvocation(controller, toolCallId, toolName, inputPayload) {
1600
1617
  const inputString = safeStringify(inputPayload);
1601
- controller.enqueue({ type: "tool-input-start", id: toolCallId, toolName });
1618
+ controller.enqueue({
1619
+ type: "tool-input-start",
1620
+ id: toolCallId,
1621
+ toolName,
1622
+ providerExecuted: true,
1623
+ dynamic: true
1624
+ });
1602
1625
  if (inputString) {
1603
1626
  controller.enqueue({ type: "tool-input-delta", id: toolCallId, delta: inputString });
1604
1627
  }
@@ -1608,7 +1631,8 @@ var ExecLanguageModel = class {
1608
1631
  toolCallId,
1609
1632
  toolName,
1610
1633
  input: inputString,
1611
- providerExecuted: true
1634
+ providerExecuted: true,
1635
+ dynamic: true
1612
1636
  });
1613
1637
  }
1614
1638
  emitToolResult(controller, toolCallId, toolName, item, resultPayload, metadata) {
@@ -1636,6 +1660,7 @@ var ExecLanguageModel = class {
1636
1660
  toolCallId,
1637
1661
  toolName,
1638
1662
  result: resultPayload ?? {},
1663
+ dynamic: true,
1639
1664
  ...isError ? { isError: true } : {},
1640
1665
  ...Object.keys(providerMetadataEntries).length ? { providerMetadata: { "codex-cli": providerMetadataEntries } } : {}
1641
1666
  });
@@ -2294,10 +2319,10 @@ function normalizeItemType(type) {
2294
2319
  function mapTool(item) {
2295
2320
  const type = normalizeItemType(item.type);
2296
2321
  if (type === "commandexecution") {
2297
- return { toolName: "exec" };
2322
+ return { toolName: "exec", dynamic: true };
2298
2323
  }
2299
2324
  if (type === "filechange") {
2300
- return { toolName: "patch" };
2325
+ return { toolName: "patch", dynamic: true };
2301
2326
  }
2302
2327
  if (type === "mcptoolcall") {
2303
2328
  const server = typeof item.server === "string" ? item.server || "server" : "server";
@@ -2308,7 +2333,7 @@ function mapTool(item) {
2308
2333
  };
2309
2334
  }
2310
2335
  if (type === "websearch") {
2311
- return { toolName: "web_search" };
2336
+ return { toolName: "web_search", dynamic: true };
2312
2337
  }
2313
2338
  return void 0;
2314
2339
  }
@@ -2375,7 +2400,8 @@ function createNotificationHandlers(context) {
2375
2400
  context.emitter.emitToolOutputDelta(
2376
2401
  itemId,
2377
2402
  tracked?.toolName ?? defaultToolName,
2378
- params.delta
2403
+ params.delta,
2404
+ tracked?.dynamic ?? true
2379
2405
  );
2380
2406
  };
2381
2407
  return {
@@ -2604,6 +2630,8 @@ var AppServerStreamEmitter = class {
2604
2630
  this.options = options;
2605
2631
  this.jsonModeLastTextBlockOnly = Boolean(options.jsonModeLastTextBlockOnly);
2606
2632
  }
2633
+ controller;
2634
+ options;
2607
2635
  textId;
2608
2636
  reasoningId;
2609
2637
  jsonModeLastTextBlockOnly;
@@ -2705,7 +2733,7 @@ var AppServerStreamEmitter = class {
2705
2733
  ...dynamic ? { dynamic: true } : {}
2706
2734
  });
2707
2735
  }
2708
- emitToolOutputDelta(toolCallId, toolName, delta) {
2736
+ emitToolOutputDelta(toolCallId, toolName, delta, dynamic) {
2709
2737
  this.safeEnqueue({
2710
2738
  type: "tool-result",
2711
2739
  toolCallId,
@@ -2714,7 +2742,8 @@ var AppServerStreamEmitter = class {
2714
2742
  result: {
2715
2743
  type: "output-delta",
2716
2744
  delta
2717
- }
2745
+ },
2746
+ ...dynamic ? { dynamic: true } : {}
2718
2747
  });
2719
2748
  }
2720
2749
  emitToolResult(toolCallId, toolName, result, dynamic, isError) {
@@ -2840,6 +2869,7 @@ var TurnStreamController = class {
2840
2869
  constructor(options) {
2841
2870
  this.options = options;
2842
2871
  }
2872
+ options;
2843
2873
  state = "created";
2844
2874
  usage = createEmptyCodexUsage();
2845
2875
  turnId;
@@ -3297,7 +3327,7 @@ async function createLocalMcpServer(options) {
3297
3327
  }
3298
3328
 
3299
3329
  // src/tools/sdk-mcp-server.ts
3300
- var SDK_MCP_SERVER_MARKER = Symbol.for("ai-sdk-provider-codex-cli.sdkMcpServer");
3330
+ var SDK_MCP_SERVER_MARKER = /* @__PURE__ */ Symbol.for("ai-sdk-provider-codex-cli.sdkMcpServer");
3301
3331
  function createSdkMcpServer(options) {
3302
3332
  const { name, cacheKey, tools } = options;
3303
3333
  let server;
@@ -4609,7 +4639,7 @@ var AppServerRpcClient = class extends EventEmitter {
4609
4639
  if (this.serverCapabilities?.modelList === false) {
4610
4640
  throw new UnsupportedFeatureError({
4611
4641
  feature: "model/list",
4612
- minCodexVersion: this.settings.minCodexVersion ?? "0.105.0",
4642
+ minCodexVersion: this.settings.minCodexVersion ?? "0.130.0",
4613
4643
  serverVersion: this.serverVersion
4614
4644
  });
4615
4645
  }
@@ -4622,7 +4652,7 @@ var AppServerRpcClient = class extends EventEmitter {
4622
4652
  if (error instanceof JsonRpcRequestError && error.code === -32601) {
4623
4653
  throw new UnsupportedFeatureError({
4624
4654
  feature: "model/list",
4625
- minCodexVersion: this.settings.minCodexVersion ?? "0.105.0",
4655
+ minCodexVersion: this.settings.minCodexVersion ?? "0.130.0",
4626
4656
  serverVersion: this.serverVersion
4627
4657
  });
4628
4658
  }
@@ -4779,7 +4809,7 @@ var AppServerRpcClient = class extends EventEmitter {
4779
4809
  const message = String(error?.message ?? error);
4780
4810
  if (message.includes("ENOENT") || message.includes("unknown subcommand")) {
4781
4811
  throw new Error(
4782
- "codex app-server requires codex CLI >= 0.105.0. Run 'codex --version' to check."
4812
+ "codex app-server requires codex CLI >= 0.130.0. Run 'codex --version' to check."
4783
4813
  );
4784
4814
  }
4785
4815
  throw createAPICallError({
@@ -4801,7 +4831,7 @@ var AppServerRpcClient = class extends EventEmitter {
4801
4831
  return;
4802
4832
  }
4803
4833
  this.serverVersion = detected;
4804
- const minVersion = this.settings.minCodexVersion ?? "0.105.0";
4834
+ const minVersion = this.settings.minCodexVersion ?? "0.130.0";
4805
4835
  const compared = compareSemver(detected, minVersion);
4806
4836
  if (compared === void 0) {
4807
4837
  this.logger.warn(
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ai-sdk-provider-codex-cli",
3
- "version": "1.1.0",
3
+ "version": "1.2.1",
4
4
  "description": "AI SDK v6 provider for OpenAI Codex CLI (use ChatGPT Plus/Pro subscription)",
5
5
  "keywords": [
6
6
  "ai-sdk",
@@ -10,7 +10,7 @@
10
10
  "language-model",
11
11
  "gpt-5",
12
12
  "gpt-5.1",
13
- "gpt-5.3-codex",
13
+ "gpt-5.5",
14
14
  "gpt-5.2-codex-max",
15
15
  "provider"
16
16
  ],
@@ -67,16 +67,16 @@
67
67
  "jsonc-parser": "^3.3.1"
68
68
  },
69
69
  "optionalDependencies": {
70
- "@openai/codex": "^0.105.0"
70
+ "@openai/codex": "^0.130.0"
71
71
  },
72
72
  "devDependencies": {
73
73
  "@eslint/js": "^9.14.0",
74
- "@types/node": "20.19.6",
74
+ "@types/node": "20.19.41",
75
75
  "@vitest/coverage-v8": "^3.2.4",
76
76
  "ai": "^6.0.3",
77
77
  "eslint": "^9.14.0",
78
78
  "prettier": "^3.3.3",
79
- "tsup": "8.5.0",
79
+ "tsup": "8.5.1",
80
80
  "typescript": "5.6.3",
81
81
  "vitest": "^3.2.4",
82
82
  "typescript-eslint": "^8.6.0",