@omnicross/core 0.1.8 → 0.1.10

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 (113) hide show
  1. package/dist/auth/GeminiCodeAssistProjectResolver.cjs +5 -3
  2. package/dist/auth/GeminiCodeAssistProjectResolver.js +4 -2
  3. package/dist/{chunk-N5T4M4GU.js → chunk-2UTGX6FM.js} +2 -2
  4. package/dist/{chunk-32O35CIF.js → chunk-45FHEOKW.js} +22 -7
  5. package/dist/{chunk-LVUCAWMK.js → chunk-55FMGZ3L.js} +13 -5
  6. package/dist/{chunk-OF3BECU2.cjs → chunk-56QD3YW6.cjs} +18 -5
  7. package/dist/{chunk-V4TXMEJS.cjs → chunk-5LNYGCIW.cjs} +15 -7
  8. package/dist/{chunk-EPN67EGP.cjs → chunk-5UK3KLE2.cjs} +9 -1
  9. package/dist/chunk-6D4W22P4.js +150 -0
  10. package/dist/chunk-77USGNRW.cjs +37 -0
  11. package/dist/chunk-AOFWNWLT.cjs +203 -0
  12. package/dist/{chunk-UAPBLNN2.js → chunk-AQDON6MB.js} +8 -0
  13. package/dist/{chunk-LB6EBS6Y.js → chunk-CCVRRJOX.js} +17 -4
  14. package/dist/{chunk-OVQBNVSV.cjs → chunk-CMVXX7ON.cjs} +42 -27
  15. package/dist/{chunk-QYC54PMG.js → chunk-FEBAQI5A.js} +255 -92
  16. package/dist/{chunk-7C7DET6S.js → chunk-GXEZ2R3E.js} +156 -1
  17. package/dist/{chunk-PEGTIPB3.js → chunk-HKB656B4.js} +37 -43
  18. package/dist/chunk-N2EIM2XJ.js +203 -0
  19. package/dist/{chunk-MYYR3HZL.js → chunk-NGYOO5TO.js} +5 -5
  20. package/dist/{chunk-OKMJLEXX.cjs → chunk-OC6DOOFX.cjs} +5 -5
  21. package/dist/{chunk-2Z4XM3H5.cjs → chunk-P7EM6BND.cjs} +10 -10
  22. package/dist/chunk-QUSEZNYS.cjs +150 -0
  23. package/dist/{chunk-KBM2W6UY.cjs → chunk-RICPANBY.cjs} +41 -24
  24. package/dist/{chunk-TOVPMMHM.js → chunk-S3DYFEBE.js} +37 -20
  25. package/dist/{chunk-26K6T2YS.cjs → chunk-TIT74RIL.cjs} +407 -244
  26. package/dist/{chunk-XPIOJQS2.cjs → chunk-UWDW6PN3.cjs} +159 -4
  27. package/dist/chunk-WYVGULTQ.js +37 -0
  28. package/dist/{chunk-OXHNSZ53.cjs → chunk-ZQQUD66M.cjs} +54 -60
  29. package/dist/completion/CompletionService.cjs +15 -13
  30. package/dist/completion/CompletionService.js +14 -12
  31. package/dist/completion.cjs +15 -13
  32. package/dist/completion.js +14 -12
  33. package/dist/index.cjs +15 -13
  34. package/dist/index.d.cts +2 -2
  35. package/dist/index.d.ts +2 -2
  36. package/dist/index.js +14 -12
  37. package/dist/outbound-api/auditCapture.cjs +2 -2
  38. package/dist/outbound-api/auditCapture.d.cts +6 -0
  39. package/dist/outbound-api/auditCapture.d.ts +6 -0
  40. package/dist/outbound-api/auditCapture.js +1 -1
  41. package/dist/outbound-api/routeResolver.d.cts +1 -1
  42. package/dist/outbound-api/routeResolver.d.ts +1 -1
  43. package/dist/outbound-api/types.d.cts +1 -1
  44. package/dist/outbound-api/types.d.ts +1 -1
  45. package/dist/outbound-api.cjs +15 -13
  46. package/dist/outbound-api.d.cts +3 -2
  47. package/dist/outbound-api.d.ts +3 -2
  48. package/dist/outbound-api.js +14 -12
  49. package/dist/pipeline/AccountAllowanceScheduling.d.cts +1 -1
  50. package/dist/pipeline/AccountAllowanceScheduling.d.ts +1 -1
  51. package/dist/pipeline/executeProviderCall.d.cts +2 -0
  52. package/dist/pipeline/executeProviderCall.d.ts +2 -0
  53. package/dist/pipeline/resolveProviderChain.d.cts +1 -0
  54. package/dist/pipeline/resolveProviderChain.d.ts +1 -0
  55. package/dist/pipeline/resolveSubscriptionChain.d.cts +2 -0
  56. package/dist/pipeline/resolveSubscriptionChain.d.ts +2 -0
  57. package/dist/ports/provider-config-source.d.cts +1 -0
  58. package/dist/ports/provider-config-source.d.ts +1 -0
  59. package/dist/ports.d.cts +1 -1
  60. package/dist/ports.d.ts +1 -1
  61. package/dist/provider-proxy/ProviderProxy.cjs +15 -13
  62. package/dist/provider-proxy/ProviderProxy.js +14 -12
  63. package/dist/provider-proxy/ingress/providerProxyShared.cjs +15 -13
  64. package/dist/provider-proxy/ingress/providerProxyShared.js +14 -12
  65. package/dist/provider-proxy.cjs +15 -13
  66. package/dist/provider-proxy.js +14 -12
  67. package/dist/transformer/TransformerChainExecutor.d.cts +2 -0
  68. package/dist/transformer/TransformerChainExecutor.d.ts +2 -0
  69. package/dist/transformer/TransformerService.d.cts +2 -0
  70. package/dist/transformer/TransformerService.d.ts +2 -0
  71. package/dist/transformer/transformers/AnthropicTransformer.cjs +4 -2
  72. package/dist/transformer/transformers/AnthropicTransformer.d.cts +7 -2
  73. package/dist/transformer/transformers/AnthropicTransformer.d.ts +7 -2
  74. package/dist/transformer/transformers/AnthropicTransformer.js +3 -1
  75. package/dist/transformer/transformers/GeminiCodeAssistTransformer.cjs +5 -3
  76. package/dist/transformer/transformers/GeminiCodeAssistTransformer.d.cts +2 -0
  77. package/dist/transformer/transformers/GeminiCodeAssistTransformer.d.ts +2 -0
  78. package/dist/transformer/transformers/GeminiCodeAssistTransformer.js +4 -2
  79. package/dist/transformer/transformers/GeminiTransformer.cjs +5 -3
  80. package/dist/transformer/transformers/GeminiTransformer.d.cts +4 -2
  81. package/dist/transformer/transformers/GeminiTransformer.d.ts +4 -2
  82. package/dist/transformer/transformers/GeminiTransformer.js +4 -2
  83. package/dist/transformer/transformers/OpenAIResponseTransformer.cjs +3 -2
  84. package/dist/transformer/transformers/OpenAIResponseTransformer.d.cts +4 -2
  85. package/dist/transformer/transformers/OpenAIResponseTransformer.d.ts +4 -2
  86. package/dist/transformer/transformers/OpenAIResponseTransformer.js +2 -1
  87. package/dist/transformer/transformers/OpenAITransformer.cjs +3 -2
  88. package/dist/transformer/transformers/OpenAITransformer.d.cts +3 -1
  89. package/dist/transformer/transformers/OpenAITransformer.d.ts +3 -1
  90. package/dist/transformer/transformers/OpenAITransformer.js +2 -1
  91. package/dist/transformer/transformers.cjs +10 -8
  92. package/dist/transformer/transformers.d.cts +2 -0
  93. package/dist/transformer/transformers.d.ts +2 -0
  94. package/dist/transformer/transformers.js +9 -7
  95. package/dist/transformer/types.d.cts +16 -5
  96. package/dist/transformer/types.d.ts +16 -5
  97. package/dist/transformer.cjs +28 -9
  98. package/dist/transformer.d.cts +76 -1
  99. package/dist/transformer.d.ts +76 -1
  100. package/dist/transformer.js +28 -9
  101. package/dist/usage/usage-recorder.cjs +2 -2
  102. package/dist/usage/usage-recorder.d.cts +12 -2
  103. package/dist/usage/usage-recorder.d.ts +12 -2
  104. package/dist/usage/usage-recorder.js +1 -1
  105. package/dist/usage.cjs +20 -3
  106. package/dist/usage.d.cts +149 -0
  107. package/dist/usage.d.ts +149 -0
  108. package/dist/usage.js +20 -3
  109. package/package.json +2 -2
  110. package/dist/chunk-7VU7V2E4.js +0 -0
  111. package/dist/chunk-FZ46M34D.cjs +0 -1
  112. /package/dist/{chunk-EYZYXJTJ.cjs → chunk-QVOB2DNX.cjs} +0 -0
  113. /package/dist/{chunk-46RLHI7D.js → chunk-WTQMX2Q6.js} +0 -0
