tapimo 0.1.0 → 0.3.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 +57 -16
- package/dist/ApiKey.d.ts +4 -1
- package/dist/ApiKey.d.ts.map +1 -1
- package/dist/ApiKey.js +6 -2
- package/dist/ApiKey.js.map +1 -1
- package/dist/ApiKeys.d.ts +98 -3
- package/dist/ApiKeys.d.ts.map +1 -1
- package/dist/ApiKeys.js +150 -1
- package/dist/ApiKeys.js.map +1 -1
- package/dist/App.d.ts +7917 -2315
- package/dist/App.d.ts.map +1 -1
- package/dist/App.js +141 -329
- package/dist/App.js.map +1 -1
- package/dist/Scope.d.ts +20 -4
- package/dist/Scope.d.ts.map +1 -1
- package/dist/Scope.js +23 -4
- package/dist/Scope.js.map +1 -1
- package/dist/Webhooks.d.ts +2 -2
- package/dist/Webhooks.d.ts.map +1 -1
- package/dist/Webhooks.js +2 -2
- package/dist/Webhooks.js.map +1 -1
- package/dist/admin/App.d.ts +203 -120
- package/dist/admin/App.d.ts.map +1 -1
- package/dist/admin/apps/api-keys.d.ts +111 -6
- package/dist/admin/apps/api-keys.d.ts.map +1 -1
- package/dist/admin/apps/api-keys.js +67 -0
- package/dist/admin/apps/api-keys.js.map +1 -1
- package/dist/admin/apps/scopes.d.ts +12 -1
- package/dist/admin/apps/scopes.d.ts.map +1 -1
- package/dist/admin/apps/scopes.js +3 -0
- package/dist/admin/apps/scopes.js.map +1 -1
- package/dist/admin/apps/verified-tokens.d.ts +116 -116
- package/dist/admin/apps/verified-tokens.js +1 -1
- package/dist/admin/apps/verified-tokens.js.map +1 -1
- package/dist/admin/ui.generated.d.ts +1 -1
- package/dist/admin/ui.generated.js +13 -13
- package/dist/admin/ui.generated.js.map +1 -1
- package/dist/analytics/Analytics.d.ts +151 -0
- package/dist/analytics/Analytics.d.ts.map +1 -0
- package/dist/analytics/Analytics.js +212 -0
- package/dist/analytics/Analytics.js.map +1 -0
- package/dist/analytics/tables/requestEvents.d.ts +215 -0
- package/dist/analytics/tables/requestEvents.d.ts.map +1 -0
- package/dist/analytics/tables/requestEvents.js +264 -0
- package/dist/analytics/tables/requestEvents.js.map +1 -0
- package/dist/apps/data/App.d.ts +19576 -0
- package/dist/apps/data/App.d.ts.map +1 -0
- package/dist/apps/data/App.js +272 -0
- package/dist/apps/data/App.js.map +1 -0
- package/dist/apps/data/index.d.ts +3 -0
- package/dist/apps/data/index.d.ts.map +1 -0
- package/dist/apps/data/index.js +3 -0
- package/dist/apps/data/index.js.map +1 -0
- package/dist/apps/{activities.d.ts → data/routes/activities.d.ts} +32 -32
- package/dist/apps/{activities.d.ts.map → data/routes/activities.d.ts.map} +1 -1
- package/dist/apps/{activities.js → data/routes/activities.js} +13 -13
- package/dist/apps/data/routes/activities.js.map +1 -0
- package/dist/apps/{addresses.d.ts → data/routes/addresses.d.ts} +22 -22
- package/dist/apps/{addresses.d.ts.map → data/routes/addresses.d.ts.map} +1 -1
- package/dist/apps/{addresses.js → data/routes/addresses.js} +5 -5
- package/dist/apps/data/routes/addresses.js.map +1 -0
- package/dist/apps/{balances.d.ts → data/routes/balances.d.ts} +4 -4
- package/dist/apps/data/routes/balances.d.ts.map +1 -0
- package/dist/apps/{balances.js → data/routes/balances.js} +42 -11
- package/dist/apps/data/routes/balances.js.map +1 -0
- package/dist/apps/{blocks.d.ts → data/routes/blocks.d.ts} +47 -47
- package/dist/apps/data/routes/blocks.d.ts.map +1 -0
- package/dist/apps/{blocks.js → data/routes/blocks.js} +13 -13
- package/dist/apps/data/routes/blocks.js.map +1 -0
- package/dist/apps/{coingecko.d.ts → data/routes/coingecko.d.ts} +8 -8
- package/dist/apps/data/routes/coingecko.d.ts.map +1 -0
- package/dist/apps/{coingecko.js → data/routes/coingecko.js} +13 -13
- package/dist/apps/data/routes/coingecko.js.map +1 -0
- package/dist/apps/{exchanges.d.ts → data/routes/exchanges.d.ts} +108 -108
- package/dist/apps/data/routes/exchanges.d.ts.map +1 -0
- package/dist/apps/{exchanges.js → data/routes/exchanges.js} +19 -19
- package/dist/apps/data/routes/exchanges.js.map +1 -0
- package/dist/apps/{fee-amm.d.ts → data/routes/fee-amm.d.ts} +39 -39
- package/dist/apps/data/routes/fee-amm.d.ts.map +1 -0
- package/dist/apps/{fee-amm.js → data/routes/fee-amm.js} +17 -17
- package/dist/apps/data/routes/fee-amm.js.map +1 -0
- package/dist/apps/data/routes/funding.d.ts +765 -0
- package/dist/apps/data/routes/funding.d.ts.map +1 -0
- package/dist/apps/data/routes/funding.js +383 -0
- package/dist/apps/data/routes/funding.js.map +1 -0
- package/dist/apps/{indexer.d.ts → data/routes/indexer.d.ts} +4 -4
- package/dist/apps/data/routes/indexer.d.ts.map +1 -0
- package/dist/apps/{indexer.js → data/routes/indexer.js} +13 -9
- package/dist/apps/data/routes/indexer.js.map +1 -0
- package/dist/apps/{receipts.d.ts → data/routes/receipts.d.ts} +49 -49
- package/dist/apps/data/routes/receipts.d.ts.map +1 -0
- package/dist/apps/{receipts.js → data/routes/receipts.js} +14 -20
- package/dist/apps/data/routes/receipts.js.map +1 -0
- package/dist/apps/{rpc.d.ts → data/routes/rpc.d.ts} +33 -40
- package/dist/apps/data/routes/rpc.d.ts.map +1 -0
- package/dist/apps/{rpc.js → data/routes/rpc.js} +35 -7
- package/dist/apps/data/routes/rpc.js.map +1 -0
- package/dist/apps/{tokenlist.d.ts → data/routes/tokenlist.d.ts} +40 -40
- package/dist/apps/data/routes/tokenlist.d.ts.map +1 -0
- package/dist/apps/{tokenlist.js → data/routes/tokenlist.js} +8 -8
- package/dist/apps/data/routes/tokenlist.js.map +1 -0
- package/dist/apps/{tokens.d.ts → data/routes/tokens.d.ts} +468 -468
- package/dist/apps/data/routes/tokens.d.ts.map +1 -0
- package/dist/apps/{tokens.js → data/routes/tokens.js} +19 -19
- package/dist/apps/data/routes/tokens.js.map +1 -0
- package/dist/apps/{transactions.d.ts → data/routes/transactions.d.ts} +304 -304
- package/dist/apps/data/routes/transactions.d.ts.map +1 -0
- package/dist/apps/{transactions.js → data/routes/transactions.js} +13 -13
- package/dist/apps/data/routes/transactions.js.map +1 -0
- package/dist/apps/{transfers.d.ts → data/routes/transfers.d.ts} +62 -62
- package/dist/apps/data/routes/transfers.d.ts.map +1 -0
- package/dist/apps/{transfers.js → data/routes/transfers.js} +13 -13
- package/dist/apps/data/routes/transfers.js.map +1 -0
- package/dist/apps/{verified-tokens.d.ts → data/routes/verified-tokens.d.ts} +6 -6
- package/dist/apps/data/routes/verified-tokens.d.ts.map +1 -0
- package/dist/apps/{verified-tokens.js → data/routes/verified-tokens.js} +9 -9
- package/dist/apps/data/routes/verified-tokens.js.map +1 -0
- package/dist/apps/{webhooks.d.ts → data/routes/webhooks.d.ts} +17 -17
- package/dist/apps/{webhooks.d.ts.map → data/routes/webhooks.d.ts.map} +1 -1
- package/dist/apps/{webhooks.js → data/routes/webhooks.js} +38 -34
- package/dist/apps/data/routes/webhooks.js.map +1 -0
- package/dist/apps/docs/App.d.ts +29 -0
- package/dist/apps/docs/App.d.ts.map +1 -0
- package/dist/apps/docs/App.js +54 -0
- package/dist/apps/docs/App.js.map +1 -0
- package/dist/{internal/OpenApi.fonts.d.ts → apps/docs/fonts.d.ts} +1 -1
- package/dist/apps/docs/fonts.d.ts.map +1 -0
- package/dist/{internal/OpenApi.fonts.js → apps/docs/fonts.js} +1 -1
- package/dist/apps/docs/fonts.js.map +1 -0
- package/dist/apps/docs/index.d.ts +2 -0
- package/dist/apps/docs/index.d.ts.map +1 -0
- package/dist/apps/docs/index.js +2 -0
- package/dist/apps/docs/index.js.map +1 -0
- package/dist/{internal/OpenApi.logo.d.ts → apps/docs/logo.d.ts} +1 -1
- package/dist/apps/docs/logo.d.ts.map +1 -0
- package/dist/{internal/OpenApi.logo.js → apps/docs/logo.js} +1 -1
- package/dist/apps/docs/logo.js.map +1 -0
- package/dist/apps/docs/reference.d.ts +21 -0
- package/dist/apps/docs/reference.d.ts.map +1 -0
- package/dist/apps/docs/reference.js +112 -0
- package/dist/apps/docs/reference.js.map +1 -0
- package/dist/apps/index.d.ts +5 -0
- package/dist/apps/index.d.ts.map +1 -0
- package/dist/apps/index.js +5 -0
- package/dist/apps/index.js.map +1 -0
- package/dist/apps/mcp.d.ts +76 -0
- package/dist/apps/mcp.d.ts.map +1 -0
- package/dist/apps/mcp.js +188 -0
- package/dist/apps/mcp.js.map +1 -0
- package/dist/apps/metadata.d.ts +7 -0
- package/dist/apps/metadata.d.ts.map +1 -0
- package/dist/apps/metadata.js +15 -0
- package/dist/apps/metadata.js.map +1 -0
- package/dist/apps/platform/App.d.ts +5262 -0
- package/dist/apps/platform/App.d.ts.map +1 -0
- package/dist/apps/platform/App.js +84 -0
- package/dist/apps/platform/App.js.map +1 -0
- package/dist/apps/platform/Billing.d.ts +279 -0
- package/dist/apps/platform/Billing.d.ts.map +1 -0
- package/dist/apps/platform/Billing.js +477 -0
- package/dist/apps/platform/Billing.js.map +1 -0
- package/dist/apps/platform/index.d.ts +3 -0
- package/dist/apps/platform/index.d.ts.map +1 -0
- package/dist/apps/platform/index.js +3 -0
- package/dist/apps/platform/index.js.map +1 -0
- package/dist/apps/platform/routes/api-keys.d.ts +973 -0
- package/dist/apps/platform/routes/api-keys.d.ts.map +1 -0
- package/dist/apps/platform/routes/api-keys.js +430 -0
- package/dist/apps/platform/routes/api-keys.js.map +1 -0
- package/dist/apps/platform/routes/billing.d.ts +1520 -0
- package/dist/apps/platform/routes/billing.d.ts.map +1 -0
- package/dist/apps/platform/routes/billing.js +795 -0
- package/dist/apps/platform/routes/billing.js.map +1 -0
- package/dist/apps/platform/routes/invitations.d.ts +851 -0
- package/dist/apps/platform/routes/invitations.d.ts.map +1 -0
- package/dist/apps/platform/routes/invitations.js +471 -0
- package/dist/apps/platform/routes/invitations.js.map +1 -0
- package/dist/apps/platform/routes/me.d.ts +95 -0
- package/dist/apps/platform/routes/me.d.ts.map +1 -0
- package/dist/apps/platform/routes/me.js +81 -0
- package/dist/apps/platform/routes/me.js.map +1 -0
- package/dist/apps/platform/routes/members.d.ts +554 -0
- package/dist/apps/platform/routes/members.d.ts.map +1 -0
- package/dist/apps/platform/routes/members.js +251 -0
- package/dist/apps/platform/routes/members.js.map +1 -0
- package/dist/apps/platform/routes/orgs.d.ts +596 -0
- package/dist/apps/platform/routes/orgs.d.ts.map +1 -0
- package/dist/apps/platform/routes/orgs.js +276 -0
- package/dist/apps/platform/routes/orgs.js.map +1 -0
- package/dist/apps/platform/routes/projects.d.ts +740 -0
- package/dist/apps/platform/routes/projects.d.ts.map +1 -0
- package/dist/apps/platform/routes/projects.js +286 -0
- package/dist/apps/platform/routes/projects.js.map +1 -0
- package/dist/apps/platform/routes/scopes.d.ts +107 -0
- package/dist/apps/platform/routes/scopes.d.ts.map +1 -0
- package/dist/apps/platform/routes/scopes.js +66 -0
- package/dist/apps/platform/routes/scopes.js.map +1 -0
- package/dist/apps/platform/routes/usage.d.ts +588 -0
- package/dist/apps/platform/routes/usage.d.ts.map +1 -0
- package/dist/apps/platform/routes/usage.js +391 -0
- package/dist/apps/platform/routes/usage.js.map +1 -0
- package/dist/apps/relay/App.d.ts +44 -0
- package/dist/apps/relay/App.d.ts.map +1 -0
- package/dist/apps/relay/App.js +211 -0
- package/dist/apps/relay/App.js.map +1 -0
- package/dist/apps/relay/Sponsorships.d.ts +107 -0
- package/dist/apps/relay/Sponsorships.d.ts.map +1 -0
- package/dist/apps/relay/Sponsorships.js +194 -0
- package/dist/apps/relay/Sponsorships.js.map +1 -0
- package/dist/apps/relay/index.d.ts +3 -0
- package/dist/apps/relay/index.d.ts.map +1 -0
- package/dist/apps/relay/index.js +3 -0
- package/dist/apps/relay/index.js.map +1 -0
- package/dist/cli/Cli.d.ts +9 -2
- package/dist/cli/Cli.d.ts.map +1 -1
- package/dist/cli/Cli.js +12 -4
- package/dist/cli/Cli.js.map +1 -1
- package/dist/cli/commands/admin.d.ts +5 -1
- package/dist/cli/commands/admin.d.ts.map +1 -1
- package/dist/cli/commands/admin.js +82 -3
- package/dist/cli/commands/admin.js.map +1 -1
- package/dist/db/Db.d.ts +17 -0
- package/dist/db/Db.d.ts.map +1 -1
- package/dist/db/Db.js +254 -0
- package/dist/db/Db.js.map +1 -1
- package/dist/db/Schema.d.ts +159 -0
- package/dist/db/Schema.d.ts.map +1 -1
- package/dist/db/Schema.js +187 -2
- package/dist/db/Schema.js.map +1 -1
- package/dist/db/tables/billingSettings.d.ts +55 -0
- package/dist/db/tables/billingSettings.d.ts.map +1 -0
- package/dist/db/tables/billingSettings.js +70 -0
- package/dist/db/tables/billingSettings.js.map +1 -0
- package/dist/db/tables/invitations.d.ts +84 -0
- package/dist/db/tables/invitations.d.ts.map +1 -0
- package/dist/db/tables/invitations.js +165 -0
- package/dist/db/tables/invitations.js.map +1 -0
- package/dist/db/tables/memberships.d.ts +108 -0
- package/dist/db/tables/memberships.d.ts.map +1 -0
- package/dist/db/tables/memberships.js +153 -0
- package/dist/db/tables/memberships.js.map +1 -0
- package/dist/db/tables/organizations.d.ts +48 -0
- package/dist/db/tables/organizations.d.ts.map +1 -1
- package/dist/db/tables/organizations.js +97 -2
- package/dist/db/tables/organizations.js.map +1 -1
- package/dist/db/tables/projects.d.ts +65 -0
- package/dist/db/tables/projects.d.ts.map +1 -0
- package/dist/db/tables/projects.js +75 -0
- package/dist/db/tables/projects.js.map +1 -0
- package/dist/db/tables/requestUsage.d.ts +121 -0
- package/dist/db/tables/requestUsage.d.ts.map +1 -0
- package/dist/db/tables/requestUsage.js +150 -0
- package/dist/db/tables/requestUsage.js.map +1 -0
- package/dist/db/tables/sponsoredTransactions.d.ts +239 -0
- package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -0
- package/dist/db/tables/sponsoredTransactions.js +314 -0
- package/dist/db/tables/sponsoredTransactions.js.map +1 -0
- package/dist/db/tables/stripeCustomers.d.ts +81 -0
- package/dist/db/tables/stripeCustomers.d.ts.map +1 -0
- package/dist/db/tables/stripeCustomers.js +120 -0
- package/dist/db/tables/stripeCustomers.js.map +1 -0
- package/dist/db/tables/users.d.ts +48 -0
- package/dist/db/tables/users.d.ts.map +1 -0
- package/dist/db/tables/users.js +65 -0
- package/dist/db/tables/users.js.map +1 -0
- package/dist/handlers/internal/executionError.d.ts.map +1 -1
- package/dist/handlers/internal/executionError.js +2 -0
- package/dist/handlers/internal/executionError.js.map +1 -1
- package/dist/handlers/internal/multisig.d.ts +2 -6
- package/dist/handlers/internal/multisig.d.ts.map +1 -1
- package/dist/handlers/internal/multisig.js +11 -36
- package/dist/handlers/internal/multisig.js.map +1 -1
- package/dist/handlers/internal/sponsorship.d.ts +35 -2
- package/dist/handlers/internal/sponsorship.d.ts.map +1 -1
- package/dist/handlers/internal/sponsorship.js +53 -14
- package/dist/handlers/internal/sponsorship.js.map +1 -1
- package/dist/handlers/internal/utils.d.ts +10 -3
- package/dist/handlers/internal/utils.d.ts.map +1 -1
- package/dist/handlers/internal/utils.js +14 -6
- package/dist/handlers/internal/utils.js.map +1 -1
- package/dist/handlers/relay.d.ts +6 -2
- package/dist/handlers/relay.d.ts.map +1 -1
- package/dist/handlers/relay.js +16 -2
- package/dist/handlers/relay.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/internal/Auth.d.ts +222 -6
- package/dist/internal/Auth.d.ts.map +1 -1
- package/dist/internal/Auth.js +625 -74
- package/dist/internal/Auth.js.map +1 -1
- package/dist/internal/Cache.d.ts.map +1 -1
- package/dist/internal/Cache.js +4 -1
- package/dist/internal/Cache.js.map +1 -1
- package/dist/internal/EdgeCache.d.ts +10 -0
- package/dist/internal/EdgeCache.d.ts.map +1 -1
- package/dist/internal/EdgeCache.js +39 -8
- package/dist/internal/EdgeCache.js.map +1 -1
- package/dist/internal/Fees.d.ts +27 -0
- package/dist/internal/Fees.d.ts.map +1 -0
- package/dist/internal/Fees.js +48 -0
- package/dist/internal/Fees.js.map +1 -0
- package/dist/internal/FundingRoutes.d.ts +183 -0
- package/dist/internal/FundingRoutes.d.ts.map +1 -0
- package/dist/internal/FundingRoutes.js +490 -0
- package/dist/internal/FundingRoutes.js.map +1 -0
- package/dist/internal/Id.d.ts +15 -0
- package/dist/internal/Id.d.ts.map +1 -0
- package/dist/internal/Id.js +22 -0
- package/dist/internal/Id.js.map +1 -0
- package/dist/internal/Log.d.ts +9 -3
- package/dist/internal/Log.d.ts.map +1 -1
- package/dist/internal/Log.js +7 -0
- package/dist/internal/Log.js.map +1 -1
- package/dist/internal/OpenApi.d.ts +10 -20
- package/dist/internal/OpenApi.d.ts.map +1 -1
- package/dist/internal/OpenApi.js +8 -58
- package/dist/internal/OpenApi.js.map +1 -1
- package/dist/internal/RateLimit.d.ts +25 -0
- package/dist/internal/RateLimit.d.ts.map +1 -1
- package/dist/internal/RateLimit.js +51 -0
- package/dist/internal/RateLimit.js.map +1 -1
- package/dist/internal/Response.d.ts +1 -1
- package/dist/internal/Response.d.ts.map +1 -1
- package/dist/internal/Schema.d.ts +8 -0
- package/dist/internal/Schema.d.ts.map +1 -1
- package/dist/internal/Schema.js +7 -0
- package/dist/internal/Schema.js.map +1 -1
- package/dist/internal/Store.d.ts +7 -1
- package/dist/internal/Store.d.ts.map +1 -1
- package/dist/internal/Store.js +16 -2
- package/dist/internal/Store.js.map +1 -1
- package/dist/internal/Viem.d.ts +84 -0
- package/dist/internal/Viem.d.ts.map +1 -1
- package/dist/internal/Webhooks.d.ts +1 -1
- package/dist/internal/Webhooks.d.ts.map +1 -1
- package/dist/internal/Webhooks.js +3 -3
- package/dist/internal/Webhooks.js.map +1 -1
- package/package.json +33 -6
- package/src/ApiKey.ts +10 -2
- package/src/ApiKeys.test.ts +155 -1
- package/src/ApiKeys.ts +203 -1
- package/src/App.test.ts +64 -75741
- package/src/App.ts +218 -420
- package/src/Client.test-d.ts +657 -15
- package/src/Scope.ts +26 -4
- package/src/Webhooks.ts +2 -2
- package/src/admin/apps/api-keys.test.ts +51 -0
- package/src/admin/apps/api-keys.ts +84 -0
- package/src/admin/apps/scopes.test.ts +11 -1
- package/src/admin/apps/scopes.ts +3 -0
- package/src/admin/apps/verified-tokens.ts +1 -1
- package/src/admin/ui/src/components/Page.tsx +2 -3
- package/src/admin/ui/src/routes/__root.tsx +2 -2
- package/src/admin/ui/src/routes/api-keys.tsx +2 -2
- package/src/admin/ui.generated.ts +13 -13
- package/src/analytics/Analytics.test.ts +527 -0
- package/src/analytics/Analytics.ts +318 -0
- package/src/analytics/tables/requestEvents.ts +523 -0
- package/src/apps/composition.test.ts +66 -0
- package/src/apps/data/App.test.ts +72 -0
- package/src/apps/data/App.ts +330 -0
- package/src/apps/data/index.ts +2 -0
- package/src/apps/{activities.test.ts → data/routes/activities.test.ts} +3 -3
- package/src/apps/{activities.ts → data/routes/activities.ts} +15 -15
- package/src/apps/{addresses.ts → data/routes/addresses.ts} +6 -6
- package/src/apps/{balances.test.ts → data/routes/balances.test.ts} +2 -2
- package/src/apps/{balances.ts → data/routes/balances.ts} +46 -12
- package/src/apps/{blocks.test.ts → data/routes/blocks.test.ts} +3 -3
- package/src/apps/{blocks.ts → data/routes/blocks.ts} +14 -14
- package/src/apps/{coingecko.test.ts → data/routes/coingecko.test.ts} +2 -2
- package/src/apps/{coingecko.ts → data/routes/coingecko.ts} +14 -14
- package/src/apps/{exchanges.test.ts → data/routes/exchanges.test.ts} +1 -1
- package/src/apps/{exchanges.ts → data/routes/exchanges.ts} +20 -20
- package/src/apps/{fee-amm.test.ts → data/routes/fee-amm.test.ts} +3 -3
- package/src/apps/{fee-amm.ts → data/routes/fee-amm.ts} +18 -18
- package/src/apps/data/routes/funding.test.ts +214 -0
- package/src/apps/data/routes/funding.ts +584 -0
- package/src/apps/{indexer.test.ts → data/routes/indexer.test.ts} +26 -5
- package/src/apps/{indexer.ts → data/routes/indexer.ts} +13 -10
- package/src/apps/{receipts.test.ts → data/routes/receipts.test.ts} +3 -3
- package/src/apps/{receipts.ts → data/routes/receipts.ts} +15 -22
- package/src/apps/{rpc.test.ts → data/routes/rpc.test.ts} +122 -7
- package/src/apps/{rpc.ts → data/routes/rpc.ts} +38 -8
- package/src/apps/{tokenlist.test.ts → data/routes/tokenlist.test.ts} +3 -3
- package/src/apps/{tokenlist.ts → data/routes/tokenlist.ts} +9 -9
- package/src/apps/{tokens.test.ts → data/routes/tokens.test.ts} +2 -2
- package/src/apps/{tokens.ts → data/routes/tokens.ts} +20 -20
- package/src/apps/{transactions.test.ts → data/routes/transactions.test.ts} +3 -3
- package/src/apps/{transactions.ts → data/routes/transactions.ts} +15 -15
- package/src/apps/{transfers.test.ts → data/routes/transfers.test.ts} +2 -2
- package/src/apps/{transfers.ts → data/routes/transfers.ts} +15 -15
- package/src/apps/{verified-tokens.test.ts → data/routes/verified-tokens.test.ts} +3 -3
- package/src/apps/{verified-tokens.ts → data/routes/verified-tokens.ts} +10 -10
- package/src/apps/{webhooks.test.ts → data/routes/webhooks.test.ts} +7 -7
- package/src/apps/{webhooks.ts → data/routes/webhooks.ts} +50 -43
- package/src/apps/docs/App.ts +65 -0
- package/src/apps/docs/index.ts +1 -0
- package/src/apps/docs/reference.ts +132 -0
- package/src/apps/index.ts +4 -0
- package/src/apps/mcp.test.ts +206 -0
- package/src/apps/mcp.ts +250 -0
- package/src/apps/metadata.ts +23 -0
- package/src/apps/platform/App.ts +169 -0
- package/src/apps/platform/Billing.test.ts +530 -0
- package/src/apps/platform/Billing.ts +682 -0
- package/src/apps/platform/index.ts +2 -0
- package/src/apps/platform/routes/api-keys.test.ts +493 -0
- package/src/apps/platform/routes/api-keys.ts +543 -0
- package/src/apps/platform/routes/billing.test.ts +1100 -0
- package/src/apps/platform/routes/billing.ts +966 -0
- package/src/apps/platform/routes/invitations.test.ts +409 -0
- package/src/apps/platform/routes/invitations.ts +587 -0
- package/src/apps/platform/routes/me.test.ts +351 -0
- package/src/apps/platform/routes/me.ts +106 -0
- package/src/apps/platform/routes/members.test.ts +195 -0
- package/src/apps/platform/routes/members.ts +313 -0
- package/src/apps/platform/routes/orgs.test.ts +313 -0
- package/src/apps/platform/routes/orgs.ts +365 -0
- package/src/apps/platform/routes/projects.test.ts +181 -0
- package/src/apps/platform/routes/projects.ts +367 -0
- package/src/apps/platform/routes/scopes.test.ts +29 -0
- package/src/apps/platform/routes/scopes.ts +85 -0
- package/src/apps/platform/routes/usage.test.ts +422 -0
- package/src/apps/platform/routes/usage.ts +527 -0
- package/src/apps/relay/App.test.ts +933 -0
- package/src/apps/relay/App.ts +236 -0
- package/src/apps/relay/Sponsorships.test.ts +375 -0
- package/src/apps/relay/Sponsorships.ts +306 -0
- package/src/apps/relay/index.ts +2 -0
- package/src/cli/Cli.test.ts +25 -2
- package/src/cli/Cli.ts +18 -3
- package/src/cli/commands/admin.test.ts +83 -0
- package/src/cli/commands/admin.ts +91 -3
- package/src/db/Db.ts +296 -0
- package/src/db/Schema.ts +241 -2
- package/src/db/tables/billingSettings.test.ts +87 -0
- package/src/db/tables/billingSettings.ts +108 -0
- package/src/db/tables/invitations.ts +198 -0
- package/src/db/tables/memberships.ts +208 -0
- package/src/db/tables/organizations.test.ts +38 -2
- package/src/db/tables/organizations.ts +117 -2
- package/src/db/tables/projects.ts +107 -0
- package/src/db/tables/requestUsage.ts +231 -0
- package/src/db/tables/sponsoredTransactions.test.ts +325 -0
- package/src/db/tables/sponsoredTransactions.ts +464 -0
- package/src/db/tables/stripeCustomers.test.ts +109 -0
- package/src/db/tables/stripeCustomers.ts +162 -0
- package/src/db/tables/users.ts +85 -0
- package/src/handlers/internal/executionError.ts +2 -0
- package/src/handlers/internal/multisig.test.ts +84 -10
- package/src/handlers/internal/multisig.ts +15 -50
- package/src/handlers/internal/sponsorship.ts +106 -20
- package/src/handlers/internal/utils.ts +19 -7
- package/src/handlers/{internal/relay.localnet.test.ts → relay.test.ts} +2 -2
- package/src/handlers/relay.ts +23 -5
- package/src/index.ts +1 -0
- package/src/internal/Auth.test.ts +491 -25
- package/src/internal/Auth.ts +839 -84
- package/src/internal/Cache.ts +5 -1
- package/src/internal/Cursor.test.ts +3 -2
- package/src/internal/EdgeCache.test.ts +27 -4
- package/src/internal/EdgeCache.ts +47 -9
- package/src/internal/Fees.test.ts +32 -0
- package/src/internal/Fees.ts +51 -0
- package/src/internal/FundingRoutes.ts +583 -0
- package/src/internal/Id.test.ts +17 -0
- package/src/internal/Id.ts +24 -0
- package/src/internal/Log.test.ts +2 -1
- package/src/internal/Log.ts +16 -3
- package/src/internal/MetricSink.ts +1 -1
- package/src/internal/OpenApi.ts +12 -60
- package/src/internal/RateLimit.test.ts +84 -0
- package/src/internal/RateLimit.ts +70 -0
- package/src/internal/Response.ts +1 -1
- package/src/internal/Schema.ts +8 -0
- package/src/internal/Store.test.ts +52 -0
- package/src/internal/Store.ts +24 -5
- package/src/internal/Tidx.local.test.ts +1 -1
- package/src/internal/VerifiedTokens.test.ts +1 -1
- package/src/internal/WebhookDestination.test.ts +1 -1
- package/src/internal/Webhooks.test.ts +7 -7
- package/src/internal/Webhooks.ts +4 -4
- package/dist/apps/activities.js.map +0 -1
- package/dist/apps/addresses.js.map +0 -1
- package/dist/apps/balances.d.ts.map +0 -1
- package/dist/apps/balances.js.map +0 -1
- package/dist/apps/blocks.d.ts.map +0 -1
- package/dist/apps/blocks.js.map +0 -1
- package/dist/apps/coingecko.d.ts.map +0 -1
- package/dist/apps/coingecko.js.map +0 -1
- package/dist/apps/exchanges.d.ts.map +0 -1
- package/dist/apps/exchanges.js.map +0 -1
- package/dist/apps/fee-amm.d.ts.map +0 -1
- package/dist/apps/fee-amm.js.map +0 -1
- package/dist/apps/indexer.d.ts.map +0 -1
- package/dist/apps/indexer.js.map +0 -1
- package/dist/apps/receipts.d.ts.map +0 -1
- package/dist/apps/receipts.js.map +0 -1
- package/dist/apps/rpc.d.ts.map +0 -1
- package/dist/apps/rpc.js.map +0 -1
- package/dist/apps/tokenlist.d.ts.map +0 -1
- package/dist/apps/tokenlist.js.map +0 -1
- package/dist/apps/tokens.d.ts.map +0 -1
- package/dist/apps/tokens.js.map +0 -1
- package/dist/apps/transactions.d.ts.map +0 -1
- package/dist/apps/transactions.js.map +0 -1
- package/dist/apps/transfers.d.ts.map +0 -1
- package/dist/apps/transfers.js.map +0 -1
- package/dist/apps/verified-tokens.d.ts.map +0 -1
- package/dist/apps/verified-tokens.js.map +0 -1
- package/dist/apps/webhooks.js.map +0 -1
- package/dist/internal/OpenApi.fonts.d.ts.map +0 -1
- package/dist/internal/OpenApi.fonts.js.map +0 -1
- package/dist/internal/OpenApi.logo.d.ts.map +0 -1
- package/dist/internal/OpenApi.logo.js.map +0 -1
- package/src/handlers/internal/multisig.localnet.test.ts +0 -146
- /package/src/{internal/OpenApi.fonts.ts → apps/docs/fonts.ts} +0 -0
- /package/src/{internal/OpenApi.logo.ts → apps/docs/logo.ts} +0 -0
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
import { Hono } from 'hono';
|
|
2
|
+
import { createMiddleware } from 'hono/factory';
|
|
3
|
+
import { RpcResponse } from 'ox';
|
|
4
|
+
import { Addresses, TokenId, Transaction } from 'viem/tempo';
|
|
5
|
+
import * as BillingSettings from '../../db/tables/billingSettings.js';
|
|
6
|
+
import * as Db from '../../db/Db.js';
|
|
7
|
+
import * as Fees from '../../internal/Fees.js';
|
|
8
|
+
import * as SponsoredTransactions from '../../db/tables/sponsoredTransactions.js';
|
|
9
|
+
import * as Billing from '../platform/Billing.js';
|
|
10
|
+
import * as Handler from '../../Handler.js';
|
|
11
|
+
import * as Auth from '../../internal/Auth.js';
|
|
12
|
+
import * as OpenApi from '../../internal/OpenApi.js';
|
|
13
|
+
import * as Path from '../../internal/Path.js';
|
|
14
|
+
import * as VerifiedTokens from '../../internal/VerifiedTokens.js';
|
|
15
|
+
import * as Viem from '../../internal/Viem.js';
|
|
16
|
+
import * as Scope from '../../Scope.js';
|
|
17
|
+
/**
|
|
18
|
+
* The relay route group: the wallet relay at `/rpc/relay`. Mount
|
|
19
|
+
* after `data()`, whose published chain clients and supported-chain set the
|
|
20
|
+
* middleware reads from request context.
|
|
21
|
+
*
|
|
22
|
+
* ```ts
|
|
23
|
+
* App.create(options).route('/', data()).route('/', relay())
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export function relay(options = {}) {
|
|
27
|
+
const handler = middleware(options);
|
|
28
|
+
return new Hono()
|
|
29
|
+
.use('/rpc/relay', Auth.policy({ apiKey: { scopes: ['rpc-relay:read'] }, mpp: false, public: false }), OpenApi.describeRoute({ hide: true, summary: 'Relay RPC' }))
|
|
30
|
+
.use('/rpc/relay/*', Auth.policy({ apiKey: { scopes: ['rpc-relay:read'] }, mpp: false, public: false }), OpenApi.describeRoute({ hide: true, summary: 'Relay RPC' }))
|
|
31
|
+
.all('/rpc/relay', handler)
|
|
32
|
+
.all('/rpc/relay/:chainId', handler);
|
|
33
|
+
}
|
|
34
|
+
// The wallet relay middleware: proxies wallet JSON-RPC (fills, sponsored
|
|
35
|
+
// sends) with wallet-aware enrichment. Built per request from context rather
|
|
36
|
+
// than closed over group locals; relay traffic is low-QPS and the viem
|
|
37
|
+
// clients are memoized upstream, so per-request handler construction is cheap.
|
|
38
|
+
function middleware(options = {}) {
|
|
39
|
+
// Platform-wide per-transaction cap; org settings tighten it, never loosen.
|
|
40
|
+
const txFeeLimit = options.feePayer
|
|
41
|
+
? Billing.toBaseUnits(options.feePayer.txFeeLimit ?? '1.00')
|
|
42
|
+
: 0n;
|
|
43
|
+
return createMiddleware(async (c) => {
|
|
44
|
+
const verifiedTokens = c.get('verifiedTokens');
|
|
45
|
+
const feePayer = (() => {
|
|
46
|
+
if (!options.feePayer)
|
|
47
|
+
return undefined;
|
|
48
|
+
const principal = Auth.getPrincipal(c);
|
|
49
|
+
const attribution = principal?.type === 'api_key' && principal.projectId !== undefined
|
|
50
|
+
? {
|
|
51
|
+
apiKeyId: principal.id,
|
|
52
|
+
environment: principal.environment,
|
|
53
|
+
orgId: principal.orgId,
|
|
54
|
+
projectId: principal.projectId,
|
|
55
|
+
}
|
|
56
|
+
: undefined;
|
|
57
|
+
const sponsorable = attribution !== undefined &&
|
|
58
|
+
principal?.type === 'api_key' &&
|
|
59
|
+
(principal.apiKey.scopes.includes('rpc-relay:sponsor') ||
|
|
60
|
+
principal.apiKey.scopes.includes(Scope.wildcard));
|
|
61
|
+
// Lifted so validation and the sponsored-token default read one value.
|
|
62
|
+
const feeToken_sponsor = options.feePayer.feeToken ?? Addresses.pathUsd;
|
|
63
|
+
return {
|
|
64
|
+
...options.feePayer,
|
|
65
|
+
feeToken: feeToken_sponsor,
|
|
66
|
+
validate: async (transaction) => {
|
|
67
|
+
// Allowlist the chains this deployment serves rather than denylisting
|
|
68
|
+
// only mainnet: the relay resolves chainId from the request body, so
|
|
69
|
+
// the query-string chain guard never sees it.
|
|
70
|
+
const id = Number(transaction.chainId);
|
|
71
|
+
if (!attribution || !sponsorable || !c.get('supportedChainIds').has(id))
|
|
72
|
+
return false;
|
|
73
|
+
if (!Viem.isMainnet(id))
|
|
74
|
+
return true;
|
|
75
|
+
// Mainnet is production-only: a sandbox key resolves chainId from the
|
|
76
|
+
// request body, so the auth-layer sandbox/mainnet guard never sees
|
|
77
|
+
// it. Refuse here, or sandbox spend would sponsor mainnet unbilled.
|
|
78
|
+
if (attribution.environment !== 'production')
|
|
79
|
+
return false;
|
|
80
|
+
// Enforcement reads hit the primary, never the cached replica: a
|
|
81
|
+
// stale `past_due`, a lowered limit, or another isolate's pending
|
|
82
|
+
// spend must not keep the gate open.
|
|
83
|
+
const db = Db.get(c.get('db'));
|
|
84
|
+
// Mainnet sponsorship requires an active billing source; deployments
|
|
85
|
+
// without billing configured have no rows, so mainnet stays closed.
|
|
86
|
+
// `past_due` gets its own reason: the caller must settle an invoice,
|
|
87
|
+
// not attach a card.
|
|
88
|
+
const billing = await Billing.status(db, attribution.orgId);
|
|
89
|
+
if (billing === 'past_due')
|
|
90
|
+
return 'billing_past_due';
|
|
91
|
+
if (billing !== 'active')
|
|
92
|
+
return 'billing_required';
|
|
93
|
+
const feeToken = (() => {
|
|
94
|
+
try {
|
|
95
|
+
return TokenId.toAddress(transaction.feeToken ?? feeToken_sponsor);
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
return undefined;
|
|
99
|
+
}
|
|
100
|
+
})();
|
|
101
|
+
const verified = feeToken
|
|
102
|
+
? (await VerifiedTokens.read(Db.get(c.get('dbCached')), id))?.byAddress.get(feeToken.toLowerCase()) // prettier-ignore
|
|
103
|
+
: undefined;
|
|
104
|
+
if (!verified ||
|
|
105
|
+
verified.currency.toLowerCase() !== 'usd' ||
|
|
106
|
+
verified.decimals !== Fees.tokenDecimals)
|
|
107
|
+
// prettier-ignore
|
|
108
|
+
return 'fee_token_unsupported';
|
|
109
|
+
// Fail closed: a transaction whose signed cap cannot be computed
|
|
110
|
+
// cannot be bounded, so it never sponsors on mainnet.
|
|
111
|
+
const feeMax = Fees.maxOf(transaction);
|
|
112
|
+
if (feeMax === undefined)
|
|
113
|
+
return 'tx_fee_limit_exceeded';
|
|
114
|
+
const settings = await BillingSettings.get(db, attribution.orgId);
|
|
115
|
+
const cap = (() => {
|
|
116
|
+
if (settings?.txFeeLimit == null)
|
|
117
|
+
return txFeeLimit;
|
|
118
|
+
const org = Billing.toBaseUnits(settings.txFeeLimit);
|
|
119
|
+
return org < txFeeLimit ? org : txFeeLimit;
|
|
120
|
+
})();
|
|
121
|
+
if (feeMax > cap)
|
|
122
|
+
return 'tx_fee_limit_exceeded';
|
|
123
|
+
// The period spend limit is enforced atomically at recording time
|
|
124
|
+
// (`onSponsored` → `SponsoredTransactions.reserve`); a check here
|
|
125
|
+
// would be a check-then-act race a burst could slip through.
|
|
126
|
+
return true;
|
|
127
|
+
},
|
|
128
|
+
onSponsored: async (event) => {
|
|
129
|
+
if (!attribution)
|
|
130
|
+
return;
|
|
131
|
+
const mainnet = Viem.isMainnet(event.chainId);
|
|
132
|
+
// Defense in depth: `validate` already refuses non-production
|
|
133
|
+
// mainnet, so reaching here with that pair is a wiring bug.
|
|
134
|
+
if (mainnet && attribution.environment !== 'production')
|
|
135
|
+
throw new RpcResponse.InvalidParamsError({ message: 'Sponsorship rejected.' });
|
|
136
|
+
// The cap recomputes from canonical envelope bytes, mirroring the
|
|
137
|
+
// reconciliation convention; pending rows charge it to spend limits.
|
|
138
|
+
const feeMax = Fees.maxOf(Transaction.deserialize(event.transaction));
|
|
139
|
+
const db = Db.get(c.get('db'));
|
|
140
|
+
const feeToken = (() => {
|
|
141
|
+
try {
|
|
142
|
+
return event.feeToken !== undefined ? TokenId.toAddress(event.feeToken) : undefined;
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
return undefined;
|
|
146
|
+
}
|
|
147
|
+
})();
|
|
148
|
+
const currency = feeToken
|
|
149
|
+
? (await VerifiedTokens.read(Db.get(c.get('dbCached')), event.chainId))?.byAddress
|
|
150
|
+
.get(feeToken.toLowerCase())
|
|
151
|
+
?.currency.toLowerCase()
|
|
152
|
+
: undefined;
|
|
153
|
+
const input = {
|
|
154
|
+
apiKeyId: attribution.apiKeyId,
|
|
155
|
+
billable: attribution.environment === 'production',
|
|
156
|
+
chainId: event.chainId,
|
|
157
|
+
environment: attribution.environment,
|
|
158
|
+
orgId: attribution.orgId,
|
|
159
|
+
projectId: attribution.projectId,
|
|
160
|
+
signPayload: event.signPayload,
|
|
161
|
+
transaction: event.transaction,
|
|
162
|
+
...(currency ? { currency } : {}),
|
|
163
|
+
...(feeMax !== undefined ? { feeMax: feeMax.toString() } : {}),
|
|
164
|
+
...(feeToken ? { feeToken } : {}),
|
|
165
|
+
...(event.transactionHash ? { transactionHash: event.transactionHash } : {}),
|
|
166
|
+
};
|
|
167
|
+
// Re-read settings on the authoritative path: the limit may have
|
|
168
|
+
// changed since `validate`, and only mainnet spend is limited.
|
|
169
|
+
const settings = mainnet ? await BillingSettings.get(db, attribution.orgId) : undefined;
|
|
170
|
+
if (settings?.spendLimit == null)
|
|
171
|
+
return void (await SponsoredTransactions.upsert(db, input)); // prettier-ignore
|
|
172
|
+
try {
|
|
173
|
+
await SponsoredTransactions.reserve(db, input, {
|
|
174
|
+
chainIds: [Viem.chainId.mainnet],
|
|
175
|
+
max: Billing.toBaseUnits(settings.spendLimit),
|
|
176
|
+
since: Billing.periodStart(settings.period),
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
catch (error) {
|
|
180
|
+
if (error instanceof SponsoredTransactions.PeriodSpendLimitError)
|
|
181
|
+
throw new RpcResponse.InvalidParamsError({
|
|
182
|
+
data: { code: 'spend_limit_exceeded' },
|
|
183
|
+
message: 'Spend limit exceeded.',
|
|
184
|
+
});
|
|
185
|
+
throw error;
|
|
186
|
+
}
|
|
187
|
+
},
|
|
188
|
+
};
|
|
189
|
+
})();
|
|
190
|
+
// Dispatching a standalone Hono via `fetch(c.req.raw)` bypasses Hono's
|
|
191
|
+
// mount-path stripping, so its internal routes register at the request's
|
|
192
|
+
// full external path (`basePath` + `/rpc/relay`).
|
|
193
|
+
const handler = Handler.relay({
|
|
194
|
+
cache: c.get('store'),
|
|
195
|
+
features: 'all',
|
|
196
|
+
getClient: (chainId) => c.get('getClient')(chainId),
|
|
197
|
+
path: Path.join(c.get('basePath'), 'rpc/relay'),
|
|
198
|
+
...(feePayer ? { feePayer } : {}),
|
|
199
|
+
...(verifiedTokens
|
|
200
|
+
? {
|
|
201
|
+
resolveTokens: async (chainId) => {
|
|
202
|
+
const snapshot = await VerifiedTokens.read(Db.get(c.get('dbCached')), chainId);
|
|
203
|
+
return snapshot?.list.map((token) => token.address) ?? [];
|
|
204
|
+
},
|
|
205
|
+
}
|
|
206
|
+
: {}),
|
|
207
|
+
});
|
|
208
|
+
return handler.fetch(c.req.raw);
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
//# sourceMappingURL=App.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"App.js","sourceRoot":"","sources":["../../../src/apps/relay/App.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { type Address, type Client } from 'viem';
|
|
2
|
+
import * as Db from '../../db/Db.js';
|
|
3
|
+
import * as Tidx from '../../internal/Tidx.js';
|
|
4
|
+
import * as Viem from '../../internal/Viem.js';
|
|
5
|
+
/**
|
|
6
|
+
* Runs one finalization pass over pending sponsored transactions: rows with a
|
|
7
|
+
* receipt finalize with the actual fee (`gasUsed × effectiveGasPrice`, in
|
|
8
|
+
* fee-token base units); rows still unmined past the pending TTL fail, as do
|
|
9
|
+
* hash-less fill intents the TTL outlives. Rows whose receipt lookup errors
|
|
10
|
+
* persist past the error TTL fail so they cannot monopolize every batch.
|
|
11
|
+
*
|
|
12
|
+
* @param db - The database holding `sponsored_transactions`.
|
|
13
|
+
* @param options - Finalization options.
|
|
14
|
+
* @returns Counters for the pass.
|
|
15
|
+
*/
|
|
16
|
+
export declare function finalize(db: Db.Db, options: finalize.Options): Promise<finalize.Result>;
|
|
17
|
+
export declare namespace finalize {
|
|
18
|
+
/** Options for {@link finalize}. */
|
|
19
|
+
type Options = {
|
|
20
|
+
/** Maximum pending rows processed per pass. @default 100 */
|
|
21
|
+
batchSize?: number | undefined;
|
|
22
|
+
/** Client resolver keyed by the row's chain id. */
|
|
23
|
+
getClient: (chainId: number) => Client;
|
|
24
|
+
/** Clock; injectable for tests. */
|
|
25
|
+
now?: (() => Date) | undefined;
|
|
26
|
+
/** Age after which an unmined sponsorship fails. @default 1 hour */
|
|
27
|
+
pendingTtlMs?: number | undefined;
|
|
28
|
+
/** Age after which repeated receipt lookup errors fail a row. @default 24 hours */
|
|
29
|
+
receiptErrorTtlMs?: number | undefined;
|
|
30
|
+
};
|
|
31
|
+
/** Counters returned by one finalization pass. */
|
|
32
|
+
type Result = {
|
|
33
|
+
/** Rows marked failed (unmined past the pending TTL). */
|
|
34
|
+
failed: number;
|
|
35
|
+
/** Rows finalized with an actual fee. */
|
|
36
|
+
finalized: number;
|
|
37
|
+
/** Rows left pending (unmined, or receipt lookup errored within the error TTL). */
|
|
38
|
+
pending: number;
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Runs one reconciliation pass over pending fill intents (rows with no
|
|
43
|
+
* transaction hash): fetches the fee payer's recent on-chain transactions
|
|
44
|
+
* from TIDX, recomputes each candidate's fee-payer sign payload, and fills
|
|
45
|
+
* matching intents' hashes so the receipt pass can finalize them. Query or
|
|
46
|
+
* candidate errors leave intents for the next pass.
|
|
47
|
+
*
|
|
48
|
+
* @param db - The database holding `sponsored_transactions`.
|
|
49
|
+
* @param options - Reconciliation options.
|
|
50
|
+
* @returns Counters for the pass.
|
|
51
|
+
*/
|
|
52
|
+
export declare function reconcile(db: Db.Db, options: reconcile.Options): Promise<reconcile.Result>;
|
|
53
|
+
export declare namespace reconcile {
|
|
54
|
+
/** Options for {@link reconcile}. */
|
|
55
|
+
type Options = {
|
|
56
|
+
/** Maximum intents considered per pass. @default 100 */
|
|
57
|
+
batchSize?: number | undefined;
|
|
58
|
+
/** Maximum on-chain candidates fetched per chain per pass. @default 500 */
|
|
59
|
+
candidateCap?: number | undefined;
|
|
60
|
+
/** How long failed intents remain reconciliation candidates. @default 24 hours */
|
|
61
|
+
failedIntentTtlMs?: number | undefined;
|
|
62
|
+
/** Fee payer address whose on-chain transactions are candidates. */
|
|
63
|
+
feePayer: Address;
|
|
64
|
+
/** Client resolver keyed by the intent's chain id. */
|
|
65
|
+
getClient: (chainId: number) => Client;
|
|
66
|
+
/** TIDX client resolver keyed by the intent's chain id. */
|
|
67
|
+
getTidx: (chainId: number) => Tidx.Client;
|
|
68
|
+
/** Lookback slack before the oldest intent's creation. @default 2 minutes */
|
|
69
|
+
skewMs?: number | undefined;
|
|
70
|
+
};
|
|
71
|
+
/** Counters returned by one reconciliation pass. */
|
|
72
|
+
type Result = {
|
|
73
|
+
/** Intents matched to an on-chain transaction. */
|
|
74
|
+
matched: number;
|
|
75
|
+
/** On-chain candidates inspected. */
|
|
76
|
+
scanned: number;
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Builds a scheduled sponsorship finalizer bound to a database and RPC config.
|
|
81
|
+
* A host runtime drives {@link createFinalizer.Finalizer.tick} on a timer (a
|
|
82
|
+
* Cloudflare `scheduled` cron handler, a self-host `setInterval`, …); each
|
|
83
|
+
* tick reconciles fill intents (when `feePayer` + `tidx` are configured) and
|
|
84
|
+
* runs one {@link finalize} pass, with memoized per-chain clients.
|
|
85
|
+
*/
|
|
86
|
+
export declare function createFinalizer(options: createFinalizer.Options): createFinalizer.Finalizer;
|
|
87
|
+
export declare namespace createFinalizer {
|
|
88
|
+
/** Options for {@link createFinalizer}. */
|
|
89
|
+
type Options = Pick<finalize.Options, 'batchSize' | 'now' | 'pendingTtlMs'> & {
|
|
90
|
+
/** Database holding sponsorship rows, or a factory resolved per tick (Workers/Hyperdrive). */
|
|
91
|
+
db: Db.Source;
|
|
92
|
+
/** Default chain id for the TIDX client resolver. */
|
|
93
|
+
defaultChainId?: Viem.ChainId | undefined;
|
|
94
|
+
/** Fee payer address whose on-chain transactions reconcile fill intents; omit to skip reconciliation. */
|
|
95
|
+
feePayer?: Address | undefined;
|
|
96
|
+
/** RPC options for the receipt-lookup clients. */
|
|
97
|
+
rpc?: Viem.getClient.Rpc | undefined;
|
|
98
|
+
/** TIDX query client options for intent reconciliation; omit to skip reconciliation. */
|
|
99
|
+
tidx?: Tidx.getClient.Tidx | undefined;
|
|
100
|
+
};
|
|
101
|
+
/** A scheduled sponsorship finalizer. */
|
|
102
|
+
type Finalizer = {
|
|
103
|
+
/** Runs one reconcile + finalize pass. */
|
|
104
|
+
tick(): Promise<finalize.Result & reconcile.Result>;
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=Sponsorships.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Sponsorships.d.ts","sourceRoot":"","sources":["../../../src/apps/relay/Sponsorships.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import { TxEnvelopeTempo } from 'ox/tempo';
|
|
2
|
+
import { TransactionReceiptNotFoundError, } from 'viem';
|
|
3
|
+
import { getTransactionReceipt } from 'viem/actions';
|
|
4
|
+
import * as Db from '../../db/Db.js';
|
|
5
|
+
import * as Fees from '../../internal/Fees.js';
|
|
6
|
+
import * as SponsoredTransactions from '../../db/tables/sponsoredTransactions.js';
|
|
7
|
+
import * as Tidx from '../../internal/Tidx.js';
|
|
8
|
+
import * as Viem from '../../internal/Viem.js';
|
|
9
|
+
/**
|
|
10
|
+
* Runs one finalization pass over pending sponsored transactions: rows with a
|
|
11
|
+
* receipt finalize with the actual fee (`gasUsed × effectiveGasPrice`, in
|
|
12
|
+
* fee-token base units); rows still unmined past the pending TTL fail, as do
|
|
13
|
+
* hash-less fill intents the TTL outlives. Rows whose receipt lookup errors
|
|
14
|
+
* persist past the error TTL fail so they cannot monopolize every batch.
|
|
15
|
+
*
|
|
16
|
+
* @param db - The database holding `sponsored_transactions`.
|
|
17
|
+
* @param options - Finalization options.
|
|
18
|
+
* @returns Counters for the pass.
|
|
19
|
+
*/
|
|
20
|
+
export async function finalize(db, options) {
|
|
21
|
+
const { batchSize = 100, getClient, now = () => new Date(), pendingTtlMs = 3_600_000, receiptErrorTtlMs = 86_400_000, } = options;
|
|
22
|
+
const rows = await SponsoredTransactions.listPending(db, { limit: batchSize });
|
|
23
|
+
const result = { failed: 0, finalized: 0, pending: 0 };
|
|
24
|
+
for (const row of rows) {
|
|
25
|
+
// Fill intents carry no hash until reconciliation matches them on-chain;
|
|
26
|
+
// here only the TTL can settle them.
|
|
27
|
+
if (row.transactionHash === null) {
|
|
28
|
+
if (Date.parse(row.createdAt) + pendingTtlMs <= now().getTime()) {
|
|
29
|
+
await SponsoredTransactions.fail(db, row.id, now().toISOString());
|
|
30
|
+
result.failed++;
|
|
31
|
+
}
|
|
32
|
+
else
|
|
33
|
+
result.pending++;
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
let receipt;
|
|
37
|
+
try {
|
|
38
|
+
receipt = await getTransactionReceipt(getClient(row.chainId), {
|
|
39
|
+
hash: row.transactionHash,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
// Unmined transactions surface as a typed not-found; let the TTL decide.
|
|
44
|
+
if (error instanceof TransactionReceiptNotFoundError)
|
|
45
|
+
receipt = null;
|
|
46
|
+
else {
|
|
47
|
+
if (Date.parse(row.createdAt) + receiptErrorTtlMs <= now().getTime()) {
|
|
48
|
+
await SponsoredTransactions.fail(db, row.id, now().toISOString());
|
|
49
|
+
result.failed++;
|
|
50
|
+
}
|
|
51
|
+
else
|
|
52
|
+
result.pending++;
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
if (receipt) {
|
|
57
|
+
// A reverted transaction still finalizes: the fee payer paid its fees.
|
|
58
|
+
const feeAmount = Fees.fromGas(receipt.gasUsed, receipt.effectiveGasPrice);
|
|
59
|
+
await SponsoredTransactions.finalize(db, row.id, {
|
|
60
|
+
feeAmount: feeAmount.toString(),
|
|
61
|
+
finalizedAt: now().toISOString(),
|
|
62
|
+
});
|
|
63
|
+
result.finalized++;
|
|
64
|
+
}
|
|
65
|
+
else if (Date.parse(row.createdAt) + pendingTtlMs <= now().getTime()) {
|
|
66
|
+
await SponsoredTransactions.fail(db, row.id, now().toISOString());
|
|
67
|
+
result.failed++;
|
|
68
|
+
}
|
|
69
|
+
else
|
|
70
|
+
result.pending++;
|
|
71
|
+
}
|
|
72
|
+
return result;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Runs one reconciliation pass over pending fill intents (rows with no
|
|
76
|
+
* transaction hash): fetches the fee payer's recent on-chain transactions
|
|
77
|
+
* from TIDX, recomputes each candidate's fee-payer sign payload, and fills
|
|
78
|
+
* matching intents' hashes so the receipt pass can finalize them. Query or
|
|
79
|
+
* candidate errors leave intents for the next pass.
|
|
80
|
+
*
|
|
81
|
+
* @param db - The database holding `sponsored_transactions`.
|
|
82
|
+
* @param options - Reconciliation options.
|
|
83
|
+
* @returns Counters for the pass.
|
|
84
|
+
*/
|
|
85
|
+
export async function reconcile(db, options) {
|
|
86
|
+
const { batchSize = 100, candidateCap = 500, failedIntentTtlMs = 86_400_000, feePayer, getClient, getTidx, skewMs = 120_000, } = options;
|
|
87
|
+
const intents = await SponsoredTransactions.listIntents(db, {
|
|
88
|
+
failedSince: new Date(Date.now() - failedIntentTtlMs).toISOString(),
|
|
89
|
+
limit: batchSize,
|
|
90
|
+
});
|
|
91
|
+
const result = { matched: 0, scanned: 0 };
|
|
92
|
+
if (intents.length === 0)
|
|
93
|
+
return result;
|
|
94
|
+
const chains = new Map();
|
|
95
|
+
for (const intent of intents)
|
|
96
|
+
chains.set(intent.chainId, [...(chains.get(intent.chainId) ?? []), intent]); // prettier-ignore
|
|
97
|
+
for (const [chainId, rows] of chains) {
|
|
98
|
+
const bySignPayload = new Map(rows.map((row) => [row.signPayload, row]));
|
|
99
|
+
// The intent set bounds the scan window: no cursor state to persist.
|
|
100
|
+
const since = new Date(Math.min(...rows.map((row) => Date.parse(row.createdAt))) - skewMs).toISOString();
|
|
101
|
+
let candidates;
|
|
102
|
+
try {
|
|
103
|
+
// Dynamic filter values; the tidx client's query type wants literals.
|
|
104
|
+
const fetched = await getTidx(chainId).fetch({
|
|
105
|
+
chainId,
|
|
106
|
+
query: `SELECT hash, "from" FROM txs WHERE fee_payer = '${feePayer.toLowerCase()}' AND block_timestamp >= '${since}' ORDER BY block_timestamp ASC LIMIT ${candidateCap}`,
|
|
107
|
+
});
|
|
108
|
+
candidates = fetched.rows;
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
// Indexer outage must not fail intents; retry on the next pass.
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
for (const candidate of candidates) {
|
|
115
|
+
if (bySignPayload.size === 0)
|
|
116
|
+
break;
|
|
117
|
+
const hash = candidate['hash'];
|
|
118
|
+
const sender = candidate['from'];
|
|
119
|
+
if (!hash || !sender)
|
|
120
|
+
continue;
|
|
121
|
+
result.scanned++;
|
|
122
|
+
try {
|
|
123
|
+
const serialized = await getRawTransaction(getClient(chainId), hash);
|
|
124
|
+
if (!serialized?.startsWith(TxEnvelopeTempo.serializedType))
|
|
125
|
+
continue;
|
|
126
|
+
const signPayload = TxEnvelopeTempo.getFeePayerSignPayload(TxEnvelopeTempo.deserialize(serialized), { sender });
|
|
127
|
+
const intent = bySignPayload.get(signPayload);
|
|
128
|
+
if (!intent)
|
|
129
|
+
continue;
|
|
130
|
+
await SponsoredTransactions.assignTransactionHash(db, intent.id, hash);
|
|
131
|
+
bySignPayload.delete(signPayload);
|
|
132
|
+
result.matched++;
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
// Unresolvable candidate (lookup error, malformed envelope): skip it.
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return result;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Fetches a mined transaction's canonical envelope bytes.
|
|
143
|
+
* `eth_getRawTransactionByHash` is a node extension absent from viem's typed
|
|
144
|
+
* RPC schema, hence the request-fn narrowing.
|
|
145
|
+
*/
|
|
146
|
+
function getRawTransaction(client, hash) {
|
|
147
|
+
return client.request({ method: 'eth_getRawTransactionByHash', params: [hash] });
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Builds a scheduled sponsorship finalizer bound to a database and RPC config.
|
|
151
|
+
* A host runtime drives {@link createFinalizer.Finalizer.tick} on a timer (a
|
|
152
|
+
* Cloudflare `scheduled` cron handler, a self-host `setInterval`, …); each
|
|
153
|
+
* tick reconciles fill intents (when `feePayer` + `tidx` are configured) and
|
|
154
|
+
* runs one {@link finalize} pass, with memoized per-chain clients.
|
|
155
|
+
*/
|
|
156
|
+
export function createFinalizer(options) {
|
|
157
|
+
const clients = new Map();
|
|
158
|
+
const getClient = (chainId) => {
|
|
159
|
+
let client = clients.get(chainId);
|
|
160
|
+
if (!client) {
|
|
161
|
+
client = Viem.getClient({ chainId: chainId, rpc: options.rpc });
|
|
162
|
+
clients.set(chainId, client);
|
|
163
|
+
}
|
|
164
|
+
return client;
|
|
165
|
+
};
|
|
166
|
+
const getTidx = options.tidx
|
|
167
|
+
? Tidx.createGetClient({ defaultChainId: options.defaultChainId, tidx: options.tidx })
|
|
168
|
+
: undefined;
|
|
169
|
+
const feePayer = options.feePayer;
|
|
170
|
+
return {
|
|
171
|
+
async tick() {
|
|
172
|
+
// Resolve per tick so Workers factories build a fresh Hyperdrive-pooled
|
|
173
|
+
// connection each run.
|
|
174
|
+
const db = Db.get(options.db);
|
|
175
|
+
// Reconcile first so freshly matched intents finalize in the same tick.
|
|
176
|
+
const reconciled = feePayer && getTidx
|
|
177
|
+
? await reconcile(db, {
|
|
178
|
+
batchSize: options.batchSize,
|
|
179
|
+
feePayer,
|
|
180
|
+
getClient,
|
|
181
|
+
getTidx: (chainId) => getTidx(chainId),
|
|
182
|
+
})
|
|
183
|
+
: { matched: 0, scanned: 0 };
|
|
184
|
+
const finalized = await finalize(db, {
|
|
185
|
+
batchSize: options.batchSize,
|
|
186
|
+
getClient,
|
|
187
|
+
now: options.now,
|
|
188
|
+
pendingTtlMs: options.pendingTtlMs,
|
|
189
|
+
});
|
|
190
|
+
return { ...finalized, ...reconciled };
|
|
191
|
+
},
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=Sponsorships.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Sponsorships.js","sourceRoot":"","sources":["../../../src/apps/relay/Sponsorships.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/apps/relay/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAA;AAChC,OAAO,KAAK,YAAY,MAAM,mBAAmB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/apps/relay/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAA;AAChC,OAAO,KAAK,YAAY,MAAM,mBAAmB,CAAA"}
|
package/dist/cli/Cli.d.ts
CHANGED
|
@@ -1,12 +1,17 @@
|
|
|
1
1
|
import { Cli as incur_Cli, Fetch, type Openapi } from 'incur';
|
|
2
|
+
import type { mcp } from '../apps/mcp.js';
|
|
2
3
|
/**
|
|
3
|
-
* Creates an incur CLI backed by a hosted Tempo API, plus the
|
|
4
|
-
* commands (`<cli> admin …`).
|
|
4
|
+
* Creates an incur CLI backed by a hosted Tempo API, plus the super admin
|
|
5
|
+
* commands (`<cli> admin …`) and the remote Tempo docs tools (`<cli> docs …`).
|
|
5
6
|
*/
|
|
6
7
|
export declare function from(url: string | URL, options?: from.Options): incur_Cli.Cli<{
|
|
7
8
|
[x: `${string} ${string} ${string}`]: {
|
|
8
9
|
args: {};
|
|
9
10
|
options: {
|
|
11
|
+
clickhouseDatabase?: string | undefined;
|
|
12
|
+
clickhouseMigratePassword?: string | undefined;
|
|
13
|
+
clickhouseMigrateUser?: string | undefined;
|
|
14
|
+
clickhouseUrl?: string | undefined;
|
|
10
15
|
databaseUrl?: string | undefined;
|
|
11
16
|
dbSchema?: string | undefined;
|
|
12
17
|
};
|
|
@@ -17,6 +22,8 @@ export declare namespace from {
|
|
|
17
22
|
type Options = {
|
|
18
23
|
/** CLI description. */
|
|
19
24
|
description?: string | undefined;
|
|
25
|
+
/** Remote docs MCP source mounted as the `docs` command group, or `false` to omit it. @default 'https://mcp.tempo.xyz/mcp' */
|
|
26
|
+
docs?: mcp.Source | false | undefined;
|
|
20
27
|
/** CLI name. */
|
|
21
28
|
name?: string | undefined;
|
|
22
29
|
/** OpenAPI document source. Relative paths resolve from the API URL. */
|
package/dist/cli/Cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Cli.d.ts","sourceRoot":"","sources":["../../src/cli/Cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,IAAI,SAAS,EAAE,KAAK,EAAE,KAAK,OAAO,EAAE,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"Cli.d.ts","sourceRoot":"","sources":["../../src/cli/Cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,IAAI,SAAS,EAAE,KAAK,EAAE,KAAK,OAAO,EAAE,MAAM,OAAO,CAAA;AAE7D,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAA;AAUzC;;;GAGG;AACH,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,EAAE,OAAO,GAAE,IAAI,CAAC,OAAY;;;;;;;;;;;;oCAuBjE;AAED,MAAM,CAAC,OAAO,WAAW,IAAI,CAAC;IAC5B,8DAA8D;IAC9D,KAAK,OAAO,GAAG;QACb,uBAAuB;QACvB,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAChC,8HAA8H;QAC9H,IAAI,CAAC,EAAE,GAAG,CAAC,MAAM,GAAG,KAAK,GAAG,SAAS,CAAA;QACrC,gBAAgB;QAChB,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QACzB,wEAAwE;QACxE,OAAO,CAAC,EAAE,OAAO,CAAC,aAAa,GAAG,SAAS,CAAA;QAC3C,4EAA4E;QAC5E,aAAa,CAAC,EAAE,OAAO,CAAC,MAAM,GAAG,SAAS,CAAA;QAC1C,4CAA4C;QAC5C,OAAO,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,OAAO,GAAG,SAAS,CAAA;QAC/C,mBAAmB;QACnB,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAC7B,CAAA;CACF"}
|
package/dist/cli/Cli.js
CHANGED
|
@@ -1,19 +1,27 @@
|
|
|
1
1
|
import { Cli as incur_Cli, Fetch } from 'incur';
|
|
2
2
|
import * as Admin from './commands/admin.js';
|
|
3
|
+
/** Tool patterns hidden from MCP clients: super admin, partner-shaped gecko mirrors, browser session flows. */
|
|
4
|
+
const excludedTools = ['admin_*', 'gecko_*', 'v1_auth_*'];
|
|
5
|
+
/** Usage guidance surfaced to MCP clients on initialize (`<cli> --mcp`). */
|
|
6
|
+
const instructions = 'Tools mirror the hosted Tempo API. Authenticated tools accept an `authorization` input (`Bearer <api key>`). List endpoints paginate via `cursor`/`nextCursor`. `docs_*` tools search the Tempo documentation.';
|
|
3
7
|
/**
|
|
4
|
-
* Creates an incur CLI backed by a hosted Tempo API, plus the
|
|
5
|
-
* commands (`<cli> admin …`).
|
|
8
|
+
* Creates an incur CLI backed by a hosted Tempo API, plus the super admin
|
|
9
|
+
* commands (`<cli> admin …`) and the remote Tempo docs tools (`<cli> docs …`).
|
|
6
10
|
*/
|
|
7
11
|
export function from(url, options = {}) {
|
|
8
|
-
const { description = 'Tempo API CLI', name = 'tapimo', openapi = 'openapi.json', request, version = '0.0.0', } = options;
|
|
9
|
-
|
|
12
|
+
const { description = 'Tempo API CLI', docs = 'https://mcp.tempo.xyz/mcp', name = 'tapimo', openapi = 'openapi.json', request, version = '0.0.0', } = options;
|
|
13
|
+
const cli = incur_Cli
|
|
10
14
|
.create(name, {
|
|
11
15
|
description,
|
|
12
16
|
fetch: Fetch.fromRequest(url, request),
|
|
17
|
+
mcp: { instructions, tools: { exclude: excludedTools } },
|
|
13
18
|
openapi,
|
|
14
19
|
openapiConfig: options.openapiConfig ?? { mode: 'namespace' },
|
|
15
20
|
version,
|
|
16
21
|
})
|
|
17
22
|
.command(Admin.admin);
|
|
23
|
+
if (docs !== false)
|
|
24
|
+
cli.command('docs', { description: 'Search the Tempo documentation.', mcp: docs });
|
|
25
|
+
return cli;
|
|
18
26
|
}
|
|
19
27
|
//# sourceMappingURL=Cli.js.map
|
package/dist/cli/Cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Cli.js","sourceRoot":"","sources":["../../src/cli/Cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,IAAI,SAAS,EAAE,KAAK,EAAgB,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"Cli.js","sourceRoot":"","sources":["../../src/cli/Cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,IAAI,SAAS,EAAE,KAAK,EAAgB,MAAM,OAAO,CAAA;AAG7D,OAAO,KAAK,KAAK,MAAM,qBAAqB,CAAA;AAE5C,+GAA+G;AAC/G,MAAM,aAAa,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,WAAW,CAAC,CAAA;AAEzD,4EAA4E;AAC5E,MAAM,YAAY,GAChB,gNAAgN,CAAA;AAElN;;;GAGG;AACH,MAAM,UAAU,IAAI,CAAC,GAAiB,EAAE,OAAO,GAAiB,EAAE;IAChE,MAAM,EACJ,WAAW,GAAG,eAAe,EAC7B,IAAI,GAAG,2BAA2B,EAClC,IAAI,GAAG,QAAQ,EACf,OAAO,GAAG,cAAc,EACxB,OAAO,EACP,OAAO,GAAG,OAAO,GAClB,GAAG,OAAO,CAAA;IAEX,MAAM,GAAG,GAAG,SAAS;SAClB,MAAM,CAAC,IAAI,EAAE;QACZ,WAAW;QACX,KAAK,EAAE,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC;QACtC,GAAG,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE,EAAE;QACxD,OAAO;QACP,aAAa,EAAE,OAAO,CAAC,aAAa,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE;QAC7D,OAAO;KACR,CAAC;SACD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;IACvB,IAAI,IAAI,KAAK,KAAK;QAChB,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,WAAW,EAAE,iCAAiC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAA;IACpF,OAAO,GAAG,CAAA;AACZ,CAAC"}
|