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 +21 -18
- package/dist/index.cjs +52 -22
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +52 -22
- 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
|
}
|
|
@@ -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({
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
}
|
|
@@ -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({
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
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.
|
|
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",
|