@@ -1,8 +1,10 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; } var _class;
2
2
 
3
3
 
4
- var _chunkOKMJLEXXcjs = require('../chunk-OKMJLEXX.cjs');
5
- require('../chunk-KBM2W6UY.cjs');
4
+ var _chunkOC6DOOFXcjs = require('../chunk-OC6DOOFX.cjs');
5
+ require('../chunk-RICPANBY.cjs');
6
+ require('../chunk-77USGNRW.cjs');
7
+ require('../chunk-AOFWNWLT.cjs');
6
8
 
7
9
 
8
10
  var _chunkRJUONLUQcjs = require('../chunk-RJUONLUQ.cjs');
@@ -62,7 +64,7 @@ var GeminiCodeAssistProjectResolver = (_class = class {
62
64
  return run;
63
65
  }
64
66
  codeAssistUrl(method) {
65
- return `${_chunkOKMJLEXXcjs.resolveCodeAssistEndpoint.call(void 0, )}/${_chunkOKMJLEXXcjs.resolveCodeAssistApiVersion.call(void 0, )}:${method}`;
67
+ return `${_chunkOC6DOOFXcjs.resolveCodeAssistEndpoint.call(void 0, )}/${_chunkOC6DOOFXcjs.resolveCodeAssistApiVersion.call(void 0, )}:${method}`;
66
68
  }
67
69
  /** Seed project id from env; reject a purely-numeric value (project NUMBER). */
68
70
  seedProjectId() {
@@ -1,8 +1,10 @@
1
1
  import {
2
2
  resolveCodeAssistApiVersion,
3
3
  resolveCodeAssistEndpoint
4
- } from "../chunk-N5T4M4GU.js";
5
- import "../chunk-TOVPMMHM.js";
4
+ } from "../chunk-2UTGX6FM.js";
5
+ import "../chunk-S3DYFEBE.js";
6
+ import "../chunk-WYVGULTQ.js";
7
+ import "../chunk-N2EIM2XJ.js";
6
8
  import {
7
9
  fetchUpstream
8
10
  } from "../chunk-RJ5ZGNI3.js";
@@ -3,7 +3,7 @@ import {
3
3
  transformRequestOut,
4
4
  transformResponseIn,
5
5
  transformResponseOut
6
- } from "./chunk-TOVPMMHM.js";
6
+ } from "./chunk-S3DYFEBE.js";
7
7
 
