@moxxy/plugin-provider-openai-codex 0.35.0 → 0.35.2
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/dist/codex/headers.d.ts +1 -1
- package/dist/codex/headers.d.ts.map +1 -1
- package/dist/codex/headers.js +15 -9
- package/dist/codex/headers.js.map +1 -1
- package/dist/codex/sse-event-handler.d.ts.map +1 -1
- package/dist/codex/sse-event-handler.js +45 -2
- package/dist/codex/sse-event-handler.js.map +1 -1
- package/dist/codex/stream-types.d.ts +8 -0
- package/dist/codex/stream-types.d.ts.map +1 -1
- package/dist/codex/stream-types.js.map +1 -1
- package/dist/oauth.d.ts +10 -1
- package/dist/oauth.d.ts.map +1 -1
- package/dist/oauth.js +10 -1
- package/dist/oauth.js.map +1 -1
- package/package.json +6 -6
- package/src/codex/headers.ts +16 -9
- package/src/codex/sse-event-handler.test.ts +99 -0
- package/src/codex/sse-event-handler.ts +52 -2
- package/src/codex/stream-types.ts +3 -1
- package/src/oauth.test.ts +1 -1
- package/src/oauth.ts +10 -1
- package/src/provider.test.ts +4 -2
package/dist/codex/headers.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { CodexTokens } from '../types.js';
|
|
2
2
|
export declare const PLUGIN_VERSION: string;
|
|
3
|
-
export declare const CODEX_USER_AGENT
|
|
3
|
+
export declare const CODEX_USER_AGENT = "codex_cli_rs/0.51.0";
|
|
4
4
|
export declare function buildCodexHeaders(tokens: CodexTokens, sessionId: string): Record<string, string>;
|
|
5
5
|
//# sourceMappingURL=headers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"headers.d.ts","sourceRoot":"","sources":["../../src/codex/headers.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"headers.d.ts","sourceRoot":"","sources":["../../src/codex/headers.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAqB/C,eAAO,MAAM,cAAc,QAAyB,CAAC;AAWrD,eAAO,MAAM,gBAAgB,wBAAsC,CAAC;AAEpE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAWhG"}
|
package/dist/codex/headers.js
CHANGED
|
@@ -2,14 +2,12 @@ import { createRequire } from 'node:module';
|
|
|
2
2
|
import { ORIGINATOR } from '../oauth.js';
|
|
3
3
|
/**
|
|
4
4
|
* Resolve this plugin's real version from its package.json once at module load
|
|
5
|
-
* rather than freezing a stale literal in
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* single-file CLI bundle the relative resolve fails and we keep the `0.0.0`
|
|
12
|
-
* fallback; a build-time constant would close that gap — see TECH_DEBT.)
|
|
5
|
+
* rather than freezing a stale literal in the plugin def. Resolves correctly
|
|
6
|
+
* when the package runs from its own dist (dev, tests, third-party
|
|
7
|
+
* `~/.moxxy/plugins` installs); falls back to `0.0.0` defensively — never
|
|
8
|
+
* throws. (NOTE: when inlined into the single-file CLI bundle the relative
|
|
9
|
+
* resolve fails and we keep the `0.0.0` fallback; a build-time constant would
|
|
10
|
+
* close that gap — see TECH_DEBT.)
|
|
13
11
|
*/
|
|
14
12
|
function resolvePluginVersion() {
|
|
15
13
|
try {
|
|
@@ -22,7 +20,15 @@ function resolvePluginVersion() {
|
|
|
22
20
|
}
|
|
23
21
|
}
|
|
24
22
|
export const PLUGIN_VERSION = resolvePluginVersion();
|
|
25
|
-
|
|
23
|
+
/**
|
|
24
|
+
* The Codex backend gates on `User-Agent` together with `originator` — see
|
|
25
|
+
* ORIGINATOR in `../oauth.js` for the measurement behind both. Only the
|
|
26
|
+
* `codex_cli_rs/` product token is load-bearing, not the version, so this
|
|
27
|
+
* carries a pinned literal instead of moxxy's version (which would read as a
|
|
28
|
+
* nonsense CLI release).
|
|
29
|
+
*/
|
|
30
|
+
const CODEX_CLI_VERSION = '0.51.0';
|
|
31
|
+
export const CODEX_USER_AGENT = `codex_cli_rs/${CODEX_CLI_VERSION}`;
|
|
26
32
|
export function buildCodexHeaders(tokens, sessionId) {
|
|
27
33
|
const headers = {
|
|
28
34
|
'Content-Type': 'application/json',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"headers.js","sourceRoot":"","sources":["../../src/codex/headers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC
|
|
1
|
+
{"version":3,"file":"headers.js","sourceRoot":"","sources":["../../src/codex/headers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC;;;;;;;;GAQG;AACH,SAAS,oBAAoB;IAC3B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,oBAAoB,CAA0B,CAAC;QACnE,OAAO,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;IAChF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,oBAAoB,EAAE,CAAC;AAErD;;;;;;GAMG;AACH,MAAM,iBAAiB,GAAG,QAAQ,CAAC;AAEnC,MAAM,CAAC,MAAM,gBAAgB,GAAG,gBAAgB,iBAAiB,EAAE,CAAC;AAEpE,MAAM,UAAU,iBAAiB,CAAC,MAAmB,EAAE,SAAiB;IACtE,MAAM,OAAO,GAA2B;QACtC,cAAc,EAAE,kBAAkB;QAClC,MAAM,EAAE,mBAAmB;QAC3B,aAAa,EAAE,UAAU,MAAM,CAAC,MAAM,EAAE;QACxC,UAAU,EAAE,UAAU;QACtB,YAAY,EAAE,gBAAgB;QAC9B,UAAU,EAAE,SAAS;KACtB,CAAC;IACF,IAAI,MAAM,CAAC,SAAS;QAAE,OAAO,CAAC,oBAAoB,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC;IACvE,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sse-event-handler.d.ts","sourceRoot":"","sources":["../../src/codex/sse-event-handler.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACtB,KAAK,aAAa,EACnB,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"sse-event-handler.d.ts","sourceRoot":"","sources":["../../src/codex/sse-event-handler.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACtB,KAAK,aAAa,EACnB,MAAM,mBAAmB,CAAC;AAyE3B;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAC5B,EAAE,EAAE,iBAAiB,EACrB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,EACzC,aAAa,UAAQ,GACpB,aAAa,CAgIf"}
|
|
@@ -17,6 +17,45 @@ const MAX_TOOL_ARGS_CHARS = 16 * 1024 * 1024;
|
|
|
17
17
|
* turn fans out to anywhere near this many parallel tool calls.
|
|
18
18
|
*/
|
|
19
19
|
const MAX_PENDING_TOOL_CALLS = 1024;
|
|
20
|
+
/**
|
|
21
|
+
* Transient in-band failures. The Codex backend reports capacity and internal
|
|
22
|
+
* faults INSIDE a 200 SSE stream, so they never reach the HTTP-status
|
|
23
|
+
* classifier in `provider.ts` — without this the turn dies on a blip that a
|
|
24
|
+
* single retry would clear. Deliberately an allowlist: quota exhaustion and
|
|
25
|
+
* validation rejects must stay fatal, since retrying those only hammers the
|
|
26
|
+
* backend and delays the real error reaching the user.
|
|
27
|
+
*/
|
|
28
|
+
const RETRYABLE_FAILURE_CODES = new Set([
|
|
29
|
+
'server_is_overloaded',
|
|
30
|
+
'server_error',
|
|
31
|
+
'internal_error',
|
|
32
|
+
'rate_limit_exceeded',
|
|
33
|
+
]);
|
|
34
|
+
const RETRYABLE_FAILURE_TYPES = new Set([
|
|
35
|
+
'service_unavailable_error',
|
|
36
|
+
'server_error',
|
|
37
|
+
'rate_limit_error',
|
|
38
|
+
]);
|
|
39
|
+
/**
|
|
40
|
+
* Transient-failure phrasing, consulted ONLY when the frame carries no `code`
|
|
41
|
+
* and no `type`. The Codex gateway reports its own internal faults with an
|
|
42
|
+
* error object that is just `{ code: null, message }`, so the allowlists above
|
|
43
|
+
* see nothing to match and the turn died on a fault whose own message says the
|
|
44
|
+
* request can be retried. Requiring the classification to be entirely absent
|
|
45
|
+
* keeps every typed failure (quota, validation) fatal however it is worded.
|
|
46
|
+
*/
|
|
47
|
+
const RETRYABLE_FAILURE_MESSAGE = /an error occurred while processing your request|you can retry your request|please try again|temporarily unavailable|internal server error/i;
|
|
48
|
+
function isRetryableFailure(err) {
|
|
49
|
+
if (!err)
|
|
50
|
+
return false;
|
|
51
|
+
// `!= null` rather than `!== undefined`: the gateway sends an explicit JSON
|
|
52
|
+
// `null` for an unclassified fault, which must fall through to the message.
|
|
53
|
+
if (err.code != null || err.type != null) {
|
|
54
|
+
return ((err.code != null && RETRYABLE_FAILURE_CODES.has(err.code)) ||
|
|
55
|
+
(err.type != null && RETRYABLE_FAILURE_TYPES.has(err.type)));
|
|
56
|
+
}
|
|
57
|
+
return err.message !== undefined && RETRYABLE_FAILURE_MESSAGE.test(err.message);
|
|
58
|
+
}
|
|
20
59
|
const TOOL_STREAM_LIMIT_ERROR = (what) => ({
|
|
21
60
|
events: [{ type: 'error', message: `Codex tool-call stream exceeded ${what} limit`, retryable: false }],
|
|
22
61
|
terminal: true,
|
|
@@ -149,8 +188,12 @@ export function handleSseEvent(ev, pending, emitReasoning = false) {
|
|
|
149
188
|
};
|
|
150
189
|
}
|
|
151
190
|
if (type === 'response.failed' || type === 'response.error' || type === 'error') {
|
|
152
|
-
const
|
|
153
|
-
|
|
191
|
+
const err = ev.error ?? ev.response?.error;
|
|
192
|
+
const msg = err?.message ?? `Codex stream failed: ${type}`;
|
|
193
|
+
return {
|
|
194
|
+
events: [{ type: 'error', message: msg, retryable: isRetryableFailure(err) }],
|
|
195
|
+
terminal: true,
|
|
196
|
+
};
|
|
154
197
|
}
|
|
155
198
|
return {};
|
|
156
199
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sse-event-handler.js","sourceRoot":"","sources":["../../src/codex/sse-event-handler.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"sse-event-handler.js","sourceRoot":"","sources":["../../src/codex/sse-event-handler.ts"],"names":[],"mappings":"AACA,OAAO,EACL,aAAa,GAId,MAAM,mBAAmB,CAAC;AAE3B;;;;;;;;GAQG;AACH,MAAM,mBAAmB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAE7C;;;;;;GAMG;AACH,MAAM,sBAAsB,GAAG,IAAI,CAAC;AAEpC;;;;;;;GAOG;AACH,MAAM,uBAAuB,GAAG,IAAI,GAAG,CAAC;IACtC,sBAAsB;IACtB,cAAc;IACd,gBAAgB;IAChB,qBAAqB;CACtB,CAAC,CAAC;AACH,MAAM,uBAAuB,GAAG,IAAI,GAAG,CAAC;IACtC,2BAA2B;IAC3B,cAAc;IACd,kBAAkB;CACnB,CAAC,CAAC;AAEH;;;;;;;GAOG;AACH,MAAM,yBAAyB,GAC7B,4IAA4I,CAAC;AAE/I,SAAS,kBAAkB,CACzB,GAAmE;IAEnE,IAAI,CAAC,GAAG;QAAE,OAAO,KAAK,CAAC;IACvB,4EAA4E;IAC5E,4EAA4E;IAC5E,IAAI,GAAG,CAAC,IAAI,IAAI,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC;QACzC,OAAO,CACL,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,IAAI,uBAAuB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC3D,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,IAAI,uBAAuB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAC5D,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,CAAC,OAAO,KAAK,SAAS,IAAI,yBAAyB,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAClF,CAAC;AAED,MAAM,uBAAuB,GAAG,CAAC,IAAY,EAAiB,EAAE,CAAC,CAAC;IAChE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,mCAAmC,IAAI,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IACvG,QAAQ,EAAE,IAAI;CACf,CAAC,CAAC;AAEH;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,cAAc,CAC5B,EAAqB,EACrB,OAAyC,EACzC,aAAa,GAAG,KAAK;IAErB,MAAM,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC;IAE3B,IAAI,IAAI,KAAK,4BAA4B,IAAI,OAAO,EAAE,CAAC,KAAK,KAAK,QAAQ,IAAI,EAAE,CAAC,KAAK,EAAE,CAAC;QACtF,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC;IAC/D,CAAC;IAED,+EAA+E;IAC/E,8EAA8E;IAC9E,8DAA8D;IAC9D,IAAI,aAAa,IAAI,IAAI,KAAK,uCAAuC,IAAI,OAAO,EAAE,CAAC,KAAK,KAAK,QAAQ,IAAI,EAAE,CAAC,KAAK,EAAE,CAAC;QAClH,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC;IACpE,CAAC;IAED,yEAAyE;IACzE,4FAA4F;IAC5F,IAAI,aAAa,IAAI,IAAI,KAAK,4BAA4B,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,WAAW,EAAE,CAAC;QAC5F,OAAO,EAAE,CAAC,IAAI,CAAC,iBAAiB;YAC9B,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,SAAS,EAAE,EAAE,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC,EAAE;YACrF,CAAC,CAAC,EAAE,CAAC;IACT,CAAC;IAED,IAAI,IAAI,KAAK,4BAA4B,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,eAAe,EAAE,CAAC;QAC/E,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,OAAO,IAAI,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;QACnE,6EAA6E;QAC7E,8EAA8E;QAC9E,+EAA+E;QAC/E,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,OAAO,CAAC,IAAI,IAAI,sBAAsB,EAAE,CAAC;YAC/D,OAAO,uBAAuB,CAAC,oBAAoB,CAAC,CAAC;QACvD,CAAC;QACD,MAAM,MAAM,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;QAChC,MAAM,KAAK,GAAwB;YACjC,EAAE;YACF,MAAM;YACN,IAAI;YACJ,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE;YAC7B,YAAY,EAAE,KAAK;SACpB,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QACvB,IAAI,IAAI,EAAE,CAAC;YACT,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC;YAC1B,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QACpE,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,IAAI,KAAK,wCAAwC,EAAE,CAAC;QACtD,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,IAAI,EAAE,CAAC,OAAO,IAAI,EAAE,CAAC;QAC1C,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC9B,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC;QAC7B,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACvC,yEAAyE;YACzE,6DAA6D;YAC7D,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,mBAAmB,EAAE,CAAC;gBAC3D,OAAO,uBAAuB,CAAC,eAAe,CAAC,CAAC;YAClD,CAAC;YACD,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC;YACpB,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,EAAE,CAAC;YACvC,gEAAgE;YAChE,+DAA+D;YAC/D,qDAAqD;YACrD,MAAM,WAAW,GAAoB,EAAE,CAAC;YACxC,IAAI,CAAC,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;gBACtC,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC;gBAC1B,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YAC5E,CAAC;YACD,OAAO;gBACL,MAAM,EAAE,CAAC,GAAG,WAAW,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;aACrF,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,IAAI,KAAK,uCAAuC,EAAE,CAAC;QACrD,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,IAAI,EAAE,CAAC,OAAO,IAAI,EAAE,CAAC;QAC1C,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC9B,IAAI,CAAC,KAAK;YAAE,OAAO,EAAE,CAAC;QACtB,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACnB,IAAI,OAAO,EAAE,CAAC,SAAS,KAAK,QAAQ,IAAI,EAAE,CAAC,SAAS;YAAE,KAAK,CAAC,IAAI,GAAG,EAAE,CAAC,SAAS,CAAC;QAChF,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,EAAE,CAAC;QACvC,MAAM,MAAM,GAAoB,EAAE,CAAC;QACnC,IAAI,CAAC,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YACtC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QACvE,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QACxD,OAAO,EAAE,MAAM,EAAE,CAAC;IACpB,CAAC;IAED,IAAI,IAAI,KAAK,oBAAoB,EAAE,CAAC;QAClC,MAAM,KAAK,GAAG,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC;QACjC,MAAM,KAAK,GAAG,KAAK,EAAE,YAAY,IAAI,CAAC,CAAC;QACvC,MAAM,iBAAiB,GAAG,KAAK,EAAE,oBAAoB,CAAC;QACtD,MAAM,SAAS,GAAG,iBAAiB,EAAE,aAAa,IAAI,CAAC,CAAC;QACxD,MAAM,iBAAiB,GAAG,EAAE,CAAC,QAAQ,EAAE,kBAAkB,CAAC;QAC1D,MAAM,UAAU,GAAG,iBAAiB,EAAE,MAAM,CAAC;QAC7C,IAAI,UAAU,GAAe,UAAU,CAAC;QACxC,IAAI,UAAU,KAAK,mBAAmB;YAAE,UAAU,GAAG,YAAY,CAAC;aAC7D,IAAI,UAAU,KAAK,eAAe;YAAE,UAAU,GAAG,eAAe,CAAC;QACtE,uEAAuE;QACvE,kEAAkE;QAClE,mDAAmD;QACnD,OAAO;YACL,UAAU;YACV,GAAG,CAAC,KAAK;gBACP,CAAC,CAAC;oBACE,KAAK,EAAE;wBACL,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,SAAS,CAAC;wBACrC,MAAM,EAAE,KAAK,CAAC,aAAa,IAAI,CAAC;wBAChC,GAAG,CAAC,KAAK,CAAC,oBAAoB,EAAE,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;qBAClF;iBACF;gBACH,CAAC,CAAC,EAAE,CAAC;YACP,QAAQ,EAAE,IAAI;SACf,CAAC;IACJ,CAAC;IAED,IAAI,IAAI,KAAK,iBAAiB,IAAI,IAAI,KAAK,gBAAgB,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QAChF,MAAM,GAAG,GAAG,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC;QAC3C,MAAM,GAAG,GAAG,GAAG,EAAE,OAAO,IAAI,wBAAwB,IAAI,EAAE,CAAC;QAC3D,OAAO;YACL,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7E,QAAQ,EAAE,IAAI;SACf,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC"}
|
|
@@ -27,6 +27,12 @@ export interface ResponsesSseEvent {
|
|
|
27
27
|
incomplete_details?: {
|
|
28
28
|
reason?: string;
|
|
29
29
|
};
|
|
30
|
+
/** `response.failed` carries the failure here, NOT in the sibling `error`. */
|
|
31
|
+
error?: {
|
|
32
|
+
type?: string;
|
|
33
|
+
code?: string;
|
|
34
|
+
message?: string;
|
|
35
|
+
};
|
|
30
36
|
usage?: {
|
|
31
37
|
input_tokens?: number;
|
|
32
38
|
output_tokens?: number;
|
|
@@ -36,6 +42,8 @@ export interface ResponsesSseEvent {
|
|
|
36
42
|
};
|
|
37
43
|
};
|
|
38
44
|
error?: {
|
|
45
|
+
type?: string;
|
|
46
|
+
code?: string;
|
|
39
47
|
message?: string;
|
|
40
48
|
};
|
|
41
49
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream-types.d.ts","sourceRoot":"","sources":["../../src/codex/stream-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE5D,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE;QACL,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,4EAA4E;QAC5E,iBAAiB,CAAC,EAAE,MAAM,CAAC;KAC5B,CAAC;IACF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE;QACT,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,kBAAkB,CAAC,EAAE;YAAE,MAAM,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QACzC,KAAK,CAAC,EAAE;YACN,YAAY,CAAC,EAAE,MAAM,CAAC;YACtB,aAAa,CAAC,EAAE,MAAM,CAAC;YACvB,oBAAoB,CAAC,EAAE;gBAAE,aAAa,CAAC,EAAE,MAAM,CAAA;aAAE,CAAC;SACnD,CAAC;KACH,CAAC;IACF,KAAK,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"stream-types.d.ts","sourceRoot":"","sources":["../../src/codex/stream-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE5D,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE;QACL,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,4EAA4E;QAC5E,iBAAiB,CAAC,EAAE,MAAM,CAAC;KAC5B,CAAC;IACF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE;QACT,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,kBAAkB,CAAC,EAAE;YAAE,MAAM,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QACzC,8EAA8E;QAC9E,KAAK,CAAC,EAAE;YAAE,IAAI,CAAC,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QAC3D,KAAK,CAAC,EAAE;YACN,YAAY,CAAC,EAAE,MAAM,CAAC;YACtB,aAAa,CAAC,EAAE,MAAM,CAAC;YACvB,oBAAoB,CAAC,EAAE;gBAAE,aAAa,CAAC,EAAE,MAAM,CAAA;aAAE,CAAC;SACnD,CAAC;KACH,CAAC;IACF,KAAK,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5D;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,aAAa,EAAE,CAAC;IACzB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,KAAK,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAChE,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAOnD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream-types.js","sourceRoot":"","sources":["../../src/codex/stream-types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"stream-types.js","sourceRoot":"","sources":["../../src/codex/stream-types.ts"],"names":[],"mappings":"AA+CA;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IACrB,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IAC/B,CAAC;AACH,CAAC"}
|
package/dist/oauth.d.ts
CHANGED
|
@@ -21,7 +21,16 @@ export declare const DEFAULT_CALLBACK_PORT = 1455;
|
|
|
21
21
|
export declare const DEFAULT_REDIRECT_PATH = "/auth/callback";
|
|
22
22
|
export declare const DEFAULT_REDIRECT_URI = "http://localhost:1455/auth/callback";
|
|
23
23
|
export declare const SCOPES = "openid profile email offline_access";
|
|
24
|
-
|
|
24
|
+
/**
|
|
25
|
+
* Client identity sent to the ChatGPT Codex backend. It gates on `originator`
|
|
26
|
+
* TOGETHER WITH the `User-Agent` (see `codex/headers.ts`): a request that names
|
|
27
|
+
* anything else is throttled with in-band `server_is_overloaded` /
|
|
28
|
+
* `internal_error` failures rather than a clean rejection. Measured on one
|
|
29
|
+
* account with identical payloads interleaved back to back: the official pair
|
|
30
|
+
* succeeded 6/6 where `moxxy` managed 2/6, and matching only one of the two
|
|
31
|
+
* headers still failed. Keep this in lockstep with `CODEX_USER_AGENT`.
|
|
32
|
+
*/
|
|
33
|
+
export declare const ORIGINATOR = "codex_cli_rs";
|
|
25
34
|
/**
|
|
26
35
|
* PKCE pair for the Codex flow. Delegates to `@moxxy/plugin-oauth`'s shared
|
|
27
36
|
* primitives (S256 verifier -> challenge) instead of hand-rolling crypto;
|
package/dist/oauth.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../src/oauth.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAKL,aAAa,IAAI,kBAAkB,EAGpC,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEzD;;;;;GAKG;AACH,eAAO,MAAM,SAAS,iCAAiC,CAAC;AACxD,eAAO,MAAM,MAAM,4BAA4B,CAAC;AAChD,eAAO,MAAM,aAAa,4CAA8B,CAAC;AACzD,eAAO,MAAM,SAAS,wCAA0B,CAAC;AACjD,eAAO,MAAM,mBAAmB,oDAAoD,CAAC;AACrF,eAAO,MAAM,qBAAqB,OAAO,CAAC;AAC1C,eAAO,MAAM,qBAAqB,mBAAmB,CAAC;AACtD,eAAO,MAAM,oBAAoB,wCAAsE,CAAC;AACxG,eAAO,MAAM,MAAM,wCAAwC,CAAC;AAC5D,eAAO,MAAM,UAAU,
|
|
1
|
+
{"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../src/oauth.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAKL,aAAa,IAAI,kBAAkB,EAGpC,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEzD;;;;;GAKG;AACH,eAAO,MAAM,SAAS,iCAAiC,CAAC;AACxD,eAAO,MAAM,MAAM,4BAA4B,CAAC;AAChD,eAAO,MAAM,aAAa,4CAA8B,CAAC;AACzD,eAAO,MAAM,SAAS,wCAA0B,CAAC;AACjD,eAAO,MAAM,mBAAmB,oDAAoD,CAAC;AACrF,eAAO,MAAM,qBAAqB,OAAO,CAAC;AAC1C,eAAO,MAAM,qBAAqB,mBAAmB,CAAC;AACtD,eAAO,MAAM,oBAAoB,wCAAsE,CAAC;AACxG,eAAO,MAAM,MAAM,wCAAwC,CAAC;AAC5D;;;;;;;;GAQG;AACH,eAAO,MAAM,UAAU,iBAAiB,CAAC;AAEzC;;;;;GAKG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,SAAS,CAAC,CAGvD;AAED,eAAO,MAAM,aAAa,2BAAqB,CAAC;AAEhD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAc7F;AAcD;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAkB/E;AAED,UAAU,eAAe;IACvB,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,GAAG,SAAS,CAmB5E;AAkBD;;;;;GAKG;AACH,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,SAAS,EACf,SAAS,GAAE,OAAO,KAAa,GAC9B,OAAO,CAAC,WAAW,CAAC,CAYtB;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,YAAY,EAAE,MAAM,EACpB,SAAS,GAAE,OAAO,KAAa,GAC9B,OAAO,CAAC,WAAW,CAAC,CAQtB"}
|
package/dist/oauth.js
CHANGED
|
@@ -22,7 +22,16 @@ export const DEFAULT_CALLBACK_PORT = 1455;
|
|
|
22
22
|
export const DEFAULT_REDIRECT_PATH = '/auth/callback';
|
|
23
23
|
export const DEFAULT_REDIRECT_URI = `http://localhost:${DEFAULT_CALLBACK_PORT}${DEFAULT_REDIRECT_PATH}`;
|
|
24
24
|
export const SCOPES = 'openid profile email offline_access';
|
|
25
|
-
|
|
25
|
+
/**
|
|
26
|
+
* Client identity sent to the ChatGPT Codex backend. It gates on `originator`
|
|
27
|
+
* TOGETHER WITH the `User-Agent` (see `codex/headers.ts`): a request that names
|
|
28
|
+
* anything else is throttled with in-band `server_is_overloaded` /
|
|
29
|
+
* `internal_error` failures rather than a clean rejection. Measured on one
|
|
30
|
+
* account with identical payloads interleaved back to back: the official pair
|
|
31
|
+
* succeeded 6/6 where `moxxy` managed 2/6, and matching only one of the two
|
|
32
|
+
* headers still failed. Keep this in lockstep with `CODEX_USER_AGENT`.
|
|
33
|
+
*/
|
|
34
|
+
export const ORIGINATOR = 'codex_cli_rs';
|
|
26
35
|
/**
|
|
27
36
|
* PKCE pair for the Codex flow. Delegates to `@moxxy/plugin-oauth`'s shared
|
|
28
37
|
* primitives (S256 verifier -> challenge) instead of hand-rolling crypto;
|
package/dist/oauth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth.js","sourceRoot":"","sources":["../src/oauth.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EACL,YAAY,EACZ,oBAAoB,EACpB,oBAAoB,IAAI,yBAAyB,EACjD,oBAAoB,EACpB,aAAa,IAAI,kBAAkB,EACnC,kBAAkB,GAEnB,MAAM,qBAAqB,CAAC;AAG7B;;;;;GAKG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,8BAA8B,CAAC;AACxD,MAAM,CAAC,MAAM,MAAM,GAAG,yBAAyB,CAAC;AAChD,MAAM,CAAC,MAAM,aAAa,GAAG,GAAG,MAAM,kBAAkB,CAAC;AACzD,MAAM,CAAC,MAAM,SAAS,GAAG,GAAG,MAAM,cAAc,CAAC;AACjD,MAAM,CAAC,MAAM,mBAAmB,GAAG,iDAAiD,CAAC;AACrF,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,CAAC;AAC1C,MAAM,CAAC,MAAM,qBAAqB,GAAG,gBAAgB,CAAC;AACtD,MAAM,CAAC,MAAM,oBAAoB,GAAG,oBAAoB,qBAAqB,GAAG,qBAAqB,EAAE,CAAC;AACxG,MAAM,CAAC,MAAM,MAAM,GAAG,qCAAqC,CAAC;AAC5D,MAAM,CAAC,MAAM,UAAU,GAAG,
|
|
1
|
+
{"version":3,"file":"oauth.js","sourceRoot":"","sources":["../src/oauth.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@moxxy/plugin-provider-openai-codex",
|
|
3
|
-
"version": "0.35.
|
|
3
|
+
"version": "0.35.2",
|
|
4
4
|
"description": "OpenAI Codex (ChatGPT Pro/Plus OAuth) LLMProvider plugin for moxxy. Streams against https://chatgpt.com/backend-api/codex/responses using PKCE-based OAuth tokens.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"moxxy",
|
|
@@ -59,17 +59,17 @@
|
|
|
59
59
|
}
|
|
60
60
|
},
|
|
61
61
|
"dependencies": {
|
|
62
|
-
"@moxxy/plugin-
|
|
63
|
-
"@moxxy/plugin-
|
|
64
|
-
"@moxxy/sdk": "0.35.
|
|
62
|
+
"@moxxy/plugin-oauth": "0.35.2",
|
|
63
|
+
"@moxxy/plugin-browser": "0.35.2",
|
|
64
|
+
"@moxxy/sdk": "0.35.2"
|
|
65
65
|
},
|
|
66
66
|
"devDependencies": {
|
|
67
67
|
"@types/node": "^22.10.0",
|
|
68
68
|
"typescript": "^5.7.3",
|
|
69
69
|
"vitest": "^2.1.8",
|
|
70
70
|
"zod": "^3.24.0",
|
|
71
|
-
"@moxxy/
|
|
72
|
-
"@moxxy/
|
|
71
|
+
"@moxxy/tsconfig": "0.0.0",
|
|
72
|
+
"@moxxy/vitest-preset": "0.0.0"
|
|
73
73
|
},
|
|
74
74
|
"scripts": {
|
|
75
75
|
"build": "tsc -p tsconfig.json",
|
package/src/codex/headers.ts
CHANGED
|
@@ -4,14 +4,12 @@ import type { CodexTokens } from '../types.js';
|
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* Resolve this plugin's real version from its package.json once at module load
|
|
7
|
-
* rather than freezing a stale literal in
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* single-file CLI bundle the relative resolve fails and we keep the `0.0.0`
|
|
14
|
-
* fallback; a build-time constant would close that gap — see TECH_DEBT.)
|
|
7
|
+
* rather than freezing a stale literal in the plugin def. Resolves correctly
|
|
8
|
+
* when the package runs from its own dist (dev, tests, third-party
|
|
9
|
+
* `~/.moxxy/plugins` installs); falls back to `0.0.0` defensively — never
|
|
10
|
+
* throws. (NOTE: when inlined into the single-file CLI bundle the relative
|
|
11
|
+
* resolve fails and we keep the `0.0.0` fallback; a build-time constant would
|
|
12
|
+
* close that gap — see TECH_DEBT.)
|
|
15
13
|
*/
|
|
16
14
|
function resolvePluginVersion(): string {
|
|
17
15
|
try {
|
|
@@ -25,7 +23,16 @@ function resolvePluginVersion(): string {
|
|
|
25
23
|
|
|
26
24
|
export const PLUGIN_VERSION = resolvePluginVersion();
|
|
27
25
|
|
|
28
|
-
|
|
26
|
+
/**
|
|
27
|
+
* The Codex backend gates on `User-Agent` together with `originator` — see
|
|
28
|
+
* ORIGINATOR in `../oauth.js` for the measurement behind both. Only the
|
|
29
|
+
* `codex_cli_rs/` product token is load-bearing, not the version, so this
|
|
30
|
+
* carries a pinned literal instead of moxxy's version (which would read as a
|
|
31
|
+
* nonsense CLI release).
|
|
32
|
+
*/
|
|
33
|
+
const CODEX_CLI_VERSION = '0.51.0';
|
|
34
|
+
|
|
35
|
+
export const CODEX_USER_AGENT = `codex_cli_rs/${CODEX_CLI_VERSION}`;
|
|
29
36
|
|
|
30
37
|
export function buildCodexHeaders(tokens: CodexTokens, sessionId: string): Record<string, string> {
|
|
31
38
|
const headers: Record<string, string> = {
|
|
@@ -88,3 +88,102 @@ describe('handleSseEvent — hostile-stream bounds', () => {
|
|
|
88
88
|
expect(pending.size).toBeLessThanOrEqual(1024);
|
|
89
89
|
});
|
|
90
90
|
});
|
|
91
|
+
|
|
92
|
+
describe('handleSseEvent — in-band failures', () => {
|
|
93
|
+
// Verbatim frame the backend sends when it sheds load; it arrives inside a
|
|
94
|
+
// 200 SSE stream, so the HTTP-status classifier never sees it.
|
|
95
|
+
const overloaded = {
|
|
96
|
+
type: 'error',
|
|
97
|
+
error: {
|
|
98
|
+
type: 'service_unavailable_error',
|
|
99
|
+
code: 'server_is_overloaded',
|
|
100
|
+
message: 'Our servers are currently overloaded. Please try again later.',
|
|
101
|
+
},
|
|
102
|
+
} satisfies ResponsesSseEvent;
|
|
103
|
+
|
|
104
|
+
it('marks a server_is_overloaded error retryable so the turn survives a blip', () => {
|
|
105
|
+
const out = run(overloaded, false);
|
|
106
|
+
expect(out.terminal).toBe(true);
|
|
107
|
+
expect(out.events?.[0]).toEqual({
|
|
108
|
+
type: 'error',
|
|
109
|
+
message: 'Our servers are currently overloaded. Please try again later.',
|
|
110
|
+
retryable: true,
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
it('reads the failure out of response.failed, where it nests under response.error', () => {
|
|
115
|
+
const out = run(
|
|
116
|
+
{
|
|
117
|
+
type: 'response.failed',
|
|
118
|
+
response: {
|
|
119
|
+
status: 'failed',
|
|
120
|
+
error: { code: 'server_is_overloaded', message: 'Our servers are currently overloaded.' },
|
|
121
|
+
},
|
|
122
|
+
},
|
|
123
|
+
false,
|
|
124
|
+
);
|
|
125
|
+
expect(out.events?.[0]).toEqual({
|
|
126
|
+
type: 'error',
|
|
127
|
+
message: 'Our servers are currently overloaded.',
|
|
128
|
+
retryable: true,
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
it('retries the gateway internal fault, which arrives with no code and no type', () => {
|
|
133
|
+
const message =
|
|
134
|
+
'An error occurred while processing your request. You can retry your request, or contact us ' +
|
|
135
|
+
'through our help center at help.openai.com if the error persists. Please include the request ' +
|
|
136
|
+
'ID 1a3a7285-4738-42de-acb6-385fb334c4a5 in your message.';
|
|
137
|
+
const out = run(
|
|
138
|
+
{
|
|
139
|
+
type: 'response.failed',
|
|
140
|
+
response: { status: 'failed', error: { code: undefined, message } },
|
|
141
|
+
},
|
|
142
|
+
false,
|
|
143
|
+
);
|
|
144
|
+
expect(out.events?.[0]).toEqual({ type: 'error', message, retryable: true });
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
it('treats an explicit null code as unclassified, not as a code that failed to match', () => {
|
|
148
|
+
const out = run(
|
|
149
|
+
{
|
|
150
|
+
type: 'error',
|
|
151
|
+
// The wire shape: JSON `null`, which the declared `code?: string` hides.
|
|
152
|
+
error: { code: null, message: 'Please try again later.' } as unknown as {
|
|
153
|
+
code?: string;
|
|
154
|
+
message?: string;
|
|
155
|
+
},
|
|
156
|
+
},
|
|
157
|
+
false,
|
|
158
|
+
);
|
|
159
|
+
expect(out.events?.[0]).toMatchObject({ retryable: true });
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
it('keeps an unclassified failure fatal when its message claims nothing transient', () => {
|
|
163
|
+
const out = run(
|
|
164
|
+
{ type: 'error', error: { message: 'Your prompt was rejected by content policy.' } },
|
|
165
|
+
false,
|
|
166
|
+
);
|
|
167
|
+
expect(out.events?.[0]).toMatchObject({ retryable: false });
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
it('keeps quota exhaustion fatal — retrying cannot clear it', () => {
|
|
171
|
+
const out = run(
|
|
172
|
+
{
|
|
173
|
+
type: 'error',
|
|
174
|
+
error: { type: 'usage_limit_error', code: 'usage_limit_reached', message: 'Limit reached.' },
|
|
175
|
+
},
|
|
176
|
+
false,
|
|
177
|
+
);
|
|
178
|
+
expect(out.events?.[0]).toMatchObject({ type: 'error', retryable: false });
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
it('keeps an unrecognised failure fatal rather than guessing', () => {
|
|
182
|
+
const out = run({ type: 'response.failed' }, false);
|
|
183
|
+
expect(out.events?.[0]).toEqual({
|
|
184
|
+
type: 'error',
|
|
185
|
+
message: 'Codex stream failed: response.failed',
|
|
186
|
+
retryable: false,
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
});
|
|
@@ -26,6 +26,52 @@ const MAX_TOOL_ARGS_CHARS = 16 * 1024 * 1024;
|
|
|
26
26
|
*/
|
|
27
27
|
const MAX_PENDING_TOOL_CALLS = 1024;
|
|
28
28
|
|
|
29
|
+
/**
|
|
30
|
+
* Transient in-band failures. The Codex backend reports capacity and internal
|
|
31
|
+
* faults INSIDE a 200 SSE stream, so they never reach the HTTP-status
|
|
32
|
+
* classifier in `provider.ts` — without this the turn dies on a blip that a
|
|
33
|
+
* single retry would clear. Deliberately an allowlist: quota exhaustion and
|
|
34
|
+
* validation rejects must stay fatal, since retrying those only hammers the
|
|
35
|
+
* backend and delays the real error reaching the user.
|
|
36
|
+
*/
|
|
37
|
+
const RETRYABLE_FAILURE_CODES = new Set([
|
|
38
|
+
'server_is_overloaded',
|
|
39
|
+
'server_error',
|
|
40
|
+
'internal_error',
|
|
41
|
+
'rate_limit_exceeded',
|
|
42
|
+
]);
|
|
43
|
+
const RETRYABLE_FAILURE_TYPES = new Set([
|
|
44
|
+
'service_unavailable_error',
|
|
45
|
+
'server_error',
|
|
46
|
+
'rate_limit_error',
|
|
47
|
+
]);
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Transient-failure phrasing, consulted ONLY when the frame carries no `code`
|
|
51
|
+
* and no `type`. The Codex gateway reports its own internal faults with an
|
|
52
|
+
* error object that is just `{ code: null, message }`, so the allowlists above
|
|
53
|
+
* see nothing to match and the turn died on a fault whose own message says the
|
|
54
|
+
* request can be retried. Requiring the classification to be entirely absent
|
|
55
|
+
* keeps every typed failure (quota, validation) fatal however it is worded.
|
|
56
|
+
*/
|
|
57
|
+
const RETRYABLE_FAILURE_MESSAGE =
|
|
58
|
+
/an error occurred while processing your request|you can retry your request|please try again|temporarily unavailable|internal server error/i;
|
|
59
|
+
|
|
60
|
+
function isRetryableFailure(
|
|
61
|
+
err: { type?: string; code?: string; message?: string } | undefined,
|
|
62
|
+
): boolean {
|
|
63
|
+
if (!err) return false;
|
|
64
|
+
// `!= null` rather than `!== undefined`: the gateway sends an explicit JSON
|
|
65
|
+
// `null` for an unclassified fault, which must fall through to the message.
|
|
66
|
+
if (err.code != null || err.type != null) {
|
|
67
|
+
return (
|
|
68
|
+
(err.code != null && RETRYABLE_FAILURE_CODES.has(err.code)) ||
|
|
69
|
+
(err.type != null && RETRYABLE_FAILURE_TYPES.has(err.type))
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
return err.message !== undefined && RETRYABLE_FAILURE_MESSAGE.test(err.message);
|
|
73
|
+
}
|
|
74
|
+
|
|
29
75
|
const TOOL_STREAM_LIMIT_ERROR = (what: string): SseStepResult => ({
|
|
30
76
|
events: [{ type: 'error', message: `Codex tool-call stream exceeded ${what} limit`, retryable: false }],
|
|
31
77
|
terminal: true,
|
|
@@ -167,8 +213,12 @@ export function handleSseEvent(
|
|
|
167
213
|
}
|
|
168
214
|
|
|
169
215
|
if (type === 'response.failed' || type === 'response.error' || type === 'error') {
|
|
170
|
-
const
|
|
171
|
-
|
|
216
|
+
const err = ev.error ?? ev.response?.error;
|
|
217
|
+
const msg = err?.message ?? `Codex stream failed: ${type}`;
|
|
218
|
+
return {
|
|
219
|
+
events: [{ type: 'error', message: msg, retryable: isRetryableFailure(err) }],
|
|
220
|
+
terminal: true,
|
|
221
|
+
};
|
|
172
222
|
}
|
|
173
223
|
|
|
174
224
|
return {};
|
|
@@ -27,13 +27,15 @@ export interface ResponsesSseEvent {
|
|
|
27
27
|
response?: {
|
|
28
28
|
status?: string;
|
|
29
29
|
incomplete_details?: { reason?: string };
|
|
30
|
+
/** `response.failed` carries the failure here, NOT in the sibling `error`. */
|
|
31
|
+
error?: { type?: string; code?: string; message?: string };
|
|
30
32
|
usage?: {
|
|
31
33
|
input_tokens?: number;
|
|
32
34
|
output_tokens?: number;
|
|
33
35
|
input_tokens_details?: { cached_tokens?: number };
|
|
34
36
|
};
|
|
35
37
|
};
|
|
36
|
-
error?: { message?: string };
|
|
38
|
+
error?: { type?: string; code?: string; message?: string };
|
|
37
39
|
}
|
|
38
40
|
|
|
39
41
|
export interface SseStepResult {
|
package/src/oauth.test.ts
CHANGED
|
@@ -59,7 +59,7 @@ describe('buildAuthorizeUrl', () => {
|
|
|
59
59
|
expect(params.get('id_token_add_organizations')).toBe('true');
|
|
60
60
|
expect(params.get('codex_cli_simplified_flow')).toBe('true');
|
|
61
61
|
expect(params.get('state')).toBe('STATE');
|
|
62
|
-
expect(params.get('originator')).toBe('
|
|
62
|
+
expect(params.get('originator')).toBe('codex_cli_rs');
|
|
63
63
|
});
|
|
64
64
|
});
|
|
65
65
|
|
package/src/oauth.ts
CHANGED
|
@@ -33,7 +33,16 @@ export const DEFAULT_CALLBACK_PORT = 1455;
|
|
|
33
33
|
export const DEFAULT_REDIRECT_PATH = '/auth/callback';
|
|
34
34
|
export const DEFAULT_REDIRECT_URI = `http://localhost:${DEFAULT_CALLBACK_PORT}${DEFAULT_REDIRECT_PATH}`;
|
|
35
35
|
export const SCOPES = 'openid profile email offline_access';
|
|
36
|
-
|
|
36
|
+
/**
|
|
37
|
+
* Client identity sent to the ChatGPT Codex backend. It gates on `originator`
|
|
38
|
+
* TOGETHER WITH the `User-Agent` (see `codex/headers.ts`): a request that names
|
|
39
|
+
* anything else is throttled with in-band `server_is_overloaded` /
|
|
40
|
+
* `internal_error` failures rather than a clean rejection. Measured on one
|
|
41
|
+
* account with identical payloads interleaved back to back: the official pair
|
|
42
|
+
* succeeded 6/6 where `moxxy` managed 2/6, and matching only one of the two
|
|
43
|
+
* headers still failed. Keep this in lockstep with `CODEX_USER_AGENT`.
|
|
44
|
+
*/
|
|
45
|
+
export const ORIGINATOR = 'codex_cli_rs';
|
|
37
46
|
|
|
38
47
|
/**
|
|
39
48
|
* PKCE pair for the Codex flow. Delegates to `@moxxy/plugin-oauth`'s shared
|
package/src/provider.test.ts
CHANGED
|
@@ -116,9 +116,11 @@ describe('CodexProvider.stream', () => {
|
|
|
116
116
|
const h = captured.init?.headers as Record<string, string>;
|
|
117
117
|
expect(h['Authorization']).toBe('Bearer AT');
|
|
118
118
|
expect(h['ChatGPT-Account-Id']).toBe('acct_test');
|
|
119
|
-
|
|
119
|
+
// Both headers must name the official CLI together — the backend throttles
|
|
120
|
+
// requests that identify as anything else. See ORIGINATOR in oauth.ts.
|
|
121
|
+
expect(h['originator']).toBe('codex_cli_rs');
|
|
120
122
|
expect(h['session_id']).toBe('sess_fixed');
|
|
121
|
-
expect(h['User-Agent']).toMatch(/^
|
|
123
|
+
expect(h['User-Agent']).toMatch(/^codex_cli_rs\//);
|
|
122
124
|
expect(h['Accept']).toBe('text/event-stream');
|
|
123
125
|
|
|
124
126
|
// Event sequence: message_start, text_delta('hello'), message_end (with usage)
|