@omnicross/core 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ApiConverter.cjs +24 -0
- package/dist/ApiConverter.d.cts +82 -0
- package/dist/ApiConverter.d.ts +82 -0
- package/dist/ApiConverter.js +24 -0
- package/dist/BuiltinToolExecutor-BluWyeob.d.ts +81 -0
- package/dist/BuiltinToolExecutor-CS2WpXhM.d.cts +81 -0
- package/dist/CompletionService-D3a47vdU.d.cts +213 -0
- package/dist/CompletionService-DdWaAxq0.d.ts +213 -0
- package/dist/{ProviderProxy-f_8ziIhW.d.cts → ProviderProxy-C-xqrkKi.d.ts} +7 -2
- package/dist/{ProviderProxy-vjt8sQQk.d.ts → ProviderProxy-CnMQYN59.d.cts} +7 -2
- package/dist/auth/GeminiCodeAssistProjectResolver.cjs +27 -60
- package/dist/auth/GeminiCodeAssistProjectResolver.js +5 -9
- package/dist/builtin-web-fetch-77JZUZGM.cjs +100 -0
- package/dist/builtin-web-fetch-IGLBX2XY.js +100 -0
- package/dist/chunk-2DCNB7DF.cjs +514 -0
- package/dist/chunk-2FEVTJWG.js +4400 -0
- package/dist/chunk-3MEACFK3.js +193 -0
- package/dist/chunk-3OPYJG76.cjs +266 -0
- package/dist/chunk-46RLHI7D.js +0 -0
- package/dist/chunk-46ZIFWYG.cjs +277 -0
- package/dist/chunk-4NBS6KPV.cjs +43 -0
- package/dist/chunk-4VAVYUZS.cjs +991 -0
- package/dist/chunk-5ERIZW3D.js +44 -0
- package/dist/chunk-5HTVET6E.js +514 -0
- package/dist/chunk-5ZQBEOMD.js +764 -0
- package/dist/chunk-6VIXXLMX.cjs +14 -0
- package/dist/chunk-745DV5FL.js +147 -0
- package/dist/chunk-74TMJA7Z.js +53 -0
- package/dist/chunk-7VU7V2E4.js +0 -0
- package/dist/chunk-7YN22L2H.cjs +87 -0
- package/dist/chunk-A2YMUCBT.cjs +105 -0
- package/dist/chunk-AQ5TNQB7.js +13 -0
- package/dist/chunk-AVYJ4YBN.js +58 -0
- package/dist/chunk-C72S6TTV.cjs +49 -0
- package/dist/chunk-C7PSERMH.js +87 -0
- package/dist/chunk-CDHS2QDC.js +179 -0
- package/dist/chunk-DK4A7DLE.js +266 -0
- package/dist/chunk-DRWHTIIZ.js +13 -0
- package/dist/chunk-DWKQZ2SK.cjs +254 -0
- package/dist/chunk-E3WHL7CO.js +14 -0
- package/dist/chunk-EYZYXJTJ.cjs +1 -0
- package/dist/chunk-FMOBD2OQ.js +39 -0
- package/dist/chunk-FTQ7IQUC.js +991 -0
- package/dist/chunk-FZ46M34D.cjs +1 -0
- package/dist/chunk-G2FUJNA2.cjs +193 -0
- package/dist/chunk-G2UTNSGU.js +277 -0
- package/dist/chunk-GBHYAGX3.cjs +26 -0
- package/dist/chunk-GMMT7RVN.cjs +39 -0
- package/dist/chunk-H5JUT3KV.js +105 -0
- package/dist/chunk-HQP3K7PU.cjs +431 -0
- package/dist/chunk-JO5NLTLY.js +46 -0
- package/dist/chunk-JWC6APFQ.js +23 -0
- package/dist/chunk-KUU2RNG6.cjs +46 -0
- package/dist/chunk-LKZJEL6E.cjs +124 -0
- package/dist/chunk-MNYKI4CI.js +94 -0
- package/dist/chunk-MZNPGW5Q.js +26 -0
- package/dist/chunk-N3V2J5ZO.cjs +53 -0
- package/dist/chunk-NYUNU75A.cjs +44 -0
- package/dist/chunk-NZYN7C3P.cjs +179 -0
- package/dist/chunk-O466Y272.js +235 -0
- package/dist/chunk-PXUJF5HS.js +124 -0
- package/dist/chunk-QBZJ7P2T.cjs +13 -0
- package/dist/chunk-QOCNX236.js +46 -0
- package/dist/chunk-QXD4MV2X.cjs +23 -0
- package/dist/chunk-R3HK6R4B.cjs +13 -0
- package/dist/chunk-RSJ3TWJQ.cjs +186 -0
- package/dist/chunk-S4WBV25P.js +913 -0
- package/dist/chunk-SN3YWBX7.cjs +4400 -0
- package/dist/chunk-SPVWWUHX.cjs +46 -0
- package/dist/chunk-SUEGJ75D.cjs +764 -0
- package/dist/chunk-SVNDB62D.cjs +58 -0
- package/dist/chunk-UYPEN5XE.cjs +235 -0
- package/dist/chunk-V5KPWNYX.cjs +147 -0
- package/dist/chunk-VVEHS2LI.js +431 -0
- package/dist/chunk-XBSYYZIY.cjs +94 -0
- package/dist/chunk-YGXJGRFI.cjs +913 -0
- package/dist/chunk-YMFAJFQT.cjs +173 -0
- package/dist/chunk-Z7LUNECE.js +49 -0
- package/dist/chunk-Z7Y2NPHY.js +186 -0
- package/dist/chunk-ZJZAOKI7.js +254 -0
- package/dist/chunk-ZLX3KGXX.js +173 -0
- package/dist/chunk-ZSVQT3PW.js +43 -0
- package/dist/completion/ApiKeyPoolService.cjs +23 -48
- package/dist/completion/ApiKeyPoolService.d.cts +150 -2
- package/dist/completion/ApiKeyPoolService.d.ts +150 -2
- package/dist/completion/BuiltinToolExecutor.cjs +12 -0
- package/dist/completion/BuiltinToolExecutor.d.cts +4 -0
- package/dist/completion/BuiltinToolExecutor.d.ts +4 -0
- package/dist/completion/BuiltinToolExecutor.js +12 -0
- package/dist/completion/CompletionService.cjs +38 -0
- package/dist/completion/CompletionService.d.cts +22 -0
- package/dist/completion/CompletionService.d.ts +22 -0
- package/dist/completion/CompletionService.js +38 -0
- package/dist/completion/NativeSearchInjector.cjs +12 -0
- package/dist/completion/NativeSearchInjector.d.cts +42 -0
- package/dist/completion/NativeSearchInjector.d.ts +42 -0
- package/dist/completion/NativeSearchInjector.js +12 -0
- package/dist/completion/ProviderSearchInjector.cjs +60 -0
- package/dist/completion/ProviderSearchInjector.d.cts +47 -0
- package/dist/completion/ProviderSearchInjector.d.ts +47 -0
- package/dist/completion/ProviderSearchInjector.js +60 -0
- package/dist/completion/native-search-types.cjs +14 -0
- package/dist/completion/native-search-types.d.cts +3 -0
- package/dist/completion/native-search-types.d.ts +3 -0
- package/dist/completion/native-search-types.js +14 -0
- package/dist/completion/openrouter-headers.cjs +16 -0
- package/dist/completion/openrouter-headers.d.cts +44 -0
- package/dist/completion/openrouter-headers.d.ts +44 -0
- package/dist/completion/openrouter-headers.js +16 -0
- package/dist/completion/openrouter-models.cjs +29 -0
- package/dist/completion/openrouter-models.d.cts +27 -0
- package/dist/completion/openrouter-models.d.ts +27 -0
- package/dist/completion/openrouter-models.js +29 -0
- package/dist/completion/types.cjs +1 -0
- package/dist/completion/types.d.cts +3 -0
- package/dist/completion/types.d.ts +3 -0
- package/dist/completion/types.js +0 -0
- package/dist/completion/url-builder.cjs +24 -0
- package/dist/completion/url-builder.d.cts +87 -0
- package/dist/completion/url-builder.d.ts +87 -0
- package/dist/completion/url-builder.js +24 -0
- package/dist/completion.cjs +55 -3989
- package/dist/completion.d.cts +150 -8
- package/dist/completion.d.ts +150 -8
- package/dist/completion.js +63 -3953
- package/dist/index.cjs +197 -10428
- package/dist/index.d.cts +35 -91
- package/dist/index.d.ts +35 -91
- package/dist/index.js +125 -10267
- package/dist/logger-4GvQNzhE.d.cts +22 -0
- package/dist/logger-4GvQNzhE.d.ts +22 -0
- package/dist/outbound-api/routeResolver.cjs +11 -0
- package/dist/outbound-api/routeResolver.d.cts +19 -0
- package/dist/outbound-api/routeResolver.d.ts +19 -0
- package/dist/outbound-api/routeResolver.js +11 -0
- package/dist/outbound-api/subscriptionRegistryPort.cjs +7 -37
- package/dist/outbound-api/subscriptionRegistryPort.d.cts +7 -3
- package/dist/outbound-api/subscriptionRegistryPort.d.ts +7 -3
- package/dist/outbound-api/subscriptionRegistryPort.js +4 -8
- package/dist/outbound-api/types.cjs +1 -0
- package/dist/{types-CbCN2NQP.d.ts → outbound-api/types.d.cts} +18 -3
- package/dist/{types-CGGrKqC_.d.cts → outbound-api/types.d.ts} +18 -3
- package/dist/outbound-api/types.js +0 -0
- package/dist/outbound-api.cjs +35 -5220
- package/dist/outbound-api.d.cts +16 -88
- package/dist/outbound-api.d.ts +16 -88
- package/dist/outbound-api.js +54 -5193
- package/dist/pipeline/AuthSource.cjs +1 -0
- package/dist/pipeline/AuthSource.d.cts +101 -0
- package/dist/pipeline/AuthSource.d.ts +101 -0
- package/dist/pipeline/AuthSource.js +0 -0
- package/dist/pipeline/LlmConfigProviderAuth.cjs +8 -0
- package/dist/pipeline/LlmConfigProviderAuth.d.cts +87 -0
- package/dist/pipeline/LlmConfigProviderAuth.d.ts +87 -0
- package/dist/pipeline/LlmConfigProviderAuth.js +8 -0
- package/dist/pipeline/SubscriptionAuthSource.cjs +6 -128
- package/dist/pipeline/SubscriptionAuthSource.d.cts +165 -3
- package/dist/pipeline/SubscriptionAuthSource.d.ts +165 -3
- package/dist/pipeline/SubscriptionAuthSource.js +5 -99
- package/dist/pipeline/SubscriptionAuthStrategy.cjs +1 -18
- package/dist/pipeline/executeProviderCall.cjs +6 -0
- package/dist/pipeline/executeProviderCall.d.cts +149 -0
- package/dist/pipeline/executeProviderCall.d.ts +149 -0
- package/dist/pipeline/executeProviderCall.js +6 -0
- package/dist/pipeline/resolveProviderChain.cjs +6 -0
- package/dist/pipeline/resolveProviderChain.d.cts +58 -0
- package/dist/pipeline/resolveProviderChain.d.ts +58 -0
- package/dist/pipeline/resolveProviderChain.js +6 -0
- package/dist/pipeline/resolveSubscriptionChain.cjs +6 -0
- package/dist/pipeline/resolveSubscriptionChain.d.cts +68 -0
- package/dist/pipeline/resolveSubscriptionChain.d.ts +68 -0
- package/dist/pipeline/resolveSubscriptionChain.js +6 -0
- package/dist/ports/gemini-code-assist-resolver.cjs +7 -37
- package/dist/ports/gemini-code-assist-resolver.js +4 -8
- package/dist/ports/pricing-store.cjs +1 -0
- package/dist/ports/pricing-store.d.cts +50 -0
- package/dist/ports/pricing-store.d.ts +50 -0
- package/dist/ports/pricing-store.js +0 -0
- package/dist/ports/provider-config-source.cjs +1 -0
- package/dist/ports/provider-config-source.d.cts +51 -0
- package/dist/ports/provider-config-source.d.ts +51 -0
- package/dist/ports/provider-config-source.js +0 -0
- package/dist/ports/usage-event-store.cjs +1 -0
- package/dist/ports/usage-event-store.d.cts +29 -0
- package/dist/ports/usage-event-store.d.ts +29 -0
- package/dist/ports/usage-event-store.js +0 -0
- package/dist/ports/web-search-backend.cjs +1 -0
- package/dist/ports/web-search-backend.d.cts +29 -0
- package/dist/ports/web-search-backend.d.ts +29 -0
- package/dist/ports/web-search-backend.js +0 -0
- package/dist/ports.cjs +1 -18
- package/dist/ports.d.cts +16 -8
- package/dist/ports.d.ts +16 -8
- package/dist/provider-proxy/ProviderProxy.cjs +40 -0
- package/dist/provider-proxy/ProviderProxy.d.cts +17 -0
- package/dist/provider-proxy/ProviderProxy.d.ts +17 -0
- package/dist/provider-proxy/ProviderProxy.js +40 -0
- package/dist/provider-proxy/ingress/providerProxyShared.cjs +35 -2941
- package/dist/provider-proxy/ingress/providerProxyShared.d.cts +7 -3
- package/dist/provider-proxy/ingress/providerProxyShared.d.ts +7 -3
- package/dist/provider-proxy/ingress/providerProxyShared.js +41 -2914
- package/dist/provider-proxy/matchText.cjs +11 -72
- package/dist/provider-proxy/matchText.js +6 -39
- package/dist/provider-proxy/types.cjs +1 -18
- package/dist/provider-proxy/types.d.cts +407 -8
- package/dist/provider-proxy/types.d.ts +407 -8
- package/dist/provider-proxy.cjs +35 -4654
- package/dist/provider-proxy.d.cts +10 -6
- package/dist/provider-proxy.d.ts +10 -6
- package/dist/provider-proxy.js +39 -4627
- package/dist/routeResolver-BrbK6ja9.d.cts +88 -0
- package/dist/routeResolver-HE-ZO0fO.d.ts +88 -0
- package/dist/serializeError.cjs +5 -81
- package/dist/serializeError.js +3 -54
- package/dist/sse-parser.cjs +7 -455
- package/dist/sse-parser.js +4 -426
- package/dist/transformer/TransformerChainExecutor.cjs +4 -318
- package/dist/transformer/TransformerChainExecutor.js +4 -291
- package/dist/transformer/TransformerService.cjs +5 -289
- package/dist/transformer/TransformerService.js +3 -262
- package/dist/transformer/anthropicBetaInject.cjs +8 -0
- package/dist/transformer/anthropicBetaInject.d.cts +20 -0
- package/dist/transformer/anthropicBetaInject.d.ts +20 -0
- package/dist/transformer/anthropicBetaInject.js +8 -0
- package/dist/transformer/transformers/AnthropicTransformer.cjs +6 -0
- package/dist/transformer/transformers/AnthropicTransformer.d.cts +148 -0
- package/dist/transformer/transformers/AnthropicTransformer.d.ts +148 -0
- package/dist/transformer/transformers/AnthropicTransformer.js +6 -0
- package/dist/transformer/transformers/GeminiCodeAssistTransformer.cjs +4 -1106
- package/dist/transformer/transformers/GeminiCodeAssistTransformer.js +7 -1079
- package/dist/transformer/transformers/GeminiTransformer.cjs +4 -1010
- package/dist/transformer/transformers/GeminiTransformer.js +4 -983
- package/dist/transformer/transformers/OpenAIResponseTransformer.cjs +3 -535
- package/dist/transformer/transformers/OpenAIResponseTransformer.js +3 -510
- package/dist/transformer/transformers/OpenCodeGoTransformer.cjs +5 -72
- package/dist/transformer/transformers/OpenCodeGoTransformer.js +3 -45
- package/dist/transformer/transformers/ReasoningTransformer.cjs +6 -0
- package/dist/transformer/transformers/ReasoningTransformer.d.cts +47 -0
- package/dist/transformer/transformers/ReasoningTransformer.d.ts +47 -0
- package/dist/transformer/transformers/ReasoningTransformer.js +6 -0
- package/dist/transformer/transformers.cjs +39 -0
- package/dist/transformer/transformers.d.cts +100 -0
- package/dist/transformer/transformers.d.ts +100 -0
- package/dist/transformer/transformers.js +39 -0
- package/dist/transformer/types.cjs +1 -18
- package/dist/transformer.cjs +13 -3726
- package/dist/transformer.d.cts +8 -31
- package/dist/transformer.d.ts +8 -31
- package/dist/transformer.js +17 -3706
- package/dist/types-BScIHmPr.d.cts +153 -0
- package/dist/types-BScIHmPr.d.ts +153 -0
- package/dist/usage/pricing-engine.cjs +6 -0
- package/dist/usage/pricing-engine.d.cts +83 -0
- package/dist/usage/pricing-engine.d.ts +83 -0
- package/dist/usage/pricing-engine.js +6 -0
- package/dist/usage/usage-recorder.cjs +6 -0
- package/dist/usage/usage-recorder.d.cts +73 -0
- package/dist/usage/usage-recorder.d.ts +73 -0
- package/dist/usage/usage-recorder.js +6 -0
- package/dist/usage.cjs +11 -0
- package/dist/usage.d.cts +8 -0
- package/dist/usage.d.ts +8 -0
- package/dist/usage.js +11 -0
- package/package.json +3 -3
- package/dist/ApiKeyPoolService-BmMkau07.d.cts +0 -170
- package/dist/ApiKeyPoolService-BmMkau07.d.ts +0 -170
- package/dist/SubscriptionAuthSource-Cr4fVEYY.d.cts +0 -264
- package/dist/SubscriptionAuthSource-D89zmiSS.d.ts +0 -264
- package/dist/index-BTSmc9Sm.d.ts +0 -645
- package/dist/index-DXazdTzZ.d.cts +0 -645
- package/dist/types-DCzHkhJt.d.ts +0 -467
- package/dist/types-DZIQbgp0.d.cts +0 -467
|
@@ -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,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,68 @@
|
|
|
1
|
+
import { TransformerService } from '../transformer/TransformerService.cjs';
|
|
2
|
+
import { Transformer, ResolvedTransformerChain } from '../transformer/types.cjs';
|
|
3
|
+
import { SubscriptionAuthProfile } from './SubscriptionAuthSource.cjs';
|
|
4
|
+
import '@omnicross/contracts/subscription-types';
|
|
5
|
+
import './AuthSource.cjs';
|
|
6
|
+
import './SubscriptionAuthStrategy.cjs';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* resolveSubscriptionChain — shared subscription provider-chain resolver.
|
|
10
|
+
*
|
|
11
|
+
* Cross-vendor subscription "route-to" generalization (task #29). The Codex /
|
|
12
|
+
* OpenAI-Responses ingress subscription plan used to HARD-CODE its provider
|
|
13
|
+
* transformer chain to a single `OpenAIResponseTransformer`, ignoring the
|
|
14
|
+
* subscription profile's own `providerTransformerNames`. That only produced
|
|
15
|
+
* Responses-API bytes upstream — correct for the codex/ChatGPT subscription
|
|
16
|
+
* (whose profile chain IS `['openai-response']`), but WRONG for any
|
|
17
|
+
* subscription whose upstream speaks a non-Responses wire.
|
|
18
|
+
*
|
|
19
|
+
* This helper mirrors `SubscriptionDispatcher.resolveTransformers`: it resolves
|
|
20
|
+
* the profile's transformer NAMES into instances via the shared
|
|
21
|
+
* `TransformerService` (the SAME registry the Anthropic-ingress dispatcher uses),
|
|
22
|
+
* so the Responses ingress re-encodes Unified → the target wire exactly like the
|
|
23
|
+
* BYO plan's `resolveProviderChain`. The endpoint transformer stays
|
|
24
|
+
* `OpenAIResponseTransformer` (the ingress wire is Responses) — so the full
|
|
25
|
+
* exchange is:
|
|
26
|
+
*
|
|
27
|
+
* Responses → (OpenAIResponseTransformer decode) → Unified
|
|
28
|
+
* → (profile providerTransformers encode) → target wire → upstream
|
|
29
|
+
* target wire → (profile providerTransformers decode) → Unified
|
|
30
|
+
* → (OpenAIResponseTransformer encode) → Responses → Codex CLI
|
|
31
|
+
*
|
|
32
|
+
* BYTE-IDENTICAL codex preservation: the codex profile's
|
|
33
|
+
* `providerTransformerNames` is `['openai-response']`, which resolves to the
|
|
34
|
+
* SAME `OpenAIResponseTransformer` instance the ingress already used — so the
|
|
35
|
+
* codex case is unchanged. The fallback (empty/missing names) ALSO yields the
|
|
36
|
+
* shared `OpenAIResponseTransformer`, so a profile that omits names behaves as
|
|
37
|
+
* before.
|
|
38
|
+
*
|
|
39
|
+
* @module pipeline/resolveSubscriptionChain
|
|
40
|
+
*/
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Resolve a subscription profile's provider/model transformer chain.
|
|
44
|
+
*
|
|
45
|
+
* @param profile the subscription profile (carries the names).
|
|
46
|
+
* @param transformerService the shared registry (from `llmConfig.getTransformerService()`).
|
|
47
|
+
* @param fallbackEndpoint the shared `OpenAIResponseTransformer` instance,
|
|
48
|
+
* used when the profile declares NO provider names
|
|
49
|
+
* (preserves the prior hard-coded behavior).
|
|
50
|
+
* @param overrideNames OPTIONAL explicit provider transformer names that
|
|
51
|
+
* SUPERSEDE the profile's static
|
|
52
|
+
* `providerTransformerNames` — the opencodego zen
|
|
53
|
+
* seam (Phase 3) feeds the shape-resolved chain here
|
|
54
|
+
* (e.g. `['openai-response']` / `['gemini']`). When
|
|
55
|
+
* `undefined` the static field is read exactly as
|
|
56
|
+
* before (codex byte-identity). An explicit EMPTY
|
|
57
|
+
* array means "no provider chain" (the zen anthropic
|
|
58
|
+
* shape — though that path is same-format and never
|
|
59
|
+
* calls this) and falls back to `[fallbackEndpoint]`
|
|
60
|
+
* like the absent-names case.
|
|
61
|
+
*
|
|
62
|
+
* @returns the resolved chain. `providerTransformers` is the resolved provider
|
|
63
|
+
* names (or `[fallbackEndpoint]` when none declared); `modelTransformers` is the
|
|
64
|
+
* profile's resolved model names (usually empty).
|
|
65
|
+
*/
|
|
66
|
+
declare function resolveSubscriptionChain(profile: SubscriptionAuthProfile, transformerService: TransformerService | undefined, fallbackEndpoint: Transformer, overrideNames?: readonly string[]): ResolvedTransformerChain;
|
|
67
|
+
|
|
68
|
+
export { resolveSubscriptionChain };
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { TransformerService } from '../transformer/TransformerService.js';
|
|
2
|
+
import { Transformer, ResolvedTransformerChain } from '../transformer/types.js';
|
|
3
|
+
import { SubscriptionAuthProfile } from './SubscriptionAuthSource.js';
|
|
4
|
+
import '@omnicross/contracts/subscription-types';
|
|
5
|
+
import './AuthSource.js';
|
|
6
|
+
import './SubscriptionAuthStrategy.js';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* resolveSubscriptionChain — shared subscription provider-chain resolver.
|
|
10
|
+
*
|
|
11
|
+
* Cross-vendor subscription "route-to" generalization (task #29). The Codex /
|
|
12
|
+
* OpenAI-Responses ingress subscription plan used to HARD-CODE its provider
|
|
13
|
+
* transformer chain to a single `OpenAIResponseTransformer`, ignoring the
|
|
14
|
+
* subscription profile's own `providerTransformerNames`. That only produced
|
|
15
|
+
* Responses-API bytes upstream — correct for the codex/ChatGPT subscription
|
|
16
|
+
* (whose profile chain IS `['openai-response']`), but WRONG for any
|
|
17
|
+
* subscription whose upstream speaks a non-Responses wire.
|
|
18
|
+
*
|
|
19
|
+
* This helper mirrors `SubscriptionDispatcher.resolveTransformers`: it resolves
|
|
20
|
+
* the profile's transformer NAMES into instances via the shared
|
|
21
|
+
* `TransformerService` (the SAME registry the Anthropic-ingress dispatcher uses),
|
|
22
|
+
* so the Responses ingress re-encodes Unified → the target wire exactly like the
|
|
23
|
+
* BYO plan's `resolveProviderChain`. The endpoint transformer stays
|
|
24
|
+
* `OpenAIResponseTransformer` (the ingress wire is Responses) — so the full
|
|
25
|
+
* exchange is:
|
|
26
|
+
*
|
|
27
|
+
* Responses → (OpenAIResponseTransformer decode) → Unified
|
|
28
|
+
* → (profile providerTransformers encode) → target wire → upstream
|
|
29
|
+
* target wire → (profile providerTransformers decode) → Unified
|
|
30
|
+
* → (OpenAIResponseTransformer encode) → Responses → Codex CLI
|
|
31
|
+
*
|
|
32
|
+
* BYTE-IDENTICAL codex preservation: the codex profile's
|
|
33
|
+
* `providerTransformerNames` is `['openai-response']`, which resolves to the
|
|
34
|
+
* SAME `OpenAIResponseTransformer` instance the ingress already used — so the
|
|
35
|
+
* codex case is unchanged. The fallback (empty/missing names) ALSO yields the
|
|
36
|
+
* shared `OpenAIResponseTransformer`, so a profile that omits names behaves as
|
|
37
|
+
* before.
|
|
38
|
+
*
|
|
39
|
+
* @module pipeline/resolveSubscriptionChain
|
|
40
|
+
*/
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Resolve a subscription profile's provider/model transformer chain.
|
|
44
|
+
*
|
|
45
|
+
* @param profile the subscription profile (carries the names).
|
|
46
|
+
* @param transformerService the shared registry (from `llmConfig.getTransformerService()`).
|
|
47
|
+
* @param fallbackEndpoint the shared `OpenAIResponseTransformer` instance,
|
|
48
|
+
* used when the profile declares NO provider names
|
|
49
|
+
* (preserves the prior hard-coded behavior).
|
|
50
|
+
* @param overrideNames OPTIONAL explicit provider transformer names that
|
|
51
|
+
* SUPERSEDE the profile's static
|
|
52
|
+
* `providerTransformerNames` — the opencodego zen
|
|
53
|
+
* seam (Phase 3) feeds the shape-resolved chain here
|
|
54
|
+
* (e.g. `['openai-response']` / `['gemini']`). When
|
|
55
|
+
* `undefined` the static field is read exactly as
|
|
56
|
+
* before (codex byte-identity). An explicit EMPTY
|
|
57
|
+
* array means "no provider chain" (the zen anthropic
|
|
58
|
+
* shape — though that path is same-format and never
|
|
59
|
+
* calls this) and falls back to `[fallbackEndpoint]`
|
|
60
|
+
* like the absent-names case.
|
|
61
|
+
*
|
|
62
|
+
* @returns the resolved chain. `providerTransformers` is the resolved provider
|
|
63
|
+
* names (or `[fallbackEndpoint]` when none declared); `modelTransformers` is the
|
|
64
|
+
* profile's resolved model names (usually empty).
|
|
65
|
+
*/
|
|
66
|
+
declare function resolveSubscriptionChain(profile: SubscriptionAuthProfile, transformerService: TransformerService | undefined, fallbackEndpoint: Transformer, overrideNames?: readonly string[]): ResolvedTransformerChain;
|
|
67
|
+
|
|
68
|
+
export { resolveSubscriptionChain };
|
|
@@ -1,38 +1,8 @@
|
|
|
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
|
-
|
|
21
|
-
var
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
module.exports = __toCommonJS(gemini_code_assist_resolver_exports);
|
|
27
|
-
var resolver = null;
|
|
28
|
-
function setGeminiCodeAssistResolver(impl) {
|
|
29
|
-
resolver = impl;
|
|
30
|
-
}
|
|
31
|
-
function getGeminiCodeAssistResolver() {
|
|
32
|
-
return resolver;
|
|
33
|
-
}
|
|
34
|
-
// Annotate the CommonJS export names for ESM import in node:
|
|
35
|
-
0 && (module.exports = {
|
|
36
|
-
getGeminiCodeAssistResolver,
|
|
37
|
-
setGeminiCodeAssistResolver
|
|
38
|
-
});
|
|
3
|
+
|
|
4
|
+
var _chunkR3HK6R4Bcjs = require('../chunk-R3HK6R4B.cjs');
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
exports.getGeminiCodeAssistResolver = _chunkR3HK6R4Bcjs.getGeminiCodeAssistResolver; exports.setGeminiCodeAssistResolver = _chunkR3HK6R4Bcjs.setGeminiCodeAssistResolver;
|
|
@@ -1,11 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
}
|
|
6
|
-
function getGeminiCodeAssistResolver() {
|
|
7
|
-
return resolver;
|
|
8
|
-
}
|
|
1
|
+
import {
|
|
2
|
+
getGeminiCodeAssistResolver,
|
|
3
|
+
setGeminiCodeAssistResolver
|
|
4
|
+
} from "../chunk-DRWHTIIZ.js";
|
|
9
5
|
export {
|
|
10
6
|
getGeminiCodeAssistResolver,
|
|
11
7
|
setGeminiCodeAssistResolver
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { PricingEntry, PricingEntryInput, PricingResolution } from '@omnicross/contracts/pricing-types';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* `PricingStore` — core-owned port for pricing-row persistence.
|
|
5
|
+
*
|
|
6
|
+
* The pricing engine performs ALL persistence through this interface; the host
|
|
7
|
+
* embedder supplies the implementation at bootstrap (e.g. a SQLite table or a
|
|
8
|
+
* JSON file store). Lookups never go through the store — the engine keeps an
|
|
9
|
+
* in-memory cache loaded from `getAll()`.
|
|
10
|
+
*
|
|
11
|
+
* @module ports/pricing-store
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
interface PricingStore {
|
|
15
|
+
/** Return every pricing row. The engine caches the full table in memory. */
|
|
16
|
+
getAll(): Promise<PricingEntry[]>;
|
|
17
|
+
/**
|
|
18
|
+
* Insert or update one row. When `asUserEdit` is true the store MUST mark
|
|
19
|
+
* the row user-edited (source 'user', `userEdited: true`, `editedAt` now),
|
|
20
|
+
* protecting it from auto-overwrite during subsequent source refreshes.
|
|
21
|
+
*/
|
|
22
|
+
upsert(input: PricingEntryInput, asUserEdit: boolean): Promise<PricingEntry>;
|
|
23
|
+
/**
|
|
24
|
+
* Apply a batch of entries fetched from a pricing source.
|
|
25
|
+
*
|
|
26
|
+
* userEdited-conflict semantics: rows that do not exist locally, or exist
|
|
27
|
+
* but are NOT user-edited, are upserted (source 'litellm', not user-edited)
|
|
28
|
+
* and returned in `applied`. Rows whose local copy IS user-edited MUST be
|
|
29
|
+
* left untouched and returned in `conflicts` as `{ current, incoming }`
|
|
30
|
+
* pairs for per-row resolution by the user.
|
|
31
|
+
*/
|
|
32
|
+
bulkApplyFromSource(entries: PricingEntryInput[]): Promise<{
|
|
33
|
+
applied: PricingEntry[];
|
|
34
|
+
conflicts: Array<{
|
|
35
|
+
current: PricingEntry;
|
|
36
|
+
incoming: PricingEntryInput;
|
|
37
|
+
}>;
|
|
38
|
+
}>;
|
|
39
|
+
/**
|
|
40
|
+
* Apply per-row conflict decisions: 'overwrite' replaces the local row with
|
|
41
|
+
* the incoming values (clearing the user-edited mark), 'skip' leaves it
|
|
42
|
+
* unchanged. Returns overwritten/skipped counts.
|
|
43
|
+
*/
|
|
44
|
+
applyResolutions(resolutions: Array<{
|
|
45
|
+
incoming: PricingEntryInput;
|
|
46
|
+
action: 'overwrite' | 'skip';
|
|
47
|
+
}>): Promise<PricingResolution>;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export type { PricingStore };
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { PricingEntry, PricingEntryInput, PricingResolution } from '@omnicross/contracts/pricing-types';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* `PricingStore` — core-owned port for pricing-row persistence.
|
|
5
|
+
*
|
|
6
|
+
* The pricing engine performs ALL persistence through this interface; the host
|
|
7
|
+
* embedder supplies the implementation at bootstrap (e.g. a SQLite table or a
|
|
8
|
+
* JSON file store). Lookups never go through the store — the engine keeps an
|
|
9
|
+
* in-memory cache loaded from `getAll()`.
|
|
10
|
+
*
|
|
11
|
+
* @module ports/pricing-store
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
interface PricingStore {
|
|
15
|
+
/** Return every pricing row. The engine caches the full table in memory. */
|
|
16
|
+
getAll(): Promise<PricingEntry[]>;
|
|
17
|
+
/**
|
|
18
|
+
* Insert or update one row. When `asUserEdit` is true the store MUST mark
|
|
19
|
+
* the row user-edited (source 'user', `userEdited: true`, `editedAt` now),
|
|
20
|
+
* protecting it from auto-overwrite during subsequent source refreshes.
|
|
21
|
+
*/
|
|
22
|
+
upsert(input: PricingEntryInput, asUserEdit: boolean): Promise<PricingEntry>;
|
|
23
|
+
/**
|
|
24
|
+
* Apply a batch of entries fetched from a pricing source.
|
|
25
|
+
*
|
|
26
|
+
* userEdited-conflict semantics: rows that do not exist locally, or exist
|
|
27
|
+
* but are NOT user-edited, are upserted (source 'litellm', not user-edited)
|
|
28
|
+
* and returned in `applied`. Rows whose local copy IS user-edited MUST be
|
|
29
|
+
* left untouched and returned in `conflicts` as `{ current, incoming }`
|
|
30
|
+
* pairs for per-row resolution by the user.
|
|
31
|
+
*/
|
|
32
|
+
bulkApplyFromSource(entries: PricingEntryInput[]): Promise<{
|
|
33
|
+
applied: PricingEntry[];
|
|
34
|
+
conflicts: Array<{
|
|
35
|
+
current: PricingEntry;
|
|
36
|
+
incoming: PricingEntryInput;
|
|
37
|
+
}>;
|
|
38
|
+
}>;
|
|
39
|
+
/**
|
|
40
|
+
* Apply per-row conflict decisions: 'overwrite' replaces the local row with
|
|
41
|
+
* the incoming values (clearing the user-edited mark), 'skip' leaves it
|
|
42
|
+
* unchanged. Returns overwritten/skipped counts.
|
|
43
|
+
*/
|
|
44
|
+
applyResolutions(resolutions: Array<{
|
|
45
|
+
incoming: PricingEntryInput;
|
|
46
|
+
action: 'overwrite' | 'skip';
|
|
47
|
+
}>): Promise<PricingResolution>;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export type { PricingStore };
|
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";
|