@tempoxyz/id 0.0.0-stage → 0.0.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 (712) hide show
  1. package/README.md +80 -2
  2. package/dist/App.d.ts +20 -0
  3. package/dist/App.d.ts.map +1 -0
  4. package/dist/App.js +26 -0
  5. package/dist/App.js.map +1 -0
  6. package/dist/app/client/.assetsignore +2 -0
  7. package/dist/app/client/assets/BRLA-CZvVDNYr.png +0 -0
  8. package/dist/app/client/assets/CHFAU-DCedc4aH.png +0 -0
  9. package/dist/app/client/assets/DLUSD-BnRXm3EI.png +0 -0
  10. package/dist/app/client/assets/PRIME-CiFp2-3e.svg +14 -0
  11. package/dist/app/client/assets/Pilat-Bold-C1t1eIrF.woff2 +0 -0
  12. package/dist/app/client/assets/Pilat-Book-CbS8ofT8.woff2 +0 -0
  13. package/dist/app/client/assets/Pilat-Demi-CADSbPAt.woff2 +0 -0
  14. package/dist/app/client/assets/Pilat-Regular-Bx8vzE7q.woff2 +0 -0
  15. package/dist/app/client/assets/USD1-COVcO_PB.svg +30 -0
  16. package/dist/app/client/assets/YLDS-CRh8Zw0g.svg +3 -0
  17. package/dist/app/client/assets/ccip-Cq1mMiVl.js +1 -0
  18. package/dist/app/client/assets/frxUSD-n9pTpinR.svg +1 -0
  19. package/dist/app/client/assets/geist-mono-latin-wght-normal-XN7g48iV.woff2 +0 -0
  20. package/dist/app/client/assets/index-B7YJVP00.css +1 -0
  21. package/dist/app/client/assets/index-UXTxXCLk.js +55 -0
  22. package/dist/app/client/assets/pathUSD-BvaO6ooS.svg +25 -0
  23. package/dist/app/client/assets/reset-co-CHrff.css +1 -0
  24. package/dist/app/client/assets/wYLDS-CaCKDrO-.svg +10 -0
  25. package/dist/app/db/auth.d.ts +3207 -0
  26. package/dist/app/db/auth.d.ts.map +1 -0
  27. package/dist/app/db/auth.js +330 -0
  28. package/dist/app/db/auth.js.map +1 -0
  29. package/dist/app/db/schema.d.ts +932 -0
  30. package/dist/app/db/schema.d.ts.map +1 -0
  31. package/dist/app/db/schema.js +171 -0
  32. package/dist/app/db/schema.js.map +1 -0
  33. package/dist/app/server/.vite/manifest.json +489 -0
  34. package/dist/app/server/assets/BRLA-CZvVDNYr.png +0 -0
  35. package/dist/app/server/assets/CHFAU-DCedc4aH.png +0 -0
  36. package/dist/app/server/assets/DLUSD-BnRXm3EI.png +0 -0
  37. package/dist/app/server/assets/PRIME-CiFp2-3e.svg +14 -0
  38. package/dist/app/server/assets/Pilat-Bold-C1t1eIrF.woff2 +0 -0
  39. package/dist/app/server/assets/Pilat-Book-CbS8ofT8.woff2 +0 -0
  40. package/dist/app/server/assets/Pilat-Demi-CADSbPAt.woff2 +0 -0
  41. package/dist/app/server/assets/Pilat-Regular-Bx8vzE7q.woff2 +0 -0
  42. package/dist/app/server/assets/USD1-COVcO_PB.svg +30 -0
  43. package/dist/app/server/assets/YLDS-CRh8Zw0g.svg +3 -0
  44. package/dist/app/server/assets/_tanstack-start-manifest_v-11GtFGrq.js +1 -0
  45. package/dist/app/server/assets/arktype-aI7TBD0R-D1R3Byo5.js +2 -0
  46. package/dist/app/server/assets/arktype-aI7TBD0R-D1R3Byo5.js.map +1 -0
  47. package/dist/app/server/assets/authorize-C95F-9E1-CbESJKGU.js +31 -0
  48. package/dist/app/server/assets/authorize-C95F-9E1-CbESJKGU.js.map +1 -0
  49. package/dist/app/server/assets/bun-sqlite-dialect-DoOVo4ja-CtyBkVMb.js +2 -0
  50. package/dist/app/server/assets/bun-sqlite-dialect-DoOVo4ja-CtyBkVMb.js.map +1 -0
  51. package/dist/app/server/assets/call-UQamaCKN.js +32 -0
  52. package/dist/app/server/assets/call-UQamaCKN.js.map +1 -0
  53. package/dist/app/server/assets/ccip-CbNKFO4n.js +2 -0
  54. package/dist/app/server/assets/ccip-CbNKFO4n.js.map +1 -0
  55. package/dist/app/server/assets/compiled-query-Ds2NVcFT.js +2 -0
  56. package/dist/app/server/assets/compiled-query-Ds2NVcFT.js.map +1 -0
  57. package/dist/app/server/assets/convert-BIC8n32x.js +2 -0
  58. package/dist/app/server/assets/convert-BIC8n32x.js.map +1 -0
  59. package/dist/app/server/assets/cookie-CS900nSP.css +1 -0
  60. package/dist/app/server/assets/cookie-Cce9CrIP.js +10 -0
  61. package/dist/app/server/assets/cookie-Cce9CrIP.js.map +1 -0
  62. package/dist/app/server/assets/core-B1HCXUmx.js +56 -0
  63. package/dist/app/server/assets/core-B1HCXUmx.js.map +1 -0
  64. package/dist/app/server/assets/d1-sqlite-dialect-m0f01-4z-Cv-csE1u.js +2 -0
  65. package/dist/app/server/assets/d1-sqlite-dialect-m0f01-4z-Cv-csE1u.js.map +1 -0
  66. package/dist/app/server/assets/default-u_dwuiYb-BJJ9PwCi.js +2 -0
  67. package/dist/app/server/assets/default-u_dwuiYb-BJJ9PwCi.js.map +1 -0
  68. package/dist/app/server/assets/dist-BxSwugSY.js +1 -0
  69. package/dist/app/server/assets/dist-CZGFhmQd.js +2 -0
  70. package/dist/app/server/assets/dist-CZGFhmQd.js.map +1 -0
  71. package/dist/app/server/assets/dist-Dg3PQqiW.js +15 -0
  72. package/dist/app/server/assets/dist-Dg3PQqiW.js.map +1 -0
  73. package/dist/app/server/assets/effect-QlVUlMFu-2tSPDT2b.js +2 -0
  74. package/dist/app/server/assets/effect-QlVUlMFu-2tSPDT2b.js.map +1 -0
  75. package/dist/app/server/assets/empty-plugin-adapters-BaGcmrjC.js +2 -0
  76. package/dist/app/server/assets/empty-plugin-adapters-BaGcmrjC.js.map +1 -0
  77. package/dist/app/server/assets/factory-ipHlJXZY.js +5 -0
  78. package/dist/app/server/assets/factory-ipHlJXZY.js.map +1 -0
  79. package/dist/app/server/assets/frxUSD-n9pTpinR.svg +1 -0
  80. package/dist/app/server/assets/geist-mono-latin-wght-normal-XN7g48iV.woff2 +0 -0
  81. package/dist/app/server/assets/get-id-field-B0x109VU.js +6 -0
  82. package/dist/app/server/assets/get-id-field-B0x109VU.js.map +1 -0
  83. package/dist/app/server/assets/index-CLddUTqr-xpSuLpBt.js +2 -0
  84. package/dist/app/server/assets/index-CLddUTqr-xpSuLpBt.js.map +1 -0
  85. package/dist/app/server/assets/index-DZEfthgZ-8Uq5s5Pt.js +2 -0
  86. package/dist/app/server/assets/index-DZEfthgZ-8Uq5s5Pt.js.map +1 -0
  87. package/dist/app/server/assets/kysely-adapter-MkHAI9Jk.js +1 -0
  88. package/dist/app/server/assets/node-sqlite-dialect-BowWLXvK.js +2 -0
  89. package/dist/app/server/assets/node-sqlite-dialect-BowWLXvK.js.map +1 -0
  90. package/dist/app/server/assets/pathUSD-BvaO6ooS.svg +25 -0
  91. package/dist/app/server/assets/reset-co-CHrff.css +1 -0
  92. package/dist/app/server/assets/rolldown-runtime-B0Z9INg1.js +1 -0
  93. package/dist/app/server/assets/router-CcbyBCI4.css +1 -0
  94. package/dist/app/server/assets/router-xjZtEeaI.js +7 -0
  95. package/dist/app/server/assets/router-xjZtEeaI.js.map +1 -0
  96. package/dist/app/server/assets/schema-check-Cf7QOZZD.js +9 -0
  97. package/dist/app/server/assets/schema-check-Cf7QOZZD.js.map +1 -0
  98. package/dist/app/server/assets/schemas-C2lCYmR5.js +2 -0
  99. package/dist/app/server/assets/schemas-C2lCYmR5.js.map +1 -0
  100. package/dist/app/server/assets/secp256k1-buM5g4AL.js +2 -0
  101. package/dist/app/server/assets/secp256k1-buM5g4AL.js.map +1 -0
  102. package/dist/app/server/assets/sqlite-adapter-C_LAV4e3.js +2 -0
  103. package/dist/app/server/assets/sqlite-adapter-C_LAV4e3.js.map +1 -0
  104. package/dist/app/server/assets/sqlite-introspector-DSCAP82F-Crx7Ny14.js +6 -0
  105. package/dist/app/server/assets/sqlite-introspector-DSCAP82F-Crx7Ny14.js.map +1 -0
  106. package/dist/app/server/assets/standard-json-Cg1N07hM.js +2 -0
  107. package/dist/app/server/assets/standard-json-Cg1N07hM.js.map +1 -0
  108. package/dist/app/server/assets/standard-json-DY77efq0.js +2 -0
  109. package/dist/app/server/assets/standard-json-DY77efq0.js.map +1 -0
  110. package/dist/app/server/assets/standard-json-ig2t0wRt.js +2 -0
  111. package/dist/app/server/assets/standard-json-ig2t0wRt.js.map +1 -0
  112. package/dist/app/server/assets/standard-json-t-LNckA6.js +2 -0
  113. package/dist/app/server/assets/standard-json-t-LNckA6.js.map +1 -0
  114. package/dist/app/server/assets/standard-openapi-CONmVRl8.js +2 -0
  115. package/dist/app/server/assets/standard-openapi-CONmVRl8.js.map +1 -0
  116. package/dist/app/server/assets/start-C63VetBp.js +2 -0
  117. package/dist/app/server/assets/start-C63VetBp.js.map +1 -0
  118. package/dist/app/server/assets/sury-CWZTCd75-xt1mWc9f.js +2 -0
  119. package/dist/app/server/assets/sury-CWZTCd75-xt1mWc9f.js.map +1 -0
  120. package/dist/app/server/assets/typebox-Dei93FPO-D_lCVdAz.js +2 -0
  121. package/dist/app/server/assets/typebox-Dei93FPO-D_lCVdAz.js.map +1 -0
  122. package/dist/app/server/assets/utils-C4ZXZIZW.js +2 -0
  123. package/dist/app/server/assets/utils-C4ZXZIZW.js.map +1 -0
  124. package/dist/app/server/assets/valibot--1zFm7rT-NSoY2xTp.js +2 -0
  125. package/dist/app/server/assets/valibot--1zFm7rT-NSoY2xTp.js.map +1 -0
  126. package/dist/app/server/assets/valibot-D_HTw1Gn-CJwWeOUE.js +2 -0
  127. package/dist/app/server/assets/valibot-D_HTw1Gn-CJwWeOUE.js.map +1 -0
  128. package/dist/app/server/assets/wYLDS-CaCKDrO-.svg +10 -0
  129. package/dist/app/server/assets/zod-Bwrt9trS-CV38yPnQ.js +2 -0
  130. package/dist/app/server/assets/zod-Bwrt9trS-CV38yPnQ.js.map +1 -0
  131. package/dist/app/server/assets/zod-DSgpEGAE-BvlnBE2L.js +2 -0
  132. package/dist/app/server/assets/zod-DSgpEGAE-BvlnBE2L.js.map +1 -0
  133. package/dist/app/server/index.js +574 -0
  134. package/dist/app/server/index.js.map +1 -0
  135. package/dist/app/server/wrangler.json +1 -0
  136. package/dist/cli/Admin.d.ts +38 -0
  137. package/dist/cli/Admin.d.ts.map +1 -0
  138. package/dist/cli/Admin.js +62 -0
  139. package/dist/cli/Admin.js.map +1 -0
  140. package/dist/cli/Apps.d.ts +9 -0
  141. package/dist/cli/Apps.d.ts.map +1 -0
  142. package/dist/cli/Apps.js +36 -0
  143. package/dist/cli/Apps.js.map +1 -0
  144. package/dist/cli/Cli.d.ts +14 -0
  145. package/dist/cli/Cli.d.ts.map +1 -0
  146. package/dist/cli/Cli.js +27 -0
  147. package/dist/cli/Cli.js.map +1 -0
  148. package/dist/cli/Project.d.ts +20 -0
  149. package/dist/cli/Project.d.ts.map +1 -0
  150. package/dist/cli/Project.js +88 -0
  151. package/dist/cli/Project.js.map +1 -0
  152. package/dist/cli/Realms.d.ts +24 -0
  153. package/dist/cli/Realms.d.ts.map +1 -0
  154. package/dist/cli/Realms.js +49 -0
  155. package/dist/cli/Realms.js.map +1 -0
  156. package/dist/cli/Session.d.ts +85 -0
  157. package/dist/cli/Session.d.ts.map +1 -0
  158. package/dist/cli/Session.js +178 -0
  159. package/dist/cli/Session.js.map +1 -0
  160. package/dist/cli/User.d.ts +29 -0
  161. package/dist/cli/User.d.ts.map +1 -0
  162. package/dist/cli/User.js +39 -0
  163. package/dist/cli/User.js.map +1 -0
  164. package/dist/cli/V1.d.ts +35 -0
  165. package/dist/cli/V1.d.ts.map +1 -0
  166. package/dist/cli/V1.js +41 -0
  167. package/dist/cli/V1.js.map +1 -0
  168. package/dist/cli/bin.d.ts +3 -0
  169. package/dist/cli/bin.d.ts.map +1 -0
  170. package/dist/cli/bin.js +46 -0
  171. package/dist/cli/bin.js.map +1 -0
  172. package/dist/cli/commands/admin/apps/create.d.ts +23 -0
  173. package/dist/cli/commands/admin/apps/create.d.ts.map +1 -0
  174. package/dist/cli/commands/admin/apps/create.js +89 -0
  175. package/dist/cli/commands/admin/apps/create.js.map +1 -0
  176. package/dist/cli/commands/admin/apps/delete.d.ts +14 -0
  177. package/dist/cli/commands/admin/apps/delete.d.ts.map +1 -0
  178. package/dist/cli/commands/admin/apps/delete.js +41 -0
  179. package/dist/cli/commands/admin/apps/delete.js.map +1 -0
  180. package/dist/cli/commands/admin/apps/index.d.ts +5 -0
  181. package/dist/cli/commands/admin/apps/index.d.ts.map +1 -0
  182. package/dist/cli/commands/admin/apps/index.js +14 -0
  183. package/dist/cli/commands/admin/apps/index.js.map +1 -0
  184. package/dist/cli/commands/admin/apps/list.d.ts +9 -0
  185. package/dist/cli/commands/admin/apps/list.d.ts.map +1 -0
  186. package/dist/cli/commands/admin/apps/list.js +26 -0
  187. package/dist/cli/commands/admin/apps/list.js.map +1 -0
  188. package/dist/cli/commands/admin/apps/rotate-secret.d.ts +16 -0
  189. package/dist/cli/commands/admin/apps/rotate-secret.d.ts.map +1 -0
  190. package/dist/cli/commands/admin/apps/rotate-secret.js +47 -0
  191. package/dist/cli/commands/admin/apps/rotate-secret.js.map +1 -0
  192. package/dist/cli/commands/admin/apps/update.d.ts +20 -0
  193. package/dist/cli/commands/admin/apps/update.d.ts.map +1 -0
  194. package/dist/cli/commands/admin/apps/update.js +76 -0
  195. package/dist/cli/commands/admin/apps/update.js.map +1 -0
  196. package/dist/cli/commands/admin/index.d.ts +5 -0
  197. package/dist/cli/commands/admin/index.d.ts.map +1 -0
  198. package/dist/cli/commands/admin/index.js +13 -0
  199. package/dist/cli/commands/admin/index.js.map +1 -0
  200. package/dist/cli/commands/admin/migrate.d.ts +9 -0
  201. package/dist/cli/commands/admin/migrate.d.ts.map +1 -0
  202. package/dist/cli/commands/admin/migrate.js +17 -0
  203. package/dist/cli/commands/admin/migrate.js.map +1 -0
  204. package/dist/cli/commands/admin/realms/add.d.ts +12 -0
  205. package/dist/cli/commands/admin/realms/add.d.ts.map +1 -0
  206. package/dist/cli/commands/admin/realms/add.js +42 -0
  207. package/dist/cli/commands/admin/realms/add.js.map +1 -0
  208. package/dist/cli/commands/admin/realms/index.d.ts +5 -0
  209. package/dist/cli/commands/admin/realms/index.d.ts.map +1 -0
  210. package/dist/cli/commands/admin/realms/index.js +13 -0
  211. package/dist/cli/commands/admin/realms/index.js.map +1 -0
  212. package/dist/cli/commands/admin/realms/list.d.ts +13 -0
  213. package/dist/cli/commands/admin/realms/list.d.ts.map +1 -0
  214. package/dist/cli/commands/admin/realms/list.js +36 -0
  215. package/dist/cli/commands/admin/realms/list.js.map +1 -0
  216. package/dist/cli/commands/admin/realms/passkeys/index.d.ts +5 -0
  217. package/dist/cli/commands/admin/realms/passkeys/index.d.ts.map +1 -0
  218. package/dist/cli/commands/admin/realms/passkeys/index.js +13 -0
  219. package/dist/cli/commands/admin/realms/passkeys/index.js.map +1 -0
  220. package/dist/cli/commands/admin/realms/passkeys/set.d.ts +16 -0
  221. package/dist/cli/commands/admin/realms/passkeys/set.d.ts.map +1 -0
  222. package/dist/cli/commands/admin/realms/passkeys/set.js +46 -0
  223. package/dist/cli/commands/admin/realms/passkeys/set.js.map +1 -0
  224. package/dist/cli/commands/admin/realms/privy/index.d.ts +5 -0
  225. package/dist/cli/commands/admin/realms/privy/index.d.ts.map +1 -0
  226. package/dist/cli/commands/admin/realms/privy/index.js +13 -0
  227. package/dist/cli/commands/admin/realms/privy/index.js.map +1 -0
  228. package/dist/cli/commands/admin/realms/privy/set.d.ts +18 -0
  229. package/dist/cli/commands/admin/realms/privy/set.d.ts.map +1 -0
  230. package/dist/cli/commands/admin/realms/privy/set.js +66 -0
  231. package/dist/cli/commands/admin/realms/privy/set.js.map +1 -0
  232. package/dist/cli/commands/admin/realms/remove.d.ts +11 -0
  233. package/dist/cli/commands/admin/realms/remove.d.ts.map +1 -0
  234. package/dist/cli/commands/admin/realms/remove.js +35 -0
  235. package/dist/cli/commands/admin/realms/remove.js.map +1 -0
  236. package/dist/cli/commands/admin/realms/secp256k1/disable.d.ts +15 -0
  237. package/dist/cli/commands/admin/realms/secp256k1/disable.d.ts.map +1 -0
  238. package/dist/cli/commands/admin/realms/secp256k1/disable.js +42 -0
  239. package/dist/cli/commands/admin/realms/secp256k1/disable.js.map +1 -0
  240. package/dist/cli/commands/admin/realms/secp256k1/enable.d.ts +15 -0
  241. package/dist/cli/commands/admin/realms/secp256k1/enable.d.ts.map +1 -0
  242. package/dist/cli/commands/admin/realms/secp256k1/enable.js +42 -0
  243. package/dist/cli/commands/admin/realms/secp256k1/enable.js.map +1 -0
  244. package/dist/cli/commands/admin/realms/secp256k1/index.d.ts +9 -0
  245. package/dist/cli/commands/admin/realms/secp256k1/index.d.ts.map +1 -0
  246. package/dist/cli/commands/admin/realms/secp256k1/index.js +17 -0
  247. package/dist/cli/commands/admin/realms/secp256k1/index.js.map +1 -0
  248. package/dist/cli/commands/admin/realms/set.d.ts +16 -0
  249. package/dist/cli/commands/admin/realms/set.d.ts.map +1 -0
  250. package/dist/cli/commands/admin/realms/set.js +46 -0
  251. package/dist/cli/commands/admin/realms/set.js.map +1 -0
  252. package/dist/cli/commands/admin/rotate-key.d.ts +15 -0
  253. package/dist/cli/commands/admin/rotate-key.d.ts.map +1 -0
  254. package/dist/cli/commands/admin/rotate-key.js +46 -0
  255. package/dist/cli/commands/admin/rotate-key.js.map +1 -0
  256. package/dist/cli/commands/init.d.ts +11 -0
  257. package/dist/cli/commands/init.d.ts.map +1 -0
  258. package/dist/cli/commands/init.js +34 -0
  259. package/dist/cli/commands/init.js.map +1 -0
  260. package/dist/cli/commands/login.d.ts +12 -0
  261. package/dist/cli/commands/login.d.ts.map +1 -0
  262. package/dist/cli/commands/login.js +29 -0
  263. package/dist/cli/commands/login.js.map +1 -0
  264. package/dist/cli/commands/logout.d.ts +8 -0
  265. package/dist/cli/commands/logout.d.ts.map +1 -0
  266. package/dist/cli/commands/logout.js +19 -0
  267. package/dist/cli/commands/logout.js.map +1 -0
  268. package/dist/cli/commands/whoami.d.ts +12 -0
  269. package/dist/cli/commands/whoami.d.ts.map +1 -0
  270. package/dist/cli/commands/whoami.js +24 -0
  271. package/dist/cli/commands/whoami.js.map +1 -0
  272. package/dist/client/Actions.d.ts +101 -0
  273. package/dist/client/Actions.d.ts.map +1 -0
  274. package/dist/client/Actions.js +90 -0
  275. package/dist/client/Actions.js.map +1 -0
  276. package/dist/client/Auth.d.ts +161 -0
  277. package/dist/client/Auth.d.ts.map +1 -0
  278. package/dist/client/Auth.js +113 -0
  279. package/dist/client/Auth.js.map +1 -0
  280. package/dist/client/Authorization.d.ts +29 -0
  281. package/dist/client/Authorization.d.ts.map +1 -0
  282. package/dist/client/Authorization.js +12 -0
  283. package/dist/client/Authorization.js.map +1 -0
  284. package/dist/client/Decorator.d.ts +170 -0
  285. package/dist/client/Decorator.d.ts.map +1 -0
  286. package/dist/client/Decorator.js +227 -0
  287. package/dist/client/Decorator.js.map +1 -0
  288. package/dist/client/Key.d.ts +85 -0
  289. package/dist/client/Key.d.ts.map +1 -0
  290. package/dist/client/Key.js +83 -0
  291. package/dist/client/Key.js.map +1 -0
  292. package/dist/client/Pending.d.ts +39 -0
  293. package/dist/client/Pending.d.ts.map +1 -0
  294. package/dist/client/Pending.js +12 -0
  295. package/dist/client/Pending.js.map +1 -0
  296. package/dist/client/Permissions.d.ts +34 -0
  297. package/dist/client/Permissions.d.ts.map +1 -0
  298. package/dist/client/Permissions.js +16 -0
  299. package/dist/client/Permissions.js.map +1 -0
  300. package/dist/client/Provider.d.ts +16 -0
  301. package/dist/client/Provider.d.ts.map +1 -0
  302. package/dist/client/Provider.js +12 -0
  303. package/dist/client/Provider.js.map +1 -0
  304. package/dist/client/Step.d.ts +21 -0
  305. package/dist/client/Step.d.ts.map +1 -0
  306. package/dist/client/Step.js +16 -0
  307. package/dist/client/Step.js.map +1 -0
  308. package/dist/client/Storage.d.ts +27 -0
  309. package/dist/client/Storage.d.ts.map +1 -0
  310. package/dist/client/Storage.js +16 -0
  311. package/dist/client/Storage.js.map +1 -0
  312. package/dist/client/TempoAccount.d.ts +40 -0
  313. package/dist/client/TempoAccount.d.ts.map +1 -0
  314. package/dist/client/TempoAccount.js +16 -0
  315. package/dist/client/TempoAccount.js.map +1 -0
  316. package/dist/client/Tokens.d.ts +25 -0
  317. package/dist/client/Tokens.d.ts.map +1 -0
  318. package/dist/client/Tokens.js +12 -0
  319. package/dist/client/Tokens.js.map +1 -0
  320. package/dist/client/User.d.ts +21 -0
  321. package/dist/client/User.d.ts.map +1 -0
  322. package/dist/client/User.js +12 -0
  323. package/dist/client/User.js.map +1 -0
  324. package/dist/client/actions/account.d.ts +25 -0
  325. package/dist/client/actions/account.d.ts.map +1 -0
  326. package/dist/client/actions/account.js +34 -0
  327. package/dist/client/actions/account.js.map +1 -0
  328. package/dist/client/actions/device.d.ts +53 -0
  329. package/dist/client/actions/device.d.ts.map +1 -0
  330. package/dist/client/actions/device.js +79 -0
  331. package/dist/client/actions/device.js.map +1 -0
  332. package/dist/client/actions/email.d.ts +84 -0
  333. package/dist/client/actions/email.d.ts.map +1 -0
  334. package/dist/client/actions/email.js +63 -0
  335. package/dist/client/actions/email.js.map +1 -0
  336. package/dist/client/actions/oauth.d.ts +115 -0
  337. package/dist/client/actions/oauth.d.ts.map +1 -0
  338. package/dist/client/actions/oauth.js +105 -0
  339. package/dist/client/actions/oauth.js.map +1 -0
  340. package/dist/client/actions/passkey.d.ts +88 -0
  341. package/dist/client/actions/passkey.d.ts.map +1 -0
  342. package/dist/client/actions/passkey.js +60 -0
  343. package/dist/client/actions/passkey.js.map +1 -0
  344. package/dist/client/actions/provider.d.ts +49 -0
  345. package/dist/client/actions/provider.d.ts.map +1 -0
  346. package/dist/client/actions/provider.js +34 -0
  347. package/dist/client/actions/provider.js.map +1 -0
  348. package/dist/client/actions/realm.d.ts +24 -0
  349. package/dist/client/actions/realm.d.ts.map +1 -0
  350. package/dist/client/actions/realm.js +15 -0
  351. package/dist/client/actions/realm.js.map +1 -0
  352. package/dist/client/actions/redirect.d.ts +153 -0
  353. package/dist/client/actions/redirect.d.ts.map +1 -0
  354. package/dist/client/actions/redirect.js +236 -0
  355. package/dist/client/actions/redirect.js.map +1 -0
  356. package/dist/client/internal/accessKey.d.ts +21 -0
  357. package/dist/client/internal/accessKey.d.ts.map +1 -0
  358. package/dist/client/internal/accessKey.js +38 -0
  359. package/dist/client/internal/accessKey.js.map +1 -0
  360. package/dist/client/internal/account.d.ts +14 -0
  361. package/dist/client/internal/account.d.ts.map +1 -0
  362. package/dist/client/internal/account.js +3 -0
  363. package/dist/client/internal/account.js.map +1 -0
  364. package/dist/client/internal/api.d.ts +106 -0
  365. package/dist/client/internal/api.d.ts.map +1 -0
  366. package/dist/client/internal/api.js +129 -0
  367. package/dist/client/internal/api.js.map +1 -0
  368. package/dist/client/internal/headless.d.ts +33 -0
  369. package/dist/client/internal/headless.d.ts.map +1 -0
  370. package/dist/client/internal/headless.js +46 -0
  371. package/dist/client/internal/headless.js.map +1 -0
  372. package/dist/client/internal/indexedDb.d.ts +9 -0
  373. package/dist/client/internal/indexedDb.d.ts.map +1 -0
  374. package/dist/client/internal/indexedDb.js +32 -0
  375. package/dist/client/internal/indexedDb.js.map +1 -0
  376. package/dist/client/internal/request.d.ts +58 -0
  377. package/dist/client/internal/request.d.ts.map +1 -0
  378. package/dist/client/internal/request.js +45 -0
  379. package/dist/client/internal/request.js.map +1 -0
  380. package/dist/client/internal/store.d.ts +12 -0
  381. package/dist/client/internal/store.d.ts.map +1 -0
  382. package/dist/client/internal/store.js +15 -0
  383. package/dist/client/internal/store.js.map +1 -0
  384. package/dist/client.d.ts +20 -0
  385. package/dist/client.d.ts.map +1 -0
  386. package/dist/client.js +20 -0
  387. package/dist/client.js.map +1 -0
  388. package/dist/index.d.ts +7 -0
  389. package/dist/index.d.ts.map +1 -0
  390. package/dist/index.js +7 -0
  391. package/dist/index.js.map +1 -0
  392. package/dist/internal/Apps.d.ts +3051 -0
  393. package/dist/internal/Apps.d.ts.map +1 -0
  394. package/dist/internal/Apps.js +472 -0
  395. package/dist/internal/Apps.js.map +1 -0
  396. package/dist/internal/Auth.d.ts +4058 -0
  397. package/dist/internal/Auth.d.ts.map +1 -0
  398. package/dist/internal/Auth.js +137 -0
  399. package/dist/internal/Auth.js.map +1 -0
  400. package/dist/internal/Authorize.d.ts +532 -0
  401. package/dist/internal/Authorize.d.ts.map +1 -0
  402. package/dist/internal/Authorize.js +326 -0
  403. package/dist/internal/Authorize.js.map +1 -0
  404. package/dist/internal/Device.d.ts +371 -0
  405. package/dist/internal/Device.d.ts.map +1 -0
  406. package/dist/internal/Device.js +271 -0
  407. package/dist/internal/Device.js.map +1 -0
  408. package/dist/internal/Env.d.ts +57 -0
  409. package/dist/internal/Env.d.ts.map +1 -0
  410. package/dist/internal/Env.js +2 -0
  411. package/dist/internal/Env.js.map +1 -0
  412. package/dist/internal/ErrorResponse.d.ts +609 -0
  413. package/dist/internal/ErrorResponse.d.ts.map +1 -0
  414. package/dist/internal/ErrorResponse.js +679 -0
  415. package/dist/internal/ErrorResponse.js.map +1 -0
  416. package/dist/internal/Id.d.ts +10 -0
  417. package/dist/internal/Id.d.ts.map +1 -0
  418. package/dist/internal/Id.js +34 -0
  419. package/dist/internal/Id.js.map +1 -0
  420. package/dist/internal/KeyAuthorization.d.ts +1456 -0
  421. package/dist/internal/KeyAuthorization.d.ts.map +1 -0
  422. package/dist/internal/KeyAuthorization.js +1030 -0
  423. package/dist/internal/KeyAuthorization.js.map +1 -0
  424. package/dist/internal/Limits.d.ts +65 -0
  425. package/dist/internal/Limits.d.ts.map +1 -0
  426. package/dist/internal/Limits.js +35 -0
  427. package/dist/internal/Limits.js.map +1 -0
  428. package/dist/internal/Log.d.ts +49 -0
  429. package/dist/internal/Log.d.ts.map +1 -0
  430. package/dist/internal/Log.js +101 -0
  431. package/dist/internal/Log.js.map +1 -0
  432. package/dist/internal/LogLine.d.ts +33 -0
  433. package/dist/internal/LogLine.d.ts.map +1 -0
  434. package/dist/internal/LogLine.js +56 -0
  435. package/dist/internal/LogLine.js.map +1 -0
  436. package/dist/internal/Migrations.d.ts +19 -0
  437. package/dist/internal/Migrations.d.ts.map +1 -0
  438. package/dist/internal/Migrations.js +57 -0
  439. package/dist/internal/Migrations.js.map +1 -0
  440. package/dist/internal/Owner.d.ts +146 -0
  441. package/dist/internal/Owner.d.ts.map +1 -0
  442. package/dist/internal/Owner.js +65 -0
  443. package/dist/internal/Owner.js.map +1 -0
  444. package/dist/internal/Passkey.d.ts +528 -0
  445. package/dist/internal/Passkey.d.ts.map +1 -0
  446. package/dist/internal/Passkey.js +658 -0
  447. package/dist/internal/Passkey.js.map +1 -0
  448. package/dist/internal/PendingKey.d.ts +49 -0
  449. package/dist/internal/PendingKey.d.ts.map +1 -0
  450. package/dist/internal/PendingKey.js +58 -0
  451. package/dist/internal/PendingKey.js.map +1 -0
  452. package/dist/internal/Privy.d.ts +105 -0
  453. package/dist/internal/Privy.d.ts.map +1 -0
  454. package/dist/internal/Privy.js +224 -0
  455. package/dist/internal/Privy.js.map +1 -0
  456. package/dist/internal/RateLimit.d.ts +190 -0
  457. package/dist/internal/RateLimit.d.ts.map +1 -0
  458. package/dist/internal/RateLimit.js +148 -0
  459. package/dist/internal/RateLimit.js.map +1 -0
  460. package/dist/internal/Realm.d.ts +281 -0
  461. package/dist/internal/Realm.d.ts.map +1 -0
  462. package/dist/internal/Realm.js +477 -0
  463. package/dist/internal/Realm.js.map +1 -0
  464. package/dist/internal/RequestId.d.ts +16 -0
  465. package/dist/internal/RequestId.d.ts.map +1 -0
  466. package/dist/internal/RequestId.js +78 -0
  467. package/dist/internal/RequestId.js.map +1 -0
  468. package/dist/internal/SigningKey.d.ts +115 -0
  469. package/dist/internal/SigningKey.d.ts.map +1 -0
  470. package/dist/internal/SigningKey.js +197 -0
  471. package/dist/internal/SigningKey.js.map +1 -0
  472. package/dist/internal/TestInbox.d.ts +42 -0
  473. package/dist/internal/TestInbox.d.ts.map +1 -0
  474. package/dist/internal/TestInbox.js +20 -0
  475. package/dist/internal/TestInbox.js.map +1 -0
  476. package/dist/internal/Timing.d.ts +51 -0
  477. package/dist/internal/Timing.d.ts.map +1 -0
  478. package/dist/internal/Timing.js +103 -0
  479. package/dist/internal/Timing.js.map +1 -0
  480. package/dist/internal/Validation.d.ts +52 -0
  481. package/dist/internal/Validation.d.ts.map +1 -0
  482. package/dist/internal/Validation.js +22 -0
  483. package/dist/internal/Validation.js.map +1 -0
  484. package/dist/internal/Wallet.d.ts +37 -0
  485. package/dist/internal/Wallet.d.ts.map +1 -0
  486. package/dist/internal/Wallet.js +43 -0
  487. package/dist/internal/Wallet.js.map +1 -0
  488. package/dist/worker.d.ts +12 -0
  489. package/dist/worker.d.ts.map +1 -0
  490. package/dist/worker.js +12 -0
  491. package/dist/worker.js.map +1 -0
  492. package/package.json +79 -3
  493. package/src/Api.ts +151 -0
  494. package/src/App.ts +56 -0
  495. package/src/api/account.ts +311 -0
  496. package/src/api/authenticate.ts +1290 -0
  497. package/src/api/authorize.ts +1030 -0
  498. package/src/api/device.ts +874 -0
  499. package/src/api/health.ts +72 -0
  500. package/src/api/lib/AccountStep.ts +335 -0
  501. package/src/api/lib/Auth.ts +134 -0
  502. package/src/api/lib/Consent.ts +339 -0
  503. package/src/api/lib/Cors.ts +107 -0
  504. package/src/api/lib/Database.ts +10 -0
  505. package/src/api/lib/DeviceRequest.ts +265 -0
  506. package/src/api/lib/FirstAccount.ts +90 -0
  507. package/src/api/lib/KeySigner.ts +393 -0
  508. package/src/api/lib/PasskeyLink.ts +162 -0
  509. package/src/api/lib/Session.ts +34 -0
  510. package/src/api/lib/SignInConsent.ts +316 -0
  511. package/src/api/oauth.ts +1282 -0
  512. package/src/api/provider.ts +441 -0
  513. package/src/app/components/Button.tsx +128 -0
  514. package/src/app/components/CodeInput.tsx +186 -0
  515. package/src/app/components/ErrorMessage.tsx +66 -0
  516. package/src/app/components/Grant.tsx +323 -0
  517. package/src/app/components/Input.tsx +48 -0
  518. package/src/app/components/Tooltip.tsx +45 -0
  519. package/src/app/components/icons/BRLA.png +0 -0
  520. package/src/app/components/icons/BRZ.svg +1 -0
  521. package/src/app/components/icons/CHFAU.png +0 -0
  522. package/src/app/components/icons/DLUSD.png +0 -0
  523. package/src/app/components/icons/EURAU.svg +1 -0
  524. package/src/app/components/icons/EURC.e.svg +1 -0
  525. package/src/app/components/icons/GBPA.svg +4 -0
  526. package/src/app/components/icons/GUSD.svg +1 -0
  527. package/src/app/components/icons/MACH.svg +4 -0
  528. package/src/app/components/icons/OUSD.svg +5 -0
  529. package/src/app/components/icons/PRIME.svg +14 -0
  530. package/src/app/components/icons/SBC.svg +1 -0
  531. package/src/app/components/icons/SEKAU.svg +5 -0
  532. package/src/app/components/icons/USD1.svg +30 -0
  533. package/src/app/components/icons/USDB.svg +11 -0
  534. package/src/app/components/icons/USDC.e.svg +1 -0
  535. package/src/app/components/icons/USDT0.svg +1 -0
  536. package/src/app/components/icons/USDY.svg +16 -0
  537. package/src/app/components/icons/USDe.svg +1 -0
  538. package/src/app/components/icons/YLDS.svg +3 -0
  539. package/src/app/components/icons/alphaUSD.svg +1 -0
  540. package/src/app/components/icons/betaUSD.svg +1 -0
  541. package/src/app/components/icons/cUSD.svg +1 -0
  542. package/src/app/components/icons/cbBTC.svg +1 -0
  543. package/src/app/components/icons/frxUSD.svg +1 -0
  544. package/src/app/components/icons/goUSD.svg +5 -0
  545. package/src/app/components/icons/iUSD.svg +1 -0
  546. package/src/app/components/icons/pathUSD.svg +25 -0
  547. package/src/app/components/icons/rUSD.svg +1 -0
  548. package/src/app/components/icons/reUSD.svg +1 -0
  549. package/src/app/components/icons/sUSDe.svg +1 -0
  550. package/src/app/components/icons/siUSD.svg +1 -0
  551. package/src/app/components/icons/stcUSD.svg +1 -0
  552. package/src/app/components/icons/syrupUSDC.svg +5 -0
  553. package/src/app/components/icons/thetaUSD.svg +1 -0
  554. package/src/app/components/icons/wYLDS.svg +10 -0
  555. package/src/app/components/icons/wsrUSD.svg +1 -0
  556. package/src/app/components/logos/OUSD.dark.svg +17 -0
  557. package/src/app/components/logos/OUSD.light.svg +17 -0
  558. package/src/app/crons/cleanup.ts +42 -0
  559. package/src/app/db/auth.ts +416 -0
  560. package/src/app/db/migrations/0000_better_auth.sql +53 -0
  561. package/src/app/db/migrations/0001_oauth_provider.sql +162 -0
  562. package/src/app/db/migrations/0002_device_code.sql +17 -0
  563. package/src/app/db/migrations/0003_realms.sql +27 -0
  564. package/src/app/db/migrations/0004_default_realm.sql +2 -0
  565. package/src/app/db/migrations/0005_passkeys.sql +30 -0
  566. package/src/app/db/migrations/0006_first_accounts.sql +9 -0
  567. package/src/app/db/migrations/0007_pending_keys.sql +13 -0
  568. package/src/app/db/migrations/0008_secp256k1_owners.sql +18 -0
  569. package/src/app/db/migrations/0009_device_requests.sql +8 -0
  570. package/src/app/db/migrations/0010_device_keys.sql +4 -0
  571. package/src/app/db/migrations/meta/0000_snapshot.json +362 -0
  572. package/src/app/db/migrations/meta/0001_snapshot.json +1487 -0
  573. package/src/app/db/migrations/meta/0002_snapshot.json +1603 -0
  574. package/src/app/db/migrations/meta/0003_snapshot.json +1760 -0
  575. package/src/app/db/migrations/meta/0004_snapshot.json +1760 -0
  576. package/src/app/db/migrations/meta/0005_snapshot.json +1911 -0
  577. package/src/app/db/migrations/meta/0006_snapshot.json +1967 -0
  578. package/src/app/db/migrations/meta/0007_snapshot.json +2047 -0
  579. package/src/app/db/migrations/meta/0008_snapshot.json +2157 -0
  580. package/src/app/db/migrations/meta/0009_snapshot.json +2207 -0
  581. package/src/app/db/migrations/meta/0010_snapshot.json +2231 -0
  582. package/src/app/db/migrations/meta/_journal.json +83 -0
  583. package/src/app/db/schema.ts +218 -0
  584. package/src/app/env.ts +49 -0
  585. package/src/app/lib/Client.ts +82 -0
  586. package/src/app/lib/Loader.ts +24 -0
  587. package/src/app/package.json +8 -0
  588. package/src/app/routeTree.gen.ts +198 -0
  589. package/src/app/router.tsx +48 -0
  590. package/src/app/routes/[_].flows.tsx +3001 -0
  591. package/src/app/routes/__root.tsx +91 -0
  592. package/src/app/routes/authorize.tsx +197 -0
  593. package/src/app/routes/choose-account.tsx +111 -0
  594. package/src/app/routes/deposit.tsx +105 -0
  595. package/src/app/routes/device.tsx +227 -0
  596. package/src/app/routes/index.tsx +115 -0
  597. package/src/app/routes/login.tsx +506 -0
  598. package/src/app/screens/Account.tsx +347 -0
  599. package/src/app/screens/Approval.tsx +276 -0
  600. package/src/app/screens/ChooseAccount.tsx +240 -0
  601. package/src/app/screens/Deposit.tsx +762 -0
  602. package/src/app/screens/DeviceApproval.tsx +480 -0
  603. package/src/app/screens/SignIn.tsx +362 -0
  604. package/src/app/screens/chains/base.svg +3 -0
  605. package/src/app/screens/chains/ethereum.svg +11 -0
  606. package/src/app/screens/chains/solana.svg +4 -0
  607. package/src/app/screens/chains/tempo.svg +4 -0
  608. package/src/app/server.ts +204 -0
  609. package/src/app/vite.config.ts +95 -0
  610. package/src/app/void.config.ts +29 -0
  611. package/src/app/zyzz.config.ts +274 -0
  612. package/src/cli/Admin.ts +73 -0
  613. package/src/cli/Apps.ts +29 -0
  614. package/src/cli/Cli.ts +42 -0
  615. package/src/cli/Project.ts +117 -0
  616. package/src/cli/Realms.ts +50 -0
  617. package/src/cli/Session.ts +239 -0
  618. package/src/cli/User.ts +45 -0
  619. package/src/cli/V1.ts +57 -0
  620. package/src/cli/bin.ts +44 -0
  621. package/src/cli/commands/admin/apps/create.ts +101 -0
  622. package/src/cli/commands/admin/apps/delete.ts +38 -0
  623. package/src/cli/commands/admin/apps/index.ts +15 -0
  624. package/src/cli/commands/admin/apps/list.ts +25 -0
  625. package/src/cli/commands/admin/apps/rotate-secret.ts +47 -0
  626. package/src/cli/commands/admin/apps/update.ts +86 -0
  627. package/src/cli/commands/admin/index.ts +14 -0
  628. package/src/cli/commands/admin/migrate.ts +16 -0
  629. package/src/cli/commands/admin/realms/add.ts +40 -0
  630. package/src/cli/commands/admin/realms/index.ts +14 -0
  631. package/src/cli/commands/admin/realms/list.ts +38 -0
  632. package/src/cli/commands/admin/realms/passkeys/index.ts +15 -0
  633. package/src/cli/commands/admin/realms/passkeys/set.ts +44 -0
  634. package/src/cli/commands/admin/realms/privy/index.ts +14 -0
  635. package/src/cli/commands/admin/realms/privy/set.ts +69 -0
  636. package/src/cli/commands/admin/realms/remove.ts +33 -0
  637. package/src/cli/commands/admin/realms/secp256k1/disable.ts +40 -0
  638. package/src/cli/commands/admin/realms/secp256k1/enable.ts +40 -0
  639. package/src/cli/commands/admin/realms/secp256k1/index.ts +19 -0
  640. package/src/cli/commands/admin/realms/set.ts +46 -0
  641. package/src/cli/commands/admin/rotate-key.ts +47 -0
  642. package/src/cli/commands/init.ts +42 -0
  643. package/src/cli/commands/login.ts +32 -0
  644. package/src/cli/commands/logout.ts +19 -0
  645. package/src/cli/commands/whoami.ts +23 -0
  646. package/src/client/Actions.ts +168 -0
  647. package/src/client/Auth.ts +285 -0
  648. package/src/client/Authorization.ts +34 -0
  649. package/src/client/Decorator.ts +410 -0
  650. package/src/client/Key.ts +140 -0
  651. package/src/client/Pending.ts +46 -0
  652. package/src/client/Permissions.ts +39 -0
  653. package/src/client/Provider.ts +18 -0
  654. package/src/client/Step.ts +24 -0
  655. package/src/client/Storage.ts +29 -0
  656. package/src/client/TempoAccount.ts +42 -0
  657. package/src/client/Tokens.ts +27 -0
  658. package/src/client/User.ts +23 -0
  659. package/src/client/actions/account.ts +57 -0
  660. package/src/client/actions/device.ts +151 -0
  661. package/src/client/actions/email.ts +141 -0
  662. package/src/client/actions/oauth.ts +182 -0
  663. package/src/client/actions/passkey.ts +141 -0
  664. package/src/client/actions/provider.ts +70 -0
  665. package/src/client/actions/realm.ts +36 -0
  666. package/src/client/actions/redirect.ts +408 -0
  667. package/src/client/internal/accessKey.ts +54 -0
  668. package/src/client/internal/account.ts +15 -0
  669. package/src/client/internal/api.ts +224 -0
  670. package/src/client/internal/headless.ts +77 -0
  671. package/src/client/internal/indexedDb.ts +44 -0
  672. package/src/client/internal/request.ts +71 -0
  673. package/src/client/internal/store.ts +20 -0
  674. package/src/client.ts +19 -0
  675. package/src/index.ts +6 -0
  676. package/src/internal/Apps.ts +718 -0
  677. package/src/internal/Auth.ts +203 -0
  678. package/src/internal/Authorize.ts +424 -0
  679. package/src/internal/Balance.ts +168 -0
  680. package/src/internal/BodyLimit.ts +36 -0
  681. package/src/internal/Chain.ts +16 -0
  682. package/src/internal/Device.ts +469 -0
  683. package/src/internal/Env.ts +58 -0
  684. package/src/internal/ErrorResponse.ts +854 -0
  685. package/src/internal/Id.ts +41 -0
  686. package/src/internal/KeyAuthorization.ts +1339 -0
  687. package/src/internal/Limits.ts +39 -0
  688. package/src/internal/Log.ts +178 -0
  689. package/src/internal/LogLine.ts +87 -0
  690. package/src/internal/Logout.ts +336 -0
  691. package/src/internal/Migrations.ts +86 -0
  692. package/src/internal/OpenApi.ts +300 -0
  693. package/src/internal/Owner.ts +211 -0
  694. package/src/internal/Passkey.ts +1052 -0
  695. package/src/internal/PendingKey.ts +104 -0
  696. package/src/internal/Privy.ts +402 -0
  697. package/src/internal/Provider.ts +125 -0
  698. package/src/internal/RateLimit.ts +259 -0
  699. package/src/internal/Realm.ts +768 -0
  700. package/src/internal/RequestId.ts +118 -0
  701. package/src/internal/SignInGrant.ts +168 -0
  702. package/src/internal/SigningKey.ts +286 -0
  703. package/src/internal/TempoAccount.ts +342 -0
  704. package/src/internal/TestInbox.ts +51 -0
  705. package/src/internal/Timing.ts +158 -0
  706. package/src/internal/Validation.ts +52 -0
  707. package/src/internal/Wallet.ts +62 -0
  708. package/src/internal/owners/Passkey.ts +72 -0
  709. package/src/internal/owners/Privy.ts +81 -0
  710. package/src/internal/owners/Secp256k1.ts +143 -0
  711. package/src/types/app.d.ts +19 -0
  712. package/src/worker.ts +11 -0
