@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
@@ -0,0 +1 @@
1
+ "use strict";
@@ -0,0 +1,101 @@
1
+ /**
2
+ * AuthSource — unified outbound-authentication strategy for the provider
3
+ * request pipeline.
4
+ *
5
+ * Phase 2 of the `provider-request-pipeline` OpenSpec change (design D3).
6
+ *
7
+ * The three consumer paths (the wire-format proxy handler, the host engine
8
+ * adapter, TransformerHandler) each authenticate differently:
9
+ *
10
+ * - provider-key (+ ApiKeyPool failover) — LLM-config provider rows
11
+ * - subscription `AuthStrategy` (+ 401 refresh + fallback) — code-cli OAuth
12
+ * - OAuth pass-through — SDK forwards its own Bearer
13
+ *
14
+ * `AuthSource` is the single contract that unifies these. THIS PHASE ONLY
15
+ * DEFINES the interface and provides three behavior-preserving WRAPPERS
16
+ * (`LlmConfigProviderAuth`, `SubscriptionAuthSource`, `OAuthPassThroughAuth`)
17
+ * around the existing logic. NO caller is routed through it yet — the core
18
+ * (`executeProviderCall`) is NOT changed to consume `ctx.auth`, and
19
+ * the host handler's branch structure is UNCHANGED. Wiring (and
20
+ * the `onResult` pool-rotation integration) is Phase 3.
21
+ *
22
+ * @module pipeline/AuthSource
23
+ */
24
+ /**
25
+ * Hints an `AuthSource` may need to vary header formatting per request.
26
+ *
27
+ * Mirrors the subscription-side `AuthApplyHints` (which uses optional
28
+ * `upstreamUrl` / `resolvedModel`) but with REQUIRED fields, since the
29
+ * pipeline always knows both at the point it applies headers. Adapters that
30
+ * wrap the looser subscription shape map these across at the boundary.
31
+ */
32
+ interface AuthApplyHints {
33
+ /** Resolved upstream URL the request will be sent to. */
34
+ upstreamUrl: string;
35
+ /** Resolved model id for the request. */
36
+ model: string;
37
+ }
38
+ /**
39
+ * Result of {@link AuthSource.onResult}.
40
+ *
41
+ * `rebound` is `true` when the auth source rotated to a different credential
42
+ * (e.g. ApiKeyPool re-bound the session to a new key after a 429). `newKey`
43
+ * carries the freshly-resolved key string when a rotation produced one, so a
44
+ * caller MAY retry the same call once with it. Mirrors the
45
+ * `{ newKey | null }` contract of `ApiKeyPoolService.reportError` lifted into
46
+ * a structured shape.
47
+ */
48
+ interface AuthResultOutcome {
49
+ /** Whether the credential was rotated/re-bound as a result of this status. */
50
+ rebound: boolean;
51
+ /** The new resolved key when a rotation produced one; omitted otherwise. */
52
+ newKey?: string;
53
+ }
54
+ /**
55
+ * A pluggable outbound-authentication source for one provider request.
56
+ *
57
+ * Implementations OWN exactly the auth concern: which headers carry the
58
+ * credential, how to recover from a 401, where the request should be sent
59
+ * (when the credential dictates the endpoint), and how to react to a final
60
+ * HTTP status (pool rotation / refresh). The pipeline core composes the rest.
61
+ */
62
+ interface AuthSource {
63
+ /**
64
+ * Inject the authentication headers for this request, mutating `headers`
65
+ * in place. Implementations MAY refresh expiring tokens here.
66
+ *
67
+ * NOTE (Phase 2 boundary, see report): exactly WHAT this owns vs what the
68
+ * ingress assembles (content-type, OpenRouter app headers, proxy auth
69
+ * stripping) is intentionally left to the caller this phase. The wrappers
70
+ * preserve their source's CURRENT header behavior verbatim.
71
+ */
72
+ applyHeaders(headers: Record<string, string>, hints: AuthApplyHints): Promise<void> | void;
73
+ /**
74
+ * Called when the upstream returns 401. Return `true` to ask the caller to
75
+ * retry once with freshly-applied headers; `false` to surface the 401.
76
+ * Optional — sources without a refresh notion omit it.
77
+ */
78
+ onUnauthorized?(): Promise<boolean>;
79
+ /**
80
+ * Resolve the upstream URL the request should target, when the credential
81
+ * dictates it (e.g. a subscription profile's per-model endpoint). Returns
82
+ * `undefined` when the source does not override the URL (the ingress keeps
83
+ * its own URL logic). Optional.
84
+ */
85
+ resolveUpstreamUrl?(model: string): string | undefined;
86
+ /**
87
+ * React to a final HTTP status (pool participation seam — design D5).
88
+ *
89
+ * For the provider-key source this reports the status to the
90
+ * `ApiKeyPoolService` (cooldown / disable / re-bind) and returns whether it
91
+ * rotated plus any new key. THIS PHASE ONLY: `onResult` is implemented and
92
+ * unit-tested in isolation; NO caller invokes it yet. Phase 3 wires it into
93
+ * `fetchWithRetry`. Optional.
94
+ *
95
+ * @param status The final HTTP status, or `null` for non-HTTP failures
96
+ * (e.g. network errors). Non-reportable statuses no-op.
97
+ */
98
+ onResult?(status: number | null): Promise<AuthResultOutcome>;
99
+ }
100
+
101
+ export type { AuthApplyHints, AuthResultOutcome, AuthSource };
@@ -0,0 +1,101 @@
1
+ /**
2
+ * AuthSource — unified outbound-authentication strategy for the provider
3
+ * request pipeline.
4
+ *
5
+ * Phase 2 of the `provider-request-pipeline` OpenSpec change (design D3).
6
+ *
7
+ * The three consumer paths (the wire-format proxy handler, the host engine
8
+ * adapter, TransformerHandler) each authenticate differently:
9
+ *
10
+ * - provider-key (+ ApiKeyPool failover) — LLM-config provider rows
11
+ * - subscription `AuthStrategy` (+ 401 refresh + fallback) — code-cli OAuth
12
+ * - OAuth pass-through — SDK forwards its own Bearer
13
+ *
14
+ * `AuthSource` is the single contract that unifies these. THIS PHASE ONLY
15
+ * DEFINES the interface and provides three behavior-preserving WRAPPERS
16
+ * (`LlmConfigProviderAuth`, `SubscriptionAuthSource`, `OAuthPassThroughAuth`)
17
+ * around the existing logic. NO caller is routed through it yet — the core
18
+ * (`executeProviderCall`) is NOT changed to consume `ctx.auth`, and
19
+ * the host handler's branch structure is UNCHANGED. Wiring (and
20
+ * the `onResult` pool-rotation integration) is Phase 3.
21
+ *
22
+ * @module pipeline/AuthSource
23
+ */
24
+ /**
25
+ * Hints an `AuthSource` may need to vary header formatting per request.
26
+ *
27
+ * Mirrors the subscription-side `AuthApplyHints` (which uses optional
28
+ * `upstreamUrl` / `resolvedModel`) but with REQUIRED fields, since the
29
+ * pipeline always knows both at the point it applies headers. Adapters that
30
+ * wrap the looser subscription shape map these across at the boundary.
31
+ */
32
+ interface AuthApplyHints {
33
+ /** Resolved upstream URL the request will be sent to. */
34
+ upstreamUrl: string;
35
+ /** Resolved model id for the request. */
36
+ model: string;
37
+ }
38
+ /**
39
+ * Result of {@link AuthSource.onResult}.
40
+ *
41
+ * `rebound` is `true` when the auth source rotated to a different credential
42
+ * (e.g. ApiKeyPool re-bound the session to a new key after a 429). `newKey`
43
+ * carries the freshly-resolved key string when a rotation produced one, so a
44
+ * caller MAY retry the same call once with it. Mirrors the
45
+ * `{ newKey | null }` contract of `ApiKeyPoolService.reportError` lifted into
46
+ * a structured shape.
47
+ */
48
+ interface AuthResultOutcome {
49
+ /** Whether the credential was rotated/re-bound as a result of this status. */
50
+ rebound: boolean;
51
+ /** The new resolved key when a rotation produced one; omitted otherwise. */
52
+ newKey?: string;
53
+ }
54
+ /**
55
+ * A pluggable outbound-authentication source for one provider request.
56
+ *
57
+ * Implementations OWN exactly the auth concern: which headers carry the
58
+ * credential, how to recover from a 401, where the request should be sent
59
+ * (when the credential dictates the endpoint), and how to react to a final
60
+ * HTTP status (pool rotation / refresh). The pipeline core composes the rest.
61
+ */
62
+ interface AuthSource {
63
+ /**
64
+ * Inject the authentication headers for this request, mutating `headers`
65
+ * in place. Implementations MAY refresh expiring tokens here.
66
+ *
67
+ * NOTE (Phase 2 boundary, see report): exactly WHAT this owns vs what the
68
+ * ingress assembles (content-type, OpenRouter app headers, proxy auth
69
+ * stripping) is intentionally left to the caller this phase. The wrappers
70
+ * preserve their source's CURRENT header behavior verbatim.
71
+ */
72
+ applyHeaders(headers: Record<string, string>, hints: AuthApplyHints): Promise<void> | void;
73
+ /**
74
+ * Called when the upstream returns 401. Return `true` to ask the caller to
75
+ * retry once with freshly-applied headers; `false` to surface the 401.
76
+ * Optional — sources without a refresh notion omit it.
77
+ */
78
+ onUnauthorized?(): Promise<boolean>;
79
+ /**
80
+ * Resolve the upstream URL the request should target, when the credential
81
+ * dictates it (e.g. a subscription profile's per-model endpoint). Returns
82
+ * `undefined` when the source does not override the URL (the ingress keeps
83
+ * its own URL logic). Optional.
84
+ */
85
+ resolveUpstreamUrl?(model: string): string | undefined;
86
+ /**
87
+ * React to a final HTTP status (pool participation seam — design D5).
88
+ *
89
+ * For the provider-key source this reports the status to the
90
+ * `ApiKeyPoolService` (cooldown / disable / re-bind) and returns whether it
91
+ * rotated plus any new key. THIS PHASE ONLY: `onResult` is implemented and
92
+ * unit-tested in isolation; NO caller invokes it yet. Phase 3 wires it into
93
+ * `fetchWithRetry`. Optional.
94
+ *
95
+ * @param status The final HTTP status, or `null` for non-HTTP failures
96
+ * (e.g. network errors). Non-reportable statuses no-op.
97
+ */
98
+ onResult?(status: number | null): Promise<AuthResultOutcome>;
99
+ }
100
+
101
+ export type { AuthApplyHints, AuthResultOutcome, AuthSource };
File without changes
@@ -0,0 +1,8 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
+
3
+ var _chunkLKZJEL6Ecjs = require('../chunk-LKZJEL6E.cjs');
4
+ require('../chunk-A2YMUCBT.cjs');
5
+ require('../chunk-6VIXXLMX.cjs');
6
+
7
+
8
+ exports.LlmConfigProviderAuth = _chunkLKZJEL6Ecjs.LlmConfigProviderAuth;
@@ -0,0 +1,87 @@
1
+ import { LLMProvider } from '@omnicross/contracts/llm-config';
2
+ import { ApiKeyPoolService } from '../completion/ApiKeyPoolService.cjs';
3
+ import { AuthSource, AuthApplyHints, AuthResultOutcome } from './AuthSource.cjs';
4
+ import '../logger-4GvQNzhE.cjs';
5
+
6
+ /**
7
+ * LlmConfigProviderAuth — `AuthSource` for LLM-config provider rows.
8
+ *
9
+ * Phase 2 of the `provider-request-pipeline` OpenSpec change (design D3, task 4.2).
10
+ *
11
+ * Wraps the two pieces that authenticate a normal (non-subscription) provider
12
+ * request today:
13
+ *
14
+ * - `getProviderHeaders(provider, apiKey)` — the format-specific auth
15
+ * headers (x-api-key / Authorization Bearer / x-goog-api-key / api-key)
16
+ * plus content-type and the OpenRouter app-attribution headers. `applyHeaders`
17
+ * merges these into the caller's header object VERBATIM (same output as a
18
+ * direct `getProviderHeaders` call).
19
+ * - `ApiKeyPoolService` — session-affine key selection + 429/529/401/403
20
+ * rotation. `onResult` reproduces the reportable-status branch of
21
+ * the host engine adapter's `callWithPoolReporting` (report → re-bind →
22
+ * return the new key) and the success branch (`reportSuccess`).
23
+ *
24
+ * IMPORTANT (Phase 2 scope): this class is DEFINED + unit-tested in isolation
25
+ * only. NO caller routes through it yet — `executeProviderCall` is unchanged
26
+ * and the rotation INTEGRATION is Phase 3 (D5). Do not wire `onResult` into a
27
+ * fetch loop in this phase.
28
+ *
29
+ * @module pipeline/LlmConfigProviderAuth
30
+ */
31
+
32
+ interface LlmConfigProviderAuthOptions {
33
+ /** Provider row whose auth format + key drives header assembly. */
34
+ provider: LLMProvider;
35
+ /** Resolved API key string to authenticate with (post env-ref resolution). */
36
+ apiKey: string;
37
+ /**
38
+ * Pool service for rotation, when this request is pool-backed. Omit (or pass
39
+ * `null`) for legacy single-key requests — `onResult` then never touches the
40
+ * pool (matching `fromPool === false`).
41
+ */
42
+ apiKeyPool?: ApiKeyPoolService | null;
43
+ /** Provider id the pool should report/select against (the ACTUAL provider
44
+ * whose key was resolved, post-routing). Required for pool participation. */
45
+ providerId?: string;
46
+ /** Session id for pool affinity + rebind. Required for pool participation. */
47
+ sessionId?: string | null;
48
+ }
49
+ declare class LlmConfigProviderAuth implements AuthSource {
50
+ private readonly provider;
51
+ private readonly apiKeyPool;
52
+ private readonly providerId;
53
+ private readonly sessionId;
54
+ /**
55
+ * The current resolved key. Mutable so a Phase-3 caller can read the
56
+ * rotated key after `onResult`; this phase it is only set at construction
57
+ * and updated inside `onResult` (mirroring the inline re-point in
58
+ * `callWithPoolReporting`).
59
+ */
60
+ apiKey: string;
61
+ constructor(opts: LlmConfigProviderAuthOptions);
62
+ /**
63
+ * Merge the provider auth headers (and content-type / OpenRouter app
64
+ * headers) into `headers`, exactly as a direct `getProviderHeaders` call
65
+ * would produce them. `hints` are accepted for contract symmetry but the
66
+ * provider-key path does not vary headers by URL/model.
67
+ */
68
+ applyHeaders(headers: Record<string, string>, _hints: AuthApplyHints): void;
69
+ /**
70
+ * React to the final HTTP status — the pool-rotation seam (design D5).
71
+ *
72
+ * Reproduces `callWithPoolReporting`'s reportable + success branches:
73
+ * - reportable status (429/529/401/403) on a pool-backed request →
74
+ * `reportError(providerId, sessionId, status)`; when it hands back a
75
+ * `newKey` the session was re-bound, so we adopt it (`this.apiKey`) and
76
+ * return `{ rebound: true, newKey }`. When no key is available it returns
77
+ * `{ rebound: false }` (the session is still cooled/disabled by the report).
78
+ * - success / any 2xx → `reportSuccess(sessionId)`; `{ rebound: false }`.
79
+ * - non-reportable, non-success, or non-pool request → no-op
80
+ * `{ rebound: false }`.
81
+ *
82
+ * NOTE: no caller invokes this in Phase 2; it is unit-tested in isolation.
83
+ */
84
+ onResult(status: number | null): Promise<AuthResultOutcome>;
85
+ }
86
+
87
+ export { LlmConfigProviderAuth, type LlmConfigProviderAuthOptions };
@@ -0,0 +1,87 @@
1
+ import { LLMProvider } from '@omnicross/contracts/llm-config';
2
+ import { ApiKeyPoolService } from '../completion/ApiKeyPoolService.js';
3
+ import { AuthSource, AuthApplyHints, AuthResultOutcome } from './AuthSource.js';
4
+ import '../logger-4GvQNzhE.js';
5
+
6
+ /**
7
+ * LlmConfigProviderAuth — `AuthSource` for LLM-config provider rows.
8
+ *
9
+ * Phase 2 of the `provider-request-pipeline` OpenSpec change (design D3, task 4.2).
10
+ *
11
+ * Wraps the two pieces that authenticate a normal (non-subscription) provider
12
+ * request today:
13
+ *
14
+ * - `getProviderHeaders(provider, apiKey)` — the format-specific auth
15
+ * headers (x-api-key / Authorization Bearer / x-goog-api-key / api-key)
16
+ * plus content-type and the OpenRouter app-attribution headers. `applyHeaders`
17
+ * merges these into the caller's header object VERBATIM (same output as a
18
+ * direct `getProviderHeaders` call).
19
+ * - `ApiKeyPoolService` — session-affine key selection + 429/529/401/403
20
+ * rotation. `onResult` reproduces the reportable-status branch of
21
+ * the host engine adapter's `callWithPoolReporting` (report → re-bind →
22
+ * return the new key) and the success branch (`reportSuccess`).
23
+ *
24
+ * IMPORTANT (Phase 2 scope): this class is DEFINED + unit-tested in isolation
25
+ * only. NO caller routes through it yet — `executeProviderCall` is unchanged
26
+ * and the rotation INTEGRATION is Phase 3 (D5). Do not wire `onResult` into a
27
+ * fetch loop in this phase.
28
+ *
29
+ * @module pipeline/LlmConfigProviderAuth
30
+ */
31
+
32
+ interface LlmConfigProviderAuthOptions {
33
+ /** Provider row whose auth format + key drives header assembly. */
34
+ provider: LLMProvider;
35
+ /** Resolved API key string to authenticate with (post env-ref resolution). */
36
+ apiKey: string;
37
+ /**
38
+ * Pool service for rotation, when this request is pool-backed. Omit (or pass
39
+ * `null`) for legacy single-key requests — `onResult` then never touches the
40
+ * pool (matching `fromPool === false`).
41
+ */
42
+ apiKeyPool?: ApiKeyPoolService | null;
43
+ /** Provider id the pool should report/select against (the ACTUAL provider
44
+ * whose key was resolved, post-routing). Required for pool participation. */
45
+ providerId?: string;
46
+ /** Session id for pool affinity + rebind. Required for pool participation. */
47
+ sessionId?: string | null;
48
+ }
49
+ declare class LlmConfigProviderAuth implements AuthSource {
50
+ private readonly provider;
51
+ private readonly apiKeyPool;
52
+ private readonly providerId;
53
+ private readonly sessionId;
54
+ /**
55
+ * The current resolved key. Mutable so a Phase-3 caller can read the
56
+ * rotated key after `onResult`; this phase it is only set at construction
57
+ * and updated inside `onResult` (mirroring the inline re-point in
58
+ * `callWithPoolReporting`).
59
+ */
60
+ apiKey: string;
61
+ constructor(opts: LlmConfigProviderAuthOptions);
62
+ /**
63
+ * Merge the provider auth headers (and content-type / OpenRouter app
64
+ * headers) into `headers`, exactly as a direct `getProviderHeaders` call
65
+ * would produce them. `hints` are accepted for contract symmetry but the
66
+ * provider-key path does not vary headers by URL/model.
67
+ */
68
+ applyHeaders(headers: Record<string, string>, _hints: AuthApplyHints): void;
69
+ /**
70
+ * React to the final HTTP status — the pool-rotation seam (design D5).
71
+ *
72
+ * Reproduces `callWithPoolReporting`'s reportable + success branches:
73
+ * - reportable status (429/529/401/403) on a pool-backed request →
74
+ * `reportError(providerId, sessionId, status)`; when it hands back a
75
+ * `newKey` the session was re-bound, so we adopt it (`this.apiKey`) and
76
+ * return `{ rebound: true, newKey }`. When no key is available it returns
77
+ * `{ rebound: false }` (the session is still cooled/disabled by the report).
78
+ * - success / any 2xx → `reportSuccess(sessionId)`; `{ rebound: false }`.
79
+ * - non-reportable, non-success, or non-pool request → no-op
80
+ * `{ rebound: false }`.
81
+ *
82
+ * NOTE: no caller invokes this in Phase 2; it is unit-tested in isolation.
83
+ */
84
+ onResult(status: number | null): Promise<AuthResultOutcome>;
85
+ }
86
+
87
+ export { LlmConfigProviderAuth, type LlmConfigProviderAuthOptions };
@@ -0,0 +1,8 @@
1
+ import {
2
+ LlmConfigProviderAuth
3
+ } from "../chunk-PXUJF5HS.js";
4
+ import "../chunk-H5JUT3KV.js";
5
+ import "../chunk-E3WHL7CO.js";
6
+ export {
7
+ LlmConfigProviderAuth
8
+ };
@@ -1,131 +1,9 @@
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);
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});
19
2
 
