@antseed/node 0.1.0

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 (443) hide show
  1. package/README.md +411 -0
  2. package/contracts/AntseedEscrow.sol +310 -0
  3. package/contracts/MockUSDC.sol +64 -0
  4. package/contracts/README.md +102 -0
  5. package/dist/config/encryption.d.ts +17 -0
  6. package/dist/config/encryption.d.ts.map +1 -0
  7. package/dist/config/encryption.js +49 -0
  8. package/dist/config/encryption.js.map +1 -0
  9. package/dist/config/plugin-config-manager.d.ts +31 -0
  10. package/dist/config/plugin-config-manager.d.ts.map +1 -0
  11. package/dist/config/plugin-config-manager.js +135 -0
  12. package/dist/config/plugin-config-manager.js.map +1 -0
  13. package/dist/config/plugin-loader.d.ts +25 -0
  14. package/dist/config/plugin-loader.d.ts.map +1 -0
  15. package/dist/config/plugin-loader.js +64 -0
  16. package/dist/config/plugin-loader.js.map +1 -0
  17. package/dist/discovery/announcer.d.ts +44 -0
  18. package/dist/discovery/announcer.d.ts.map +1 -0
  19. package/dist/discovery/announcer.js +129 -0
  20. package/dist/discovery/announcer.js.map +1 -0
  21. package/dist/discovery/bootstrap.d.ts +13 -0
  22. package/dist/discovery/bootstrap.d.ts.map +1 -0
  23. package/dist/discovery/bootstrap.js +39 -0
  24. package/dist/discovery/bootstrap.js.map +1 -0
  25. package/dist/discovery/default-metadata-resolver.d.ts +16 -0
  26. package/dist/discovery/default-metadata-resolver.d.ts.map +1 -0
  27. package/dist/discovery/default-metadata-resolver.js +16 -0
  28. package/dist/discovery/default-metadata-resolver.js.map +1 -0
  29. package/dist/discovery/dht-health.d.ts +38 -0
  30. package/dist/discovery/dht-health.d.ts.map +1 -0
  31. package/dist/discovery/dht-health.js +101 -0
  32. package/dist/discovery/dht-health.js.map +1 -0
  33. package/dist/discovery/dht-node.d.ts +34 -0
  34. package/dist/discovery/dht-node.d.ts.map +1 -0
  35. package/dist/discovery/dht-node.js +168 -0
  36. package/dist/discovery/dht-node.js.map +1 -0
  37. package/dist/discovery/http-metadata-resolver.d.ts +15 -0
  38. package/dist/discovery/http-metadata-resolver.d.ts.map +1 -0
  39. package/dist/discovery/http-metadata-resolver.js +33 -0
  40. package/dist/discovery/http-metadata-resolver.js.map +1 -0
  41. package/dist/discovery/index.d.ts +16 -0
  42. package/dist/discovery/index.d.ts.map +1 -0
  43. package/dist/discovery/index.js +15 -0
  44. package/dist/discovery/index.js.map +1 -0
  45. package/dist/discovery/metadata-codec.d.ts +22 -0
  46. package/dist/discovery/metadata-codec.d.ts.map +1 -0
  47. package/dist/discovery/metadata-codec.js +390 -0
  48. package/dist/discovery/metadata-codec.js.map +1 -0
  49. package/dist/discovery/metadata-resolver.d.ts +9 -0
  50. package/dist/discovery/metadata-resolver.d.ts.map +1 -0
  51. package/dist/discovery/metadata-resolver.js +2 -0
  52. package/dist/discovery/metadata-resolver.js.map +1 -0
  53. package/dist/discovery/metadata-server.d.ts +16 -0
  54. package/dist/discovery/metadata-server.d.ts.map +1 -0
  55. package/dist/discovery/metadata-server.js +59 -0
  56. package/dist/discovery/metadata-server.js.map +1 -0
  57. package/dist/discovery/metadata-validator.d.ts +12 -0
  58. package/dist/discovery/metadata-validator.d.ts.map +1 -0
  59. package/dist/discovery/metadata-validator.js +153 -0
  60. package/dist/discovery/metadata-validator.js.map +1 -0
  61. package/dist/discovery/peer-lookup.d.ts +26 -0
  62. package/dist/discovery/peer-lookup.d.ts.map +1 -0
  63. package/dist/discovery/peer-lookup.js +86 -0
  64. package/dist/discovery/peer-lookup.js.map +1 -0
  65. package/dist/discovery/peer-metadata.d.ts +31 -0
  66. package/dist/discovery/peer-metadata.d.ts.map +1 -0
  67. package/dist/discovery/peer-metadata.js +2 -0
  68. package/dist/discovery/peer-metadata.js.map +1 -0
  69. package/dist/discovery/peer-selector.d.ts +33 -0
  70. package/dist/discovery/peer-selector.d.ts.map +1 -0
  71. package/dist/discovery/peer-selector.js +80 -0
  72. package/dist/discovery/peer-selector.js.map +1 -0
  73. package/dist/discovery/profile-manager.d.ts +50 -0
  74. package/dist/discovery/profile-manager.d.ts.map +1 -0
  75. package/dist/discovery/profile-manager.js +105 -0
  76. package/dist/discovery/profile-manager.js.map +1 -0
  77. package/dist/discovery/profile-search.d.ts +27 -0
  78. package/dist/discovery/profile-search.d.ts.map +1 -0
  79. package/dist/discovery/profile-search.js +75 -0
  80. package/dist/discovery/profile-search.js.map +1 -0
  81. package/dist/discovery/reputation-verifier.d.ts +25 -0
  82. package/dist/discovery/reputation-verifier.d.ts.map +1 -0
  83. package/dist/discovery/reputation-verifier.js +27 -0
  84. package/dist/discovery/reputation-verifier.js.map +1 -0
  85. package/dist/index.d.ts +37 -0
  86. package/dist/index.d.ts.map +1 -0
  87. package/dist/index.js +32 -0
  88. package/dist/index.js.map +1 -0
  89. package/dist/interfaces/buyer-router.d.ts +21 -0
  90. package/dist/interfaces/buyer-router.d.ts.map +1 -0
  91. package/dist/interfaces/buyer-router.js +2 -0
  92. package/dist/interfaces/buyer-router.js.map +1 -0
  93. package/dist/interfaces/plugin.d.ts +31 -0
  94. package/dist/interfaces/plugin.d.ts.map +1 -0
  95. package/dist/interfaces/plugin.js +2 -0
  96. package/dist/interfaces/plugin.js.map +1 -0
  97. package/dist/interfaces/seller-provider.d.ts +69 -0
  98. package/dist/interfaces/seller-provider.d.ts.map +1 -0
  99. package/dist/interfaces/seller-provider.js +2 -0
  100. package/dist/interfaces/seller-provider.js.map +1 -0
  101. package/dist/metering/index.d.ts +7 -0
  102. package/dist/metering/index.d.ts.map +1 -0
  103. package/dist/metering/index.js +7 -0
  104. package/dist/metering/index.js.map +1 -0
  105. package/dist/metering/receipt-generator.d.ts +49 -0
  106. package/dist/metering/receipt-generator.d.ts.map +1 -0
  107. package/dist/metering/receipt-generator.js +74 -0
  108. package/dist/metering/receipt-generator.js.map +1 -0
  109. package/dist/metering/receipt-verifier.d.ts +52 -0
  110. package/dist/metering/receipt-verifier.d.ts.map +1 -0
  111. package/dist/metering/receipt-verifier.js +63 -0
  112. package/dist/metering/receipt-verifier.js.map +1 -0
  113. package/dist/metering/session-tracker.d.ts +59 -0
  114. package/dist/metering/session-tracker.d.ts.map +1 -0
  115. package/dist/metering/session-tracker.js +119 -0
  116. package/dist/metering/session-tracker.js.map +1 -0
  117. package/dist/metering/storage.d.ts +72 -0
  118. package/dist/metering/storage.d.ts.map +1 -0
  119. package/dist/metering/storage.js +446 -0
  120. package/dist/metering/storage.js.map +1 -0
  121. package/dist/metering/token-counter.d.ts +50 -0
  122. package/dist/metering/token-counter.d.ts.map +1 -0
  123. package/dist/metering/token-counter.js +96 -0
  124. package/dist/metering/token-counter.js.map +1 -0
  125. package/dist/metering/usage-aggregator.d.ts +46 -0
  126. package/dist/metering/usage-aggregator.d.ts.map +1 -0
  127. package/dist/metering/usage-aggregator.js +170 -0
  128. package/dist/metering/usage-aggregator.js.map +1 -0
  129. package/dist/node.d.ts +179 -0
  130. package/dist/node.d.ts.map +1 -0
  131. package/dist/node.js +1328 -0
  132. package/dist/node.js.map +1 -0
  133. package/dist/p2p/connection-auth.d.ts +35 -0
  134. package/dist/p2p/connection-auth.d.ts.map +1 -0
  135. package/dist/p2p/connection-auth.js +102 -0
  136. package/dist/p2p/connection-auth.js.map +1 -0
  137. package/dist/p2p/connection-manager.d.ts +101 -0
  138. package/dist/p2p/connection-manager.d.ts.map +1 -0
  139. package/dist/p2p/connection-manager.js +726 -0
  140. package/dist/p2p/connection-manager.js.map +1 -0
  141. package/dist/p2p/handshake.d.ts +47 -0
  142. package/dist/p2p/handshake.d.ts.map +1 -0
  143. package/dist/p2p/handshake.js +107 -0
  144. package/dist/p2p/handshake.js.map +1 -0
  145. package/dist/p2p/ice-config.d.ts +27 -0
  146. package/dist/p2p/ice-config.d.ts.map +1 -0
  147. package/dist/p2p/ice-config.js +43 -0
  148. package/dist/p2p/ice-config.js.map +1 -0
  149. package/dist/p2p/identity.d.ts +27 -0
  150. package/dist/p2p/identity.d.ts.map +1 -0
  151. package/dist/p2p/identity.js +76 -0
  152. package/dist/p2p/identity.js.map +1 -0
  153. package/dist/p2p/index.d.ts +12 -0
  154. package/dist/p2p/index.d.ts.map +1 -0
  155. package/dist/p2p/index.js +11 -0
  156. package/dist/p2p/index.js.map +1 -0
  157. package/dist/p2p/keepalive.d.ts +49 -0
  158. package/dist/p2p/keepalive.d.ts.map +1 -0
  159. package/dist/p2p/keepalive.js +93 -0
  160. package/dist/p2p/keepalive.js.map +1 -0
  161. package/dist/p2p/message-protocol.d.ts +50 -0
  162. package/dist/p2p/message-protocol.d.ts.map +1 -0
  163. package/dist/p2p/message-protocol.js +134 -0
  164. package/dist/p2p/message-protocol.js.map +1 -0
  165. package/dist/p2p/nat-traversal.d.ts +51 -0
  166. package/dist/p2p/nat-traversal.d.ts.map +1 -0
  167. package/dist/p2p/nat-traversal.js +135 -0
  168. package/dist/p2p/nat-traversal.js.map +1 -0
  169. package/dist/p2p/payment-codec.d.ts +20 -0
  170. package/dist/p2p/payment-codec.d.ts.map +1 -0
  171. package/dist/p2p/payment-codec.js +130 -0
  172. package/dist/p2p/payment-codec.js.map +1 -0
  173. package/dist/p2p/payment-mux.d.ts +49 -0
  174. package/dist/p2p/payment-mux.d.ts.map +1 -0
  175. package/dist/p2p/payment-mux.js +131 -0
  176. package/dist/p2p/payment-mux.js.map +1 -0
  177. package/dist/p2p/reconnect.d.ts +48 -0
  178. package/dist/p2p/reconnect.d.ts.map +1 -0
  179. package/dist/p2p/reconnect.js +89 -0
  180. package/dist/p2p/reconnect.js.map +1 -0
  181. package/dist/payments/balance-manager.d.ts +17 -0
  182. package/dist/payments/balance-manager.d.ts.map +1 -0
  183. package/dist/payments/balance-manager.js +54 -0
  184. package/dist/payments/balance-manager.js.map +1 -0
  185. package/dist/payments/buyer-payment-manager.d.ts +122 -0
  186. package/dist/payments/buyer-payment-manager.d.ts.map +1 -0
  187. package/dist/payments/buyer-payment-manager.js +280 -0
  188. package/dist/payments/buyer-payment-manager.js.map +1 -0
  189. package/dist/payments/disputes.d.ts +18 -0
  190. package/dist/payments/disputes.d.ts.map +1 -0
  191. package/dist/payments/disputes.js +47 -0
  192. package/dist/payments/disputes.js.map +1 -0
  193. package/dist/payments/evm/escrow-client.d.ts +61 -0
  194. package/dist/payments/evm/escrow-client.d.ts.map +1 -0
  195. package/dist/payments/evm/escrow-client.js +170 -0
  196. package/dist/payments/evm/escrow-client.js.map +1 -0
  197. package/dist/payments/evm/keypair.d.ts +21 -0
  198. package/dist/payments/evm/keypair.d.ts.map +1 -0
  199. package/dist/payments/evm/keypair.js +29 -0
  200. package/dist/payments/evm/keypair.js.map +1 -0
  201. package/dist/payments/evm/signatures.d.ts +11 -0
  202. package/dist/payments/evm/signatures.d.ts.map +1 -0
  203. package/dist/payments/evm/signatures.js +56 -0
  204. package/dist/payments/evm/signatures.js.map +1 -0
  205. package/dist/payments/evm/wallet.d.ts +5 -0
  206. package/dist/payments/evm/wallet.d.ts.map +1 -0
  207. package/dist/payments/evm/wallet.js +31 -0
  208. package/dist/payments/evm/wallet.js.map +1 -0
  209. package/dist/payments/index.d.ts +13 -0
  210. package/dist/payments/index.d.ts.map +1 -0
  211. package/dist/payments/index.js +14 -0
  212. package/dist/payments/index.js.map +1 -0
  213. package/dist/payments/settlement.d.ts +6 -0
  214. package/dist/payments/settlement.d.ts.map +1 -0
  215. package/dist/payments/settlement.js +25 -0
  216. package/dist/payments/settlement.js.map +1 -0
  217. package/dist/payments/types.d.ts +66 -0
  218. package/dist/payments/types.d.ts.map +1 -0
  219. package/dist/payments/types.js +2 -0
  220. package/dist/payments/types.js.map +1 -0
  221. package/dist/proxy/index.d.ts +4 -0
  222. package/dist/proxy/index.d.ts.map +1 -0
  223. package/dist/proxy/index.js +4 -0
  224. package/dist/proxy/index.js.map +1 -0
  225. package/dist/proxy/provider-detection.d.ts +20 -0
  226. package/dist/proxy/provider-detection.d.ts.map +1 -0
  227. package/dist/proxy/provider-detection.js +61 -0
  228. package/dist/proxy/provider-detection.js.map +1 -0
  229. package/dist/proxy/proxy-mux.d.ts +35 -0
  230. package/dist/proxy/proxy-mux.d.ts.map +1 -0
  231. package/dist/proxy/proxy-mux.js +137 -0
  232. package/dist/proxy/proxy-mux.js.map +1 -0
  233. package/dist/proxy/request-codec.d.ts +33 -0
  234. package/dist/proxy/request-codec.d.ts.map +1 -0
  235. package/dist/proxy/request-codec.js +238 -0
  236. package/dist/proxy/request-codec.js.map +1 -0
  237. package/dist/reputation/index.d.ts +7 -0
  238. package/dist/reputation/index.d.ts.map +1 -0
  239. package/dist/reputation/index.js +6 -0
  240. package/dist/reputation/index.js.map +1 -0
  241. package/dist/reputation/rating-manager.d.ts +20 -0
  242. package/dist/reputation/rating-manager.d.ts.map +1 -0
  243. package/dist/reputation/rating-manager.js +91 -0
  244. package/dist/reputation/rating-manager.js.map +1 -0
  245. package/dist/reputation/report-manager.d.ts +21 -0
  246. package/dist/reputation/report-manager.d.ts.map +1 -0
  247. package/dist/reputation/report-manager.js +70 -0
  248. package/dist/reputation/report-manager.js.map +1 -0
  249. package/dist/reputation/trust-engine.d.ts +36 -0
  250. package/dist/reputation/trust-engine.d.ts.map +1 -0
  251. package/dist/reputation/trust-engine.js +95 -0
  252. package/dist/reputation/trust-engine.js.map +1 -0
  253. package/dist/reputation/trust-score.d.ts +43 -0
  254. package/dist/reputation/trust-score.d.ts.map +1 -0
  255. package/dist/reputation/trust-score.js +34 -0
  256. package/dist/reputation/trust-score.js.map +1 -0
  257. package/dist/reputation/uptime-tracker.d.ts +51 -0
  258. package/dist/reputation/uptime-tracker.d.ts.map +1 -0
  259. package/dist/reputation/uptime-tracker.js +123 -0
  260. package/dist/reputation/uptime-tracker.js.map +1 -0
  261. package/dist/routing/default-router.d.ts +21 -0
  262. package/dist/routing/default-router.d.ts.map +1 -0
  263. package/dist/routing/default-router.js +60 -0
  264. package/dist/routing/default-router.js.map +1 -0
  265. package/dist/types/buyer.d.ts +36 -0
  266. package/dist/types/buyer.d.ts.map +1 -0
  267. package/dist/types/buyer.js +2 -0
  268. package/dist/types/buyer.js.map +1 -0
  269. package/dist/types/capability.d.ts +25 -0
  270. package/dist/types/capability.d.ts.map +1 -0
  271. package/dist/types/capability.js +2 -0
  272. package/dist/types/capability.js.map +1 -0
  273. package/dist/types/connection.d.ts +27 -0
  274. package/dist/types/connection.d.ts.map +1 -0
  275. package/dist/types/connection.js +11 -0
  276. package/dist/types/connection.js.map +1 -0
  277. package/dist/types/http.d.ts +19 -0
  278. package/dist/types/http.d.ts.map +1 -0
  279. package/dist/types/http.js +2 -0
  280. package/dist/types/http.js.map +1 -0
  281. package/dist/types/index.d.ts +15 -0
  282. package/dist/types/index.d.ts.map +1 -0
  283. package/dist/types/index.js +15 -0
  284. package/dist/types/index.js.map +1 -0
  285. package/dist/types/metering.d.ts +170 -0
  286. package/dist/types/metering.d.ts.map +1 -0
  287. package/dist/types/metering.js +2 -0
  288. package/dist/types/metering.js.map +1 -0
  289. package/dist/types/peer-profile.d.ts +24 -0
  290. package/dist/types/peer-profile.d.ts.map +1 -0
  291. package/dist/types/peer-profile.js +2 -0
  292. package/dist/types/peer-profile.js.map +1 -0
  293. package/dist/types/peer.d.ts +56 -0
  294. package/dist/types/peer.d.ts.map +1 -0
  295. package/dist/types/peer.js +11 -0
  296. package/dist/types/peer.js.map +1 -0
  297. package/dist/types/plugin-config.d.ts +31 -0
  298. package/dist/types/plugin-config.d.ts.map +1 -0
  299. package/dist/types/plugin-config.js +2 -0
  300. package/dist/types/plugin-config.js.map +1 -0
  301. package/dist/types/protocol.d.ts +141 -0
  302. package/dist/types/protocol.d.ts.map +1 -0
  303. package/dist/types/protocol.js +42 -0
  304. package/dist/types/protocol.js.map +1 -0
  305. package/dist/types/provider.d.ts +38 -0
  306. package/dist/types/provider.d.ts.map +1 -0
  307. package/dist/types/provider.js +11 -0
  308. package/dist/types/provider.js.map +1 -0
  309. package/dist/types/rating.d.ts +21 -0
  310. package/dist/types/rating.d.ts.map +1 -0
  311. package/dist/types/rating.js +2 -0
  312. package/dist/types/rating.js.map +1 -0
  313. package/dist/types/report.d.ts +20 -0
  314. package/dist/types/report.d.ts.map +1 -0
  315. package/dist/types/report.js +2 -0
  316. package/dist/types/report.js.map +1 -0
  317. package/dist/types/seller.d.ts +36 -0
  318. package/dist/types/seller.d.ts.map +1 -0
  319. package/dist/types/seller.js +2 -0
  320. package/dist/types/seller.js.map +1 -0
  321. package/dist/types/staking.d.ts +16 -0
  322. package/dist/types/staking.d.ts.map +1 -0
  323. package/dist/types/staking.js +6 -0
  324. package/dist/types/staking.js.map +1 -0
  325. package/dist/utils/debug.d.ts +4 -0
  326. package/dist/utils/debug.d.ts.map +1 -0
  327. package/dist/utils/debug.js +25 -0
  328. package/dist/utils/debug.js.map +1 -0
  329. package/dist/utils/hex.d.ts +3 -0
  330. package/dist/utils/hex.d.ts.map +1 -0
  331. package/dist/utils/hex.js +15 -0
  332. package/dist/utils/hex.js.map +1 -0
  333. package/package.json +62 -0
  334. package/scripts/ensure-node-native-modules.mjs +153 -0
  335. package/scripts/patch-ethers.js +44 -0
  336. package/src/config/encryption.test.ts +49 -0
  337. package/src/config/encryption.ts +53 -0
  338. package/src/config/plugin-config-manager.test.ts +92 -0
  339. package/src/config/plugin-config-manager.ts +153 -0
  340. package/src/config/plugin-loader.ts +90 -0
  341. package/src/discovery/announcer.ts +169 -0
  342. package/src/discovery/bootstrap.ts +57 -0
  343. package/src/discovery/default-metadata-resolver.ts +18 -0
  344. package/src/discovery/dht-health.ts +136 -0
  345. package/src/discovery/dht-node.ts +191 -0
  346. package/src/discovery/http-metadata-resolver.ts +47 -0
  347. package/src/discovery/index.ts +15 -0
  348. package/src/discovery/metadata-codec.ts +453 -0
  349. package/src/discovery/metadata-resolver.ts +7 -0
  350. package/src/discovery/metadata-server.ts +73 -0
  351. package/src/discovery/metadata-validator.ts +172 -0
  352. package/src/discovery/peer-lookup.ts +122 -0
  353. package/src/discovery/peer-metadata.ts +34 -0
  354. package/src/discovery/peer-selector.ts +134 -0
  355. package/src/discovery/profile-manager.ts +131 -0
  356. package/src/discovery/profile-search.ts +100 -0
  357. package/src/discovery/reputation-verifier.ts +54 -0
  358. package/src/index.ts +61 -0
  359. package/src/interfaces/buyer-router.ts +21 -0
  360. package/src/interfaces/plugin.ts +36 -0
  361. package/src/interfaces/seller-provider.ts +81 -0
  362. package/src/metering/index.ts +6 -0
  363. package/src/metering/receipt-generator.ts +105 -0
  364. package/src/metering/receipt-verifier.ts +102 -0
  365. package/src/metering/session-tracker.ts +145 -0
  366. package/src/metering/storage.ts +600 -0
  367. package/src/metering/token-counter.ts +127 -0
  368. package/src/metering/usage-aggregator.ts +236 -0
  369. package/src/node.ts +1698 -0
  370. package/src/p2p/connection-auth.ts +152 -0
  371. package/src/p2p/connection-manager.ts +916 -0
  372. package/src/p2p/handshake.ts +162 -0
  373. package/src/p2p/ice-config.ts +59 -0
  374. package/src/p2p/identity.ts +110 -0
  375. package/src/p2p/index.ts +11 -0
  376. package/src/p2p/keepalive.ts +118 -0
  377. package/src/p2p/message-protocol.ts +171 -0
  378. package/src/p2p/nat-traversal.ts +169 -0
  379. package/src/p2p/payment-codec.ts +165 -0
  380. package/src/p2p/payment-mux.ts +153 -0
  381. package/src/p2p/reconnect.ts +117 -0
  382. package/src/payments/balance-manager.ts +77 -0
  383. package/src/payments/buyer-payment-manager.ts +414 -0
  384. package/src/payments/disputes.ts +72 -0
  385. package/src/payments/evm/escrow-client.ts +263 -0
  386. package/src/payments/evm/keypair.ts +31 -0
  387. package/src/payments/evm/signatures.ts +103 -0
  388. package/src/payments/evm/wallet.ts +42 -0
  389. package/src/payments/index.ts +50 -0
  390. package/src/payments/settlement.ts +40 -0
  391. package/src/payments/types.ts +79 -0
  392. package/src/proxy/index.ts +3 -0
  393. package/src/proxy/provider-detection.ts +78 -0
  394. package/src/proxy/proxy-mux.ts +173 -0
  395. package/src/proxy/request-codec.ts +294 -0
  396. package/src/reputation/index.ts +6 -0
  397. package/src/reputation/rating-manager.ts +118 -0
  398. package/src/reputation/report-manager.ts +91 -0
  399. package/src/reputation/trust-engine.ts +120 -0
  400. package/src/reputation/trust-score.ts +74 -0
  401. package/src/reputation/uptime-tracker.ts +155 -0
  402. package/src/routing/default-router.ts +75 -0
  403. package/src/types/bittorrent-dht.d.ts +19 -0
  404. package/src/types/buyer.ts +37 -0
  405. package/src/types/capability.ts +34 -0
  406. package/src/types/connection.ts +29 -0
  407. package/src/types/http.ts +20 -0
  408. package/src/types/index.ts +14 -0
  409. package/src/types/metering.ts +175 -0
  410. package/src/types/nat-api.d.ts +29 -0
  411. package/src/types/peer-profile.ts +25 -0
  412. package/src/types/peer.ts +62 -0
  413. package/src/types/plugin-config.ts +31 -0
  414. package/src/types/protocol.ts +162 -0
  415. package/src/types/provider.ts +40 -0
  416. package/src/types/rating.ts +23 -0
  417. package/src/types/report.ts +30 -0
  418. package/src/types/seller.ts +38 -0
  419. package/src/types/staking.ts +23 -0
  420. package/src/utils/debug.ts +30 -0
  421. package/src/utils/hex.ts +14 -0
  422. package/tests/balance-manager.test.ts +156 -0
  423. package/tests/bootstrap.test.ts +108 -0
  424. package/tests/buyer-payment-manager.test.ts +358 -0
  425. package/tests/connection-auth.test.ts +87 -0
  426. package/tests/default-router.test.ts +148 -0
  427. package/tests/evm-keypair.test.ts +173 -0
  428. package/tests/identity.test.ts +133 -0
  429. package/tests/message-protocol.test.ts +212 -0
  430. package/tests/metadata-codec.test.ts +165 -0
  431. package/tests/metadata-validator.test.ts +261 -0
  432. package/tests/metering-storage.test.ts +244 -0
  433. package/tests/payment-codec.test.ts +95 -0
  434. package/tests/payment-mux.test.ts +191 -0
  435. package/tests/peer-selector.test.ts +184 -0
  436. package/tests/provider-detection.test.ts +107 -0
  437. package/tests/proxy-mux-security.test.ts +38 -0
  438. package/tests/receipt.test.ts +215 -0
  439. package/tests/reputation-integration.test.ts +195 -0
  440. package/tests/request-codec.test.ts +144 -0
  441. package/tests/token-counter.test.ts +122 -0
  442. package/tsconfig.json +9 -0
  443. package/vitest.config.ts +7 -0