@@ -0,0 +1,854 @@
1
+ /**
2
+ * OAuth error responses ([RFC 6749 §5.2](https://www.rfc-editor.org/rfc/rfc6749#section-5.2)):
3
+ * `error`, `error_description`, and `error_uri`, with extension members apps can branch on. OAuth
4
+ * clients ignore members they do not recognize. Every refusal names a `reason`, and each reason
5
+ * has exactly one `error` and one HTTP status, so a reason fully determines the response.
6
+ * @module
7
+ */
8
+ import type { Context, TypedResponse } from 'hono'
9
+ import { HTTPException } from 'hono/http-exception'
10
+ import type { ContentfulStatusCode } from 'hono/utils/http-status'
11
+ import type { JSONParsed } from 'hono/utils/types'
12
+ import * as z from 'zod'
13
+ import * as Log from './Log.js'
14
+
15
+ /** The page that explains each `reason`, for `error_uri`. */
16
+ const docs = 'https://github.com/tempoxyz/auth/blob/main/docs/errors.md'
17
+
18
+ /**
19
+ * Every refusal Tempo ID returns, by `reason`: its OAuth `error` code, its HTTP status, and what it
20
+ * means. `docs/errors.md` explains each one.
21
+ */
22
+ export const reasons = {
23
+ already_decided: {
24
+ description: 'The user code was already approved or denied.',
25
+ error: 'invalid_request',
26
+ status: 409,
27
+ },
28
+ approval_pending: {
29
+ description: 'The user has not decided the device code yet.',
30
+ error: 'authorization_pending',
31
+ status: 400,
32
+ },
33
+ authorization_expired: {
34
+ description:
35
+ "The app's authorization request that sign-in or the approval page continues is forged or expired.",
36
+ error: 'invalid_request',
37
+ status: 400,
38
+ },
39
+ body_too_large: {
40
+ description: 'The request body exceeds 64 KiB.',
41
+ error: 'invalid_request',
42
+ status: 413,
43
+ },
44
+ challenge_not_permitted: {
45
+ description:
46
+ 'A request carries a challenge, and its app lacks the `tempo-id:sign` scope.',
47
+ error: 'unauthorized_client',
48
+ status: 403,
49
+ },
50
+ cross_site_request: {
51
+ description: 'A form or body-less write came from another site.',
52
+ error: 'access_denied',
53
+ status: 403,
54
+ },
55
+ device_code_expired: {
56
+ description: 'The device code is unknown, expired, or already redeemed.',
57
+ error: 'expired_token',
58
+ status: 400,
59
+ },
60
+ duplicate_limit: {
61
+ description: 'Two limits name the same token.',
62
+ error: 'invalid_authorization_details',
63
+ status: 400,
64
+ },
65
+ duplicate_scope: {
66
+ description: 'Two scopes name the same call on one token.',
67
+ error: 'invalid_authorization_details',
68
+ status: 400,
69
+ },
70
+ empty_limits: {
71
+ description: '`limits` is an empty list.',
72
+ error: 'invalid_authorization_details',
73
+ status: 400,
74
+ },
75
+ empty_scopes: {
76
+ description: '`scopes` is an empty list.',
77
+ error: 'invalid_authorization_details',
78
+ status: 400,
79
+ },
80
+ expiry_exceeds_maximum: {
81
+ description: 'A headless key lasts longer than a year.',
82
+ error: 'invalid_authorization_details',
83
+ status: 403,
84
+ },
85
+ expiry_passed: {
86
+ description: 'The key expiry has passed.',
87
+ error: 'invalid_authorization_details',
88
+ status: 400,
89
+ },
90
+ foreign_account: {
91
+ description:
92
+ "The request names a Tempo Account that is not the user's in the app's realms.",
93
+ error: 'access_denied',
94
+ status: 403,
95
+ },
96
+ invalid_chain: {
97
+ description: 'The key chain ID is 0.',
98
+ error: 'invalid_authorization_details',
99
+ status: 400,
100
+ },
101
+ invalid_code: {
102
+ description: 'The emailed code is wrong or expired.',
103
+ error: 'invalid_grant',
104
+ status: 401,
105
+ },
106
+ invalid_expiry: {
107
+ description: 'The key expiry is 0, which never expires.',
108
+ error: 'invalid_authorization_details',
109
+ status: 400,
110
+ },
111
+ invalid_field: {
112
+ description: 'A field is missing or malformed.',
113
+ error: 'invalid_request',
114
+ status: 400,
115
+ },
116
+ invalid_id_token_hint: {
117
+ description:
118
+ 'The ID token hint is not an ID token that Tempo ID signed for the app.',
119
+ error: 'invalid_request',
120
+ status: 400,
121
+ },
122
+ invalid_origin: {
123
+ description:
124
+ 'A headless request came from an origin its redirect URI does not allow.',
125
+ error: 'unauthorized_client',
126
+ status: 403,
127
+ },
128
+ invalid_period: {
129
+ description: "A limit's `period` is not a whole number of seconds.",
130
+ error: 'invalid_authorization_details',
131
+ status: 400,
132
+ },
133
+ invalid_public_key: {
134
+ description: 'The key public key is not a valid point.',
135
+ error: 'invalid_authorization_details',
136
+ status: 400,
137
+ },
138
+ invalid_recipients: {
139
+ description:
140
+ "A scope's `recipients` names the zero address, or one address twice.",
141
+ error: 'invalid_authorization_details',
142
+ status: 400,
143
+ },
144
+ limit_exceeds_maximum: {
145
+ description: 'A headless key limit exceeds the token’s ceiling.',
146
+ error: 'invalid_authorization_details',
147
+ status: 403,
148
+ },
149
+ logout_not_permitted: {
150
+ description:
151
+ 'The app that the ID token hint names may not end the session at the end-session endpoint.',
152
+ error: 'unauthorized_client',
153
+ status: 403,
154
+ },
155
+ malformed_body: {
156
+ description: 'The request body is not valid JSON.',
157
+ error: 'invalid_request',
158
+ status: 400,
159
+ },
160
+ missing_key: {
161
+ description: 'The key authorization names no key.',
162
+ error: 'invalid_authorization_details',
163
+ status: 400,
164
+ },
165
+ missing_recipients: {
166
+ description: 'An `approve` scope names no spenders.',
167
+ error: 'invalid_authorization_details',
168
+ status: 400,
169
+ },
170
+ passkey_link_expired: {
171
+ description:
172
+ "The email step's link to a wallet.tempo passkey expired, or the browser holds no link for it.",
173
+ error: 'invalid_request',
174
+ status: 400,
175
+ },
176
+ passkey_not_permitted: {
177
+ description:
178
+ 'A passkey sign-in names an app, or reaches a realm, that holds no passkeys for Tempo ID.',
179
+ error: 'unauthorized_client',
180
+ status: 403,
181
+ },
182
+ polling_too_fast: {
183
+ description: 'The device polled before its interval passed.',
184
+ error: 'slow_down',
185
+ status: 400,
186
+ },
187
+ post_logout_redirect_not_permitted: {
188
+ description:
189
+ 'The post-logout redirect URI is not one of the post-logout redirect URIs the app registered.',
190
+ error: 'invalid_request',
191
+ status: 400,
192
+ },
193
+ rate_limited: {
194
+ description:
195
+ 'Tempo ID, or a service it depends on, is rate limiting the request.',
196
+ error: 'temporarily_unavailable',
197
+ status: 429,
198
+ },
199
+ rejected: {
200
+ description: 'The issuer refused the authorization request.',
201
+ error: 'invalid_request',
202
+ status: 400,
203
+ },
204
+ request_denied: {
205
+ description: 'The user denied the device code.',
206
+ error: 'access_denied',
207
+ status: 400,
208
+ },
209
+ return_to_not_permitted: {
210
+ description:
211
+ "The page that a provider sign-in returns to is on neither Tempo ID's origin nor the app's.",
212
+ error: 'invalid_request',
213
+ status: 400,
214
+ },
215
+ scope_without_limit: {
216
+ description: 'A scope calls a token no limit names.',
217
+ error: 'invalid_authorization_details',
218
+ status: 400,
219
+ },
220
+ session_changed: {
221
+ description:
222
+ 'The signed-in session differs from the one that the approval page showed.',
223
+ error: 'invalid_request',
224
+ status: 409,
225
+ },
226
+ session_required: {
227
+ description: 'The request needs a signed-in session.',
228
+ error: 'login_required',
229
+ status: 401,
230
+ },
231
+ unexpected: {
232
+ description: 'An unexpected failure.',
233
+ error: 'server_error',
234
+ status: 500,
235
+ },
236
+ unknown_code: {
237
+ description: 'The user code is wrong or expired.',
238
+ error: 'invalid_request',
239
+ status: 404,
240
+ },
241
+ unknown_endpoint: {
242
+ description: 'No API endpoint matches this method and path.',
243
+ error: 'invalid_request',
244
+ status: 404,
245
+ },
246
+ unknown_provider: {
247
+ description: 'The sign-in names a provider that Tempo ID does not offer.',
248
+ error: 'invalid_request',
249
+ status: 404,
250
+ },
251
+ unsupported_call: {
252
+ description: 'A scope calls a function a key may not call.',
253
+ error: 'invalid_authorization_details',
254
+ status: 400,
255
+ },
256
+ unsupported_token: {
257
+ description: 'A limit names a token that is not supported on the chain.',
258
+ error: 'invalid_authorization_details',
259
+ status: 400,
260
+ },
261
+ upstream_unavailable: {
262
+ description: 'A service Tempo ID depends on failed or did not respond.',
263
+ error: 'temporarily_unavailable',
264
+ status: 503,
265
+ },
266
+ webauthn_rejected: {
267
+ description:
268
+ 'A passkey ceremony failed: its challenge is unknown, spent, or expired, or its response does not verify.',
269
+ error: 'access_denied',
270
+ status: 401,
271
+ },
272
+ webauthn_required: {
273
+ description:
274
+ 'A request without a page names a Tempo Account whose passkey signs only on a Tempo ID page.',
275
+ error: 'interaction_required',
276
+ status: 403,
277
+ },
278
+ } as const satisfies Record<
279
+ string,
280
+ { description: string; error: string; status: ContentfulStatusCode }
281
+ >
282
+
283
+ /** Each refusal's stable name. */
284
+ export type Reason = keyof typeof reasons
285
+
286
+ /** The OAuth error code of a refusal. */
287
+ export type Code = (typeof reasons)[Reason]['error']
288
+
289
+ /** The HTTP status of `reason`. */
290
+ export type Status<reason extends Reason = Reason> =
291
+ (typeof reasons)[reason]['status']
292
+
293
+ /** An OAuth error response for `reason`, as its schema reads it. */
294
+ export type ErrorResponse<reason extends Reason = Reason> =
295
+ reason extends Reason
296
+ ? Omit<z.output<typeof schema.base>, 'error' | 'reason'> & {
297
+ /** The OAuth error code, which `reason` determines. */
298
+ error: (typeof reasons)[reason]['error']
299
+ /** A stable name for the refusal, for apps to branch on. */
300
+ reason: reason
301
+ }
302
+ : never
303
+
304
+ /** The JSON response `json` returns for `reason`. One per reason, so each keeps its status. */
305
+ export type Json<reason extends Reason> = reason extends Reason
306
+ ? Response &
307
+ TypedResponse<JSONParsed<ErrorResponse<reason>>, Status<reason>, 'json'>
308
+ : never
309
+
310
+ /** A refusal's class, which `fn.errors` lists. Its static `reason` names the refusal. */
311
+ export type Class = (abstract new (...args: never[]) => ResponseError) & {
312
+ /** The reason of every refusal the class constructs. */
313
+ readonly reason: Reason
314
+ }
315
+
316
+ /** An instance of one of the classes in `errors`: the return type of a function returning refusals. */
317
+ export type Instance<errors extends readonly Class[]> = InstanceType<
318
+ errors[number]
319
+ >
320
+
321
+ /**
322
+ * A refusal, which a function returns or throws. `json` responds with a returned one, and `handle`
323
+ * with a thrown one. Each refusal is a subclass that {@link define} makes, so its reason is written
324
+ * once.
325
+ */
326
+ export class ResponseError<
327
+ reason extends Reason = Reason,
328
+ > extends HTTPException {
329
+ override readonly name: string = 'ErrorResponse.ResponseError'
330
+ /** The error response the refusal sends. */
331
+ readonly response: ErrorResponse<reason>
332
+
333
+ constructor(response: ErrorResponse<reason>) {
334
+ const status = reasons[response.reason].status
335
+ super(status, { res: Response.json(response, { status }) })
336
+ this.response = response
337
+ }
338
+ }
339
+
340
+ /**
341
+ * Returns the base class of `reason`'s refusals, whose static `reason` is `reason`. The module that
342
+ * returns or throws a refusal declares it as a subclass, such as
343
+ * `class InvalidCodeError extends ErrorResponse.define('invalid_code') {}`, and lists the class in
344
+ * its `fn.errors`.
345
+ */
346
+ export function define<const reason extends Reason>(reason: reason) {
347
+ return class extends ResponseError<reason> {
348
+ static readonly reason = reason
349
+
350
+ constructor(options: define.Options) {
351
+ super(from({ ...options, reason }))
352
+ }
353
+ }
354
+ }
355
+
356
+ export declare namespace define {
357
+ type Options = Omit<from.Value<Reason>, 'reason'>
358
+ }
359
+
360
+ /**
361
+ * A form or body-less write came from another site, which `csrf()` refuses, or a cross-site read of
362
+ * `GET /v1/account`.
363
+ */
364
+ export class CrossSiteRequestError extends define('cross_site_request') {
365
+ override readonly name = 'ErrorResponse.CrossSiteRequestError'
366
+
367
+ constructor() {
368
+ super({
369
+ error_description:
370
+ 'Cross-site request refused. Send JSON from an allowed origin.',
371
+ })
372
+ }
373
+ }
374
+
375
+ /** The body is not valid JSON, which Hono's body validator refuses. */
376
+ export class MalformedBodyError extends define('malformed_body') {
377
+ override readonly name = 'ErrorResponse.MalformedBodyError'
378
+
379
+ constructor() {
380
+ super({
381
+ error_description:
382
+ 'Malformed request body. Send a JSON object with `Content-Type: application/json`.',
383
+ })
384
+ }
385
+ }
386
+
387
+ /** A service Tempo ID depends on, such as Privy, is rate limiting it. */
388
+ export class RateLimitedError extends define('rate_limited') {
389
+ override readonly name = 'ErrorResponse.RateLimitedError'
390
+ /** The wait in seconds that the service requested, which `handle` sends as `Retry-After`. */
391
+ readonly retryAfter: number | undefined
392
+
393
+ constructor(options: RateLimitedError.Options = {}) {
394
+ const { retryAfter } = options
395
+ super({
396
+ error_description: `Rate limited by an upstream service. Retry ${retryAfter ? `after ${retryAfter} seconds` : 'later'}.`,
397
+ ...(retryAfter ? { meta: { retryAfter } } : {}),
398
+ })
399
+ this.retryAfter = retryAfter
400
+ }
401
+ }
402
+
403
+ export declare namespace RateLimitedError {
404
+ type Options = {
405
+ /** The wait in seconds that the service requested. */
406
+ retryAfter?: number | undefined
407
+ }
408
+ }
409
+
410
+ /** An unexpected failure, which `handle` logs. */
411
+ export class UnexpectedError extends define('unexpected') {
412
+ override readonly name = 'ErrorResponse.UnexpectedError'
413
+
414
+ constructor() {
415
+ super({ error_description: 'Unexpected error. Try again.' })
416
+ }
417
+ }
418
+
419
+ /** No API route matches the method and path. */
420
+ export class UnknownEndpointError extends define('unknown_endpoint') {
421
+ override readonly name = 'ErrorResponse.UnknownEndpointError'
422
+
423
+ constructor() {
424
+ // The path is the caller's, and may carry a misplaced credential, so it is not echoed.
425
+ super({
426
+ error_description:
427
+ 'Unknown endpoint. Check the method and path against the API reference at /openapi.json.',
428
+ })
429
+ }
430
+ }
431
+
432
+ /** A service Tempo ID depends on, such as Privy, failed or did not respond. */
433
+ export class UpstreamUnavailableError extends define('upstream_unavailable') {
434
+ override readonly name = 'ErrorResponse.UpstreamUnavailableError'
435
+
436
+ constructor() {
437
+ super({
438
+ error_description: 'An upstream service is unavailable. Retry later.',
439
+ })
440
+ }
441
+ }
442
+
443
+ /** Zod schemas for every error response, which the OpenAPI document reads. */
444
+ export namespace schema {
445
+ /** The members every error response has. */
446
+ export const base = z.object({
447
+ error: z.string().meta({
448
+ description:
449
+ 'The OAuth error code (RFC 6749, OIDC Core, RFC 8628, RFC 9396), which `reason` determines.',
450
+ }),
451
+ error_description: z.string().meta({
452
+ description:
453
+ 'What went wrong and how to fix it, for people. Its wording may change.',
454
+ }),
455
+ error_uri: z.url().meta({
456
+ description: 'The errors page, at the refusal’s `reason`.',
457
+ }),
458
+ field: z.string().optional().meta({
459
+ description: 'Extension: the request field at fault, as a dotted path.',
460
+ }),
461
+ meta: z
462
+ .record(z.string(), z.union([z.number(), z.string()]))
463
+ .readonly()
464
+ .optional()
465
+ .meta({
466
+ description:
467
+ 'Extension: the values the refusal compared. Base units are decimal strings.',
468
+ }),
469
+ reason: z.string().meta({
470
+ description: 'Extension: a stable name for the refusal, to branch on.',
471
+ }),
472
+ request_id: z.string().optional().meta({
473
+ description:
474
+ 'Extension: the request ID, which `X-Request-Id` also carries. The Worker adds it to every error response.',
475
+ }),
476
+ })
477
+
478
+ /**
479
+ * Each reason's example `error_description`, and its `field` when the refusal names one. The
480
+ * OpenAPI document shows them, so they hold no real account, app, or origin.
481
+ */
482
+ const examples: Record<
483
+ Reason,
484
+ { error_description: string; field?: string | undefined }
485
+ > = {
486
+ already_decided: {
487
+ error_description: 'Code already approved or denied.',
488
+ field: 'code',
489
+ },
490
+ approval_pending: {
491
+ error_description:
492
+ 'Approval pending. Poll again after `interval` seconds.',
493
+ },
494
+ authorization_expired: {
495
+ error_description:
496
+ 'Expired authorization request: the request from the app is no longer valid. Return to the app, and start again.',
497
+ field: 'oauth_query',
498
+ },
499
+ body_too_large: {
500
+ error_description:
501
+ 'Invalid request body: exceeds the 65536-byte maximum. Send a body of 65536 bytes or fewer.',
502
+ },
503
+ challenge_not_permitted: {
504
+ error_description:
505
+ 'Challenge not permitted: the app lacks the `tempo-id:sign` scope. Remove `challenge`, or grant the app the scope.',
506
+ field: 'challenge',
507
+ },
508
+ cross_site_request: {
509
+ error_description:
510
+ 'Cross-site request refused. Send JSON from an allowed origin.',
511
+ },
512
+ device_code_expired: {
513
+ error_description: 'Device code expired. Request a new code.',
514
+ },
515
+ duplicate_limit: {
516
+ error_description:
517
+ 'Duplicate limit for 0x20c0000000000000000000000000000000000001. Limit each token once.',
518
+ field: 'key_authorization.limits.1.token',
519
+ },
520
+ duplicate_scope: {
521
+ error_description:
522
+ 'Duplicate scope for 0xa9059cbb on OUSD. Name each call on a token once.',
523
+ field: 'key_authorization.scopes.1.selector',
524
+ },
525
+ empty_limits: {
526
+ error_description:
527
+ 'Empty `limits`. Name at least one token, or omit `limits`.',
528
+ field: 'key_authorization.limits',
529
+ },
530
+ empty_scopes: {
531
+ error_description:
532
+ 'Empty `scopes`. Name at least one call, or omit `scopes`.',
533
+ field: 'key_authorization.scopes',
534
+ },
535
+ expiry_exceeds_maximum: {
536
+ error_description:
537
+ 'Invalid `expiry`: Sat, 01 Jan 2028 00:00:00 GMT exceeds the one-year maximum. Use an earlier expiry, or authorize through a redirect or device grant.',
538
+ field: 'key_authorization.expiry',
539
+ },
540
+ expiry_passed: {
541
+ error_description:
542
+ 'Invalid `expiry`: Wed, 01 Jan 2025 00:00:00 GMT has passed. Use a future Unix time.',
543
+ field: 'key_authorization.expiry',
544
+ },
545
+ foreign_account: {
546
+ error_description:
547
+ "Access denied to Tempo Account 0x8C3b5d0e2A4f6B1c9D7e3F5a0B2c4D6e8F1a3B5c. Name one of the user's accounts in the app's realms.",
548
+ field: 'account',
549
+ },
550
+ invalid_chain: {
551
+ error_description:
552
+ 'Invalid `chainId`: 0. Use a Tempo chain ID, such as 4217.',
553
+ field: 'key_authorization.chainId',
554
+ },
555
+ invalid_code: {
556
+ error_description: 'Invalid or expired code. Request a new one.',
557
+ field: 'code',
558
+ },
559
+ invalid_expiry: {
560
+ error_description:
561
+ 'Invalid `expiry`: 0 never expires. Use a future Unix time.',
562
+ field: 'key_authorization.expiry',
563
+ },
564
+ invalid_field: {
565
+ error_description: 'Invalid request. `email`: Invalid email address.',
566
+ field: 'email',
567
+ },
568
+ invalid_id_token_hint: {
569
+ error_description:
570
+ 'Invalid id_token_hint: it is not an ID token that this issuer signed for the app. Send the ID token that the app received at sign-in.',
571
+ field: 'id_token_hint',
572
+ },
573
+ invalid_origin: {
574
+ error_description:
575
+ 'Invalid `Origin`: https://other.example.com. Requests for this redirect URI must come from https://app.example.com.',
576
+ field: 'Origin',
577
+ },
578
+ invalid_period: {
579
+ error_description:
580
+ 'Invalid `period` on the OUSD limit: 1.5. Use a whole number of seconds, or 0 for a one-time limit.',
581
+ field: 'key_authorization.limits.0.period',
582
+ },
583
+ invalid_public_key: {
584
+ error_description:
585
+ 'Invalid `publicKey`. Provide an uncompressed public key, or `address`.',
586
+ field: 'key_authorization.publicKey',
587
+ },
588
+ invalid_recipients: {
589
+ error_description:
590
+ 'Invalid recipient 0x0000000000000000000000000000000000000000 for 0x095ea7b3 on OUSD. Name each recipient once, and never the zero address.',
591
+ field: 'key_authorization.scopes.0.recipients.0',
592
+ },
593
+ limit_exceeds_maximum: {
594
+ error_description:
595
+ 'Invalid OUSD limit: 5000 exceeds the 1000 maximum. Lower the limit, or authorize through a redirect or device grant.',
596
+ field: 'key_authorization.limits.0.limit',
597
+ },
598
+ logout_not_permitted: {
599
+ error_description:
600
+ 'Logout not permitted: the app client_01JZ8Q6W3N1R5B4V7C2X9K0M3T may not end the session. Register the app for logout, then retry.',
601
+ },
602
+ malformed_body: {
603
+ error_description:
604
+ 'Malformed request body. Send a JSON object with `Content-Type: application/json`.',
605
+ },
606
+ missing_key: {
607
+ error_description:
608
+ 'Missing `address` or `publicKey`. Provide the access key.',
609
+ field: 'key_authorization.address',
610
+ },
611
+ missing_recipients: {
612
+ error_description:
613
+ 'Missing `recipients` for `approve` on OUSD. Name the allowed spenders.',
614
+ field: 'key_authorization.scopes.0.recipients',
615
+ },
616
+ passkey_link_expired: {
617
+ error_description:
618
+ 'Expired passkey sign-in: the link from the passkey step is no longer valid. Enter the code again to sign in with email only, or sign in with the passkey again.',
619
+ field: 'link',
620
+ },
621
+ passkey_not_permitted: {
622
+ error_description:
623
+ 'Passkey not permitted: the app client_01JZ8Q6W3N1R5B4V7C2X9K0M3T holds no passkeys. Sign in with an emailed code.',
624
+ },
625
+ polling_too_fast: {
626
+ error_description: 'Polling too fast. Add 5 seconds to `interval`.',
627
+ },
628
+ post_logout_redirect_not_permitted: {
629
+ error_description:
630
+ 'Invalid post_logout_redirect_uri: https://app.example/elsewhere is not registered for the app. Use one of its post-logout redirect URIs, or leave it out.',
631
+ field: 'post_logout_redirect_uri',
632
+ },
633
+ rate_limited: {
634
+ error_description: 'Too many requests. Retry after 30 seconds.',
635
+ },
636
+ rejected: {
637
+ error_description:
638
+ "Authorization request rejected. Check `client_id`, `redirect_uri`, and `scope` against the app's registration.",
639
+ },
640
+ request_denied: { error_description: 'The user denied the request.' },
641
+ return_to_not_permitted: {
642
+ error_description:
643
+ "Invalid return_to: https://example.org is not an origin of the app's redirect URIs. Return to a page on one of them, and pass the app's client_id.",
644
+ field: 'return_to',
645
+ },
646
+ scope_without_limit: {
647
+ error_description:
648
+ 'Scope on 0x20c0000000000000000000000000000000000002 has no limit. Add a limit for it, or remove the scope.',
649
+ field: 'key_authorization.scopes.0.address',
650
+ },
651
+ session_changed: {
652
+ error_description:
653
+ 'Changed session: the signed-in account differs from the one that this page showed. Reload the page, and check the account before the decision.',
654
+ field: 'session_id',
655
+ },
656
+ session_required: { error_description: 'Sign in first.' },
657
+ unexpected: { error_description: 'Unexpected error. Try again.' },
658
+ unknown_code: {
659
+ error_description:
660
+ 'Invalid or expired code. Check the code in the terminal.',
661
+ field: 'code',
662
+ },
663
+ unknown_endpoint: {
664
+ error_description:
665
+ 'Unknown endpoint. Check the method and path against the API reference at /openapi.json.',
666
+ },
667
+ unknown_provider: {
668
+ error_description:
669
+ 'Unknown provider: github is not offered. Request GET /v1/auth/providers for the providers offered.',
670
+ field: 'provider',
671
+ },
672
+ unsupported_call: {
673
+ error_description:
674
+ 'Unsupported call on OUSD: any function. Use `transfer`, `transferWithMemo`, or `approve`.',
675
+ field: 'key_authorization.scopes.0.selector',
676
+ },
677
+ unsupported_token: {
678
+ error_description:
679
+ 'Unsupported token on chain 4217: 0x20c00000000000000000000000000000000000ff. Use a supported token, such as OUSD.',
680
+ field: 'key_authorization.limits.0.token',
681
+ },
682
+ upstream_unavailable: {
683
+ error_description: 'An upstream service is unavailable. Retry later.',
684
+ },
685
+ webauthn_rejected: {
686
+ error_description:
687
+ 'Passkey rejected. Request new options, then try again with the same passkey or another one.',
688
+ },
689
+ webauthn_required: {
690
+ error_description:
691
+ 'Passkey required: Tempo Account 0x8C3b5d0e2A4f6B1c9D7e3F5a0B2c4D6e8F1a3B5c signs key authorizations only with its passkey, on a Tempo ID page. Authorize through a redirect, popup, or device grant, or name another account.',
692
+ field: 'key_authorization.account',
693
+ },
694
+ }
695
+
696
+ /** Each reason's schema, which the OpenAPI document lists as a component. */
697
+ const byReason = new Map<Reason, z.ZodType>(
698
+ Object.entries(reasons).map(([reason, definition]) => {
699
+ const example = examples[reason as Reason]
700
+ const extended = base.extend({
701
+ error: z.literal(definition.error).meta(base.shape.error.meta()!),
702
+ error_description: base.shape.error_description.meta({
703
+ ...base.shape.error_description.meta(),
704
+ examples: [example.error_description],
705
+ }),
706
+ error_uri: base.shape.error_uri.meta({
707
+ ...base.shape.error_uri.meta(),
708
+ examples: [`${docs}#${reason}`],
709
+ }),
710
+ reason: z.literal(reason).meta(base.shape.reason.meta()!),
711
+ request_id: base.shape.request_id.meta({
712
+ ...base.shape.request_id.meta(),
713
+ examples: ['8f1c2a3b4d5e6f70-SJC'],
714
+ }),
715
+ })
716
+ // A refusal that names no field never sends one, so its component leaves `field` out.
717
+ const documented = example.field
718
+ ? extended.extend({
719
+ field: base.shape.field.meta({
720
+ ...base.shape.field.meta(),
721
+ examples: [example.field],
722
+ }),
723
+ })
724
+ : extended.omit({ field: true })
725
+ return [
726
+ reason as Reason,
727
+ documented.meta({
728
+ description: `\`${definition.error}\` (${definition.status}): ${definition.description}`,
729
+ id: `ErrorResponse.${reason}`,
730
+ }),
731
+ ]
732
+ }),
733
+ )
734
+
735
+ /** The schema of `reason`'s error response. */
736
+ export function of<const reason extends Reason>(reason: reason) {
737
+ return byReason.get(reason)! as z.ZodType<ErrorResponse<reason>>
738
+ }
739
+ }
740
+
741
+ /**
742
+ * Instantiates an {@link ErrorResponse}, filling `error` from `reason`'s definition and
743
+ * `error_uri` with `reason`'s section of the errors page.
744
+ */
745
+ export function from<const reason extends Reason>(
746
+ value: from.Value<reason>,
747
+ ): ErrorResponse<reason> {
748
+ const { error_description, field, meta, reason } = value
749
+ return {
750
+ error: reasons[reason].error,
751
+ error_description,
752
+ error_uri: `${docs}#${reason}`,
753
+ ...(field ? { field } : {}),
754
+ ...(meta ? { meta } : {}),
755
+ reason,
756
+ } as ErrorResponse<reason>
757
+ }
758
+
759
+ export declare namespace from {
760
+ type Value<reason extends Reason> = {
761
+ /** What went wrong and how to fix it, for people. */
762
+ error_description: string
763
+ /** The request field at fault, as a dotted path. */
764
+ field?: string | undefined
765
+ /** The values the refusal compared. Base units are decimal strings. */
766
+ meta?: Readonly<Record<string, number | string>> | undefined
767
+ /** The refusal, which determines `error` and the status. */
768
+ reason: reason
769
+ }
770
+ }
771
+
772
+ /**
773
+ * Returns the refusal for an upstream service's failure, from the error its SDK threw or the
774
+ * response it sent. The refusal is `rate_limited` for a 429, and `upstream_unavailable` for a 408,
775
+ * a 5xx, a timeout, or a request that received no response. Returns `undefined` for anything else,
776
+ * such as an error Tempo ID throws itself.
777
+ */
778
+ export function fromUpstream(
779
+ failure: Error | Response,
780
+ ): Instance<typeof fromUpstream.errors> | undefined {
781
+ if (failure instanceof HTTPException) return undefined
782
+ // SDKs such as Privy's carry the service's HTTP status on the errors they throw.
783
+ const status = 'status' in failure ? failure.status : undefined
784
+ if (status === 429) {
785
+ const retryAfter = (() => {
786
+ if (failure instanceof Response) {
787
+ // Only the delay-seconds form of `Retry-After` is read. An HTTP date is left out.
788
+ const seconds = Number(failure.headers.get('retry-after'))
789
+ return Number.isInteger(seconds) && seconds > 0 ? seconds : undefined
790
+ }
791
+ return 'retryAfter' in failure && typeof failure.retryAfter === 'number'
792
+ ? failure.retryAfter
793
+ : undefined
794
+ })()
795
+ return new RateLimitedError({ retryAfter })
796
+ }
797
+ // An SDK error whose `status` is present but `undefined` received no response, such as Privy's
798
+ // `APIConnectionTimeoutError` for a timeout or `APIConnectionError` for a dropped connection.
799
+ const unanswered = 'status' in failure && status === undefined
800
+ if (
801
+ (typeof status === 'number' && (status === 408 || status >= 500)) ||
802
+ unanswered ||
803
+ (failure instanceof Error && failure.name === 'TimeoutError')
804
+ )
805
+ return new UpstreamUnavailableError()
806
+ return undefined
807
+ }
808
+
809
+ export namespace fromUpstream {
810
+ /** The refusals `fromUpstream` returns for an upstream service's failure. */
811
+ export const errors = [RateLimitedError, UpstreamUnavailableError] as const
812
+ }
813
+
814
+ /**
815
+ * Maps any error a handler or middleware throws to its documented response:
816
+ *
817
+ * - A {@link ResponseError} maps to its own response.
818
+ * - Hono's malformed body refusal maps to `malformed_body`.
819
+ * - The CSRF check's refusal maps to `cross_site_request`.
820
+ * - An upstream service's failure maps to `rate_limited` or `upstream_unavailable`, and logs a
821
+ * warning.
822
+ * - Anything else maps to `unexpected`, and logs the error.
823
+ */
824
+ export function handle(error: Error, c: Context) {
825
+ if (error instanceof ResponseError) return json(c, error)
826
+ // Hono's body validator refuses unreadable JSON with a bare 400, and `csrf()` with a bare 403.
827
+ if (error instanceof HTTPException && error.status === 400)
828
+ return json(c, new MalformedBodyError())
829
+ if (error instanceof HTTPException && error.status === 403)
830
+ return json(c, new CrossSiteRequestError())
831
+
832
+ const upstream = fromUpstream(error)
833
+ if (upstream) {
834
+ Log.warn(c, { error, message: 'An upstream service refused a request.' })
835
+ return json(c, upstream)
836
+ }
837
+
838
+ Log.error(c, { error, message: 'The API failed a request.' })
839
+ return json(c, new UnexpectedError())
840
+ }
841
+
842
+ /**
843
+ * Returns the response for `error`, at the status its `reason` determines. A `rate_limited` refusal
844
+ * that carries the service's wait also sends it as `Retry-After`.
845
+ */
846
+ export function json<const reason extends Reason>(
847
+ c: Context,
848
+ error: ResponseError<reason>,
849
+ ): Json<reason> {
850
+ const { response } = error
851
+ if (error instanceof RateLimitedError && error.retryAfter)
852
+ c.header('retry-after', String(error.retryAfter))
853
+ return c.json(response, reasons[response.reason].status) as Json<reason>
854
+ }