8
8
  // src/transformer/transformers/GeminiCodeAssistTransformer.ts
9
9
  var DEFAULT_CODE_ASSIST_ENDPOINT = "https://cloudcode-pa.googleapis.com";
@@ -117,7 +117,7 @@ var GeminiCodeAssistTransformer = class {
117
117
  * openaiResponsesIngress). `undefined` is the valid fresh free-tier value.
118
118
  */
119
119
  async transformRequestIn(request, provider, _context) {
120
- const inner = buildRequestBody(request);
120
+ const inner = buildRequestBody(request, provider);
121
121
  const envelope = {
122
122
  model: request.model,
123
123
  project: provider.geminiProject,
@@ -2,6 +2,11 @@ import {
2
2
  chatUsageToResponsesUsage,
3
3
  responsesUsageToChatUsage
4
4
  } from "./chunk-FU7EAR73.js";
5
+ import {
6
+ extractReasoningIntent,
7
+ normalizeThinkLevel,
8
+ resolveReasoningPlan
9
+ } from "./chunk-N2EIM2XJ.js";
5
10
 
6
11
  // src/transformer/transformers/OpenAIResponseTransformer.ts
7
12
  var OpenAIResponseTransformer = class {
@@ -26,7 +31,7 @@ var OpenAIResponseTransformer = class {
26
31
  /**
27
32
  * Transform unified request → Response API format
28
33
  */
29
- async transformRequestIn(request, provider, _context) {
34
+ async transformRequestIn(request, provider, context) {
30
35
  const input = [];
31
36
  for (const msg of request.messages) {
32
37
  if (msg.role === "system") {
@@ -82,8 +87,16 @@ var OpenAIResponseTransformer = class {
82
87
  // public provider ever needs it honored, gate that on an opt-out flag.
83
88
  ...request.temperature !== void 0 ? { temperature: request.temperature } : {}
84
89
  };
85
- if (request.reasoning?.effort && request.reasoning.effort !== "none") {
86
- body.reasoning = { effort: request.reasoning.effort, summary: "auto" };
90
+ const reasoningPlan = resolveReasoningPlan({
91
+ intent: extractReasoningIntent(request),
92
+ model: request.model,
93
+ provider,
94
+ target: "openai-responses",
95
+ requestMaxTokens: request.max_tokens,
96
+ preserveNativeEffort: context.reasoningSourceFormat === this.name
97
+ });
98
+ if (reasoningPlan?.kind === "level" && reasoningPlan.enabled) {
99
+ body.reasoning = { effort: reasoningPlan.effort, summary: "auto" };
87
100
  }
88
101
  if (request.tools?.length) {
89
102
  body.tools = request.tools.map((tool) => ({
@@ -106,7 +119,7 @@ var OpenAIResponseTransformer = class {
106
119
  /**
107
120
  * Transform Response API request → unified format
108
121
  */
109
- async transformRequestOut(request, _context) {
122
+ async transformRequestOut(request, context) {
110
123
  const req = request;
111
124
  const messages = [];
112
125
  let codexTools = null;
@@ -192,10 +205,12 @@ var OpenAIResponseTransformer = class {
192
205
  temperature: req.temperature,
193
206
  stream: req.stream
194
207
  };
195
- if (req.reasoning?.effort) {
208
+ const effort = normalizeThinkLevel(req.reasoning?.effort);
209
+ if (effort) {
210
+ context.reasoningSourceFormat = this.name;
196
211
  result.reasoning = {
197
- effort: req.reasoning.effort,
198
- enabled: true
212
+ effort,
213
+ enabled: effort !== "none"
199
214
  };
200
215
  }
201
216
  const tools = [];
@@ -3,7 +3,7 @@ import {
3
3
  transformRequestOut,
4
4
  transformResponseIn,
5
5
  transformResponseOut
6
- } from "./chunk-TOVPMMHM.js";
6
+ } from "./chunk-S3DYFEBE.js";
7
7
 
8
8
  // src/transformer/transformers/GeminiTransformer.ts
9
9
  var GeminiTransformer = class {
@@ -43,8 +43,12 @@ var GeminiTransformer = class {
43
43
  * Transform request from unified format to Gemini format
44
44
  * Also builds the correct URL for the Gemini API
45
45
  */
46
- async transformRequestIn(request, provider, _context) {
47
- const body = buildRequestBody(request);
46
+ async transformRequestIn(request, provider, context) {
47
+ const body = buildRequestBody(
48
+ request,
49
+ provider,
50
+ context.reasoningSourceFormat === this.name
51
+ );
48
52
  const action = request.stream ? "streamGenerateContent?alt=sse" : "generateContent";
49
53
  const url = new URL(`./${request.model}:${action}`, provider.baseUrl);
50
54
  const headers = {};
@@ -64,8 +68,12 @@ var GeminiTransformer = class {
64
68
  * Transform incoming request to unified format
65
69
  * (For requests coming into the Gemini endpoint)
66
70
  */
67
- async transformRequestOut(request, _context) {
68
- return transformRequestOut(request);
71
+ async transformRequestOut(request, context) {
72
+ const unifiedRequest = transformRequestOut(request);
73
+ if (unifiedRequest.reasoning?.effort) {
74
+ context.reasoningSourceFormat = this.name;
75
+ }
76
+ return unifiedRequest;
69
77
  }
70
78
  /**
71
79
  * Transform Gemini response to OpenAI-compatible format
@@ -1,4 +1,9 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; } var _class;// src/transformer/transformers/OpenAITransformer.ts
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; } var _class;
2
+
3
+
4
+ var _chunkAOFWNWLTcjs = require('./chunk-AOFWNWLT.cjs');
5
+
6
+ // src/transformer/transformers/OpenAITransformer.ts
2
7
  var FOREIGN_MESSAGE_KEYS = ["cache_control", "thinking"];
3
8
  var FOREIGN_BODY_KEYS = ["meta", "reasoning", "thinking"];
4
9
  function normalizeContent(content) {
@@ -24,7 +29,7 @@ var OpenAITransformer = (_class = class {constructor() { _class.prototype.__init
24
29
  /**
25
30
  * Unified → OpenAI Chat Completions.
26
31
  */
27
- async transformRequestIn(request, _provider, _context) {
32
+ async transformRequestIn(request, provider, _context) {
28
33
  const source = request;
29
34
  const out = {};
30
35
  for (const key of Object.keys(source)) {
@@ -49,9 +54,17 @@ var OpenAITransformer = (_class = class {constructor() { _class.prototype.__init
49
54
  return encoded;
50
55
  });
51
56
  }
52
- const effort = _optionalChain([request, 'access', _4 => _4.reasoning, 'optionalAccess', _5 => _5.effort]);
53
- if (typeof effort === "string" && effort !== "none") {
54
- out.reasoning_effort = effort;
57
+ const reasoningPlan = request.reasoning ? _chunkAOFWNWLTcjs.resolveReasoningPlan.call(void 0, {
58
+ intent: _chunkAOFWNWLTcjs.extractReasoningIntent.call(void 0, request),
59
+ model: request.model,
60
+ provider,
61
+ target: "openai-chat",
62
+ requestMaxTokens: request.max_tokens
63
+ }) : void 0;
64
+ if (_optionalChain([reasoningPlan, 'optionalAccess', _4 => _4.kind]) === "level" && reasoningPlan.enabled) {
65
+ out.reasoning_effort = reasoningPlan.effort;
66
+ } else if (request.reasoning) {
67
+ delete out.reasoning_effort;
55
68
  }
56
69
  return out;
57
70
  }
@@ -3,7 +3,7 @@
3
3
 
4
4
 
5
5
 
6
- var _chunkKBM2W6UYcjs = require('./chunk-KBM2W6UY.cjs');
6
+ var _chunkRICPANBYcjs = require('./chunk-RICPANBY.cjs');
7
7
 
8
8
  // src/transformer/transformers/GeminiTransformer.ts
9
9
  var GeminiTransformer = (_class = class {
@@ -43,8 +43,12 @@ var GeminiTransformer = (_class = class {
43
43
  * Transform request from unified format to Gemini format
44
44
  * Also builds the correct URL for the Gemini API
45
45
  */
46
- async transformRequestIn(request, provider, _context) {
47
- const body = _chunkKBM2W6UYcjs.buildRequestBody.call(void 0, request);
46
+ async transformRequestIn(request, provider, context) {
47
+ const body = _chunkRICPANBYcjs.buildRequestBody.call(void 0,
48
+ request,
49
+ provider,
50
+ context.reasoningSourceFormat === this.name
51
+ );
48
52
  const action = request.stream ? "streamGenerateContent?alt=sse" : "generateContent";
49
53
  const url = new URL(`./${request.model}:${action}`, provider.baseUrl);
50
54
  const headers = {};
@@ -64,21 +68,25 @@ var GeminiTransformer = (_class = class {
64
68
  * Transform incoming request to unified format
65
69
  * (For requests coming into the Gemini endpoint)
66
70
  */
67
- async transformRequestOut(request, _context) {
68
- return _chunkKBM2W6UYcjs.transformRequestOut.call(void 0, request);
71
+ async transformRequestOut(request, context) {
72
+ const unifiedRequest = _chunkRICPANBYcjs.transformRequestOut.call(void 0, request);
73
+ if (_optionalChain([unifiedRequest, 'access', _2 => _2.reasoning, 'optionalAccess', _3 => _3.effort])) {
74
+ context.reasoningSourceFormat = this.name;
75
+ }
76
+ return unifiedRequest;
69
77
  }
70
78
  /**
71
79
  * Transform Gemini response to OpenAI-compatible format
72
80
  */
73
81
  async transformResponseOut(response, _context) {
74
- return _chunkKBM2W6UYcjs.transformResponseOut.call(void 0, response, this.name, this.logger);
82
+ return _chunkRICPANBYcjs.transformResponseOut.call(void 0, response, this.name, this.logger);
75
83
  }
76
84
  /**
77
85
  * Transform OpenAI-compatible response back to Gemini format
78
86
  * (For endpoint mode — returning Gemini-format responses to the client)
79
87
  */
80
88
  async transformResponseIn(response, _context) {
81
- return _chunkKBM2W6UYcjs.transformResponseIn.call(void 0, response, this.logger);
89
+ return _chunkRICPANBYcjs.transformResponseIn.call(void 0, response, this.logger);
82
90
  }
83
91
  }, _class.__initStatic(), _class);
84
92
 
@@ -10,12 +10,14 @@ var UsageRecorder = class {
10
10
  this.logger = logger;
11
11
  this.defer = _nullishCoalesce(options.defer, () => ( ((fn) => setTimeout(fn, 0))));
12
12
  this.onRecord = options.onRecord;
13
+ this.onEvent = options.onEvent;
13
14
  }
14
15
 
15
16
 
16
17
 
17
18
 
18
19
 
20
+
19
21
  /**
20
22
  * Record one LLM request. Returns immediately — the actual store insert is
21
23
  * deferred so the caller's response path is unblocked.
@@ -85,6 +87,12 @@ var UsageRecorder = class {
85
87
  ...input.cacheKeySource !== void 0 ? { cacheKeySource: input.cacheKeySource } : {},
86
88
  ...input.cacheKeyInjected !== void 0 ? { cacheKeyInjected: input.cacheKeyInjected } : {}
87
89
  };
90
+ if (this.onEvent) {
91
+ try {
92
+ this.onEvent(row, Date.now());
93
+ } catch (e3) {
94
+ }
95
+ }
88
96
  try {
89
97
  return await this.store.insert(row);
90
98
  } catch (err) {
@@ -118,7 +126,7 @@ var UsageRecorder = class {
118
126
  var safeStringify = (value) => {
119
127
  try {
120
128
  return JSON.stringify(value);
121
- } catch (e3) {
129
+ } catch (e4) {
122
130
  return "";
123
131
  }
124
132
  };
@@ -0,0 +1,150 @@
1
+ // src/usage/throughputTracker.ts
2
+ var THROUGHPUT_RETENTION_MS = 15 * 6e4;
3
+ var THROUGHPUT_SAMPLE_LIMIT = 2e4;
4
+ var THROUGHPUT_WINDOWS_MS = [6e4, 3e5, 9e5];
5
+ var THROUGHPUT_BUCKET_COUNT = 30;
6
+ var COMPACT_THRESHOLD = 1024;
7
+ var UsageThroughputTracker = class {
8
+ samples = [];
9
+ /** Index of the oldest live sample; slots before it are consumed. */
10
+ head = 0;
11
+ startedAt;
12
+ /** Newest ts dropped by the sample CAP (not by retention). Null when none. */
13
+ evictedThroughTs = null;
14
+ constructor(now = Date.now()) {
15
+ this.startedAt = now;
16
+ }
17
+ /** Record one served request. O(1) amortised; never touches disk. */
18
+ record(input, now = Date.now()) {
19
+ this.samples.push({
20
+ ts: input.ts ?? now,
21
+ inputTokens: input.inputTokens,
22
+ outputTokens: input.outputTokens,
23
+ cacheReadTokens: input.cacheReadTokens,
24
+ cacheCreationTokens: input.cacheCreationTokens,
25
+ reasoningTokens: input.reasoningTokens,
26
+ costUsd: input.costUsd
27
+ });
28
+ this.prune(now);
29
+ }
30
+ /** Aggregate every reported window plus the shared trend series. */
31
+ snapshot(now = Date.now()) {
32
+ this.prune(now);
33
+ return {
34
+ available: true,
35
+ collectedAt: now,
36
+ startedAt: this.startedAt,
37
+ retentionMs: THROUGHPUT_RETENTION_MS,
38
+ bucketMs: THROUGHPUT_RETENTION_MS / THROUGHPUT_BUCKET_COUNT,
39
+ windows: THROUGHPUT_WINDOWS_MS.map((windowMs) => this.window(windowMs, now)),
40
+ buckets: this.buckets(now)
41
+ };
42
+ }
43
+ /** Drop all samples (tests / teardown). `startedAt` is unchanged. */
44
+ clear() {
45
+ this.samples = [];
46
+ this.head = 0;
47
+ this.evictedThroughTs = null;
48
+ }
49
+ /**
50
+ * Drop samples past the retention horizon, then enforce the sample cap.
51
+ *
52
+ * Retention pruning uses the CALLER's `now`, which is never later than a
53
+ * subsequent snapshot's `now`, so it can only ever keep MORE than the widest
54
+ * window needs — it can never shave data off the 15-minute window.
55
+ */
56
+ prune(now) {
57
+ const cutoff = now - THROUGHPUT_RETENTION_MS;
58
+ while (this.head < this.samples.length && this.samples[this.head].ts < cutoff) {
59
+ this.head += 1;
60
+ }
61
+ while (this.samples.length - this.head > THROUGHPUT_SAMPLE_LIMIT) {
62
+ const dropped = this.samples[this.head];
63
+ this.evictedThroughTs = this.evictedThroughTs === null ? dropped.ts : Math.max(this.evictedThroughTs, dropped.ts);
64
+ this.head += 1;
65
+ }
66
+ if (this.head >= COMPACT_THRESHOLD) {
67
+ this.samples = this.samples.slice(this.head);
68
+ this.head = 0;
69
+ }
70
+ }
71
+ window(windowMs, now) {
72
+ const startTs = now - windowMs;
73
+ const row = {
74
+ windowMs,
75
+ requests: 0,
76
+ inputTokens: 0,
77
+ outputTokens: 0,
78
+ cacheReadTokens: 0,
79
+ cacheCreationTokens: 0,
80
+ reasoningTokens: 0,
81
+ totalTokens: 0,
82
+ costUsd: 0,
83
+ requestsPerMinute: 0,
84
+ tokensPerMinute: 0,
85
+ inputTokensPerMinute: 0,
86
+ outputTokensPerMinute: 0,
87
+ costUsdPerMinute: 0,
88
+ complete: this.evictedThroughTs === null || this.evictedThroughTs < startTs
89
+ };
90
+ for (let i = this.head; i < this.samples.length; i += 1) {
91
+ const sample = this.samples[i];
92
+ if (sample.ts < startTs) continue;
93
+ row.requests += 1;
94
+ row.inputTokens += sample.inputTokens;
95
+ row.outputTokens += sample.outputTokens;
96
+ row.cacheReadTokens += sample.cacheReadTokens;
97
+ row.cacheCreationTokens += sample.cacheCreationTokens;
98
+ row.reasoningTokens += sample.reasoningTokens;
99
+ row.costUsd += sample.costUsd;
100
+ }
101
+ row.totalTokens = row.inputTokens + row.outputTokens + row.cacheReadTokens + row.cacheCreationTokens;
102
+ const minutes = windowMs / 6e4;
103
+ row.requestsPerMinute = row.requests / minutes;
104
+ row.tokensPerMinute = row.totalTokens / minutes;
105
+ row.inputTokensPerMinute = row.inputTokens / minutes;
106
+ row.outputTokensPerMinute = row.outputTokens / minutes;
107
+ row.costUsdPerMinute = row.costUsd / minutes;
108
+ return row;
109
+ }
110
+ buckets(now) {
111
+ const bucketMs = THROUGHPUT_RETENTION_MS / THROUGHPUT_BUCKET_COUNT;
112
+ const endTs = Math.floor(now / bucketMs) * bucketMs + bucketMs;
113
+ const startTs = endTs - THROUGHPUT_RETENTION_MS;
114
+ const out = [];
115
+ for (let i = 0; i < THROUGHPUT_BUCKET_COUNT; i += 1) {
116
+ out.push({ startTs: startTs + i * bucketMs, requests: 0, tokens: 0 });
117
+ }
118
+ for (let i = this.head; i < this.samples.length; i += 1) {
119
+ const sample = this.samples[i];
120
+ if (sample.ts < startTs || sample.ts >= endTs) continue;
121
+ const bucket = out[Math.floor((sample.ts - startTs) / bucketMs)];
122
+ if (!bucket) continue;
123
+ bucket.requests += 1;
124
+ bucket.tokens += sample.inputTokens + sample.outputTokens + sample.cacheReadTokens + sample.cacheCreationTokens;
125
+ }
126
+ return out;
127
+ }
128
+ };
129
+ var sharedTracker = null;
130
+ function getSharedUsageThroughputTracker() {
131
+ if (!sharedTracker) sharedTracker = new UsageThroughputTracker();
132
+ return sharedTracker;
133
+ }
134
+ function setSharedUsageThroughputTracker(instance) {
135
+ sharedTracker = instance;
136
+ }
137
+ function __resetSharedUsageThroughputTrackerForTests() {
138
+ sharedTracker = null;
139
+ }
140
+
141
+ export {
142
+ THROUGHPUT_RETENTION_MS,
143
+ THROUGHPUT_SAMPLE_LIMIT,
144
+ THROUGHPUT_WINDOWS_MS,
145
+ THROUGHPUT_BUCKET_COUNT,
146
+ UsageThroughputTracker,
147
+ getSharedUsageThroughputTracker,
148
+ setSharedUsageThroughputTracker,
149
+ __resetSharedUsageThroughputTrackerForTests
150
+ };
@@ -0,0 +1,37 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});// src/transformer/transformers/AnthropicTypes.ts
2
+ function getThinkLevel(budgetTokens) {
3
+ if (!budgetTokens || budgetTokens <= 0) return "none";
4
+ if (budgetTokens < 4096) return "low";
5
+ if (budgetTokens < 16384) return "medium";
6
+ return "high";
7
+ }
8
+ function formatBase64(data, mediaType) {
9
+ if (data.startsWith("data:")) return data;
10
+ return `data:${mediaType || "image/png"};base64,${data}`;
11
+ }
12
+ function flattenToolResultContent(content) {
13
+ if (typeof content === "string") return content;
14
+ if (content == null) return "";
15
+ if (!Array.isArray(content)) return JSON.stringify(content);
16
+ const parts = [];
17
+ for (const block of content) {
18
+ if (typeof block === "string") {
19
+ parts.push(block);
20
+ continue;
21
+ }
22
+ if (!block || typeof block !== "object") continue;
23
+ const typed = block;
24
+ if (typed.type === "image" || typed.type === "image_url") {
25
+ parts.push("[image omitted]");
26
+ } else if (typeof typed.text === "string") {
27
+ parts.push(typed.text);
28
+ }
29
+ }
30
+ return parts.filter((text) => text !== "").join("\n");
31
+ }
32
+
33
+
34
+
35
+
36
+
37
+ exports.getThinkLevel = getThinkLevel; exports.formatBase64 = formatBase64; exports.flattenToolResultContent = flattenToolResultContent;