@omnicross/core 0.1.0 → 0.1.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/ApiConverter.cjs +24 -0
- package/dist/ApiConverter.d.cts +82 -0
- package/dist/ApiConverter.d.ts +82 -0
- package/dist/ApiConverter.js +24 -0
- package/dist/BuiltinToolExecutor-BluWyeob.d.ts +81 -0
- package/dist/BuiltinToolExecutor-CS2WpXhM.d.cts +81 -0
- package/dist/CompletionService-D3a47vdU.d.cts +213 -0
- package/dist/CompletionService-DdWaAxq0.d.ts +213 -0
- package/dist/{ProviderProxy-f_8ziIhW.d.cts → ProviderProxy-C-xqrkKi.d.ts} +7 -2
- package/dist/{ProviderProxy-vjt8sQQk.d.ts → ProviderProxy-CnMQYN59.d.cts} +7 -2
- package/dist/auth/GeminiCodeAssistProjectResolver.cjs +27 -60
- package/dist/auth/GeminiCodeAssistProjectResolver.js +5 -9
- package/dist/builtin-web-fetch-77JZUZGM.cjs +100 -0
- package/dist/builtin-web-fetch-IGLBX2XY.js +100 -0
- package/dist/chunk-2DCNB7DF.cjs +514 -0
- package/dist/chunk-2FEVTJWG.js +4400 -0
- package/dist/chunk-3MEACFK3.js +193 -0
- package/dist/chunk-3OPYJG76.cjs +266 -0
- package/dist/chunk-46RLHI7D.js +0 -0
- package/dist/chunk-46ZIFWYG.cjs +277 -0
- package/dist/chunk-4NBS6KPV.cjs +43 -0
- package/dist/chunk-4VAVYUZS.cjs +991 -0
- package/dist/chunk-5ERIZW3D.js +44 -0
- package/dist/chunk-5HTVET6E.js +514 -0
- package/dist/chunk-5ZQBEOMD.js +764 -0
- package/dist/chunk-6VIXXLMX.cjs +14 -0
- package/dist/chunk-745DV5FL.js +147 -0
- package/dist/chunk-74TMJA7Z.js +53 -0
- package/dist/chunk-7VU7V2E4.js +0 -0
- package/dist/chunk-7YN22L2H.cjs +87 -0
- package/dist/chunk-A2YMUCBT.cjs +105 -0
- package/dist/chunk-AQ5TNQB7.js +13 -0
- package/dist/chunk-AVYJ4YBN.js +58 -0
- package/dist/chunk-C72S6TTV.cjs +49 -0
- package/dist/chunk-C7PSERMH.js +87 -0
- package/dist/chunk-CDHS2QDC.js +179 -0
- package/dist/chunk-DK4A7DLE.js +266 -0
- package/dist/chunk-DRWHTIIZ.js +13 -0
- package/dist/chunk-DWKQZ2SK.cjs +254 -0
- package/dist/chunk-E3WHL7CO.js +14 -0
- package/dist/chunk-EYZYXJTJ.cjs +1 -0
- package/dist/chunk-FMOBD2OQ.js +39 -0
- package/dist/chunk-FTQ7IQUC.js +991 -0
- package/dist/chunk-FZ46M34D.cjs +1 -0
- package/dist/chunk-G2FUJNA2.cjs +193 -0
- package/dist/chunk-G2UTNSGU.js +277 -0
- package/dist/chunk-GBHYAGX3.cjs +26 -0
- package/dist/chunk-GMMT7RVN.cjs +39 -0
- package/dist/chunk-H5JUT3KV.js +105 -0
- package/dist/chunk-HQP3K7PU.cjs +431 -0
- package/dist/chunk-JO5NLTLY.js +46 -0
- package/dist/chunk-JWC6APFQ.js +23 -0
- package/dist/chunk-KUU2RNG6.cjs +46 -0
- package/dist/chunk-LKZJEL6E.cjs +124 -0
- package/dist/chunk-MNYKI4CI.js +94 -0
- package/dist/chunk-MZNPGW5Q.js +26 -0
- package/dist/chunk-N3V2J5ZO.cjs +53 -0
- package/dist/chunk-NYUNU75A.cjs +44 -0
- package/dist/chunk-NZYN7C3P.cjs +179 -0
- package/dist/chunk-O466Y272.js +235 -0
- package/dist/chunk-PXUJF5HS.js +124 -0
- package/dist/chunk-QBZJ7P2T.cjs +13 -0
- package/dist/chunk-QOCNX236.js +46 -0
- package/dist/chunk-QXD4MV2X.cjs +23 -0
- package/dist/chunk-R3HK6R4B.cjs +13 -0
- package/dist/chunk-RSJ3TWJQ.cjs +186 -0
- package/dist/chunk-S4WBV25P.js +913 -0
- package/dist/chunk-SN3YWBX7.cjs +4400 -0
- package/dist/chunk-SPVWWUHX.cjs +46 -0
- package/dist/chunk-SUEGJ75D.cjs +764 -0
- package/dist/chunk-SVNDB62D.cjs +58 -0
- package/dist/chunk-UYPEN5XE.cjs +235 -0
- package/dist/chunk-V5KPWNYX.cjs +147 -0
- package/dist/chunk-VVEHS2LI.js +431 -0
- package/dist/chunk-XBSYYZIY.cjs +94 -0
- package/dist/chunk-YGXJGRFI.cjs +913 -0
- package/dist/chunk-YMFAJFQT.cjs +173 -0
- package/dist/chunk-Z7LUNECE.js +49 -0
- package/dist/chunk-Z7Y2NPHY.js +186 -0
- package/dist/chunk-ZJZAOKI7.js +254 -0
- package/dist/chunk-ZLX3KGXX.js +173 -0
- package/dist/chunk-ZSVQT3PW.js +43 -0
- package/dist/completion/ApiKeyPoolService.cjs +23 -48
- package/dist/completion/ApiKeyPoolService.d.cts +150 -2
- package/dist/completion/ApiKeyPoolService.d.ts +150 -2
- package/dist/completion/BuiltinToolExecutor.cjs +12 -0
- package/dist/completion/BuiltinToolExecutor.d.cts +4 -0
- package/dist/completion/BuiltinToolExecutor.d.ts +4 -0
- package/dist/completion/BuiltinToolExecutor.js +12 -0
- package/dist/completion/CompletionService.cjs +38 -0
- package/dist/completion/CompletionService.d.cts +22 -0
- package/dist/completion/CompletionService.d.ts +22 -0
- package/dist/completion/CompletionService.js +38 -0
- package/dist/completion/NativeSearchInjector.cjs +12 -0
- package/dist/completion/NativeSearchInjector.d.cts +42 -0
- package/dist/completion/NativeSearchInjector.d.ts +42 -0
- package/dist/completion/NativeSearchInjector.js +12 -0
- package/dist/completion/ProviderSearchInjector.cjs +60 -0
- package/dist/completion/ProviderSearchInjector.d.cts +47 -0
- package/dist/completion/ProviderSearchInjector.d.ts +47 -0
- package/dist/completion/ProviderSearchInjector.js +60 -0
- package/dist/completion/native-search-types.cjs +14 -0
- package/dist/completion/native-search-types.d.cts +3 -0
- package/dist/completion/native-search-types.d.ts +3 -0
- package/dist/completion/native-search-types.js +14 -0
- package/dist/completion/openrouter-headers.cjs +16 -0
- package/dist/completion/openrouter-headers.d.cts +44 -0
- package/dist/completion/openrouter-headers.d.ts +44 -0
- package/dist/completion/openrouter-headers.js +16 -0
- package/dist/completion/openrouter-models.cjs +29 -0
- package/dist/completion/openrouter-models.d.cts +27 -0
- package/dist/completion/openrouter-models.d.ts +27 -0
- package/dist/completion/openrouter-models.js +29 -0
- package/dist/completion/types.cjs +1 -0
- package/dist/completion/types.d.cts +3 -0
- package/dist/completion/types.d.ts +3 -0
- package/dist/completion/types.js +0 -0
- package/dist/completion/url-builder.cjs +24 -0
- package/dist/completion/url-builder.d.cts +87 -0
- package/dist/completion/url-builder.d.ts +87 -0
- package/dist/completion/url-builder.js +24 -0
- package/dist/completion.cjs +55 -3989
- package/dist/completion.d.cts +150 -8
- package/dist/completion.d.ts +150 -8
- package/dist/completion.js +63 -3953
- package/dist/index.cjs +197 -10428
- package/dist/index.d.cts +35 -91
- package/dist/index.d.ts +35 -91
- package/dist/index.js +125 -10267
- package/dist/logger-4GvQNzhE.d.cts +22 -0
- package/dist/logger-4GvQNzhE.d.ts +22 -0
- package/dist/outbound-api/routeResolver.cjs +11 -0
- package/dist/outbound-api/routeResolver.d.cts +19 -0
- package/dist/outbound-api/routeResolver.d.ts +19 -0
- package/dist/outbound-api/routeResolver.js +11 -0
- package/dist/outbound-api/subscriptionRegistryPort.cjs +7 -37
- package/dist/outbound-api/subscriptionRegistryPort.d.cts +7 -3
- package/dist/outbound-api/subscriptionRegistryPort.d.ts +7 -3
- package/dist/outbound-api/subscriptionRegistryPort.js +4 -8
- package/dist/outbound-api/types.cjs +1 -0
- package/dist/{types-CbCN2NQP.d.ts → outbound-api/types.d.cts} +18 -3
- package/dist/{types-CGGrKqC_.d.cts → outbound-api/types.d.ts} +18 -3
- package/dist/outbound-api/types.js +0 -0
- package/dist/outbound-api.cjs +35 -5220
- package/dist/outbound-api.d.cts +16 -88
- package/dist/outbound-api.d.ts +16 -88
- package/dist/outbound-api.js +54 -5193
- package/dist/pipeline/AuthSource.cjs +1 -0
- package/dist/pipeline/AuthSource.d.cts +101 -0
- package/dist/pipeline/AuthSource.d.ts +101 -0
- package/dist/pipeline/AuthSource.js +0 -0
- package/dist/pipeline/LlmConfigProviderAuth.cjs +8 -0
- package/dist/pipeline/LlmConfigProviderAuth.d.cts +87 -0
- package/dist/pipeline/LlmConfigProviderAuth.d.ts +87 -0
- package/dist/pipeline/LlmConfigProviderAuth.js +8 -0
- package/dist/pipeline/SubscriptionAuthSource.cjs +6 -128
- package/dist/pipeline/SubscriptionAuthSource.d.cts +165 -3
- package/dist/pipeline/SubscriptionAuthSource.d.ts +165 -3
- package/dist/pipeline/SubscriptionAuthSource.js +5 -99
- package/dist/pipeline/SubscriptionAuthStrategy.cjs +1 -18
- package/dist/pipeline/executeProviderCall.cjs +6 -0
- package/dist/pipeline/executeProviderCall.d.cts +149 -0
- package/dist/pipeline/executeProviderCall.d.ts +149 -0
- package/dist/pipeline/executeProviderCall.js +6 -0
- package/dist/pipeline/resolveProviderChain.cjs +6 -0
- package/dist/pipeline/resolveProviderChain.d.cts +58 -0
- package/dist/pipeline/resolveProviderChain.d.ts +58 -0
- package/dist/pipeline/resolveProviderChain.js +6 -0
- package/dist/pipeline/resolveSubscriptionChain.cjs +6 -0
- package/dist/pipeline/resolveSubscriptionChain.d.cts +68 -0
- package/dist/pipeline/resolveSubscriptionChain.d.ts +68 -0
- package/dist/pipeline/resolveSubscriptionChain.js +6 -0
- package/dist/ports/gemini-code-assist-resolver.cjs +7 -37
- package/dist/ports/gemini-code-assist-resolver.js +4 -8
- package/dist/ports/pricing-store.cjs +1 -0
- package/dist/ports/pricing-store.d.cts +50 -0
- package/dist/ports/pricing-store.d.ts +50 -0
- package/dist/ports/pricing-store.js +0 -0
- package/dist/ports/provider-config-source.cjs +1 -0
- package/dist/ports/provider-config-source.d.cts +51 -0
- package/dist/ports/provider-config-source.d.ts +51 -0
- package/dist/ports/provider-config-source.js +0 -0
- package/dist/ports/usage-event-store.cjs +1 -0
- package/dist/ports/usage-event-store.d.cts +29 -0
- package/dist/ports/usage-event-store.d.ts +29 -0
- package/dist/ports/usage-event-store.js +0 -0
- package/dist/ports/web-search-backend.cjs +1 -0
- package/dist/ports/web-search-backend.d.cts +29 -0
- package/dist/ports/web-search-backend.d.ts +29 -0
- package/dist/ports/web-search-backend.js +0 -0
- package/dist/ports.cjs +1 -18
- package/dist/ports.d.cts +16 -8
- package/dist/ports.d.ts +16 -8
- package/dist/provider-proxy/ProviderProxy.cjs +40 -0
- package/dist/provider-proxy/ProviderProxy.d.cts +17 -0
- package/dist/provider-proxy/ProviderProxy.d.ts +17 -0
- package/dist/provider-proxy/ProviderProxy.js +40 -0
- package/dist/provider-proxy/ingress/providerProxyShared.cjs +35 -2941
- package/dist/provider-proxy/ingress/providerProxyShared.d.cts +7 -3
- package/dist/provider-proxy/ingress/providerProxyShared.d.ts +7 -3
- package/dist/provider-proxy/ingress/providerProxyShared.js +41 -2914
- package/dist/provider-proxy/matchText.cjs +11 -72
- package/dist/provider-proxy/matchText.js +6 -39
- package/dist/provider-proxy/types.cjs +1 -18
- package/dist/provider-proxy/types.d.cts +407 -8
- package/dist/provider-proxy/types.d.ts +407 -8
- package/dist/provider-proxy.cjs +35 -4654
- package/dist/provider-proxy.d.cts +10 -6
- package/dist/provider-proxy.d.ts +10 -6
- package/dist/provider-proxy.js +39 -4627
- package/dist/routeResolver-BrbK6ja9.d.cts +88 -0
- package/dist/routeResolver-HE-ZO0fO.d.ts +88 -0
- package/dist/serializeError.cjs +5 -81
- package/dist/serializeError.js +3 -54
- package/dist/sse-parser.cjs +7 -455
- package/dist/sse-parser.js +4 -426
- package/dist/transformer/TransformerChainExecutor.cjs +4 -318
- package/dist/transformer/TransformerChainExecutor.js +4 -291
- package/dist/transformer/TransformerService.cjs +5 -289
- package/dist/transformer/TransformerService.js +3 -262
- package/dist/transformer/anthropicBetaInject.cjs +8 -0
- package/dist/transformer/anthropicBetaInject.d.cts +20 -0
- package/dist/transformer/anthropicBetaInject.d.ts +20 -0
- package/dist/transformer/anthropicBetaInject.js +8 -0
- package/dist/transformer/transformers/AnthropicTransformer.cjs +6 -0
- package/dist/transformer/transformers/AnthropicTransformer.d.cts +148 -0
- package/dist/transformer/transformers/AnthropicTransformer.d.ts +148 -0
- package/dist/transformer/transformers/AnthropicTransformer.js +6 -0
- package/dist/transformer/transformers/GeminiCodeAssistTransformer.cjs +4 -1106
- package/dist/transformer/transformers/GeminiCodeAssistTransformer.js +7 -1079
- package/dist/transformer/transformers/GeminiTransformer.cjs +4 -1010
- package/dist/transformer/transformers/GeminiTransformer.js +4 -983
- package/dist/transformer/transformers/OpenAIResponseTransformer.cjs +3 -535
- package/dist/transformer/transformers/OpenAIResponseTransformer.js +3 -510
- package/dist/transformer/transformers/OpenCodeGoTransformer.cjs +5 -72
- package/dist/transformer/transformers/OpenCodeGoTransformer.js +3 -45
- package/dist/transformer/transformers/ReasoningTransformer.cjs +6 -0
- package/dist/transformer/transformers/ReasoningTransformer.d.cts +47 -0
- package/dist/transformer/transformers/ReasoningTransformer.d.ts +47 -0
- package/dist/transformer/transformers/ReasoningTransformer.js +6 -0
- package/dist/transformer/transformers.cjs +39 -0
- package/dist/transformer/transformers.d.cts +100 -0
- package/dist/transformer/transformers.d.ts +100 -0
- package/dist/transformer/transformers.js +39 -0
- package/dist/transformer/types.cjs +1 -18
- package/dist/transformer.cjs +13 -3726
- package/dist/transformer.d.cts +8 -31
- package/dist/transformer.d.ts +8 -31
- package/dist/transformer.js +17 -3706
- package/dist/types-BScIHmPr.d.cts +153 -0
- package/dist/types-BScIHmPr.d.ts +153 -0
- package/dist/usage/pricing-engine.cjs +6 -0
- package/dist/usage/pricing-engine.d.cts +83 -0
- package/dist/usage/pricing-engine.d.ts +83 -0
- package/dist/usage/pricing-engine.js +6 -0
- package/dist/usage/usage-recorder.cjs +6 -0
- package/dist/usage/usage-recorder.d.cts +73 -0
- package/dist/usage/usage-recorder.d.ts +73 -0
- package/dist/usage/usage-recorder.js +6 -0
- package/dist/usage.cjs +11 -0
- package/dist/usage.d.cts +8 -0
- package/dist/usage.d.ts +8 -0
- package/dist/usage.js +11 -0
- package/package.json +3 -3
- package/dist/ApiKeyPoolService-BmMkau07.d.cts +0 -170
- package/dist/ApiKeyPoolService-BmMkau07.d.ts +0 -170
- package/dist/SubscriptionAuthSource-Cr4fVEYY.d.cts +0 -264
- package/dist/SubscriptionAuthSource-D89zmiSS.d.ts +0 -264
- package/dist/index-BTSmc9Sm.d.ts +0 -645
- package/dist/index-DXazdTzZ.d.cts +0 -645
- package/dist/types-DCzHkhJt.d.ts +0 -467
- package/dist/types-DZIQbgp0.d.cts +0 -467
|
@@ -1,3 +1,165 @@
|
|
|
1
|
-
import '@omnicross/contracts/subscription-types';
|
|
2
|
-
|
|
3
|
-
import './SubscriptionAuthStrategy.cjs';
|
|
1
|
+
import { OpenCodeGoTokenConfig, OpenCodeGoScenario, OpenCodeGoModelEntry } from '@omnicross/contracts/subscription-types';
|
|
2
|
+
import { AuthSource, AuthApplyHints } from './AuthSource.cjs';
|
|
3
|
+
import { AuthStrategy } from './SubscriptionAuthStrategy.cjs';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* SubscriptionAuthSource — `AuthSource` wrapping a subscription `AuthStrategy`.
|
|
7
|
+
*
|
|
8
|
+
* Phase 2 of the `provider-request-pipeline` OpenSpec change (design D3, task 4.3).
|
|
9
|
+
*
|
|
10
|
+
* Re-expresses the subscription auth used by `SubscriptionDispatcher` behind
|
|
11
|
+
* the unified `AuthSource` contract, delegating to the existing
|
|
12
|
+
* `AuthStrategy` so the OAuth refresh / token formatting logic is NOT
|
|
13
|
+
* rewritten:
|
|
14
|
+
*
|
|
15
|
+
* - `applyHeaders` → `stripAuthHeaders(headers)` then
|
|
16
|
+
* `authStrategy.applyHeaders(headers, { upstreamUrl, resolvedModel })`,
|
|
17
|
+
* wrapped in the same best-effort try/catch as
|
|
18
|
+
* `SubscriptionDispatcher.applyHeadersWithRetry` (a thrown
|
|
19
|
+
* `applyHeaders` is logged + swallowed, NOT propagated — preserved
|
|
20
|
+
* verbatim).
|
|
21
|
+
* - `onUnauthorized` → `authStrategy.onUnauthorized()`.
|
|
22
|
+
* - `resolveUpstreamUrl` → `profile.resolveUpstreamUrl?.(model)`.
|
|
23
|
+
*
|
|
24
|
+
* IMPORTANT (Phase 2 scope): this WRAPS the strategy + strip behavior but does
|
|
25
|
+
* NOT re-route `SubscriptionDispatcher` through it. The dispatcher's fragile
|
|
26
|
+
* 401-refresh + fallback loop is left UNCHANGED (task 4.5 deferred). This
|
|
27
|
+
* class is unit-tested in isolation only.
|
|
28
|
+
*
|
|
29
|
+
* @module pipeline/SubscriptionAuthSource
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Lightweight summary derived from the inbound request body — consumed by a
|
|
34
|
+
* profile's `modelMapper` (scenario routing). Structural mirror of
|
|
35
|
+
* `provider-proxy/types.ts`'s `SubscriptionRequestSummary`, declared here so
|
|
36
|
+
* `SubscriptionAuthProfile.modelMapper` is type-identical WITHOUT a circular
|
|
37
|
+
* import back into `provider-proxy/types` (which imports THIS module).
|
|
38
|
+
*/
|
|
39
|
+
interface SubscriptionRequestSummary {
|
|
40
|
+
messageCount: number;
|
|
41
|
+
estimatedInputTokens: number;
|
|
42
|
+
/**
|
|
43
|
+
* OPTIONAL bounded per-message match-text slice — kept structurally identical
|
|
44
|
+
* to the canonical declaration in `provider-proxy/types.ts` (the two are
|
|
45
|
+
* deliberate mirrors, not one shared import). Consumed only by the OpenCodeGo
|
|
46
|
+
* keyword matcher in `@omnicross/subscriptions`; core writes, never reads it.
|
|
47
|
+
*/
|
|
48
|
+
matchText?: string[];
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* The subset of a `SubscriptionDispatchProfile` the subscription paths need.
|
|
52
|
+
* Kept structural (not the full profile type) so the wrapper does not pull in
|
|
53
|
+
* the whole registry surface. The full `SubscriptionDispatchProfile` (which IS
|
|
54
|
+
* what gets passed here) satisfies this shape; the optional `mode` + `modelMapper`
|
|
55
|
+
* are read by the built-in `/v1/messages` subscription path (RT2.1) to decide the
|
|
56
|
+
* verbatim-vs-transformer shape and to apply opencodego scenario routing.
|
|
57
|
+
*/
|
|
58
|
+
interface SubscriptionAuthProfile {
|
|
59
|
+
readonly authStrategy: AuthStrategy;
|
|
60
|
+
/** Per-model upstream URL resolver (transformer profiles). Optional for
|
|
61
|
+
* pass-through profiles that hard-code their endpoint upstream. The OPTIONAL
|
|
62
|
+
* 2nd `config` arg (opencodego `baseUrl` override, D1) is additive — existing
|
|
63
|
+
* one-arg callers compile unchanged; mirrors the full
|
|
64
|
+
* `SubscriptionDispatchProfile.resolveUpstreamUrl` so the registry profile
|
|
65
|
+
* stays assignable. */
|
|
66
|
+
readonly resolveUpstreamUrl?: (resolvedModel: string, config?: OpenCodeGoTokenConfig) => string;
|
|
67
|
+
/**
|
|
68
|
+
* Names of provider-level transformers (registered in `TransformerService`)
|
|
69
|
+
* to run on the subscription chain — re-encode Unified → the upstream's wire.
|
|
70
|
+
* The full `SubscriptionDispatchProfile` (which IS what gets passed here)
|
|
71
|
+
* carries these; exposing them on the narrow structural type lets the
|
|
72
|
+
* Responses ingress build the profile's REAL chain (cross-vendor route-to,
|
|
73
|
+
* task #29) instead of hard-coding `['openai-response']`. Absent/empty →
|
|
74
|
+
* the ingress falls back to its endpoint transformer (codex byte-identity).
|
|
75
|
+
*/
|
|
76
|
+
readonly providerTransformerNames?: readonly string[];
|
|
77
|
+
/** Names of model-specific transformers — usually empty. See above. */
|
|
78
|
+
readonly modelTransformerNames?: readonly string[];
|
|
79
|
+
/**
|
|
80
|
+
* OPTIONAL shape-aware provider transformer-name resolver (opencodego zen).
|
|
81
|
+
* Type-identical to `SubscriptionDispatchProfile.resolveProviderTransformerNames`
|
|
82
|
+
* so the registry profile stays assignable. The built-in `/v1/messages`
|
|
83
|
+
* subscription path (Phase 3) consults it via
|
|
84
|
+
* `profile.resolveProviderTransformerNames?.(model, route.subscriptionConfig)`
|
|
85
|
+
* to pick the right zen chain per resolved shape. `config` is `unknown` (core
|
|
86
|
+
* opaque-config discipline — no `@omnicross/subscriptions` import). When ABSENT
|
|
87
|
+
* the path reads the static `providerTransformerNames` exactly as today (codex
|
|
88
|
+
* byte-identity).
|
|
89
|
+
*/
|
|
90
|
+
readonly resolveProviderTransformerNames?: (model: string, config?: unknown) => readonly string[];
|
|
91
|
+
/**
|
|
92
|
+
* Pass-through (claude) vs transformer (codex / opencodego / gemini). The
|
|
93
|
+
* built-in `/v1/messages` subscription path (RT2.1) reads this for its
|
|
94
|
+
* core-local same-format signal (pass-through ⇒ always verbatim relay).
|
|
95
|
+
* Optional on the narrow type — partial profiles built by other route-minting
|
|
96
|
+
* sites may omit it.
|
|
97
|
+
*/
|
|
98
|
+
readonly mode?: 'pass-through' | 'transformer';
|
|
99
|
+
/**
|
|
100
|
+
* Optional model placeholder rewriter — only set for OpenCodeGo. Type-identical
|
|
101
|
+
* to `SubscriptionDispatchProfile.modelMapper` so the registry profile stays
|
|
102
|
+
* assignable. Applied by the built-in `/v1/messages` subscription path BEFORE
|
|
103
|
+
* resolving the upstream URL (so scenario-based shape routing picks the right
|
|
104
|
+
* Anthropic-shape vs OpenAI-shape upstream).
|
|
105
|
+
*/
|
|
106
|
+
readonly modelMapper?: (sdkModel: string, summary: SubscriptionRequestSummary, config: OpenCodeGoTokenConfig | undefined) => {
|
|
107
|
+
resolvedModel: string;
|
|
108
|
+
scenario: OpenCodeGoScenario;
|
|
109
|
+
};
|
|
110
|
+
/**
|
|
111
|
+
* Optional fallback resolver — only set for OpenCodeGo. Type-identical to
|
|
112
|
+
* `SubscriptionDispatchProfile.nextFallback` so the registry profile stays
|
|
113
|
+
* assignable. Read by the built-in `/v1/messages` fallback loop (D6b) to pick
|
|
114
|
+
* the next model after an unrecoverable upstream failure; returns `null` when
|
|
115
|
+
* exhausted (claude / codex / gemini omit it → no fallback attempted).
|
|
116
|
+
*/
|
|
117
|
+
readonly nextFallback?: (scenario: OpenCodeGoScenario, attempted: readonly string[], config: OpenCodeGoTokenConfig | undefined) => OpenCodeGoModelEntry | null;
|
|
118
|
+
/**
|
|
119
|
+
* Optional circuit-breaker admission gate for the PRIMARY (mapped) model (D5
|
|
120
|
+
* primary-gating). Type-identical to `SubscriptionDispatchProfile.allowModel`.
|
|
121
|
+
* Only OpenCodeGo sets it; the core `/v1/messages` loop consults it for the
|
|
122
|
+
* primary before its first attempt and jumps to the first admitting
|
|
123
|
+
* `nextFallback` candidate when the primary's circuit is open. Absent ⇒ the
|
|
124
|
+
* primary is always admitted (claude / codex / gemini — no breaker).
|
|
125
|
+
*/
|
|
126
|
+
readonly allowModel?: (modelId: string) => boolean;
|
|
127
|
+
/**
|
|
128
|
+
* Optional record-outcome callback (D5 record seam). Type-identical to
|
|
129
|
+
* `SubscriptionDispatchProfile.recordModelOutcome`. The core `/v1/messages`
|
|
130
|
+
* loop calls `profile.recordModelOutcome?.(model, ok)` THROUGH this optional
|
|
131
|
+
* field after each attempt, so `@omnicross/core` gains NO import of
|
|
132
|
+
* `@omnicross/subscriptions` (the cross-layer litmus stays 0 — exactly the
|
|
133
|
+
* `nextFallback` precedent). `ok: true` on `2xx`; `ok: false` on
|
|
134
|
+
* thrown/`5xx`/`429`; a non-429 `4xx` is NEUTRAL (the loop does NOT call it).
|
|
135
|
+
* Absent for claude / codex / gemini ⇒ no-op.
|
|
136
|
+
*/
|
|
137
|
+
readonly recordModelOutcome?: (modelId: string, ok: boolean) => void;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Drop auth headers the transformer chain may have set so the `AuthStrategy`
|
|
141
|
+
* is the single source of truth for outbound authentication. Byte-identical
|
|
142
|
+
* to `SubscriptionDispatcher.stripAuthHeaders`.
|
|
143
|
+
*/
|
|
144
|
+
declare function stripAuthHeaders(headers: Record<string, string>): void;
|
|
145
|
+
declare class SubscriptionAuthSource implements AuthSource {
|
|
146
|
+
private readonly profile;
|
|
147
|
+
constructor(profile: SubscriptionAuthProfile);
|
|
148
|
+
/**
|
|
149
|
+
* Strip any transformer-set auth headers, then delegate to the bound
|
|
150
|
+
* strategy. Mirrors `SubscriptionDispatcher`'s
|
|
151
|
+
* `stripAuthHeaders(...)` + `applyHeadersWithRetry(...)` sequence, including
|
|
152
|
+
* the best-effort swallow-and-warn around a throwing `applyHeaders`.
|
|
153
|
+
*
|
|
154
|
+
* The strategy's looser `AuthApplyHints` (optional `upstreamUrl` /
|
|
155
|
+
* `resolvedModel`) is fed from the pipeline's required `{ upstreamUrl,
|
|
156
|
+
* model }` at the boundary.
|
|
157
|
+
*/
|
|
158
|
+
applyHeaders(headers: Record<string, string>, hints: AuthApplyHints): Promise<void>;
|
|
159
|
+
/** Delegate the 401-refresh decision to the bound strategy. */
|
|
160
|
+
onUnauthorized(): Promise<boolean>;
|
|
161
|
+
/** Resolve the upstream URL from the profile, when it provides one. */
|
|
162
|
+
resolveUpstreamUrl(model: string): string | undefined;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
export { type SubscriptionAuthProfile, SubscriptionAuthSource, type SubscriptionRequestSummary, stripAuthHeaders };
|
|
@@ -1,3 +1,165 @@
|
|
|
1
|
-
import '@omnicross/contracts/subscription-types';
|
|
2
|
-
|
|
3
|
-
import './SubscriptionAuthStrategy.js';
|
|
1
|
+
import { OpenCodeGoTokenConfig, OpenCodeGoScenario, OpenCodeGoModelEntry } from '@omnicross/contracts/subscription-types';
|
|
2
|
+
import { AuthSource, AuthApplyHints } from './AuthSource.js';
|
|
3
|
+
import { AuthStrategy } from './SubscriptionAuthStrategy.js';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* SubscriptionAuthSource — `AuthSource` wrapping a subscription `AuthStrategy`.
|
|
7
|
+
*
|
|
8
|
+
* Phase 2 of the `provider-request-pipeline` OpenSpec change (design D3, task 4.3).
|
|
9
|
+
*
|
|
10
|
+
* Re-expresses the subscription auth used by `SubscriptionDispatcher` behind
|
|
11
|
+
* the unified `AuthSource` contract, delegating to the existing
|
|
12
|
+
* `AuthStrategy` so the OAuth refresh / token formatting logic is NOT
|
|
13
|
+
* rewritten:
|
|
14
|
+
*
|
|
15
|
+
* - `applyHeaders` → `stripAuthHeaders(headers)` then
|
|
16
|
+
* `authStrategy.applyHeaders(headers, { upstreamUrl, resolvedModel })`,
|
|
17
|
+
* wrapped in the same best-effort try/catch as
|
|
18
|
+
* `SubscriptionDispatcher.applyHeadersWithRetry` (a thrown
|
|
19
|
+
* `applyHeaders` is logged + swallowed, NOT propagated — preserved
|
|
20
|
+
* verbatim).
|
|
21
|
+
* - `onUnauthorized` → `authStrategy.onUnauthorized()`.
|
|
22
|
+
* - `resolveUpstreamUrl` → `profile.resolveUpstreamUrl?.(model)`.
|
|
23
|
+
*
|
|
24
|
+
* IMPORTANT (Phase 2 scope): this WRAPS the strategy + strip behavior but does
|
|
25
|
+
* NOT re-route `SubscriptionDispatcher` through it. The dispatcher's fragile
|
|
26
|
+
* 401-refresh + fallback loop is left UNCHANGED (task 4.5 deferred). This
|
|
27
|
+
* class is unit-tested in isolation only.
|
|
28
|
+
*
|
|
29
|
+
* @module pipeline/SubscriptionAuthSource
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Lightweight summary derived from the inbound request body — consumed by a
|
|
34
|
+
* profile's `modelMapper` (scenario routing). Structural mirror of
|
|
35
|
+
* `provider-proxy/types.ts`'s `SubscriptionRequestSummary`, declared here so
|
|
36
|
+
* `SubscriptionAuthProfile.modelMapper` is type-identical WITHOUT a circular
|
|
37
|
+
* import back into `provider-proxy/types` (which imports THIS module).
|
|
38
|
+
*/
|
|
39
|
+
interface SubscriptionRequestSummary {
|
|
40
|
+
messageCount: number;
|
|
41
|
+
estimatedInputTokens: number;
|
|
42
|
+
/**
|
|
43
|
+
* OPTIONAL bounded per-message match-text slice — kept structurally identical
|
|
44
|
+
* to the canonical declaration in `provider-proxy/types.ts` (the two are
|
|
45
|
+
* deliberate mirrors, not one shared import). Consumed only by the OpenCodeGo
|
|
46
|
+
* keyword matcher in `@omnicross/subscriptions`; core writes, never reads it.
|
|
47
|
+
*/
|
|
48
|
+
matchText?: string[];
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* The subset of a `SubscriptionDispatchProfile` the subscription paths need.
|
|
52
|
+
* Kept structural (not the full profile type) so the wrapper does not pull in
|
|
53
|
+
* the whole registry surface. The full `SubscriptionDispatchProfile` (which IS
|
|
54
|
+
* what gets passed here) satisfies this shape; the optional `mode` + `modelMapper`
|
|
55
|
+
* are read by the built-in `/v1/messages` subscription path (RT2.1) to decide the
|
|
56
|
+
* verbatim-vs-transformer shape and to apply opencodego scenario routing.
|
|
57
|
+
*/
|
|
58
|
+
interface SubscriptionAuthProfile {
|
|
59
|
+
readonly authStrategy: AuthStrategy;
|
|
60
|
+
/** Per-model upstream URL resolver (transformer profiles). Optional for
|
|
61
|
+
* pass-through profiles that hard-code their endpoint upstream. The OPTIONAL
|
|
62
|
+
* 2nd `config` arg (opencodego `baseUrl` override, D1) is additive — existing
|
|
63
|
+
* one-arg callers compile unchanged; mirrors the full
|
|
64
|
+
* `SubscriptionDispatchProfile.resolveUpstreamUrl` so the registry profile
|
|
65
|
+
* stays assignable. */
|
|
66
|
+
readonly resolveUpstreamUrl?: (resolvedModel: string, config?: OpenCodeGoTokenConfig) => string;
|
|
67
|
+
/**
|
|
68
|
+
* Names of provider-level transformers (registered in `TransformerService`)
|
|
69
|
+
* to run on the subscription chain — re-encode Unified → the upstream's wire.
|
|
70
|
+
* The full `SubscriptionDispatchProfile` (which IS what gets passed here)
|
|
71
|
+
* carries these; exposing them on the narrow structural type lets the
|
|
72
|
+
* Responses ingress build the profile's REAL chain (cross-vendor route-to,
|
|
73
|
+
* task #29) instead of hard-coding `['openai-response']`. Absent/empty →
|
|
74
|
+
* the ingress falls back to its endpoint transformer (codex byte-identity).
|
|
75
|
+
*/
|
|
76
|
+
readonly providerTransformerNames?: readonly string[];
|
|
77
|
+
/** Names of model-specific transformers — usually empty. See above. */
|
|
78
|
+
readonly modelTransformerNames?: readonly string[];
|
|
79
|
+
/**
|
|
80
|
+
* OPTIONAL shape-aware provider transformer-name resolver (opencodego zen).
|
|
81
|
+
* Type-identical to `SubscriptionDispatchProfile.resolveProviderTransformerNames`
|
|
82
|
+
* so the registry profile stays assignable. The built-in `/v1/messages`
|
|
83
|
+
* subscription path (Phase 3) consults it via
|
|
84
|
+
* `profile.resolveProviderTransformerNames?.(model, route.subscriptionConfig)`
|
|
85
|
+
* to pick the right zen chain per resolved shape. `config` is `unknown` (core
|
|
86
|
+
* opaque-config discipline — no `@omnicross/subscriptions` import). When ABSENT
|
|
87
|
+
* the path reads the static `providerTransformerNames` exactly as today (codex
|
|
88
|
+
* byte-identity).
|
|
89
|
+
*/
|
|
90
|
+
readonly resolveProviderTransformerNames?: (model: string, config?: unknown) => readonly string[];
|
|
91
|
+
/**
|
|
92
|
+
* Pass-through (claude) vs transformer (codex / opencodego / gemini). The
|
|
93
|
+
* built-in `/v1/messages` subscription path (RT2.1) reads this for its
|
|
94
|
+
* core-local same-format signal (pass-through ⇒ always verbatim relay).
|
|
95
|
+
* Optional on the narrow type — partial profiles built by other route-minting
|
|
96
|
+
* sites may omit it.
|
|
97
|
+
*/
|
|
98
|
+
readonly mode?: 'pass-through' | 'transformer';
|
|
99
|
+
/**
|
|
100
|
+
* Optional model placeholder rewriter — only set for OpenCodeGo. Type-identical
|
|
101
|
+
* to `SubscriptionDispatchProfile.modelMapper` so the registry profile stays
|
|
102
|
+
* assignable. Applied by the built-in `/v1/messages` subscription path BEFORE
|
|
103
|
+
* resolving the upstream URL (so scenario-based shape routing picks the right
|
|
104
|
+
* Anthropic-shape vs OpenAI-shape upstream).
|
|
105
|
+
*/
|
|
106
|
+
readonly modelMapper?: (sdkModel: string, summary: SubscriptionRequestSummary, config: OpenCodeGoTokenConfig | undefined) => {
|
|
107
|
+
resolvedModel: string;
|
|
108
|
+
scenario: OpenCodeGoScenario;
|
|
109
|
+
};
|
|
110
|
+
/**
|
|
111
|
+
* Optional fallback resolver — only set for OpenCodeGo. Type-identical to
|
|
112
|
+
* `SubscriptionDispatchProfile.nextFallback` so the registry profile stays
|
|
113
|
+
* assignable. Read by the built-in `/v1/messages` fallback loop (D6b) to pick
|
|
114
|
+
* the next model after an unrecoverable upstream failure; returns `null` when
|
|
115
|
+
* exhausted (claude / codex / gemini omit it → no fallback attempted).
|
|
116
|
+
*/
|
|
117
|
+
readonly nextFallback?: (scenario: OpenCodeGoScenario, attempted: readonly string[], config: OpenCodeGoTokenConfig | undefined) => OpenCodeGoModelEntry | null;
|
|
118
|
+
/**
|
|
119
|
+
* Optional circuit-breaker admission gate for the PRIMARY (mapped) model (D5
|
|
120
|
+
* primary-gating). Type-identical to `SubscriptionDispatchProfile.allowModel`.
|
|
121
|
+
* Only OpenCodeGo sets it; the core `/v1/messages` loop consults it for the
|
|
122
|
+
* primary before its first attempt and jumps to the first admitting
|
|
123
|
+
* `nextFallback` candidate when the primary's circuit is open. Absent ⇒ the
|
|
124
|
+
* primary is always admitted (claude / codex / gemini — no breaker).
|
|
125
|
+
*/
|
|
126
|
+
readonly allowModel?: (modelId: string) => boolean;
|
|
127
|
+
/**
|
|
128
|
+
* Optional record-outcome callback (D5 record seam). Type-identical to
|
|
129
|
+
* `SubscriptionDispatchProfile.recordModelOutcome`. The core `/v1/messages`
|
|
130
|
+
* loop calls `profile.recordModelOutcome?.(model, ok)` THROUGH this optional
|
|
131
|
+
* field after each attempt, so `@omnicross/core` gains NO import of
|
|
132
|
+
* `@omnicross/subscriptions` (the cross-layer litmus stays 0 — exactly the
|
|
133
|
+
* `nextFallback` precedent). `ok: true` on `2xx`; `ok: false` on
|
|
134
|
+
* thrown/`5xx`/`429`; a non-429 `4xx` is NEUTRAL (the loop does NOT call it).
|
|
135
|
+
* Absent for claude / codex / gemini ⇒ no-op.
|
|
136
|
+
*/
|
|
137
|
+
readonly recordModelOutcome?: (modelId: string, ok: boolean) => void;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Drop auth headers the transformer chain may have set so the `AuthStrategy`
|
|
141
|
+
* is the single source of truth for outbound authentication. Byte-identical
|
|
142
|
+
* to `SubscriptionDispatcher.stripAuthHeaders`.
|
|
143
|
+
*/
|
|
144
|
+
declare function stripAuthHeaders(headers: Record<string, string>): void;
|
|
145
|
+
declare class SubscriptionAuthSource implements AuthSource {
|
|
146
|
+
private readonly profile;
|
|
147
|
+
constructor(profile: SubscriptionAuthProfile);
|
|
148
|
+
/**
|
|
149
|
+
* Strip any transformer-set auth headers, then delegate to the bound
|
|
150
|
+
* strategy. Mirrors `SubscriptionDispatcher`'s
|
|
151
|
+
* `stripAuthHeaders(...)` + `applyHeadersWithRetry(...)` sequence, including
|
|
152
|
+
* the best-effort swallow-and-warn around a throwing `applyHeaders`.
|
|
153
|
+
*
|
|
154
|
+
* The strategy's looser `AuthApplyHints` (optional `upstreamUrl` /
|
|
155
|
+
* `resolvedModel`) is fed from the pipeline's required `{ upstreamUrl,
|
|
156
|
+
* model }` at the boundary.
|
|
157
|
+
*/
|
|
158
|
+
applyHeaders(headers: Record<string, string>, hints: AuthApplyHints): Promise<void>;
|
|
159
|
+
/** Delegate the 401-refresh decision to the bound strategy. */
|
|
160
|
+
onUnauthorized(): Promise<boolean>;
|
|
161
|
+
/** Resolve the upstream URL from the profile, when it provides one. */
|
|
162
|
+
resolveUpstreamUrl(model: string): string | undefined;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
export { type SubscriptionAuthProfile, SubscriptionAuthSource, type SubscriptionRequestSummary, stripAuthHeaders };
|
|
@@ -1,102 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
if (err.cause) {
|
|
7
|
-
msg += ` [cause: ${serializeError(err.cause)}]`;
|
|
8
|
-
}
|
|
9
|
-
const anyErr = err;
|
|
10
|
-
if (anyErr.status != null) msg += ` (status: ${anyErr.status})`;
|
|
11
|
-
else if (anyErr.code != null) msg += ` (code: ${anyErr.code})`;
|
|
12
|
-
return msg;
|
|
13
|
-
}
|
|
14
|
-
if (typeof err === "string") return err || "Empty error string";
|
|
15
|
-
if (typeof err !== "object") return String(err);
|
|
16
|
-
const obj = err;
|
|
17
|
-
if (typeof obj.message === "string" && obj.message) {
|
|
18
|
-
let msg = obj.message;
|
|
19
|
-
if (obj.status != null) msg += ` (status: ${obj.status})`;
|
|
20
|
-
else if (obj.code != null) msg += ` (code: ${obj.code})`;
|
|
21
|
-
if (typeof obj.type === "string") msg += ` [type: ${obj.type}]`;
|
|
22
|
-
return msg;
|
|
23
|
-
}
|
|
24
|
-
if (typeof obj.error === "string" && obj.error) {
|
|
25
|
-
return obj.error;
|
|
26
|
-
}
|
|
27
|
-
if (obj.error && typeof obj.error === "object") {
|
|
28
|
-
const inner = obj.error;
|
|
29
|
-
if (typeof inner.message === "string" && inner.message) {
|
|
30
|
-
let msg = inner.message;
|
|
31
|
-
if (typeof inner.type === "string") msg += ` [type: ${inner.type}]`;
|
|
32
|
-
return msg;
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
try {
|
|
36
|
-
const json = JSON.stringify(err, getCircularReplacer(), 2);
|
|
37
|
-
if (json && json.length > 1e3) {
|
|
38
|
-
return json.slice(0, 1e3) + "... (truncated)";
|
|
39
|
-
}
|
|
40
|
-
return json || "Unserializable error";
|
|
41
|
-
} catch {
|
|
42
|
-
return `Unserializable error: ${Object.prototype.toString.call(err)}`;
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
function getCircularReplacer() {
|
|
46
|
-
const seen = /* @__PURE__ */ new WeakSet();
|
|
47
|
-
return (_key, value) => {
|
|
48
|
-
if (typeof value === "object" && value !== null) {
|
|
49
|
-
if (seen.has(value)) return "[Circular]";
|
|
50
|
-
seen.add(value);
|
|
51
|
-
}
|
|
52
|
-
return value;
|
|
53
|
-
};
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
// src/pipeline/SubscriptionAuthSource.ts
|
|
57
|
-
function stripAuthHeaders(headers) {
|
|
58
|
-
delete headers.authorization;
|
|
59
|
-
delete headers.Authorization;
|
|
60
|
-
delete headers["x-api-key"];
|
|
61
|
-
delete headers["X-Api-Key"];
|
|
62
|
-
delete headers["x-goog-api-key"];
|
|
63
|
-
delete headers["X-Goog-Api-Key"];
|
|
64
|
-
}
|
|
65
|
-
var SubscriptionAuthSource = class {
|
|
66
|
-
constructor(profile) {
|
|
67
|
-
this.profile = profile;
|
|
68
|
-
}
|
|
69
|
-
profile;
|
|
70
|
-
/**
|
|
71
|
-
* Strip any transformer-set auth headers, then delegate to the bound
|
|
72
|
-
* strategy. Mirrors `SubscriptionDispatcher`'s
|
|
73
|
-
* `stripAuthHeaders(...)` + `applyHeadersWithRetry(...)` sequence, including
|
|
74
|
-
* the best-effort swallow-and-warn around a throwing `applyHeaders`.
|
|
75
|
-
*
|
|
76
|
-
* The strategy's looser `AuthApplyHints` (optional `upstreamUrl` /
|
|
77
|
-
* `resolvedModel`) is fed from the pipeline's required `{ upstreamUrl,
|
|
78
|
-
* model }` at the boundary.
|
|
79
|
-
*/
|
|
80
|
-
async applyHeaders(headers, hints) {
|
|
81
|
-
stripAuthHeaders(headers);
|
|
82
|
-
try {
|
|
83
|
-
await this.profile.authStrategy.applyHeaders(headers, {
|
|
84
|
-
upstreamUrl: hints.upstreamUrl,
|
|
85
|
-
resolvedModel: hints.model
|
|
86
|
-
});
|
|
87
|
-
} catch (err) {
|
|
88
|
-
console.warn("[SubscriptionAuthSource] authStrategy.applyHeaders threw:", serializeError(err));
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
/** Delegate the 401-refresh decision to the bound strategy. */
|
|
92
|
-
async onUnauthorized() {
|
|
93
|
-
return this.profile.authStrategy.onUnauthorized();
|
|
94
|
-
}
|
|
95
|
-
/** Resolve the upstream URL from the profile, when it provides one. */
|
|
96
|
-
resolveUpstreamUrl(model) {
|
|
97
|
-
return this.profile.resolveUpstreamUrl?.(model);
|
|
98
|
-
}
|
|
99
|
-
};
|
|
1
|
+
import {
|
|
2
|
+
SubscriptionAuthSource,
|
|
3
|
+
stripAuthHeaders
|
|
4
|
+
} from "../chunk-74TMJA7Z.js";
|
|
5
|
+
import "../chunk-AVYJ4YBN.js";
|
|
100
6
|
export {
|
|
101
7
|
SubscriptionAuthSource,
|
|
102
8
|
stripAuthHeaders
|
|
@@ -1,18 +1 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __defProp = Object.defineProperty;
|
|
3
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
-
var __copyProps = (to, from, except, desc) => {
|
|
7
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
8
|
-
for (let key of __getOwnPropNames(from))
|
|
9
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
10
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
11
|
-
}
|
|
12
|
-
return to;
|
|
13
|
-
};
|
|
14
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
15
|
-
|
|
16
|
-
// src/pipeline/SubscriptionAuthStrategy.ts
|
|
17
|
-
var SubscriptionAuthStrategy_exports = {};
|
|
18
|
-
module.exports = __toCommonJS(SubscriptionAuthStrategy_exports);
|
|
1
|
+
"use strict";
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { TransformerChainExecutor, ChainExecutionOptions } from '../transformer/TransformerChainExecutor.cjs';
|
|
2
|
+
import { UnifiedChatRequest, LLMProvider, ResolvedTransformerChain, Transformer, RequestConfig } from '../transformer/types.cjs';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* executeProviderCall — shared provider-request exchange core.
|
|
6
|
+
*
|
|
7
|
+
* Phase 1 of the `provider-request-pipeline` OpenSpec change (design D2/D4/D6).
|
|
8
|
+
*
|
|
9
|
+
* The three consumer paths (the wire-format proxy handler, the host engine
|
|
10
|
+
* adapter, TransformerHandler) each re-implemented the same middle:
|
|
11
|
+
*
|
|
12
|
+
* executor.executeRequestChain(...) → resolve URL → assemble headers
|
|
13
|
+
* → fetch → (optionally) executor.executeResponseChain(...)
|
|
14
|
+
*
|
|
15
|
+
* This module owns ONLY that common exchange. Every step that diverges
|
|
16
|
+
* between the three sites is injected via options so each call site keeps
|
|
17
|
+
* its CURRENT behavior verbatim:
|
|
18
|
+
*
|
|
19
|
+
* - URL building → `resolveUrl(config)`
|
|
20
|
+
* - header assembly → `buildHeaders(config)`
|
|
21
|
+
* - post-transform body mutation → `prepareBody(requestBody, config)`
|
|
22
|
+
* - fetch mechanism → `fetchFn(url, headers, body)`
|
|
23
|
+
* - endpoint transform → `endpointTransformer` (proxy = Anthropic; others omit)
|
|
24
|
+
* - response chain → `runResponseChain` flag + `responseChainRequest`
|
|
25
|
+
*
|
|
26
|
+
* IMPORTANT subtleties preserved verbatim:
|
|
27
|
+
*
|
|
28
|
+
* 1. The response chain's FIRST argument is the REQUEST body, NOT the
|
|
29
|
+
* mutated `prepareBody` output. Each site passes a DIFFERENT variable
|
|
30
|
+
* there today (proxy → post-transform `requestBody`; Adapter/Handler →
|
|
31
|
+
* the pre-transform `unifiedRequest`), so the core does not hard-code
|
|
32
|
+
* it — `responseChainRequest` is supplied by the caller when
|
|
33
|
+
* `runResponseChain` is true.
|
|
34
|
+
*
|
|
35
|
+
* 2. The engine adapter and Handler check `response.ok` on the RAW fetch response
|
|
36
|
+
* BEFORE running the response chain. Those sites therefore set
|
|
37
|
+
* `runResponseChain: false` (the default) and run `executeResponseChain`
|
|
38
|
+
* themselves at the call site after their `.ok` gate. The proxy uses
|
|
39
|
+
* `fetchWithRetry` (no raw `.ok` gate between fetch and the response
|
|
40
|
+
* chain) so it sets `runResponseChain: true` and lets the core run it.
|
|
41
|
+
*
|
|
42
|
+
* @module pipeline/executeProviderCall
|
|
43
|
+
*/
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Inputs for {@link executeProviderCall}. Everything that differs between
|
|
47
|
+
* the three ingress adapters is injected here; the core owns only the
|
|
48
|
+
* fixed orchestration between `executeRequestChain` and the fetch.
|
|
49
|
+
*/
|
|
50
|
+
interface ProviderCallContext {
|
|
51
|
+
/** Shared (stateless) transformer-chain executor. */
|
|
52
|
+
executor: TransformerChainExecutor;
|
|
53
|
+
/**
|
|
54
|
+
* The request to send into the request chain. For the proxy this is the
|
|
55
|
+
* raw Anthropic wire body (decoded by `endpointTransformer`); for the
|
|
56
|
+
* unified ingresses this is a `UnifiedChatRequest`.
|
|
57
|
+
*/
|
|
58
|
+
request: UnifiedChatRequest | Record<string, unknown>;
|
|
59
|
+
/** Provider config in transformer runtime shape. */
|
|
60
|
+
provider: LLMProvider;
|
|
61
|
+
/** Resolved transformer chain (provider + model transformers). */
|
|
62
|
+
chain: ResolvedTransformerChain;
|
|
63
|
+
/**
|
|
64
|
+
* Endpoint transformer — present only for wire-format ingress (the proxy
|
|
65
|
+
* passes `AnthropicTransformer`). Omitted for unified ingresses.
|
|
66
|
+
*/
|
|
67
|
+
endpointTransformer?: Transformer;
|
|
68
|
+
/**
|
|
69
|
+
* 1M-context opt-in, threaded straight through to
|
|
70
|
+
* `executeRequestChain`'s `extendedContext` option, exactly as the call
|
|
71
|
+
* sites pass it today.
|
|
72
|
+
*/
|
|
73
|
+
extendedContext?: ChainExecutionOptions['extendedContext'];
|
|
74
|
+
/**
|
|
75
|
+
* Build the target URL from the post-request-chain `config`. Each site
|
|
76
|
+
* supplies its CURRENT URL logic:
|
|
77
|
+
* - proxy: always `buildProviderApiUrl(...)` (ignores config.url)
|
|
78
|
+
* - Adapter/Handler: `config.url instanceof URL ? config.url.toString() : buildProviderApiUrl(...)`
|
|
79
|
+
*/
|
|
80
|
+
resolveUrl: (config: RequestConfig) => string;
|
|
81
|
+
/**
|
|
82
|
+
* Assemble the outbound headers from the post-request-chain `config`.
|
|
83
|
+
* Each site supplies its CURRENT header logic:
|
|
84
|
+
* - proxy: getProviderHeaders + config.headers EXCLUDING AUTH_HEADER_KEYS
|
|
85
|
+
* - Adapter/Handler: getProviderHeaders + config.headers + OpenRouter app headers
|
|
86
|
+
*/
|
|
87
|
+
buildHeaders: (config: RequestConfig) => Record<string, string>;
|
|
88
|
+
/**
|
|
89
|
+
* Post-transform / pre-fetch body mutation seam (design D4). Applied to
|
|
90
|
+
* the request-chain output `requestBody` immediately before fetch. The
|
|
91
|
+
* default is identity. NOTE: the value returned here becomes the fetched
|
|
92
|
+
* body ONLY — the response chain still receives the pre-mutation request
|
|
93
|
+
* (see `responseChainRequest`).
|
|
94
|
+
*/
|
|
95
|
+
prepareBody?: (requestBody: unknown, config: RequestConfig) => unknown | Promise<unknown>;
|
|
96
|
+
/**
|
|
97
|
+
* The fetch mechanism. Each site supplies its CURRENT mechanism:
|
|
98
|
+
* - proxy: `this.deps.errors.fetchWithRetry(url, headers, body, model)`
|
|
99
|
+
* - Adapter: `fetch(url, { ..., signal: AbortSignal.timeout(...) })`
|
|
100
|
+
* - Handler: `fetch(url, { ... })`
|
|
101
|
+
*/
|
|
102
|
+
fetchFn: (url: string, headers: Record<string, string>, body: unknown) => Promise<Response>;
|
|
103
|
+
/**
|
|
104
|
+
* When `true`, the core runs `executeResponseChain` on the fetched
|
|
105
|
+
* response and returns the TRANSFORMED response. When `false` (default),
|
|
106
|
+
* the core returns the RAW fetched response and the caller runs the
|
|
107
|
+
* response chain itself — this preserves call sites that gate on
|
|
108
|
+
* `response.ok` BEFORE the response chain (Adapter / Handler).
|
|
109
|
+
*/
|
|
110
|
+
runResponseChain?: boolean;
|
|
111
|
+
/**
|
|
112
|
+
* The first argument passed to `executeResponseChain` when
|
|
113
|
+
* `runResponseChain` is true. This is REQUIRED in that mode because the
|
|
114
|
+
* sites diverge on which variable they pass (proxy → post-transform
|
|
115
|
+
* `requestBody`; the unified ingresses → the pre-transform request). The
|
|
116
|
+
* core never assumes it equals `prepareBody`'s output.
|
|
117
|
+
*/
|
|
118
|
+
responseChainRequest?: UnifiedChatRequest;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Result of the common exchange.
|
|
122
|
+
*
|
|
123
|
+
* `response` is the TRANSFORMED response when `runResponseChain` was true,
|
|
124
|
+
* otherwise the RAW fetched response. The remaining fields expose the
|
|
125
|
+
* request-chain outputs so callers can run the response chain themselves
|
|
126
|
+
* (when `runResponseChain` is false) with the exact variables they used
|
|
127
|
+
* before, and so the wire-capture / logging hooks keep their inputs.
|
|
128
|
+
*/
|
|
129
|
+
interface ProviderCallResult {
|
|
130
|
+
/** Transformed response (runResponseChain=true) or raw response (false). */
|
|
131
|
+
response: Response;
|
|
132
|
+
/** Request-chain output body (pre-`prepareBody`). */
|
|
133
|
+
requestBody: unknown;
|
|
134
|
+
/** Final body actually sent to `fetchFn` (post-`prepareBody`). */
|
|
135
|
+
finalBody: unknown;
|
|
136
|
+
/** Request-chain output config (headers/url/etc.). */
|
|
137
|
+
config: RequestConfig;
|
|
138
|
+
/** The resolved target URL. */
|
|
139
|
+
url: string;
|
|
140
|
+
/** The assembled outbound headers. */
|
|
141
|
+
headers: Record<string, string>;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Run the common provider-request exchange. See the module + option JSDoc
|
|
145
|
+
* for the precise per-site contract this preserves.
|
|
146
|
+
*/
|
|
147
|
+
declare function executeProviderCall(ctx: ProviderCallContext): Promise<ProviderCallResult>;
|
|
148
|
+
|
|
149
|
+
export { type ProviderCallContext, type ProviderCallResult, executeProviderCall };
|