@sentropic/llm-mesh 0.24.1 → 0.26.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 +192 -0
- package/dist/catalog.d.ts +92 -0
- package/dist/catalog.d.ts.map +1 -1
- package/dist/catalog.js +47 -0
- package/dist/catalog.js.map +1 -1
- package/dist/enrollment/claude-code.d.ts +27 -5
- package/dist/enrollment/claude-code.d.ts.map +1 -1
- package/dist/enrollment/claude-code.js +224 -10
- package/dist/enrollment/claude-code.js.map +1 -1
- package/dist/enrollment/codex.d.ts +7 -0
- package/dist/enrollment/codex.d.ts.map +1 -1
- package/dist/enrollment/codex.js +74 -19
- package/dist/enrollment/codex.js.map +1 -1
- package/dist/enrollment/index.d.ts +1 -1
- package/dist/enrollment/index.d.ts.map +1 -1
- package/dist/enrollment/pkce.js +1 -1
- package/dist/errors.d.ts +19 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +51 -4
- package/dist/errors.js.map +1 -1
- package/dist/execution-features.d.ts +34 -0
- package/dist/execution-features.d.ts.map +1 -0
- package/dist/execution-features.js +84 -0
- package/dist/execution-features.js.map +1 -0
- package/dist/generated-model-council.d.ts +2 -2
- package/dist/generated-model-council.d.ts.map +1 -1
- package/dist/generated-model-council.js +5 -1
- package/dist/generated-model-council.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/native-messages.d.ts +130 -0
- package/dist/native-messages.d.ts.map +1 -0
- package/dist/native-messages.js +66 -0
- package/dist/native-messages.js.map +1 -0
- package/dist/providers.d.ts +5 -5
- package/dist/providers.d.ts.map +1 -1
- package/dist/providers.js +12 -5
- package/dist/providers.js.map +1 -1
- package/dist/responses-wire.d.ts +76 -0
- package/dist/responses-wire.d.ts.map +1 -0
- package/dist/responses-wire.js +35 -0
- package/dist/responses-wire.js.map +1 -0
- package/dist/route-attempt.d.ts +4 -0
- package/dist/route-attempt.d.ts.map +1 -1
- package/dist/route-attempt.js +8 -1
- package/dist/route-attempt.js.map +1 -1
- package/dist/route-health.d.ts +11 -0
- package/dist/route-health.d.ts.map +1 -1
- package/dist/route-health.js +32 -0
- package/dist/route-health.js.map +1 -1
- package/dist/route-planner-state.d.ts +33 -2
- package/dist/route-planner-state.d.ts.map +1 -1
- package/dist/route-planner-state.js +20 -1
- package/dist/route-planner-state.js.map +1 -1
- package/dist/route-planner.d.ts +21 -1
- package/dist/route-planner.d.ts.map +1 -1
- package/dist/route-planner.js +112 -33
- package/dist/route-planner.js.map +1 -1
- package/dist/route-quote.d.ts +16 -2
- package/dist/route-quote.d.ts.map +1 -1
- package/dist/route-quote.js +31 -5
- package/dist/route-quote.js.map +1 -1
- package/dist/route-selection.d.ts +13 -0
- package/dist/route-selection.d.ts.map +1 -1
- package/dist/route-selection.js +30 -5
- package/dist/route-selection.js.map +1 -1
- package/dist/routing-contracts.d.ts +42 -3
- package/dist/routing-contracts.d.ts.map +1 -1
- package/dist/routing-targets.d.ts +26 -0
- package/dist/routing-targets.d.ts.map +1 -1
- package/dist/routing-targets.js +96 -23
- package/dist/routing-targets.js.map +1 -1
- package/dist/service/facade.d.ts +3 -0
- package/dist/service/facade.d.ts.map +1 -1
- package/dist/service/facade.js +7 -1
- package/dist/service/facade.js.map +1 -1
- package/dist/service/local-account-transport-service.d.ts +18 -0
- package/dist/service/local-account-transport-service.d.ts.map +1 -1
- package/dist/service/local-account-transport-service.js +284 -46
- package/dist/service/local-account-transport-service.js.map +1 -1
- package/dist/transport/claude-code-runtime-client.d.ts +88 -0
- package/dist/transport/claude-code-runtime-client.d.ts.map +1 -0
- package/dist/transport/claude-code-runtime-client.js +305 -0
- package/dist/transport/claude-code-runtime-client.js.map +1 -0
- package/dist/transport/codex-runtime-client.d.ts.map +1 -1
- package/dist/transport/codex-runtime-client.js +24 -4
- package/dist/transport/codex-runtime-client.js.map +1 -1
- package/dist/transport/codex-runtime-wire.d.ts.map +1 -1
- package/dist/transport/codex-runtime-wire.js +131 -27
- package/dist/transport/codex-runtime-wire.js.map +1 -1
- package/dist/transport/mistral-runtime-client.d.ts.map +1 -1
- package/dist/transport/mistral-runtime-client.js +191 -9
- package/dist/transport/mistral-runtime-client.js.map +1 -1
- package/dist/transport/muse-runtime-client.d.ts.map +1 -1
- package/dist/transport/muse-runtime-client.js +221 -10
- package/dist/transport/muse-runtime-client.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,18 +1,232 @@
|
|
|
1
|
+
import { generateNonce, generatePkcePair } from './pkce.js';
|
|
2
|
+
// Public constants verified in official Claude Code 2.1.296 (spec ledger A2; live
|
|
3
|
+
// validation 2026-10-10: the legacy claude.ai authorize endpoint leaves the consent
|
|
4
|
+
// button permanently disabled and current grants carry the user:plugins scope).
|
|
5
|
+
const USER_SCOPES = ['user:profile', 'user:inference', 'user:sessions:claude_code',
|
|
6
|
+
'user:mcp_servers', 'user:plugins', 'user:file_upload'];
|
|
7
|
+
const BUNDLED_PROFILE = {
|
|
8
|
+
id: 'claude-code-oauth-2.1.296-v1',
|
|
9
|
+
authorizationUrl: 'https://claude.com/cai/oauth/authorize',
|
|
10
|
+
tokenUrl: 'https://platform.claude.com/v1/oauth/token',
|
|
11
|
+
clientId: '9d1c250a-e61b-44d9-88ed-5944d1962f5e',
|
|
12
|
+
redirectUri: 'https://platform.claude.com/oauth/code/callback',
|
|
13
|
+
authorizationScopes: ['org:create_api_key', ...USER_SCOPES],
|
|
14
|
+
refreshScopes: [...USER_SCOPES], requiredScopes: ['user:inference'],
|
|
15
|
+
source: 'https://registry.npmjs.org/@anthropic-ai/claude-code/2.1.296',
|
|
16
|
+
};
|
|
17
|
+
const failure = (reason) => new Error(`Claude enrollment: ${reason}; reauthenticate`);
|
|
18
|
+
// Only local preparation failures may permit replaying the same refresh grant.
|
|
19
|
+
export class ClaudeRefreshPreparationError extends Error {
|
|
20
|
+
constructor() { super('Claude refresh preparation failed; retry later'); }
|
|
21
|
+
}
|
|
22
|
+
const object = (value) => !!value && typeof value === 'object' && !Array.isArray(value);
|
|
23
|
+
const token = (value) => typeof value === 'string' && value.trim().length > 0 && !/[\r\n]/.test(value);
|
|
24
|
+
const scopes = (value) => Array.isArray(value)
|
|
25
|
+
&& value.length > 0 && value.every((item) => typeof item === 'string' && /^[a-z0-9:_-]+$/.test(item));
|
|
26
|
+
const httpsUrl = (value) => {
|
|
27
|
+
if (typeof value !== 'string')
|
|
28
|
+
return false;
|
|
29
|
+
try {
|
|
30
|
+
const url = new URL(value);
|
|
31
|
+
return url.protocol === 'https:' && !url.username && !url.password && !url.search && !url.hash;
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
function validateProfile(value) {
|
|
38
|
+
if (!object(value) || typeof value.id !== 'string' || !/^[a-z0-9][a-z0-9._-]{2,99}$/.test(value.id)
|
|
39
|
+
|| value.id === 'v1.0.0' || !httpsUrl(value.authorizationUrl) || !httpsUrl(value.tokenUrl)
|
|
40
|
+
|| !httpsUrl(value.redirectUri) || !httpsUrl(value.source) || !token(value.clientId)
|
|
41
|
+
|| !scopes(value.authorizationScopes) || !scopes(value.refreshScopes) || !scopes(value.requiredScopes)
|
|
42
|
+
|| !value.requiredScopes.includes('user:inference')
|
|
43
|
+
|| !value.requiredScopes.every((scope) => value.authorizationScopes.includes(scope)
|
|
44
|
+
&& value.refreshScopes.includes(scope)))
|
|
45
|
+
throw failure('invalid OAuth profile');
|
|
46
|
+
const profile = { id: value.id, authorizationUrl: value.authorizationUrl,
|
|
47
|
+
tokenUrl: value.tokenUrl, redirectUri: value.redirectUri, clientId: value.clientId,
|
|
48
|
+
source: value.source, authorizationScopes: [...value.authorizationScopes],
|
|
49
|
+
refreshScopes: [...value.refreshScopes], requiredScopes: [...value.requiredScopes] };
|
|
50
|
+
if (profile.id === BUNDLED_PROFILE.id && JSON.stringify(profile) !== JSON.stringify({
|
|
51
|
+
...profile, ...BUNDLED_PROFILE,
|
|
52
|
+
}))
|
|
53
|
+
throw failure('reserved OAuth profile');
|
|
54
|
+
return profile;
|
|
55
|
+
}
|
|
1
56
|
export class ClaudeCodeEnrollmentProvider {
|
|
2
|
-
|
|
3
|
-
|
|
57
|
+
options;
|
|
58
|
+
fetchFn;
|
|
59
|
+
now;
|
|
60
|
+
metadata = new WeakMap();
|
|
61
|
+
sessions = new Map();
|
|
62
|
+
constructor(options = {}) {
|
|
63
|
+
this.options = options;
|
|
64
|
+
this.fetchFn = options.fetchFn ?? fetch;
|
|
65
|
+
this.now = options.nowFn ?? Date.now;
|
|
66
|
+
}
|
|
67
|
+
async profile(configRef, refresh = false) {
|
|
68
|
+
if (refresh && configRef === BUNDLED_PROFILE.id)
|
|
69
|
+
return BUNDLED_PROFILE;
|
|
70
|
+
if (refresh && (!configRef || configRef === 'v1.0.0'))
|
|
71
|
+
throw failure('unknown OAuth profile');
|
|
72
|
+
let value;
|
|
73
|
+
try {
|
|
74
|
+
value = await this.options.configResolver?.resolveConfig(configRef);
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
if (refresh)
|
|
78
|
+
throw new ClaudeRefreshPreparationError();
|
|
79
|
+
throw failure('OAuth profile resolution failed');
|
|
80
|
+
}
|
|
81
|
+
if (!this.options.configResolver || (object(value) && Object.keys(value).length === 0)) {
|
|
82
|
+
if (refresh)
|
|
83
|
+
throw failure('unknown OAuth profile');
|
|
84
|
+
return BUNDLED_PROFILE;
|
|
85
|
+
}
|
|
86
|
+
const profile = validateProfile(value);
|
|
87
|
+
if (refresh && profile.id !== configRef)
|
|
88
|
+
throw failure('OAuth profile version mismatch');
|
|
89
|
+
return profile;
|
|
90
|
+
}
|
|
91
|
+
async start(input) {
|
|
92
|
+
if (!input.ownerScope?.trim())
|
|
93
|
+
throw failure('ownerScope is required');
|
|
94
|
+
const profile = await this.profile(input.configRef);
|
|
95
|
+
if (input.redirectUri && input.redirectUri !== profile.redirectUri)
|
|
96
|
+
throw failure('redirect mismatch');
|
|
97
|
+
const { codeVerifier, codeChallenge } = generatePkcePair();
|
|
98
|
+
const state = generateNonce();
|
|
99
|
+
const enrollmentId = `enr_claude_${generateNonce()}`;
|
|
100
|
+
const expiresAt = this.now() + 15 * 60_000;
|
|
101
|
+
const url = new URL(profile.authorizationUrl);
|
|
102
|
+
url.search = new URLSearchParams({ code: 'true', response_type: 'code', client_id: profile.clientId,
|
|
103
|
+
redirect_uri: profile.redirectUri, scope: profile.authorizationScopes.join(' '),
|
|
104
|
+
code_challenge: codeChallenge, code_challenge_method: 'S256', state }).toString();
|
|
105
|
+
const timer = setTimeout(() => { void this.cancel(enrollmentId); }, 15 * 60_000);
|
|
106
|
+
timer.unref?.();
|
|
107
|
+
this.sessions.set(enrollmentId, { profile, verifier: codeVerifier, state, expiresAt,
|
|
108
|
+
consumed: false, controller: new AbortController(), timer });
|
|
109
|
+
return { kind: 'authorization-url', enrollmentId, url: url.toString(), expiresAt: new Date(expiresAt).toISOString() };
|
|
110
|
+
}
|
|
111
|
+
async complete(input) {
|
|
112
|
+
const session = this.sessions.get(input.enrollmentId);
|
|
113
|
+
if (!session || session.consumed)
|
|
114
|
+
throw failure('session unavailable');
|
|
115
|
+
session.consumed = true;
|
|
116
|
+
try {
|
|
117
|
+
const parts = typeof input.code === 'string' ? input.code.split('#') : [];
|
|
118
|
+
if (this.now() >= session.expiresAt || parts.length !== 2 || !token(parts[0])
|
|
119
|
+
|| parts[1] !== session.state)
|
|
120
|
+
throw failure('invalid code, state or expired session');
|
|
121
|
+
const value = await this.exchange(session.profile, { grant_type: 'authorization_code',
|
|
122
|
+
code: parts[0], state: session.state, code_verifier: session.verifier,
|
|
123
|
+
client_id: session.profile.clientId, redirect_uri: session.profile.redirectUri }, session.controller);
|
|
124
|
+
if (this.sessions.get(input.enrollmentId) !== session || session.controller.signal.aborted
|
|
125
|
+
|| this.now() >= session.expiresAt)
|
|
126
|
+
throw failure('session cancelled or expired');
|
|
127
|
+
return this.grant(value, session.profile, `acct_claude_${generateNonce()}`, 'browser');
|
|
128
|
+
}
|
|
129
|
+
finally {
|
|
130
|
+
await this.cancel(input.enrollmentId);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
async importCredential(credentialJson) {
|
|
134
|
+
if (typeof credentialJson !== 'string' || new TextEncoder().encode(credentialJson).length > 65_536) {
|
|
135
|
+
throw failure('invalid credential document');
|
|
136
|
+
}
|
|
137
|
+
let value;
|
|
138
|
+
try {
|
|
139
|
+
value = JSON.parse(credentialJson);
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
throw failure('Paste the renewable Claude CLI credential or use browser enrollment');
|
|
143
|
+
}
|
|
144
|
+
if (object(value) && Object.hasOwn(value, 'claudeAiOauth'))
|
|
145
|
+
value = value.claudeAiOauth;
|
|
146
|
+
if (!object(value))
|
|
147
|
+
throw failure('invalid credential document');
|
|
148
|
+
const profile = await this.profile('claude-code');
|
|
149
|
+
return this.prepare(value.accessToken, value.refreshToken, value.expiresAt, value.scopes, profile, `acct_claude_${generateNonce()}`, 'credential-import');
|
|
150
|
+
}
|
|
151
|
+
async resolve(credential) {
|
|
152
|
+
const metadata = this.metadata.get(credential);
|
|
153
|
+
return metadata ? { ...metadata, scopes: [...metadata.scopes] } : {};
|
|
154
|
+
}
|
|
155
|
+
prepare(access, refresh, expiry, grantedScopes, profile, accountId, method) {
|
|
156
|
+
if (!token(access) || !token(refresh) || typeof expiry !== 'number' || expiry <= 0
|
|
157
|
+
|| !Number.isFinite(expiry) || !Number.isFinite(new Date(expiry).getTime())
|
|
158
|
+
|| !scopes(grantedScopes) || !profile.requiredScopes.every((scope) => grantedScopes.includes(scope))
|
|
159
|
+
|| !grantedScopes.every((scope) => profile.authorizationScopes.includes(scope))) {
|
|
160
|
+
throw failure('invalid renewable grant');
|
|
161
|
+
}
|
|
162
|
+
const credential = { accountId, accessToken: access, refreshToken: refresh,
|
|
163
|
+
expiresAt: new Date(expiry).toISOString(), authClientConfigVersion: profile.id };
|
|
164
|
+
this.metadata.set(credential, { billing_type: 'seat', enrollmentMethod: method,
|
|
165
|
+
authClientConfigVersion: profile.id, refreshManagement: 'mesh', scopes: [...grantedScopes] });
|
|
166
|
+
return credential;
|
|
4
167
|
}
|
|
5
|
-
|
|
6
|
-
|
|
168
|
+
grant(value, profile, accountId, method, previousRefresh, previousScopes) {
|
|
169
|
+
if (!object(value) || typeof value.expires_in !== 'number' || !Number.isFinite(value.expires_in)
|
|
170
|
+
|| value.expires_in <= 0 || (Object.hasOwn(value, 'scope') && typeof value.scope !== 'string')) {
|
|
171
|
+
throw failure('invalid token response');
|
|
172
|
+
}
|
|
173
|
+
const expiry = this.now() + value.expires_in * 1000;
|
|
174
|
+
if (expiry <= this.now())
|
|
175
|
+
throw failure('invalid token expiry');
|
|
176
|
+
return this.prepare(value.access_token, Object.hasOwn(value, 'refresh_token') ? value.refresh_token : previousRefresh, expiry, typeof value.scope === 'string' ? value.scope.split(' ') : previousScopes, profile, accountId, method);
|
|
7
177
|
}
|
|
8
|
-
async
|
|
9
|
-
|
|
178
|
+
async exchange(profile, body, controller = new AbortController()) {
|
|
179
|
+
let timer;
|
|
180
|
+
const deadline = new Promise((_, reject) => {
|
|
181
|
+
timer = setTimeout(() => { controller.abort(); reject(failure('token request timed out')); }, 30_000);
|
|
182
|
+
});
|
|
183
|
+
try {
|
|
184
|
+
return await Promise.race([deadline, (async () => {
|
|
185
|
+
let response;
|
|
186
|
+
let value;
|
|
187
|
+
try {
|
|
188
|
+
response = await this.fetchFn(profile.tokenUrl, { method: 'POST', redirect: 'error',
|
|
189
|
+
headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body), signal: controller.signal });
|
|
190
|
+
}
|
|
191
|
+
catch {
|
|
192
|
+
throw failure('token request failed');
|
|
193
|
+
}
|
|
194
|
+
try {
|
|
195
|
+
value = await response.json();
|
|
196
|
+
}
|
|
197
|
+
catch {
|
|
198
|
+
throw failure(`HTTP ${response.status} invalid_response`);
|
|
199
|
+
}
|
|
200
|
+
if (!response.ok) {
|
|
201
|
+
const code = object(value) && typeof value.error === 'string'
|
|
202
|
+
&& ['invalid_grant', 'invalid_request', 'invalid_client', 'unauthorized_client',
|
|
203
|
+
'unsupported_grant_type', 'invalid_scope', 'access_denied'].includes(value.error) ? value.error : 'oauth_error';
|
|
204
|
+
throw failure(`HTTP ${response.status} ${code}`);
|
|
205
|
+
}
|
|
206
|
+
return value;
|
|
207
|
+
})()]);
|
|
208
|
+
}
|
|
209
|
+
finally {
|
|
210
|
+
clearTimeout(timer);
|
|
211
|
+
}
|
|
10
212
|
}
|
|
11
|
-
async refresh(
|
|
12
|
-
|
|
213
|
+
async refresh(input) {
|
|
214
|
+
const profile = await this.profile(input.credentialVersion, true);
|
|
215
|
+
if (!token(input.refreshToken))
|
|
216
|
+
throw failure('missing or invalid refresh token');
|
|
217
|
+
const value = await this.exchange(profile, { grant_type: 'refresh_token',
|
|
218
|
+
refresh_token: input.refreshToken, client_id: profile.clientId, scope: profile.refreshScopes.join(' ') });
|
|
219
|
+
return this.grant(value, profile, input.accountId, 'refresh', input.refreshToken, input.grantedScopes);
|
|
13
220
|
}
|
|
14
|
-
async cancel(
|
|
15
|
-
|
|
221
|
+
async cancel(enrollmentId) {
|
|
222
|
+
const session = this.sessions.get(enrollmentId);
|
|
223
|
+
if (!session)
|
|
224
|
+
return;
|
|
225
|
+
this.sessions.delete(enrollmentId);
|
|
226
|
+
clearTimeout(session.timer);
|
|
227
|
+
session.controller.abort();
|
|
228
|
+
session.verifier = '';
|
|
229
|
+
session.state = '';
|
|
16
230
|
}
|
|
17
231
|
}
|
|
18
232
|
//# sourceMappingURL=claude-code.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../src/enrollment/claude-code.ts"],"names":[],"mappings":"AAUA,MAAM,OAAO,4BAA4B;IACvC,KAAK,CAAC,KAAK,CAAC,MAA4B;QACtC,MAAM,IAAI,KAAK,CACb,8GAA8G,CAC/G,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,MAA+B;QAC5C,MAAM,IAAI,KAAK,CACb,8GAA8G,CAC/G,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,WAA+B;QAC3C,MAAM,IAAI,KAAK,CACb,8GAA8G,CAC/G,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,MAAoB;QAChC,MAAM,IAAI,KAAK,CACb,2GAA2G,CAC5G,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,aAAqB;QAChC,aAAa;IACf,CAAC;CACF"}
|
|
1
|
+
{"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../src/enrollment/claude-code.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,6 +11,13 @@ export interface CodexEnrollmentOptions {
|
|
|
11
11
|
configResolver?: ConfigResolver;
|
|
12
12
|
fetchFn?: typeof fetch;
|
|
13
13
|
}
|
|
14
|
+
/**
|
|
15
|
+
* Transient network retries per device-flow fetch site. A device flow lasts
|
|
16
|
+
* minutes by design, so a poll/exchange fetch throw follows the same
|
|
17
|
+
* sleep-then-continue path as a 403 pending poll within the configured
|
|
18
|
+
* budgets — response-body reads and non-transient failures still fail fast.
|
|
19
|
+
*/
|
|
20
|
+
export declare const CODEX_POLL_NETWORK_RETRIES = 3;
|
|
14
21
|
export declare class CodexEnrollmentProvider implements EnrollmentProvider {
|
|
15
22
|
private readonly defaultClientId;
|
|
16
23
|
private readonly configResolver?;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../src/enrollment/codex.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EACV,uBAAuB,EACvB,kBAAkB,EAClB,iBAAiB,EAEjB,kBAAkB,EAClB,YAAY,EACZ,wBAAwB,EACxB,oBAAoB,EACrB,MAAM,gBAAgB,CAAC;AAExB,eAAO,MAAM,iBAAiB,4BAA4B,CAAC;AAC3D,eAAO,MAAM,eAAe,iCAAiC,CAAC;AAC9D,eAAO,MAAM,qBAAqB,6DAA0D,CAAC;AAC7F,eAAO,MAAM,sBAAsB,0DAAuD,CAAC;AAC3F,eAAO,MAAM,qBAAqB,wCAAqC,CAAC;AACxE,eAAO,MAAM,sBAAsB,yCAAsC,CAAC;AAE1E,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;CACxB;AAED,qBAAa,uBAAwB,YAAW,kBAAkB;IAChE,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAiB;IACjD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IACvC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CASrB;IACJ,OAAO,CAAC,QAAQ,CAAK;gBAET,OAAO,GAAE,sBAA2B;YAMlC,WAAW;IAYnB,KAAK,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAgE9D,iBAAiB,CACrB,YAAY,EAAE,MAAM,EACpB,WAAW,SAAK,GACf,OAAO,CAAC;QACT,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,CAAC,EAAE,kBAAkB,CAAC;KACjC,CAAC;
|
|
1
|
+
{"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../src/enrollment/codex.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EACV,uBAAuB,EACvB,kBAAkB,EAClB,iBAAiB,EAEjB,kBAAkB,EAClB,YAAY,EACZ,wBAAwB,EACxB,oBAAoB,EACrB,MAAM,gBAAgB,CAAC;AAExB,eAAO,MAAM,iBAAiB,4BAA4B,CAAC;AAC3D,eAAO,MAAM,eAAe,iCAAiC,CAAC;AAC9D,eAAO,MAAM,qBAAqB,6DAA0D,CAAC;AAC7F,eAAO,MAAM,sBAAsB,0DAAuD,CAAC;AAC3F,eAAO,MAAM,qBAAqB,wCAAqC,CAAC;AACxE,eAAO,MAAM,sBAAsB,yCAAsC,CAAC;AAE1E,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;CACxB;AAED;;;;;GAKG;AACH,eAAO,MAAM,0BAA0B,IAAI,CAAC;AAe5C,qBAAa,uBAAwB,YAAW,kBAAkB;IAChE,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAiB;IACjD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IACvC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CASrB;IACJ,OAAO,CAAC,QAAQ,CAAK;gBAET,OAAO,GAAE,sBAA2B;YAMlC,WAAW;IAYnB,KAAK,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAgE9D,iBAAiB,CACrB,YAAY,EAAE,MAAM,EACpB,WAAW,SAAK,GACf,OAAO,CAAC;QACT,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,CAAC,EAAE,kBAAkB,CAAC;KACjC,CAAC;IA6II,QAAQ,CAAC,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAmBrE,OAAO,CAAC,UAAU,EAAE,kBAAkB,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAO1E,OAAO,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,kBAAkB,CAAC;IA8CzD,MAAM,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAMlD"}
|
package/dist/enrollment/codex.js
CHANGED
|
@@ -4,6 +4,26 @@ export const CODEX_DEVICE_AUTH_URL = `${CODEX_AUTH_ISSUER}/api/accounts/deviceau
|
|
|
4
4
|
export const CODEX_DEVICE_TOKEN_URL = `${CODEX_AUTH_ISSUER}/api/accounts/deviceauth/token`;
|
|
5
5
|
export const CODEX_OAUTH_TOKEN_URL = `${CODEX_AUTH_ISSUER}/oauth/token`;
|
|
6
6
|
export const CODEX_VERIFICATION_URL = `${CODEX_AUTH_ISSUER}/codex/device`;
|
|
7
|
+
/**
|
|
8
|
+
* Transient network retries per device-flow fetch site. A device flow lasts
|
|
9
|
+
* minutes by design, so a poll/exchange fetch throw follows the same
|
|
10
|
+
* sleep-then-continue path as a 403 pending poll within the configured
|
|
11
|
+
* budgets — response-body reads and non-transient failures still fail fast.
|
|
12
|
+
*/
|
|
13
|
+
export const CODEX_POLL_NETWORK_RETRIES = 3;
|
|
14
|
+
/**
|
|
15
|
+
* Network detail for client-facing exhaustion errors: cause-code preferred
|
|
16
|
+
* (`e.cause.code`: ETIMEDOUT, ECONNRESET, ...), otherwise the raw message
|
|
17
|
+
* (expressly allowed by spec §15.6). Raw system messages can carry
|
|
18
|
+
* hostnames/paths, so they never ride out alongside a code — the site,
|
|
19
|
+
* retry count and URL already frame it.
|
|
20
|
+
*/
|
|
21
|
+
const networkErrorDetail = (error) => {
|
|
22
|
+
const code = error?.cause?.code;
|
|
23
|
+
if (typeof code === 'string' && code)
|
|
24
|
+
return code;
|
|
25
|
+
return error instanceof Error ? error.message : String(error);
|
|
26
|
+
};
|
|
7
27
|
export class CodexEnrollmentProvider {
|
|
8
28
|
defaultClientId;
|
|
9
29
|
configResolver;
|
|
@@ -84,21 +104,38 @@ export class CodexEnrollmentProvider {
|
|
|
84
104
|
throw new Error(`Enrollment session ${enrollmentId} not found`);
|
|
85
105
|
}
|
|
86
106
|
const clientId = await this.getClientId();
|
|
107
|
+
let pollNetworkFailures = 0;
|
|
87
108
|
for (let attempt = 0; attempt < maxAttempts; attempt += 1) {
|
|
88
109
|
if (entry.state.cancelledAt) {
|
|
89
110
|
throw new Error(`Enrollment session ${enrollmentId} was cancelled`);
|
|
90
111
|
}
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
112
|
+
let response;
|
|
113
|
+
try {
|
|
114
|
+
response = await this.fetchFn(CODEX_DEVICE_TOKEN_URL, {
|
|
115
|
+
method: 'POST',
|
|
116
|
+
headers: {
|
|
117
|
+
'content-type': 'application/json',
|
|
118
|
+
accept: 'application/json',
|
|
119
|
+
},
|
|
120
|
+
body: JSON.stringify({
|
|
121
|
+
device_auth_id: entry.deviceAuthId,
|
|
122
|
+
user_code: entry.userCode,
|
|
123
|
+
}),
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
// Transient poll-fetch blip: same sleep-then-continue path as a 403
|
|
128
|
+
// pending poll — poll/exchange fetch throws retry within the
|
|
129
|
+
// configured budgets (which share the poll's maxAttempts budget).
|
|
130
|
+
pollNetworkFailures += 1;
|
|
131
|
+
if (pollNetworkFailures > CODEX_POLL_NETWORK_RETRIES) {
|
|
132
|
+
throw new Error(`Codex device poll failed (network, ${CODEX_POLL_NETWORK_RETRIES} retries exhausted)`
|
|
133
|
+
+ ` at ${CODEX_DEVICE_TOKEN_URL}: ${networkErrorDetail(error)}`);
|
|
134
|
+
}
|
|
135
|
+
await new Promise((res) => setTimeout(res, entry.pollIntervalMs * pollNetworkFailures));
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
pollNetworkFailures = 0;
|
|
102
139
|
if (response.status === 403) {
|
|
103
140
|
// P0-3: Wait for pollIntervalMs without hardcoded 50ms cap
|
|
104
141
|
await new Promise((res) => setTimeout(res, entry.pollIntervalMs));
|
|
@@ -120,14 +157,32 @@ export class CodexEnrollmentProvider {
|
|
|
120
157
|
client_id: clientId,
|
|
121
158
|
code_verifier: tokenPayload.code_verifier,
|
|
122
159
|
});
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
160
|
+
let exchangeResponse;
|
|
161
|
+
let exchangeNetworkFailures = 0;
|
|
162
|
+
for (;;) {
|
|
163
|
+
try {
|
|
164
|
+
exchangeResponse = await this.fetchFn(CODEX_OAUTH_TOKEN_URL, {
|
|
165
|
+
method: 'POST',
|
|
166
|
+
headers: {
|
|
167
|
+
'content-type': 'application/x-www-form-urlencoded',
|
|
168
|
+
accept: 'application/json',
|
|
169
|
+
},
|
|
170
|
+
body: exchangeBody,
|
|
171
|
+
});
|
|
172
|
+
break;
|
|
173
|
+
}
|
|
174
|
+
catch (error) {
|
|
175
|
+
exchangeNetworkFailures += 1;
|
|
176
|
+
if (exchangeNetworkFailures > CODEX_POLL_NETWORK_RETRIES) {
|
|
177
|
+
throw new Error(`Codex OAuth token exchange failed (network, ${CODEX_POLL_NETWORK_RETRIES} retries exhausted)`
|
|
178
|
+
+ ` at ${CODEX_OAUTH_TOKEN_URL}: ${networkErrorDetail(error)}`);
|
|
179
|
+
}
|
|
180
|
+
await new Promise((res) => setTimeout(res, entry.pollIntervalMs * exchangeNetworkFailures));
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
if (!exchangeResponse) {
|
|
184
|
+
throw new Error('Codex OAuth token exchange failed (network): no response');
|
|
185
|
+
}
|
|
131
186
|
if (!exchangeResponse.ok) {
|
|
132
187
|
const text = await exchangeResponse.text().catch(() => '');
|
|
133
188
|
throw new Error(`Codex OAuth token exchange failed (${exchangeResponse.status}): ${text}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/enrollment/codex.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/enrollment/codex.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export type { AccountPublic, CredentialEnvelope, EnrollmentProvider, EnrollmentSession, PreparedCredential, ResolvedProviderMetadata, StartEnrollmentInput, } from './contracts.js';
|
|
1
|
+
export type { AccountPublic, CredentialEnvelope, EnrollmentCompletion, EnrollmentProvider, EnrollmentSession, PreparedCredential, ResolvedProviderMetadata, StartEnrollmentInput, } from './contracts.js';
|
|
2
2
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/enrollment/index.ts"],"names":[],"mappings":"AAEA,YAAY,EACV,aAAa,EACb,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/enrollment/index.ts"],"names":[],"mappings":"AAEA,YAAY,EACV,aAAa,EACb,kBAAkB,EAClB,oBAAoB,EACpB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,gBAAgB,CAAC"}
|
package/dist/enrollment/pkce.js
CHANGED
|
@@ -11,7 +11,7 @@ export function generatePkcePair() {
|
|
|
11
11
|
return { codeVerifier, codeChallenge };
|
|
12
12
|
}
|
|
13
13
|
export function generateNonce() {
|
|
14
|
-
return base64Url(randomBytes(
|
|
14
|
+
return base64Url(randomBytes(32));
|
|
15
15
|
}
|
|
16
16
|
export async function createLoopbackServer(expectedState, preferredPort = 0) {
|
|
17
17
|
let server = null;
|
package/dist/errors.d.ts
CHANGED
|
@@ -1,4 +1,22 @@
|
|
|
1
1
|
import type { ProviderId } from './providers.js';
|
|
2
|
+
/** Trusted transport measurement; never derive numbers from provider prose or caller headers. */
|
|
3
|
+
export interface RequestSizeDetail {
|
|
4
|
+
readonly requestBytes: number;
|
|
5
|
+
readonly limitBytes?: number;
|
|
6
|
+
readonly sizeIsLowerBound?: boolean;
|
|
7
|
+
readonly source: 'gateway' | 'upstream';
|
|
8
|
+
}
|
|
9
|
+
export declare const readRequestSizeDetail: (value: unknown) => RequestSizeDetail | undefined;
|
|
10
|
+
export declare class RequestTooLargeError extends Error {
|
|
11
|
+
readonly status = 413;
|
|
12
|
+
readonly code = "request_too_large";
|
|
13
|
+
readonly requestSize: RequestSizeDetail;
|
|
14
|
+
constructor(detail: RequestSizeDetail);
|
|
15
|
+
}
|
|
16
|
+
/** Bounded cause traversal retains typed size evidence across runtime/SDK wrappers. */
|
|
17
|
+
export declare const requestTooLargeDetail: (error: unknown) => {
|
|
18
|
+
requestSize?: RequestSizeDetail;
|
|
19
|
+
} | undefined;
|
|
2
20
|
export type ProviderErrorRetryReason = 'rate_limit' | 'timeout' | 'server_error' | 'network' | 'overloaded' | 'unknown';
|
|
3
21
|
export interface NormalizedProviderError {
|
|
4
22
|
providerId: ProviderId;
|
|
@@ -10,6 +28,7 @@ export interface NormalizedProviderError {
|
|
|
10
28
|
statusCode?: number;
|
|
11
29
|
cause?: unknown;
|
|
12
30
|
metadata?: Record<string, unknown>;
|
|
31
|
+
requestSize?: RequestSizeDetail;
|
|
13
32
|
}
|
|
14
33
|
export interface ProviderErrorNormalizationOptions {
|
|
15
34
|
defaultMessage?: string;
|
package/dist/errors.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEjD,MAAM,MAAM,wBAAwB,GAChC,YAAY,GACZ,SAAS,GACT,cAAc,GACd,SAAS,GACT,YAAY,GACZ,SAAS,CAAC;AAEd,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE,UAAU,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,wBAAwB,CAAC;IACvC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEjD,iGAAiG;AACjG,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,UAAU,CAAC;CACzC;AAED,eAAO,MAAM,qBAAqB,UAAW,OAAO,KAAG,iBAAiB,GAAG,SAS1E,CAAC;AAEF,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,QAAQ,CAAC,MAAM,OAAO;IACtB,QAAQ,CAAC,IAAI,uBAAuB;IACpC,QAAQ,CAAC,WAAW,EAAE,iBAAiB,CAAC;gBAC5B,MAAM,EAAE,iBAAiB;CAOtC;AAED,uFAAuF;AACvF,eAAO,MAAM,qBAAqB,UAAW,OAAO,KAAG;IAAE,WAAW,CAAC,EAAE,iBAAiB,CAAA;CAAE,GAAG,SAgB5F,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAChC,YAAY,GACZ,SAAS,GACT,cAAc,GACd,SAAS,GACT,YAAY,GACZ,SAAS,CAAC;AAEd,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE,UAAU,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,wBAAwB,CAAC;IACvC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,WAAW,CAAC,EAAE,iBAAiB,CAAC;CACjC;AAED,MAAM,WAAW,iCAAiC;IAChD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,iBAAiB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,oBAAoB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC1C;AA6CD,eAAO,MAAM,wBAAwB,eACvB,MAAM,GAAG,SAAS,QACxB,MAAM,GAAG,SAAS,YACf,iCAAiC,KACzC,OAcF,CAAC;AAEF,eAAO,MAAM,sBAAsB,eACrB,UAAU,SACf,OAAO,YACL,iCAAiC,KACzC,uBAwCF,CAAC"}
|
package/dist/errors.js
CHANGED
|
@@ -1,3 +1,45 @@
|
|
|
1
|
+
export const readRequestSizeDetail = (value) => {
|
|
2
|
+
const detail = value;
|
|
3
|
+
if (!detail || typeof detail !== 'object' || !Number.isSafeInteger(detail.requestBytes)
|
|
4
|
+
|| detail.requestBytes < 0 || (detail.source !== 'gateway' && detail.source !== 'upstream')
|
|
5
|
+
|| (detail.limitBytes !== undefined && (!Number.isSafeInteger(detail.limitBytes) || detail.limitBytes <= 0))
|
|
6
|
+
|| (detail.sizeIsLowerBound !== undefined && typeof detail.sizeIsLowerBound !== 'boolean'))
|
|
7
|
+
return undefined;
|
|
8
|
+
return Object.freeze({ requestBytes: detail.requestBytes, source: detail.source,
|
|
9
|
+
...(detail.limitBytes !== undefined ? { limitBytes: detail.limitBytes } : {}),
|
|
10
|
+
...(detail.sizeIsLowerBound !== undefined ? { sizeIsLowerBound: detail.sizeIsLowerBound } : {}) });
|
|
11
|
+
};
|
|
12
|
+
export class RequestTooLargeError extends Error {
|
|
13
|
+
status = 413;
|
|
14
|
+
code = 'request_too_large';
|
|
15
|
+
requestSize;
|
|
16
|
+
constructor(detail) {
|
|
17
|
+
super('Request body is too large');
|
|
18
|
+
this.name = 'RequestTooLargeError';
|
|
19
|
+
const safe = readRequestSizeDetail(detail);
|
|
20
|
+
if (!safe)
|
|
21
|
+
throw new TypeError('Invalid request size measurement');
|
|
22
|
+
this.requestSize = safe;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/** Bounded cause traversal retains typed size evidence across runtime/SDK wrappers. */
|
|
26
|
+
export const requestTooLargeDetail = (error) => {
|
|
27
|
+
let current = error;
|
|
28
|
+
let detected = false;
|
|
29
|
+
let requestSize;
|
|
30
|
+
const seen = new Set();
|
|
31
|
+
for (let depth = 0; depth < 8 && current && typeof current === 'object' && !seen.has(current); depth++) {
|
|
32
|
+
seen.add(current);
|
|
33
|
+
const record = current;
|
|
34
|
+
const metadata = record.metadata;
|
|
35
|
+
requestSize ??= readRequestSizeDetail(record.requestSize) ?? readRequestSizeDetail(metadata?.requestSize);
|
|
36
|
+
detected ||= record.status === 413 || record.statusCode === 413 || record.kind === 'request-too-large'
|
|
37
|
+
|| [record.code, record.type].some(value => typeof value === 'string'
|
|
38
|
+
&& ['request_too_large', 'request-too-large'].includes(value.toLowerCase()));
|
|
39
|
+
current = record.cause ?? record.error ?? record.response;
|
|
40
|
+
}
|
|
41
|
+
return detected ? { ...(requestSize ? { requestSize } : {}) } : undefined;
|
|
42
|
+
};
|
|
1
43
|
const defaultRetryableStatusCodes = [408, 409, 425, 429, 500, 502, 503, 504];
|
|
2
44
|
const defaultRetryableCodes = [
|
|
3
45
|
'rate_limit',
|
|
@@ -37,6 +79,9 @@ const inferRetryReason = (statusCode, code) => {
|
|
|
37
79
|
return undefined;
|
|
38
80
|
};
|
|
39
81
|
export const isRetryableProviderError = (statusCode, code, options = {}) => {
|
|
82
|
+
if (statusCode === 413 || code?.toLowerCase() === 'request_too_large'
|
|
83
|
+
|| code?.toLowerCase() === 'request-too-large')
|
|
84
|
+
return false;
|
|
40
85
|
const retryableStatusCodes = options.retryableStatusCodes ?? defaultRetryableStatusCodes;
|
|
41
86
|
const retryableCodes = options.retryableCodes ?? defaultRetryableCodes;
|
|
42
87
|
const nonRetryableCodes = options.nonRetryableCodes ?? [];
|
|
@@ -52,15 +97,16 @@ export const isRetryableProviderError = (statusCode, code, options = {}) => {
|
|
|
52
97
|
export const normalizeProviderError = (providerId, error, options = {}) => {
|
|
53
98
|
const record = asRecord(error);
|
|
54
99
|
const nested = nestedErrorRecord(record);
|
|
55
|
-
const
|
|
100
|
+
const tooLarge = requestTooLargeDetail(error);
|
|
101
|
+
const statusCode = (tooLarge ? 413 : undefined) || readNumber(record, 'statusCode') ||
|
|
56
102
|
readNumber(record, 'status') ||
|
|
57
103
|
readNumber(nested, 'statusCode') ||
|
|
58
104
|
readNumber(nested, 'status');
|
|
59
|
-
const code = readString(record, 'code') ||
|
|
105
|
+
const code = (tooLarge ? 'request_too_large' : undefined) || readString(record, 'code') ||
|
|
60
106
|
readString(record, 'type') ||
|
|
61
107
|
readString(nested, 'code') ||
|
|
62
108
|
readString(nested, 'status');
|
|
63
|
-
const message = readString(record, 'message') ||
|
|
109
|
+
const message = (tooLarge ? 'Request body is too large' : undefined) || readString(record, 'message') ||
|
|
64
110
|
readString(nested, 'message') ||
|
|
65
111
|
(error instanceof Error && error.message) ||
|
|
66
112
|
options.defaultMessage ||
|
|
@@ -77,7 +123,8 @@ export const normalizeProviderError = (providerId, error, options = {}) => {
|
|
|
77
123
|
retryable,
|
|
78
124
|
...(code ? { code } : {}),
|
|
79
125
|
...(retryReason ? { retryReason } : {}),
|
|
80
|
-
...(retryAfterMs ? { retryAfterMs } : {}),
|
|
126
|
+
...(!tooLarge && retryAfterMs ? { retryAfterMs } : {}),
|
|
127
|
+
...(tooLarge?.requestSize ? { requestSize: tooLarge.requestSize } : {}),
|
|
81
128
|
...(typeof statusCode === 'number' ? { statusCode } : {}),
|
|
82
129
|
...(error instanceof Error || record ? { cause: error } : {}),
|
|
83
130
|
};
|
package/dist/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
|