@omnicross/core 0.1.5 → 0.1.7
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/ApiConverter.cjs +2 -2
- package/dist/ApiConverter.js +1 -1
- package/dist/{CompletionService-DdWaAxq0.d.ts → CompletionService-C3BX0Ovy.d.ts} +4 -3
- package/dist/{CompletionService-D3a47vdU.d.cts → CompletionService-kNA17cfI.d.cts} +4 -3
- package/dist/auth/GeminiCodeAssistProjectResolver.cjs +8 -6
- package/dist/auth/GeminiCodeAssistProjectResolver.js +6 -4
- package/dist/{chunk-3Z5BQZFM.cjs → chunk-235MXAGX.cjs} +3 -1
- package/dist/{chunk-HRRYG2AX.js → chunk-23S5OPIO.js} +10 -1
- package/dist/chunk-25GXJCEZ.cjs +40 -0
- package/dist/chunk-2E42SAW3.cjs +323 -0
- package/dist/chunk-2JYRIADS.js +40 -0
- package/dist/chunk-2Z4XM3H5.cjs +44 -0
- package/dist/{chunk-BODMAL6G.js → chunk-32O35CIF.js} +271 -91
- package/dist/chunk-3SCOLIPT.cjs +63 -0
- package/dist/{chunk-SYQF7OIR.js → chunk-3WD4HTR2.js} +2 -0
- package/dist/{chunk-CGKLE6IW.cjs → chunk-4BB343BI.cjs} +1489 -520
- package/dist/{chunk-VACWOIRE.cjs → chunk-4VZX5F4T.cjs} +39 -15
- package/dist/{chunk-5ZQBEOMD.js → chunk-5NJLQ6T6.js} +46 -12
- package/dist/chunk-5RSZYQJH.cjs +62 -0
- package/dist/chunk-6QQG7YG3.cjs +153 -0
- package/dist/{chunk-IFXJ2BG7.js → chunk-7C7DET6S.js} +51 -6
- package/dist/{chunk-IK3KE3AU.js → chunk-DE2SRBFZ.js} +1 -1
- package/dist/{chunk-FH2P4OCD.js → chunk-E3COOKUP.js} +1240 -271
- package/dist/{chunk-UHGVBFU3.js → chunk-EBLFCNPY.js} +38 -14
- package/dist/chunk-FU7EAR73.js +62 -0
- package/dist/chunk-FXR6N3SR.js +323 -0
- package/dist/{chunk-SUEGJ75D.cjs → chunk-GDIXXKF2.cjs} +46 -12
- package/dist/chunk-GFIZ6LQI.js +170 -0
- package/dist/chunk-GL6XM527.js +61 -0
- package/dist/chunk-HVBBDBS3.cjs +350 -0
- package/dist/{chunk-46ZIFWYG.cjs → chunk-IIRPUVPH.cjs} +7 -1
- package/dist/chunk-J3QQ6JS5.cjs +170 -0
- package/dist/{chunk-JWVTXXPX.cjs → chunk-KBM2W6UY.cjs} +8 -4
- package/dist/chunk-LB6EBS6Y.js +69 -0
- package/dist/{chunk-IWQAX3CS.js → chunk-LVUCAWMK.js} +1 -1
- package/dist/chunk-MKF46GNZ.js +350 -0
- package/dist/{chunk-HYN75H6G.cjs → chunk-MUHWHQVM.cjs} +1 -1
- package/dist/chunk-MYYR3HZL.js +44 -0
- package/dist/{chunk-MFZ5437A.js → chunk-N5T4M4GU.js} +1 -1
- package/dist/{chunk-5ENKBSWO.js → chunk-N7OOJI5V.js} +88 -8
- package/dist/chunk-NKVZ6Z3Y.cjs +61 -0
- package/dist/chunk-OF3BECU2.cjs +69 -0
- package/dist/{chunk-SNYBEXLB.cjs → chunk-OJGQKHN5.cjs} +3 -1
- package/dist/{chunk-DDMRUL76.cjs → chunk-OKMJLEXX.cjs} +5 -5
- package/dist/chunk-OPRS4IQZ.js +153 -0
- package/dist/chunk-OTZC4TNH.cjs +79 -0
- package/dist/{chunk-3Q6Z6JTO.cjs → chunk-OVQBNVSV.cjs} +287 -107
- package/dist/{chunk-4XMYPW46.cjs → chunk-OXHNSZ53.cjs} +84 -44
- package/dist/{chunk-C6OV7GCC.js → chunk-PEGTIPB3.js} +52 -12
- package/dist/chunk-PO3XB56Z.js +79 -0
- package/dist/{chunk-D3TDKWRP.js → chunk-RJ5ZGNI3.js} +54 -5
- package/dist/{chunk-PG7PS2NN.cjs → chunk-RJUONLUQ.cjs} +59 -10
- package/dist/{chunk-BPKCU575.js → chunk-SOO562NM.js} +3 -1
- package/dist/{chunk-6QZGDLL4.js → chunk-TOVPMMHM.js} +5 -1
- package/dist/{chunk-K52THW2C.cjs → chunk-V4TXMEJS.cjs} +5 -5
- package/dist/{chunk-G2UTNSGU.js → chunk-WNKWAEUR.js} +7 -1
- package/dist/{chunk-UNWKG6EI.cjs → chunk-XPIOJQS2.cjs} +51 -6
- package/dist/chunk-XXFYLL7R.js +63 -0
- package/dist/{chunk-KFI44N2R.cjs → chunk-YNJNTCSQ.cjs} +10 -1
- package/dist/{chunk-VQY5W4YW.cjs → chunk-YWL7YZWS.cjs} +90 -10
- package/dist/completion/ApiKeyPoolService.cjs +12 -0
- package/dist/completion/ApiKeyPoolService.d.cts +6 -0
- package/dist/completion/ApiKeyPoolService.d.ts +6 -0
- package/dist/completion/ApiKeyPoolService.js +12 -0
- package/dist/completion/CompletionService.cjs +30 -24
- package/dist/completion/CompletionService.d.cts +3 -1
- package/dist/completion/CompletionService.d.ts +3 -1
- package/dist/completion/CompletionService.js +29 -23
- package/dist/completion.cjs +32 -26
- package/dist/completion.d.cts +3 -1
- package/dist/completion.d.ts +3 -1
- package/dist/completion.js +31 -25
- package/dist/index.cjs +56 -29
- package/dist/index.d.cts +8 -8
- package/dist/index.d.ts +8 -8
- package/dist/index.js +61 -34
- package/dist/{keyPolicy-Cp0FntZl.d.cts → keyPolicy-zdWTu3CQ.d.cts} +1 -1
- package/dist/{keyPolicy-Cp0FntZl.d.ts → keyPolicy-zdWTu3CQ.d.ts} +1 -1
- package/dist/outbound-api/auditCapture.cjs +2 -2
- package/dist/outbound-api/auditCapture.d.cts +3 -4
- package/dist/outbound-api/auditCapture.d.ts +3 -4
- package/dist/outbound-api/auditCapture.js +1 -1
- package/dist/outbound-api/quotaWarn.d.cts +1 -1
- package/dist/outbound-api/quotaWarn.d.ts +1 -1
- package/dist/outbound-api/routeResolver.cjs +2 -2
- package/dist/outbound-api/routeResolver.d.cts +5 -3
- package/dist/outbound-api/routeResolver.d.ts +5 -3
- package/dist/outbound-api/routeResolver.js +1 -1
- package/dist/outbound-api/subscriptionRegistryPort.d.cts +2 -0
- package/dist/outbound-api/subscriptionRegistryPort.d.ts +2 -0
- package/dist/outbound-api/types.d.cts +4 -2
- package/dist/outbound-api/types.d.ts +4 -2
- package/dist/outbound-api.cjs +52 -25
- package/dist/outbound-api.d.cts +131 -87
- package/dist/outbound-api.d.ts +131 -87
- package/dist/outbound-api.js +55 -28
- package/dist/pipeline/AccountAllowanceScheduling.cjs +15 -0
- package/dist/pipeline/AccountAllowanceScheduling.d.cts +91 -0
- package/dist/pipeline/AccountAllowanceScheduling.d.ts +91 -0
- package/dist/pipeline/AccountAllowanceScheduling.js +15 -0
- package/dist/pipeline/AccountAllowanceStore.cjs +20 -0
- package/dist/pipeline/AccountAllowanceStore.d.cts +77 -0
- package/dist/pipeline/AccountAllowanceStore.d.ts +77 -0
- package/dist/pipeline/AccountAllowanceStore.js +20 -0
- package/dist/pipeline/AccountRouteActivity.cjs +10 -0
- package/dist/pipeline/AccountRouteActivity.d.cts +61 -0
- package/dist/pipeline/AccountRouteActivity.d.ts +61 -0
- package/dist/pipeline/AccountRouteActivity.js +10 -0
- package/dist/pipeline/AuthSource.d.cts +11 -2
- package/dist/pipeline/AuthSource.d.ts +11 -2
- package/dist/pipeline/BoundAccountSelectionError.cjs +10 -0
- package/dist/pipeline/BoundAccountSelectionError.d.cts +28 -0
- package/dist/pipeline/BoundAccountSelectionError.d.ts +28 -0
- package/dist/pipeline/BoundAccountSelectionError.js +10 -0
- package/dist/pipeline/LlmConfigProviderAuth.d.cts +1 -0
- package/dist/pipeline/LlmConfigProviderAuth.d.ts +1 -0
- package/dist/pipeline/ServerOverloadCounter.cjs +16 -0
- package/dist/pipeline/ServerOverloadCounter.d.cts +77 -0
- package/dist/pipeline/ServerOverloadCounter.d.ts +77 -0
- package/dist/pipeline/ServerOverloadCounter.js +16 -0
- package/dist/pipeline/SubscriptionAccountHealth.cjs +6 -2
- package/dist/pipeline/SubscriptionAccountHealth.d.cts +65 -8
- package/dist/pipeline/SubscriptionAccountHealth.d.ts +65 -8
- package/dist/pipeline/SubscriptionAccountHealth.js +5 -1
- package/dist/pipeline/SubscriptionAuthSource.cjs +5 -2
- package/dist/pipeline/SubscriptionAuthSource.d.cts +1 -0
- package/dist/pipeline/SubscriptionAuthSource.d.ts +1 -0
- package/dist/pipeline/SubscriptionAuthSource.js +4 -1
- package/dist/pipeline/SubscriptionAuthStrategy.d.cts +8 -3
- package/dist/pipeline/SubscriptionAuthStrategy.d.ts +8 -3
- package/dist/pipeline/executeProviderCall.cjs +2 -2
- package/dist/pipeline/executeProviderCall.d.cts +8 -3
- package/dist/pipeline/executeProviderCall.d.ts +8 -3
- package/dist/pipeline/executeProviderCall.js +1 -1
- package/dist/pipeline/resolveProviderChain.d.cts +2 -3
- package/dist/pipeline/resolveProviderChain.d.ts +2 -3
- package/dist/pipeline/resolveSubscriptionChain.d.cts +1 -0
- package/dist/pipeline/resolveSubscriptionChain.d.ts +1 -0
- package/dist/pipeline/upstreamFetch.cjs +5 -3
- package/dist/pipeline/upstreamFetch.d.cts +35 -6
- package/dist/pipeline/upstreamFetch.d.ts +35 -6
- package/dist/pipeline/upstreamFetch.js +4 -2
- package/dist/pipeline/upstreamTrace.cjs +4 -2
- package/dist/pipeline/upstreamTrace.d.cts +22 -8
- package/dist/pipeline/upstreamTrace.d.ts +22 -8
- package/dist/pipeline/upstreamTrace.js +3 -1
- package/dist/ports/pricing-store.d.cts +4 -3
- package/dist/ports/pricing-store.d.ts +4 -3
- package/dist/ports.d.cts +4 -3
- package/dist/ports.d.ts +4 -3
- package/dist/provider-proxy/ProviderProxy.cjs +30 -24
- package/dist/provider-proxy/ProviderProxy.d.cts +2 -0
- package/dist/provider-proxy/ProviderProxy.d.ts +2 -0
- package/dist/provider-proxy/ProviderProxy.js +29 -23
- package/dist/provider-proxy/identity/codexCliHeaders.cjs +10 -0
- package/dist/provider-proxy/identity/codexCliHeaders.d.cts +45 -0
- package/dist/provider-proxy/identity/codexCliHeaders.d.ts +45 -0
- package/dist/provider-proxy/identity/codexCliHeaders.js +10 -0
- package/dist/provider-proxy/ingress/providerProxyShared.cjs +32 -24
- package/dist/provider-proxy/ingress/providerProxyShared.d.cts +44 -5
- package/dist/provider-proxy/ingress/providerProxyShared.d.ts +44 -5
- package/dist/provider-proxy/ingress/providerProxyShared.js +31 -23
- package/dist/provider-proxy/matchText.cjs +4 -2
- package/dist/provider-proxy/matchText.d.cts +39 -6
- package/dist/provider-proxy/matchText.d.ts +39 -6
- package/dist/provider-proxy/matchText.js +3 -1
- package/dist/provider-proxy/types.d.cts +35 -2
- package/dist/provider-proxy/types.d.ts +35 -2
- package/dist/provider-proxy.cjs +30 -24
- package/dist/provider-proxy.d.cts +2 -0
- package/dist/provider-proxy.d.ts +2 -0
- package/dist/provider-proxy.js +29 -23
- package/dist/{routeResolver-C4T7yClx.d.ts → routeResolver-BxOfunbm.d.ts} +1 -1
- package/dist/{routeResolver-CB3tvJKy.d.cts → routeResolver-D5OzD0iM.d.cts} +1 -1
- package/dist/transformer/TransformerChainExecutor.cjs +2 -2
- package/dist/transformer/TransformerChainExecutor.js +1 -1
- package/dist/transformer/transformers/AnthropicTransformer.cjs +3 -2
- package/dist/transformer/transformers/AnthropicTransformer.js +2 -1
- package/dist/transformer/transformers/GeminiCodeAssistTransformer.cjs +3 -3
- package/dist/transformer/transformers/GeminiCodeAssistTransformer.js +2 -2
- package/dist/transformer/transformers/GeminiTransformer.cjs +3 -3
- package/dist/transformer/transformers/GeminiTransformer.js +2 -2
- package/dist/transformer/transformers/OpenAIResponseTransformer.cjs +3 -2
- package/dist/transformer/transformers/OpenAIResponseTransformer.d.cts +1 -1
- package/dist/transformer/transformers/OpenAIResponseTransformer.d.ts +1 -1
- package/dist/transformer/transformers/OpenAIResponseTransformer.js +2 -1
- package/dist/transformer/transformers/OpenAITransformer.cjs +6 -0
- package/dist/transformer/transformers/OpenAITransformer.d.cts +68 -0
- package/dist/transformer/transformers/OpenAITransformer.d.ts +68 -0
- package/dist/transformer/transformers/OpenAITransformer.js +6 -0
- package/dist/transformer/transformers.cjs +9 -14
- package/dist/transformer/transformers.d.cts +12 -48
- package/dist/transformer/transformers.d.ts +12 -48
- package/dist/transformer/transformers.js +11 -16
- package/dist/transformer/types.d.cts +17 -0
- package/dist/transformer/types.d.ts +17 -0
- package/dist/transformer.cjs +12 -12
- package/dist/transformer.d.cts +1 -2
- package/dist/transformer.d.ts +1 -2
- package/dist/transformer.js +12 -12
- package/dist/{types-lgPYQuZS.d.ts → types-CqZD77rS.d.ts} +173 -7
- package/dist/{types-B8Arpxn0.d.cts → types-gjJ5lJ5n.d.cts} +173 -7
- package/dist/usage/pricing-engine.cjs +2 -2
- package/dist/usage/pricing-engine.d.cts +29 -1
- package/dist/usage/pricing-engine.d.ts +29 -1
- package/dist/usage/pricing-engine.js +1 -1
- package/dist/usage/usage-recorder.cjs +2 -2
- package/dist/usage/usage-recorder.d.cts +5 -1
- package/dist/usage/usage-recorder.d.ts +5 -1
- package/dist/usage/usage-recorder.js +1 -1
- package/dist/usage.cjs +3 -3
- package/dist/usage.js +2 -2
- package/package.json +1 -1
- package/dist/chunk-7FEBOPJO.cjs +0 -50
- package/dist/chunk-DWKQZ2SK.cjs +0 -254
- package/dist/chunk-IAXWICZU.js +0 -69
- package/dist/chunk-IB3FDI4O.js +0 -50
- package/dist/chunk-OQWKZCXP.js +0 -242
- package/dist/chunk-QWBWGODS.cjs +0 -69
- package/dist/chunk-YMFAJFQT.cjs +0 -173
- package/dist/chunk-ZCIQ3L3R.cjs +0 -242
- package/dist/chunk-ZJZAOKI7.js +0 -254
- package/dist/chunk-ZLX3KGXX.js +0 -173
- package/dist/transformer/transformers/OpenCodeGoTransformer.cjs +0 -6
- package/dist/transformer/transformers/OpenCodeGoTransformer.d.cts +0 -51
- package/dist/transformer/transformers/OpenCodeGoTransformer.d.ts +0 -51
- package/dist/transformer/transformers/OpenCodeGoTransformer.js +0 -6
- package/dist/transformer/transformers/ReasoningTransformer.cjs +0 -6
- package/dist/transformer/transformers/ReasoningTransformer.d.cts +0 -47
- package/dist/transformer/transformers/ReasoningTransformer.d.ts +0 -47
- package/dist/transformer/transformers/ReasoningTransformer.js +0 -6
|
@@ -89,18 +89,6 @@ function validateEndpointModelConfig(config) {
|
|
|
89
89
|
(kind) => !isNonBlankRef(map[kind])
|
|
90
90
|
);
|
|
91
91
|
}
|
|
92
|
-
function validateServerModelConfig(config) {
|
|
93
|
-
const errors = [];
|
|
94
|
-
for (const endpoint of Object.keys(_chunk4IH4EL7Mcjs.ENDPOINT_MODEL_KINDS)) {
|
|
95
|
-
const ep = config.endpoints.find((e) => e.endpoint === endpoint);
|
|
96
|
-
const declared = modelKindsForEndpoint(endpoint);
|
|
97
|
-
const missingKinds = ep ? validateEndpointModelConfig(ep) : [...declared];
|
|
98
|
-
if (missingKinds.length > 0 && missingKinds.length < declared.length) {
|
|
99
|
-
errors.push({ endpoint, missingKinds });
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
return errors;
|
|
103
|
-
}
|
|
104
92
|
|
|
105
93
|
// src/outbound-api/modelPrefixDispatch.ts
|
|
106
94
|
function classifyModelPrefix(model) {
|
|
@@ -149,6 +137,34 @@ function endpointSupportsSubscription(endpoint) {
|
|
|
149
137
|
}
|
|
150
138
|
|
|
151
139
|
// src/outbound-api/routeResolver.ts
|
|
140
|
+
function bindDelegatedSubscriptionProfile(profile, config) {
|
|
141
|
+
const preferredAccountId = config.boundAccountId;
|
|
142
|
+
const preferredAccountGroup = config.boundAccountGroup;
|
|
143
|
+
const boundAccountFallbackPolicy = config.boundAccountFallbackPolicy;
|
|
144
|
+
if (!preferredAccountId && !preferredAccountGroup) return profile;
|
|
145
|
+
const strategy = profile.authStrategy;
|
|
146
|
+
return {
|
|
147
|
+
...profile,
|
|
148
|
+
authStrategy: {
|
|
149
|
+
kind: strategy.kind,
|
|
150
|
+
providerId: strategy.providerId,
|
|
151
|
+
applyHeaders(headers, hints) {
|
|
152
|
+
return strategy.applyHeaders(headers, {
|
|
153
|
+
...hints,
|
|
154
|
+
preferredAccountId,
|
|
155
|
+
preferredAccountGroup,
|
|
156
|
+
boundAccountFallbackPolicy
|
|
157
|
+
});
|
|
158
|
+
},
|
|
159
|
+
onUnauthorized(sessionKey) {
|
|
160
|
+
return strategy.onUnauthorized(sessionKey);
|
|
161
|
+
},
|
|
162
|
+
describeStatus() {
|
|
163
|
+
return strategy.describeStatus();
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
};
|
|
167
|
+
}
|
|
152
168
|
function parseModelRef(ref) {
|
|
153
169
|
if (!ref) return null;
|
|
154
170
|
const idx = ref.indexOf(",");
|
|
@@ -267,6 +283,8 @@ async function resolveRoute(args) {
|
|
|
267
283
|
apiKey: resolveApiKey(provider.api_key),
|
|
268
284
|
isOfficialProvider,
|
|
269
285
|
passThrough: false,
|
|
286
|
+
preferredKeyId: config.boundKeyId,
|
|
287
|
+
boundKeyFallbackPolicy: config.boundKeyFallbackPolicy,
|
|
270
288
|
attribution: { sessionId, apiKeyId: _nullishCoalesce(args.apiKeyId, () => ( null)) }
|
|
271
289
|
};
|
|
272
290
|
}
|
|
@@ -277,6 +295,8 @@ async function resolveRoute(args) {
|
|
|
277
295
|
ingressFormat,
|
|
278
296
|
authMode: "byo",
|
|
279
297
|
providerId,
|
|
298
|
+
preferredKeyId: config.boundKeyId,
|
|
299
|
+
boundKeyFallbackPolicy: config.boundKeyFallbackPolicy,
|
|
280
300
|
// Passthrough gate: the client's ORIGINAL requested id (kind-mapped only).
|
|
281
301
|
requestedModel,
|
|
282
302
|
// Usage attribution: the verified named-key id (undefined for internal traffic).
|
|
@@ -321,7 +341,10 @@ async function resolveSubscriptionRoute(args) {
|
|
|
321
341
|
apiKey: "",
|
|
322
342
|
isOfficialProvider: false,
|
|
323
343
|
passThrough: false,
|
|
324
|
-
subscriptionProfile: profile,
|
|
344
|
+
subscriptionProfile: bindDelegatedSubscriptionProfile(profile, config),
|
|
345
|
+
preferredAccountId: config.boundAccountId,
|
|
346
|
+
preferredAccountGroup: config.boundAccountGroup,
|
|
347
|
+
boundAccountFallbackPolicy: config.boundAccountFallbackPolicy,
|
|
325
348
|
attribution: { sessionId, apiKeyId: _nullishCoalesce(apiKeyId, () => ( null)) }
|
|
326
349
|
};
|
|
327
350
|
const subscriptionConfig = providerId === "opencodego" ? await _optionalChain([registry, 'optionalAccess', _9 => _9.getOpenCodeGoConfig, 'optionalCall', _10 => _10()]) : void 0;
|
|
@@ -353,6 +376,8 @@ async function resolveSubscriptionRoute(args) {
|
|
|
353
376
|
subscriptionConfig,
|
|
354
377
|
// Per-request preferred account (provider/subscription duality); undefined ⇒ pool.
|
|
355
378
|
preferredAccountId: config.boundAccountId,
|
|
379
|
+
preferredAccountGroup: config.boundAccountGroup,
|
|
380
|
+
boundAccountFallbackPolicy: config.boundAccountFallbackPolicy,
|
|
356
381
|
anthropicSdkHints: hints
|
|
357
382
|
};
|
|
358
383
|
return { ok: true, route, usedRole: effectiveRole };
|
|
@@ -381,5 +406,4 @@ function resolveApiKey(apiKey) {
|
|
|
381
406
|
|
|
382
407
|
|
|
383
408
|
|
|
384
|
-
|
|
385
|
-
exports.extractRequestedModel = extractRequestedModel; exports.detectRequestRole = detectRequestRole; exports.endpointToIngressFormat = endpointToIngressFormat; exports.isKindMappedEndpoint = isKindMappedEndpoint; exports.modelKindsForEndpoint = modelKindsForEndpoint; exports.detectModelKind = detectModelKind; exports.validateEndpointModelConfig = validateEndpointModelConfig; exports.validateServerModelConfig = validateServerModelConfig; exports.classifyModelPrefix = classifyModelPrefix; exports.resolvePrefixTarget = resolvePrefixTarget; exports.SUBSCRIPTION_PROVIDER_IDS = SUBSCRIPTION_PROVIDER_IDS; exports.isSubscriptionProviderId = isSubscriptionProviderId; exports.endpointSupportsSubscription = endpointSupportsSubscription; exports.parseModelRef = parseModelRef; exports.pickModelRefFromList = pickModelRefFromList; exports.resolveRoute = resolveRoute;
|
|
409
|
+
exports.extractRequestedModel = extractRequestedModel; exports.detectRequestRole = detectRequestRole; exports.endpointToIngressFormat = endpointToIngressFormat; exports.isKindMappedEndpoint = isKindMappedEndpoint; exports.modelKindsForEndpoint = modelKindsForEndpoint; exports.detectModelKind = detectModelKind; exports.validateEndpointModelConfig = validateEndpointModelConfig; exports.classifyModelPrefix = classifyModelPrefix; exports.resolvePrefixTarget = resolvePrefixTarget; exports.SUBSCRIPTION_PROVIDER_IDS = SUBSCRIPTION_PROVIDER_IDS; exports.isSubscriptionProviderId = isSubscriptionProviderId; exports.endpointSupportsSubscription = endpointSupportsSubscription; exports.parseModelRef = parseModelRef; exports.pickModelRefFromList = pickModelRefFromList; exports.resolveRoute = resolveRoute;
|
|
@@ -59,8 +59,42 @@ function hasThinkingEnabled(request) {
|
|
|
59
59
|
}
|
|
60
60
|
return false;
|
|
61
61
|
}
|
|
62
|
+
function flattenToolResultContent(content) {
|
|
63
|
+
if (typeof content === "string") return content;
|
|
64
|
+
if (content == null) return "";
|
|
65
|
+
if (!Array.isArray(content)) return JSON.stringify(content);
|
|
66
|
+
const parts = [];
|
|
67
|
+
for (const block of content) {
|
|
68
|
+
if (typeof block === "string") {
|
|
69
|
+
parts.push(block);
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
if (!block || typeof block !== "object") continue;
|
|
73
|
+
const typed = block;
|
|
74
|
+
if (typed.type === "image" || typed.type === "image_url") {
|
|
75
|
+
parts.push("[image omitted]");
|
|
76
|
+
} else if (typeof typed.text === "string") {
|
|
77
|
+
parts.push(typed.text);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return parts.filter((text) => text !== "").join("\n");
|
|
81
|
+
}
|
|
62
82
|
|
|
63
83
|
// src/api-converter/anthropic-to-openai.ts
|
|
84
|
+
function anthropicUsageToChatUsage(usage) {
|
|
85
|
+
const input = usage.input_tokens || 0;
|
|
86
|
+
const output = usage.output_tokens || 0;
|
|
87
|
+
const cacheRead = usage.cache_read_input_tokens || 0;
|
|
88
|
+
const cacheCreation = usage.cache_creation_input_tokens || 0;
|
|
89
|
+
const promptTokens = input + cacheRead + cacheCreation;
|
|
90
|
+
const out = {
|
|
91
|
+
prompt_tokens: promptTokens,
|
|
92
|
+
completion_tokens: output,
|
|
93
|
+
total_tokens: promptTokens + output
|
|
94
|
+
};
|
|
95
|
+
if (cacheRead > 0) out.prompt_tokens_details = { cached_tokens: cacheRead };
|
|
96
|
+
return out;
|
|
97
|
+
}
|
|
64
98
|
function convertAnthropicToOpenAI(response) {
|
|
65
99
|
const content = [];
|
|
66
100
|
const toolCalls = [];
|
|
@@ -98,11 +132,7 @@ function convertAnthropicToOpenAI(response) {
|
|
|
98
132
|
finish_reason: finishReason
|
|
99
133
|
}
|
|
100
134
|
],
|
|
101
|
-
usage:
|
|
102
|
-
prompt_tokens: response.usage.input_tokens,
|
|
103
|
-
completion_tokens: response.usage.output_tokens,
|
|
104
|
-
total_tokens: response.usage.input_tokens + response.usage.output_tokens
|
|
105
|
-
}
|
|
135
|
+
usage: anthropicUsageToChatUsage(response.usage)
|
|
106
136
|
};
|
|
107
137
|
if (reasoningContent) {
|
|
108
138
|
result.reasoning_content = reasoningContent;
|
|
@@ -158,7 +188,7 @@ function convertAnthropicRequestToOpenAI(request) {
|
|
|
158
188
|
});
|
|
159
189
|
} else if (part.type === "tool_result") {
|
|
160
190
|
toolResultId = part.tool_use_id;
|
|
161
|
-
toolResultContent =
|
|
191
|
+
toolResultContent = flattenToolResultContent(part.content);
|
|
162
192
|
}
|
|
163
193
|
}
|
|
164
194
|
if (toolResultId && toolResultContent !== void 0) {
|
|
@@ -332,11 +362,12 @@ async function* convertAnthropicStreamToOpenAI(anthropicStream) {
|
|
|
332
362
|
delta: {},
|
|
333
363
|
finish_reason: finishReason
|
|
334
364
|
}],
|
|
335
|
-
usage: event.usage ? {
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
365
|
+
usage: event.usage ? anthropicUsageToChatUsage({
|
|
366
|
+
input_tokens: event.usage.input_tokens || 0,
|
|
367
|
+
output_tokens: event.usage.output_tokens || 0,
|
|
368
|
+
cache_read_input_tokens: event.usage.cache_read_input_tokens,
|
|
369
|
+
cache_creation_input_tokens: event.usage.cache_creation_input_tokens
|
|
370
|
+
}) : void 0
|
|
340
371
|
})}
|
|
341
372
|
|
|
342
373
|
`;
|
|
@@ -368,7 +399,10 @@ function convertOpenAIToAnthropic(request, config) {
|
|
|
368
399
|
const toolResult = {
|
|
369
400
|
type: "tool_result",
|
|
370
401
|
tool_use_id: msg.tool_call_id,
|
|
371
|
-
|
|
402
|
+
// An OpenAI tool message is normally a plain string, but a parts array
|
|
403
|
+
// must be flattened to text rather than stringified into a literal
|
|
404
|
+
// `[{"type":"text",…}]` envelope the model then has to read.
|
|
405
|
+
content: flattenToolResultContent(msg.content)
|
|
372
406
|
};
|
|
373
407
|
const lastMsg = messages[messages.length - 1];
|
|
374
408
|
if (lastMsg && lastMsg.role === "user" && Array.isArray(lastMsg.content)) {
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }// src/transformer/transformers/utils/usage-mapping.ts
|
|
2
|
+
function num(obj, key) {
|
|
3
|
+
const v = _optionalChain([obj, 'optionalAccess', _ => _[key]]);
|
|
4
|
+
return typeof v === "number" && Number.isFinite(v) ? v : 0;
|
|
5
|
+
}
|
|
6
|
+
function detailCachedTokens(obj, detailKey) {
|
|
7
|
+
const detail = _optionalChain([obj, 'optionalAccess', _2 => _2[detailKey]]);
|
|
8
|
+
return num(detail, "cached_tokens");
|
|
9
|
+
}
|
|
10
|
+
function anthropicUsageToChatUsage(usage) {
|
|
11
|
+
if (!usage) return void 0;
|
|
12
|
+
const input = num(usage, "input_tokens");
|
|
13
|
+
const output = num(usage, "output_tokens");
|
|
14
|
+
const cacheRead = num(usage, "cache_read_input_tokens");
|
|
15
|
+
const cacheCreation = num(usage, "cache_creation_input_tokens");
|
|
16
|
+
const promptTokens = input + cacheRead + cacheCreation;
|
|
17
|
+
const out = {
|
|
18
|
+
prompt_tokens: promptTokens,
|
|
19
|
+
completion_tokens: output,
|
|
20
|
+
total_tokens: promptTokens + output
|
|
21
|
+
};
|
|
22
|
+
if (cacheRead > 0) {
|
|
23
|
+
out.prompt_tokens_details = { cached_tokens: cacheRead };
|
|
24
|
+
}
|
|
25
|
+
return out;
|
|
26
|
+
}
|
|
27
|
+
function chatUsageToResponsesUsage(usage) {
|
|
28
|
+
if (!usage) return void 0;
|
|
29
|
+
const prompt = num(usage, "prompt_tokens");
|
|
30
|
+
const completion = num(usage, "completion_tokens");
|
|
31
|
+
const out = {
|
|
32
|
+
input_tokens: prompt,
|
|
33
|
+
output_tokens: completion,
|
|
34
|
+
total_tokens: num(usage, "total_tokens") || prompt + completion
|
|
35
|
+
};
|
|
36
|
+
const cacheRead = detailCachedTokens(usage, "prompt_tokens_details");
|
|
37
|
+
if (cacheRead > 0) {
|
|
38
|
+
out.input_tokens_details = { cached_tokens: cacheRead };
|
|
39
|
+
}
|
|
40
|
+
return out;
|
|
41
|
+
}
|
|
42
|
+
function responsesUsageToChatUsage(usage) {
|
|
43
|
+
if (!usage) return void 0;
|
|
44
|
+
const input = num(usage, "input_tokens");
|
|
45
|
+
const output = num(usage, "output_tokens");
|
|
46
|
+
const out = {
|
|
47
|
+
prompt_tokens: input,
|
|
48
|
+
completion_tokens: output,
|
|
49
|
+
total_tokens: num(usage, "total_tokens") || input + output
|
|
50
|
+
};
|
|
51
|
+
const cacheRead = detailCachedTokens(usage, "input_tokens_details");
|
|
52
|
+
if (cacheRead > 0) {
|
|
53
|
+
out.prompt_tokens_details = { cached_tokens: cacheRead };
|
|
54
|
+
}
|
|
55
|
+
return out;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
exports.anthropicUsageToChatUsage = anthropicUsageToChatUsage; exports.chatUsageToResponsesUsage = chatUsageToResponsesUsage; exports.responsesUsageToChatUsage = responsesUsageToChatUsage;
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } var _class; var _class2;
|
|
2
|
+
|
|
3
|
+
var _chunkHVBBDBS3cjs = require('./chunk-HVBBDBS3.cjs');
|
|
4
|
+
|
|
5
|
+
// src/pipeline/AccountAllowanceScheduling.ts
|
|
6
|
+
var DEFAULT_POLICY = {
|
|
7
|
+
enabled: false,
|
|
8
|
+
demoteAtPercent: 80,
|
|
9
|
+
pauseAtPercent: 98,
|
|
10
|
+
priorityPenalty: 100
|
|
11
|
+
};
|
|
12
|
+
var HISTORY_LIMIT = 200;
|
|
13
|
+
var AccountAllowanceExhaustedError = (_class = class extends Error {
|
|
14
|
+
constructor(providerId, resumeAt) {
|
|
15
|
+
super(
|
|
16
|
+
resumeAt ? `All ${providerId} subscription accounts are paused by the allowance policy until ${resumeAt}` : `All ${providerId} subscription accounts are paused by the allowance policy`
|
|
17
|
+
);_class.prototype.__init.call(this);_class.prototype.__init2.call(this);;
|
|
18
|
+
this.providerId = providerId;
|
|
19
|
+
this.resumeAt = resumeAt;
|
|
20
|
+
this.name = "AccountAllowanceExhaustedError";
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
__init() {this.code = "account_allowance_exhausted"}
|
|
25
|
+
__init2() {this.status = 429}
|
|
26
|
+
}, _class);
|
|
27
|
+
function isAccountAllowanceExhaustedError(error) {
|
|
28
|
+
if (error instanceof AccountAllowanceExhaustedError) return true;
|
|
29
|
+
if (!error || typeof error !== "object") return false;
|
|
30
|
+
const value = error;
|
|
31
|
+
return value.code === "account_allowance_exhausted" && value.status === 429;
|
|
32
|
+
}
|
|
33
|
+
function freshWorstWindow(snapshot) {
|
|
34
|
+
return snapshot.windows.filter((window) => window.state === "fresh" && typeof window.usedPercent === "number").sort((left, right) => (_nullishCoalesce(right.usedPercent, () => ( -1))) - (_nullishCoalesce(left.usedPercent, () => ( -1))))[0];
|
|
35
|
+
}
|
|
36
|
+
var AccountAllowanceScheduling = (_class2 = class {
|
|
37
|
+
constructor(store = _chunkHVBBDBS3cjs.getSharedAccountAllowanceStore.call(void 0, ), now = Date.now) {;_class2.prototype.__init3.call(this);_class2.prototype.__init4.call(this);_class2.prototype.__init5.call(this);
|
|
38
|
+
this.store = store;
|
|
39
|
+
this.now = now;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
__init3() {this.config = { ...DEFAULT_POLICY }}
|
|
44
|
+
__init4() {this.history = []}
|
|
45
|
+
__init5() {this.lastRecorded = /* @__PURE__ */ new Map()}
|
|
46
|
+
configure(config) {
|
|
47
|
+
this.config = config ? { ...config } : { ...DEFAULT_POLICY };
|
|
48
|
+
}
|
|
49
|
+
getConfig() {
|
|
50
|
+
return { ...this.config };
|
|
51
|
+
}
|
|
52
|
+
evaluate(providerId, accountId, basePriority, now = this.now()) {
|
|
53
|
+
const decision = this.decide(providerId, accountId, basePriority, now);
|
|
54
|
+
this.recordApplied(decision);
|
|
55
|
+
return decision;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Project the current policy result without recording an applied decision.
|
|
59
|
+
* Admin/read-model callers use this so polling an account list never creates
|
|
60
|
+
* synthetic demotion/pause history entries.
|
|
61
|
+
*/
|
|
62
|
+
preview(providerId, accountId, basePriority, now = this.now()) {
|
|
63
|
+
return this.decide(providerId, accountId, basePriority, now);
|
|
64
|
+
}
|
|
65
|
+
decide(providerId, accountId, basePriority, now) {
|
|
66
|
+
const decidedAt = new Date(now).toISOString();
|
|
67
|
+
const base = {
|
|
68
|
+
providerId,
|
|
69
|
+
accountId,
|
|
70
|
+
basePriority,
|
|
71
|
+
effectivePriority: basePriority,
|
|
72
|
+
schedulable: true,
|
|
73
|
+
decidedAt
|
|
74
|
+
};
|
|
75
|
+
if (!this.config.enabled) return { ...base, action: "ignore", reason: "policy-disabled" };
|
|
76
|
+
if (providerId !== "claude" && providerId !== "codex") {
|
|
77
|
+
return { ...base, action: "ignore", reason: "provider-unsupported" };
|
|
78
|
+
}
|
|
79
|
+
const snapshot = this.store.get(providerId, accountId, now);
|
|
80
|
+
if (!snapshot) return { ...base, action: "ignore", reason: "snapshot-missing" };
|
|
81
|
+
const worst = freshWorstWindow(snapshot);
|
|
82
|
+
if (!worst || worst.usedPercent === null) {
|
|
83
|
+
return { ...base, action: "ignore", reason: "snapshot-not-fresh", observedAt: snapshot.observedAt };
|
|
84
|
+
}
|
|
85
|
+
const resumeAt = _nullishCoalesce(worst.resetsAt, () => ( snapshot.expiresAt));
|
|
86
|
+
const resumeMs = resumeAt ? Date.parse(resumeAt) : Number.NaN;
|
|
87
|
+
const canPauseUntilKnownDeadline = Number.isFinite(resumeMs) && resumeMs > now;
|
|
88
|
+
let decision;
|
|
89
|
+
if (worst.usedPercent >= this.config.pauseAtPercent && canPauseUntilKnownDeadline) {
|
|
90
|
+
decision = {
|
|
91
|
+
...base,
|
|
92
|
+
action: "pause",
|
|
93
|
+
reason: "pause-threshold",
|
|
94
|
+
schedulable: false,
|
|
95
|
+
usedPercent: worst.usedPercent,
|
|
96
|
+
observedAt: snapshot.observedAt,
|
|
97
|
+
resumeAt
|
|
98
|
+
};
|
|
99
|
+
} else if (worst.usedPercent >= this.config.demoteAtPercent) {
|
|
100
|
+
decision = {
|
|
101
|
+
...base,
|
|
102
|
+
action: "demote",
|
|
103
|
+
reason: "demote-threshold",
|
|
104
|
+
effectivePriority: basePriority + this.config.priorityPenalty,
|
|
105
|
+
usedPercent: worst.usedPercent,
|
|
106
|
+
observedAt: snapshot.observedAt,
|
|
107
|
+
resumeAt: canPauseUntilKnownDeadline ? resumeAt : void 0
|
|
108
|
+
};
|
|
109
|
+
} else {
|
|
110
|
+
decision = {
|
|
111
|
+
...base,
|
|
112
|
+
action: "normal",
|
|
113
|
+
reason: "below-threshold",
|
|
114
|
+
usedPercent: worst.usedPercent,
|
|
115
|
+
observedAt: snapshot.observedAt,
|
|
116
|
+
resumeAt: canPauseUntilKnownDeadline ? resumeAt : void 0
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
return decision;
|
|
120
|
+
}
|
|
121
|
+
getHistory() {
|
|
122
|
+
return this.history.map((decision) => ({ ...decision }));
|
|
123
|
+
}
|
|
124
|
+
clearHistory() {
|
|
125
|
+
this.history.length = 0;
|
|
126
|
+
this.lastRecorded.clear();
|
|
127
|
+
}
|
|
128
|
+
recordApplied(decision) {
|
|
129
|
+
if (decision.action !== "demote" && decision.action !== "pause") return;
|
|
130
|
+
const key = `${decision.providerId}\0${decision.accountId}`;
|
|
131
|
+
const signature = `${decision.action}\0${_nullishCoalesce(decision.observedAt, () => ( ""))}\0${_nullishCoalesce(decision.usedPercent, () => ( ""))}`;
|
|
132
|
+
if (this.lastRecorded.get(key) === signature) return;
|
|
133
|
+
this.lastRecorded.set(key, signature);
|
|
134
|
+
this.history.push({ ...decision });
|
|
135
|
+
if (this.history.length > HISTORY_LIMIT) this.history.splice(0, this.history.length - HISTORY_LIMIT);
|
|
136
|
+
}
|
|
137
|
+
}, _class2);
|
|
138
|
+
var sharedScheduling = null;
|
|
139
|
+
function getSharedAccountAllowanceScheduling() {
|
|
140
|
+
if (!sharedScheduling) sharedScheduling = new AccountAllowanceScheduling();
|
|
141
|
+
return sharedScheduling;
|
|
142
|
+
}
|
|
143
|
+
function __resetSharedAccountAllowanceSchedulingForTests() {
|
|
144
|
+
sharedScheduling = null;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
exports.AccountAllowanceExhaustedError = AccountAllowanceExhaustedError; exports.isAccountAllowanceExhaustedError = isAccountAllowanceExhaustedError; exports.AccountAllowanceScheduling = AccountAllowanceScheduling; exports.getSharedAccountAllowanceScheduling = getSharedAccountAllowanceScheduling; exports.__resetSharedAccountAllowanceSchedulingForTests = __resetSharedAccountAllowanceSchedulingForTests;
|
|
@@ -11,6 +11,29 @@ import {
|
|
|
11
11
|
|
|
12
12
|
// src/outbound-api/auditCapture.ts
|
|
13
13
|
import { randomUUID } from "crypto";
|
|
14
|
+
function completeUtf8PrefixLength(buf) {
|
|
15
|
+
if (buf.length === 0) return 0;
|
|
16
|
+
let leadIndex = buf.length - 1;
|
|
17
|
+
while (leadIndex >= 0 && (buf[leadIndex] & 192) === 128) leadIndex -= 1;
|
|
18
|
+
if (leadIndex < 0) return 0;
|
|
19
|
+
const lead = buf[leadIndex];
|
|
20
|
+
let expectedLength = 1;
|
|
21
|
+
if ((lead & 224) === 192) expectedLength = 2;
|
|
22
|
+
else if ((lead & 240) === 224) expectedLength = 3;
|
|
23
|
+
else if ((lead & 248) === 240) expectedLength = 4;
|
|
24
|
+
return buf.length - leadIndex < expectedLength ? leadIndex : buf.length;
|
|
25
|
+
}
|
|
26
|
+
function truncateToBytes(text, maxBytes) {
|
|
27
|
+
if (maxBytes < 0) return text;
|
|
28
|
+
const buf = Buffer.from(text, "utf8");
|
|
29
|
+
if (buf.length <= maxBytes) return text;
|
|
30
|
+
const head = buf.subarray(0, maxBytes);
|
|
31
|
+
return head.subarray(0, completeUtf8PrefixLength(head)).toString("utf8");
|
|
32
|
+
}
|
|
33
|
+
function decodeCapturedBody(body, truncated) {
|
|
34
|
+
if (!truncated) return body.toString("utf8");
|
|
35
|
+
return body.subarray(0, completeUtf8PrefixLength(body)).toString("utf8");
|
|
36
|
+
}
|
|
14
37
|
function resolveClientIp(req, trustForwardedFor) {
|
|
15
38
|
if (trustForwardedFor) {
|
|
16
39
|
const xff = req.headers["x-forwarded-for"];
|
|
@@ -25,18 +48,39 @@ function resolveClientIp(req, trustForwardedFor) {
|
|
|
25
48
|
function beginAuditCapture(req, res, now) {
|
|
26
49
|
const config = getAuditCaptureConfig();
|
|
27
50
|
if (!config) return null;
|
|
28
|
-
let
|
|
51
|
+
let requestBody;
|
|
29
52
|
const responseChunks = [];
|
|
53
|
+
let responseBytes = 0;
|
|
54
|
+
let responseTruncated = false;
|
|
30
55
|
let finished = false;
|
|
31
56
|
const ctx = {
|
|
32
57
|
setRequestBody(raw) {
|
|
33
|
-
if (config.captureBodies)
|
|
58
|
+
if (config.captureBodies) {
|
|
59
|
+
requestBody = truncateToBytes(redactAuditText(raw), config.maxBodyBytes);
|
|
60
|
+
}
|
|
34
61
|
}
|
|
35
62
|
};
|
|
36
63
|
if (config.captureBodies) {
|
|
37
64
|
installResponseCapture(res, {
|
|
38
65
|
push(chunk) {
|
|
66
|
+
if (config.maxBodyBytes < 0) {
|
|
67
|
+
responseChunks.push(chunk);
|
|
68
|
+
responseBytes += chunk.length;
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
const remaining = config.maxBodyBytes - responseBytes;
|
|
72
|
+
if (remaining <= 0) {
|
|
73
|
+
responseTruncated = true;
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
if (chunk.length > remaining) {
|
|
77
|
+
responseChunks.push(chunk.subarray(0, remaining));
|
|
78
|
+
responseBytes += remaining;
|
|
79
|
+
responseTruncated = true;
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
39
82
|
responseChunks.push(chunk);
|
|
83
|
+
responseBytes += chunk.length;
|
|
40
84
|
}
|
|
41
85
|
});
|
|
42
86
|
}
|
|
@@ -69,12 +113,13 @@ function beginAuditCapture(req, res, now) {
|
|
|
69
113
|
}
|
|
70
114
|
if (ctx.error) record.error = redactAuditText(ctx.error);
|
|
71
115
|
if (config.captureBodies) {
|
|
72
|
-
if (
|
|
73
|
-
record.requestBody =
|
|
116
|
+
if (requestBody != null && requestBody.length > 0) {
|
|
117
|
+
record.requestBody = requestBody;
|
|
74
118
|
}
|
|
75
119
|
if (responseChunks.length > 0) {
|
|
76
|
-
const
|
|
77
|
-
|
|
120
|
+
const captured = Buffer.concat(responseChunks, responseBytes);
|
|
121
|
+
const body = decodeCapturedBody(captured, responseTruncated);
|
|
122
|
+
record.responseBody = truncateToBytes(redactAuditText(body), config.maxBodyBytes);
|
|
78
123
|
}
|
|
79
124
|
}
|
|
80
125
|
recordAudit(record);
|
|
@@ -28,7 +28,7 @@ async function executeProviderCall(ctx) {
|
|
|
28
28
|
}
|
|
29
29
|
const fetched = await fetchFn(url, headers, finalBody);
|
|
30
30
|
let response = fetched;
|
|
31
|
-
if (runResponseChain) {
|
|
31
|
+
if (runResponseChain && fetched.ok) {
|
|
32
32
|
response = await executor.executeResponseChain(
|
|
33
33
|
// Preserve the EXACT first arg each site passed: proxy → requestBody,
|
|
34
34
|
// unified ingresses → their pre-transform request. The caller supplies
|