@polka-codes/core 0.10.13 → 0.10.16

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 (250) hide show
  1. package/dist/Agent/backoff.d.ts +7 -0
  2. package/dist/Agent/backoff.js +21 -0
  3. package/dist/Agent/backoff.js.map +1 -0
  4. package/dist/Agent/index.d.ts +2 -0
  5. package/dist/Agent/index.js +3 -0
  6. package/dist/Agent/index.js.map +1 -0
  7. package/dist/Agent/parseJsonFromMarkdown.d.ts +8 -0
  8. package/dist/Agent/parseJsonFromMarkdown.js +34 -0
  9. package/dist/Agent/parseJsonFromMarkdown.js.map +1 -0
  10. package/dist/Agent/parseJsonFromMarkdown.test.d.ts +1 -0
  11. package/dist/Agent/parseJsonFromMarkdown.test.js +70 -0
  12. package/dist/Agent/parseJsonFromMarkdown.test.js.map +1 -0
  13. package/dist/Agent/prompts.d.ts +9 -0
  14. package/dist/Agent/prompts.js +107 -0
  15. package/dist/Agent/prompts.js.map +1 -0
  16. package/dist/UsageMeter.d.ts +101 -0
  17. package/dist/UsageMeter.js +299 -0
  18. package/dist/UsageMeter.js.map +1 -0
  19. package/dist/UsageMeter.test.d.ts +4 -0
  20. package/dist/UsageMeter.test.js +556 -0
  21. package/dist/UsageMeter.test.js.map +1 -0
  22. package/dist/config/base.d.ts +68 -0
  23. package/dist/config/base.js +56 -0
  24. package/dist/config/base.js.map +1 -0
  25. package/dist/config/memory.d.ts +24 -0
  26. package/dist/config/memory.js +36 -0
  27. package/dist/config/memory.js.map +1 -0
  28. package/dist/config.d.ts +236 -0
  29. package/dist/config.js +184 -0
  30. package/dist/config.js.map +1 -0
  31. package/dist/errors/base.d.ts +31 -0
  32. package/dist/errors/base.js +60 -0
  33. package/dist/errors/base.js.map +1 -0
  34. package/dist/errors/index.d.ts +1 -0
  35. package/dist/errors/index.js +3 -0
  36. package/dist/errors/index.js.map +1 -0
  37. package/dist/fs/index.d.ts +2 -0
  38. package/dist/fs/index.js +3 -0
  39. package/dist/fs/index.js.map +1 -0
  40. package/dist/fs/node-provider.d.ts +16 -0
  41. package/dist/fs/node-provider.js +47 -0
  42. package/dist/fs/node-provider.js.map +1 -0
  43. package/dist/fs/provider.d.ts +61 -0
  44. package/dist/fs/provider.js +3 -0
  45. package/dist/fs/provider.js.map +1 -0
  46. package/dist/index.d.ts +20 -191
  47. package/dist/index.js +21 -4123
  48. package/dist/index.js.map +1 -0
  49. package/dist/memory/index.d.ts +1 -0
  50. package/dist/memory/index.js +2 -0
  51. package/dist/memory/index.js.map +1 -0
  52. package/dist/memory/types.d.ts +136 -0
  53. package/dist/memory/types.js +2 -0
  54. package/dist/memory/types.js.map +1 -0
  55. package/dist/path.d.ts +9 -0
  56. package/dist/path.js +68 -0
  57. package/dist/path.js.map +1 -0
  58. package/dist/path.test.d.ts +1 -0
  59. package/dist/path.test.js +82 -0
  60. package/dist/path.test.js.map +1 -0
  61. package/dist/pricing/converter.d.ts +6 -0
  62. package/dist/pricing/converter.js +13 -0
  63. package/dist/pricing/converter.js.map +1 -0
  64. package/dist/pricing/converter.test.d.ts +1 -0
  65. package/dist/pricing/converter.test.js +54 -0
  66. package/dist/pricing/converter.test.js.map +1 -0
  67. package/dist/pricing/index.d.ts +2 -0
  68. package/dist/pricing/index.js +2 -0
  69. package/dist/pricing/index.js.map +1 -0
  70. package/dist/pricing/portkey-client.d.ts +2 -0
  71. package/dist/pricing/portkey-client.js +57 -0
  72. package/dist/pricing/portkey-client.js.map +1 -0
  73. package/dist/pricing/pricing-service.d.ts +6 -0
  74. package/dist/pricing/pricing-service.js +125 -0
  75. package/dist/pricing/pricing-service.js.map +1 -0
  76. package/dist/pricing/pricing-service.test.d.ts +1 -0
  77. package/dist/pricing/pricing-service.test.js +141 -0
  78. package/dist/pricing/pricing-service.test.js.map +1 -0
  79. package/dist/pricing/types.d.ts +24 -0
  80. package/dist/pricing/types.js +2 -0
  81. package/dist/pricing/types.js.map +1 -0
  82. package/dist/skills/__tests__/discovery.test.d.ts +1 -0
  83. package/dist/skills/__tests__/discovery.test.js +254 -0
  84. package/dist/skills/__tests__/discovery.test.js.map +1 -0
  85. package/dist/skills/__tests__/validation.test.d.ts +1 -0
  86. package/dist/skills/__tests__/validation.test.js +221 -0
  87. package/dist/skills/__tests__/validation.test.js.map +1 -0
  88. package/dist/skills/constants.d.ts +32 -0
  89. package/dist/skills/constants.js +50 -0
  90. package/dist/skills/constants.js.map +1 -0
  91. package/dist/skills/discovery.d.ts +56 -0
  92. package/dist/skills/discovery.js +392 -0
  93. package/dist/skills/discovery.js.map +1 -0
  94. package/dist/skills/index.d.ts +4 -0
  95. package/dist/skills/index.js +6 -0
  96. package/dist/skills/index.js.map +1 -0
  97. package/dist/skills/tools/index.d.ts +3 -0
  98. package/dist/skills/tools/index.js +5 -0
  99. package/dist/skills/tools/index.js.map +1 -0
  100. package/dist/skills/tools/listSkills.d.ts +54 -0
  101. package/dist/skills/tools/listSkills.js +52 -0
  102. package/dist/skills/tools/listSkills.js.map +1 -0
  103. package/dist/skills/tools/loadSkill.d.ts +52 -0
  104. package/dist/skills/tools/loadSkill.js +86 -0
  105. package/dist/skills/tools/loadSkill.js.map +1 -0
  106. package/dist/skills/tools/readSkillFile.d.ts +43 -0
  107. package/dist/skills/tools/readSkillFile.js +68 -0
  108. package/dist/skills/tools/readSkillFile.js.map +1 -0
  109. package/dist/skills/types.d.ts +83 -0
  110. package/dist/skills/types.js +42 -0
  111. package/dist/skills/types.js.map +1 -0
  112. package/dist/skills/validation.d.ts +30 -0
  113. package/dist/skills/validation.js +133 -0
  114. package/dist/skills/validation.js.map +1 -0
  115. package/dist/tool.d.ts +51 -0
  116. package/dist/tool.js +2 -0
  117. package/dist/tool.js.map +1 -0
  118. package/dist/tools/askFollowupQuestion.d.ts +35 -0
  119. package/dist/tools/askFollowupQuestion.js +105 -0
  120. package/dist/tools/askFollowupQuestion.js.map +1 -0
  121. package/dist/tools/askFollowupQuestion.test.d.ts +1 -0
  122. package/dist/tools/askFollowupQuestion.test.js +80 -0
  123. package/dist/tools/askFollowupQuestion.test.js.map +1 -0
  124. package/dist/tools/executeCommand.d.ts +29 -0
  125. package/dist/tools/executeCommand.js +82 -0
  126. package/dist/tools/executeCommand.js.map +1 -0
  127. package/dist/tools/executeCommand.test.d.ts +1 -0
  128. package/dist/tools/executeCommand.test.js +60 -0
  129. package/dist/tools/executeCommand.test.js.map +1 -0
  130. package/dist/tools/fetchUrl.d.ts +26 -0
  131. package/dist/tools/fetchUrl.js +85 -0
  132. package/dist/tools/fetchUrl.js.map +1 -0
  133. package/dist/tools/index.d.ts +15 -0
  134. package/dist/tools/index.js +17 -0
  135. package/dist/tools/index.js.map +1 -0
  136. package/dist/tools/listFiles.d.ts +35 -0
  137. package/dist/tools/listFiles.js +61 -0
  138. package/dist/tools/listFiles.js.map +1 -0
  139. package/dist/tools/listFiles.test.d.ts +1 -0
  140. package/dist/tools/listFiles.test.js +59 -0
  141. package/dist/tools/listFiles.test.js.map +1 -0
  142. package/dist/tools/provider.d.ts +76 -0
  143. package/dist/tools/provider.js +60 -0
  144. package/dist/tools/provider.js.map +1 -0
  145. package/dist/tools/readBinaryFile.d.ts +26 -0
  146. package/dist/tools/readBinaryFile.js +52 -0
  147. package/dist/tools/readBinaryFile.js.map +1 -0
  148. package/dist/tools/readFile.d.ts +35 -0
  149. package/dist/tools/readFile.js +128 -0
  150. package/dist/tools/readFile.js.map +1 -0
  151. package/dist/tools/readFile.test.d.ts +1 -0
  152. package/dist/tools/readFile.test.js +37 -0
  153. package/dist/tools/readFile.test.js.map +1 -0
  154. package/dist/tools/removeFile.d.ts +26 -0
  155. package/dist/tools/removeFile.js +49 -0
  156. package/dist/tools/removeFile.js.map +1 -0
  157. package/dist/tools/removeFile.test.d.ts +1 -0
  158. package/dist/tools/removeFile.test.js +32 -0
  159. package/dist/tools/removeFile.test.js.map +1 -0
  160. package/dist/tools/renameFile.d.ts +29 -0
  161. package/dist/tools/renameFile.js +48 -0
  162. package/dist/tools/renameFile.js.map +1 -0
  163. package/dist/tools/renameFile.test.d.ts +1 -0
  164. package/dist/tools/renameFile.test.js +53 -0
  165. package/dist/tools/renameFile.test.js.map +1 -0
  166. package/dist/tools/replaceInFile.d.ts +29 -0
  167. package/dist/tools/replaceInFile.js +233 -0
  168. package/dist/tools/replaceInFile.js.map +1 -0
  169. package/dist/tools/replaceInFile.test.d.ts +1 -0
  170. package/dist/tools/replaceInFile.test.js +79 -0
  171. package/dist/tools/replaceInFile.test.js.map +1 -0
  172. package/dist/tools/response-builders.d.ts +64 -0
  173. package/dist/tools/response-builders.js +88 -0
  174. package/dist/tools/response-builders.js.map +1 -0
  175. package/dist/tools/search.d.ts +26 -0
  176. package/dist/tools/search.js +56 -0
  177. package/dist/tools/search.js.map +1 -0
  178. package/dist/tools/search.test.d.ts +1 -0
  179. package/dist/tools/search.test.js +22 -0
  180. package/dist/tools/search.test.js.map +1 -0
  181. package/dist/tools/searchFiles.d.ts +32 -0
  182. package/dist/tools/searchFiles.js +86 -0
  183. package/dist/tools/searchFiles.js.map +1 -0
  184. package/dist/tools/todo.d.ts +37 -0
  185. package/dist/tools/todo.js +41 -0
  186. package/dist/tools/todo.js.map +1 -0
  187. package/dist/tools/utils/index.d.ts +1 -0
  188. package/dist/tools/utils/index.js +2 -0
  189. package/dist/tools/utils/index.js.map +1 -0
  190. package/dist/tools/utils/replaceInFile.d.ts +7 -0
  191. package/dist/tools/utils/replaceInFile.js +133 -0
  192. package/dist/tools/utils/replaceInFile.js.map +1 -0
  193. package/dist/tools/utils/replaceInFile.test.d.ts +1 -0
  194. package/dist/tools/utils/replaceInFile.test.js +308 -0
  195. package/dist/tools/utils/replaceInFile.test.js.map +1 -0
  196. package/dist/tools/utils.d.ts +10 -0
  197. package/dist/tools/utils.js +27 -0
  198. package/dist/tools/utils.js.map +1 -0
  199. package/dist/tools/writeToFile.d.ts +29 -0
  200. package/dist/tools/writeToFile.js +85 -0
  201. package/dist/tools/writeToFile.js.map +1 -0
  202. package/dist/tools/writeToFile.test.d.ts +1 -0
  203. package/dist/tools/writeToFile.test.js +46 -0
  204. package/dist/tools/writeToFile.test.js.map +1 -0
  205. package/dist/utils/index.d.ts +1 -0
  206. package/dist/utils/index.js +3 -0
  207. package/dist/utils/index.js.map +1 -0
  208. package/dist/utils/merge.d.ts +26 -0
  209. package/dist/utils/merge.js +45 -0
  210. package/dist/utils/merge.js.map +1 -0
  211. package/dist/workflow/agent.workflow.d.ts +39 -0
  212. package/dist/workflow/agent.workflow.js +166 -0
  213. package/dist/workflow/agent.workflow.js.map +1 -0
  214. package/dist/workflow/agent.workflow.test.d.ts +1 -0
  215. package/dist/workflow/agent.workflow.test.js +175 -0
  216. package/dist/workflow/agent.workflow.test.js.map +1 -0
  217. package/dist/workflow/control-flow.test.d.ts +1 -0
  218. package/dist/workflow/control-flow.test.js +323 -0
  219. package/dist/workflow/control-flow.test.js.map +1 -0
  220. package/dist/workflow/dynamic-edge-cases.test.d.ts +1 -0
  221. package/dist/workflow/dynamic-edge-cases.test.js +486 -0
  222. package/dist/workflow/dynamic-edge-cases.test.js.map +1 -0
  223. package/dist/workflow/dynamic-types.d.ts +124 -0
  224. package/dist/workflow/dynamic-types.js +105 -0
  225. package/dist/workflow/dynamic-types.js.map +1 -0
  226. package/dist/workflow/dynamic.d.ts +118 -0
  227. package/dist/workflow/dynamic.js +999 -0
  228. package/dist/workflow/dynamic.js.map +1 -0
  229. package/dist/workflow/index.d.ts +6 -0
  230. package/dist/workflow/index.js +8 -0
  231. package/dist/workflow/index.js.map +1 -0
  232. package/dist/workflow/json-ai-types.d.ts +122 -0
  233. package/dist/workflow/json-ai-types.js +144 -0
  234. package/dist/workflow/json-ai-types.js.map +1 -0
  235. package/dist/workflow/json-schema-conversion.test.d.ts +1 -0
  236. package/dist/workflow/json-schema-conversion.test.js +371 -0
  237. package/dist/workflow/json-schema-conversion.test.js.map +1 -0
  238. package/dist/workflow/try-catch.test.d.ts +1 -0
  239. package/dist/workflow/try-catch.test.js +443 -0
  240. package/dist/workflow/try-catch.test.js.map +1 -0
  241. package/dist/workflow/types.d.ts +103 -0
  242. package/dist/workflow/types.js +17 -0
  243. package/dist/workflow/types.js.map +1 -0
  244. package/dist/workflow/workflow.d.ts +29 -0
  245. package/dist/workflow/workflow.js +57 -0
  246. package/dist/workflow/workflow.js.map +1 -0
  247. package/dist/workflow/workflow.test.d.ts +1 -0
  248. package/dist/workflow/workflow.test.js +189 -0
  249. package/dist/workflow/workflow.test.js.map +1 -0
  250. package/package.json +9 -1
