@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.
- package/README.md +411 -0
- package/contracts/AntseedEscrow.sol +310 -0
- package/contracts/MockUSDC.sol +64 -0
- package/contracts/README.md +102 -0
- package/dist/config/encryption.d.ts +17 -0
- package/dist/config/encryption.d.ts.map +1 -0
- package/dist/config/encryption.js +49 -0
- package/dist/config/encryption.js.map +1 -0
- package/dist/config/plugin-config-manager.d.ts +31 -0
- package/dist/config/plugin-config-manager.d.ts.map +1 -0
- package/dist/config/plugin-config-manager.js +135 -0
- package/dist/config/plugin-config-manager.js.map +1 -0
- package/dist/config/plugin-loader.d.ts +25 -0
- package/dist/config/plugin-loader.d.ts.map +1 -0
- package/dist/config/plugin-loader.js +64 -0
- package/dist/config/plugin-loader.js.map +1 -0
- package/dist/discovery/announcer.d.ts +44 -0
- package/dist/discovery/announcer.d.ts.map +1 -0
- package/dist/discovery/announcer.js +129 -0
- package/dist/discovery/announcer.js.map +1 -0
- package/dist/discovery/bootstrap.d.ts +13 -0
- package/dist/discovery/bootstrap.d.ts.map +1 -0
- package/dist/discovery/bootstrap.js +39 -0
- package/dist/discovery/bootstrap.js.map +1 -0
- package/dist/discovery/default-metadata-resolver.d.ts +16 -0
- package/dist/discovery/default-metadata-resolver.d.ts.map +1 -0
- package/dist/discovery/default-metadata-resolver.js +16 -0
- package/dist/discovery/default-metadata-resolver.js.map +1 -0
- package/dist/discovery/dht-health.d.ts +38 -0
- package/dist/discovery/dht-health.d.ts.map +1 -0
- package/dist/discovery/dht-health.js +101 -0
- package/dist/discovery/dht-health.js.map +1 -0
- package/dist/discovery/dht-node.d.ts +34 -0
- package/dist/discovery/dht-node.d.ts.map +1 -0
- package/dist/discovery/dht-node.js +168 -0
- package/dist/discovery/dht-node.js.map +1 -0
- package/dist/discovery/http-metadata-resolver.d.ts +15 -0
- package/dist/discovery/http-metadata-resolver.d.ts.map +1 -0
- package/dist/discovery/http-metadata-resolver.js +33 -0
- package/dist/discovery/http-metadata-resolver.js.map +1 -0
- package/dist/discovery/index.d.ts +16 -0
- package/dist/discovery/index.d.ts.map +1 -0
- package/dist/discovery/index.js +15 -0
- package/dist/discovery/index.js.map +1 -0
- package/dist/discovery/metadata-codec.d.ts +22 -0
- package/dist/discovery/metadata-codec.d.ts.map +1 -0
- package/dist/discovery/metadata-codec.js +390 -0
- package/dist/discovery/metadata-codec.js.map +1 -0
- package/dist/discovery/metadata-resolver.d.ts +9 -0
- package/dist/discovery/metadata-resolver.d.ts.map +1 -0
- package/dist/discovery/metadata-resolver.js +2 -0
- package/dist/discovery/metadata-resolver.js.map +1 -0
- package/dist/discovery/metadata-server.d.ts +16 -0
- package/dist/discovery/metadata-server.d.ts.map +1 -0
- package/dist/discovery/metadata-server.js +59 -0
- package/dist/discovery/metadata-server.js.map +1 -0
- package/dist/discovery/metadata-validator.d.ts +12 -0
- package/dist/discovery/metadata-validator.d.ts.map +1 -0
- package/dist/discovery/metadata-validator.js +153 -0
- package/dist/discovery/metadata-validator.js.map +1 -0
- package/dist/discovery/peer-lookup.d.ts +26 -0
- package/dist/discovery/peer-lookup.d.ts.map +1 -0
- package/dist/discovery/peer-lookup.js +86 -0
- package/dist/discovery/peer-lookup.js.map +1 -0
- package/dist/discovery/peer-metadata.d.ts +31 -0
- package/dist/discovery/peer-metadata.d.ts.map +1 -0
- package/dist/discovery/peer-metadata.js +2 -0
- package/dist/discovery/peer-metadata.js.map +1 -0
- package/dist/discovery/peer-selector.d.ts +33 -0
- package/dist/discovery/peer-selector.d.ts.map +1 -0
- package/dist/discovery/peer-selector.js +80 -0
- package/dist/discovery/peer-selector.js.map +1 -0
- package/dist/discovery/profile-manager.d.ts +50 -0
- package/dist/discovery/profile-manager.d.ts.map +1 -0
- package/dist/discovery/profile-manager.js +105 -0
- package/dist/discovery/profile-manager.js.map +1 -0
- package/dist/discovery/profile-search.d.ts +27 -0
- package/dist/discovery/profile-search.d.ts.map +1 -0
- package/dist/discovery/profile-search.js +75 -0
- package/dist/discovery/profile-search.js.map +1 -0
- package/dist/discovery/reputation-verifier.d.ts +25 -0
- package/dist/discovery/reputation-verifier.d.ts.map +1 -0
- package/dist/discovery/reputation-verifier.js +27 -0
- package/dist/discovery/reputation-verifier.js.map +1 -0
- package/dist/index.d.ts +37 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +32 -0
- package/dist/index.js.map +1 -0
- package/dist/interfaces/buyer-router.d.ts +21 -0
- package/dist/interfaces/buyer-router.d.ts.map +1 -0
- package/dist/interfaces/buyer-router.js +2 -0
- package/dist/interfaces/buyer-router.js.map +1 -0
- package/dist/interfaces/plugin.d.ts +31 -0
- package/dist/interfaces/plugin.d.ts.map +1 -0
- package/dist/interfaces/plugin.js +2 -0
- package/dist/interfaces/plugin.js.map +1 -0
- package/dist/interfaces/seller-provider.d.ts +69 -0
- package/dist/interfaces/seller-provider.d.ts.map +1 -0
- package/dist/interfaces/seller-provider.js +2 -0
- package/dist/interfaces/seller-provider.js.map +1 -0
- package/dist/metering/index.d.ts +7 -0
- package/dist/metering/index.d.ts.map +1 -0
- package/dist/metering/index.js +7 -0
- package/dist/metering/index.js.map +1 -0
- package/dist/metering/receipt-generator.d.ts +49 -0
- package/dist/metering/receipt-generator.d.ts.map +1 -0
- package/dist/metering/receipt-generator.js +74 -0
- package/dist/metering/receipt-generator.js.map +1 -0
- package/dist/metering/receipt-verifier.d.ts +52 -0
- package/dist/metering/receipt-verifier.d.ts.map +1 -0
- package/dist/metering/receipt-verifier.js +63 -0
- package/dist/metering/receipt-verifier.js.map +1 -0
- package/dist/metering/session-tracker.d.ts +59 -0
- package/dist/metering/session-tracker.d.ts.map +1 -0
- package/dist/metering/session-tracker.js +119 -0
- package/dist/metering/session-tracker.js.map +1 -0
- package/dist/metering/storage.d.ts +72 -0
- package/dist/metering/storage.d.ts.map +1 -0
- package/dist/metering/storage.js +446 -0
- package/dist/metering/storage.js.map +1 -0
- package/dist/metering/token-counter.d.ts +50 -0
- package/dist/metering/token-counter.d.ts.map +1 -0
- package/dist/metering/token-counter.js +96 -0
- package/dist/metering/token-counter.js.map +1 -0
- package/dist/metering/usage-aggregator.d.ts +46 -0
- package/dist/metering/usage-aggregator.d.ts.map +1 -0
- package/dist/metering/usage-aggregator.js +170 -0
- package/dist/metering/usage-aggregator.js.map +1 -0
- package/dist/node.d.ts +179 -0
- package/dist/node.d.ts.map +1 -0
- package/dist/node.js +1328 -0
- package/dist/node.js.map +1 -0
- package/dist/p2p/connection-auth.d.ts +35 -0
- package/dist/p2p/connection-auth.d.ts.map +1 -0
- package/dist/p2p/connection-auth.js +102 -0
- package/dist/p2p/connection-auth.js.map +1 -0
- package/dist/p2p/connection-manager.d.ts +101 -0
- package/dist/p2p/connection-manager.d.ts.map +1 -0
- package/dist/p2p/connection-manager.js +726 -0
- package/dist/p2p/connection-manager.js.map +1 -0
- package/dist/p2p/handshake.d.ts +47 -0
- package/dist/p2p/handshake.d.ts.map +1 -0
- package/dist/p2p/handshake.js +107 -0
- package/dist/p2p/handshake.js.map +1 -0
- package/dist/p2p/ice-config.d.ts +27 -0
- package/dist/p2p/ice-config.d.ts.map +1 -0
- package/dist/p2p/ice-config.js +43 -0
- package/dist/p2p/ice-config.js.map +1 -0
- package/dist/p2p/identity.d.ts +27 -0
- package/dist/p2p/identity.d.ts.map +1 -0
- package/dist/p2p/identity.js +76 -0
- package/dist/p2p/identity.js.map +1 -0
- package/dist/p2p/index.d.ts +12 -0
- package/dist/p2p/index.d.ts.map +1 -0
- package/dist/p2p/index.js +11 -0
- package/dist/p2p/index.js.map +1 -0
- package/dist/p2p/keepalive.d.ts +49 -0
- package/dist/p2p/keepalive.d.ts.map +1 -0
- package/dist/p2p/keepalive.js +93 -0
- package/dist/p2p/keepalive.js.map +1 -0
- package/dist/p2p/message-protocol.d.ts +50 -0
- package/dist/p2p/message-protocol.d.ts.map +1 -0
- package/dist/p2p/message-protocol.js +134 -0
- package/dist/p2p/message-protocol.js.map +1 -0
- package/dist/p2p/nat-traversal.d.ts +51 -0
- package/dist/p2p/nat-traversal.d.ts.map +1 -0
- package/dist/p2p/nat-traversal.js +135 -0
- package/dist/p2p/nat-traversal.js.map +1 -0
- package/dist/p2p/payment-codec.d.ts +20 -0
- package/dist/p2p/payment-codec.d.ts.map +1 -0
- package/dist/p2p/payment-codec.js +130 -0
- package/dist/p2p/payment-codec.js.map +1 -0
- package/dist/p2p/payment-mux.d.ts +49 -0
- package/dist/p2p/payment-mux.d.ts.map +1 -0
- package/dist/p2p/payment-mux.js +131 -0
- package/dist/p2p/payment-mux.js.map +1 -0
- package/dist/p2p/reconnect.d.ts +48 -0
- package/dist/p2p/reconnect.d.ts.map +1 -0
- package/dist/p2p/reconnect.js +89 -0
- package/dist/p2p/reconnect.js.map +1 -0
- package/dist/payments/balance-manager.d.ts +17 -0
- package/dist/payments/balance-manager.d.ts.map +1 -0
- package/dist/payments/balance-manager.js +54 -0
- package/dist/payments/balance-manager.js.map +1 -0
- package/dist/payments/buyer-payment-manager.d.ts +122 -0
- package/dist/payments/buyer-payment-manager.d.ts.map +1 -0
- package/dist/payments/buyer-payment-manager.js +280 -0
- package/dist/payments/buyer-payment-manager.js.map +1 -0
- package/dist/payments/disputes.d.ts +18 -0
- package/dist/payments/disputes.d.ts.map +1 -0
- package/dist/payments/disputes.js +47 -0
- package/dist/payments/disputes.js.map +1 -0
- package/dist/payments/evm/escrow-client.d.ts +61 -0
- package/dist/payments/evm/escrow-client.d.ts.map +1 -0
- package/dist/payments/evm/escrow-client.js +170 -0
- package/dist/payments/evm/escrow-client.js.map +1 -0
- package/dist/payments/evm/keypair.d.ts +21 -0
- package/dist/payments/evm/keypair.d.ts.map +1 -0
- package/dist/payments/evm/keypair.js +29 -0
- package/dist/payments/evm/keypair.js.map +1 -0
- package/dist/payments/evm/signatures.d.ts +11 -0
- package/dist/payments/evm/signatures.d.ts.map +1 -0
- package/dist/payments/evm/signatures.js +56 -0
- package/dist/payments/evm/signatures.js.map +1 -0
- package/dist/payments/evm/wallet.d.ts +5 -0
- package/dist/payments/evm/wallet.d.ts.map +1 -0
- package/dist/payments/evm/wallet.js +31 -0
- package/dist/payments/evm/wallet.js.map +1 -0
- package/dist/payments/index.d.ts +13 -0
- package/dist/payments/index.d.ts.map +1 -0
- package/dist/payments/index.js +14 -0
- package/dist/payments/index.js.map +1 -0
- package/dist/payments/settlement.d.ts +6 -0
- package/dist/payments/settlement.d.ts.map +1 -0
- package/dist/payments/settlement.js +25 -0
- package/dist/payments/settlement.js.map +1 -0
- package/dist/payments/types.d.ts +66 -0
- package/dist/payments/types.d.ts.map +1 -0
- package/dist/payments/types.js +2 -0
- package/dist/payments/types.js.map +1 -0
- package/dist/proxy/index.d.ts +4 -0
- package/dist/proxy/index.d.ts.map +1 -0
- package/dist/proxy/index.js +4 -0
- package/dist/proxy/index.js.map +1 -0
- package/dist/proxy/provider-detection.d.ts +20 -0
- package/dist/proxy/provider-detection.d.ts.map +1 -0
- package/dist/proxy/provider-detection.js +61 -0
- package/dist/proxy/provider-detection.js.map +1 -0
- package/dist/proxy/proxy-mux.d.ts +35 -0
- package/dist/proxy/proxy-mux.d.ts.map +1 -0
- package/dist/proxy/proxy-mux.js +137 -0
- package/dist/proxy/proxy-mux.js.map +1 -0
- package/dist/proxy/request-codec.d.ts +33 -0
- package/dist/proxy/request-codec.d.ts.map +1 -0
- package/dist/proxy/request-codec.js +238 -0
- package/dist/proxy/request-codec.js.map +1 -0
- package/dist/reputation/index.d.ts +7 -0
- package/dist/reputation/index.d.ts.map +1 -0
- package/dist/reputation/index.js +6 -0
- package/dist/reputation/index.js.map +1 -0
- package/dist/reputation/rating-manager.d.ts +20 -0
- package/dist/reputation/rating-manager.d.ts.map +1 -0
- package/dist/reputation/rating-manager.js +91 -0
- package/dist/reputation/rating-manager.js.map +1 -0
- package/dist/reputation/report-manager.d.ts +21 -0
- package/dist/reputation/report-manager.d.ts.map +1 -0
- package/dist/reputation/report-manager.js +70 -0
- package/dist/reputation/report-manager.js.map +1 -0
- package/dist/reputation/trust-engine.d.ts +36 -0
- package/dist/reputation/trust-engine.d.ts.map +1 -0
- package/dist/reputation/trust-engine.js +95 -0
- package/dist/reputation/trust-engine.js.map +1 -0
- package/dist/reputation/trust-score.d.ts +43 -0
- package/dist/reputation/trust-score.d.ts.map +1 -0
- package/dist/reputation/trust-score.js +34 -0
- package/dist/reputation/trust-score.js.map +1 -0
- package/dist/reputation/uptime-tracker.d.ts +51 -0
- package/dist/reputation/uptime-tracker.d.ts.map +1 -0
- package/dist/reputation/uptime-tracker.js +123 -0
- package/dist/reputation/uptime-tracker.js.map +1 -0
- package/dist/routing/default-router.d.ts +21 -0
- package/dist/routing/default-router.d.ts.map +1 -0
- package/dist/routing/default-router.js +60 -0
- package/dist/routing/default-router.js.map +1 -0
- package/dist/types/buyer.d.ts +36 -0
- package/dist/types/buyer.d.ts.map +1 -0
- package/dist/types/buyer.js +2 -0
- package/dist/types/buyer.js.map +1 -0
- package/dist/types/capability.d.ts +25 -0
- package/dist/types/capability.d.ts.map +1 -0
- package/dist/types/capability.js +2 -0
- package/dist/types/capability.js.map +1 -0
- package/dist/types/connection.d.ts +27 -0
- package/dist/types/connection.d.ts.map +1 -0
- package/dist/types/connection.js +11 -0
- package/dist/types/connection.js.map +1 -0
- package/dist/types/http.d.ts +19 -0
- package/dist/types/http.d.ts.map +1 -0
- package/dist/types/http.js +2 -0
- package/dist/types/http.js.map +1 -0
- package/dist/types/index.d.ts +15 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +15 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/metering.d.ts +170 -0
- package/dist/types/metering.d.ts.map +1 -0
- package/dist/types/metering.js +2 -0
- package/dist/types/metering.js.map +1 -0
- package/dist/types/peer-profile.d.ts +24 -0
- package/dist/types/peer-profile.d.ts.map +1 -0
- package/dist/types/peer-profile.js +2 -0
- package/dist/types/peer-profile.js.map +1 -0
- package/dist/types/peer.d.ts +56 -0
- package/dist/types/peer.d.ts.map +1 -0
- package/dist/types/peer.js +11 -0
- package/dist/types/peer.js.map +1 -0
- package/dist/types/plugin-config.d.ts +31 -0
- package/dist/types/plugin-config.d.ts.map +1 -0
- package/dist/types/plugin-config.js +2 -0
- package/dist/types/plugin-config.js.map +1 -0
- package/dist/types/protocol.d.ts +141 -0
- package/dist/types/protocol.d.ts.map +1 -0
- package/dist/types/protocol.js +42 -0
- package/dist/types/protocol.js.map +1 -0
- package/dist/types/provider.d.ts +38 -0
- package/dist/types/provider.d.ts.map +1 -0
- package/dist/types/provider.js +11 -0
- package/dist/types/provider.js.map +1 -0
- package/dist/types/rating.d.ts +21 -0
- package/dist/types/rating.d.ts.map +1 -0
- package/dist/types/rating.js +2 -0
- package/dist/types/rating.js.map +1 -0
- package/dist/types/report.d.ts +20 -0
- package/dist/types/report.d.ts.map +1 -0
- package/dist/types/report.js +2 -0
- package/dist/types/report.js.map +1 -0
- package/dist/types/seller.d.ts +36 -0
- package/dist/types/seller.d.ts.map +1 -0
- package/dist/types/seller.js +2 -0
- package/dist/types/seller.js.map +1 -0
- package/dist/types/staking.d.ts +16 -0
- package/dist/types/staking.d.ts.map +1 -0
- package/dist/types/staking.js +6 -0
- package/dist/types/staking.js.map +1 -0
- package/dist/utils/debug.d.ts +4 -0
- package/dist/utils/debug.d.ts.map +1 -0
- package/dist/utils/debug.js +25 -0
- package/dist/utils/debug.js.map +1 -0
- package/dist/utils/hex.d.ts +3 -0
- package/dist/utils/hex.d.ts.map +1 -0
- package/dist/utils/hex.js +15 -0
- package/dist/utils/hex.js.map +1 -0
- package/package.json +62 -0
- package/scripts/ensure-node-native-modules.mjs +153 -0
- package/scripts/patch-ethers.js +44 -0
- package/src/config/encryption.test.ts +49 -0
- package/src/config/encryption.ts +53 -0
- package/src/config/plugin-config-manager.test.ts +92 -0
- package/src/config/plugin-config-manager.ts +153 -0
- package/src/config/plugin-loader.ts +90 -0
- package/src/discovery/announcer.ts +169 -0
- package/src/discovery/bootstrap.ts +57 -0
- package/src/discovery/default-metadata-resolver.ts +18 -0
- package/src/discovery/dht-health.ts +136 -0
- package/src/discovery/dht-node.ts +191 -0
- package/src/discovery/http-metadata-resolver.ts +47 -0
- package/src/discovery/index.ts +15 -0
- package/src/discovery/metadata-codec.ts +453 -0
- package/src/discovery/metadata-resolver.ts +7 -0
- package/src/discovery/metadata-server.ts +73 -0
- package/src/discovery/metadata-validator.ts +172 -0
- package/src/discovery/peer-lookup.ts +122 -0
- package/src/discovery/peer-metadata.ts +34 -0
- package/src/discovery/peer-selector.ts +134 -0
- package/src/discovery/profile-manager.ts +131 -0
- package/src/discovery/profile-search.ts +100 -0
- package/src/discovery/reputation-verifier.ts +54 -0
- package/src/index.ts +61 -0
- package/src/interfaces/buyer-router.ts +21 -0
- package/src/interfaces/plugin.ts +36 -0
- package/src/interfaces/seller-provider.ts +81 -0
- package/src/metering/index.ts +6 -0
- package/src/metering/receipt-generator.ts +105 -0
- package/src/metering/receipt-verifier.ts +102 -0
- package/src/metering/session-tracker.ts +145 -0
- package/src/metering/storage.ts +600 -0
- package/src/metering/token-counter.ts +127 -0
- package/src/metering/usage-aggregator.ts +236 -0
- package/src/node.ts +1698 -0
- package/src/p2p/connection-auth.ts +152 -0
- package/src/p2p/connection-manager.ts +916 -0
- package/src/p2p/handshake.ts +162 -0
- package/src/p2p/ice-config.ts +59 -0
- package/src/p2p/identity.ts +110 -0
- package/src/p2p/index.ts +11 -0
- package/src/p2p/keepalive.ts +118 -0
- package/src/p2p/message-protocol.ts +171 -0
- package/src/p2p/nat-traversal.ts +169 -0
- package/src/p2p/payment-codec.ts +165 -0
- package/src/p2p/payment-mux.ts +153 -0
- package/src/p2p/reconnect.ts +117 -0
- package/src/payments/balance-manager.ts +77 -0
- package/src/payments/buyer-payment-manager.ts +414 -0
- package/src/payments/disputes.ts +72 -0
- package/src/payments/evm/escrow-client.ts +263 -0
- package/src/payments/evm/keypair.ts +31 -0
- package/src/payments/evm/signatures.ts +103 -0
- package/src/payments/evm/wallet.ts +42 -0
- package/src/payments/index.ts +50 -0
- package/src/payments/settlement.ts +40 -0
- package/src/payments/types.ts +79 -0
- package/src/proxy/index.ts +3 -0
- package/src/proxy/provider-detection.ts +78 -0
- package/src/proxy/proxy-mux.ts +173 -0
- package/src/proxy/request-codec.ts +294 -0
- package/src/reputation/index.ts +6 -0
- package/src/reputation/rating-manager.ts +118 -0
- package/src/reputation/report-manager.ts +91 -0
- package/src/reputation/trust-engine.ts +120 -0
- package/src/reputation/trust-score.ts +74 -0
- package/src/reputation/uptime-tracker.ts +155 -0
- package/src/routing/default-router.ts +75 -0
- package/src/types/bittorrent-dht.d.ts +19 -0
- package/src/types/buyer.ts +37 -0
- package/src/types/capability.ts +34 -0
- package/src/types/connection.ts +29 -0
- package/src/types/http.ts +20 -0
- package/src/types/index.ts +14 -0
- package/src/types/metering.ts +175 -0
- package/src/types/nat-api.d.ts +29 -0
- package/src/types/peer-profile.ts +25 -0
- package/src/types/peer.ts +62 -0
- package/src/types/plugin-config.ts +31 -0
- package/src/types/protocol.ts +162 -0
- package/src/types/provider.ts +40 -0
- package/src/types/rating.ts +23 -0
- package/src/types/report.ts +30 -0
- package/src/types/seller.ts +38 -0
- package/src/types/staking.ts +23 -0
- package/src/utils/debug.ts +30 -0
- package/src/utils/hex.ts +14 -0
- package/tests/balance-manager.test.ts +156 -0
- package/tests/bootstrap.test.ts +108 -0
- package/tests/buyer-payment-manager.test.ts +358 -0
- package/tests/connection-auth.test.ts +87 -0
- package/tests/default-router.test.ts +148 -0
- package/tests/evm-keypair.test.ts +173 -0
- package/tests/identity.test.ts +133 -0
- package/tests/message-protocol.test.ts +212 -0
- package/tests/metadata-codec.test.ts +165 -0
- package/tests/metadata-validator.test.ts +261 -0
- package/tests/metering-storage.test.ts +244 -0
- package/tests/payment-codec.test.ts +95 -0
- package/tests/payment-mux.test.ts +191 -0
- package/tests/peer-selector.test.ts +184 -0
- package/tests/provider-detection.test.ts +107 -0
- package/tests/proxy-mux-security.test.ts +38 -0
- package/tests/receipt.test.ts +215 -0
- package/tests/reputation-integration.test.ts +195 -0
- package/tests/request-codec.test.ts +144 -0
- package/tests/token-counter.test.ts +122 -0
- package/tsconfig.json +9 -0
- 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":"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"}
|
|
@@ -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"}
|