@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.
Files changed (272) hide show
  1. package/dist/ApiConverter.cjs +24 -0
  2. package/dist/ApiConverter.d.cts +82 -0
  3. package/dist/ApiConverter.d.ts +82 -0
  4. package/dist/ApiConverter.js +24 -0
  5. package/dist/BuiltinToolExecutor-BluWyeob.d.ts +81 -0
  6. package/dist/BuiltinToolExecutor-CS2WpXhM.d.cts +81 -0
  7. package/dist/CompletionService-D3a47vdU.d.cts +213 -0
  8. package/dist/CompletionService-DdWaAxq0.d.ts +213 -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/auth/GeminiCodeAssistProjectResolver.cjs +27 -60
  12. package/dist/auth/GeminiCodeAssistProjectResolver.js +5 -9
  13. package/dist/builtin-web-fetch-77JZUZGM.cjs +100 -0
  14. package/dist/builtin-web-fetch-IGLBX2XY.js +100 -0
  15. package/dist/chunk-2DCNB7DF.cjs +514 -0
  16. package/dist/chunk-2FEVTJWG.js +4400 -0
  17. package/dist/chunk-3MEACFK3.js +193 -0
  18. package/dist/chunk-3OPYJG76.cjs +266 -0
  19. package/dist/chunk-46RLHI7D.js +0 -0
  20. package/dist/chunk-46ZIFWYG.cjs +277 -0
  21. package/dist/chunk-4NBS6KPV.cjs +43 -0
  22. package/dist/chunk-4VAVYUZS.cjs +991 -0
  23. package/dist/chunk-5ERIZW3D.js +44 -0
  24. package/dist/chunk-5HTVET6E.js +514 -0
  25. package/dist/chunk-5ZQBEOMD.js +764 -0
  26. package/dist/chunk-6VIXXLMX.cjs +14 -0
  27. package/dist/chunk-745DV5FL.js +147 -0
  28. package/dist/chunk-74TMJA7Z.js +53 -0
  29. package/dist/chunk-7VU7V2E4.js +0 -0
  30. package/dist/chunk-7YN22L2H.cjs +87 -0
  31. package/dist/chunk-A2YMUCBT.cjs +105 -0
  32. package/dist/chunk-AQ5TNQB7.js +13 -0
  33. package/dist/chunk-AVYJ4YBN.js +58 -0
  34. package/dist/chunk-C72S6TTV.cjs +49 -0
  35. package/dist/chunk-C7PSERMH.js +87 -0
  36. package/dist/chunk-CDHS2QDC.js +179 -0
  37. package/dist/chunk-DK4A7DLE.js +266 -0
  38. package/dist/chunk-DRWHTIIZ.js +13 -0
  39. package/dist/chunk-DWKQZ2SK.cjs +254 -0
  40. package/dist/chunk-E3WHL7CO.js +14 -0
  41. package/dist/chunk-EYZYXJTJ.cjs +1 -0
  42. package/dist/chunk-FMOBD2OQ.js +39 -0
  43. package/dist/chunk-FTQ7IQUC.js +991 -0
  44. package/dist/chunk-FZ46M34D.cjs +1 -0
  45. package/dist/chunk-G2FUJNA2.cjs +193 -0
  46. package/dist/chunk-G2UTNSGU.js +277 -0
  47. package/dist/chunk-GBHYAGX3.cjs +26 -0
  48. package/dist/chunk-GMMT7RVN.cjs +39 -0
  49. package/dist/chunk-H5JUT3KV.js +105 -0
  50. package/dist/chunk-HQP3K7PU.cjs +431 -0
  51. package/dist/chunk-JO5NLTLY.js +46 -0
  52. package/dist/chunk-JWC6APFQ.js +23 -0
  53. package/dist/chunk-KUU2RNG6.cjs +46 -0
  54. package/dist/chunk-LKZJEL6E.cjs +124 -0
  55. package/dist/chunk-MNYKI4CI.js +94 -0
  56. package/dist/chunk-MZNPGW5Q.js +26 -0
  57. package/dist/chunk-N3V2J5ZO.cjs +53 -0
  58. package/dist/chunk-NYUNU75A.cjs +44 -0
  59. package/dist/chunk-NZYN7C3P.cjs +179 -0
  60. package/dist/chunk-O466Y272.js +235 -0
  61. package/dist/chunk-PXUJF5HS.js +124 -0
  62. package/dist/chunk-QBZJ7P2T.cjs +13 -0
  63. package/dist/chunk-QOCNX236.js +46 -0
  64. package/dist/chunk-QXD4MV2X.cjs +23 -0
  65. package/dist/chunk-R3HK6R4B.cjs +13 -0
  66. package/dist/chunk-RSJ3TWJQ.cjs +186 -0
  67. package/dist/chunk-S4WBV25P.js +913 -0
  68. package/dist/chunk-SN3YWBX7.cjs +4400 -0
  69. package/dist/chunk-SPVWWUHX.cjs +46 -0
  70. package/dist/chunk-SUEGJ75D.cjs +764 -0
  71. package/dist/chunk-SVNDB62D.cjs +58 -0
  72. package/dist/chunk-UYPEN5XE.cjs +235 -0
  73. package/dist/chunk-V5KPWNYX.cjs +147 -0
  74. package/dist/chunk-VVEHS2LI.js +431 -0
  75. package/dist/chunk-XBSYYZIY.cjs +94 -0
  76. package/dist/chunk-YGXJGRFI.cjs +913 -0
  77. package/dist/chunk-YMFAJFQT.cjs +173 -0
  78. package/dist/chunk-Z7LUNECE.js +49 -0
  79. package/dist/chunk-Z7Y2NPHY.js +186 -0
  80. package/dist/chunk-ZJZAOKI7.js +254 -0
  81. package/dist/chunk-ZLX3KGXX.js +173 -0
  82. package/dist/chunk-ZSVQT3PW.js +43 -0
  83. package/dist/completion/ApiKeyPoolService.cjs +23 -48
  84. package/dist/completion/ApiKeyPoolService.d.cts +150 -2
  85. package/dist/completion/ApiKeyPoolService.d.ts +150 -2
  86. package/dist/completion/BuiltinToolExecutor.cjs +12 -0
  87. package/dist/completion/BuiltinToolExecutor.d.cts +4 -0
  88. package/dist/completion/BuiltinToolExecutor.d.ts +4 -0
  89. package/dist/completion/BuiltinToolExecutor.js +12 -0
  90. package/dist/completion/CompletionService.cjs +38 -0
  91. package/dist/completion/CompletionService.d.cts +22 -0
  92. package/dist/completion/CompletionService.d.ts +22 -0
  93. package/dist/completion/CompletionService.js +38 -0
  94. package/dist/completion/NativeSearchInjector.cjs +12 -0
  95. package/dist/completion/NativeSearchInjector.d.cts +42 -0
  96. package/dist/completion/NativeSearchInjector.d.ts +42 -0
  97. package/dist/completion/NativeSearchInjector.js +12 -0
  98. package/dist/completion/ProviderSearchInjector.cjs +60 -0
  99. package/dist/completion/ProviderSearchInjector.d.cts +47 -0
  100. package/dist/completion/ProviderSearchInjector.d.ts +47 -0
  101. package/dist/completion/ProviderSearchInjector.js +60 -0
  102. package/dist/completion/native-search-types.cjs +14 -0
  103. package/dist/completion/native-search-types.d.cts +3 -0
  104. package/dist/completion/native-search-types.d.ts +3 -0
  105. package/dist/completion/native-search-types.js +14 -0
  106. package/dist/completion/openrouter-headers.cjs +16 -0
  107. package/dist/completion/openrouter-headers.d.cts +44 -0
  108. package/dist/completion/openrouter-headers.d.ts +44 -0
  109. package/dist/completion/openrouter-headers.js +16 -0
  110. package/dist/completion/openrouter-models.cjs +29 -0
  111. package/dist/completion/openrouter-models.d.cts +27 -0
  112. package/dist/completion/openrouter-models.d.ts +27 -0
  113. package/dist/completion/openrouter-models.js +29 -0
  114. package/dist/completion/types.cjs +1 -0
  115. package/dist/completion/types.d.cts +3 -0
  116. package/dist/completion/types.d.ts +3 -0
  117. package/dist/completion/types.js +0 -0
  118. package/dist/completion/url-builder.cjs +24 -0
  119. package/dist/completion/url-builder.d.cts +87 -0
  120. package/dist/completion/url-builder.d.ts +87 -0
  121. package/dist/completion/url-builder.js +24 -0
  122. package/dist/completion.cjs +55 -3989
  123. package/dist/completion.d.cts +150 -8
  124. package/dist/completion.d.ts +150 -8
  125. package/dist/completion.js +63 -3953
  126. package/dist/index.cjs +197 -10428
  127. package/dist/index.d.cts +35 -91
  128. package/dist/index.d.ts +35 -91
  129. package/dist/index.js +125 -10267
  130. package/dist/logger-4GvQNzhE.d.cts +22 -0
  131. package/dist/logger-4GvQNzhE.d.ts +22 -0
  132. package/dist/outbound-api/routeResolver.cjs +11 -0
  133. package/dist/outbound-api/routeResolver.d.cts +19 -0
  134. package/dist/outbound-api/routeResolver.d.ts +19 -0
  135. package/dist/outbound-api/routeResolver.js +11 -0
  136. package/dist/outbound-api/subscriptionRegistryPort.cjs +7 -37
  137. package/dist/outbound-api/subscriptionRegistryPort.d.cts +7 -3
  138. package/dist/outbound-api/subscriptionRegistryPort.d.ts +7 -3
  139. package/dist/outbound-api/subscriptionRegistryPort.js +4 -8
  140. package/dist/outbound-api/types.cjs +1 -0
  141. package/dist/{types-CbCN2NQP.d.ts → outbound-api/types.d.cts} +18 -3
  142. package/dist/{types-CGGrKqC_.d.cts → outbound-api/types.d.ts} +18 -3
  143. package/dist/outbound-api/types.js +0 -0
  144. package/dist/outbound-api.cjs +35 -5220
  145. package/dist/outbound-api.d.cts +16 -88
  146. package/dist/outbound-api.d.ts +16 -88
  147. package/dist/outbound-api.js +54 -5193
  148. package/dist/pipeline/AuthSource.cjs +1 -0
  149. package/dist/pipeline/AuthSource.d.cts +101 -0
  150. package/dist/pipeline/AuthSource.d.ts +101 -0
  151. package/dist/pipeline/AuthSource.js +0 -0
  152. package/dist/pipeline/LlmConfigProviderAuth.cjs +8 -0
  153. package/dist/pipeline/LlmConfigProviderAuth.d.cts +87 -0
  154. package/dist/pipeline/LlmConfigProviderAuth.d.ts +87 -0
  155. package/dist/pipeline/LlmConfigProviderAuth.js +8 -0
  156. package/dist/pipeline/SubscriptionAuthSource.cjs +6 -128
  157. package/dist/pipeline/SubscriptionAuthSource.d.cts +165 -3
  158. package/dist/pipeline/SubscriptionAuthSource.d.ts +165 -3
  159. package/dist/pipeline/SubscriptionAuthSource.js +5 -99
  160. package/dist/pipeline/SubscriptionAuthStrategy.cjs +1 -18
  161. package/dist/pipeline/executeProviderCall.cjs +6 -0
  162. package/dist/pipeline/executeProviderCall.d.cts +149 -0
  163. package/dist/pipeline/executeProviderCall.d.ts +149 -0
  164. package/dist/pipeline/executeProviderCall.js +6 -0
  165. package/dist/pipeline/resolveProviderChain.cjs +6 -0
  166. package/dist/pipeline/resolveProviderChain.d.cts +58 -0
  167. package/dist/pipeline/resolveProviderChain.d.ts +58 -0
  168. package/dist/pipeline/resolveProviderChain.js +6 -0
  169. package/dist/pipeline/resolveSubscriptionChain.cjs +6 -0
  170. package/dist/pipeline/resolveSubscriptionChain.d.cts +68 -0
  171. package/dist/pipeline/resolveSubscriptionChain.d.ts +68 -0
  172. package/dist/pipeline/resolveSubscriptionChain.js +6 -0
  173. package/dist/ports/gemini-code-assist-resolver.cjs +7 -37
  174. package/dist/ports/gemini-code-assist-resolver.js +4 -8
  175. package/dist/ports/pricing-store.cjs +1 -0
  176. package/dist/ports/pricing-store.d.cts +50 -0
  177. package/dist/ports/pricing-store.d.ts +50 -0
  178. package/dist/ports/pricing-store.js +0 -0
  179. package/dist/ports/provider-config-source.cjs +1 -0
  180. package/dist/ports/provider-config-source.d.cts +51 -0
  181. package/dist/ports/provider-config-source.d.ts +51 -0
  182. package/dist/ports/provider-config-source.js +0 -0
  183. package/dist/ports/usage-event-store.cjs +1 -0
  184. package/dist/ports/usage-event-store.d.cts +29 -0
  185. package/dist/ports/usage-event-store.d.ts +29 -0
  186. package/dist/ports/usage-event-store.js +0 -0
  187. package/dist/ports/web-search-backend.cjs +1 -0
  188. package/dist/ports/web-search-backend.d.cts +29 -0
  189. package/dist/ports/web-search-backend.d.ts +29 -0
  190. package/dist/ports/web-search-backend.js +0 -0
  191. package/dist/ports.cjs +1 -18
  192. package/dist/ports.d.cts +16 -8
  193. package/dist/ports.d.ts +16 -8
  194. package/dist/provider-proxy/ProviderProxy.cjs +40 -0
  195. package/dist/provider-proxy/ProviderProxy.d.cts +17 -0
  196. package/dist/provider-proxy/ProviderProxy.d.ts +17 -0
  197. package/dist/provider-proxy/ProviderProxy.js +40 -0
  198. package/dist/provider-proxy/ingress/providerProxyShared.cjs +35 -2941
  199. package/dist/provider-proxy/ingress/providerProxyShared.d.cts +7 -3
  200. package/dist/provider-proxy/ingress/providerProxyShared.d.ts +7 -3
  201. package/dist/provider-proxy/ingress/providerProxyShared.js +41 -2914
  202. package/dist/provider-proxy/matchText.cjs +11 -72
  203. package/dist/provider-proxy/matchText.js +6 -39
  204. package/dist/provider-proxy/types.cjs +1 -18
  205. package/dist/provider-proxy/types.d.cts +407 -8
  206. package/dist/provider-proxy/types.d.ts +407 -8
  207. package/dist/provider-proxy.cjs +35 -4654
  208. package/dist/provider-proxy.d.cts +10 -6
  209. package/dist/provider-proxy.d.ts +10 -6
  210. package/dist/provider-proxy.js +39 -4627
  211. package/dist/routeResolver-BrbK6ja9.d.cts +88 -0
  212. package/dist/routeResolver-HE-ZO0fO.d.ts +88 -0
  213. package/dist/serializeError.cjs +5 -81
  214. package/dist/serializeError.js +3 -54
  215. package/dist/sse-parser.cjs +7 -455
  216. package/dist/sse-parser.js +4 -426
  217. package/dist/transformer/TransformerChainExecutor.cjs +4 -318
  218. package/dist/transformer/TransformerChainExecutor.js +4 -291
  219. package/dist/transformer/TransformerService.cjs +5 -289
  220. package/dist/transformer/TransformerService.js +3 -262
  221. package/dist/transformer/anthropicBetaInject.cjs +8 -0
  222. package/dist/transformer/anthropicBetaInject.d.cts +20 -0
  223. package/dist/transformer/anthropicBetaInject.d.ts +20 -0
  224. package/dist/transformer/anthropicBetaInject.js +8 -0
  225. package/dist/transformer/transformers/AnthropicTransformer.cjs +6 -0
  226. package/dist/transformer/transformers/AnthropicTransformer.d.cts +148 -0
  227. package/dist/transformer/transformers/AnthropicTransformer.d.ts +148 -0
  228. package/dist/transformer/transformers/AnthropicTransformer.js +6 -0
  229. package/dist/transformer/transformers/GeminiCodeAssistTransformer.cjs +4 -1106
  230. package/dist/transformer/transformers/GeminiCodeAssistTransformer.js +7 -1079
  231. package/dist/transformer/transformers/GeminiTransformer.cjs +4 -1010
  232. package/dist/transformer/transformers/GeminiTransformer.js +4 -983
  233. package/dist/transformer/transformers/OpenAIResponseTransformer.cjs +3 -535
  234. package/dist/transformer/transformers/OpenAIResponseTransformer.js +3 -510
  235. package/dist/transformer/transformers/OpenCodeGoTransformer.cjs +5 -72
  236. package/dist/transformer/transformers/OpenCodeGoTransformer.js +3 -45
  237. package/dist/transformer/transformers/ReasoningTransformer.cjs +6 -0
  238. package/dist/transformer/transformers/ReasoningTransformer.d.cts +47 -0
  239. package/dist/transformer/transformers/ReasoningTransformer.d.ts +47 -0
  240. package/dist/transformer/transformers/ReasoningTransformer.js +6 -0
  241. package/dist/transformer/transformers.cjs +39 -0
  242. package/dist/transformer/transformers.d.cts +100 -0
  243. package/dist/transformer/transformers.d.ts +100 -0
  244. package/dist/transformer/transformers.js +39 -0
  245. package/dist/transformer/types.cjs +1 -18
  246. package/dist/transformer.cjs +13 -3726
  247. package/dist/transformer.d.cts +8 -31
  248. package/dist/transformer.d.ts +8 -31
  249. package/dist/transformer.js +17 -3706
  250. package/dist/types-BScIHmPr.d.cts +153 -0
  251. package/dist/types-BScIHmPr.d.ts +153 -0
  252. package/dist/usage/pricing-engine.cjs +6 -0
  253. package/dist/usage/pricing-engine.d.cts +83 -0
  254. package/dist/usage/pricing-engine.d.ts +83 -0
  255. package/dist/usage/pricing-engine.js +6 -0
  256. package/dist/usage/usage-recorder.cjs +6 -0
  257. package/dist/usage/usage-recorder.d.cts +73 -0
  258. package/dist/usage/usage-recorder.d.ts +73 -0
  259. package/dist/usage/usage-recorder.js +6 -0
  260. package/dist/usage.cjs +11 -0
  261. package/dist/usage.d.cts +8 -0
  262. package/dist/usage.d.ts +8 -0
  263. package/dist/usage.js +11 -0
  264. package/package.json +3 -3
  265. package/dist/ApiKeyPoolService-BmMkau07.d.cts +0 -170
  266. package/dist/ApiKeyPoolService-BmMkau07.d.ts +0 -170
  267. package/dist/SubscriptionAuthSource-Cr4fVEYY.d.cts +0 -264
  268. package/dist/SubscriptionAuthSource-D89zmiSS.d.ts +0 -264
  269. package/dist/index-BTSmc9Sm.d.ts +0 -645
  270. package/dist/index-DXazdTzZ.d.cts +0 -645
  271. package/dist/types-DCzHkhJt.d.ts +0 -467
  272. package/dist/types-DZIQbgp0.d.cts +0 -467
@@ -1,3 +1,165 @@
1
- import '@omnicross/contracts/subscription-types';
2
- export { S as SubscriptionAuthProfile, a as SubscriptionAuthSource, b as SubscriptionRequestSummary, s as stripAuthHeaders } from '../SubscriptionAuthSource-Cr4fVEYY.cjs';
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
- export { S as SubscriptionAuthProfile, a as SubscriptionAuthSource, b as SubscriptionRequestSummary, s as stripAuthHeaders } from '../SubscriptionAuthSource-D89zmiSS.js';
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
- // src/serializeError.ts
2
- function serializeError(err) {
3
- if (err == null) return "Unknown error (null)";
4
- if (err instanceof Error) {
5
- let msg = err.message || err.name || "Error";
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,6 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
+
3
+ var _chunkKUU2RNG6cjs = require('../chunk-KUU2RNG6.cjs');
4
+
5
+
6
+ exports.executeProviderCall = _chunkKUU2RNG6cjs.executeProviderCall;
@@ -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 };