@omnicross/core 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ApiConverter.cjs +799 -0
- package/dist/ApiConverter.d.cts +82 -0
- package/dist/ApiConverter.d.ts +82 -0
- package/dist/ApiConverter.js +763 -0
- package/dist/BuiltinToolExecutor-BluWyeob.d.ts +81 -0
- package/dist/BuiltinToolExecutor-CS2WpXhM.d.cts +81 -0
- package/dist/CompletionService-7fCmKAP3.d.ts +212 -0
- package/dist/CompletionService-DtOF_War.d.cts +212 -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/completion/BuiltinToolExecutor.cjs +327 -0
- package/dist/completion/BuiltinToolExecutor.d.cts +4 -0
- package/dist/completion/BuiltinToolExecutor.d.ts +4 -0
- package/dist/completion/BuiltinToolExecutor.js +296 -0
- package/dist/completion/CompletionService.cjs +3487 -0
- package/dist/completion/CompletionService.d.cts +21 -0
- package/dist/completion/CompletionService.d.ts +21 -0
- package/dist/completion/CompletionService.js +3461 -0
- package/dist/completion/NativeSearchInjector.cjs +196 -0
- package/dist/completion/NativeSearchInjector.d.cts +42 -0
- package/dist/completion/NativeSearchInjector.d.ts +42 -0
- package/dist/completion/NativeSearchInjector.js +167 -0
- package/dist/completion/ProviderSearchInjector.cjs +87 -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 +67 -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 +38 -0
- package/dist/completion/openrouter-headers.cjs +72 -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 +42 -0
- package/dist/completion/openrouter-models.cjs +86 -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 +59 -0
- package/dist/completion/types.cjs +18 -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 +138 -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 +104 -0
- package/dist/completion.d.cts +148 -7
- package/dist/completion.d.ts +148 -7
- package/dist/index.cjs +1 -0
- package/dist/index.d.cts +27 -90
- package/dist/index.d.ts +27 -90
- package/dist/index.js +1 -0
- package/dist/outbound-api/routeResolver.cjs +221 -0
- package/dist/outbound-api/routeResolver.d.cts +18 -0
- package/dist/outbound-api/routeResolver.d.ts +18 -0
- package/dist/outbound-api/routeResolver.js +192 -0
- package/dist/outbound-api/subscriptionRegistryPort.d.cts +5 -2
- package/dist/outbound-api/subscriptionRegistryPort.d.ts +5 -2
- package/dist/outbound-api/types.cjs +18 -0
- package/dist/{types-CbCN2NQP.d.ts → outbound-api/types.d.cts} +17 -3
- package/dist/{types-CGGrKqC_.d.cts → outbound-api/types.d.ts} +17 -3
- package/dist/outbound-api/types.js +0 -0
- package/dist/outbound-api.cjs +1 -0
- package/dist/outbound-api.d.cts +14 -87
- package/dist/outbound-api.d.ts +14 -87
- package/dist/outbound-api.js +1 -0
- package/dist/pipeline/AuthSource.cjs +18 -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 +169 -0
- package/dist/pipeline/LlmConfigProviderAuth.d.cts +86 -0
- package/dist/pipeline/LlmConfigProviderAuth.d.ts +86 -0
- package/dist/pipeline/LlmConfigProviderAuth.js +142 -0
- package/dist/pipeline/SubscriptionAuthSource.d.cts +165 -3
- package/dist/pipeline/SubscriptionAuthSource.d.ts +165 -3
- package/dist/pipeline/executeProviderCall.cjs +70 -0
- package/dist/pipeline/executeProviderCall.d.cts +149 -0
- package/dist/pipeline/executeProviderCall.d.ts +149 -0
- package/dist/pipeline/executeProviderCall.js +45 -0
- package/dist/pipeline/resolveProviderChain.cjs +47 -0
- package/dist/pipeline/resolveProviderChain.d.cts +58 -0
- package/dist/pipeline/resolveProviderChain.d.ts +58 -0
- package/dist/pipeline/resolveProviderChain.js +22 -0
- package/dist/pipeline/resolveSubscriptionChain.cjs +68 -0
- package/dist/pipeline/resolveSubscriptionChain.d.cts +68 -0
- package/dist/pipeline/resolveSubscriptionChain.d.ts +68 -0
- package/dist/pipeline/resolveSubscriptionChain.js +43 -0
- package/dist/ports/provider-config-source.cjs +18 -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/web-search-backend.cjs +18 -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.d.cts +10 -7
- package/dist/ports.d.ts +10 -7
- package/dist/provider-proxy/ProviderProxy.cjs +4643 -0
- package/dist/provider-proxy/ProviderProxy.d.cts +16 -0
- package/dist/provider-proxy/ProviderProxy.d.ts +16 -0
- package/dist/provider-proxy/ProviderProxy.js +4618 -0
- package/dist/provider-proxy/ingress/providerProxyShared.d.cts +5 -2
- package/dist/provider-proxy/ingress/providerProxyShared.d.ts +5 -2
- package/dist/provider-proxy/types.d.cts +406 -8
- package/dist/provider-proxy/types.d.ts +406 -8
- package/dist/provider-proxy.cjs +1 -0
- package/dist/provider-proxy.d.cts +8 -5
- package/dist/provider-proxy.d.ts +8 -5
- package/dist/provider-proxy.js +1 -0
- package/dist/routeResolver-BrbK6ja9.d.cts +88 -0
- package/dist/routeResolver-HE-ZO0fO.d.ts +88 -0
- package/dist/transformer/anthropicBetaInject.cjs +51 -0
- package/dist/transformer/anthropicBetaInject.d.cts +20 -0
- package/dist/transformer/anthropicBetaInject.d.ts +20 -0
- package/dist/transformer/anthropicBetaInject.js +25 -0
- package/dist/transformer/transformers/AnthropicTransformer.cjs +1017 -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 +990 -0
- package/dist/transformer/transformers/ReasoningTransformer.cjs +273 -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 +253 -0
- package/dist/transformer/transformers.cjs +3206 -0
- package/dist/transformer/transformers.d.cts +100 -0
- package/dist/transformer/transformers.d.ts +100 -0
- package/dist/transformer/transformers.js +3174 -0
- package/dist/transformer.d.cts +8 -31
- package/dist/transformer.d.ts +8 -31
- package/dist/types-BScIHmPr.d.cts +153 -0
- package/dist/types-BScIHmPr.d.ts +153 -0
- package/package.json +3 -3
- 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
|
@@ -0,0 +1,70 @@
|
|
|
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 __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/pipeline/executeProviderCall.ts
|
|
21
|
+
var executeProviderCall_exports = {};
|
|
22
|
+
__export(executeProviderCall_exports, {
|
|
23
|
+
executeProviderCall: () => executeProviderCall
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(executeProviderCall_exports);
|
|
26
|
+
async function executeProviderCall(ctx) {
|
|
27
|
+
const {
|
|
28
|
+
executor,
|
|
29
|
+
request,
|
|
30
|
+
provider,
|
|
31
|
+
chain,
|
|
32
|
+
endpointTransformer,
|
|
33
|
+
extendedContext,
|
|
34
|
+
resolveUrl,
|
|
35
|
+
buildHeaders,
|
|
36
|
+
prepareBody,
|
|
37
|
+
fetchFn,
|
|
38
|
+
runResponseChain = false,
|
|
39
|
+
responseChainRequest
|
|
40
|
+
} = ctx;
|
|
41
|
+
const { requestBody, config } = await executor.executeRequestChain(
|
|
42
|
+
request,
|
|
43
|
+
provider,
|
|
44
|
+
chain,
|
|
45
|
+
{ endpointTransformer, extendedContext }
|
|
46
|
+
);
|
|
47
|
+
const finalBody = prepareBody ? await prepareBody(requestBody, config) : requestBody;
|
|
48
|
+
const url = resolveUrl(config);
|
|
49
|
+
const headers = buildHeaders(config);
|
|
50
|
+
const fetched = await fetchFn(url, headers, finalBody);
|
|
51
|
+
let response = fetched;
|
|
52
|
+
if (runResponseChain) {
|
|
53
|
+
response = await executor.executeResponseChain(
|
|
54
|
+
// Preserve the EXACT first arg each site passed: proxy → requestBody,
|
|
55
|
+
// unified ingresses → their pre-transform request. The caller supplies
|
|
56
|
+
// it via `responseChainRequest`; fall back to `requestBody` (the proxy
|
|
57
|
+
// shape) so the contract is never silently `undefined`.
|
|
58
|
+
responseChainRequest ?? requestBody,
|
|
59
|
+
fetched,
|
|
60
|
+
provider,
|
|
61
|
+
chain,
|
|
62
|
+
{ endpointTransformer }
|
|
63
|
+
);
|
|
64
|
+
}
|
|
65
|
+
return { response, requestBody, finalBody, config, url, headers };
|
|
66
|
+
}
|
|
67
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
68
|
+
0 && (module.exports = {
|
|
69
|
+
executeProviderCall
|
|
70
|
+
});
|
|
@@ -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 };
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { TransformerChainExecutor, ChainExecutionOptions } from '../transformer/TransformerChainExecutor.js';
|
|
2
|
+
import { UnifiedChatRequest, LLMProvider, ResolvedTransformerChain, Transformer, RequestConfig } from '../transformer/types.js';
|
|
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 };
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
// src/pipeline/executeProviderCall.ts
|
|
2
|
+
async function executeProviderCall(ctx) {
|
|
3
|
+
const {
|
|
4
|
+
executor,
|
|
5
|
+
request,
|
|
6
|
+
provider,
|
|
7
|
+
chain,
|
|
8
|
+
endpointTransformer,
|
|
9
|
+
extendedContext,
|
|
10
|
+
resolveUrl,
|
|
11
|
+
buildHeaders,
|
|
12
|
+
prepareBody,
|
|
13
|
+
fetchFn,
|
|
14
|
+
runResponseChain = false,
|
|
15
|
+
responseChainRequest
|
|
16
|
+
} = ctx;
|
|
17
|
+
const { requestBody, config } = await executor.executeRequestChain(
|
|
18
|
+
request,
|
|
19
|
+
provider,
|
|
20
|
+
chain,
|
|
21
|
+
{ endpointTransformer, extendedContext }
|
|
22
|
+
);
|
|
23
|
+
const finalBody = prepareBody ? await prepareBody(requestBody, config) : requestBody;
|
|
24
|
+
const url = resolveUrl(config);
|
|
25
|
+
const headers = buildHeaders(config);
|
|
26
|
+
const fetched = await fetchFn(url, headers, finalBody);
|
|
27
|
+
let response = fetched;
|
|
28
|
+
if (runResponseChain) {
|
|
29
|
+
response = await executor.executeResponseChain(
|
|
30
|
+
// Preserve the EXACT first arg each site passed: proxy → requestBody,
|
|
31
|
+
// unified ingresses → their pre-transform request. The caller supplies
|
|
32
|
+
// it via `responseChainRequest`; fall back to `requestBody` (the proxy
|
|
33
|
+
// shape) so the contract is never silently `undefined`.
|
|
34
|
+
responseChainRequest ?? requestBody,
|
|
35
|
+
fetched,
|
|
36
|
+
provider,
|
|
37
|
+
chain,
|
|
38
|
+
{ endpointTransformer }
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
return { response, requestBody, finalBody, config, url, headers };
|
|
42
|
+
}
|
|
43
|
+
export {
|
|
44
|
+
executeProviderCall
|
|
45
|
+
};
|
|
@@ -0,0 +1,47 @@
|
|
|
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 __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/pipeline/resolveProviderChain.ts
|
|
21
|
+
var resolveProviderChain_exports = {};
|
|
22
|
+
__export(resolveProviderChain_exports, {
|
|
23
|
+
resolveProviderChain: () => resolveProviderChain
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(resolveProviderChain_exports);
|
|
26
|
+
async function resolveProviderChain(llmConfig, providerId, model) {
|
|
27
|
+
const cachedChain = await llmConfig.resolveTransformerChain(providerId, model);
|
|
28
|
+
const mainTransformer = await llmConfig.getMainTransformer(providerId);
|
|
29
|
+
const chain = {
|
|
30
|
+
providerTransformers: [...cachedChain.providerTransformers],
|
|
31
|
+
modelTransformers: [...cachedChain.modelTransformers]
|
|
32
|
+
};
|
|
33
|
+
if (mainTransformer) {
|
|
34
|
+
const alreadyInChain = chain.providerTransformers.some(
|
|
35
|
+
(t) => t.name === mainTransformer.name
|
|
36
|
+
);
|
|
37
|
+
if (!alreadyInChain) {
|
|
38
|
+
chain.providerTransformers.unshift(mainTransformer);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
const hasTransformers = chain.providerTransformers.length > 0 || chain.modelTransformers.length > 0;
|
|
42
|
+
return { chain, mainTransformer, hasTransformers };
|
|
43
|
+
}
|
|
44
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
45
|
+
0 && (module.exports = {
|
|
46
|
+
resolveProviderChain
|
|
47
|
+
});
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { ProviderConfigSource } from '../ports/provider-config-source.cjs';
|
|
2
|
+
import { Transformer } from '../transformer/types.cjs';
|
|
3
|
+
import '@omnicross/contracts/llm-config';
|
|
4
|
+
import '../transformer/TransformerService.cjs';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* resolveProviderChain — shared transformer-chain resolution helper.
|
|
8
|
+
*
|
|
9
|
+
* Phase 0 of the `provider-request-pipeline` OpenSpec change.
|
|
10
|
+
* All three consumer paths (TransformerHandler, the host engine adapter,
|
|
11
|
+
* and the wire-format proxy handler) previously duplicated the same
|
|
12
|
+
* resolveTransformerChain + getMainTransformer + shallow-copy + unshift
|
|
13
|
+
* block verbatim. This module extracts that single shared helper so the
|
|
14
|
+
* logic lives in exactly one place.
|
|
15
|
+
*
|
|
16
|
+
* IMPORTANT: body mutations that are proxy-specific (ReasoningTransformer
|
|
17
|
+
* auto-inject, thinkingLevel body-inject) are NOT part of this helper —
|
|
18
|
+
* they remain at each call site as before.
|
|
19
|
+
*
|
|
20
|
+
* @module pipeline/resolveProviderChain
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
/** The resolved chain returned by each consumer. */
|
|
24
|
+
interface ResolvedProviderChain {
|
|
25
|
+
chain: {
|
|
26
|
+
providerTransformers: Transformer[];
|
|
27
|
+
modelTransformers: Transformer[];
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* The main transformer resolved for this provider, or `null` when none
|
|
31
|
+
* is configured. Callers that need the transformer name (e.g. to pass
|
|
32
|
+
* into `getProviderCacheCaps` as `mainTransformerName`) can read
|
|
33
|
+
* `mainTransformer?.name` from this field.
|
|
34
|
+
*/
|
|
35
|
+
mainTransformer: Transformer | null;
|
|
36
|
+
/**
|
|
37
|
+
* `true` when there is at least one transformer in either array — used
|
|
38
|
+
* by callers to gate the transformer-chain path vs the direct-API
|
|
39
|
+
* fallback.
|
|
40
|
+
*/
|
|
41
|
+
hasTransformers: boolean;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Resolve the full transformer chain for a provider + model combination.
|
|
45
|
+
*
|
|
46
|
+
* Semantics (identical to all three former inline copies):
|
|
47
|
+
* 1. Call `llmConfig.resolveTransformerChain(providerId, model)` to get the
|
|
48
|
+
* cached chain.
|
|
49
|
+
* 2. Call `llmConfig.getMainTransformer(providerId)` to get the main
|
|
50
|
+
* transformer (e.g. GeminiTransformer for Google providers).
|
|
51
|
+
* 3. Shallow-copy both arrays so the cached reference is not mutated.
|
|
52
|
+
* 4. `unshift` the main transformer into `providerTransformers` unless a
|
|
53
|
+
* transformer with the same `.name` is already present.
|
|
54
|
+
* 5. Compute `hasTransformers`.
|
|
55
|
+
*/
|
|
56
|
+
declare function resolveProviderChain(llmConfig: ProviderConfigSource, providerId: string, model: string): Promise<ResolvedProviderChain>;
|
|
57
|
+
|
|
58
|
+
export { type ResolvedProviderChain, resolveProviderChain };
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { ProviderConfigSource } from '../ports/provider-config-source.js';
|
|
2
|
+
import { Transformer } from '../transformer/types.js';
|
|
3
|
+
import '@omnicross/contracts/llm-config';
|
|
4
|
+
import '../transformer/TransformerService.js';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* resolveProviderChain — shared transformer-chain resolution helper.
|
|
8
|
+
*
|
|
9
|
+
* Phase 0 of the `provider-request-pipeline` OpenSpec change.
|
|
10
|
+
* All three consumer paths (TransformerHandler, the host engine adapter,
|
|
11
|
+
* and the wire-format proxy handler) previously duplicated the same
|
|
12
|
+
* resolveTransformerChain + getMainTransformer + shallow-copy + unshift
|
|
13
|
+
* block verbatim. This module extracts that single shared helper so the
|
|
14
|
+
* logic lives in exactly one place.
|
|
15
|
+
*
|
|
16
|
+
* IMPORTANT: body mutations that are proxy-specific (ReasoningTransformer
|
|
17
|
+
* auto-inject, thinkingLevel body-inject) are NOT part of this helper —
|
|
18
|
+
* they remain at each call site as before.
|
|
19
|
+
*
|
|
20
|
+
* @module pipeline/resolveProviderChain
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
/** The resolved chain returned by each consumer. */
|
|
24
|
+
interface ResolvedProviderChain {
|
|
25
|
+
chain: {
|
|
26
|
+
providerTransformers: Transformer[];
|
|
27
|
+
modelTransformers: Transformer[];
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* The main transformer resolved for this provider, or `null` when none
|
|
31
|
+
* is configured. Callers that need the transformer name (e.g. to pass
|
|
32
|
+
* into `getProviderCacheCaps` as `mainTransformerName`) can read
|
|
33
|
+
* `mainTransformer?.name` from this field.
|
|
34
|
+
*/
|
|
35
|
+
mainTransformer: Transformer | null;
|
|
36
|
+
/**
|
|
37
|
+
* `true` when there is at least one transformer in either array — used
|
|
38
|
+
* by callers to gate the transformer-chain path vs the direct-API
|
|
39
|
+
* fallback.
|
|
40
|
+
*/
|
|
41
|
+
hasTransformers: boolean;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Resolve the full transformer chain for a provider + model combination.
|
|
45
|
+
*
|
|
46
|
+
* Semantics (identical to all three former inline copies):
|
|
47
|
+
* 1. Call `llmConfig.resolveTransformerChain(providerId, model)` to get the
|
|
48
|
+
* cached chain.
|
|
49
|
+
* 2. Call `llmConfig.getMainTransformer(providerId)` to get the main
|
|
50
|
+
* transformer (e.g. GeminiTransformer for Google providers).
|
|
51
|
+
* 3. Shallow-copy both arrays so the cached reference is not mutated.
|
|
52
|
+
* 4. `unshift` the main transformer into `providerTransformers` unless a
|
|
53
|
+
* transformer with the same `.name` is already present.
|
|
54
|
+
* 5. Compute `hasTransformers`.
|
|
55
|
+
*/
|
|
56
|
+
declare function resolveProviderChain(llmConfig: ProviderConfigSource, providerId: string, model: string): Promise<ResolvedProviderChain>;
|
|
57
|
+
|
|
58
|
+
export { type ResolvedProviderChain, resolveProviderChain };
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
// src/pipeline/resolveProviderChain.ts
|
|
2
|
+
async function resolveProviderChain(llmConfig, providerId, model) {
|
|
3
|
+
const cachedChain = await llmConfig.resolveTransformerChain(providerId, model);
|
|
4
|
+
const mainTransformer = await llmConfig.getMainTransformer(providerId);
|
|
5
|
+
const chain = {
|
|
6
|
+
providerTransformers: [...cachedChain.providerTransformers],
|
|
7
|
+
modelTransformers: [...cachedChain.modelTransformers]
|
|
8
|
+
};
|
|
9
|
+
if (mainTransformer) {
|
|
10
|
+
const alreadyInChain = chain.providerTransformers.some(
|
|
11
|
+
(t) => t.name === mainTransformer.name
|
|
12
|
+
);
|
|
13
|
+
if (!alreadyInChain) {
|
|
14
|
+
chain.providerTransformers.unshift(mainTransformer);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
const hasTransformers = chain.providerTransformers.length > 0 || chain.modelTransformers.length > 0;
|
|
18
|
+
return { chain, mainTransformer, hasTransformers };
|
|
19
|
+
}
|
|
20
|
+
export {
|
|
21
|
+
resolveProviderChain
|
|
22
|
+
};
|
|
@@ -0,0 +1,68 @@
|
|
|
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 __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/pipeline/resolveSubscriptionChain.ts
|
|
21
|
+
var resolveSubscriptionChain_exports = {};
|
|
22
|
+
__export(resolveSubscriptionChain_exports, {
|
|
23
|
+
resolveSubscriptionChain: () => resolveSubscriptionChain
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(resolveSubscriptionChain_exports);
|
|
26
|
+
function resolveOne(transformerService, name) {
|
|
27
|
+
const t = transformerService.getTransformer(name);
|
|
28
|
+
if (!t) return null;
|
|
29
|
+
return typeof t === "function" ? new t() : t;
|
|
30
|
+
}
|
|
31
|
+
function resolveSubscriptionChain(profile, transformerService, fallbackEndpoint, overrideNames) {
|
|
32
|
+
const providerNames = overrideNames ?? profile.providerTransformerNames ?? [];
|
|
33
|
+
const modelNames = profile.modelTransformerNames ?? [];
|
|
34
|
+
if (providerNames.length === 0) {
|
|
35
|
+
return { providerTransformers: [fallbackEndpoint], modelTransformers: [] };
|
|
36
|
+
}
|
|
37
|
+
if (!transformerService) {
|
|
38
|
+
throw new Error(
|
|
39
|
+
"[resolveSubscriptionChain] profile declares providerTransformerNames but no TransformerService is wired"
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
const providerTransformers = [];
|
|
43
|
+
for (const name of providerNames) {
|
|
44
|
+
const instance = resolveOne(transformerService, name);
|
|
45
|
+
if (!instance) {
|
|
46
|
+
console.warn(`[resolveSubscriptionChain] Transformer not registered: ${name}`);
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
providerTransformers.push(instance);
|
|
50
|
+
}
|
|
51
|
+
const modelTransformers = [];
|
|
52
|
+
for (const name of modelNames) {
|
|
53
|
+
const instance = resolveOne(transformerService, name);
|
|
54
|
+
if (!instance) {
|
|
55
|
+
console.warn(`[resolveSubscriptionChain] Model transformer not registered: ${name}`);
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
modelTransformers.push(instance);
|
|
59
|
+
}
|
|
60
|
+
if (providerTransformers.length === 0) {
|
|
61
|
+
return { providerTransformers: [fallbackEndpoint], modelTransformers };
|
|
62
|
+
}
|
|
63
|
+
return { providerTransformers, modelTransformers };
|
|
64
|
+
}
|
|
65
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
66
|
+
0 && (module.exports = {
|
|
67
|
+
resolveSubscriptionChain
|
|
68
|
+
});
|