20
- // src/pipeline/SubscriptionAuthSource.ts
21
- var SubscriptionAuthSource_exports = {};
22
- __export(SubscriptionAuthSource_exports, {
23
- SubscriptionAuthSource: () => SubscriptionAuthSource,
24
- stripAuthHeaders: () => stripAuthHeaders
25
- });
26
- module.exports = __toCommonJS(SubscriptionAuthSource_exports);
27
3
 
28
- // src/serializeError.ts
29
- function serializeError(err) {
30
- if (err == null) return "Unknown error (null)";
31
- if (err instanceof Error) {
32
- let msg = err.message || err.name || "Error";
33
- if (err.cause) {
34
- msg += ` [cause: ${serializeError(err.cause)}]`;
35
- }
36
- const anyErr = err;
37
- if (anyErr.status != null) msg += ` (status: ${anyErr.status})`;
38
- else if (anyErr.code != null) msg += ` (code: ${anyErr.code})`;
39
- return msg;
40
- }
41
- if (typeof err === "string") return err || "Empty error string";
42
- if (typeof err !== "object") return String(err);
43
- const obj = err;
44
- if (typeof obj.message === "string" && obj.message) {
45
- let msg = obj.message;
46
- if (obj.status != null) msg += ` (status: ${obj.status})`;
47
- else if (obj.code != null) msg += ` (code: ${obj.code})`;
48
- if (typeof obj.type === "string") msg += ` [type: ${obj.type}]`;
49
- return msg;
50
- }
51
- if (typeof obj.error === "string" && obj.error) {
52
- return obj.error;
53
- }
54
- if (obj.error && typeof obj.error === "object") {
55
- const inner = obj.error;
56
- if (typeof inner.message === "string" && inner.message) {
57
- let msg = inner.message;
58
- if (typeof inner.type === "string") msg += ` [type: ${inner.type}]`;
59
- return msg;
60
- }
61
- }
62
- try {
63
- const json = JSON.stringify(err, getCircularReplacer(), 2);
64
- if (json && json.length > 1e3) {
65
- return json.slice(0, 1e3) + "... (truncated)";
66
- }
67
- return json || "Unserializable error";
68
- } catch {
69
- return `Unserializable error: ${Object.prototype.toString.call(err)}`;
70
- }
71
- }
72
- function getCircularReplacer() {
73
- const seen = /* @__PURE__ */ new WeakSet();
74
- return (_key, value) => {
75
- if (typeof value === "object" && value !== null) {
76
- if (seen.has(value)) return "[Circular]";
77
- seen.add(value);
78
- }
79
- return value;
80
- };
81
- }
4
+ var _chunkN3V2J5ZOcjs = require('../chunk-N3V2J5ZO.cjs');
5
+ require('../chunk-SVNDB62D.cjs');
82
6
 
