tapimo 0.10.2 → 0.12.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 (386) hide show
  1. package/dist/App.d.ts +4896 -2166
  2. package/dist/App.d.ts.map +1 -1
  3. package/dist/App.js +2 -2
  4. package/dist/App.js.map +1 -1
  5. package/dist/Assets.d.ts +15 -0
  6. package/dist/Assets.d.ts.map +1 -1
  7. package/dist/Assets.js +7 -0
  8. package/dist/Assets.js.map +1 -1
  9. package/dist/Webhooks.d.ts +0 -75
  10. package/dist/Webhooks.d.ts.map +1 -1
  11. package/dist/Webhooks.js +1 -143
  12. package/dist/Webhooks.js.map +1 -1
  13. package/dist/admin/App.d.ts +127 -78
  14. package/dist/admin/App.d.ts.map +1 -1
  15. package/dist/admin/apps/earn-vaults.d.ts +115 -1
  16. package/dist/admin/apps/earn-vaults.d.ts.map +1 -1
  17. package/dist/admin/apps/earn-vaults.js +59 -6
  18. package/dist/admin/apps/earn-vaults.js.map +1 -1
  19. package/dist/admin/apps/organizations.d.ts +3 -3
  20. package/dist/admin/apps/organizations.d.ts.map +1 -1
  21. package/dist/admin/apps/organizations.js +4 -2
  22. package/dist/admin/apps/organizations.js.map +1 -1
  23. package/dist/admin/apps/verified-tokens.d.ts +83 -83
  24. package/dist/admin/ui.generated.d.ts +1 -1
  25. package/dist/admin/ui.generated.d.ts.map +1 -1
  26. package/dist/admin/ui.generated.js +151 -151
  27. package/dist/admin/ui.generated.js.map +1 -1
  28. package/dist/apps/data/App.d.ts +5924 -4310
  29. package/dist/apps/data/App.d.ts.map +1 -1
  30. package/dist/apps/data/App.js +61 -9
  31. package/dist/apps/data/App.js.map +1 -1
  32. package/dist/apps/data/ZoneSelection.d.ts +62 -0
  33. package/dist/apps/data/ZoneSelection.d.ts.map +1 -0
  34. package/dist/apps/data/ZoneSelection.js +44 -0
  35. package/dist/apps/data/ZoneSelection.js.map +1 -0
  36. package/dist/apps/data/routes/activities.d.ts +2368 -5
  37. package/dist/apps/data/routes/activities.d.ts.map +1 -1
  38. package/dist/apps/data/routes/activities.js +423 -114
  39. package/dist/apps/data/routes/activities.js.map +1 -1
  40. package/dist/apps/data/routes/addresses.d.ts +131 -0
  41. package/dist/apps/data/routes/addresses.d.ts.map +1 -1
  42. package/dist/apps/data/routes/balances.d.ts +25 -25
  43. package/dist/apps/data/routes/balances.js +1 -1
  44. package/dist/apps/data/routes/balances.js.map +1 -1
  45. package/dist/apps/data/routes/blocks.d.ts +1 -1
  46. package/dist/apps/data/routes/blocks.js +1 -1
  47. package/dist/apps/data/routes/blocks.js.map +1 -1
  48. package/dist/apps/data/routes/earn.d.ts +135 -10
  49. package/dist/apps/data/routes/earn.d.ts.map +1 -1
  50. package/dist/apps/data/routes/earn.js +157 -25
  51. package/dist/apps/data/routes/earn.js.map +1 -1
  52. package/dist/apps/data/routes/exchanges.d.ts +829 -123
  53. package/dist/apps/data/routes/exchanges.d.ts.map +1 -1
  54. package/dist/apps/data/routes/exchanges.js +16 -13
  55. package/dist/apps/data/routes/exchanges.js.map +1 -1
  56. package/dist/apps/data/routes/fee-amm.d.ts +26 -26
  57. package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
  58. package/dist/apps/data/routes/fee-amm.js +9 -11
  59. package/dist/apps/data/routes/fee-amm.js.map +1 -1
  60. package/dist/apps/data/routes/receipts.d.ts +54 -54
  61. package/dist/apps/data/routes/receipts.js +1 -1
  62. package/dist/apps/data/routes/receipts.js.map +1 -1
  63. package/dist/apps/data/routes/rpc.js +24 -10
  64. package/dist/apps/data/routes/rpc.js.map +1 -1
  65. package/dist/apps/data/routes/tokenlist.d.ts +12 -12
  66. package/dist/apps/data/routes/tokenlist.d.ts.map +1 -1
  67. package/dist/apps/data/routes/tokenlist.js +16 -15
  68. package/dist/apps/data/routes/tokenlist.js.map +1 -1
  69. package/dist/apps/data/routes/tokens.d.ts +17 -3
  70. package/dist/apps/data/routes/tokens.d.ts.map +1 -1
  71. package/dist/apps/data/routes/tokens.js +34 -15
  72. package/dist/apps/data/routes/tokens.js.map +1 -1
  73. package/dist/apps/data/routes/transactions.d.ts +1 -1
  74. package/dist/apps/data/routes/transactions.js +1 -1
  75. package/dist/apps/data/routes/transactions.js.map +1 -1
  76. package/dist/apps/data/routes/transfers.d.ts +13 -13
  77. package/dist/apps/data/routes/transfers.d.ts.map +1 -1
  78. package/dist/apps/data/routes/transfers.js +7 -9
  79. package/dist/apps/data/routes/transfers.js.map +1 -1
  80. package/dist/apps/data/routes/valuation.d.ts +21 -21
  81. package/dist/apps/data/routes/verified-tokens.d.ts +5 -5
  82. package/dist/apps/data/routes/webhooks.d.ts +1011 -151
  83. package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
  84. package/dist/apps/data/routes/webhooks.js +126 -739
  85. package/dist/apps/data/routes/webhooks.js.map +1 -1
  86. package/dist/apps/data/routes/zones.d.ts +15 -15
  87. package/dist/apps/funding/App.d.ts +27 -27
  88. package/dist/apps/funding/routes/chains.d.ts.map +1 -1
  89. package/dist/apps/funding/routes/chains.js +5 -4
  90. package/dist/apps/funding/routes/chains.js.map +1 -1
  91. package/dist/apps/funding/routes/deposit-addresses.d.ts +18 -18
  92. package/dist/apps/funding/routes/deposit-addresses.d.ts.map +1 -1
  93. package/dist/apps/funding/routes/deposit-addresses.js +8 -8
  94. package/dist/apps/funding/routes/deposit-addresses.js.map +1 -1
  95. package/dist/apps/funding/routes/providers.d.ts.map +1 -1
  96. package/dist/apps/funding/routes/providers.js +3 -2
  97. package/dist/apps/funding/routes/providers.js.map +1 -1
  98. package/dist/apps/funding/routes/quotes.d.ts.map +1 -1
  99. package/dist/apps/funding/routes/quotes.js +2 -2
  100. package/dist/apps/funding/routes/quotes.js.map +1 -1
  101. package/dist/apps/funding/routes/transfers.d.ts +33 -33
  102. package/dist/apps/management/App.d.ts +1433 -322
  103. package/dist/apps/management/App.d.ts.map +1 -1
  104. package/dist/apps/management/Billing.d.ts.map +1 -1
  105. package/dist/apps/management/Billing.js +19 -6
  106. package/dist/apps/management/Billing.js.map +1 -1
  107. package/dist/apps/management/routes/api-keys.d.ts +154 -94
  108. package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
  109. package/dist/apps/management/routes/api-keys.js +76 -30
  110. package/dist/apps/management/routes/api-keys.js.map +1 -1
  111. package/dist/apps/management/routes/billing.d.ts +103 -30
  112. package/dist/apps/management/routes/billing.d.ts.map +1 -1
  113. package/dist/apps/management/routes/billing.js +91 -32
  114. package/dist/apps/management/routes/billing.js.map +1 -1
  115. package/dist/apps/management/routes/faucet.d.ts +12 -12
  116. package/dist/apps/management/routes/faucet.d.ts.map +1 -1
  117. package/dist/apps/management/routes/faucet.js +23 -12
  118. package/dist/apps/management/routes/faucet.js.map +1 -1
  119. package/dist/apps/management/routes/invitations.d.ts +46 -13
  120. package/dist/apps/management/routes/invitations.d.ts.map +1 -1
  121. package/dist/apps/management/routes/invitations.js +79 -29
  122. package/dist/apps/management/routes/invitations.js.map +1 -1
  123. package/dist/apps/management/routes/invite-links.d.ts +128 -83
  124. package/dist/apps/management/routes/invite-links.d.ts.map +1 -1
  125. package/dist/apps/management/routes/invite-links.js +100 -41
  126. package/dist/apps/management/routes/invite-links.js.map +1 -1
  127. package/dist/apps/management/routes/me.d.ts +5 -5
  128. package/dist/apps/management/routes/me.d.ts.map +1 -1
  129. package/dist/apps/management/routes/me.js +14 -10
  130. package/dist/apps/management/routes/me.js.map +1 -1
  131. package/dist/apps/management/routes/members.d.ts +68 -47
  132. package/dist/apps/management/routes/members.d.ts.map +1 -1
  133. package/dist/apps/management/routes/members.js +37 -18
  134. package/dist/apps/management/routes/members.js.map +1 -1
  135. package/dist/apps/management/routes/orgs.d.ts +48 -8
  136. package/dist/apps/management/routes/orgs.d.ts.map +1 -1
  137. package/dist/apps/management/routes/orgs.js +48 -19
  138. package/dist/apps/management/routes/orgs.js.map +1 -1
  139. package/dist/apps/management/routes/projects.d.ts +130 -68
  140. package/dist/apps/management/routes/projects.d.ts.map +1 -1
  141. package/dist/apps/management/routes/projects.js +72 -21
  142. package/dist/apps/management/routes/projects.js.map +1 -1
  143. package/dist/apps/management/routes/scopes.d.ts.map +1 -1
  144. package/dist/apps/management/routes/scopes.js +8 -5
  145. package/dist/apps/management/routes/scopes.js.map +1 -1
  146. package/dist/apps/management/routes/usage.d.ts +38 -38
  147. package/dist/apps/management/routes/usage.d.ts.map +1 -1
  148. package/dist/apps/management/routes/usage.js +41 -31
  149. package/dist/apps/management/routes/usage.js.map +1 -1
  150. package/dist/apps/management/routes/verified-token-requests.d.ts +34 -6
  151. package/dist/apps/management/routes/verified-token-requests.d.ts.map +1 -1
  152. package/dist/apps/management/routes/verified-token-requests.js +36 -17
  153. package/dist/apps/management/routes/verified-token-requests.js.map +1 -1
  154. package/dist/apps/management/routes/webhooks.d.ts +1186 -197
  155. package/dist/apps/management/routes/webhooks.d.ts.map +1 -1
  156. package/dist/apps/management/routes/webhooks.js +106 -38
  157. package/dist/apps/management/routes/webhooks.js.map +1 -1
  158. package/dist/apps/mpp/internal/Adapter.d.ts +1 -1
  159. package/dist/apps/mpp/internal/Adapter.d.ts.map +1 -1
  160. package/dist/apps/mpp/internal/Adapter.js +12 -0
  161. package/dist/apps/mpp/internal/Adapter.js.map +1 -1
  162. package/dist/db/Db.d.ts +2 -0
  163. package/dist/db/Db.d.ts.map +1 -1
  164. package/dist/db/Db.js +61 -0
  165. package/dist/db/Db.js.map +1 -1
  166. package/dist/db/Schema.d.ts +30 -2
  167. package/dist/db/Schema.d.ts.map +1 -1
  168. package/dist/db/Schema.js +28 -3
  169. package/dist/db/Schema.js.map +1 -1
  170. package/dist/db/tables/earnVaults.d.ts +5 -1
  171. package/dist/db/tables/earnVaults.d.ts.map +1 -1
  172. package/dist/db/tables/earnVaults.js +5 -0
  173. package/dist/db/tables/earnVaults.js.map +1 -1
  174. package/dist/db/tables/webhookDeliveries.d.ts.map +1 -1
  175. package/dist/db/tables/webhookDeliveries.js +10 -0
  176. package/dist/db/tables/webhookDeliveries.js.map +1 -1
  177. package/dist/db/tables/webhookQueueCompletions.d.ts +15 -0
  178. package/dist/db/tables/webhookQueueCompletions.d.ts.map +1 -0
  179. package/dist/db/tables/webhookQueueCompletions.js +32 -0
  180. package/dist/db/tables/webhookQueueCompletions.js.map +1 -0
  181. package/dist/db/tables/webhookQueueEvents.d.ts +16 -20
  182. package/dist/db/tables/webhookQueueEvents.d.ts.map +1 -1
  183. package/dist/db/tables/webhookQueueEvents.js +68 -43
  184. package/dist/db/tables/webhookQueueEvents.js.map +1 -1
  185. package/dist/db/tables/webhookSubscriptions.d.ts +47 -72
  186. package/dist/db/tables/webhookSubscriptions.d.ts.map +1 -1
  187. package/dist/db/tables/webhookSubscriptions.js +92 -105
  188. package/dist/db/tables/webhookSubscriptions.js.map +1 -1
  189. package/dist/internal/Auth.d.ts +8 -1
  190. package/dist/internal/Auth.d.ts.map +1 -1
  191. package/dist/internal/Auth.js +13 -3
  192. package/dist/internal/Auth.js.map +1 -1
  193. package/dist/internal/Cache.d.ts.map +1 -1
  194. package/dist/internal/Cache.js +11 -7
  195. package/dist/internal/Cache.js.map +1 -1
  196. package/dist/internal/EarnVaults.d.ts +41 -2
  197. package/dist/internal/EarnVaults.d.ts.map +1 -1
  198. package/dist/internal/EarnVaults.js +167 -0
  199. package/dist/internal/EarnVaults.js.map +1 -1
  200. package/dist/internal/MetricSink.d.ts +35 -125
  201. package/dist/internal/MetricSink.d.ts.map +1 -1
  202. package/dist/internal/MetricSink.js +50 -121
  203. package/dist/internal/MetricSink.js.map +1 -1
  204. package/dist/internal/OpenApi.d.ts +26 -22
  205. package/dist/internal/OpenApi.d.ts.map +1 -1
  206. package/dist/internal/OpenApi.js +128 -39
  207. package/dist/internal/OpenApi.js.map +1 -1
  208. package/dist/internal/Response.d.ts +13 -8
  209. package/dist/internal/Response.d.ts.map +1 -1
  210. package/dist/internal/Response.js +16 -5
  211. package/dist/internal/Response.js.map +1 -1
  212. package/dist/internal/Schema.d.ts +8 -8
  213. package/dist/internal/Schema.d.ts.map +1 -1
  214. package/dist/internal/Schema.js +10 -9
  215. package/dist/internal/Schema.js.map +1 -1
  216. package/dist/internal/Store.d.ts +15 -6
  217. package/dist/internal/Store.d.ts.map +1 -1
  218. package/dist/internal/Store.js +45 -15
  219. package/dist/internal/Store.js.map +1 -1
  220. package/dist/internal/Tidx.d.ts +2 -0
  221. package/dist/internal/Tidx.d.ts.map +1 -1
  222. package/dist/internal/Tidx.js +16 -4
  223. package/dist/internal/Tidx.js.map +1 -1
  224. package/dist/internal/WebhookTransfer.d.ts +1 -55
  225. package/dist/internal/WebhookTransfer.d.ts.map +1 -1
  226. package/dist/internal/WebhookTransfer.js +1 -239
  227. package/dist/internal/WebhookTransfer.js.map +1 -1
  228. package/dist/internal/Webhooks.d.ts +112 -56
  229. package/dist/internal/Webhooks.d.ts.map +1 -1
  230. package/dist/internal/Webhooks.js +124 -93
  231. package/dist/internal/Webhooks.js.map +1 -1
  232. package/dist/internal/funding/Deposit.d.ts +2 -2
  233. package/dist/internal/funding/Deposit.d.ts.map +1 -1
  234. package/dist/internal/funding/Deposit.js +9 -8
  235. package/dist/internal/funding/Deposit.js.map +1 -1
  236. package/dist/internal/funding/DepositAddress.d.ts +4 -4
  237. package/dist/internal/funding/DepositAddress.d.ts.map +1 -1
  238. package/dist/internal/funding/DepositAddress.js +9 -8
  239. package/dist/internal/funding/DepositAddress.js.map +1 -1
  240. package/dist/internal/funding/DepositWebhook.d.ts +25 -0
  241. package/dist/internal/funding/DepositWebhook.d.ts.map +1 -0
  242. package/dist/internal/funding/DepositWebhook.js +74 -0
  243. package/dist/internal/funding/DepositWebhook.js.map +1 -0
  244. package/dist/internal/funding/Provider.d.ts.map +1 -1
  245. package/dist/internal/funding/Provider.js +13 -12
  246. package/dist/internal/funding/Provider.js.map +1 -1
  247. package/dist/internal/funding/Reconciliation.d.ts +6 -0
  248. package/dist/internal/funding/Reconciliation.d.ts.map +1 -1
  249. package/dist/internal/funding/Reconciliation.js +42 -10
  250. package/dist/internal/funding/Reconciliation.js.map +1 -1
  251. package/dist/internal/funding/index.d.ts +1 -0
  252. package/dist/internal/funding/index.d.ts.map +1 -1
  253. package/dist/internal/funding/index.js +1 -0
  254. package/dist/internal/funding/index.js.map +1 -1
  255. package/dist/internal/funding/providers/stargate.d.ts +19 -0
  256. package/dist/internal/funding/providers/stargate.d.ts.map +1 -0
  257. package/dist/internal/funding/providers/stargate.js +143 -0
  258. package/dist/internal/funding/providers/stargate.js.map +1 -0
  259. package/dist/internal/webhookDestinations/slack.d.ts.map +1 -1
  260. package/dist/internal/webhookDestinations/slack.js +16 -0
  261. package/dist/internal/webhookDestinations/slack.js.map +1 -1
  262. package/dist/providers/index.d.ts +7 -0
  263. package/dist/providers/index.d.ts.map +1 -1
  264. package/dist/providers/index.js +3 -0
  265. package/dist/providers/index.js.map +1 -1
  266. package/package.json +2 -2
  267. package/src/App.test.ts +48 -0
  268. package/src/App.ts +7 -2
  269. package/src/Assets.test.ts +18 -0
  270. package/src/Assets.ts +22 -0
  271. package/src/Client.test-d.ts +287 -17
  272. package/src/Webhooks.ts +1 -220
  273. package/src/admin/apps/earn-vaults.test.ts +143 -0
  274. package/src/admin/apps/earn-vaults.ts +83 -6
  275. package/src/admin/apps/organizations.ts +6 -2
  276. package/src/admin/ui/src/routes/api-keys.tsx +36 -0
  277. package/src/admin/ui.generated.ts +151 -189
  278. package/src/apps/data/App.test.ts +31 -0
  279. package/src/apps/data/App.ts +64 -10
  280. package/src/apps/data/ZoneSelection.test.ts +196 -0
  281. package/src/apps/data/ZoneSelection.ts +108 -0
  282. package/src/apps/data/routes/activities.test.ts +435 -12
  283. package/src/apps/data/routes/activities.ts +562 -125
  284. package/src/apps/data/routes/balances.ts +1 -1
  285. package/src/apps/data/routes/blocks.ts +1 -1
  286. package/src/apps/data/routes/earn.test.ts +183 -23
  287. package/src/apps/data/routes/earn.ts +225 -29
  288. package/src/apps/data/routes/earn.zone-access.test.ts +46 -0
  289. package/src/apps/data/routes/exchanges.test.ts +31 -1
  290. package/src/apps/data/routes/exchanges.ts +19 -15
  291. package/src/apps/data/routes/fee-amm.ts +18 -11
  292. package/src/apps/data/routes/receipts.ts +1 -1
  293. package/src/apps/data/routes/rpc.test.ts +75 -0
  294. package/src/apps/data/routes/rpc.ts +23 -9
  295. package/src/apps/data/routes/tokenlist.ts +21 -18
  296. package/src/apps/data/routes/tokens.test.ts +29 -0
  297. package/src/apps/data/routes/tokens.ts +38 -15
  298. package/src/apps/data/routes/transactions.ts +1 -1
  299. package/src/apps/data/routes/transfers.test.ts +3 -3
  300. package/src/apps/data/routes/transfers.ts +12 -9
  301. package/src/apps/data/routes/webhooks.test.ts +179 -1497
  302. package/src/apps/data/routes/webhooks.ts +156 -976
  303. package/src/apps/data/routes/zones.test.ts +19 -13
  304. package/src/apps/funding/routes/chains.test.ts +211 -7
  305. package/src/apps/funding/routes/chains.ts +19 -12
  306. package/src/apps/funding/routes/deposit-addresses.test.ts +394 -0
  307. package/src/apps/funding/routes/deposit-addresses.ts +84 -72
  308. package/src/apps/funding/routes/providers.ts +9 -5
  309. package/src/apps/funding/routes/quotes.test.ts +46 -0
  310. package/src/apps/funding/routes/quotes.ts +8 -5
  311. package/src/apps/funding/routes/transfers.test.ts +35 -32
  312. package/src/apps/management/Billing.test.ts +26 -0
  313. package/src/apps/management/Billing.ts +24 -7
  314. package/src/apps/management/routes/api-keys.test.ts +178 -0
  315. package/src/apps/management/routes/api-keys.ts +203 -144
  316. package/src/apps/management/routes/billing.test.ts +209 -0
  317. package/src/apps/management/routes/billing.ts +254 -177
  318. package/src/apps/management/routes/faucet.test.ts +39 -0
  319. package/src/apps/management/routes/faucet.ts +75 -41
  320. package/src/apps/management/routes/invitations.test.ts +216 -0
  321. package/src/apps/management/routes/invitations.ts +186 -109
  322. package/src/apps/management/routes/invite-links.test.ts +263 -1
  323. package/src/apps/management/routes/invite-links.ts +295 -214
  324. package/src/apps/management/routes/me.test.ts +49 -0
  325. package/src/apps/management/routes/me.ts +42 -32
  326. package/src/apps/management/routes/members.test.ts +124 -1
  327. package/src/apps/management/routes/members.ts +81 -51
  328. package/src/apps/management/routes/orgs.test.ts +176 -0
  329. package/src/apps/management/routes/orgs.ts +101 -59
  330. package/src/apps/management/routes/projects.test.ts +183 -0
  331. package/src/apps/management/routes/projects.ts +124 -60
  332. package/src/apps/management/routes/scopes.test.ts +44 -0
  333. package/src/apps/management/routes/scopes.ts +37 -28
  334. package/src/apps/management/routes/usage.test.ts +92 -0
  335. package/src/apps/management/routes/usage.ts +186 -151
  336. package/src/apps/management/routes/verified-token-requests.test.ts +114 -0
  337. package/src/apps/management/routes/verified-token-requests.ts +166 -133
  338. package/src/apps/management/routes/webhooks.test.ts +313 -1
  339. package/src/apps/management/routes/webhooks.ts +220 -71
  340. package/src/apps/mpp/internal/Adapter.ts +13 -1
  341. package/src/db/Db.test.ts +42 -5
  342. package/src/db/Db.ts +85 -0
  343. package/src/db/Schema.ts +41 -3
  344. package/src/db/tables/earnVaults.test.ts +22 -0
  345. package/src/db/tables/earnVaults.ts +11 -1
  346. package/src/db/tables/organizations.test.ts +5 -2
  347. package/src/db/tables/webhookDeliveries.ts +13 -0
  348. package/src/db/tables/webhookQueueCompletions.ts +55 -0
  349. package/src/db/tables/webhookQueueEvents.ts +97 -57
  350. package/src/db/tables/webhookSubscriptions.ts +134 -144
  351. package/src/internal/Auth.ts +23 -5
  352. package/src/internal/Cache.ts +14 -7
  353. package/src/internal/EarnVaults.capabilities.test.ts +33 -0
  354. package/src/internal/EarnVaults.test.ts +79 -0
  355. package/src/internal/EarnVaults.ts +277 -0
  356. package/src/internal/MetricSink.test.ts +41 -373
  357. package/src/internal/MetricSink.ts +92 -273
  358. package/src/internal/OpenApi.ts +165 -49
  359. package/src/internal/Response.test.ts +95 -0
  360. package/src/internal/Response.ts +40 -2
  361. package/src/internal/Schema.test.ts +34 -0
  362. package/src/internal/Schema.ts +20 -9
  363. package/src/internal/Store.test.ts +186 -0
  364. package/src/internal/Store.ts +57 -17
  365. package/src/internal/Tidx.test.ts +19 -0
  366. package/src/internal/Tidx.ts +16 -4
  367. package/src/internal/WebhookTransfer.ts +1 -351
  368. package/src/internal/Webhooks.test.ts +222 -145
  369. package/src/internal/Webhooks.ts +234 -135
  370. package/src/internal/funding/Deposit.ts +71 -64
  371. package/src/internal/funding/DepositAddress.ts +50 -43
  372. package/src/internal/funding/DepositWebhook.test.ts +131 -0
  373. package/src/internal/funding/DepositWebhook.ts +101 -0
  374. package/src/internal/funding/Provider.ts +164 -142
  375. package/src/internal/funding/Reconciliation.test.ts +14 -0
  376. package/src/internal/funding/Reconciliation.ts +161 -86
  377. package/src/internal/funding/index.test.ts +1 -0
  378. package/src/internal/funding/index.ts +1 -0
  379. package/src/internal/funding/providers/index.test.ts +185 -0
  380. package/src/internal/funding/providers/stargate.ts +184 -0
  381. package/src/internal/webhookDestinations/slack.ts +15 -0
  382. package/src/providers/index.test.ts +1 -0
  383. package/src/providers/index.ts +9 -0
  384. package/src/Webhooks.bench.ts +0 -714
  385. package/src/Webhooks.memory.bench.ts +0 -250
  386. package/src/Webhooks.test.ts +0 -146
