@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.
Files changed (139) hide show
  1. package/dist/ApiConverter.cjs +799 -0
  2. package/dist/ApiConverter.d.cts +82 -0
  3. package/dist/ApiConverter.d.ts +82 -0
  4. package/dist/ApiConverter.js +763 -0
  5. package/dist/BuiltinToolExecutor-BluWyeob.d.ts +81 -0
  6. package/dist/BuiltinToolExecutor-CS2WpXhM.d.cts +81 -0
  7. package/dist/CompletionService-7fCmKAP3.d.ts +212 -0
  8. package/dist/CompletionService-DtOF_War.d.cts +212 -0
  9. package/dist/{ProviderProxy-f_8ziIhW.d.cts → ProviderProxy-C-xqrkKi.d.ts} +7 -2
  10. package/dist/{ProviderProxy-vjt8sQQk.d.ts → ProviderProxy-CnMQYN59.d.cts} +7 -2
  11. package/dist/completion/BuiltinToolExecutor.cjs +327 -0
  12. package/dist/completion/BuiltinToolExecutor.d.cts +4 -0
  13. package/dist/completion/BuiltinToolExecutor.d.ts +4 -0
  14. package/dist/completion/BuiltinToolExecutor.js +296 -0
  15. package/dist/completion/CompletionService.cjs +3487 -0
  16. package/dist/completion/CompletionService.d.cts +21 -0
  17. package/dist/completion/CompletionService.d.ts +21 -0
  18. package/dist/completion/CompletionService.js +3461 -0
  19. package/dist/completion/NativeSearchInjector.cjs +196 -0
  20. package/dist/completion/NativeSearchInjector.d.cts +42 -0
  21. package/dist/completion/NativeSearchInjector.d.ts +42 -0
  22. package/dist/completion/NativeSearchInjector.js +167 -0
  23. package/dist/completion/ProviderSearchInjector.cjs +87 -0
  24. package/dist/completion/ProviderSearchInjector.d.cts +47 -0
  25. package/dist/completion/ProviderSearchInjector.d.ts +47 -0
  26. package/dist/completion/ProviderSearchInjector.js +60 -0
  27. package/dist/completion/native-search-types.cjs +67 -0
  28. package/dist/completion/native-search-types.d.cts +3 -0
  29. package/dist/completion/native-search-types.d.ts +3 -0
  30. package/dist/completion/native-search-types.js +38 -0
  31. package/dist/completion/openrouter-headers.cjs +72 -0
  32. package/dist/completion/openrouter-headers.d.cts +44 -0
  33. package/dist/completion/openrouter-headers.d.ts +44 -0
  34. package/dist/completion/openrouter-headers.js +42 -0
  35. package/dist/completion/openrouter-models.cjs +86 -0
  36. package/dist/completion/openrouter-models.d.cts +27 -0
  37. package/dist/completion/openrouter-models.d.ts +27 -0
  38. package/dist/completion/openrouter-models.js +59 -0
  39. package/dist/completion/types.cjs +18 -0
  40. package/dist/completion/types.d.cts +3 -0
  41. package/dist/completion/types.d.ts +3 -0
  42. package/dist/completion/types.js +0 -0
  43. package/dist/completion/url-builder.cjs +138 -0
  44. package/dist/completion/url-builder.d.cts +87 -0
  45. package/dist/completion/url-builder.d.ts +87 -0
  46. package/dist/completion/url-builder.js +104 -0
  47. package/dist/completion.d.cts +148 -7
  48. package/dist/completion.d.ts +148 -7
  49. package/dist/index.cjs +1 -0
  50. package/dist/index.d.cts +27 -90
  51. package/dist/index.d.ts +27 -90
  52. package/dist/index.js +1 -0
  53. package/dist/outbound-api/routeResolver.cjs +221 -0
  54. package/dist/outbound-api/routeResolver.d.cts +18 -0
  55. package/dist/outbound-api/routeResolver.d.ts +18 -0
  56. package/dist/outbound-api/routeResolver.js +192 -0
  57. package/dist/outbound-api/subscriptionRegistryPort.d.cts +5 -2
  58. package/dist/outbound-api/subscriptionRegistryPort.d.ts +5 -2
  59. package/dist/outbound-api/types.cjs +18 -0
  60. package/dist/{types-CbCN2NQP.d.ts → outbound-api/types.d.cts} +17 -3
  61. package/dist/{types-CGGrKqC_.d.cts → outbound-api/types.d.ts} +17 -3
  62. package/dist/outbound-api/types.js +0 -0
  63. package/dist/outbound-api.cjs +1 -0
  64. package/dist/outbound-api.d.cts +14 -87
  65. package/dist/outbound-api.d.ts +14 -87
  66. package/dist/outbound-api.js +1 -0
  67. package/dist/pipeline/AuthSource.cjs +18 -0
  68. package/dist/pipeline/AuthSource.d.cts +101 -0
  69. package/dist/pipeline/AuthSource.d.ts +101 -0
  70. package/dist/pipeline/AuthSource.js +0 -0
  71. package/dist/pipeline/LlmConfigProviderAuth.cjs +169 -0
  72. package/dist/pipeline/LlmConfigProviderAuth.d.cts +86 -0
  73. package/dist/pipeline/LlmConfigProviderAuth.d.ts +86 -0
  74. package/dist/pipeline/LlmConfigProviderAuth.js +142 -0
  75. package/dist/pipeline/SubscriptionAuthSource.d.cts +165 -3
  76. package/dist/pipeline/SubscriptionAuthSource.d.ts +165 -3
  77. package/dist/pipeline/executeProviderCall.cjs +70 -0
  78. package/dist/pipeline/executeProviderCall.d.cts +149 -0
  79. package/dist/pipeline/executeProviderCall.d.ts +149 -0
  80. package/dist/pipeline/executeProviderCall.js +45 -0
  81. package/dist/pipeline/resolveProviderChain.cjs +47 -0
  82. package/dist/pipeline/resolveProviderChain.d.cts +58 -0
  83. package/dist/pipeline/resolveProviderChain.d.ts +58 -0
  84. package/dist/pipeline/resolveProviderChain.js +22 -0
  85. package/dist/pipeline/resolveSubscriptionChain.cjs +68 -0
  86. package/dist/pipeline/resolveSubscriptionChain.d.cts +68 -0
  87. package/dist/pipeline/resolveSubscriptionChain.d.ts +68 -0
  88. package/dist/pipeline/resolveSubscriptionChain.js +43 -0
  89. package/dist/ports/provider-config-source.cjs +18 -0
  90. package/dist/ports/provider-config-source.d.cts +51 -0
  91. package/dist/ports/provider-config-source.d.ts +51 -0
  92. package/dist/ports/provider-config-source.js +0 -0
  93. package/dist/ports/web-search-backend.cjs +18 -0
  94. package/dist/ports/web-search-backend.d.cts +29 -0
  95. package/dist/ports/web-search-backend.d.ts +29 -0
  96. package/dist/ports/web-search-backend.js +0 -0
  97. package/dist/ports.d.cts +10 -7
  98. package/dist/ports.d.ts +10 -7
  99. package/dist/provider-proxy/ProviderProxy.cjs +4643 -0
  100. package/dist/provider-proxy/ProviderProxy.d.cts +16 -0
  101. package/dist/provider-proxy/ProviderProxy.d.ts +16 -0
  102. package/dist/provider-proxy/ProviderProxy.js +4618 -0
  103. package/dist/provider-proxy/ingress/providerProxyShared.d.cts +5 -2
  104. package/dist/provider-proxy/ingress/providerProxyShared.d.ts +5 -2
  105. package/dist/provider-proxy/types.d.cts +406 -8
  106. package/dist/provider-proxy/types.d.ts +406 -8
  107. package/dist/provider-proxy.cjs +1 -0
  108. package/dist/provider-proxy.d.cts +8 -5
  109. package/dist/provider-proxy.d.ts +8 -5
  110. package/dist/provider-proxy.js +1 -0
  111. package/dist/routeResolver-BrbK6ja9.d.cts +88 -0
  112. package/dist/routeResolver-HE-ZO0fO.d.ts +88 -0
  113. package/dist/transformer/anthropicBetaInject.cjs +51 -0
  114. package/dist/transformer/anthropicBetaInject.d.cts +20 -0
  115. package/dist/transformer/anthropicBetaInject.d.ts +20 -0
  116. package/dist/transformer/anthropicBetaInject.js +25 -0
  117. package/dist/transformer/transformers/AnthropicTransformer.cjs +1017 -0
  118. package/dist/transformer/transformers/AnthropicTransformer.d.cts +148 -0
  119. package/dist/transformer/transformers/AnthropicTransformer.d.ts +148 -0
  120. package/dist/transformer/transformers/AnthropicTransformer.js +990 -0
  121. package/dist/transformer/transformers/ReasoningTransformer.cjs +273 -0
  122. package/dist/transformer/transformers/ReasoningTransformer.d.cts +47 -0
  123. package/dist/transformer/transformers/ReasoningTransformer.d.ts +47 -0
  124. package/dist/transformer/transformers/ReasoningTransformer.js +253 -0
  125. package/dist/transformer/transformers.cjs +3206 -0
  126. package/dist/transformer/transformers.d.cts +100 -0
  127. package/dist/transformer/transformers.d.ts +100 -0
  128. package/dist/transformer/transformers.js +3174 -0
  129. package/dist/transformer.d.cts +8 -31
  130. package/dist/transformer.d.ts +8 -31
  131. package/dist/types-BScIHmPr.d.cts +153 -0
  132. package/dist/types-BScIHmPr.d.ts +153 -0
  133. package/package.json +3 -3
  134. package/dist/SubscriptionAuthSource-Cr4fVEYY.d.cts +0 -264
  135. package/dist/SubscriptionAuthSource-D89zmiSS.d.ts +0 -264
  136. package/dist/index-BTSmc9Sm.d.ts +0 -645
  137. package/dist/index-DXazdTzZ.d.cts +0 -645
  138. package/dist/types-DCzHkhJt.d.ts +0 -467
  139. 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
+ });