83
- // src/pipeline/SubscriptionAuthSource.ts
84
- function stripAuthHeaders(headers) {
85
- delete headers.authorization;
86
- delete headers.Authorization;
87
- delete headers["x-api-key"];
88
- delete headers["X-Api-Key"];
89
- delete headers["x-goog-api-key"];
90
- delete headers["X-Goog-Api-Key"];
91
- }
92
- var SubscriptionAuthSource = class {
93
- constructor(profile) {
94
- this.profile = profile;
95
- }
96
- profile;
97
- /**
98
- * Strip any transformer-set auth headers, then delegate to the bound
99
- * strategy. Mirrors `SubscriptionDispatcher`'s
100
- * `stripAuthHeaders(...)` + `applyHeadersWithRetry(...)` sequence, including
101
- * the best-effort swallow-and-warn around a throwing `applyHeaders`.
102
- *
103
- * The strategy's looser `AuthApplyHints` (optional `upstreamUrl` /
104
- * `resolvedModel`) is fed from the pipeline's required `{ upstreamUrl,
105
- * model }` at the boundary.
106
- */
107
- async applyHeaders(headers, hints) {
108
- stripAuthHeaders(headers);
109
- try {
110
- await this.profile.authStrategy.applyHeaders(headers, {
111
- upstreamUrl: hints.upstreamUrl,
112
- resolvedModel: hints.model
113
- });
114
- } catch (err) {
115
- console.warn("[SubscriptionAuthSource] authStrategy.applyHeaders threw:", serializeError(err));
116
- }
117
- }
118
- /** Delegate the 401-refresh decision to the bound strategy. */
119
- async onUnauthorized() {
120
- return this.profile.authStrategy.onUnauthorized();
121
- }
122
- /** Resolve the upstream URL from the profile, when it provides one. */
123
- resolveUpstreamUrl(model) {
124
- return this.profile.resolveUpstreamUrl?.(model);
125
- }
126
- };
127
- // Annotate the CommonJS export names for ESM import in node:
128
- 0 && (module.exports = {
129
- SubscriptionAuthSource,
130
- stripAuthHeaders
131
- });
7
+
8
+
9
+ exports.SubscriptionAuthSource = _chunkN3V2J5ZOcjs.SubscriptionAuthSource; exports.stripAuthHeaders = _chunkN3V2J5ZOcjs.stripAuthHeaders;