@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,153 @@
1
+ import { MessageBlock } from '@omnicross/contracts/message-blocks';
2
+ import { SimpleChatMessage, ThinkLevel, SimpleChatAudio, SimpleChatVideo } from '@omnicross/contracts/completion-types';
3
+
4
+ /**
5
+ * Native Search Types
6
+ *
7
+ * Type definitions for provider-native web search capabilities.
8
+ * Used by NativeSearchInjector to detect and configure built-in
9
+ * search for OpenAI, Anthropic, Google, xAI, and OpenRouter.
10
+ *
11
+ * @module completion/native-search-types
12
+ */
13
+
14
+ /** Providers that support native/built-in web search */
15
+ type NativeSearchProvider = 'openai' | 'anthropic' | 'google' | 'xai' | 'openrouter';
16
+ /** Result of detecting native search support for a model */
17
+ interface NativeSearchDetectionResult {
18
+ /** Whether the model supports native search */
19
+ supported: boolean;
20
+ /** Which native provider to use, if supported */
21
+ nativeProvider: NativeSearchProvider | null;
22
+ }
23
+ /**
24
+ * Model ID patterns for detecting native search support.
25
+ * OpenRouter is detected via provider metadata, not model ID.
26
+ */
27
+ declare const NATIVE_SEARCH_MODEL_PATTERNS: Record<NativeSearchProvider, RegExp[]>;
28
+ /**
29
+ * OpenAI models that use Chat Completion endpoint (not Response API).
30
+ * These models use `web_search_options` instead of a `web_search` tool.
31
+ */
32
+ declare const OPENAI_CHAT_COMPLETION_SEARCH_MODELS: string[];
33
+ /**
34
+ * Models that match a native search pattern but do NOT support web search.
35
+ * These are excluded from auto-detection (but can still be user-overridden).
36
+ *
37
+ * - `gpt-4.1-nano`: Matches `/^gpt-4/` but OpenAI explicitly excludes it
38
+ * from web search support in the Responses API.
39
+ */
40
+ declare const NATIVE_SEARCH_EXCLUDED_MODELS: string[];
41
+ /** Native search tool names that should NOT be executed locally */
42
+ declare const NATIVE_SEARCH_TOOL_NAMES: string[];
43
+ /** User-facing configuration for native search */
44
+ interface NativeSearchUserConfig {
45
+ /** Whether native search is enabled */
46
+ enabled: boolean;
47
+ /** Max search results / uses (maps to provider-specific settings) */
48
+ maxResults?: number;
49
+ /** Domains to block (Anthropic) */
50
+ blockedDomains?: string[];
51
+ /** xAI search mode override */
52
+ searchMode?: 'on' | 'off' | 'auto';
53
+ /** xAI search sources */
54
+ sources?: Array<{
55
+ type: 'web' | 'x' | 'news';
56
+ }>;
57
+ }
58
+ /**
59
+ * Request body augmentation produced by NativeSearchInjector.
60
+ *
61
+ * - `additionalTools`: Appended to the tools array in the request body.
62
+ * - `bodyFields`: Merged into the top-level request body.
63
+ */
64
+ interface NativeSearchAugmentation {
65
+ /** Extra tools to append (OpenAI web_search, Anthropic web_search_20250305, Gemini grounding) */
66
+ additionalTools?: unknown[];
67
+ /** Top-level body fields (xAI search_parameters, OpenRouter plugins, OpenAI web_search_options) */
68
+ bodyFields?: Record<string, unknown>;
69
+ }
70
+ /**
71
+ * Map from API format to potential native search providers.
72
+ *
73
+ * Note: `openai` (Chat Completions) is NOT mapped here because regular models
74
+ * (gpt-4o, o1, etc.) don't support native search via Chat Completions API.
75
+ * Only `gpt-4o-search-preview` models support it (via `web_search_options` body
76
+ * field), and those are handled by a special case in `detectNativeSearch()`.
77
+ *
78
+ * `openai-response` (Responses API) DOES support native `web_search` tool
79
+ * for gpt-4o, o1, o3, o4-mini, etc.
80
+ */
81
+ declare const API_FORMAT_PROVIDER_MAP: Partial<Record<ApiFormat, NativeSearchProvider>>;
82
+
83
+ /**
84
+ * Completion Service Types
85
+ *
86
+ * Type definitions for completion options, results, and callbacks.
87
+ */
88
+
89
+ interface CompletionOptions {
90
+ providerId: string;
91
+ model: string;
92
+ messages: SimpleChatMessage[];
93
+ maxTokens?: number;
94
+ temperature?: number;
95
+ stream?: boolean;
96
+ /** Thinking effort level for reasoning models */
97
+ thinkLevel?: ThinkLevel;
98
+ /** Native search augmentation to apply to the request body */
99
+ nativeSearchAugmentation?: NativeSearchAugmentation;
100
+ /** Session ID for API key pool affinity (preserves prompt cache) and usage attribution. */
101
+ sessionId?: string;
102
+ /**
103
+ * Assistant-message id this request is producing — used to attribute
104
+ * recorded usage rows back to host messages. Optional; if absent the row is
105
+ * still recorded but won't be linked.
106
+ */
107
+ messageId?: string;
108
+ /**
109
+ * Parent message id (for subagent-style nested calls). Best-effort: callers
110
+ * that know the parent should fill this; otherwise leave unset.
111
+ */
112
+ parentMessageId?: string;
113
+ /**
114
+ * Opt into the Anthropic 1M-context tier for this request. The transformer
115
+ * pipeline (and any direct Anthropic-format paths) inject the
116
+ * `'context-1m-2025-08-07'` beta into the outbound request body when this
117
+ * is true AND the resolved model is in the 1M-capable allowlist.
118
+ */
119
+ useExtendedContext?: boolean;
120
+ }
121
+ interface CompletionResult {
122
+ success: boolean;
123
+ message?: SimpleChatMessage;
124
+ error?: string;
125
+ usage?: {
126
+ promptTokens: number;
127
+ completionTokens: number;
128
+ totalTokens: number;
129
+ };
130
+ /** Provider finish reason (e.g. 'stop', 'tool_use', 'max_tokens') */
131
+ finishReason?: string;
132
+ }
133
+ interface StreamCallbacks {
134
+ onStart?: (messageId: string) => void;
135
+ onDelta?: (content: string) => void;
136
+ onReasoning?: (reasoning: string) => void;
137
+ onAudio?: (audio: SimpleChatAudio) => void;
138
+ onVideo?: (video: SimpleChatVideo) => void;
139
+ /** Called when a new content block is created (thinking, text, tool_use, tool_result) */
140
+ onBlock?: (block: MessageBlock) => void;
141
+ onDone?: (message: SimpleChatMessage, usage?: CompletionResult['usage'], metrics?: {
142
+ completionTokens: number;
143
+ timeCompletionMs: number;
144
+ timeFirstTokenMs?: number;
145
+ }) => void;
146
+ onError?: (error: string) => void;
147
+ }
148
+ /**
149
+ * API format type for determining endpoint structure
150
+ */
151
+ type ApiFormat = 'openai' | 'anthropic' | 'google' | 'azure-openai' | 'openai-response';
152
+
153
+ export { type ApiFormat as A, type CompletionOptions as C, NATIVE_SEARCH_TOOL_NAMES as N, OPENAI_CHAT_COMPLETION_SEARCH_MODELS as O, type StreamCallbacks as S, type CompletionResult as a, type NativeSearchAugmentation as b, type NativeSearchDetectionResult as c, type NativeSearchProvider as d, type NativeSearchUserConfig as e, API_FORMAT_PROVIDER_MAP as f, NATIVE_SEARCH_EXCLUDED_MODELS as g, NATIVE_SEARCH_MODEL_PATTERNS as h };
@@ -0,0 +1,153 @@
1
+ import { MessageBlock } from '@omnicross/contracts/message-blocks';
2
+ import { SimpleChatMessage, ThinkLevel, SimpleChatAudio, SimpleChatVideo } from '@omnicross/contracts/completion-types';
3
+
4
+ /**
5
+ * Native Search Types
6
+ *
7
+ * Type definitions for provider-native web search capabilities.
8
+ * Used by NativeSearchInjector to detect and configure built-in
9
+ * search for OpenAI, Anthropic, Google, xAI, and OpenRouter.
10
+ *
11
+ * @module completion/native-search-types
12
+ */
13
+
14
+ /** Providers that support native/built-in web search */
15
+ type NativeSearchProvider = 'openai' | 'anthropic' | 'google' | 'xai' | 'openrouter';
16
+ /** Result of detecting native search support for a model */
17
+ interface NativeSearchDetectionResult {
18
+ /** Whether the model supports native search */
19
+ supported: boolean;
20
+ /** Which native provider to use, if supported */
21
+ nativeProvider: NativeSearchProvider | null;
22
+ }
23
+ /**
24
+ * Model ID patterns for detecting native search support.
25
+ * OpenRouter is detected via provider metadata, not model ID.
26
+ */
27
+ declare const NATIVE_SEARCH_MODEL_PATTERNS: Record<NativeSearchProvider, RegExp[]>;
28
+ /**
29
+ * OpenAI models that use Chat Completion endpoint (not Response API).
30
+ * These models use `web_search_options` instead of a `web_search` tool.
31
+ */
32
+ declare const OPENAI_CHAT_COMPLETION_SEARCH_MODELS: string[];
33
+ /**
34
+ * Models that match a native search pattern but do NOT support web search.
35
+ * These are excluded from auto-detection (but can still be user-overridden).
36
+ *
37
+ * - `gpt-4.1-nano`: Matches `/^gpt-4/` but OpenAI explicitly excludes it
38
+ * from web search support in the Responses API.
39
+ */
40
+ declare const NATIVE_SEARCH_EXCLUDED_MODELS: string[];
41
+ /** Native search tool names that should NOT be executed locally */
42
+ declare const NATIVE_SEARCH_TOOL_NAMES: string[];
43
+ /** User-facing configuration for native search */
44
+ interface NativeSearchUserConfig {
45
+ /** Whether native search is enabled */
46
+ enabled: boolean;
47
+ /** Max search results / uses (maps to provider-specific settings) */
48
+ maxResults?: number;
49
+ /** Domains to block (Anthropic) */
50
+ blockedDomains?: string[];
51
+ /** xAI search mode override */
52
+ searchMode?: 'on' | 'off' | 'auto';
53
+ /** xAI search sources */
54
+ sources?: Array<{
55
+ type: 'web' | 'x' | 'news';
56
+ }>;
57
+ }
58
+ /**
59
+ * Request body augmentation produced by NativeSearchInjector.
60
+ *
61
+ * - `additionalTools`: Appended to the tools array in the request body.
62
+ * - `bodyFields`: Merged into the top-level request body.
63
+ */
64
+ interface NativeSearchAugmentation {
65
+ /** Extra tools to append (OpenAI web_search, Anthropic web_search_20250305, Gemini grounding) */
66
+ additionalTools?: unknown[];
67
+ /** Top-level body fields (xAI search_parameters, OpenRouter plugins, OpenAI web_search_options) */
68
+ bodyFields?: Record<string, unknown>;
69
+ }
70
+ /**
71
+ * Map from API format to potential native search providers.
72
+ *
73
+ * Note: `openai` (Chat Completions) is NOT mapped here because regular models
74
+ * (gpt-4o, o1, etc.) don't support native search via Chat Completions API.
75
+ * Only `gpt-4o-search-preview` models support it (via `web_search_options` body
76
+ * field), and those are handled by a special case in `detectNativeSearch()`.
77
+ *
78
+ * `openai-response` (Responses API) DOES support native `web_search` tool
79
+ * for gpt-4o, o1, o3, o4-mini, etc.
80
+ */
81
+ declare const API_FORMAT_PROVIDER_MAP: Partial<Record<ApiFormat, NativeSearchProvider>>;
82
+
83
+ /**
84
+ * Completion Service Types
85
+ *
86
+ * Type definitions for completion options, results, and callbacks.
87
+ */
88
+
89
+ interface CompletionOptions {
90
+ providerId: string;
91
+ model: string;
92
+ messages: SimpleChatMessage[];
93
+ maxTokens?: number;
94
+ temperature?: number;
95
+ stream?: boolean;
96
+ /** Thinking effort level for reasoning models */
97
+ thinkLevel?: ThinkLevel;
98
+ /** Native search augmentation to apply to the request body */
99
+ nativeSearchAugmentation?: NativeSearchAugmentation;
100
+ /** Session ID for API key pool affinity (preserves prompt cache) and usage attribution. */
101
+ sessionId?: string;
102
+ /**
103
+ * Assistant-message id this request is producing — used to attribute
104
+ * recorded usage rows back to host messages. Optional; if absent the row is
105
+ * still recorded but won't be linked.
106
+ */
107
+ messageId?: string;
108
+ /**
109
+ * Parent message id (for subagent-style nested calls). Best-effort: callers
110
+ * that know the parent should fill this; otherwise leave unset.
111
+ */
112
+ parentMessageId?: string;
113
+ /**
114
+ * Opt into the Anthropic 1M-context tier for this request. The transformer
115
+ * pipeline (and any direct Anthropic-format paths) inject the
116
+ * `'context-1m-2025-08-07'` beta into the outbound request body when this
117
+ * is true AND the resolved model is in the 1M-capable allowlist.
118
+ */
119
+ useExtendedContext?: boolean;
120
+ }
121
+ interface CompletionResult {
122
+ success: boolean;
123
+ message?: SimpleChatMessage;
124
+ error?: string;
125
+ usage?: {
126
+ promptTokens: number;
127
+ completionTokens: number;
128
+ totalTokens: number;
129
+ };
130
+ /** Provider finish reason (e.g. 'stop', 'tool_use', 'max_tokens') */
131
+ finishReason?: string;
132
+ }
133
+ interface StreamCallbacks {
134
+ onStart?: (messageId: string) => void;
135
+ onDelta?: (content: string) => void;
136
+ onReasoning?: (reasoning: string) => void;
137
+ onAudio?: (audio: SimpleChatAudio) => void;
138
+ onVideo?: (video: SimpleChatVideo) => void;
139
+ /** Called when a new content block is created (thinking, text, tool_use, tool_result) */
140
+ onBlock?: (block: MessageBlock) => void;
141
+ onDone?: (message: SimpleChatMessage, usage?: CompletionResult['usage'], metrics?: {
142
+ completionTokens: number;
143
+ timeCompletionMs: number;
144
+ timeFirstTokenMs?: number;
145
+ }) => void;
146
+ onError?: (error: string) => void;
147
+ }
148
+ /**
149
+ * API format type for determining endpoint structure
150
+ */
151
+ type ApiFormat = 'openai' | 'anthropic' | 'google' | 'azure-openai' | 'openai-response';
152
+
153
+ export { type ApiFormat as A, type CompletionOptions as C, NATIVE_SEARCH_TOOL_NAMES as N, OPENAI_CHAT_COMPLETION_SEARCH_MODELS as O, type StreamCallbacks as S, type CompletionResult as a, type NativeSearchAugmentation as b, type NativeSearchDetectionResult as c, type NativeSearchProvider as d, type NativeSearchUserConfig as e, API_FORMAT_PROVIDER_MAP as f, NATIVE_SEARCH_EXCLUDED_MODELS as g, NATIVE_SEARCH_MODEL_PATTERNS as h };
@@ -0,0 +1,6 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
+
3
+ var _chunkYMFAJFQTcjs = require('../chunk-YMFAJFQT.cjs');
4
+
5
+
6
+ exports.PricingEngine = _chunkYMFAJFQTcjs.PricingEngine;
@@ -0,0 +1,83 @@
1
+ import { PricingEntry, PricingEntryInput, PricingFetchResult, PricingConflictDecision, PricingResolution } from '@omnicross/contracts/pricing-types';
2
+ import { UsageTokens } from '@omnicross/contracts/usage-types';
3
+ import { L as Logger } from '../logger-4GvQNzhE.cjs';
4
+ import { PricingStore } from '../ports/pricing-store.cjs';
5
+
6
+ /**
7
+ * PricingEngine — manages model pricing and computes per-event cost.
8
+ *
9
+ * Persistence goes through the injected `PricingStore` port. Sources of
10
+ * pricing rows:
11
+ * - 'builtin' — bundled fallback prices, seeded by the host
12
+ * - 'litellm' — refreshed on user demand from LiteLLM's public JSON
13
+ * - 'user' — hand-edited; protected from auto-overwrite
14
+ *
15
+ * @module usage/pricing-engine
16
+ */
17
+
18
+ /** Output of `calculateCost`. */
19
+ interface CostCalculation {
20
+ costUsd: number;
21
+ /**
22
+ * Difference between hypothetical-no-cache cost (charging cacheReadTokens at
23
+ * the full input price) and the actual cost (charging at the cache_read price).
24
+ * Always ≥ 0.
25
+ */
26
+ costSavedByCacheUsd: number;
27
+ }
28
+ /** Optional knobs (mostly for tests). */
29
+ interface PricingEngineOptions {
30
+ /** Override the pricing-source JSON URL — useful for testing. */
31
+ sourceUrl?: string;
32
+ /** Override `fetch` — useful for testing. */
33
+ fetchImpl?: typeof fetch;
34
+ }
35
+ declare class PricingEngine {
36
+ private store;
37
+ private logger;
38
+ private options;
39
+ private cache;
40
+ /**
41
+ * Secondary index keyed by modelId alone. Used as a fallback when no exact
42
+ * (providerId, modelId) match exists — usage may be recorded under a
43
+ * runtime provider alias while pricing rows use the canonical provider id,
44
+ * so matching by model name lets the price still resolve. First
45
+ * non-wildcard entry per model wins.
46
+ */
47
+ private cacheByModel;
48
+ private cacheLoaded;
49
+ constructor(store: PricingStore, logger: Logger, options?: PricingEngineOptions);
50
+ /** Lazy-load and cache the full pricing table. */
51
+ private ensureCache;
52
+ /** Force a cache refresh — call after any write. */
53
+ invalidateCache(): Promise<void>;
54
+ getAll(): Promise<PricingEntry[]>;
55
+ /**
56
+ * Look up a price for (provider, model). Resolution order:
57
+ * 1. exact (providerId, modelId)
58
+ * 2. wildcard provider ('*', modelId)
59
+ * 3. model name alone (any provider) — tolerates a runtime-alias vs
60
+ * canonical provider-id mismatch for the same model.
61
+ */
62
+ getEntry(providerId: string, modelId: string): Promise<PricingEntry | null>;
63
+ /**
64
+ * Compute the cost (and cache savings) for a single response.
65
+ *
66
+ * Cost formula (USD):
67
+ * cost = (input * inputPrice
68
+ * + output * outputPrice
69
+ * + cacheRead * (cacheReadPrice ?? inputPrice)
70
+ * + cacheWrite * (cacheWritePrice ?? inputPrice)
71
+ * ) / 1e6
72
+ *
73
+ * Cache savings:
74
+ * savings = cacheRead * (inputPrice - cacheReadPrice) / 1e6
75
+ * — clamped at 0 if cacheReadPrice is null or ≥ inputPrice.
76
+ */
77
+ calculateCost(providerId: string, modelId: string, usage: UsageTokens): Promise<CostCalculation>;
78
+ upsertManual(input: PricingEntryInput): Promise<PricingEntry>;
79
+ fetchLatestFromSource(): Promise<PricingFetchResult>;
80
+ resolveConflicts(decisions: PricingConflictDecision[], pendingIncoming: Map<string, PricingEntryInput>): Promise<PricingResolution>;
81
+ }
82
+
83
+ export { type CostCalculation, PricingEngine, type PricingEngineOptions };
@@ -0,0 +1,83 @@
1
+ import { PricingEntry, PricingEntryInput, PricingFetchResult, PricingConflictDecision, PricingResolution } from '@omnicross/contracts/pricing-types';
2
+ import { UsageTokens } from '@omnicross/contracts/usage-types';
3
+ import { L as Logger } from '../logger-4GvQNzhE.js';
4
+ import { PricingStore } from '../ports/pricing-store.js';
5
+
6
+ /**
7
+ * PricingEngine — manages model pricing and computes per-event cost.
8
+ *
9
+ * Persistence goes through the injected `PricingStore` port. Sources of
10
+ * pricing rows:
11
+ * - 'builtin' — bundled fallback prices, seeded by the host
12
+ * - 'litellm' — refreshed on user demand from LiteLLM's public JSON
13
+ * - 'user' — hand-edited; protected from auto-overwrite
14
+ *
15
+ * @module usage/pricing-engine
16
+ */
17
+
18
+ /** Output of `calculateCost`. */
19
+ interface CostCalculation {
20
+ costUsd: number;
21
+ /**
22
+ * Difference between hypothetical-no-cache cost (charging cacheReadTokens at
23
+ * the full input price) and the actual cost (charging at the cache_read price).
24
+ * Always ≥ 0.
25
+ */
26
+ costSavedByCacheUsd: number;
27
+ }
28
+ /** Optional knobs (mostly for tests). */
29
+ interface PricingEngineOptions {
30
+ /** Override the pricing-source JSON URL — useful for testing. */
31
+ sourceUrl?: string;
32
+ /** Override `fetch` — useful for testing. */
33
+ fetchImpl?: typeof fetch;
34
+ }
35
+ declare class PricingEngine {
36
+ private store;
37
+ private logger;
38
+ private options;
39
+ private cache;
40
+ /**
41
+ * Secondary index keyed by modelId alone. Used as a fallback when no exact
42
+ * (providerId, modelId) match exists — usage may be recorded under a
43
+ * runtime provider alias while pricing rows use the canonical provider id,
44
+ * so matching by model name lets the price still resolve. First
45
+ * non-wildcard entry per model wins.
46
+ */
47
+ private cacheByModel;
48
+ private cacheLoaded;
49
+ constructor(store: PricingStore, logger: Logger, options?: PricingEngineOptions);
50
+ /** Lazy-load and cache the full pricing table. */
51
+ private ensureCache;
52
+ /** Force a cache refresh — call after any write. */
53
+ invalidateCache(): Promise<void>;
54
+ getAll(): Promise<PricingEntry[]>;
55
+ /**
56
+ * Look up a price for (provider, model). Resolution order:
57
+ * 1. exact (providerId, modelId)
58
+ * 2. wildcard provider ('*', modelId)
59
+ * 3. model name alone (any provider) — tolerates a runtime-alias vs
60
+ * canonical provider-id mismatch for the same model.
61
+ */
62
+ getEntry(providerId: string, modelId: string): Promise<PricingEntry | null>;
63
+ /**
64
+ * Compute the cost (and cache savings) for a single response.
65
+ *
66
+ * Cost formula (USD):
67
+ * cost = (input * inputPrice
68
+ * + output * outputPrice
69
+ * + cacheRead * (cacheReadPrice ?? inputPrice)
70
+ * + cacheWrite * (cacheWritePrice ?? inputPrice)
71
+ * ) / 1e6
72
+ *
73
+ * Cache savings:
74
+ * savings = cacheRead * (inputPrice - cacheReadPrice) / 1e6
75
+ * — clamped at 0 if cacheReadPrice is null or ≥ inputPrice.
76
+ */
77
+ calculateCost(providerId: string, modelId: string, usage: UsageTokens): Promise<CostCalculation>;
78
+ upsertManual(input: PricingEntryInput): Promise<PricingEntry>;
79
+ fetchLatestFromSource(): Promise<PricingFetchResult>;
80
+ resolveConflicts(decisions: PricingConflictDecision[], pendingIncoming: Map<string, PricingEntryInput>): Promise<PricingResolution>;
81
+ }
82
+
83
+ export { type CostCalculation, PricingEngine, type PricingEngineOptions };
@@ -0,0 +1,6 @@
1
+ import {
2
+ PricingEngine
3
+ } from "../chunk-ZLX3KGXX.js";
4
+ export {
5
+ PricingEngine
6
+ };
@@ -0,0 +1,6 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
+
3
+ var _chunkXBSYYZIYcjs = require('../chunk-XBSYYZIY.cjs');
4
+
5
+
6
+ exports.UsageRecorder = _chunkXBSYYZIYcjs.UsageRecorder;
@@ -0,0 +1,73 @@
1
+ import { PricingEngine } from './pricing-engine.cjs';
2
+ import { UsageDateRange, UsageTotals, ModelUsageRow, ApiKeyUsageRow, MessageUsageRow, SessionCacheStats } from '@omnicross/contracts/usage-stats-types';
3
+ import { UsageEngineOrigin, UsageTokens } from '@omnicross/contracts/usage-types';
4
+ import { L as Logger } from '../logger-4GvQNzhE.cjs';
5
+ import { UsageEventStore } from '../ports/usage-event-store.cjs';
6
+ import '@omnicross/contracts/pricing-types';
7
+ import '../ports/pricing-store.cjs';
8
+
9
+ /**
10
+ * UsageRecorder — funnels every captured LLM-request event through cost
11
+ * calculation and persists it via the injected `UsageEventStore`.
12
+ *
13
+ * Capture taps call `record()` synchronously with the parsed usage data. The
14
+ * store insert is enqueued via an injectable deferral function (default: a
15
+ * zero-delay timer; Node hosts may inject `setImmediate`) so the response path
16
+ * is never blocked on disk I/O.
17
+ *
18
+ * @module usage/usage-recorder
19
+ */
20
+
21
+ /** Subset of fields the caller MUST provide. Recorder fills cost (store fills ts). */
22
+ interface UsageRecordInput {
23
+ messageId?: string | null;
24
+ parentMessageId?: string | null;
25
+ sessionId?: string | null;
26
+ providerId: string;
27
+ model: string;
28
+ apiKeyId?: string | null;
29
+ engineOrigin: UsageEngineOrigin;
30
+ usage: UsageTokens;
31
+ /** Optional raw provider usage block — kept verbatim for forensics. */
32
+ rawUsage?: unknown;
33
+ /** Host run-correlation id. Optional / additive. */
34
+ runId?: string | null;
35
+ /** Host event-correlation id for this call. Optional / additive. */
36
+ eventId?: string | null;
37
+ }
38
+ /** Optional knobs (mostly for hosts/tests). */
39
+ interface UsageRecorderOptions {
40
+ /**
41
+ * Deferral function used by `record()` to schedule the async persist off
42
+ * the caller's path. Defaults to a zero-delay timer; Node hosts may inject
43
+ * `setImmediate` to preserve their exact scheduling.
44
+ */
45
+ defer?: (fn: () => void) => void;
46
+ }
47
+ declare class UsageRecorder {
48
+ private store;
49
+ private pricing;
50
+ private logger;
51
+ private defer;
52
+ constructor(store: UsageEventStore, pricing: PricingEngine, logger: Logger, options?: UsageRecorderOptions);
53
+ /**
54
+ * Record one LLM request. Returns immediately — the actual store insert is
55
+ * deferred so the caller's response path is unblocked.
56
+ *
57
+ * Errors during the insert are logged but never thrown.
58
+ */
59
+ record(input: UsageRecordInput): void;
60
+ /**
61
+ * Same as `record()` but awaitable — preferred in tests so they can assert
62
+ * after the row exists.
63
+ */
64
+ recordAsync(input: UsageRecordInput): Promise<string | null>;
65
+ getTotals(range: UsageDateRange): Promise<UsageTotals>;
66
+ getByModel(range: UsageDateRange): Promise<ModelUsageRow[]>;
67
+ getByApiKey(range: UsageDateRange): Promise<ApiKeyUsageRow[]>;
68
+ getMessagesForSession(sessionId: string): Promise<MessageUsageRow[]>;
69
+ /** Cumulative cache hit/miss stats for one session. */
70
+ getSessionCacheStats(sessionId: string): Promise<SessionCacheStats>;
71
+ }
72
+
73
+ export { type UsageRecordInput, UsageRecorder, type UsageRecorderOptions };
@@ -0,0 +1,73 @@
1
+ import { PricingEngine } from './pricing-engine.js';
2
+ import { UsageDateRange, UsageTotals, ModelUsageRow, ApiKeyUsageRow, MessageUsageRow, SessionCacheStats } from '@omnicross/contracts/usage-stats-types';
3
+ import { UsageEngineOrigin, UsageTokens } from '@omnicross/contracts/usage-types';
4
+ import { L as Logger } from '../logger-4GvQNzhE.js';
5
+ import { UsageEventStore } from '../ports/usage-event-store.js';
6
+ import '@omnicross/contracts/pricing-types';
7
+ import '../ports/pricing-store.js';
8
+
9
+ /**
10
+ * UsageRecorder — funnels every captured LLM-request event through cost
11
+ * calculation and persists it via the injected `UsageEventStore`.
12
+ *
13
+ * Capture taps call `record()` synchronously with the parsed usage data. The
14
+ * store insert is enqueued via an injectable deferral function (default: a
15
+ * zero-delay timer; Node hosts may inject `setImmediate`) so the response path
16
+ * is never blocked on disk I/O.
17
+ *
18
+ * @module usage/usage-recorder
19
+ */
20
+
21
+ /** Subset of fields the caller MUST provide. Recorder fills cost (store fills ts). */
22
+ interface UsageRecordInput {
23
+ messageId?: string | null;
24
+ parentMessageId?: string | null;
25
+ sessionId?: string | null;
26
+ providerId: string;
27
+ model: string;
28
+ apiKeyId?: string | null;
29
+ engineOrigin: UsageEngineOrigin;
30
+ usage: UsageTokens;
31
+ /** Optional raw provider usage block — kept verbatim for forensics. */
32
+ rawUsage?: unknown;
33
+ /** Host run-correlation id. Optional / additive. */
34
+ runId?: string | null;
35
+ /** Host event-correlation id for this call. Optional / additive. */
36
+ eventId?: string | null;
37
+ }
38
+ /** Optional knobs (mostly for hosts/tests). */
39
+ interface UsageRecorderOptions {
40
+ /**
41
+ * Deferral function used by `record()` to schedule the async persist off
42
+ * the caller's path. Defaults to a zero-delay timer; Node hosts may inject
43
+ * `setImmediate` to preserve their exact scheduling.
44
+ */
45
+ defer?: (fn: () => void) => void;
46
+ }
47
+ declare class UsageRecorder {
48
+ private store;
49
+ private pricing;
50
+ private logger;
51
+ private defer;
52
+ constructor(store: UsageEventStore, pricing: PricingEngine, logger: Logger, options?: UsageRecorderOptions);
53
+ /**
54
+ * Record one LLM request. Returns immediately — the actual store insert is
55
+ * deferred so the caller's response path is unblocked.
56
+ *
57
+ * Errors during the insert are logged but never thrown.
58
+ */
59
+ record(input: UsageRecordInput): void;
60
+ /**
61
+ * Same as `record()` but awaitable — preferred in tests so they can assert
62
+ * after the row exists.
63
+ */
64
+ recordAsync(input: UsageRecordInput): Promise<string | null>;
65
+ getTotals(range: UsageDateRange): Promise<UsageTotals>;
66
+ getByModel(range: UsageDateRange): Promise<ModelUsageRow[]>;
67
+ getByApiKey(range: UsageDateRange): Promise<ApiKeyUsageRow[]>;
68
+ getMessagesForSession(sessionId: string): Promise<MessageUsageRow[]>;
69
+ /** Cumulative cache hit/miss stats for one session. */
70
+ getSessionCacheStats(sessionId: string): Promise<SessionCacheStats>;
71
+ }
72
+
73
+ export { type UsageRecordInput, UsageRecorder, type UsageRecorderOptions };
@@ -0,0 +1,6 @@
1
+ import {
2
+ UsageRecorder
3
+ } from "../chunk-MNYKI4CI.js";
4
+ export {
5
+ UsageRecorder
6
+ };
package/dist/usage.cjs ADDED
@@ -0,0 +1,11 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});require('./chunk-EYZYXJTJ.cjs');
2
+
3
+
4
+ var _chunkYMFAJFQTcjs = require('./chunk-YMFAJFQT.cjs');
5
+
6
+
7
+ var _chunkXBSYYZIYcjs = require('./chunk-XBSYYZIY.cjs');
8
+
9
+
10
+
11
+ exports.PricingEngine = _chunkYMFAJFQTcjs.PricingEngine; exports.UsageRecorder = _chunkXBSYYZIYcjs.UsageRecorder;
@@ -0,0 +1,8 @@
1
+ export { CostCalculation, PricingEngine, PricingEngineOptions } from './usage/pricing-engine.cjs';
2
+ export { UsageRecordInput, UsageRecorder, UsageRecorderOptions } from './usage/usage-recorder.cjs';
3
+ import '@omnicross/contracts/pricing-types';
4
+ import '@omnicross/contracts/usage-types';
5
+ import './logger-4GvQNzhE.cjs';
6
+ import './ports/pricing-store.cjs';
7
+ import '@omnicross/contracts/usage-stats-types';
8
+ import './ports/usage-event-store.cjs';