@@ -0,0 +1,446 @@
1
+ import Database from 'better-sqlite3';
2
+ /**
3
+ * SQLite storage for metering data.
4
+ * All data is stored locally on the user's machine.
5
+ */
6
+ export class MeteringStorage {
7
+ db;
8
+ /**
9
+ * Open or create the SQLite database at the given path.
10
+ * Creates tables if they don't exist.
11
+ *
12
+ * @param dbPath - Path to the SQLite database file (or ':memory:' for tests)
13
+ */
14
+ constructor(dbPath) {
15
+ this.db = new Database(dbPath);
16
+ this.db.pragma('journal_mode = WAL');
17
+ this.initializeSchema();
18
+ }
19
+ /**
20
+ * Create tables and indices if they don't exist.
21
+ */
22
+ initializeSchema() {
23
+ this.db.exec(`
24
+ CREATE TABLE IF NOT EXISTS metering_events (
25
+ event_id TEXT PRIMARY KEY,
26
+ session_id TEXT NOT NULL,
27
+ timestamp INTEGER NOT NULL,
28
+ provider TEXT NOT NULL,
29
+ seller_peer_id TEXT NOT NULL,
30
+ buyer_peer_id TEXT NOT NULL,
31
+ input_tokens INTEGER NOT NULL,
32
+ output_tokens INTEGER NOT NULL,
33
+ total_tokens INTEGER NOT NULL,
34
+ token_method TEXT NOT NULL,
35
+ token_confidence TEXT NOT NULL,
36
+ latency_ms INTEGER NOT NULL,
37
+ status_code INTEGER NOT NULL,
38
+ was_streaming INTEGER NOT NULL
39
+ );
40
+
41
+ CREATE INDEX IF NOT EXISTS idx_events_session ON metering_events(session_id);
42
+ CREATE INDEX IF NOT EXISTS idx_events_timestamp ON metering_events(timestamp);
43
+
44
+ CREATE TABLE IF NOT EXISTS usage_receipts (
45
+ receipt_id TEXT PRIMARY KEY,
46
+ session_id TEXT NOT NULL,
47
+ event_id TEXT NOT NULL,
48
+ timestamp INTEGER NOT NULL,
49
+ provider TEXT NOT NULL,
50
+ seller_peer_id TEXT NOT NULL,
51
+ buyer_peer_id TEXT NOT NULL,
52
+ input_tokens INTEGER NOT NULL,
53
+ output_tokens INTEGER NOT NULL,
54
+ total_tokens INTEGER NOT NULL,
55
+ token_method TEXT NOT NULL,
56
+ token_confidence TEXT NOT NULL,
57
+ unit_price_cents_per_thousand_tokens INTEGER NOT NULL,
58
+ cost_cents INTEGER NOT NULL,
59
+ signature TEXT NOT NULL
60
+ );
61
+
62
+ CREATE INDEX IF NOT EXISTS idx_receipts_session ON usage_receipts(session_id);
63
+ CREATE INDEX IF NOT EXISTS idx_receipts_timestamp ON usage_receipts(timestamp);
64
+
65
+ CREATE TABLE IF NOT EXISTS receipt_verifications (
66
+ receipt_id TEXT PRIMARY KEY,
67
+ signature_valid INTEGER NOT NULL,
68
+ buyer_input_tokens INTEGER NOT NULL,
69
+ buyer_output_tokens INTEGER NOT NULL,
70
+ buyer_total_tokens INTEGER NOT NULL,
71
+ seller_total_tokens INTEGER NOT NULL,
72
+ token_difference INTEGER NOT NULL,
73
+ percentage_difference REAL NOT NULL,
74
+ disputed INTEGER NOT NULL,
75
+ verified_at INTEGER NOT NULL
76
+ );
77
+
78
+ CREATE TABLE IF NOT EXISTS sessions (
79
+ session_id TEXT PRIMARY KEY,
80
+ seller_peer_id TEXT NOT NULL,
81
+ buyer_peer_id TEXT NOT NULL,
82
+ provider TEXT NOT NULL,
83
+ started_at INTEGER NOT NULL,
84
+ ended_at INTEGER,
85
+ total_requests INTEGER NOT NULL,
86
+ total_tokens INTEGER NOT NULL,
87
+ total_cost_cents INTEGER NOT NULL,
88
+ avg_latency_ms REAL NOT NULL,
89
+ peer_switches INTEGER NOT NULL,
90
+ disputed_receipts INTEGER NOT NULL
91
+ );
92
+
93
+ CREATE INDEX IF NOT EXISTS idx_sessions_started ON sessions(started_at);
94
+ CREATE INDEX IF NOT EXISTS idx_sessions_provider ON sessions(provider);
95
+ `);
96
+ }
97
+ // --- Metering Events ---
98
+ /** Insert a metering event. */
99
+ insertEvent(event) {
100
+ const stmt = this.db.prepare(`
101
+ INSERT INTO metering_events (
102
+ event_id, session_id, timestamp, provider,
103
+ seller_peer_id, buyer_peer_id,
104
+ input_tokens, output_tokens, total_tokens,
105
+ token_method, token_confidence,
106
+ latency_ms, status_code, was_streaming
107
+ ) VALUES (
108
+ @eventId, @sessionId, @timestamp, @provider,
109
+ @sellerPeerId, @buyerPeerId,
110
+ @inputTokens, @outputTokens, @totalTokens,
111
+ @tokenMethod, @tokenConfidence,
112
+ @latencyMs, @statusCode, @wasStreaming
113
+ )
114
+ `);
115
+ stmt.run({
116
+ eventId: event.eventId,
117
+ sessionId: event.sessionId,
118
+ timestamp: event.timestamp,
119
+ provider: event.provider,
120
+ sellerPeerId: event.sellerPeerId,
121
+ buyerPeerId: event.buyerPeerId,
122
+ inputTokens: event.tokens.inputTokens,
123
+ outputTokens: event.tokens.outputTokens,
124
+ totalTokens: event.tokens.totalTokens,
125
+ tokenMethod: event.tokens.method,
126
+ tokenConfidence: event.tokens.confidence,
127
+ latencyMs: event.latencyMs,
128
+ statusCode: event.statusCode,
129
+ wasStreaming: event.wasStreaming ? 1 : 0,
130
+ });
131
+ }
132
+ /** Get events for a session. */
133
+ getEventsBySession(sessionId) {
134
+ const stmt = this.db.prepare('SELECT * FROM metering_events WHERE session_id = ? ORDER BY timestamp');
135
+ const rows = stmt.all(sessionId);
136
+ return rows.map(rowToEvent);
137
+ }
138
+ /** Get events in a time range. */
139
+ getEventsByTimeRange(startMs, endMs) {
140
+ const stmt = this.db.prepare('SELECT * FROM metering_events WHERE timestamp >= ? AND timestamp < ? ORDER BY timestamp');
141
+ const rows = stmt.all(startMs, endMs);
142
+ return rows.map(rowToEvent);
143
+ }
144
+ // --- Usage Receipts ---
145
+ /** Insert a usage receipt. */
146
+ insertReceipt(receipt) {
147
+ const stmt = this.db.prepare(`
148
+ INSERT INTO usage_receipts (
149
+ receipt_id, session_id, event_id, timestamp, provider,
150
+ seller_peer_id, buyer_peer_id,
151
+ input_tokens, output_tokens, total_tokens,
152
+ token_method, token_confidence,
153
+ unit_price_cents_per_thousand_tokens, cost_cents, signature
154
+ ) VALUES (
155
+ @receiptId, @sessionId, @eventId, @timestamp, @provider,
156
+ @sellerPeerId, @buyerPeerId,
157
+ @inputTokens, @outputTokens, @totalTokens,
158
+ @tokenMethod, @tokenConfidence,
159
+ @unitPriceCentsPerThousandTokens, @costCents, @signature
160
+ )
161
+ `);
162
+ stmt.run({
163
+ receiptId: receipt.receiptId,
164
+ sessionId: receipt.sessionId,
165
+ eventId: receipt.eventId,
166
+ timestamp: receipt.timestamp,
167
+ provider: receipt.provider,
168
+ sellerPeerId: receipt.sellerPeerId,
169
+ buyerPeerId: receipt.buyerPeerId,
170
+ inputTokens: receipt.tokens.inputTokens,
171
+ outputTokens: receipt.tokens.outputTokens,
172
+ totalTokens: receipt.tokens.totalTokens,
173
+ tokenMethod: receipt.tokens.method,
174
+ tokenConfidence: receipt.tokens.confidence,
175
+ unitPriceCentsPerThousandTokens: receipt.unitPriceCentsPerThousandTokens,
176
+ costCents: receipt.costCents,
177
+ signature: receipt.signature,
178
+ });
179
+ }
180
+ /** Get receipts for a session. */
181
+ getReceiptsBySession(sessionId) {
182
+ const stmt = this.db.prepare('SELECT * FROM usage_receipts WHERE session_id = ? ORDER BY timestamp');
183
+ const rows = stmt.all(sessionId);
184
+ return rows.map(rowToReceipt);
185
+ }
186
+ /** Get all receipts in a time range. */
187
+ getReceiptsByTimeRange(startMs, endMs) {
188
+ const stmt = this.db.prepare('SELECT * FROM usage_receipts WHERE timestamp >= ? AND timestamp < ? ORDER BY timestamp');
189
+ const rows = stmt.all(startMs, endMs);
190
+ return rows.map(rowToReceipt);
191
+ }
192
+ /** Get total cost in a time range (sum of costCents). */
193
+ getTotalCost(startMs, endMs) {
194
+ const stmt = this.db.prepare('SELECT COALESCE(SUM(cost_cents), 0) as total FROM usage_receipts WHERE timestamp >= ? AND timestamp < ?');
195
+ const row = stmt.get(startMs, endMs);
196
+ return row.total;
197
+ }
198
+ // --- Receipt Verifications ---
199
+ /** Insert a verification result. */
200
+ insertVerification(verification) {
201
+ const stmt = this.db.prepare(`
202
+ INSERT INTO receipt_verifications (
203
+ receipt_id, signature_valid,
204
+ buyer_input_tokens, buyer_output_tokens, buyer_total_tokens,
205
+ seller_total_tokens,
206
+ token_difference, percentage_difference,
207
+ disputed, verified_at
208
+ ) VALUES (
209
+ @receiptId, @signatureValid,
210
+ @buyerInputTokens, @buyerOutputTokens, @buyerTotalTokens,
211
+ @sellerTotalTokens,
212
+ @tokenDifference, @percentageDifference,
213
+ @disputed, @verifiedAt
214
+ )
215
+ `);
216
+ stmt.run({
217
+ receiptId: verification.receiptId,
218
+ signatureValid: verification.signatureValid ? 1 : 0,
219
+ buyerInputTokens: verification.buyerTokenEstimate.inputTokens,
220
+ buyerOutputTokens: verification.buyerTokenEstimate.outputTokens,
221
+ buyerTotalTokens: verification.buyerTokenEstimate.totalTokens,
222
+ sellerTotalTokens: verification.sellerTokenEstimate.totalTokens,
223
+ tokenDifference: verification.tokenDifference,
224
+ percentageDifference: verification.percentageDifference,
225
+ disputed: verification.disputed ? 1 : 0,
226
+ verifiedAt: verification.verifiedAt,
227
+ });
228
+ }
229
+ /** Get all disputed verifications in a time range. */
230
+ getDisputedVerifications(startMs, endMs) {
231
+ const stmt = this.db.prepare('SELECT * FROM receipt_verifications WHERE disputed = 1 AND verified_at >= ? AND verified_at < ? ORDER BY verified_at');
232
+ const rows = stmt.all(startMs, endMs);
233
+ return rows.map(rowToVerification);
234
+ }
235
+ // --- Sessions ---
236
+ /** Upsert session metrics (insert or update). */
237
+ upsertSession(metrics) {
238
+ const stmt = this.db.prepare(`
239
+ INSERT INTO sessions (
240
+ session_id, seller_peer_id, buyer_peer_id, provider,
241
+ started_at, ended_at,
242
+ total_requests, total_tokens, total_cost_cents,
243
+ avg_latency_ms, peer_switches, disputed_receipts
244
+ ) VALUES (
245
+ @sessionId, @sellerPeerId, @buyerPeerId, @provider,
246
+ @startedAt, @endedAt,
247
+ @totalRequests, @totalTokens, @totalCostCents,
248
+ @avgLatencyMs, @peerSwitches, @disputedReceipts
249
+ )
250
+ ON CONFLICT(session_id) DO UPDATE SET
251
+ ended_at = @endedAt,
252
+ total_requests = @totalRequests,
253
+ total_tokens = @totalTokens,
254
+ total_cost_cents = @totalCostCents,
255
+ avg_latency_ms = @avgLatencyMs,
256
+ peer_switches = @peerSwitches,
257
+ disputed_receipts = @disputedReceipts
258
+ `);
259
+ stmt.run({
260
+ sessionId: metrics.sessionId,
261
+ sellerPeerId: metrics.sellerPeerId,
262
+ buyerPeerId: metrics.buyerPeerId,
263
+ provider: metrics.provider,
264
+ startedAt: metrics.startedAt,
265
+ endedAt: metrics.endedAt,
266
+ totalRequests: metrics.totalRequests,
267
+ totalTokens: metrics.totalTokens,
268
+ totalCostCents: metrics.totalCostCents,
269
+ avgLatencyMs: metrics.avgLatencyMs,
270
+ peerSwitches: metrics.peerSwitches,
271
+ disputedReceipts: metrics.disputedReceipts,
272
+ });
273
+ }
274
+ /** Get a session by ID. */
275
+ getSession(sessionId) {
276
+ const stmt = this.db.prepare('SELECT * FROM sessions WHERE session_id = ?');
277
+ const row = stmt.get(sessionId);
278
+ return row ? rowToSession(row) : null;
279
+ }
280
+ /** Get all sessions in a time range. */
281
+ getSessionsByTimeRange(startMs, endMs) {
282
+ const stmt = this.db.prepare('SELECT * FROM sessions WHERE started_at >= ? AND started_at < ? ORDER BY started_at');
283
+ const rows = stmt.all(startMs, endMs);
284
+ return rows.map(rowToSession);
285
+ }
286
+ /** Get session count and total cost for a time range. */
287
+ getSessionSummary(startMs, endMs) {
288
+ const stmt = this.db.prepare(`
289
+ SELECT
290
+ COUNT(*) as session_count,
291
+ COALESCE(SUM(total_requests), 0) as total_requests,
292
+ COALESCE(SUM(total_tokens), 0) as total_tokens,
293
+ COALESCE(SUM(total_cost_cents), 0) as total_cost_cents
294
+ FROM sessions
295
+ WHERE started_at >= ? AND started_at < ?
296
+ `);
297
+ const row = stmt.get(startMs, endMs);
298
+ return {
299
+ sessionCount: row.session_count,
300
+ totalRequests: row.total_requests,
301
+ totalTokens: row.total_tokens,
302
+ totalCostCents: row.total_cost_cents,
303
+ };
304
+ }
305
+ /** Get total tokens from metering events in a time range (real-time, per-request). */
306
+ getEventTokenSummary(startMs, endMs) {
307
+ const stmt = this.db.prepare(`
308
+ SELECT
309
+ COUNT(*) as total_requests,
310
+ COALESCE(SUM(total_tokens), 0) as total_tokens,
311
+ COALESCE(SUM(input_tokens), 0) as input_tokens,
312
+ COALESCE(SUM(output_tokens), 0) as output_tokens
313
+ FROM metering_events
314
+ WHERE timestamp >= ? AND timestamp < ?
315
+ `);
316
+ const row = stmt.get(startMs, endMs);
317
+ return {
318
+ totalRequests: row.total_requests,
319
+ totalTokens: row.total_tokens,
320
+ inputTokens: row.input_tokens,
321
+ outputTokens: row.output_tokens,
322
+ };
323
+ }
324
+ // --- Maintenance ---
325
+ /**
326
+ * Delete data older than the given timestamp.
327
+ * Used for storage maintenance / retention policy.
328
+ */
329
+ pruneOlderThan(timestampMs) {
330
+ const deleteEvents = this.db.prepare('DELETE FROM metering_events WHERE timestamp < ?');
331
+ const deleteReceipts = this.db.prepare('DELETE FROM usage_receipts WHERE timestamp < ?');
332
+ const deleteVerifications = this.db.prepare('DELETE FROM receipt_verifications WHERE verified_at < ?');
333
+ const deleteSessions = this.db.prepare('DELETE FROM sessions WHERE started_at < ?');
334
+ const eventsResult = deleteEvents.run(timestampMs);
335
+ const receiptsResult = deleteReceipts.run(timestampMs);
336
+ const verificationsResult = deleteVerifications.run(timestampMs);
337
+ const sessionsResult = deleteSessions.run(timestampMs);
338
+ return {
339
+ eventsDeleted: eventsResult.changes,
340
+ receiptsDeleted: receiptsResult.changes,
341
+ verificationsDeleted: verificationsResult.changes,
342
+ sessionsDeleted: sessionsResult.changes,
343
+ };
344
+ }
345
+ /**
346
+ * Close the database connection.
347
+ */
348
+ close() {
349
+ this.db.close();
350
+ }
351
+ }
352
+ // --- Row mapping functions ---
353
+ const VALID_TOKEN_METHODS = new Set(['content-length', 'chunk-accumulation', 'fallback']);
354
+ const VALID_TOKEN_CONFIDENCES = new Set(['high', 'medium', 'low']);
355
+ function validateTokenMethod(value) {
356
+ if (VALID_TOKEN_METHODS.has(value))
357
+ return value;
358
+ return 'fallback';
359
+ }
360
+ function validateTokenConfidence(value) {
361
+ if (VALID_TOKEN_CONFIDENCES.has(value))
362
+ return value;
363
+ return 'low';
364
+ }
365
+ function rowToEvent(row) {
366
+ return {
367
+ eventId: row.event_id,
368
+ sessionId: row.session_id,
369
+ timestamp: row.timestamp,
370
+ provider: row.provider,
371
+ sellerPeerId: row.seller_peer_id,
372
+ buyerPeerId: row.buyer_peer_id,
373
+ tokens: {
374
+ inputTokens: row.input_tokens,
375
+ outputTokens: row.output_tokens,
376
+ totalTokens: row.total_tokens,
377
+ method: validateTokenMethod(row.token_method),
378
+ confidence: validateTokenConfidence(row.token_confidence),
379
+ },
380
+ latencyMs: row.latency_ms,
381
+ statusCode: row.status_code,
382
+ wasStreaming: row.was_streaming === 1,
383
+ };
384
+ }
385
+ function rowToReceipt(row) {
386
+ return {
387
+ receiptId: row.receipt_id,
388
+ sessionId: row.session_id,
389
+ eventId: row.event_id,
390
+ timestamp: row.timestamp,
391
+ provider: row.provider,
392
+ sellerPeerId: row.seller_peer_id,
393
+ buyerPeerId: row.buyer_peer_id,
394
+ tokens: {
395
+ inputTokens: row.input_tokens,
396
+ outputTokens: row.output_tokens,
397
+ totalTokens: row.total_tokens,
398
+ method: validateTokenMethod(row.token_method),
399
+ confidence: validateTokenConfidence(row.token_confidence),
400
+ },
401
+ unitPriceCentsPerThousandTokens: row.unit_price_cents_per_thousand_tokens,
402
+ costCents: row.cost_cents,
403
+ signature: row.signature,
404
+ };
405
+ }
406
+ function rowToVerification(row) {
407
+ return {
408
+ receiptId: row.receipt_id,
409
+ signatureValid: row.signature_valid === 1,
410
+ buyerTokenEstimate: {
411
+ inputTokens: row.buyer_input_tokens,
412
+ outputTokens: row.buyer_output_tokens,
413
+ totalTokens: row.buyer_total_tokens,
414
+ method: 'content-length',
415
+ confidence: 'high',
416
+ },
417
+ sellerTokenEstimate: {
418
+ inputTokens: 0,
419
+ outputTokens: 0,
420
+ totalTokens: row.seller_total_tokens,
421
+ method: 'content-length',
422
+ confidence: 'high',
423
+ },
424
+ tokenDifference: row.token_difference,
425
+ percentageDifference: row.percentage_difference,
426
+ disputed: row.disputed === 1,
427
+ verifiedAt: row.verified_at,
428
+ };
429
+ }
430
+ function rowToSession(row) {
431
+ return {
432
+ sessionId: row.session_id,
433
+ sellerPeerId: row.seller_peer_id,
434
+ buyerPeerId: row.buyer_peer_id,
435
+ provider: row.provider,
436
+ startedAt: row.started_at,
437
+ endedAt: row.ended_at,
438
+ totalRequests: row.total_requests,
439
+ totalTokens: row.total_tokens,
440
+ totalCostCents: row.total_cost_cents,
441
+ avgLatencyMs: row.avg_latency_ms,
442
+ peerSwitches: row.peer_switches,
443
+ disputedReceipts: row.disputed_receipts,
444
+ };
445
+ }
446
+ //# sourceMappingURL=storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/metering/storage.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAStC;;;GAGG;AACH,MAAM,OAAO,eAAe;IACT,EAAE,CAAoB;IAEvC;;;;;OAKG;IACH,YAAY,MAAc;QACxB,IAAI,CAAC,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC/B,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;QACrC,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAC1B,CAAC;IAED;;OAEG;IACK,gBAAgB;QACtB,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAwEZ,CAAC,CAAC;IACL,CAAC;IAED,0BAA0B;IAE1B,+BAA+B;IAC/B,WAAW,CAAC,KAAoB;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;;;;;;;;;;;KAc5B,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC;YACP,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,WAAW;YACrC,YAAY,EAAE,KAAK,CAAC,MAAM,CAAC,YAAY;YACvC,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,WAAW;YACrC,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM;YAChC,eAAe,EAAE,KAAK,CAAC,MAAM,CAAC,UAAU;YACxC,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,YAAY,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SACzC,CAAC,CAAC;IACL,CAAC;IAED,gCAAgC;IAChC,kBAAkB,CAAC,SAAiB;QAClC,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC1B,uEAAuE,CACxE,CAAC;QACF,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAe,CAAC;QAC/C,OAAO,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAC9B,CAAC;IAED,kCAAkC;IAClC,oBAAoB,CAAC,OAAe,EAAE,KAAa;QACjD,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC1B,yFAAyF,CAC1F,CAAC;QACF,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAe,CAAC;QACpD,OAAO,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAC9B,CAAC;IAED,yBAAyB;IAEzB,8BAA8B;IAC9B,aAAa,CAAC,OAAqB;QACjC,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;;;;;;;;;;;KAc5B,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC;YACP,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,WAAW;YACvC,YAAY,EAAE,OAAO,CAAC,MAAM,CAAC,YAAY;YACzC,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,WAAW;YACvC,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM;YAClC,eAAe,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU;YAC1C,+BAA+B,EAAE,OAAO,CAAC,+BAA+B;YACxE,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,SAAS,EAAE,OAAO,CAAC,SAAS;SAC7B,CAAC,CAAC;IACL,CAAC;IAED,kCAAkC;IAClC,oBAAoB,CAAC,SAAiB;QACpC,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC1B,sEAAsE,CACvE,CAAC;QACF,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAiB,CAAC;QACjD,OAAO,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAChC,CAAC;IAED,wCAAwC;IACxC,sBAAsB,CAAC,OAAe,EAAE,KAAa;QACnD,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC1B,wFAAwF,CACzF,CAAC;QACF,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAiB,CAAC;QACtD,OAAO,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAChC,CAAC;IAED,yDAAyD;IACzD,YAAY,CAAC,OAAe,EAAE,KAAa;QACzC,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC1B,yGAAyG,CAC1G,CAAC;QACF,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAsB,CAAC;QAC1D,OAAO,GAAG,CAAC,KAAK,CAAC;IACnB,CAAC;IAED,gCAAgC;IAEhC,oCAAoC;IACpC,kBAAkB,CAAC,YAAiC;QAClD,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;;;;;;;;;;;KAc5B,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC;YACP,SAAS,EAAE,YAAY,CAAC,SAAS;YACjC,cAAc,EAAE,YAAY,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACnD,gBAAgB,EAAE,YAAY,CAAC,kBAAkB,CAAC,WAAW;YAC7D,iBAAiB,EAAE,YAAY,CAAC,kBAAkB,CAAC,YAAY;YAC/D,gBAAgB,EAAE,YAAY,CAAC,kBAAkB,CAAC,WAAW;YAC7D,iBAAiB,EAAE,YAAY,CAAC,mBAAmB,CAAC,WAAW;YAC/D,eAAe,EAAE,YAAY,CAAC,eAAe;YAC7C,oBAAoB,EAAE,YAAY,CAAC,oBAAoB;YACvD,QAAQ,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACvC,UAAU,EAAE,YAAY,CAAC,UAAU;SACpC,CAAC,CAAC;IACL,CAAC;IAED,sDAAsD;IACtD,wBAAwB,CAAC,OAAe,EAAE,KAAa;QACrD,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC1B,sHAAsH,CACvH,CAAC;QACF,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAsB,CAAC;QAC3D,OAAO,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IACrC,CAAC;IAED,mBAAmB;IAEnB,iDAAiD;IACjD,aAAa,CAAC,OAAuB;QACnC,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;;;;;;;;;;;;;;;;;KAoB5B,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC;YACP,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,aAAa,EAAE,OAAO,CAAC,aAAa;YACpC,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,cAAc,EAAE,OAAO,CAAC,cAAc;YACtC,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;SAC3C,CAAC,CAAC;IACL,CAAC;IAED,2BAA2B;IAC3B,UAAU,CAAC,SAAiB;QAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,6CAA6C,CAAC,CAAC;QAC5E,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAA2B,CAAC;QAC1D,OAAO,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACxC,CAAC;IAED,wCAAwC;IACxC,sBAAsB,CAAC,OAAe,EAAE,KAAa;QACnD,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC1B,qFAAqF,CACtF,CAAC;QACF,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAiB,CAAC;QACtD,OAAO,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAChC,CAAC;IAED,yDAAyD;IACzD,iBAAiB,CAAC,OAAe,EAAE,KAAa;QAM9C,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;;;;;KAQ5B,CAAC,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAKlC,CAAC;QACF,OAAO;YACL,YAAY,EAAE,GAAG,CAAC,aAAa;YAC/B,aAAa,EAAE,GAAG,CAAC,cAAc;YACjC,WAAW,EAAE,GAAG,CAAC,YAAY;YAC7B,cAAc,EAAE,GAAG,CAAC,gBAAgB;SACrC,CAAC;IACJ,CAAC;IAED,sFAAsF;IACtF,oBAAoB,CAAC,OAAe,EAAE,KAAa;QAMjD,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;;;;;KAQ5B,CAAC,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAKlC,CAAC;QACF,OAAO;YACL,aAAa,EAAE,GAAG,CAAC,cAAc;YACjC,WAAW,EAAE,GAAG,CAAC,YAAY;YAC7B,WAAW,EAAE,GAAG,CAAC,YAAY;YAC7B,YAAY,EAAE,GAAG,CAAC,aAAa;SAChC,CAAC;IACJ,CAAC;IAED,sBAAsB;IAEtB;;;OAGG;IACH,cAAc,CAAC,WAAmB;QAMhC,MAAM,YAAY,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAClC,iDAAiD,CAClD,CAAC;QACF,MAAM,cAAc,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CACpC,gDAAgD,CACjD,CAAC;QACF,MAAM,mBAAmB,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CACzC,yDAAyD,CAC1D,CAAC;QACF,MAAM,cAAc,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CACpC,2CAA2C,CAC5C,CAAC;QAEF,MAAM,YAAY,GAAG,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACnD,MAAM,cAAc,GAAG,cAAc,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACvD,MAAM,mBAAmB,GAAG,mBAAmB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACjE,MAAM,cAAc,GAAG,cAAc,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAEvD,OAAO;YACL,aAAa,EAAE,YAAY,CAAC,OAAO;YACnC,eAAe,EAAE,cAAc,CAAC,OAAO;YACvC,oBAAoB,EAAE,mBAAmB,CAAC,OAAO;YACjD,eAAe,EAAE,cAAc,CAAC,OAAO;SACxC,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC;CACF;AAmED,gCAAgC;AAEhC,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC,CAAC,gBAAgB,EAAE,oBAAoB,EAAE,UAAU,CAAC,CAAC,CAAC;AAC1F,MAAM,uBAAuB,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;AAEnE,SAAS,mBAAmB,CAAC,KAAa;IACxC,IAAI,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC;QAAE,OAAO,KAA6B,CAAC;IACzE,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,uBAAuB,CAAC,KAAa;IAC5C,IAAI,uBAAuB,CAAC,GAAG,CAAC,KAAK,CAAC;QAAE,OAAO,KAAiC,CAAC;IACjF,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,UAAU,CAAC,GAAa;IAC/B,OAAO;QACL,OAAO,EAAE,GAAG,CAAC,QAAQ;QACrB,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,YAAY,EAAE,GAAG,CAAC,cAAc;QAChC,WAAW,EAAE,GAAG,CAAC,aAAa;QAC9B,MAAM,EAAE;YACN,WAAW,EAAE,GAAG,CAAC,YAAY;YAC7B,YAAY,EAAE,GAAG,CAAC,aAAa;YAC/B,WAAW,EAAE,GAAG,CAAC,YAAY;YAC7B,MAAM,EAAE,mBAAmB,CAAC,GAAG,CAAC,YAAY,CAAC;YAC7C,UAAU,EAAE,uBAAuB,CAAC,GAAG,CAAC,gBAAgB,CAAC;SAC1D;QACD,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,UAAU,EAAE,GAAG,CAAC,WAAW;QAC3B,YAAY,EAAE,GAAG,CAAC,aAAa,KAAK,CAAC;KACtC,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,GAAe;IACnC,OAAO;QACL,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,OAAO,EAAE,GAAG,CAAC,QAAQ;QACrB,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,YAAY,EAAE,GAAG,CAAC,cAAc;QAChC,WAAW,EAAE,GAAG,CAAC,aAAa;QAC9B,MAAM,EAAE;YACN,WAAW,EAAE,GAAG,CAAC,YAAY;YAC7B,YAAY,EAAE,GAAG,CAAC,aAAa;YAC/B,WAAW,EAAE,GAAG,CAAC,YAAY;YAC7B,MAAM,EAAE,mBAAmB,CAAC,GAAG,CAAC,YAAY,CAAC;YAC7C,UAAU,EAAE,uBAAuB,CAAC,GAAG,CAAC,gBAAgB,CAAC;SAC1D;QACD,+BAA+B,EAAE,GAAG,CAAC,oCAAoC;QACzE,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,SAAS,EAAE,GAAG,CAAC,SAAS;KACzB,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAoB;IAC7C,OAAO;QACL,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,cAAc,EAAE,GAAG,CAAC,eAAe,KAAK,CAAC;QACzC,kBAAkB,EAAE;YAClB,WAAW,EAAE,GAAG,CAAC,kBAAkB;YACnC,YAAY,EAAE,GAAG,CAAC,mBAAmB;YACrC,WAAW,EAAE,GAAG,CAAC,kBAAkB;YACnC,MAAM,EAAE,gBAAgB;YACxB,UAAU,EAAE,MAAM;SACnB;QACD,mBAAmB,EAAE;YACnB,WAAW,EAAE,CAAC;YACd,YAAY,EAAE,CAAC;YACf,WAAW,EAAE,GAAG,CAAC,mBAAmB;YACpC,MAAM,EAAE,gBAAgB;YACxB,UAAU,EAAE,MAAM;SACnB;QACD,eAAe,EAAE,GAAG,CAAC,gBAAgB;QACrC,oBAAoB,EAAE,GAAG,CAAC,qBAAqB;QAC/C,QAAQ,EAAE,GAAG,CAAC,QAAQ,KAAK,CAAC;QAC5B,UAAU,EAAE,GAAG,CAAC,WAAW;KAC5B,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,GAAe;IACnC,OAAO;QACL,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,YAAY,EAAE,GAAG,CAAC,cAAc;QAChC,WAAW,EAAE,GAAG,CAAC,aAAa;QAC9B,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,OAAO,EAAE,GAAG,CAAC,QAAQ;QACrB,aAAa,EAAE,GAAG,CAAC,cAAc;QACjC,WAAW,EAAE,GAAG,CAAC,YAAY;QAC7B,cAAc,EAAE,GAAG,CAAC,gBAAgB;QACpC,YAAY,EAAE,GAAG,CAAC,cAAc;QAChC,YAAY,EAAE,GAAG,CAAC,aAAa;QAC/B,gBAAgB,EAAE,GAAG,CAAC,iBAAiB;KACxC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,50 @@
1
+ import type { ProviderType, TokenCount } from '../types/metering.js';
2
+ /**
3
+ * Provider-specific bytes-to-token ratios.
4
+ *
5
+ * These are empirical averages. The actual ratio depends on the
6
+ * tokenizer and content, but for billing estimates they are
7
+ * sufficiently accurate (typically within 10-15%).
8
+ *
9
+ * Rationale:
10
+ * - English text averages ~4 bytes per token across most tokenizers
11
+ * - JSON overhead (keys, brackets, quotes) increases the ratio
12
+ * - Request bodies include system prompts, tool definitions, etc.
13
+ * - Response bodies include JSON wrapping around the actual content
14
+ */
15
+ export declare const BYTES_PER_TOKEN: Record<string, number>;
16
+ /**
17
+ * Minimum token estimate when Content-Length is missing or zero.
18
+ * LLM API requests always have some tokens (at least a system prompt).
19
+ */
20
+ export declare const MIN_REQUEST_TOKENS = 100;
21
+ export declare const MIN_RESPONSE_TOKENS = 10;
22
+ /**
23
+ * Estimate token count from HTTP Content-Length header value.
24
+ *
25
+ * @param contentLength - Value of Content-Length header (bytes), or null if absent
26
+ * @param provider - Provider type for selecting bytes-per-token ratio
27
+ * @param direction - Whether this is a request (input) or response (output)
28
+ * @returns Estimated token count
29
+ */
30
+ export declare function estimateTokensFromContentLength(contentLength: number | null, provider: ProviderType, direction: 'request' | 'response'): number;
31
+ /**
32
+ * Estimate token count from accumulated SSE stream chunk sizes.
33
+ * Used when Content-Length is not available (streaming responses).
34
+ *
35
+ * @param totalBytes - Total bytes received across all SSE chunks
36
+ * @param provider - Provider type
37
+ * @returns Estimated token count
38
+ */
39
+ export declare function estimateTokensFromStreamBytes(totalBytes: number, provider: ProviderType): number;
40
+ /**
41
+ * Build a complete TokenCount from request and response metadata.
42
+ *
43
+ * @param requestContentLength - Request Content-Length header value (bytes), or null
44
+ * @param responseContentLength - Response Content-Length header value (bytes), or null
45
+ * @param provider - Provider type
46
+ * @param isStreaming - Whether the response was an SSE stream
47
+ * @param streamTotalBytes - Total bytes from stream chunks (only if isStreaming)
48
+ */
49
+ export declare function estimateTokens(requestContentLength: number | null, responseContentLength: number | null, provider: ProviderType, isStreaming: boolean, streamTotalBytes?: number): TokenCount;
50
+ //# sourceMappingURL=token-counter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-counter.d.ts","sourceRoot":"","sources":["../../src/metering/token-counter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAErE;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAMlD,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,MAAM,CAAC;AACtC,eAAO,MAAM,mBAAmB,KAAK,CAAC;AAEtC;;;;;;;GAOG;AACH,wBAAgB,+BAA+B,CAC7C,aAAa,EAAE,MAAM,GAAG,IAAI,EAC5B,QAAQ,EAAE,YAAY,EACtB,SAAS,EAAE,SAAS,GAAG,UAAU,GAChC,MAAM,CAUR;AAED;;;;;;;GAOG;AACH,wBAAgB,6BAA6B,CAC3C,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,YAAY,GACrB,MAAM,CAQR;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAC5B,oBAAoB,EAAE,MAAM,GAAG,IAAI,EACnC,qBAAqB,EAAE,MAAM,GAAG,IAAI,EACpC,QAAQ,EAAE,YAAY,EACtB,WAAW,EAAE,OAAO,EACpB,gBAAgB,CAAC,EAAE,MAAM,GACxB,UAAU,CAoCZ"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Provider-specific bytes-to-token ratios.
3
+ *
4
+ * These are empirical averages. The actual ratio depends on the
5
+ * tokenizer and content, but for billing estimates they are
6
+ * sufficiently accurate (typically within 10-15%).
7
+ *
8
+ * Rationale:
9
+ * - English text averages ~4 bytes per token across most tokenizers
10
+ * - JSON overhead (keys, brackets, quotes) increases the ratio
11
+ * - Request bodies include system prompts, tool definitions, etc.
12
+ * - Response bodies include JSON wrapping around the actual content
13
+ */
14
+ export const BYTES_PER_TOKEN = {
15
+ anthropic: 4.2, // Claude tokenizer, JSON Messages API
16
+ openai: 4.0, // tiktoken cl100k_base, JSON Chat API
17
+ google: 4.1, // Gemini tokenizer, JSON generateContent API
18
+ moonshot: 4.0, // Similar to OpenAI tokenizer
19
+ default: 4.0, // Fallback for unknown providers
20
+ };
21
+ /**
22
+ * Minimum token estimate when Content-Length is missing or zero.
23
+ * LLM API requests always have some tokens (at least a system prompt).
24
+ */
25
+ export const MIN_REQUEST_TOKENS = 100;
26
+ export const MIN_RESPONSE_TOKENS = 10;
27
+ /**
28
+ * Estimate token count from HTTP Content-Length header value.
29
+ *
30
+ * @param contentLength - Value of Content-Length header (bytes), or null if absent
31
+ * @param provider - Provider type for selecting bytes-per-token ratio
32
+ * @param direction - Whether this is a request (input) or response (output)
33
+ * @returns Estimated token count
34
+ */
35
+ export function estimateTokensFromContentLength(contentLength, provider, direction) {
36
+ if (contentLength === null || contentLength === 0) {
37
+ return direction === 'request' ? MIN_REQUEST_TOKENS : MIN_RESPONSE_TOKENS;
38
+ }
39
+ const ratio = BYTES_PER_TOKEN[provider] ?? BYTES_PER_TOKEN['default'];
40
+ return Math.max(Math.ceil(contentLength / ratio), direction === 'request' ? MIN_REQUEST_TOKENS : MIN_RESPONSE_TOKENS);
41
+ }
42
+ /**
43
+ * Estimate token count from accumulated SSE stream chunk sizes.
44
+ * Used when Content-Length is not available (streaming responses).
45
+ *
46
+ * @param totalBytes - Total bytes received across all SSE chunks
47
+ * @param provider - Provider type
48
+ * @returns Estimated token count
49
+ */
50
+ export function estimateTokensFromStreamBytes(totalBytes, provider) {
51
+ if (totalBytes === 0)
52
+ return MIN_RESPONSE_TOKENS;
53
+ const ratio = BYTES_PER_TOKEN[provider] ?? BYTES_PER_TOKEN['default'];
54
+ // SSE streams have additional overhead: "data: " prefix, newlines, event framing
55
+ // Approximately 15-20% of stream bytes are SSE overhead, not content
56
+ const contentBytes = totalBytes * 0.82;
57
+ return Math.max(Math.ceil(contentBytes / ratio), MIN_RESPONSE_TOKENS);
58
+ }
59
+ /**
60
+ * Build a complete TokenCount from request and response metadata.
61
+ *
62
+ * @param requestContentLength - Request Content-Length header value (bytes), or null
63
+ * @param responseContentLength - Response Content-Length header value (bytes), or null
64
+ * @param provider - Provider type
65
+ * @param isStreaming - Whether the response was an SSE stream
66
+ * @param streamTotalBytes - Total bytes from stream chunks (only if isStreaming)
67
+ */
68
+ export function estimateTokens(requestContentLength, responseContentLength, provider, isStreaming, streamTotalBytes) {
69
+ const inputTokens = estimateTokensFromContentLength(requestContentLength, provider, 'request');
70
+ let outputTokens;
71
+ let method;
72
+ let confidence;
73
+ if (isStreaming && streamTotalBytes !== undefined) {
74
+ outputTokens = estimateTokensFromStreamBytes(streamTotalBytes, provider);
75
+ method = 'chunk-accumulation';
76
+ confidence = 'medium';
77
+ }
78
+ else if (responseContentLength !== null && responseContentLength > 0) {
79
+ outputTokens = estimateTokensFromContentLength(responseContentLength, provider, 'response');
80
+ method = 'content-length';
81
+ confidence = 'high';
82
+ }
83
+ else {
84
+ outputTokens = MIN_RESPONSE_TOKENS;
85
+ method = 'fallback';
86
+ confidence = 'low';
87
+ }
88
+ return {
89
+ inputTokens,
90
+ outputTokens,
91
+ totalTokens: inputTokens + outputTokens,
92
+ method,
93
+ confidence,
94
+ };
95
+ }
96
+ //# sourceMappingURL=token-counter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-counter.js","sourceRoot":"","sources":["../../src/metering/token-counter.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,eAAe,GAA2B;IACrD,SAAS,EAAE,GAAG,EAAI,sCAAsC;IACxD,MAAM,EAAE,GAAG,EAAO,sCAAsC;IACxD,MAAM,EAAE,GAAG,EAAO,6CAA6C;IAC/D,QAAQ,EAAE,GAAG,EAAK,8BAA8B;IAChD,OAAO,EAAE,GAAG,EAAM,iCAAiC;CACpD,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,CAAC;AACtC,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAEtC;;;;;;;GAOG;AACH,MAAM,UAAU,+BAA+B,CAC7C,aAA4B,EAC5B,QAAsB,EACtB,SAAiC;IAEjC,IAAI,aAAa,KAAK,IAAI,IAAI,aAAa,KAAK,CAAC,EAAE,CAAC;QAClD,OAAO,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,mBAAmB,CAAC;IAC5E,CAAC;IAED,MAAM,KAAK,GAAG,eAAe,CAAC,QAAQ,CAAC,IAAI,eAAe,CAAC,SAAS,CAAE,CAAC;IACvE,OAAO,IAAI,CAAC,GAAG,CACb,IAAI,CAAC,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,EAChC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,mBAAmB,CACnE,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,6BAA6B,CAC3C,UAAkB,EAClB,QAAsB;IAEtB,IAAI,UAAU,KAAK,CAAC;QAAE,OAAO,mBAAmB,CAAC;IAEjD,MAAM,KAAK,GAAG,eAAe,CAAC,QAAQ,CAAC,IAAI,eAAe,CAAC,SAAS,CAAE,CAAC;IACvE,iFAAiF;IACjF,qEAAqE;IACrE,MAAM,YAAY,GAAG,UAAU,GAAG,IAAI,CAAC;IACvC,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,EAAE,mBAAmB,CAAC,CAAC;AACxE,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,cAAc,CAC5B,oBAAmC,EACnC,qBAAoC,EACpC,QAAsB,EACtB,WAAoB,EACpB,gBAAyB;IAEzB,MAAM,WAAW,GAAG,+BAA+B,CACjD,oBAAoB,EACpB,QAAQ,EACR,SAAS,CACV,CAAC;IAEF,IAAI,YAAoB,CAAC;IACzB,IAAI,MAA4B,CAAC;IACjC,IAAI,UAAoC,CAAC;IAEzC,IAAI,WAAW,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;QAClD,YAAY,GAAG,6BAA6B,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC;QACzE,MAAM,GAAG,oBAAoB,CAAC;QAC9B,UAAU,GAAG,QAAQ,CAAC;IACxB,CAAC;SAAM,IAAI,qBAAqB,KAAK,IAAI,IAAI,qBAAqB,GAAG,CAAC,EAAE,CAAC;QACvE,YAAY,GAAG,+BAA+B,CAC5C,qBAAqB,EACrB,QAAQ,EACR,UAAU,CACX,CAAC;QACF,MAAM,GAAG,gBAAgB,CAAC;QAC1B,UAAU,GAAG,MAAM,CAAC;IACtB,CAAC;SAAM,CAAC;QACN,YAAY,GAAG,mBAAmB,CAAC;QACnC,MAAM,GAAG,UAAU,CAAC;QACpB,UAAU,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,OAAO;QACL,WAAW;QACX,YAAY;QACZ,WAAW,EAAE,WAAW,GAAG,YAAY;QACvC,MAAM;QACN,UAAU;KACX,CAAC;AACJ,CAAC"}
@@ -0,0 +1,46 @@
1
+ import type { UsageAggregate, SessionMetrics } from '../types/metering.js';
2
+ export type AggregationGranularity = 'daily' | 'weekly' | 'monthly';
3
+ /**
4
+ * Time period boundaries for aggregation.
5
+ */
6
+ export interface TimePeriod {
7
+ start: number;
8
+ end: number;
9
+ }
10
+ /**
11
+ * Aggregates session metrics into time-period summaries.
12
+ */
13
+ export declare class UsageAggregator {
14
+ /**
15
+ * Aggregate a list of session metrics into time-period buckets.
16
+ *
17
+ * @param sessions - Session metrics to aggregate
18
+ * @param granularity - Time period granularity
19
+ * @param topPeerCount - Number of top peers to include (default: 5)
20
+ * @returns Array of UsageAggregate, one per period that has data
21
+ */
22
+ aggregate(sessions: SessionMetrics[], granularity: AggregationGranularity, topPeerCount?: number): UsageAggregate[];
23
+ /**
24
+ * Get the time period that a timestamp falls into.
25
+ */
26
+ getPeriod(timestamp: number, granularity: AggregationGranularity): TimePeriod;
27
+ /**
28
+ * Get aggregates for a specific date range.
29
+ *
30
+ * @param sessions - All available session metrics
31
+ * @param startDate - Start of range (ms since epoch)
32
+ * @param endDate - End of range (ms since epoch)
33
+ * @param granularity - Bucket granularity
34
+ * @param topPeerCount - Number of top peers to include (default: 5)
35
+ */
36
+ aggregateRange(sessions: SessionMetrics[], startDate: number, endDate: number, granularity: AggregationGranularity, topPeerCount?: number): UsageAggregate[];
37
+ /**
38
+ * Get a single aggregate for all-time usage.
39
+ */
40
+ aggregateAll(sessions: SessionMetrics[]): UsageAggregate;
41
+ /**
42
+ * Build a single UsageAggregate from a list of sessions.
43
+ */
44
+ private buildAggregate;
45
+ }
46
+ //# sourceMappingURL=usage-aggregator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage-aggregator.d.ts","sourceRoot":"","sources":["../../src/metering/usage-aggregator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAgB,MAAM,sBAAsB,CAAC;AAEzF,MAAM,MAAM,sBAAsB,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEpE;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;GAEG;AACH,qBAAa,eAAe;IAC1B;;;;;;;OAOG;IACH,SAAS,CACP,QAAQ,EAAE,cAAc,EAAE,EAC1B,WAAW,EAAE,sBAAsB,EACnC,YAAY,GAAE,MAAU,GACvB,cAAc,EAAE;IA+BnB;;OAEG;IACH,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,sBAAsB,GAAG,UAAU;IA+C7E;;;;;;;;OAQG;IACH,cAAc,CACZ,QAAQ,EAAE,cAAc,EAAE,EAC1B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,sBAAsB,EACnC,YAAY,GAAE,MAAU,GACvB,cAAc,EAAE;IAOnB;;OAEG;IACH,YAAY,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,cAAc;IAgCxD;;OAEG;IACH,OAAO,CAAC,cAAc;CAkEvB"}