@@ -55,217 +55,244 @@ export namespace schema {
55
55
  .check(z.describe('Role granted by the link.'), z.meta({ examples: ['member'] }))
56
56
 
57
57
  /** Management representation, including the recopyable bearer id. */
58
- export const InviteLink = Schema.describe(
59
- z.object({
60
- allowedEmailDomains,
61
- createdAt: z
62
- .string()
63
- .check(
64
- z.describe('When the link was created (ISO 8601).'),
65
- z.meta({ examples: ['2026-01-01T00:00:00.000Z'] }),
66
- ),
67
- createdBy: z
68
- .string()
69
- .check(
70
- z.describe('User id that created the link.'),
71
- z.meta({ examples: ['usr_1a2b3c4d5e6f7g8h9j0k1m2n'] }),
72
- ),
73
- enabled: z
74
- .boolean()
75
- .check(z.describe('Whether the link is enabled.'), z.meta({ examples: [true] })),
76
- expiresAt: nullableExpiry,
77
- id: z
78
- .string()
79
- .check(
80
- z.describe('Opaque invite-link resource id (`iln_…`).'),
81
- z.meta({ examples: ['iln_1a2b3c4d5e6f7g8h9j0k1m2n'] }),
82
- ),
83
- lastUsedAt: z
84
- .nullable(z.string())
85
- .check(
86
- z.describe('When the link last created a membership, or null.'),
87
- z.meta({ examples: ['2026-01-02T00:00:00.000Z', null] }),
88
- ),
89
- maxUses: nullableUses,
90
- name: z
91
- .string()
92
- .check(z.describe('Human-readable link name.'), z.meta({ examples: ['Community'] })),
93
- orgId: z
94
- .string()
95
- .check(
96
- z.describe('Organization id (`org_…`) the link joins.'),
97
- z.meta({ examples: ['org_1a2b3c4d5e6f7g8h9j0k1m2n'] }),
98
- ),
99
- role,
100
- status: z
101
- .enum(['active', 'deleted', 'disabled', 'exhausted', 'expired'])
102
- .check(z.describe('Current link availability.'), z.meta({ examples: ['active'] })),
103
- token: z
104
- .string()
105
- .check(
106
- z.describe('Opaque bearer token embedded in the recipient URL (`lnk_…`).'),
107
- z.meta({ examples: ['lnk_1a2b3c4d5e6f7g8h9j0k1m2n'] }),
108
- ),
109
- updatedAt: z
110
- .string()
111
- .check(
112
- z.describe('When the link was last changed (ISO 8601).'),
113
- z.meta({ examples: ['2026-01-01T00:00:00.000Z'] }),
114
- ),
115
- useCount: z
116
- .number()
117
- .check(
118
- z.int(),
119
- z.nonnegative(),
120
- z.describe('Memberships created through the link.'),
121
- z.meta({ examples: [3] }),
122
- ),
123
- }),
124
- 'A reusable organization invite link.',
58
+ export const InviteLink = OpenApi.component(
59
+ Schema.describe(
60
+ z.object({
61
+ allowedEmailDomains,
62
+ createdAt: z.iso
63
+ .datetime()
64
+ .check(
65
+ z.describe('When the link was created (ISO 8601).'),
66
+ z.meta({ examples: ['2026-01-01T00:00:00.000Z'] }),
67
+ ),
68
+ createdBy: z
69
+ .string()
70
+ .check(
71
+ z.describe('User id that created the link.'),
72
+ z.meta({ examples: ['usr_1a2b3c4d5e6f7g8h9j0k1m2n'] }),
73
+ ),
74
+ enabled: z
75
+ .boolean()
76
+ .check(z.describe('Whether the link is enabled.'), z.meta({ examples: [true] })),
77
+ expiresAt: nullableExpiry,
78
+ id: z
79
+ .string()
80
+ .check(
81
+ z.describe('Opaque invite-link resource id (`iln_…`).'),
82
+ z.meta({ examples: ['iln_1a2b3c4d5e6f7g8h9j0k1m2n'] }),
83
+ ),
84
+ lastUsedAt: z
85
+ .nullable(z.iso.datetime())
86
+ .check(
87
+ z.describe('When the link last created a membership, or null.'),
88
+ z.meta({ examples: ['2026-01-02T00:00:00.000Z', null] }),
89
+ ),
90
+ maxUses: nullableUses,
91
+ name: z
92
+ .string()
93
+ .check(z.describe('Human-readable link name.'), z.meta({ examples: ['Community'] })),
94
+ orgId: z
95
+ .string()
96
+ .check(
97
+ z.describe('Organization id (`org_…`) the link joins.'),
98
+ z.meta({ examples: ['org_1a2b3c4d5e6f7g8h9j0k1m2n'] }),
99
+ ),
100
+ role,
101
+ status: z
102
+ .enum(['active', 'deleted', 'disabled', 'exhausted', 'expired'])
103
+ .check(z.describe('Current link availability.'), z.meta({ examples: ['active'] })),
104
+ token: z
105
+ .string()
106
+ .check(
107
+ z.describe('Opaque bearer token embedded in the recipient URL (`lnk_…`).'),
108
+ z.meta({ examples: ['lnk_1a2b3c4d5e6f7g8h9j0k1m2n'] }),
109
+ ),
110
+ updatedAt: z.iso
111
+ .datetime()
112
+ .check(
113
+ z.describe('When the link was last changed (ISO 8601).'),
114
+ z.meta({ examples: ['2026-01-01T00:00:00.000Z'] }),
115
+ ),
116
+ useCount: z
117
+ .number()
118
+ .check(
119
+ z.int(),
120
+ z.nonnegative(),
121
+ z.describe('Memberships created through the link.'),
122
+ z.meta({ examples: [3] }),
123
+ ),
124
+ }),
125
+ 'A reusable organization invite link.',
126
+ ),
127
+ 'InviteLink',
125
128
  )
126
129
 
127
130
  /** Redemption audit representation (never includes a bearer URL). */
128
- export const Redemption = Schema.describe(
129
- z.object({
130
- createdAt: z
131
- .string()
132
- .check(
133
- z.describe('When the membership was created (ISO 8601).'),
134
- z.meta({ examples: ['2026-01-02T00:00:00.000Z'] }),
135
- ),
136
- email: z
137
- .string()
138
- .check(
139
- z.describe('Verified email used for redemption.'),
140
- z.meta({ examples: ['dev@example.com'] }),
141
- ),
142
- id: z
143
- .string()
144
- .check(
145
- z.describe('Opaque redemption id (`ilr_…`).'),
146
- z.meta({ examples: ['ilr_1a2b3c4d5e6f7g8h9j0k1m2n'] }),
147
- ),
148
- inviteLinkId: z
149
- .string()
150
- .check(
151
- z.describe('Invite-link resource id used for redemption.'),
152
- z.meta({ examples: ['iln_1a2b3c4d5e6f7g8h9j0k1m2n'] }),
153
- ),
154
- inviteLinkName: z
155
- .string()
156
- .check(z.describe('Link name at redemption time.'), z.meta({ examples: ['Community'] })),
157
- orgId: z
158
- .string()
159
- .check(
160
- z.describe('Organization id joined through the link.'),
161
- z.meta({ examples: ['org_1a2b3c4d5e6f7g8h9j0k1m2n'] }),
162
- ),
163
- userId: z
164
- .string()
165
- .check(
166
- z.describe('User id that redeemed the link.'),
167
- z.meta({ examples: ['usr_1a2b3c4d5e6f7g8h9j0k1m2n'] }),
168
- ),
169
- }),
170
- 'An invite-link redemption audit record.',
171
- )
172
-
173
- /** Create body. */
174
- export const CreateBody = z
175
- .object({
176
- allowedEmailDomains: z.optional(allowedEmailDomains),
177
- expiresAt: z.optional(nullableExpiry),
178
- maxUses: z.optional(nullableUses),
179
- name: z.optional(
180
- z
131
+ export const Redemption = OpenApi.component(
132
+ Schema.describe(
133
+ z.object({
134
+ createdAt: z.iso
135
+ .datetime()
136
+ .check(
137
+ z.describe('When the membership was created (ISO 8601).'),
138
+ z.meta({ examples: ['2026-01-02T00:00:00.000Z'] }),
139
+ ),
140
+ email: z
141
+ .email()
142
+ .check(
143
+ z.describe('Verified email used for redemption.'),
144
+ z.meta({ examples: ['dev@example.com'] }),
145
+ ),
146
+ id: z
181
147
  .string()
182
148
  .check(
183
- z.trim(),
184
- z.minLength(1),
185
- z.maxLength(100),
186
- z.describe('Human-readable link name.'),
187
- z.meta({ examples: ['Community'] }),
149
+ z.describe('Opaque redemption id (`ilr_…`).'),
150
+ z.meta({ examples: ['ilr_1a2b3c4d5e6f7g8h9j0k1m2n'] }),
188
151
  ),
189
- ),
190
- role: z
191
- ._default(role, 'member')
192
- .check(z.describe('Role granted by the link.'), z.meta({ examples: ['member'] })),
193
- })
194
- .check(z.describe('Fields for creating an invite link.'))
152
+ inviteLinkId: z
153
+ .string()
154
+ .check(
155
+ z.describe('Invite-link resource id used for redemption.'),
156
+ z.meta({ examples: ['iln_1a2b3c4d5e6f7g8h9j0k1m2n'] }),
157
+ ),
158
+ inviteLinkName: z
159
+ .string()
160
+ .check(z.describe('Link name at redemption time.'), z.meta({ examples: ['Community'] })),
161
+ orgId: z
162
+ .string()
163
+ .check(
164
+ z.describe('Organization id joined through the link.'),
165
+ z.meta({ examples: ['org_1a2b3c4d5e6f7g8h9j0k1m2n'] }),
166
+ ),
167
+ userId: z
168
+ .string()
169
+ .check(
170
+ z.describe('User id that redeemed the link.'),
171
+ z.meta({ examples: ['usr_1a2b3c4d5e6f7g8h9j0k1m2n'] }),
172
+ ),
173
+ }),
174
+ 'An invite-link redemption audit record.',
175
+ ),
176
+ 'InviteLinkRedemption',
177
+ )
178
+
179
+ /** Create body. */
180
+ export const CreateInviteLinkRequest = OpenApi.component(
181
+ z
182
+ .object({
183
+ allowedEmailDomains: z.optional(allowedEmailDomains),
184
+ expiresAt: z.optional(nullableExpiry),
185
+ maxUses: z.optional(nullableUses),
186
+ name: z.optional(
187
+ z
188
+ .string()
189
+ .check(
190
+ z.trim(),
191
+ z.minLength(1),
192
+ z.maxLength(100),
193
+ z.describe('Human-readable link name.'),
194
+ z.meta({ examples: ['Community'] }),
195
+ ),
196
+ ),
197
+ role: z
198
+ ._default(role, 'member')
199
+ .check(z.describe('Role granted by the link.'), z.meta({ examples: ['member'] })),
200
+ })
201
+ .check(z.describe('Fields for creating an invite link.')),
202
+ 'CreateInviteLinkRequest',
203
+ )
195
204
 
196
205
  /** Update body. */
197
- export const UpdateBody = z
198
- .object({
199
- enabled: z
200
- .boolean()
201
- .check(z.describe('Whether the link is enabled.'), z.meta({ examples: [false] })),
202
- })
203
- .check(z.describe('Fields for updating an invite link.'))
206
+ export const UpdateInviteLinkRequest = OpenApi.component(
207
+ z
208
+ .object({
209
+ enabled: z
210
+ .boolean()
211
+ .check(z.describe('Whether the link is enabled.'), z.meta({ examples: [false] })),
212
+ })
213
+ .check(z.describe('Fields for updating an invite link.')),
214
+ 'UpdateInviteLinkRequest',
215
+ )
204
216
 
205
217
  /** Bearer-token body for recipient operations. */
206
- export const TokenBody = z
207
- .object({
208
- token: z
209
- .string()
210
- .check(
211
- z.describe('Opaque invite-link bearer token.'),
212
- z.meta({ examples: ['lnk_1a2b3c4d5e6f7g8h9j0k1m2n'] }),
213
- ),
214
- })
215
- .check(z.describe('An invite-link bearer token.'))
218
+ export const InviteLinkTokenRequest = OpenApi.component(
219
+ z
220
+ .object({
221
+ token: z
222
+ .string()
223
+ .check(
224
+ z.describe('Opaque invite-link bearer token.'),
225
+ z.meta({ examples: ['lnk_1a2b3c4d5e6f7g8h9j0k1m2n'] }),
226
+ ),
227
+ })
228
+ .check(z.describe('An invite-link bearer token.')),
229
+ 'InviteLinkTokenRequest',
230
+ )
216
231
 
217
232
  /** Public active-link summary. */
218
- export const ResolveResponse = Schema.describe(
219
- z.object({
220
- orgName: z
221
- .string()
222
- .check(
223
- z.describe('Human-readable name of the organization.'),
224
- z.meta({ examples: ['Acme, Inc.'] }),
225
- ),
226
- role,
227
- }),
228
- 'A public summary of an active invite link.',
233
+ export const ResolveResponse = OpenApi.component(
234
+ Schema.describe(
235
+ z.object({
236
+ orgName: z
237
+ .string()
238
+ .check(
239
+ z.describe('Human-readable name of the organization.'),
240
+ z.meta({ examples: ['Acme, Inc.'] }),
241
+ ),
242
+ role,
243
+ }),
244
+ 'A public summary of an active invite link.',
245
+ ),
246
+ 'ResolveInviteLinkResponse',
229
247
  )
230
248
 
231
249
  /** Successful acceptance. */
232
- export const AcceptResponse = Schema.describe(
233
- z.object({
234
- orgId: z
235
- .string()
236
- .check(
237
- z.describe('Organization id joined through the link.'),
238
- z.meta({ examples: ['org_1a2b3c4d5e6f7g8h9j0k1m2n'] }),
239
- ),
240
- role,
241
- userId: z
242
- .string()
243
- .check(
244
- z.describe('Member user id.'),
245
- z.meta({ examples: ['usr_1a2b3c4d5e6f7g8h9j0k1m2n'] }),
246
- ),
247
- }),
248
- 'The membership granted through an invite link.',
250
+ export const AcceptResponse = OpenApi.component(
251
+ Schema.describe(
252
+ z.object({
253
+ orgId: z
254
+ .string()
255
+ .check(
256
+ z.describe('Organization id joined through the link.'),
257
+ z.meta({ examples: ['org_1a2b3c4d5e6f7g8h9j0k1m2n'] }),
258
+ ),
259
+ role,
260
+ userId: z
261
+ .string()
262
+ .check(
263
+ z.describe('Member user id.'),
264
+ z.meta({ examples: ['usr_1a2b3c4d5e6f7g8h9j0k1m2n'] }),
265
+ ),
266
+ }),
267
+ 'The membership granted through an invite link.',
268
+ ),
269
+ 'AcceptInviteLinkResponse',
249
270
  )
250
271
 
251
272
  /** Link collection response. */
252
- export const ListResponse = Schema.describe(
253
- z.object({
254
- data: z
255
- .array(InviteLink)
256
- .check(z.describe('Invite links, newest first.'), z.meta({ examples: [[]] })),
257
- }),
258
- 'A non-paginated list of invite links.',
273
+ export const ListResponse = OpenApi.component(
274
+ Schema.describe(
275
+ z.object({
276
+ data: z
277
+ .array(InviteLink)
278
+ .check(z.describe('Invite links, newest first.'), z.meta({ examples: [[]] })),
279
+ }),
280
+ 'A non-paginated list of invite links.',
281
+ ),
282
+ 'InviteLinkList',
259
283
  )
260
284
 
261
285
  /** Redemption collection response. */
262
- export const RedemptionsResponse = Schema.describe(
263
- z.object({
264
- data: z
265
- .array(Redemption)
266
- .check(z.describe('Redemptions, newest first.'), z.meta({ examples: [[]] })),
267
- }),
268
- 'A non-paginated list of invite-link redemptions.',
286
+ export const RedemptionsResponse = OpenApi.component(
287
+ Schema.describe(
288
+ z.object({
289
+ data: z
290
+ .array(Redemption)
291
+ .check(z.describe('Redemptions, newest first.'), z.meta({ examples: [[]] })),
292
+ }),
293
+ 'A non-paginated list of invite-link redemptions.',
294
+ ),
295
+ 'InviteLinkRedemptionList',
269
296
  )
270
297
 
271
298
  /** Path parameters addressing an organization's invite links. */
@@ -299,19 +326,20 @@ export namespace schema {
299
326
  .check(z.describe('Path parameters for one organization invite link.'))
300
327
 
301
328
  /** Delete confirmation. */
302
- export const DeleteResponse = z
303
- .object({
304
- id: z
305
- .string()
306
- .check(
307
- z.describe('Deleted invite-link resource id.'),
308
- z.meta({ examples: ['iln_1a2b3c4d5e6f7g8h9j0k1m2n'] }),
309
- ),
310
- })
311
- .check(z.describe('Confirmation that an invite link was deleted.'))
329
+ export const DeleteResponse = OpenApi.component(
330
+ z
331
+ .object({
332
+ id: z
333
+ .string()
334
+ .check(
335
+ z.describe('Deleted invite-link resource id.'),
336
+ z.meta({ examples: ['iln_1a2b3c4d5e6f7g8h9j0k1m2n'] }),
337
+ ),
338
+ })
339
+ .check(z.describe('Confirmation that an invite link was deleted.')),
340
+ 'DeleteInviteLinkResponse',
341
+ )
312
342
  }
313
-
314
- const errors = { 404: 'No accessible invite link was found.' } as const
315
343
  const bodyValidation = {
316
344
  code: 'body_invalid',
317
345
  message: 'Check the request body and try again.',
@@ -329,11 +357,20 @@ export function inviteLinks() {
329
357
  Auth.policy({ session: true }),
330
358
  Auth.ensureOrg({ role: 'admin' }),
331
359
  OpenApi.validate('param', schema.Params, paramValidation),
332
- OpenApi.validate('json', schema.CreateBody, bodyValidation),
360
+ OpenApi.validate('json', schema.CreateInviteLinkRequest, bodyValidation),
333
361
  OpenApi.describeRoute({
334
362
  operationId: 'createInviteLink',
335
363
  responses: OpenApi.responses({
336
- errors,
364
+ errors: {
365
+ 400: {
366
+ codes: ['body_invalid', 'param_invalid'],
367
+ description: 'Malformed API key, invalid path, or invalid body.',
368
+ },
369
+ 404: {
370
+ codes: ['organization_not_found'],
371
+ description: 'No accessible organization was found for this id.',
372
+ },
373
+ },
337
374
  success: { description: 'Created link.', schema: schema.InviteLink },
338
375
  }),
339
376
  summary: 'Create invite link',
@@ -342,6 +379,8 @@ export function inviteLinks() {
342
379
  async (c) => {
343
380
  if (Auth.narrowAccess) return Auth.superAdminAccessError(c)
344
381
  if (Auth.narrowScope) return Auth.ensureOrgError(c)
382
+ if (Auth.narrowOrgRole) return Auth.ensureOrgRoleError(c)
383
+ if (OpenApi.narrowValidation) return OpenApi.validationError(c, paramValidation)
345
384
  if (OpenApi.narrowValidation) return OpenApi.validationError(c, bodyValidation)
346
385
  const body = c.req.valid('json')
347
386
  try {
@@ -371,7 +410,13 @@ export function inviteLinks() {
371
410
  OpenApi.describeRoute({
372
411
  operationId: 'listInviteLinks',
373
412
  responses: OpenApi.responses({
374
- errors,
413
+ errors: {
414
+ 400: { codes: ['param_invalid'], description: 'Malformed API key or invalid path.' },
415
+ 404: {
416
+ codes: ['organization_not_found'],
417
+ description: 'No accessible organization was found for this id.',
418
+ },
419
+ },
375
420
  success: { description: 'Invite links.', schema: schema.ListResponse },
376
421
  }),
377
422
  summary: 'List invite links',
@@ -380,6 +425,7 @@ export function inviteLinks() {
380
425
  async (c) => {
381
426
  if (Auth.narrowAccess) return Auth.superAdminAccessError(c)
382
427
  if (Auth.narrowScope) return Auth.ensureOrgError(c)
428
+ if (Auth.narrowOrgRole) return Auth.ensureOrgRoleError(c)
383
429
  if (OpenApi.narrowValidation) return OpenApi.validationError(c, paramValidation)
384
430
  try {
385
431
  return c.json(
@@ -398,11 +444,20 @@ export function inviteLinks() {
398
444
  Auth.policy({ session: true }),
399
445
  Auth.ensureOrg({ role: 'admin' }),
400
446
  OpenApi.validate('param', schema.LinkParams, paramValidation),
401
- OpenApi.validate('json', schema.UpdateBody, bodyValidation),
447
+ OpenApi.validate('json', schema.UpdateInviteLinkRequest, bodyValidation),
402
448
  OpenApi.describeRoute({
403
449
  operationId: 'updateInviteLink',
404
450
  responses: OpenApi.responses({
405
- errors,
451
+ errors: {
452
+ 400: {
453
+ codes: ['body_invalid', 'param_invalid'],
454
+ description: 'Malformed API key, invalid path, or invalid body.',
455
+ },
456
+ 404: {
457
+ codes: ['invite_link_not_found', 'organization_not_found'],
458
+ description: 'No accessible organization or invite link was found.',
459
+ },
460
+ },
406
461
  success: { description: 'Updated link.', schema: schema.InviteLink },
407
462
  }),
408
463
  summary: 'Update invite link',
@@ -411,6 +466,8 @@ export function inviteLinks() {
411
466
  async (c) => {
412
467
  if (Auth.narrowAccess) return Auth.superAdminAccessError(c)
413
468
  if (Auth.narrowScope) return Auth.ensureOrgError(c)
469
+ if (Auth.narrowOrgRole) return Auth.ensureOrgRoleError(c)
470
+ if (OpenApi.narrowValidation) return OpenApi.validationError(c, paramValidation)
414
471
  if (OpenApi.narrowValidation) return OpenApi.validationError(c, bodyValidation)
415
472
  const body = c.req.valid('json')
416
473
  try {
@@ -435,7 +492,13 @@ export function inviteLinks() {
435
492
  OpenApi.describeRoute({
436
493
  operationId: 'deleteInviteLink',
437
494
  responses: OpenApi.responses({
438
- errors,
495
+ errors: {
496
+ 400: { codes: ['param_invalid'], description: 'Malformed API key or invalid path.' },
497
+ 404: {
498
+ codes: ['invite_link_not_found', 'organization_not_found'],
499
+ description: 'No accessible organization or invite link was found.',
500
+ },
501
+ },
439
502
  success: { description: 'Deleted link.', schema: schema.DeleteResponse },
440
503
  }),
441
504
  summary: 'Delete invite link',
@@ -444,6 +507,7 @@ export function inviteLinks() {
444
507
  async (c) => {
445
508
  if (Auth.narrowAccess) return Auth.superAdminAccessError(c)
446
509
  if (Auth.narrowScope) return Auth.ensureOrgError(c)
510
+ if (Auth.narrowOrgRole) return Auth.ensureOrgRoleError(c)
447
511
  if (OpenApi.narrowValidation) return OpenApi.validationError(c, paramValidation)
448
512
  try {
449
513
  const id = c.req.valid('param').inviteLinkId
@@ -463,7 +527,13 @@ export function inviteLinks() {
463
527
  OpenApi.describeRoute({
464
528
  operationId: 'listInviteLinkRedemptions',
465
529
  responses: OpenApi.responses({
466
- errors,
530
+ errors: {
531
+ 400: { codes: ['param_invalid'], description: 'Malformed API key or invalid path.' },
532
+ 404: {
533
+ codes: ['invite_link_not_found', 'organization_not_found'],
534
+ description: 'No accessible organization or invite link was found.',
535
+ },
536
+ },
467
537
  success: { description: 'Redemptions.', schema: schema.RedemptionsResponse },
468
538
  }),
469
539
  summary: 'List link redemptions',
@@ -472,6 +542,7 @@ export function inviteLinks() {
472
542
  async (c) => {
473
543
  if (Auth.narrowAccess) return Auth.superAdminAccessError(c)
474
544
  if (Auth.narrowScope) return Auth.ensureOrgError(c)
545
+ if (Auth.narrowOrgRole) return Auth.ensureOrgRoleError(c)
475
546
  if (OpenApi.narrowValidation) return OpenApi.validationError(c, paramValidation)
476
547
  try {
477
548
  const db = Db.get(c.get('db'))
@@ -492,11 +563,17 @@ export function inviteLinks() {
492
563
  .post(
493
564
  '/v1/invite-links/resolve',
494
565
  Auth.policy({ public: true, session: true }),
495
- OpenApi.validate('json', schema.TokenBody, bodyValidation),
566
+ OpenApi.validate('json', schema.InviteLinkTokenRequest, bodyValidation),
496
567
  OpenApi.describeRoute({
497
568
  operationId: 'resolveInviteLink',
498
569
  responses: OpenApi.responses({
499
- errors,
570
+ errors: {
571
+ 400: { codes: ['body_invalid'], description: 'Malformed API key or invalid body.' },
572
+ 404: {
573
+ codes: ['invite_link_not_found'],
574
+ description: 'No active invite link was found.',
575
+ },
576
+ },
500
577
  success: { description: 'Active link summary.', schema: schema.ResolveResponse },
501
578
  }),
502
579
  summary: 'Resolve invite link',
@@ -523,16 +600,20 @@ export function inviteLinks() {
523
600
  .post(
524
601
  '/v1/invite-links/accept',
525
602
  Auth.policy({ session: true }),
526
- OpenApi.validate('json', schema.TokenBody, bodyValidation),
603
+ OpenApi.validate('json', schema.InviteLinkTokenRequest, bodyValidation),
527
604
  OpenApi.describeRoute({
528
605
  operationId: 'acceptInviteLink',
529
606
  responses: OpenApi.responses({
530
607
  errors: {
608
+ 400: { codes: ['body_invalid'], description: 'Malformed API key or invalid body.' },
531
609
  403: {
532
- codes: ['forbidden', 'invite_link_email_forbidden'],
610
+ codes: ['invite_link_email_forbidden'],
533
611
  description: 'A verified session email from an allowed domain is required.',
534
612
  },
535
- ...errors,
613
+ 404: {
614
+ codes: ['invite_link_not_found'],
615
+ description: 'No active invite link was found.',
616
+ },
536
617
  },
537
618
  success: { description: 'Membership.', schema: schema.AcceptResponse },
538
619
  }),