@@ -0,0 +1,299 @@
1
+ /**
2
+ * UsageMeter class for tracking API usage metrics
3
+ * Generated by polka.codes
4
+ */
5
+ // Zero pricing fallback constant
6
+ const ZERO_PRICING = {
7
+ inputPrice: 0,
8
+ outputPrice: 0,
9
+ cacheWritesPrice: 0,
10
+ cacheReadsPrice: 0,
11
+ };
12
+ // Token pricing divisor (tokens are priced per 1M tokens)
13
+ const TOKENS_PER_UNIT = 1_000_000;
14
+ // Maximum number of provider metadata entries to store (prevents unbounded growth)
15
+ const MAX_METADATA_ENTRIES = 1_000;
16
+ /**
17
+ * Tracks token / cost usage across any mix of LLM models.
18
+ * Supports optional caps on total messages and total cost.
19
+ */
20
+ export class UsageMeter {
21
+ #totals = { input: 0, output: 0, cachedRead: 0, cost: 0, messageCount: 0 };
22
+ #providerMetadataEntries = [];
23
+ #pendingUpdates = new Set();
24
+ #modelInfos;
25
+ #maxMessages;
26
+ #maxCost;
27
+ #pricingService;
28
+ constructor(modelInfos = {}, opts = {}) {
29
+ const infos = {};
30
+ for (const [provider, providerInfo] of Object.entries(modelInfos)) {
31
+ for (const [model, modelInfo] of Object.entries(providerInfo)) {
32
+ // make google-vertex to google
33
+ // and unify modelId
34
+ infos[`${provider.split('-')[0]}:${model.replace(/[.-]/g, '')}`] = {
35
+ inputPrice: modelInfo.inputPrice ?? 0,
36
+ outputPrice: modelInfo.outputPrice ?? 0,
37
+ cacheWritesPrice: modelInfo.cacheWritesPrice ?? 0,
38
+ cacheReadsPrice: modelInfo.cacheReadsPrice ?? 0,
39
+ };
40
+ }
41
+ }
42
+ this.#modelInfos = infos;
43
+ this.#maxMessages = opts.maxMessages ?? 1000;
44
+ this.#maxCost = opts.maxCost ?? 100;
45
+ this.#pricingService = opts.pricingService;
46
+ }
47
+ #calculateUsageV3(usage, providerMetadata, modelInfo) {
48
+ if (!usage?.inputTokens || !usage?.outputTokens) {
49
+ return { input: 0, output: 0, cachedRead: 0, cost: 0 };
50
+ }
51
+ const providerMetadataKey = Object.keys(providerMetadata ?? {})[0];
52
+ const metadata = (providerMetadata?.[providerMetadataKey] ?? {});
53
+ // V3 provider format: inputTokens: { total, noCache, cacheRead, cacheWrite }
54
+ const inputTokens = usage.inputTokens.noCache ?? usage.inputTokens.total ?? 0;
55
+ const cachedReadTokens = usage.inputTokens.cacheRead ?? 0;
56
+ const cachedWriteTokens = usage.inputTokens.cacheWrite ?? 0;
57
+ const outputTokens = usage.outputTokens.total ?? usage.outputTokens.text ?? 0;
58
+ return this.#calculateCost(inputTokens, outputTokens, cachedReadTokens, cachedWriteTokens, providerMetadataKey, metadata, modelInfo);
59
+ }
60
+ #calculateUsageAiPackage(usage, providerMetadata, modelInfo) {
61
+ if (!usage?.inputTokens || !usage?.outputTokens) {
62
+ return { input: 0, output: 0, cachedRead: 0, cost: 0 };
63
+ }
64
+ const providerMetadataKey = Object.keys(providerMetadata ?? {})[0];
65
+ const metadata = (providerMetadata?.[providerMetadataKey] ?? {});
66
+ // AI package format: inputTokens: number, inputTokenDetails: { noCacheTokens, cacheReadTokens, cacheWriteTokens }
67
+ const details = usage.inputTokenDetails;
68
+ const outputDetails = usage.outputTokenDetails;
69
+ const inputTokens = details?.noCacheTokens ?? usage.inputTokens ?? 0;
70
+ const cachedReadTokens = details?.cacheReadTokens ?? 0;
71
+ const cachedWriteTokens = details?.cacheWriteTokens ?? 0;
72
+ const outputTokens = outputDetails?.textTokens ?? usage.outputTokens ?? 0;
73
+ return this.#calculateCost(inputTokens, outputTokens, cachedReadTokens, cachedWriteTokens, providerMetadataKey, metadata, modelInfo);
74
+ }
75
+ #calculateCost(inputTokens, outputTokens, cachedReadTokens, cachedWriteTokens, providerMetadataKey, metadata, modelInfo) {
76
+ const getNumber = (obj, key) => {
77
+ const value = obj[key];
78
+ return typeof value === 'number' ? value : undefined;
79
+ };
80
+ switch (providerMetadataKey) {
81
+ case 'openrouter': {
82
+ const usage = metadata.usage;
83
+ const cost = typeof usage === 'object' && usage !== null && 'cost' in usage && typeof usage.cost === 'number' ? usage.cost : 0;
84
+ return {
85
+ input: inputTokens,
86
+ output: outputTokens,
87
+ cachedRead: cachedReadTokens,
88
+ cost,
89
+ };
90
+ }
91
+ case 'anthropic': {
92
+ const cacheWrite = getNumber(metadata, 'promptCacheMissTokens') ?? cachedWriteTokens;
93
+ return {
94
+ input: inputTokens + cacheWrite + cachedReadTokens,
95
+ output: outputTokens,
96
+ cachedRead: cachedReadTokens,
97
+ cost: (inputTokens * modelInfo.inputPrice +
98
+ outputTokens * modelInfo.outputPrice +
99
+ cacheWrite * modelInfo.cacheWritesPrice +
100
+ cachedReadTokens * modelInfo.cacheReadsPrice) /
101
+ TOKENS_PER_UNIT,
102
+ };
103
+ }
104
+ case 'deepseek': {
105
+ const cacheWrite = getNumber(metadata, 'promptCacheMissTokens') ?? cachedWriteTokens;
106
+ return {
107
+ input: inputTokens,
108
+ output: outputTokens,
109
+ cachedRead: cachedReadTokens,
110
+ cost: (outputTokens * modelInfo.outputPrice + cacheWrite * modelInfo.inputPrice + cachedReadTokens * modelInfo.cacheReadsPrice) /
111
+ TOKENS_PER_UNIT,
112
+ };
113
+ }
114
+ default: {
115
+ return {
116
+ input: inputTokens,
117
+ output: outputTokens,
118
+ cachedRead: cachedReadTokens,
119
+ cost: (inputTokens * modelInfo.inputPrice + outputTokens * modelInfo.outputPrice) / TOKENS_PER_UNIT,
120
+ };
121
+ }
122
+ }
123
+ }
124
+ addUsage(llm, resp, options = {}) {
125
+ const provider = llm.provider.split('.')[0];
126
+ const normalizedModel = llm.modelId.replace(/[.-]/g, '');
127
+ const key = `${provider}:${normalizedModel}`;
128
+ let modelInfo = options.modelInfo ?? this.#modelInfos[key];
129
+ // Lazy fetch from PricingService if not found (async but non-blocking)
130
+ const updatePromise = (async () => {
131
+ try {
132
+ if (!modelInfo && this.#pricingService) {
133
+ modelInfo = await this.#pricingService.getPricing(provider, llm.modelId);
134
+ this.#modelInfos[key] = modelInfo;
135
+ }
136
+ }
137
+ catch {
138
+ modelInfo = ZERO_PRICING;
139
+ }
140
+ modelInfo = modelInfo ?? ZERO_PRICING;
141
+ // Determine usage format and calculate
142
+ const usage = 'totalUsage' in resp ? resp.totalUsage : resp.usage;
143
+ let result;
144
+ if ('inputTokenDetails' in usage || typeof usage.inputTokens === 'number') {
145
+ // AI package format
146
+ result = this.#calculateUsageAiPackage(usage, resp.providerMetadata, modelInfo);
147
+ }
148
+ else {
149
+ // V3 provider format
150
+ result = this.#calculateUsageV3(usage, resp.providerMetadata, modelInfo);
151
+ }
152
+ this.#totals.input += result.input;
153
+ this.#totals.output += result.output;
154
+ this.#totals.cachedRead += result.cachedRead;
155
+ this.#totals.cost += result.cost;
156
+ this.#totals.messageCount += 1;
157
+ // Store provider metadata for analytics
158
+ if (resp.providerMetadata && Object.keys(resp.providerMetadata).length > 0) {
159
+ const providerKey = Object.keys(resp.providerMetadata)[0] || llm.provider;
160
+ const metadata = resp.providerMetadata[providerKey];
161
+ // Type guard: ensure metadata is an object before storing
162
+ if (typeof metadata === 'object' && metadata !== null && !Array.isArray(metadata)) {
163
+ this.#providerMetadataEntries.push({
164
+ provider: providerKey,
165
+ model: llm.modelId,
166
+ metadata: metadata,
167
+ timestamp: Date.now(),
168
+ });
169
+ }
170
+ // Prevent unbounded growth of metadata entries (remove oldest in-place)
171
+ if (this.#providerMetadataEntries.length > MAX_METADATA_ENTRIES) {
172
+ this.#providerMetadataEntries.splice(0, this.#providerMetadataEntries.length - MAX_METADATA_ENTRIES);
173
+ }
174
+ }
175
+ })();
176
+ // Track pending update
177
+ this.#pendingUpdates.add(updatePromise);
178
+ updatePromise.finally(() => {
179
+ this.#pendingUpdates.delete(updatePromise);
180
+ });
181
+ return updatePromise;
182
+ }
183
+ /** Override the running totals (e.g., restore from saved state). */
184
+ setUsage(newUsage, options = {}) {
185
+ if (newUsage.input != null)
186
+ this.#totals.input = newUsage.input;
187
+ if (newUsage.output != null)
188
+ this.#totals.output = newUsage.output;
189
+ if (newUsage.cachedRead != null)
190
+ this.#totals.cachedRead = newUsage.cachedRead;
191
+ if (newUsage.cost != null)
192
+ this.#totals.cost = newUsage.cost;
193
+ if (newUsage.messageCount != null)
194
+ this.#totals.messageCount = newUsage.messageCount;
195
+ if (options.clearMetadata) {
196
+ this.#providerMetadataEntries = [];
197
+ }
198
+ }
199
+ /** Manually bump the message count (useful if you record some messages without token info). */
200
+ incrementMessageCount(n = 1) {
201
+ this.#totals.messageCount += n;
202
+ }
203
+ /** Reset the running totals. */
204
+ resetUsage() {
205
+ this.#totals = { input: 0, output: 0, cachedRead: 0, cost: 0, messageCount: 0 };
206
+ this.#providerMetadataEntries = [];
207
+ }
208
+ /** Return true once either messages or cost exceed the configured caps. */
209
+ isLimitExceeded() {
210
+ const messageCount = this.#maxMessages > 0 && this.#totals.messageCount >= this.#maxMessages;
211
+ const cost = this.#maxCost > 0 && this.#totals.cost >= this.#maxCost;
212
+ return {
213
+ messageCount,
214
+ maxMessages: this.#maxMessages,
215
+ cost,
216
+ maxCost: this.#maxCost,
217
+ result: messageCount || cost,
218
+ };
219
+ }
220
+ /** Same as isLimitExceeded but throws an error if a limit is hit. */
221
+ checkLimit() {
222
+ const result = this.isLimitExceeded();
223
+ if (result.result) {
224
+ throw new Error(`Usage limit exceeded. Message count: ${result.messageCount}/${result.maxMessages}, cost: ${result.cost}/${result.maxCost}`);
225
+ }
226
+ }
227
+ /** Getter for the aggregated totals (immutable copy). */
228
+ get usage() {
229
+ return { ...this.#totals };
230
+ }
231
+ /** Getter for provider metadata entries (immutable copy). */
232
+ get providerMetadata() {
233
+ return [...this.#providerMetadataEntries];
234
+ }
235
+ /** Calculate cache statistics from stored metadata entries. */
236
+ get cacheStats() {
237
+ const entries = this.#providerMetadataEntries;
238
+ const totalRequests = entries.length;
239
+ let totalCachedTokens = 0;
240
+ let requestsWithCache = 0;
241
+ for (const entry of entries) {
242
+ const metadata = entry.metadata;
243
+ // Check for cache hit fields only (NOT cache misses)
244
+ // OpenAI: cachedPromptTokens
245
+ // Anthropic: cacheReadTokens (prompt_cache_hit_tokens in newer versions)
246
+ // DeepSeek: prompt_cache_hit_tokens (if available)
247
+ const getValueAsNumber = (key) => {
248
+ const value = metadata[key];
249
+ return typeof value === 'number' ? value : undefined;
250
+ };
251
+ const cachedTokens = getValueAsNumber('cachedPromptTokens') ?? getValueAsNumber('cacheReadTokens') ?? getValueAsNumber('prompt_cache_hit_tokens') ?? 0;
252
+ if (cachedTokens > 0) {
253
+ totalCachedTokens += cachedTokens;
254
+ requestsWithCache++;
255
+ }
256
+ }
257
+ const cacheHitRate = totalRequests > 0 ? requestsWithCache / totalRequests : 0;
258
+ return {
259
+ totalCachedTokens,
260
+ totalRequests,
261
+ requestsWithCache,
262
+ cacheHitRate,
263
+ entries: [...this.#providerMetadataEntries],
264
+ };
265
+ }
266
+ /** Clear stored provider metadata entries. */
267
+ clearProviderMetadata() {
268
+ this.#providerMetadataEntries = [];
269
+ }
270
+ /** Merge another UsageMeter's totals into this one. */
271
+ merge(other) {
272
+ const otherUsage = other.usage;
273
+ this.#totals.input += otherUsage.input;
274
+ this.#totals.output += otherUsage.output;
275
+ this.#totals.cachedRead += otherUsage.cachedRead;
276
+ this.#totals.cost += otherUsage.cost;
277
+ this.#totals.messageCount += otherUsage.messageCount;
278
+ this.#providerMetadataEntries.push(...other.providerMetadata);
279
+ }
280
+ /** Wait for all pending usage updates to complete. */
281
+ async waitForPending() {
282
+ const pending = Array.from(this.#pendingUpdates);
283
+ // Use allSettled to ensure we don't crash if any promise rejects
284
+ await Promise.allSettled(pending);
285
+ }
286
+ getUsageText() {
287
+ const u = this.usage;
288
+ return `Usage - messages: ${u.messageCount}, input: ${u.input}, cached: ${u.cachedRead}, output: ${u.output}, cost: $${u.cost.toFixed(4)}`;
289
+ }
290
+ onFinishHandler(llm) {
291
+ // Returns an async function that updates usage tracking.
292
+ // Note: The AI SDK's onFinish callback is fire-and-forget and doesn't await
293
+ // the result, so this is safe even though addUsage is async.
294
+ return async (evt) => {
295
+ await this.addUsage(llm, evt);
296
+ };
297
+ }
298
+ }
299
+ //# sourceMappingURL=UsageMeter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UsageMeter.js","sourceRoot":"","sources":["../src/UsageMeter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Tests for UsageMeter cache metadata storage
3
+ */
4
+ export {};