ai-sdk-provider-codex-cli 1.1.0 → 1.2.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.
- package/README.md +21 -18
- package/dist/index.cjs +34 -14
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +34 -14
- package/package.json +5 -5
package/README.md
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
[](https://github.com/ben-vargas/ai-sdk-provider-codex-cli/issues)
|
|
11
11
|
[](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
|
|
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
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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(
|
|
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
|
-
|
|
1180
|
-
|
|
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
|
-
|
|
1426
|
-
|
|
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
|
}
|
|
@@ -2612,6 +2629,8 @@ var AppServerStreamEmitter = class {
|
|
|
2612
2629
|
this.options = options;
|
|
2613
2630
|
this.jsonModeLastTextBlockOnly = Boolean(options.jsonModeLastTextBlockOnly);
|
|
2614
2631
|
}
|
|
2632
|
+
controller;
|
|
2633
|
+
options;
|
|
2615
2634
|
textId;
|
|
2616
2635
|
reasoningId;
|
|
2617
2636
|
jsonModeLastTextBlockOnly;
|
|
@@ -2848,6 +2867,7 @@ var TurnStreamController = class {
|
|
|
2848
2867
|
constructor(options) {
|
|
2849
2868
|
this.options = options;
|
|
2850
2869
|
}
|
|
2870
|
+
options;
|
|
2851
2871
|
state = "created";
|
|
2852
2872
|
usage = createEmptyCodexUsage();
|
|
2853
2873
|
turnId;
|
|
@@ -3305,7 +3325,7 @@ async function createLocalMcpServer(options) {
|
|
|
3305
3325
|
}
|
|
3306
3326
|
|
|
3307
3327
|
// src/tools/sdk-mcp-server.ts
|
|
3308
|
-
var SDK_MCP_SERVER_MARKER = Symbol.for("ai-sdk-provider-codex-cli.sdkMcpServer");
|
|
3328
|
+
var SDK_MCP_SERVER_MARKER = /* @__PURE__ */ Symbol.for("ai-sdk-provider-codex-cli.sdkMcpServer");
|
|
3309
3329
|
function createSdkMcpServer(options) {
|
|
3310
3330
|
const { name, cacheKey, tools } = options;
|
|
3311
3331
|
let server;
|
|
@@ -4617,7 +4637,7 @@ var AppServerRpcClient = class extends events.EventEmitter {
|
|
|
4617
4637
|
if (this.serverCapabilities?.modelList === false) {
|
|
4618
4638
|
throw new UnsupportedFeatureError({
|
|
4619
4639
|
feature: "model/list",
|
|
4620
|
-
minCodexVersion: this.settings.minCodexVersion ?? "0.
|
|
4640
|
+
minCodexVersion: this.settings.minCodexVersion ?? "0.130.0",
|
|
4621
4641
|
serverVersion: this.serverVersion
|
|
4622
4642
|
});
|
|
4623
4643
|
}
|
|
@@ -4630,7 +4650,7 @@ var AppServerRpcClient = class extends events.EventEmitter {
|
|
|
4630
4650
|
if (error instanceof JsonRpcRequestError && error.code === -32601) {
|
|
4631
4651
|
throw new UnsupportedFeatureError({
|
|
4632
4652
|
feature: "model/list",
|
|
4633
|
-
minCodexVersion: this.settings.minCodexVersion ?? "0.
|
|
4653
|
+
minCodexVersion: this.settings.minCodexVersion ?? "0.130.0",
|
|
4634
4654
|
serverVersion: this.serverVersion
|
|
4635
4655
|
});
|
|
4636
4656
|
}
|
|
@@ -4787,7 +4807,7 @@ var AppServerRpcClient = class extends events.EventEmitter {
|
|
|
4787
4807
|
const message = String(error?.message ?? error);
|
|
4788
4808
|
if (message.includes("ENOENT") || message.includes("unknown subcommand")) {
|
|
4789
4809
|
throw new Error(
|
|
4790
|
-
"codex app-server requires codex CLI >= 0.
|
|
4810
|
+
"codex app-server requires codex CLI >= 0.130.0. Run 'codex --version' to check."
|
|
4791
4811
|
);
|
|
4792
4812
|
}
|
|
4793
4813
|
throw createAPICallError({
|
|
@@ -4809,7 +4829,7 @@ var AppServerRpcClient = class extends events.EventEmitter {
|
|
|
4809
4829
|
return;
|
|
4810
4830
|
}
|
|
4811
4831
|
this.serverVersion = detected;
|
|
4812
|
-
const minVersion = this.settings.minCodexVersion ?? "0.
|
|
4832
|
+
const minVersion = this.settings.minCodexVersion ?? "0.130.0";
|
|
4813
4833
|
const compared = compareSemver(detected, minVersion);
|
|
4814
4834
|
if (compared === void 0) {
|
|
4815
4835
|
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.
|
|
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.
|
|
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(
|
|
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
|
-
|
|
1172
|
-
|
|
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
|
-
|
|
1418
|
-
|
|
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
|
}
|
|
@@ -2604,6 +2621,8 @@ var AppServerStreamEmitter = class {
|
|
|
2604
2621
|
this.options = options;
|
|
2605
2622
|
this.jsonModeLastTextBlockOnly = Boolean(options.jsonModeLastTextBlockOnly);
|
|
2606
2623
|
}
|
|
2624
|
+
controller;
|
|
2625
|
+
options;
|
|
2607
2626
|
textId;
|
|
2608
2627
|
reasoningId;
|
|
2609
2628
|
jsonModeLastTextBlockOnly;
|
|
@@ -2840,6 +2859,7 @@ var TurnStreamController = class {
|
|
|
2840
2859
|
constructor(options) {
|
|
2841
2860
|
this.options = options;
|
|
2842
2861
|
}
|
|
2862
|
+
options;
|
|
2843
2863
|
state = "created";
|
|
2844
2864
|
usage = createEmptyCodexUsage();
|
|
2845
2865
|
turnId;
|
|
@@ -3297,7 +3317,7 @@ async function createLocalMcpServer(options) {
|
|
|
3297
3317
|
}
|
|
3298
3318
|
|
|
3299
3319
|
// src/tools/sdk-mcp-server.ts
|
|
3300
|
-
var SDK_MCP_SERVER_MARKER = Symbol.for("ai-sdk-provider-codex-cli.sdkMcpServer");
|
|
3320
|
+
var SDK_MCP_SERVER_MARKER = /* @__PURE__ */ Symbol.for("ai-sdk-provider-codex-cli.sdkMcpServer");
|
|
3301
3321
|
function createSdkMcpServer(options) {
|
|
3302
3322
|
const { name, cacheKey, tools } = options;
|
|
3303
3323
|
let server;
|
|
@@ -4609,7 +4629,7 @@ var AppServerRpcClient = class extends EventEmitter {
|
|
|
4609
4629
|
if (this.serverCapabilities?.modelList === false) {
|
|
4610
4630
|
throw new UnsupportedFeatureError({
|
|
4611
4631
|
feature: "model/list",
|
|
4612
|
-
minCodexVersion: this.settings.minCodexVersion ?? "0.
|
|
4632
|
+
minCodexVersion: this.settings.minCodexVersion ?? "0.130.0",
|
|
4613
4633
|
serverVersion: this.serverVersion
|
|
4614
4634
|
});
|
|
4615
4635
|
}
|
|
@@ -4622,7 +4642,7 @@ var AppServerRpcClient = class extends EventEmitter {
|
|
|
4622
4642
|
if (error instanceof JsonRpcRequestError && error.code === -32601) {
|
|
4623
4643
|
throw new UnsupportedFeatureError({
|
|
4624
4644
|
feature: "model/list",
|
|
4625
|
-
minCodexVersion: this.settings.minCodexVersion ?? "0.
|
|
4645
|
+
minCodexVersion: this.settings.minCodexVersion ?? "0.130.0",
|
|
4626
4646
|
serverVersion: this.serverVersion
|
|
4627
4647
|
});
|
|
4628
4648
|
}
|
|
@@ -4779,7 +4799,7 @@ var AppServerRpcClient = class extends EventEmitter {
|
|
|
4779
4799
|
const message = String(error?.message ?? error);
|
|
4780
4800
|
if (message.includes("ENOENT") || message.includes("unknown subcommand")) {
|
|
4781
4801
|
throw new Error(
|
|
4782
|
-
"codex app-server requires codex CLI >= 0.
|
|
4802
|
+
"codex app-server requires codex CLI >= 0.130.0. Run 'codex --version' to check."
|
|
4783
4803
|
);
|
|
4784
4804
|
}
|
|
4785
4805
|
throw createAPICallError({
|
|
@@ -4801,7 +4821,7 @@ var AppServerRpcClient = class extends EventEmitter {
|
|
|
4801
4821
|
return;
|
|
4802
4822
|
}
|
|
4803
4823
|
this.serverVersion = detected;
|
|
4804
|
-
const minVersion = this.settings.minCodexVersion ?? "0.
|
|
4824
|
+
const minVersion = this.settings.minCodexVersion ?? "0.130.0";
|
|
4805
4825
|
const compared = compareSemver(detected, minVersion);
|
|
4806
4826
|
if (compared === void 0) {
|
|
4807
4827
|
this.logger.warn(
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ai-sdk-provider-codex-cli",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.0",
|
|
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.
|
|
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.
|
|
70
|
+
"@openai/codex": "^0.130.0"
|
|
71
71
|
},
|
|
72
72
|
"devDependencies": {
|
|
73
73
|
"@eslint/js": "^9.14.0",
|
|
74
|
-
"@types/node": "20.19.
|
|
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.
|
|
79
|
+
"tsup": "8.5.1",
|
|
80
80
|
"typescript": "5.6.3",
|
|
81
81
|
"vitest": "^3.2.4",
|
|
82
82
|
"typescript-eslint": "^8.6.0",
|