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.
Files changed (520) hide show
  1. package/README.md +57 -16
  2. package/dist/ApiKey.d.ts +4 -1
  3. package/dist/ApiKey.d.ts.map +1 -1
  4. package/dist/ApiKey.js +6 -2
  5. package/dist/ApiKey.js.map +1 -1
  6. package/dist/ApiKeys.d.ts +98 -3
  7. package/dist/ApiKeys.d.ts.map +1 -1
  8. package/dist/ApiKeys.js +150 -1
  9. package/dist/ApiKeys.js.map +1 -1
  10. package/dist/App.d.ts +7917 -2315
  11. package/dist/App.d.ts.map +1 -1
  12. package/dist/App.js +141 -329
  13. package/dist/App.js.map +1 -1
  14. package/dist/Scope.d.ts +20 -4
  15. package/dist/Scope.d.ts.map +1 -1
  16. package/dist/Scope.js +23 -4
  17. package/dist/Scope.js.map +1 -1
  18. package/dist/Webhooks.d.ts +2 -2
  19. package/dist/Webhooks.d.ts.map +1 -1
  20. package/dist/Webhooks.js +2 -2
  21. package/dist/Webhooks.js.map +1 -1
  22. package/dist/admin/App.d.ts +203 -120
  23. package/dist/admin/App.d.ts.map +1 -1
  24. package/dist/admin/apps/api-keys.d.ts +111 -6
  25. package/dist/admin/apps/api-keys.d.ts.map +1 -1
  26. package/dist/admin/apps/api-keys.js +67 -0
  27. package/dist/admin/apps/api-keys.js.map +1 -1
  28. package/dist/admin/apps/scopes.d.ts +12 -1
  29. package/dist/admin/apps/scopes.d.ts.map +1 -1
  30. package/dist/admin/apps/scopes.js +3 -0
  31. package/dist/admin/apps/scopes.js.map +1 -1
  32. package/dist/admin/apps/verified-tokens.d.ts +116 -116
  33. package/dist/admin/apps/verified-tokens.js +1 -1
  34. package/dist/admin/apps/verified-tokens.js.map +1 -1
  35. package/dist/admin/ui.generated.d.ts +1 -1
  36. package/dist/admin/ui.generated.js +13 -13
  37. package/dist/admin/ui.generated.js.map +1 -1
  38. package/dist/analytics/Analytics.d.ts +151 -0
  39. package/dist/analytics/Analytics.d.ts.map +1 -0
  40. package/dist/analytics/Analytics.js +212 -0
  41. package/dist/analytics/Analytics.js.map +1 -0
  42. package/dist/analytics/tables/requestEvents.d.ts +215 -0
  43. package/dist/analytics/tables/requestEvents.d.ts.map +1 -0
  44. package/dist/analytics/tables/requestEvents.js +264 -0
  45. package/dist/analytics/tables/requestEvents.js.map +1 -0
  46. package/dist/apps/data/App.d.ts +19576 -0
  47. package/dist/apps/data/App.d.ts.map +1 -0
  48. package/dist/apps/data/App.js +272 -0
  49. package/dist/apps/data/App.js.map +1 -0
  50. package/dist/apps/data/index.d.ts +3 -0
  51. package/dist/apps/data/index.d.ts.map +1 -0
  52. package/dist/apps/data/index.js +3 -0
  53. package/dist/apps/data/index.js.map +1 -0
  54. package/dist/apps/{activities.d.ts → data/routes/activities.d.ts} +32 -32
  55. package/dist/apps/{activities.d.ts.map → data/routes/activities.d.ts.map} +1 -1
  56. package/dist/apps/{activities.js → data/routes/activities.js} +13 -13
  57. package/dist/apps/data/routes/activities.js.map +1 -0
  58. package/dist/apps/{addresses.d.ts → data/routes/addresses.d.ts} +22 -22
  59. package/dist/apps/{addresses.d.ts.map → data/routes/addresses.d.ts.map} +1 -1
  60. package/dist/apps/{addresses.js → data/routes/addresses.js} +5 -5
  61. package/dist/apps/data/routes/addresses.js.map +1 -0
  62. package/dist/apps/{balances.d.ts → data/routes/balances.d.ts} +4 -4
  63. package/dist/apps/data/routes/balances.d.ts.map +1 -0
  64. package/dist/apps/{balances.js → data/routes/balances.js} +42 -11
  65. package/dist/apps/data/routes/balances.js.map +1 -0
  66. package/dist/apps/{blocks.d.ts → data/routes/blocks.d.ts} +47 -47
  67. package/dist/apps/data/routes/blocks.d.ts.map +1 -0
  68. package/dist/apps/{blocks.js → data/routes/blocks.js} +13 -13
  69. package/dist/apps/data/routes/blocks.js.map +1 -0
  70. package/dist/apps/{coingecko.d.ts → data/routes/coingecko.d.ts} +8 -8
  71. package/dist/apps/data/routes/coingecko.d.ts.map +1 -0
  72. package/dist/apps/{coingecko.js → data/routes/coingecko.js} +13 -13
  73. package/dist/apps/data/routes/coingecko.js.map +1 -0
  74. package/dist/apps/{exchanges.d.ts → data/routes/exchanges.d.ts} +108 -108
  75. package/dist/apps/data/routes/exchanges.d.ts.map +1 -0
  76. package/dist/apps/{exchanges.js → data/routes/exchanges.js} +19 -19
  77. package/dist/apps/data/routes/exchanges.js.map +1 -0
  78. package/dist/apps/{fee-amm.d.ts → data/routes/fee-amm.d.ts} +39 -39
  79. package/dist/apps/data/routes/fee-amm.d.ts.map +1 -0
  80. package/dist/apps/{fee-amm.js → data/routes/fee-amm.js} +17 -17
  81. package/dist/apps/data/routes/fee-amm.js.map +1 -0
  82. package/dist/apps/data/routes/funding.d.ts +765 -0
  83. package/dist/apps/data/routes/funding.d.ts.map +1 -0
  84. package/dist/apps/data/routes/funding.js +383 -0
  85. package/dist/apps/data/routes/funding.js.map +1 -0
  86. package/dist/apps/{indexer.d.ts → data/routes/indexer.d.ts} +4 -4
  87. package/dist/apps/data/routes/indexer.d.ts.map +1 -0
  88. package/dist/apps/{indexer.js → data/routes/indexer.js} +13 -9
  89. package/dist/apps/data/routes/indexer.js.map +1 -0
  90. package/dist/apps/{receipts.d.ts → data/routes/receipts.d.ts} +49 -49
  91. package/dist/apps/data/routes/receipts.d.ts.map +1 -0
  92. package/dist/apps/{receipts.js → data/routes/receipts.js} +14 -20
  93. package/dist/apps/data/routes/receipts.js.map +1 -0
  94. package/dist/apps/{rpc.d.ts → data/routes/rpc.d.ts} +33 -40
  95. package/dist/apps/data/routes/rpc.d.ts.map +1 -0
  96. package/dist/apps/{rpc.js → data/routes/rpc.js} +35 -7
  97. package/dist/apps/data/routes/rpc.js.map +1 -0
  98. package/dist/apps/{tokenlist.d.ts → data/routes/tokenlist.d.ts} +40 -40
  99. package/dist/apps/data/routes/tokenlist.d.ts.map +1 -0
  100. package/dist/apps/{tokenlist.js → data/routes/tokenlist.js} +8 -8
  101. package/dist/apps/data/routes/tokenlist.js.map +1 -0
  102. package/dist/apps/{tokens.d.ts → data/routes/tokens.d.ts} +468 -468
  103. package/dist/apps/data/routes/tokens.d.ts.map +1 -0
  104. package/dist/apps/{tokens.js → data/routes/tokens.js} +19 -19
  105. package/dist/apps/data/routes/tokens.js.map +1 -0
  106. package/dist/apps/{transactions.d.ts → data/routes/transactions.d.ts} +304 -304
  107. package/dist/apps/data/routes/transactions.d.ts.map +1 -0
  108. package/dist/apps/{transactions.js → data/routes/transactions.js} +13 -13
  109. package/dist/apps/data/routes/transactions.js.map +1 -0
  110. package/dist/apps/{transfers.d.ts → data/routes/transfers.d.ts} +62 -62
  111. package/dist/apps/data/routes/transfers.d.ts.map +1 -0
  112. package/dist/apps/{transfers.js → data/routes/transfers.js} +13 -13
  113. package/dist/apps/data/routes/transfers.js.map +1 -0
  114. package/dist/apps/{verified-tokens.d.ts → data/routes/verified-tokens.d.ts} +6 -6
  115. package/dist/apps/data/routes/verified-tokens.d.ts.map +1 -0
  116. package/dist/apps/{verified-tokens.js → data/routes/verified-tokens.js} +9 -9
  117. package/dist/apps/data/routes/verified-tokens.js.map +1 -0
  118. package/dist/apps/{webhooks.d.ts → data/routes/webhooks.d.ts} +17 -17
  119. package/dist/apps/{webhooks.d.ts.map → data/routes/webhooks.d.ts.map} +1 -1
  120. package/dist/apps/{webhooks.js → data/routes/webhooks.js} +38 -34
  121. package/dist/apps/data/routes/webhooks.js.map +1 -0
  122. package/dist/apps/docs/App.d.ts +29 -0
  123. package/dist/apps/docs/App.d.ts.map +1 -0
  124. package/dist/apps/docs/App.js +54 -0
  125. package/dist/apps/docs/App.js.map +1 -0
  126. package/dist/{internal/OpenApi.fonts.d.ts → apps/docs/fonts.d.ts} +1 -1
  127. package/dist/apps/docs/fonts.d.ts.map +1 -0
  128. package/dist/{internal/OpenApi.fonts.js → apps/docs/fonts.js} +1 -1
  129. package/dist/apps/docs/fonts.js.map +1 -0
  130. package/dist/apps/docs/index.d.ts +2 -0
  131. package/dist/apps/docs/index.d.ts.map +1 -0
  132. package/dist/apps/docs/index.js +2 -0
  133. package/dist/apps/docs/index.js.map +1 -0
  134. package/dist/{internal/OpenApi.logo.d.ts → apps/docs/logo.d.ts} +1 -1
  135. package/dist/apps/docs/logo.d.ts.map +1 -0
  136. package/dist/{internal/OpenApi.logo.js → apps/docs/logo.js} +1 -1
  137. package/dist/apps/docs/logo.js.map +1 -0
  138. package/dist/apps/docs/reference.d.ts +21 -0
  139. package/dist/apps/docs/reference.d.ts.map +1 -0
  140. package/dist/apps/docs/reference.js +112 -0
  141. package/dist/apps/docs/reference.js.map +1 -0
  142. package/dist/apps/index.d.ts +5 -0
  143. package/dist/apps/index.d.ts.map +1 -0
  144. package/dist/apps/index.js +5 -0
  145. package/dist/apps/index.js.map +1 -0
  146. package/dist/apps/mcp.d.ts +76 -0
  147. package/dist/apps/mcp.d.ts.map +1 -0
  148. package/dist/apps/mcp.js +188 -0
  149. package/dist/apps/mcp.js.map +1 -0
  150. package/dist/apps/metadata.d.ts +7 -0
  151. package/dist/apps/metadata.d.ts.map +1 -0
  152. package/dist/apps/metadata.js +15 -0
  153. package/dist/apps/metadata.js.map +1 -0
  154. package/dist/apps/platform/App.d.ts +5262 -0
  155. package/dist/apps/platform/App.d.ts.map +1 -0
  156. package/dist/apps/platform/App.js +84 -0
  157. package/dist/apps/platform/App.js.map +1 -0
  158. package/dist/apps/platform/Billing.d.ts +279 -0
  159. package/dist/apps/platform/Billing.d.ts.map +1 -0
  160. package/dist/apps/platform/Billing.js +477 -0
  161. package/dist/apps/platform/Billing.js.map +1 -0
  162. package/dist/apps/platform/index.d.ts +3 -0
  163. package/dist/apps/platform/index.d.ts.map +1 -0
  164. package/dist/apps/platform/index.js +3 -0
  165. package/dist/apps/platform/index.js.map +1 -0
  166. package/dist/apps/platform/routes/api-keys.d.ts +973 -0
  167. package/dist/apps/platform/routes/api-keys.d.ts.map +1 -0
  168. package/dist/apps/platform/routes/api-keys.js +430 -0
  169. package/dist/apps/platform/routes/api-keys.js.map +1 -0
  170. package/dist/apps/platform/routes/billing.d.ts +1520 -0
  171. package/dist/apps/platform/routes/billing.d.ts.map +1 -0
  172. package/dist/apps/platform/routes/billing.js +795 -0
  173. package/dist/apps/platform/routes/billing.js.map +1 -0
  174. package/dist/apps/platform/routes/invitations.d.ts +851 -0
  175. package/dist/apps/platform/routes/invitations.d.ts.map +1 -0
  176. package/dist/apps/platform/routes/invitations.js +471 -0
  177. package/dist/apps/platform/routes/invitations.js.map +1 -0
  178. package/dist/apps/platform/routes/me.d.ts +95 -0
  179. package/dist/apps/platform/routes/me.d.ts.map +1 -0
  180. package/dist/apps/platform/routes/me.js +81 -0
  181. package/dist/apps/platform/routes/me.js.map +1 -0
  182. package/dist/apps/platform/routes/members.d.ts +554 -0
  183. package/dist/apps/platform/routes/members.d.ts.map +1 -0
  184. package/dist/apps/platform/routes/members.js +251 -0
  185. package/dist/apps/platform/routes/members.js.map +1 -0
  186. package/dist/apps/platform/routes/orgs.d.ts +596 -0
  187. package/dist/apps/platform/routes/orgs.d.ts.map +1 -0
  188. package/dist/apps/platform/routes/orgs.js +276 -0
  189. package/dist/apps/platform/routes/orgs.js.map +1 -0
  190. package/dist/apps/platform/routes/projects.d.ts +740 -0
  191. package/dist/apps/platform/routes/projects.d.ts.map +1 -0
  192. package/dist/apps/platform/routes/projects.js +286 -0
  193. package/dist/apps/platform/routes/projects.js.map +1 -0
  194. package/dist/apps/platform/routes/scopes.d.ts +107 -0
  195. package/dist/apps/platform/routes/scopes.d.ts.map +1 -0
  196. package/dist/apps/platform/routes/scopes.js +66 -0
  197. package/dist/apps/platform/routes/scopes.js.map +1 -0
  198. package/dist/apps/platform/routes/usage.d.ts +588 -0
  199. package/dist/apps/platform/routes/usage.d.ts.map +1 -0
  200. package/dist/apps/platform/routes/usage.js +391 -0
  201. package/dist/apps/platform/routes/usage.js.map +1 -0
  202. package/dist/apps/relay/App.d.ts +44 -0
  203. package/dist/apps/relay/App.d.ts.map +1 -0
  204. package/dist/apps/relay/App.js +211 -0
  205. package/dist/apps/relay/App.js.map +1 -0
  206. package/dist/apps/relay/Sponsorships.d.ts +107 -0
  207. package/dist/apps/relay/Sponsorships.d.ts.map +1 -0
  208. package/dist/apps/relay/Sponsorships.js +194 -0
  209. package/dist/apps/relay/Sponsorships.js.map +1 -0
  210. package/dist/apps/relay/index.d.ts +3 -0
  211. package/dist/apps/relay/index.d.ts.map +1 -0
  212. package/dist/apps/relay/index.js +3 -0
  213. package/dist/apps/relay/index.js.map +1 -0
  214. package/dist/cli/Cli.d.ts +9 -2
  215. package/dist/cli/Cli.d.ts.map +1 -1
  216. package/dist/cli/Cli.js +12 -4
  217. package/dist/cli/Cli.js.map +1 -1
  218. package/dist/cli/commands/admin.d.ts +5 -1
  219. package/dist/cli/commands/admin.d.ts.map +1 -1
  220. package/dist/cli/commands/admin.js +82 -3
  221. package/dist/cli/commands/admin.js.map +1 -1
  222. package/dist/db/Db.d.ts +17 -0
  223. package/dist/db/Db.d.ts.map +1 -1
  224. package/dist/db/Db.js +254 -0
  225. package/dist/db/Db.js.map +1 -1
  226. package/dist/db/Schema.d.ts +159 -0
  227. package/dist/db/Schema.d.ts.map +1 -1
  228. package/dist/db/Schema.js +187 -2
  229. package/dist/db/Schema.js.map +1 -1
  230. package/dist/db/tables/billingSettings.d.ts +55 -0
  231. package/dist/db/tables/billingSettings.d.ts.map +1 -0
  232. package/dist/db/tables/billingSettings.js +70 -0
  233. package/dist/db/tables/billingSettings.js.map +1 -0
  234. package/dist/db/tables/invitations.d.ts +84 -0
  235. package/dist/db/tables/invitations.d.ts.map +1 -0
  236. package/dist/db/tables/invitations.js +165 -0
  237. package/dist/db/tables/invitations.js.map +1 -0
  238. package/dist/db/tables/memberships.d.ts +108 -0
  239. package/dist/db/tables/memberships.d.ts.map +1 -0
  240. package/dist/db/tables/memberships.js +153 -0
  241. package/dist/db/tables/memberships.js.map +1 -0
  242. package/dist/db/tables/organizations.d.ts +48 -0
  243. package/dist/db/tables/organizations.d.ts.map +1 -1
  244. package/dist/db/tables/organizations.js +97 -2
  245. package/dist/db/tables/organizations.js.map +1 -1
  246. package/dist/db/tables/projects.d.ts +65 -0
  247. package/dist/db/tables/projects.d.ts.map +1 -0
  248. package/dist/db/tables/projects.js +75 -0
  249. package/dist/db/tables/projects.js.map +1 -0
  250. package/dist/db/tables/requestUsage.d.ts +121 -0
  251. package/dist/db/tables/requestUsage.d.ts.map +1 -0
  252. package/dist/db/tables/requestUsage.js +150 -0
  253. package/dist/db/tables/requestUsage.js.map +1 -0
  254. package/dist/db/tables/sponsoredTransactions.d.ts +239 -0
  255. package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -0
  256. package/dist/db/tables/sponsoredTransactions.js +314 -0
  257. package/dist/db/tables/sponsoredTransactions.js.map +1 -0
  258. package/dist/db/tables/stripeCustomers.d.ts +81 -0
  259. package/dist/db/tables/stripeCustomers.d.ts.map +1 -0
  260. package/dist/db/tables/stripeCustomers.js +120 -0
  261. package/dist/db/tables/stripeCustomers.js.map +1 -0
  262. package/dist/db/tables/users.d.ts +48 -0
  263. package/dist/db/tables/users.d.ts.map +1 -0
  264. package/dist/db/tables/users.js +65 -0
  265. package/dist/db/tables/users.js.map +1 -0
  266. package/dist/handlers/internal/executionError.d.ts.map +1 -1
  267. package/dist/handlers/internal/executionError.js +2 -0
  268. package/dist/handlers/internal/executionError.js.map +1 -1
  269. package/dist/handlers/internal/multisig.d.ts +2 -6
  270. package/dist/handlers/internal/multisig.d.ts.map +1 -1
  271. package/dist/handlers/internal/multisig.js +11 -36
  272. package/dist/handlers/internal/multisig.js.map +1 -1
  273. package/dist/handlers/internal/sponsorship.d.ts +35 -2
  274. package/dist/handlers/internal/sponsorship.d.ts.map +1 -1
  275. package/dist/handlers/internal/sponsorship.js +53 -14
  276. package/dist/handlers/internal/sponsorship.js.map +1 -1
  277. package/dist/handlers/internal/utils.d.ts +10 -3
  278. package/dist/handlers/internal/utils.d.ts.map +1 -1
  279. package/dist/handlers/internal/utils.js +14 -6
  280. package/dist/handlers/internal/utils.js.map +1 -1
  281. package/dist/handlers/relay.d.ts +6 -2
  282. package/dist/handlers/relay.d.ts.map +1 -1
  283. package/dist/handlers/relay.js +16 -2
  284. package/dist/handlers/relay.js.map +1 -1
  285. package/dist/index.d.ts +1 -0
  286. package/dist/index.d.ts.map +1 -1
  287. package/dist/index.js +1 -0
  288. package/dist/index.js.map +1 -1
  289. package/dist/internal/Auth.d.ts +222 -6
  290. package/dist/internal/Auth.d.ts.map +1 -1
  291. package/dist/internal/Auth.js +625 -74
  292. package/dist/internal/Auth.js.map +1 -1
  293. package/dist/internal/Cache.d.ts.map +1 -1
  294. package/dist/internal/Cache.js +4 -1
  295. package/dist/internal/Cache.js.map +1 -1
  296. package/dist/internal/EdgeCache.d.ts +10 -0
  297. package/dist/internal/EdgeCache.d.ts.map +1 -1
  298. package/dist/internal/EdgeCache.js +39 -8
  299. package/dist/internal/EdgeCache.js.map +1 -1
  300. package/dist/internal/Fees.d.ts +27 -0
  301. package/dist/internal/Fees.d.ts.map +1 -0
  302. package/dist/internal/Fees.js +48 -0
  303. package/dist/internal/Fees.js.map +1 -0
  304. package/dist/internal/FundingRoutes.d.ts +183 -0
  305. package/dist/internal/FundingRoutes.d.ts.map +1 -0
  306. package/dist/internal/FundingRoutes.js +490 -0
  307. package/dist/internal/FundingRoutes.js.map +1 -0
  308. package/dist/internal/Id.d.ts +15 -0
  309. package/dist/internal/Id.d.ts.map +1 -0
  310. package/dist/internal/Id.js +22 -0
  311. package/dist/internal/Id.js.map +1 -0
  312. package/dist/internal/Log.d.ts +9 -3
  313. package/dist/internal/Log.d.ts.map +1 -1
  314. package/dist/internal/Log.js +7 -0
  315. package/dist/internal/Log.js.map +1 -1
  316. package/dist/internal/OpenApi.d.ts +10 -20
  317. package/dist/internal/OpenApi.d.ts.map +1 -1
  318. package/dist/internal/OpenApi.js +8 -58
  319. package/dist/internal/OpenApi.js.map +1 -1
  320. package/dist/internal/RateLimit.d.ts +25 -0
  321. package/dist/internal/RateLimit.d.ts.map +1 -1
  322. package/dist/internal/RateLimit.js +51 -0
  323. package/dist/internal/RateLimit.js.map +1 -1
  324. package/dist/internal/Response.d.ts +1 -1
  325. package/dist/internal/Response.d.ts.map +1 -1
  326. package/dist/internal/Schema.d.ts +8 -0
  327. package/dist/internal/Schema.d.ts.map +1 -1
  328. package/dist/internal/Schema.js +7 -0
  329. package/dist/internal/Schema.js.map +1 -1
  330. package/dist/internal/Store.d.ts +7 -1
  331. package/dist/internal/Store.d.ts.map +1 -1
  332. package/dist/internal/Store.js +16 -2
  333. package/dist/internal/Store.js.map +1 -1
  334. package/dist/internal/Viem.d.ts +84 -0
  335. package/dist/internal/Viem.d.ts.map +1 -1
  336. package/dist/internal/Webhooks.d.ts +1 -1
  337. package/dist/internal/Webhooks.d.ts.map +1 -1
  338. package/dist/internal/Webhooks.js +3 -3
  339. package/dist/internal/Webhooks.js.map +1 -1
  340. package/package.json +33 -6
  341. package/src/ApiKey.ts +10 -2
  342. package/src/ApiKeys.test.ts +155 -1
  343. package/src/ApiKeys.ts +203 -1
  344. package/src/App.test.ts +64 -75741
  345. package/src/App.ts +218 -420
  346. package/src/Client.test-d.ts +657 -15
  347. package/src/Scope.ts +26 -4
  348. package/src/Webhooks.ts +2 -2
  349. package/src/admin/apps/api-keys.test.ts +51 -0
  350. package/src/admin/apps/api-keys.ts +84 -0
  351. package/src/admin/apps/scopes.test.ts +11 -1
  352. package/src/admin/apps/scopes.ts +3 -0
  353. package/src/admin/apps/verified-tokens.ts +1 -1
  354. package/src/admin/ui/src/components/Page.tsx +2 -3
  355. package/src/admin/ui/src/routes/__root.tsx +2 -2
  356. package/src/admin/ui/src/routes/api-keys.tsx +2 -2
  357. package/src/admin/ui.generated.ts +13 -13
  358. package/src/analytics/Analytics.test.ts +527 -0
  359. package/src/analytics/Analytics.ts +318 -0
  360. package/src/analytics/tables/requestEvents.ts +523 -0
  361. package/src/apps/composition.test.ts +66 -0
  362. package/src/apps/data/App.test.ts +72 -0
  363. package/src/apps/data/App.ts +330 -0
  364. package/src/apps/data/index.ts +2 -0
  365. package/src/apps/{activities.test.ts → data/routes/activities.test.ts} +3 -3
  366. package/src/apps/{activities.ts → data/routes/activities.ts} +15 -15
  367. package/src/apps/{addresses.ts → data/routes/addresses.ts} +6 -6
  368. package/src/apps/{balances.test.ts → data/routes/balances.test.ts} +2 -2
  369. package/src/apps/{balances.ts → data/routes/balances.ts} +46 -12
  370. package/src/apps/{blocks.test.ts → data/routes/blocks.test.ts} +3 -3
  371. package/src/apps/{blocks.ts → data/routes/blocks.ts} +14 -14
  372. package/src/apps/{coingecko.test.ts → data/routes/coingecko.test.ts} +2 -2
  373. package/src/apps/{coingecko.ts → data/routes/coingecko.ts} +14 -14
  374. package/src/apps/{exchanges.test.ts → data/routes/exchanges.test.ts} +1 -1
  375. package/src/apps/{exchanges.ts → data/routes/exchanges.ts} +20 -20
  376. package/src/apps/{fee-amm.test.ts → data/routes/fee-amm.test.ts} +3 -3
  377. package/src/apps/{fee-amm.ts → data/routes/fee-amm.ts} +18 -18
  378. package/src/apps/data/routes/funding.test.ts +214 -0
  379. package/src/apps/data/routes/funding.ts +584 -0
  380. package/src/apps/{indexer.test.ts → data/routes/indexer.test.ts} +26 -5
  381. package/src/apps/{indexer.ts → data/routes/indexer.ts} +13 -10
  382. package/src/apps/{receipts.test.ts → data/routes/receipts.test.ts} +3 -3
  383. package/src/apps/{receipts.ts → data/routes/receipts.ts} +15 -22
  384. package/src/apps/{rpc.test.ts → data/routes/rpc.test.ts} +122 -7
  385. package/src/apps/{rpc.ts → data/routes/rpc.ts} +38 -8
  386. package/src/apps/{tokenlist.test.ts → data/routes/tokenlist.test.ts} +3 -3
  387. package/src/apps/{tokenlist.ts → data/routes/tokenlist.ts} +9 -9
  388. package/src/apps/{tokens.test.ts → data/routes/tokens.test.ts} +2 -2
  389. package/src/apps/{tokens.ts → data/routes/tokens.ts} +20 -20
  390. package/src/apps/{transactions.test.ts → data/routes/transactions.test.ts} +3 -3
  391. package/src/apps/{transactions.ts → data/routes/transactions.ts} +15 -15
  392. package/src/apps/{transfers.test.ts → data/routes/transfers.test.ts} +2 -2
  393. package/src/apps/{transfers.ts → data/routes/transfers.ts} +15 -15
  394. package/src/apps/{verified-tokens.test.ts → data/routes/verified-tokens.test.ts} +3 -3
  395. package/src/apps/{verified-tokens.ts → data/routes/verified-tokens.ts} +10 -10
  396. package/src/apps/{webhooks.test.ts → data/routes/webhooks.test.ts} +7 -7
  397. package/src/apps/{webhooks.ts → data/routes/webhooks.ts} +50 -43
  398. package/src/apps/docs/App.ts +65 -0
  399. package/src/apps/docs/index.ts +1 -0
  400. package/src/apps/docs/reference.ts +132 -0
  401. package/src/apps/index.ts +4 -0
  402. package/src/apps/mcp.test.ts +206 -0
  403. package/src/apps/mcp.ts +250 -0
  404. package/src/apps/metadata.ts +23 -0
  405. package/src/apps/platform/App.ts +169 -0
  406. package/src/apps/platform/Billing.test.ts +530 -0
  407. package/src/apps/platform/Billing.ts +682 -0
  408. package/src/apps/platform/index.ts +2 -0
  409. package/src/apps/platform/routes/api-keys.test.ts +493 -0
  410. package/src/apps/platform/routes/api-keys.ts +543 -0
  411. package/src/apps/platform/routes/billing.test.ts +1100 -0
  412. package/src/apps/platform/routes/billing.ts +966 -0
  413. package/src/apps/platform/routes/invitations.test.ts +409 -0
  414. package/src/apps/platform/routes/invitations.ts +587 -0
  415. package/src/apps/platform/routes/me.test.ts +351 -0
  416. package/src/apps/platform/routes/me.ts +106 -0
  417. package/src/apps/platform/routes/members.test.ts +195 -0
  418. package/src/apps/platform/routes/members.ts +313 -0
  419. package/src/apps/platform/routes/orgs.test.ts +313 -0
  420. package/src/apps/platform/routes/orgs.ts +365 -0
  421. package/src/apps/platform/routes/projects.test.ts +181 -0
  422. package/src/apps/platform/routes/projects.ts +367 -0
  423. package/src/apps/platform/routes/scopes.test.ts +29 -0
  424. package/src/apps/platform/routes/scopes.ts +85 -0
  425. package/src/apps/platform/routes/usage.test.ts +422 -0
  426. package/src/apps/platform/routes/usage.ts +527 -0
  427. package/src/apps/relay/App.test.ts +933 -0
  428. package/src/apps/relay/App.ts +236 -0
  429. package/src/apps/relay/Sponsorships.test.ts +375 -0
  430. package/src/apps/relay/Sponsorships.ts +306 -0
  431. package/src/apps/relay/index.ts +2 -0
  432. package/src/cli/Cli.test.ts +25 -2
  433. package/src/cli/Cli.ts +18 -3
  434. package/src/cli/commands/admin.test.ts +83 -0
  435. package/src/cli/commands/admin.ts +91 -3
  436. package/src/db/Db.ts +296 -0
  437. package/src/db/Schema.ts +241 -2
  438. package/src/db/tables/billingSettings.test.ts +87 -0
  439. package/src/db/tables/billingSettings.ts +108 -0
  440. package/src/db/tables/invitations.ts +198 -0
  441. package/src/db/tables/memberships.ts +208 -0
  442. package/src/db/tables/organizations.test.ts +38 -2
  443. package/src/db/tables/organizations.ts +117 -2
  444. package/src/db/tables/projects.ts +107 -0
  445. package/src/db/tables/requestUsage.ts +231 -0
  446. package/src/db/tables/sponsoredTransactions.test.ts +325 -0
  447. package/src/db/tables/sponsoredTransactions.ts +464 -0
  448. package/src/db/tables/stripeCustomers.test.ts +109 -0
  449. package/src/db/tables/stripeCustomers.ts +162 -0
  450. package/src/db/tables/users.ts +85 -0
  451. package/src/handlers/internal/executionError.ts +2 -0
  452. package/src/handlers/internal/multisig.test.ts +84 -10
  453. package/src/handlers/internal/multisig.ts +15 -50
  454. package/src/handlers/internal/sponsorship.ts +106 -20
  455. package/src/handlers/internal/utils.ts +19 -7
  456. package/src/handlers/{internal/relay.localnet.test.ts → relay.test.ts} +2 -2
  457. package/src/handlers/relay.ts +23 -5
  458. package/src/index.ts +1 -0
  459. package/src/internal/Auth.test.ts +491 -25
  460. package/src/internal/Auth.ts +839 -84
  461. package/src/internal/Cache.ts +5 -1
  462. package/src/internal/Cursor.test.ts +3 -2
  463. package/src/internal/EdgeCache.test.ts +27 -4
  464. package/src/internal/EdgeCache.ts +47 -9
  465. package/src/internal/Fees.test.ts +32 -0
  466. package/src/internal/Fees.ts +51 -0
  467. package/src/internal/FundingRoutes.ts +583 -0
  468. package/src/internal/Id.test.ts +17 -0
  469. package/src/internal/Id.ts +24 -0
  470. package/src/internal/Log.test.ts +2 -1
  471. package/src/internal/Log.ts +16 -3
  472. package/src/internal/MetricSink.ts +1 -1
  473. package/src/internal/OpenApi.ts +12 -60
  474. package/src/internal/RateLimit.test.ts +84 -0
  475. package/src/internal/RateLimit.ts +70 -0
  476. package/src/internal/Response.ts +1 -1
  477. package/src/internal/Schema.ts +8 -0
  478. package/src/internal/Store.test.ts +52 -0
  479. package/src/internal/Store.ts +24 -5
  480. package/src/internal/Tidx.local.test.ts +1 -1
  481. package/src/internal/VerifiedTokens.test.ts +1 -1
  482. package/src/internal/WebhookDestination.test.ts +1 -1
  483. package/src/internal/Webhooks.test.ts +7 -7
  484. package/src/internal/Webhooks.ts +4 -4
  485. package/dist/apps/activities.js.map +0 -1
  486. package/dist/apps/addresses.js.map +0 -1
  487. package/dist/apps/balances.d.ts.map +0 -1
  488. package/dist/apps/balances.js.map +0 -1
  489. package/dist/apps/blocks.d.ts.map +0 -1
  490. package/dist/apps/blocks.js.map +0 -1
  491. package/dist/apps/coingecko.d.ts.map +0 -1
  492. package/dist/apps/coingecko.js.map +0 -1
  493. package/dist/apps/exchanges.d.ts.map +0 -1
  494. package/dist/apps/exchanges.js.map +0 -1
  495. package/dist/apps/fee-amm.d.ts.map +0 -1
  496. package/dist/apps/fee-amm.js.map +0 -1
  497. package/dist/apps/indexer.d.ts.map +0 -1
  498. package/dist/apps/indexer.js.map +0 -1
  499. package/dist/apps/receipts.d.ts.map +0 -1
  500. package/dist/apps/receipts.js.map +0 -1
  501. package/dist/apps/rpc.d.ts.map +0 -1
  502. package/dist/apps/rpc.js.map +0 -1
  503. package/dist/apps/tokenlist.d.ts.map +0 -1
  504. package/dist/apps/tokenlist.js.map +0 -1
  505. package/dist/apps/tokens.d.ts.map +0 -1
  506. package/dist/apps/tokens.js.map +0 -1
  507. package/dist/apps/transactions.d.ts.map +0 -1
  508. package/dist/apps/transactions.js.map +0 -1
  509. package/dist/apps/transfers.d.ts.map +0 -1
  510. package/dist/apps/transfers.js.map +0 -1
  511. package/dist/apps/verified-tokens.d.ts.map +0 -1
  512. package/dist/apps/verified-tokens.js.map +0 -1
  513. package/dist/apps/webhooks.js.map +0 -1
  514. package/dist/internal/OpenApi.fonts.d.ts.map +0 -1
  515. package/dist/internal/OpenApi.fonts.js.map +0 -1
  516. package/dist/internal/OpenApi.logo.d.ts.map +0 -1
  517. package/dist/internal/OpenApi.logo.js.map +0 -1
  518. package/src/handlers/internal/multisig.localnet.test.ts +0 -146
  519. /package/src/{internal/OpenApi.fonts.ts → apps/docs/fonts.ts} +0 -0
  520. /package/src/{internal/OpenApi.logo.ts → apps/docs/logo.ts} +0 -0
@@ -0,0 +1,543 @@
1
+ import { type Context, Hono } from 'hono'
2
+ import * as z from 'zod/mini'
3
+
4
+ import * as ApiKeys from '../../../ApiKeys.js'
5
+ import type * as App from '../../../App.js'
6
+ import * as Db from '../../../db/Db.js'
7
+ import * as Auth from '../../../internal/Auth.js'
8
+ import * as Billing from '../Billing.js'
9
+ import * as OpenApi from '../../../internal/OpenApi.js'
10
+ import * as Response from '../../../internal/Response.js'
11
+ import * as Schema from '../../../internal/Schema.js'
12
+ import * as Scope from '../../../Scope.js'
13
+
14
+ /** Zod schemas owned by the API-keys resource. */
15
+ export namespace schema {
16
+ /** One API key: metadata only — the token appears once, at mint. */
17
+ export const Key = Schema.describe(
18
+ z.object({
19
+ createdAt: z
20
+ .string()
21
+ .check(
22
+ z.describe('When the key was minted (ISO 8601).'),
23
+ z.meta({ examples: ['2026-01-01T00:00:00.000Z'] }),
24
+ ),
25
+ createdBy: z
26
+ .optional(z.string())
27
+ .check(
28
+ z.describe('Identity that minted the key (`usr_…`, or `super_admin`).'),
29
+ z.meta({ examples: ['usr_1a2b3c4d5e6f7g8h9j0k1m2n'] }),
30
+ ),
31
+ environment: z
32
+ .enum(['production', 'sandbox'])
33
+ .check(z.describe('Key environment.'), z.meta({ examples: ['sandbox'] })),
34
+ expiresAt: z
35
+ .optional(z.string())
36
+ .check(
37
+ z.describe('When the key expires (ISO 8601). Absent for a non-expiring key.'),
38
+ z.meta({ examples: ['2027-01-01T00:00:00.000Z'] }),
39
+ ),
40
+ id: z
41
+ .string()
42
+ .check(
43
+ z.describe('Opaque key id (`key_…`).'),
44
+ z.meta({ examples: ['key_1a2b3c4d5e6f7g8h9j0k1m2n'] }),
45
+ ),
46
+ name: z
47
+ .optional(z.string())
48
+ .check(z.describe('Human-readable key name.'), z.meta({ examples: ['CI'] })),
49
+ orgId: z
50
+ .string()
51
+ .check(
52
+ z.describe('Owning organization id (`org_…`).'),
53
+ z.meta({ examples: ['org_1a2b3c4d5e6f7g8h9j0k1m2n'] }),
54
+ ),
55
+ projectId: z.optional(z.string()).check(
56
+ z.describe('Owning project id (`prj_…`).'), // prettier-ignore
57
+ z.meta({ examples: ['prj_1a2b3c4d5e6f7g8h9j0k1m2n'] }),
58
+ ),
59
+ scopes: z
60
+ .array(z.enum([...Scope.catalog.map((entry) => entry.scope), Scope.wildcard]))
61
+ .check(
62
+ z.describe(
63
+ "Granted scopes. '*' (grant-all) appears only on keys minted by the super admin.",
64
+ ),
65
+ z.meta({ examples: [['data:read']] }),
66
+ ),
67
+ tokenLast4: z
68
+ .string()
69
+ .check(
70
+ z.describe('Last 4 characters of the plaintext token.'),
71
+ z.meta({ examples: ['a1b2'] }),
72
+ ),
73
+ }),
74
+ 'An API key: metadata only — the token appears once, at mint.',
75
+ )
76
+
77
+ /** Path parameters addressing a project's key collection. */
78
+ export const Params = z
79
+ .object({
80
+ orgId: z
81
+ .string()
82
+ .check(
83
+ z.describe('The organization id (`org_…`).'),
84
+ z.meta({ examples: ['org_1a2b3c4d5e6f7g8h9j0k1m2n'] }),
85
+ ),
86
+ projectId: z
87
+ .string()
88
+ .check(
89
+ z.describe('The project id (`prj_…`).'),
90
+ z.meta({ examples: ['prj_1a2b3c4d5e6f7g8h9j0k1m2n'] }),
91
+ ),
92
+ })
93
+ .check(z.describe("Path parameters for a project's API keys."))
94
+
95
+ /** Path parameters addressing an organization's key collection. */
96
+ export const OrgParams = z
97
+ .object({
98
+ orgId: z
99
+ .string()
100
+ .check(
101
+ z.describe('The organization id (`org_…`).'),
102
+ z.meta({ examples: ['org_1a2b3c4d5e6f7g8h9j0k1m2n'] }),
103
+ ),
104
+ })
105
+ .check(z.describe("Path parameters for an organization's API keys."))
106
+
107
+ /** Path parameters addressing one API key. */
108
+ export const KeyParams = z
109
+ .object({
110
+ keyId: z
111
+ .string()
112
+ .check(
113
+ z.describe('The key id (`key_…`).'),
114
+ z.meta({ examples: ['key_1a2b3c4d5e6f7g8h9j0k1m2n'] }),
115
+ ),
116
+ orgId: z
117
+ .string()
118
+ .check(
119
+ z.describe('The organization id (`org_…`).'),
120
+ z.meta({ examples: ['org_1a2b3c4d5e6f7g8h9j0k1m2n'] }),
121
+ ),
122
+ projectId: z
123
+ .string()
124
+ .check(
125
+ z.describe('The project id (`prj_…`).'),
126
+ z.meta({ examples: ['prj_1a2b3c4d5e6f7g8h9j0k1m2n'] }),
127
+ ),
128
+ })
129
+ .check(z.describe('Path parameters for one API key.'))
130
+
131
+ /** Request body minting a key. The wildcard scope is not issuable here. */
132
+ export const KeyBody = z
133
+ .object({
134
+ environment: z
135
+ ._default(z.enum(['production', 'sandbox']), 'production')
136
+ .check(z.describe('Key environment.'), z.meta({ examples: ['sandbox'] })),
137
+ name: z
138
+ .optional(z.string().check(z.minLength(1), z.maxLength(100)))
139
+ .check(z.describe('Human-readable key name.'), z.meta({ examples: ['CI'] })),
140
+ scopes: z
141
+ ._default(z.array(z.enum(Scope.catalog.map((entry) => entry.scope))), [])
142
+ .check(z.describe('Scopes to grant.'), z.meta({ examples: [['data:read']] })),
143
+ })
144
+ .check(z.describe('Fields for minting an API key.'))
145
+
146
+ /** Schemas for the createApiKey operation. */
147
+ export namespace createApiKey {
148
+ /** The minted key plus its one-time token. */
149
+ export const Response = Schema.describe(
150
+ z.extend(Key, {
151
+ token: z
152
+ .string()
153
+ .check(
154
+ z.describe('The plaintext token — shown once, unrecoverable afterward.'),
155
+ z.meta({ examples: ['tempo_sandbox:sk:…'] }),
156
+ ),
157
+ }),
158
+ 'The minted key, including its one-time token.',
159
+ )
160
+ }
161
+
162
+ /** Schemas for the listApiKeys operation. */
163
+ export namespace listApiKeys {
164
+ /** Query parameters filtering a project's keys. */
165
+ export const Query = z
166
+ .strictObject({ environment: Schema.Environment })
167
+ .check(z.describe("Query parameters for a project's API keys."))
168
+
169
+ /** Non-paginated list of a project's keys. */
170
+ export const Response = Schema.describe(
171
+ z.object({
172
+ data: z.array(Key).check(z.describe("The project's keys, newest first.")),
173
+ }),
174
+ "A non-paginated list of a project's API keys (metadata only).",
175
+ )
176
+ }
177
+
178
+ /** Schemas for the listOrgApiKeys operation. */
179
+ export namespace listOrgApiKeys {
180
+ /** Query parameters filtering the organization's keys. */
181
+ export const Query = z
182
+ .strictObject({ environment: Schema.Environment })
183
+ .check(z.describe("Query parameters for an organization's API keys."))
184
+
185
+ /** Non-paginated list of every key in the organization. */
186
+ export const Response = Schema.describe(
187
+ z.object({
188
+ data: z
189
+ .array(Key)
190
+ .check(z.describe("The organization's keys across all projects, newest first.")),
191
+ }),
192
+ "A non-paginated list of an organization's API keys (metadata only).",
193
+ )
194
+ }
195
+
196
+ /** Schemas for the revokeApiKey operation. */
197
+ export namespace revokeApiKey {
198
+ /** Confirmation that the key was revoked. */
199
+ export const Response = z
200
+ .object({
201
+ id: z
202
+ .string()
203
+ .check(
204
+ z.describe('ID of the key that was revoked.'),
205
+ z.meta({ examples: ['key_1a2b3c4d5e6f7g8h9j0k1m2n'] }),
206
+ ),
207
+ })
208
+ .check(z.describe('Confirmation that the key was revoked.'))
209
+ }
210
+ }
211
+
212
+ /**
213
+ * Mounts the `/orgs/:orgId/projects/:projectId/api-keys` resource
214
+ * (project-scoped mint/list/revoke) plus the org-wide read
215
+ * `/orgs/:orgId/api-keys`, over the KV state store. Access follows the
216
+ * org/project scope (owning session or super admin); the token appears once,
217
+ * at mint.
218
+ */
219
+ export function apiKeys(options: apiKeys.Options = {}) {
220
+ const hidden = !options.enabled
221
+ return new Hono<App.Environment>()
222
+ .post(
223
+ '/v1/orgs/:orgId{org_[A-Za-z0-9_-]+}/projects/:projectId{prj_[A-Za-z0-9_-]+}/api-keys',
224
+ Auth.policy({ session: true }),
225
+ Auth.ensureOrg({ role: 'admin' }),
226
+ Auth.ensureProject(),
227
+ OpenApi.validate('param', schema.Params, {
228
+ code: 'param_invalid',
229
+ message: 'Check the path parameters and try again.',
230
+ }),
231
+ OpenApi.validate('json', schema.KeyBody, {
232
+ code: 'body_invalid',
233
+ message: 'Check the request body and try again.',
234
+ }),
235
+ OpenApi.describeRoute({
236
+ description: 'Mint a project-scoped API key. The token appears once and is never shown again.', // prettier-ignore
237
+ hide: hidden,
238
+ operationId: 'createApiKey',
239
+ responses: OpenApi.responses({
240
+ errors: {
241
+ 403: {
242
+ codes: ['scope_not_issuable'],
243
+ description: 'The requested scopes are not issuable.',
244
+ },
245
+ 404: 'No accessible project was found for this id.',
246
+ },
247
+ success: {
248
+ description: 'The minted key, including its one-time token.',
249
+ schema: schema.createApiKey.Response,
250
+ },
251
+ }),
252
+ summary: 'Create API key',
253
+ tags: ['API Keys'],
254
+ }),
255
+ async (c) => {
256
+ if (Auth.narrowAccess) return Auth.superAdminAccessError(c)
257
+ if (Auth.narrowScope) return Auth.ensureProjectError(c)
258
+ if (OpenApi.narrowValidation)
259
+ return OpenApi.validationError(c, {
260
+ code: 'param_invalid',
261
+ message: 'Check the path parameters and try again.',
262
+ })
263
+ if (OpenApi.narrowValidation)
264
+ return OpenApi.validationError(c, {
265
+ code: 'body_invalid',
266
+ message: 'Check the request body and try again.',
267
+ })
268
+
269
+ const kv = c.get('kv')
270
+ if (!kv) return notEnabled(c)
271
+ const createdBy = mintedBy(c)
272
+ if (!createdBy) return sessionRequired(c)
273
+
274
+ const body = c.req.valid('json')
275
+
276
+ // Sessions mint only self-issuable scopes; the super admin grants the
277
+ // full catalog. Self-serve covers the whole catalog now that billing
278
+ // ships, so this is a safety net: a future non-self-serve scope would
279
+ // be refused here without further changes.
280
+ if (createdBy !== 'super_admin') {
281
+ const denied = body.scopes.filter((scope) => !Scope.selfServe.includes(scope))
282
+ if (denied.length > 0)
283
+ return Response.error(c, {
284
+ code: 'scope_not_issuable',
285
+ message: 'The requested scopes are not issuable.',
286
+ status: 403,
287
+ })
288
+ }
289
+
290
+ try {
291
+ const orgId = Auth.org(c).id
292
+ // Snapshot billing onto the record so the auth path throttles a
293
+ // sandbox key to the public quota without a per-request billing read.
294
+ // Only sandbox is gated; production keys carry no snapshot.
295
+ const billingActive =
296
+ body.environment === 'sandbox'
297
+ ? await Billing.active(Db.get(c.get('db')), orgId, 'sandbox')
298
+ : undefined
299
+ const { record, token } = await ApiKeys.mint(kv.store, {
300
+ createdBy,
301
+ environment: body.environment,
302
+ ...(billingActive === undefined ? {} : { billingActive }),
303
+ ...(body.name === undefined ? {} : { name: body.name }),
304
+ orgId,
305
+ projectId: Auth.project(c).id,
306
+ scopes: body.scopes,
307
+ })
308
+ return c.json(
309
+ Response.validated(schema.createApiKey.Response, { ...serializeKey(record), token }),
310
+ 200,
311
+ )
312
+ } catch (cause) {
313
+ return Response.upstream(c, cause)
314
+ }
315
+ },
316
+ )
317
+ .get(
318
+ '/v1/orgs/:orgId{org_[A-Za-z0-9_-]+}/projects/:projectId{prj_[A-Za-z0-9_-]+}/api-keys',
319
+ Auth.policy({ session: true }),
320
+ Auth.ensureOrg(),
321
+ Auth.ensureProject(),
322
+ OpenApi.validate('param', schema.Params, {
323
+ code: 'param_invalid',
324
+ message: 'Check the path parameters and try again.',
325
+ }),
326
+ OpenApi.validate('query', schema.listApiKeys.Query, {
327
+ code: 'query_invalid',
328
+ message: 'Check the query parameters and try again.',
329
+ }),
330
+ OpenApi.describeRoute({
331
+ hide: hidden,
332
+ operationId: 'listApiKeys',
333
+ responses: OpenApi.responses({
334
+ errors: {
335
+ 400: { codes: ['query_invalid'], description: 'Invalid query parameters.' },
336
+ 404: 'No accessible project was found for this id.',
337
+ },
338
+ success: {
339
+ description: "The project's keys, newest first (metadata only).",
340
+ schema: schema.listApiKeys.Response,
341
+ },
342
+ }),
343
+ summary: 'List API keys',
344
+ tags: ['API Keys'],
345
+ }),
346
+ async (c) => {
347
+ if (Auth.narrowAccess) return Auth.superAdminAccessError(c)
348
+ if (Auth.narrowScope) return Auth.ensureProjectError(c)
349
+ if (OpenApi.narrowValidation)
350
+ return OpenApi.validationError(c, {
351
+ code: 'param_invalid',
352
+ message: 'Check the path parameters and try again.',
353
+ })
354
+ if (OpenApi.narrowValidation)
355
+ return OpenApi.validationError(c, {
356
+ code: 'query_invalid',
357
+ message: 'Check the query parameters and try again.',
358
+ })
359
+
360
+ const kv = c.get('kv')
361
+ if (!kv) return notEnabled(c)
362
+ try {
363
+ const records = await ApiKeys.listByOrg(kv.store, Auth.org(c).id, {
364
+ environment: c.req.valid('query').environment,
365
+ projectId: Auth.project(c).id,
366
+ })
367
+ return c.json(
368
+ Response.validated(schema.listApiKeys.Response, {
369
+ data: records.map(serializeKey),
370
+ }),
371
+ 200,
372
+ )
373
+ } catch (cause) {
374
+ return Response.upstream(c, cause)
375
+ }
376
+ },
377
+ )
378
+ .get(
379
+ '/v1/orgs/:orgId{org_[A-Za-z0-9_-]+}/api-keys',
380
+ Auth.policy({ session: true }),
381
+ Auth.ensureOrg(),
382
+ OpenApi.validate('param', schema.OrgParams, {
383
+ code: 'param_invalid',
384
+ message: 'Check the path parameters and try again.',
385
+ }),
386
+ OpenApi.validate('query', schema.listOrgApiKeys.Query, {
387
+ code: 'query_invalid',
388
+ message: 'Check the query parameters and try again.',
389
+ }),
390
+ OpenApi.describeRoute({
391
+ description: 'List every API key in the organization, across all of its projects.',
392
+ hide: hidden,
393
+ operationId: 'listOrgApiKeys',
394
+ responses: OpenApi.responses({
395
+ errors: {
396
+ 400: { codes: ['query_invalid'], description: 'Invalid query parameters.' },
397
+ 404: 'No accessible organization was found for this id.',
398
+ },
399
+ success: {
400
+ description: "The organization's keys across all projects, newest first (metadata only).", // prettier-ignore
401
+ schema: schema.listOrgApiKeys.Response,
402
+ },
403
+ }),
404
+ summary: 'List organization API keys',
405
+ tags: ['API Keys'],
406
+ }),
407
+ async (c) => {
408
+ if (Auth.narrowAccess) return Auth.superAdminAccessError(c)
409
+ if (Auth.narrowScope) return Auth.ensureOrgError(c)
410
+ if (OpenApi.narrowValidation)
411
+ return OpenApi.validationError(c, {
412
+ code: 'param_invalid',
413
+ message: 'Check the path parameters and try again.',
414
+ })
415
+ if (OpenApi.narrowValidation)
416
+ return OpenApi.validationError(c, {
417
+ code: 'query_invalid',
418
+ message: 'Check the query parameters and try again.',
419
+ })
420
+
421
+ const kv = c.get('kv')
422
+ if (!kv) return notEnabled(c)
423
+ try {
424
+ const records = await ApiKeys.listByOrg(kv.store, Auth.org(c).id, {
425
+ environment: c.req.valid('query').environment,
426
+ })
427
+ return c.json(
428
+ Response.validated(schema.listOrgApiKeys.Response, {
429
+ data: records.map(serializeKey),
430
+ }),
431
+ 200,
432
+ )
433
+ } catch (cause) {
434
+ return Response.upstream(c, cause)
435
+ }
436
+ },
437
+ )
438
+ .delete(
439
+ '/v1/orgs/:orgId{org_[A-Za-z0-9_-]+}/projects/:projectId{prj_[A-Za-z0-9_-]+}/api-keys/:keyId{key_[A-Za-z0-9_-]+}',
440
+ Auth.policy({ session: true }),
441
+ Auth.ensureOrg({ role: 'admin' }),
442
+ Auth.ensureProject(),
443
+ OpenApi.validate('param', schema.KeyParams, {
444
+ code: 'param_invalid',
445
+ message: 'Check the path parameters and try again.',
446
+ }),
447
+ OpenApi.describeRoute({
448
+ description: 'Revoke an API key. Requests presenting its token stop resolving.',
449
+ hide: hidden,
450
+ operationId: 'revokeApiKey',
451
+ responses: OpenApi.responses({
452
+ errors: { 404: 'No accessible API key was found for this id.' },
453
+ success: {
454
+ description: 'Confirmation that the key was revoked.',
455
+ schema: schema.revokeApiKey.Response,
456
+ },
457
+ }),
458
+ summary: 'Revoke API key',
459
+ tags: ['API Keys'],
460
+ }),
461
+ async (c) => {
462
+ if (Auth.narrowAccess) return Auth.superAdminAccessError(c)
463
+ if (Auth.narrowScope) return Auth.ensureProjectError(c)
464
+ if (OpenApi.narrowValidation)
465
+ return OpenApi.validationError(c, {
466
+ code: 'param_invalid',
467
+ message: 'Check the path parameters and try again.',
468
+ })
469
+
470
+ const kv = c.get('kv')
471
+ if (!kv) return notEnabled(c)
472
+ const { keyId } = c.req.valid('param')
473
+ try {
474
+ // Bind the key to the scoped project before revoking: a key id from
475
+ // another org or project must be indistinguishable from a missing one.
476
+ const record = await ApiKeys.get(kv.store, keyId)
477
+ if (!record || record.orgId !== Auth.org(c).id || record.projectId !== Auth.project(c).id)
478
+ return keyNotFound(c)
479
+ const revoked = await ApiKeys.revoke(kv.store, keyId)
480
+ if (!revoked) return keyNotFound(c)
481
+ return c.json(Response.validated(schema.revokeApiKey.Response, { id: keyId }), 200)
482
+ } catch (cause) {
483
+ return Response.upstream(c, cause)
484
+ }
485
+ },
486
+ )
487
+ }
488
+
489
+ export declare namespace apiKeys {
490
+ /** Options for creating the API-keys resource. */
491
+ type Options = {
492
+ /** Whether the surface is enabled (a KV state store is configured); disabled routes are hidden and return `404`. */
493
+ enabled?: boolean | undefined
494
+ }
495
+ }
496
+
497
+ /** Projects a persisted record onto the platform key shape (no rate limits, no token). */
498
+ function serializeKey(record: ApiKeys.Record) {
499
+ return {
500
+ createdAt: record.createdAt,
501
+ ...(record.createdBy === undefined ? {} : { createdBy: record.createdBy }),
502
+ environment: record.environment,
503
+ ...(record.expiresAt === undefined ? {} : { expiresAt: record.expiresAt }),
504
+ id: record.id,
505
+ ...(record.name === undefined ? {} : { name: record.name }),
506
+ orgId: record.orgId,
507
+ ...(record.projectId === undefined ? {} : { projectId: record.projectId }),
508
+ scopes: [...record.scopes],
509
+ tokenLast4: record.tokenLast4,
510
+ }
511
+ }
512
+
513
+ /** The caller identity recorded as `createdBy`, or `undefined` for non-minting principals. */
514
+ function mintedBy(c: Context<App.Environment>) {
515
+ const principal = Auth.getPrincipal(c)
516
+ if (principal?.type === 'super_admin') return 'super_admin'
517
+ if (principal?.type === 'session') return principal.id
518
+ return undefined
519
+ }
520
+
521
+ function keyNotFound(c: Context<App.Environment>) {
522
+ return Response.error(c, {
523
+ code: 'api_key_not_found',
524
+ message: 'API key not found',
525
+ status: 404,
526
+ })
527
+ }
528
+
529
+ function notEnabled(c: Context<App.Environment>) {
530
+ return Response.error(c, {
531
+ code: 'api_keys_not_enabled',
532
+ message: 'API keys are not enabled for this Tempo API deployment.',
533
+ status: 404,
534
+ })
535
+ }
536
+
537
+ function sessionRequired(c: Context<App.Environment>) {
538
+ return Response.error(c, {
539
+ code: 'forbidden',
540
+ message: 'Session required',
541
+ status: 403,
542
+ })
543
+ }