@volter/twin-clerk 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (321) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +102 -0
  3. package/client/clerk-js-dist/167_clerk.headless_b86dff_5.127.2.js +1 -0
  4. package/client/clerk-js-dist/2172_clerk.browser_0cc2cc_5.127.2.js +1 -0
  5. package/client/clerk-js-dist/2172_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  6. package/client/clerk-js-dist/368_clerk.headless_b86dff_5.127.2.js +3 -0
  7. package/client/clerk-js-dist/377_clerk.headless_b86dff_5.127.2.js +1 -0
  8. package/client/clerk-js-dist/4170_clerk.browser_0cc2cc_5.127.2.js +1 -0
  9. package/client/clerk-js-dist/4170_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  10. package/client/clerk-js-dist/437_clerk.headless_b86dff_5.127.2.js +1 -0
  11. package/client/clerk-js-dist/5192_clerk.browser_0cc2cc_5.127.2.js +1 -0
  12. package/client/clerk-js-dist/5192_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  13. package/client/clerk-js-dist/553_clerk.headless_b86dff_5.127.2.js +1 -0
  14. package/client/clerk-js-dist/5645_clerk.browser_0cc2cc_5.127.2.js +1 -0
  15. package/client/clerk-js-dist/5645_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  16. package/client/clerk-js-dist/623_clerk.headless_b86dff_5.127.2.js +42 -0
  17. package/client/clerk-js-dist/7067_clerk.browser_0cc2cc_5.127.2.js +1 -0
  18. package/client/clerk-js-dist/7067_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  19. package/client/clerk-js-dist/7502_clerk.browser_0cc2cc_5.127.2.js +1 -0
  20. package/client/clerk-js-dist/7502_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  21. package/client/clerk-js-dist/785_clerk.headless.browser_540199_5.127.2.js +1 -0
  22. package/client/clerk-js-dist/785_clerk.headless_b86dff_5.127.2.js +1 -0
  23. package/client/clerk-js-dist/8043_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  24. package/client/clerk-js-dist/825_clerk.headless.browser_540199_5.127.2.js +1 -0
  25. package/client/clerk-js-dist/825_clerk.headless_b86dff_5.127.2.js +1 -0
  26. package/client/clerk-js-dist/890_clerk.headless_b86dff_5.127.2.js +2 -0
  27. package/client/clerk-js-dist/901_clerk.headless.browser_540199_5.127.2.js +1 -0
  28. package/client/clerk-js-dist/apiKeys_clerk.browser_0cc2cc_5.127.2.js +1 -0
  29. package/client/clerk-js-dist/apiKeys_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  30. package/client/clerk-js-dist/base-account-sdk_clerk.browser_0cc2cc_5.127.2.js +42 -0
  31. package/client/clerk-js-dist/base-account-sdk_clerk.headless.browser_540199_5.127.2.js +42 -0
  32. package/client/clerk-js-dist/base-account-sdk_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  33. package/client/clerk-js-dist/blankcaptcha_clerk.browser_0cc2cc_5.127.2.js +1 -0
  34. package/client/clerk-js-dist/blankcaptcha_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  35. package/client/clerk-js-dist/checkout_clerk.browser_0cc2cc_5.127.2.js +9 -0
  36. package/client/clerk-js-dist/checkout_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  37. package/client/clerk-js-dist/clerk.browser.js +19 -0
  38. package/client/clerk-js-dist/clerk.headless.browser.js +19 -0
  39. package/client/clerk-js-dist/clerk.headless.js +19 -0
  40. package/client/clerk-js-dist/clerk.js +809 -0
  41. package/client/clerk-js-dist/clerk.legacy.browser.js +1 -0
  42. package/client/clerk-js-dist/clerk.no-rhc.js +766 -0
  43. package/client/clerk-js-dist/coinbase-wallet-sdk_clerk.browser_0cc2cc_5.127.2.js +3 -0
  44. package/client/clerk-js-dist/coinbase-wallet-sdk_clerk.headless.browser_540199_5.127.2.js +3 -0
  45. package/client/clerk-js-dist/coinbase-wallet-sdk_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  46. package/client/clerk-js-dist/cookieSuffix_clerk.browser_0cc2cc_5.127.2.js +1 -0
  47. package/client/clerk-js-dist/cookieSuffix_clerk.headless.browser_540199_5.127.2.js +1 -0
  48. package/client/clerk-js-dist/cookieSuffix_clerk.headless_b86dff_5.127.2.js +1 -0
  49. package/client/clerk-js-dist/cookieSuffix_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  50. package/client/clerk-js-dist/copy-api-key-modal_clerk.browser_0cc2cc_5.127.2.js +1 -0
  51. package/client/clerk-js-dist/copy-api-key-modal_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  52. package/client/clerk-js-dist/createorganization_clerk.browser_0cc2cc_5.127.2.js +1 -0
  53. package/client/clerk-js-dist/createorganization_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  54. package/client/clerk-js-dist/enableOrganizationsPrompt_clerk.browser_0cc2cc_5.127.2.js +247 -0
  55. package/client/clerk-js-dist/enableOrganizationsPrompt_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  56. package/client/clerk-js-dist/framework_clerk.browser_0cc2cc_5.127.2.js +1 -0
  57. package/client/clerk-js-dist/framework_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  58. package/client/clerk-js-dist/impersonationfab_clerk.browser_0cc2cc_5.127.2.js +1 -0
  59. package/client/clerk-js-dist/impersonationfab_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  60. package/client/clerk-js-dist/keylessPrompt_clerk.browser_0cc2cc_5.127.2.js +228 -0
  61. package/client/clerk-js-dist/keylessPrompt_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  62. package/client/clerk-js-dist/oauthConsent_clerk.browser_0cc2cc_5.127.2.js +1 -0
  63. package/client/clerk-js-dist/oauthConsent_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  64. package/client/clerk-js-dist/onetap_clerk.browser_0cc2cc_5.127.2.js +1 -0
  65. package/client/clerk-js-dist/onetap_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  66. package/client/clerk-js-dist/op-api-keys-page_clerk.browser_0cc2cc_5.127.2.js +1 -0
  67. package/client/clerk-js-dist/op-api-keys-page_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  68. package/client/clerk-js-dist/op-billing-page_clerk.browser_0cc2cc_5.127.2.js +1 -0
  69. package/client/clerk-js-dist/op-billing-page_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  70. package/client/clerk-js-dist/op-plans-page_clerk.browser_0cc2cc_5.127.2.js +1 -0
  71. package/client/clerk-js-dist/op-plans-page_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  72. package/client/clerk-js-dist/organizationlist_clerk.browser_0cc2cc_5.127.2.js +1 -0
  73. package/client/clerk-js-dist/organizationlist_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  74. package/client/clerk-js-dist/organizationprofile_clerk.browser_0cc2cc_5.127.2.js +1 -0
  75. package/client/clerk-js-dist/organizationprofile_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  76. package/client/clerk-js-dist/organizationswitcher_clerk.browser_0cc2cc_5.127.2.js +1 -0
  77. package/client/clerk-js-dist/organizationswitcher_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  78. package/client/clerk-js-dist/payment-attempt-page_clerk.browser_0cc2cc_5.127.2.js +1 -0
  79. package/client/clerk-js-dist/payment-attempt-page_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  80. package/client/clerk-js-dist/planDetails_clerk.browser_0cc2cc_5.127.2.js +1 -0
  81. package/client/clerk-js-dist/planDetails_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  82. package/client/clerk-js-dist/prefetchorganizationlist_clerk.browser_0cc2cc_5.127.2.js +1 -0
  83. package/client/clerk-js-dist/prefetchorganizationlist_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  84. package/client/clerk-js-dist/pricingTable_clerk.browser_0cc2cc_5.127.2.js +1 -0
  85. package/client/clerk-js-dist/pricingTable_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  86. package/client/clerk-js-dist/query-core-vendors_clerk.browser_0cc2cc_5.127.2.js +1 -0
  87. package/client/clerk-js-dist/query-core-vendors_clerk.headless.browser_540199_5.127.2.js +1 -0
  88. package/client/clerk-js-dist/query-core-vendors_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  89. package/client/clerk-js-dist/revoke-api-key-modal_clerk.browser_0cc2cc_5.127.2.js +1 -0
  90. package/client/clerk-js-dist/revoke-api-key-modal_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  91. package/client/clerk-js-dist/sessionTasks_clerk.browser_0cc2cc_5.127.2.js +1 -0
  92. package/client/clerk-js-dist/sessionTasks_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  93. package/client/clerk-js-dist/signin_clerk.browser_0cc2cc_5.127.2.js +1 -0
  94. package/client/clerk-js-dist/signin_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  95. package/client/clerk-js-dist/signup_clerk.browser_0cc2cc_5.127.2.js +1 -0
  96. package/client/clerk-js-dist/signup_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  97. package/client/clerk-js-dist/statement-page_clerk.browser_0cc2cc_5.127.2.js +1 -0
  98. package/client/clerk-js-dist/statement-page_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  99. package/client/clerk-js-dist/stripe-vendors_clerk.browser_0cc2cc_5.127.2.js +1 -0
  100. package/client/clerk-js-dist/stripe-vendors_clerk.headless.browser_540199_5.127.2.js +1 -0
  101. package/client/clerk-js-dist/stripe-vendors_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  102. package/client/clerk-js-dist/subscriptionDetails_clerk.browser_0cc2cc_5.127.2.js +1 -0
  103. package/client/clerk-js-dist/subscriptionDetails_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  104. package/client/clerk-js-dist/taskChooseOrganization_clerk.browser_0cc2cc_5.127.2.js +1 -0
  105. package/client/clerk-js-dist/taskChooseOrganization_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  106. package/client/clerk-js-dist/taskResetPassword_clerk.browser_0cc2cc_5.127.2.js +1 -0
  107. package/client/clerk-js-dist/taskResetPassword_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  108. package/client/clerk-js-dist/taskSetupMFA_clerk.browser_0cc2cc_5.127.2.js +4 -0
  109. package/client/clerk-js-dist/taskSetupMFA_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  110. package/client/clerk-js-dist/ui-common_clerk.browser_0cc2cc_5.127.2.js +124 -0
  111. package/client/clerk-js-dist/ui-common_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  112. package/client/clerk-js-dist/up-api-keys-page_clerk.browser_0cc2cc_5.127.2.js +1 -0
  113. package/client/clerk-js-dist/up-api-keys-page_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  114. package/client/clerk-js-dist/up-billing-page_clerk.browser_0cc2cc_5.127.2.js +1 -0
  115. package/client/clerk-js-dist/up-billing-page_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  116. package/client/clerk-js-dist/up-plans-page_clerk.browser_0cc2cc_5.127.2.js +1 -0
  117. package/client/clerk-js-dist/up-plans-page_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  118. package/client/clerk-js-dist/useravatar_clerk.browser_0cc2cc_5.127.2.js +1 -0
  119. package/client/clerk-js-dist/useravatar_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  120. package/client/clerk-js-dist/userbutton_clerk.browser_0cc2cc_5.127.2.js +1 -0
  121. package/client/clerk-js-dist/userbutton_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  122. package/client/clerk-js-dist/userprofile_clerk.browser_0cc2cc_5.127.2.js +4 -0
  123. package/client/clerk-js-dist/userprofile_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  124. package/client/clerk-js-dist/userverification_clerk.browser_0cc2cc_5.127.2.js +1 -0
  125. package/client/clerk-js-dist/userverification_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  126. package/client/clerk-js-dist/vendors_clerk.browser_0cc2cc_5.127.2.js +20 -0
  127. package/client/clerk-js-dist/vendors_clerk.headless.browser_540199_5.127.2.js +1 -0
  128. package/client/clerk-js-dist/vendors_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  129. package/client/clerk-js-dist/waitlist_clerk.browser_0cc2cc_5.127.2.js +1 -0
  130. package/client/clerk-js-dist/waitlist_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  131. package/client/clerk-js-dist/web3-solana-wallet-buttons_clerk.browser_0cc2cc_5.127.2.js +143 -0
  132. package/client/clerk-js-dist/web3-solana-wallet-buttons_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  133. package/client/clerk-js-dist/zxcvbn-common_clerk.browser_0cc2cc_5.127.2.js +1 -0
  134. package/client/clerk-js-dist/zxcvbn-common_clerk.headless.browser_540199_5.127.2.js +1 -0
  135. package/client/clerk-js-dist/zxcvbn-common_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  136. package/client/clerk-js-dist/zxcvbn-ts-core_clerk.browser_0cc2cc_5.127.2.js +2 -0
  137. package/client/clerk-js-dist/zxcvbn-ts-core_clerk.headless.browser_540199_5.127.2.js +2 -0
  138. package/client/clerk-js-dist/zxcvbn-ts-core_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  139. package/client/clerk-mirror.css +72 -0
  140. package/client/clerk-mirror.tsx +204 -0
  141. package/client/clerk.browser.js +19 -0
  142. package/dist/client/clerk-js-dist/167_clerk.headless_b86dff_5.127.2.js +1 -0
  143. package/dist/client/clerk-js-dist/2172_clerk.browser_0cc2cc_5.127.2.js +1 -0
  144. package/dist/client/clerk-js-dist/2172_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  145. package/dist/client/clerk-js-dist/368_clerk.headless_b86dff_5.127.2.js +3 -0
  146. package/dist/client/clerk-js-dist/377_clerk.headless_b86dff_5.127.2.js +1 -0
  147. package/dist/client/clerk-js-dist/4170_clerk.browser_0cc2cc_5.127.2.js +1 -0
  148. package/dist/client/clerk-js-dist/4170_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  149. package/dist/client/clerk-js-dist/437_clerk.headless_b86dff_5.127.2.js +1 -0
  150. package/dist/client/clerk-js-dist/5192_clerk.browser_0cc2cc_5.127.2.js +1 -0
  151. package/dist/client/clerk-js-dist/5192_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  152. package/dist/client/clerk-js-dist/553_clerk.headless_b86dff_5.127.2.js +1 -0
  153. package/dist/client/clerk-js-dist/5645_clerk.browser_0cc2cc_5.127.2.js +1 -0
  154. package/dist/client/clerk-js-dist/5645_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  155. package/dist/client/clerk-js-dist/623_clerk.headless_b86dff_5.127.2.js +42 -0
  156. package/dist/client/clerk-js-dist/7067_clerk.browser_0cc2cc_5.127.2.js +1 -0
  157. package/dist/client/clerk-js-dist/7067_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  158. package/dist/client/clerk-js-dist/7502_clerk.browser_0cc2cc_5.127.2.js +1 -0
  159. package/dist/client/clerk-js-dist/7502_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  160. package/dist/client/clerk-js-dist/785_clerk.headless.browser_540199_5.127.2.js +1 -0
  161. package/dist/client/clerk-js-dist/785_clerk.headless_b86dff_5.127.2.js +1 -0
  162. package/dist/client/clerk-js-dist/8043_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  163. package/dist/client/clerk-js-dist/825_clerk.headless.browser_540199_5.127.2.js +1 -0
  164. package/dist/client/clerk-js-dist/825_clerk.headless_b86dff_5.127.2.js +1 -0
  165. package/dist/client/clerk-js-dist/890_clerk.headless_b86dff_5.127.2.js +2 -0
  166. package/dist/client/clerk-js-dist/901_clerk.headless.browser_540199_5.127.2.js +1 -0
  167. package/dist/client/clerk-js-dist/apiKeys_clerk.browser_0cc2cc_5.127.2.js +1 -0
  168. package/dist/client/clerk-js-dist/apiKeys_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  169. package/dist/client/clerk-js-dist/base-account-sdk_clerk.browser_0cc2cc_5.127.2.js +42 -0
  170. package/dist/client/clerk-js-dist/base-account-sdk_clerk.headless.browser_540199_5.127.2.js +42 -0
  171. package/dist/client/clerk-js-dist/base-account-sdk_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  172. package/dist/client/clerk-js-dist/blankcaptcha_clerk.browser_0cc2cc_5.127.2.js +1 -0
  173. package/dist/client/clerk-js-dist/blankcaptcha_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  174. package/dist/client/clerk-js-dist/checkout_clerk.browser_0cc2cc_5.127.2.js +9 -0
  175. package/dist/client/clerk-js-dist/checkout_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  176. package/dist/client/clerk-js-dist/clerk.browser.js +19 -0
  177. package/dist/client/clerk-js-dist/clerk.headless.browser.js +19 -0
  178. package/dist/client/clerk-js-dist/clerk.headless.js +19 -0
  179. package/dist/client/clerk-js-dist/clerk.js +809 -0
  180. package/dist/client/clerk-js-dist/clerk.legacy.browser.js +1 -0
  181. package/dist/client/clerk-js-dist/clerk.no-rhc.js +766 -0
  182. package/dist/client/clerk-js-dist/coinbase-wallet-sdk_clerk.browser_0cc2cc_5.127.2.js +3 -0
  183. package/dist/client/clerk-js-dist/coinbase-wallet-sdk_clerk.headless.browser_540199_5.127.2.js +3 -0
  184. package/dist/client/clerk-js-dist/coinbase-wallet-sdk_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  185. package/dist/client/clerk-js-dist/cookieSuffix_clerk.browser_0cc2cc_5.127.2.js +1 -0
  186. package/dist/client/clerk-js-dist/cookieSuffix_clerk.headless.browser_540199_5.127.2.js +1 -0
  187. package/dist/client/clerk-js-dist/cookieSuffix_clerk.headless_b86dff_5.127.2.js +1 -0
  188. package/dist/client/clerk-js-dist/cookieSuffix_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  189. package/dist/client/clerk-js-dist/copy-api-key-modal_clerk.browser_0cc2cc_5.127.2.js +1 -0
  190. package/dist/client/clerk-js-dist/copy-api-key-modal_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  191. package/dist/client/clerk-js-dist/createorganization_clerk.browser_0cc2cc_5.127.2.js +1 -0
  192. package/dist/client/clerk-js-dist/createorganization_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  193. package/dist/client/clerk-js-dist/enableOrganizationsPrompt_clerk.browser_0cc2cc_5.127.2.js +247 -0
  194. package/dist/client/clerk-js-dist/enableOrganizationsPrompt_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  195. package/dist/client/clerk-js-dist/framework_clerk.browser_0cc2cc_5.127.2.js +1 -0
  196. package/dist/client/clerk-js-dist/framework_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  197. package/dist/client/clerk-js-dist/impersonationfab_clerk.browser_0cc2cc_5.127.2.js +1 -0
  198. package/dist/client/clerk-js-dist/impersonationfab_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  199. package/dist/client/clerk-js-dist/keylessPrompt_clerk.browser_0cc2cc_5.127.2.js +228 -0
  200. package/dist/client/clerk-js-dist/keylessPrompt_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  201. package/dist/client/clerk-js-dist/oauthConsent_clerk.browser_0cc2cc_5.127.2.js +1 -0
  202. package/dist/client/clerk-js-dist/oauthConsent_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  203. package/dist/client/clerk-js-dist/onetap_clerk.browser_0cc2cc_5.127.2.js +1 -0
  204. package/dist/client/clerk-js-dist/onetap_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  205. package/dist/client/clerk-js-dist/op-api-keys-page_clerk.browser_0cc2cc_5.127.2.js +1 -0
  206. package/dist/client/clerk-js-dist/op-api-keys-page_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  207. package/dist/client/clerk-js-dist/op-billing-page_clerk.browser_0cc2cc_5.127.2.js +1 -0
  208. package/dist/client/clerk-js-dist/op-billing-page_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  209. package/dist/client/clerk-js-dist/op-plans-page_clerk.browser_0cc2cc_5.127.2.js +1 -0
  210. package/dist/client/clerk-js-dist/op-plans-page_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  211. package/dist/client/clerk-js-dist/organizationlist_clerk.browser_0cc2cc_5.127.2.js +1 -0
  212. package/dist/client/clerk-js-dist/organizationlist_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  213. package/dist/client/clerk-js-dist/organizationprofile_clerk.browser_0cc2cc_5.127.2.js +1 -0
  214. package/dist/client/clerk-js-dist/organizationprofile_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  215. package/dist/client/clerk-js-dist/organizationswitcher_clerk.browser_0cc2cc_5.127.2.js +1 -0
  216. package/dist/client/clerk-js-dist/organizationswitcher_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  217. package/dist/client/clerk-js-dist/payment-attempt-page_clerk.browser_0cc2cc_5.127.2.js +1 -0
  218. package/dist/client/clerk-js-dist/payment-attempt-page_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  219. package/dist/client/clerk-js-dist/planDetails_clerk.browser_0cc2cc_5.127.2.js +1 -0
  220. package/dist/client/clerk-js-dist/planDetails_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  221. package/dist/client/clerk-js-dist/prefetchorganizationlist_clerk.browser_0cc2cc_5.127.2.js +1 -0
  222. package/dist/client/clerk-js-dist/prefetchorganizationlist_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  223. package/dist/client/clerk-js-dist/pricingTable_clerk.browser_0cc2cc_5.127.2.js +1 -0
  224. package/dist/client/clerk-js-dist/pricingTable_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  225. package/dist/client/clerk-js-dist/query-core-vendors_clerk.browser_0cc2cc_5.127.2.js +1 -0
  226. package/dist/client/clerk-js-dist/query-core-vendors_clerk.headless.browser_540199_5.127.2.js +1 -0
  227. package/dist/client/clerk-js-dist/query-core-vendors_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  228. package/dist/client/clerk-js-dist/revoke-api-key-modal_clerk.browser_0cc2cc_5.127.2.js +1 -0
  229. package/dist/client/clerk-js-dist/revoke-api-key-modal_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  230. package/dist/client/clerk-js-dist/sessionTasks_clerk.browser_0cc2cc_5.127.2.js +1 -0
  231. package/dist/client/clerk-js-dist/sessionTasks_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  232. package/dist/client/clerk-js-dist/signin_clerk.browser_0cc2cc_5.127.2.js +1 -0
  233. package/dist/client/clerk-js-dist/signin_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  234. package/dist/client/clerk-js-dist/signup_clerk.browser_0cc2cc_5.127.2.js +1 -0
  235. package/dist/client/clerk-js-dist/signup_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  236. package/dist/client/clerk-js-dist/statement-page_clerk.browser_0cc2cc_5.127.2.js +1 -0
  237. package/dist/client/clerk-js-dist/statement-page_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  238. package/dist/client/clerk-js-dist/stripe-vendors_clerk.browser_0cc2cc_5.127.2.js +1 -0
  239. package/dist/client/clerk-js-dist/stripe-vendors_clerk.headless.browser_540199_5.127.2.js +1 -0
  240. package/dist/client/clerk-js-dist/stripe-vendors_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  241. package/dist/client/clerk-js-dist/subscriptionDetails_clerk.browser_0cc2cc_5.127.2.js +1 -0
  242. package/dist/client/clerk-js-dist/subscriptionDetails_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  243. package/dist/client/clerk-js-dist/taskChooseOrganization_clerk.browser_0cc2cc_5.127.2.js +1 -0
  244. package/dist/client/clerk-js-dist/taskChooseOrganization_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  245. package/dist/client/clerk-js-dist/taskResetPassword_clerk.browser_0cc2cc_5.127.2.js +1 -0
  246. package/dist/client/clerk-js-dist/taskResetPassword_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  247. package/dist/client/clerk-js-dist/taskSetupMFA_clerk.browser_0cc2cc_5.127.2.js +4 -0
  248. package/dist/client/clerk-js-dist/taskSetupMFA_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  249. package/dist/client/clerk-js-dist/ui-common_clerk.browser_0cc2cc_5.127.2.js +124 -0
  250. package/dist/client/clerk-js-dist/ui-common_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  251. package/dist/client/clerk-js-dist/up-api-keys-page_clerk.browser_0cc2cc_5.127.2.js +1 -0
  252. package/dist/client/clerk-js-dist/up-api-keys-page_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  253. package/dist/client/clerk-js-dist/up-billing-page_clerk.browser_0cc2cc_5.127.2.js +1 -0
  254. package/dist/client/clerk-js-dist/up-billing-page_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  255. package/dist/client/clerk-js-dist/up-plans-page_clerk.browser_0cc2cc_5.127.2.js +1 -0
  256. package/dist/client/clerk-js-dist/up-plans-page_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  257. package/dist/client/clerk-js-dist/useravatar_clerk.browser_0cc2cc_5.127.2.js +1 -0
  258. package/dist/client/clerk-js-dist/useravatar_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  259. package/dist/client/clerk-js-dist/userbutton_clerk.browser_0cc2cc_5.127.2.js +1 -0
  260. package/dist/client/clerk-js-dist/userbutton_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  261. package/dist/client/clerk-js-dist/userprofile_clerk.browser_0cc2cc_5.127.2.js +4 -0
  262. package/dist/client/clerk-js-dist/userprofile_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  263. package/dist/client/clerk-js-dist/userverification_clerk.browser_0cc2cc_5.127.2.js +1 -0
  264. package/dist/client/clerk-js-dist/userverification_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  265. package/dist/client/clerk-js-dist/vendors_clerk.browser_0cc2cc_5.127.2.js +20 -0
  266. package/dist/client/clerk-js-dist/vendors_clerk.headless.browser_540199_5.127.2.js +1 -0
  267. package/dist/client/clerk-js-dist/vendors_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  268. package/dist/client/clerk-js-dist/waitlist_clerk.browser_0cc2cc_5.127.2.js +1 -0
  269. package/dist/client/clerk-js-dist/waitlist_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  270. package/dist/client/clerk-js-dist/web3-solana-wallet-buttons_clerk.browser_0cc2cc_5.127.2.js +143 -0
  271. package/dist/client/clerk-js-dist/web3-solana-wallet-buttons_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  272. package/dist/client/clerk-js-dist/zxcvbn-common_clerk.browser_0cc2cc_5.127.2.js +1 -0
  273. package/dist/client/clerk-js-dist/zxcvbn-common_clerk.headless.browser_540199_5.127.2.js +1 -0
  274. package/dist/client/clerk-js-dist/zxcvbn-common_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  275. package/dist/client/clerk-js-dist/zxcvbn-ts-core_clerk.browser_0cc2cc_5.127.2.js +2 -0
  276. package/dist/client/clerk-js-dist/zxcvbn-ts-core_clerk.headless.browser_540199_5.127.2.js +2 -0
  277. package/dist/client/clerk-js-dist/zxcvbn-ts-core_clerk.legacy.browser_6070dd_5.127.2.js +1 -0
  278. package/dist/client/clerk-mirror.bundle.js +321 -0
  279. package/dist/client/clerk-mirror.css +72 -0
  280. package/dist/client/clerk-mirror.d.ts +33 -0
  281. package/dist/client/clerk-mirror.js +143 -0
  282. package/dist/client/clerk-mirror.tsx +204 -0
  283. package/dist/client/clerk.browser.js +19 -0
  284. package/dist/src/clerk-capabilities.d.ts +4 -0
  285. package/dist/src/clerk-capabilities.js +1132 -0
  286. package/dist/src/clerk-conformance.d.ts +32 -0
  287. package/dist/src/clerk-conformance.js +158 -0
  288. package/dist/src/clerk-connector.d.ts +170 -0
  289. package/dist/src/clerk-connector.js +223 -0
  290. package/dist/src/clerk-events.d.ts +55 -0
  291. package/dist/src/clerk-events.js +146 -0
  292. package/dist/src/clerk-fapi.d.ts +19 -0
  293. package/dist/src/clerk-fapi.js +665 -0
  294. package/dist/src/clerk-jwt.d.ts +109 -0
  295. package/dist/src/clerk-jwt.js +230 -0
  296. package/dist/src/clerk-mirror-ui.d.ts +34 -0
  297. package/dist/src/clerk-mirror-ui.js +160 -0
  298. package/dist/src/clerk-server.d.ts +35 -0
  299. package/dist/src/clerk-server.js +172 -0
  300. package/dist/src/clerk-twin.d.ts +28 -0
  301. package/dist/src/clerk-twin.js +1658 -0
  302. package/dist/src/cli.d.ts +2 -0
  303. package/dist/src/cli.js +35 -0
  304. package/dist/src/index.d.ts +12 -0
  305. package/dist/src/index.js +56 -0
  306. package/dist/test-fixtures/clerk-openapi-operations.SOURCE.md +16 -0
  307. package/dist/test-fixtures/clerk-openapi-operations.json +1989 -0
  308. package/package.json +76 -0
  309. package/src/clerk-capabilities.ts +1246 -0
  310. package/src/clerk-conformance.ts +172 -0
  311. package/src/clerk-connector.ts +268 -0
  312. package/src/clerk-events.ts +166 -0
  313. package/src/clerk-fapi.ts +673 -0
  314. package/src/clerk-jwt.ts +256 -0
  315. package/src/clerk-mirror-ui.ts +165 -0
  316. package/src/clerk-server.ts +175 -0
  317. package/src/clerk-twin.ts +1580 -0
  318. package/src/cli.ts +33 -0
  319. package/src/index.ts +94 -0
  320. package/test-fixtures/clerk-openapi-operations.SOURCE.md +16 -0
  321. package/test-fixtures/clerk-openapi-operations.json +1989 -0
@@ -0,0 +1,109 @@
1
+ export type ClerkKeypair = {
2
+ kid: string;
3
+ publicKeyPem: string;
4
+ privateKeyPem: string;
5
+ };
6
+ /** The PEM material of an RSA signing keypair (no kid — the kid is derived from it). */
7
+ export type KeypairMaterial = {
8
+ publicKeyPem: string;
9
+ privateKeyPem: string;
10
+ };
11
+ /** How `ensureKeypair` mints a NEW keypair on first use. */
12
+ export type KeypairGenerator = () => KeypairMaterial;
13
+ /** Override how `ensureKeypair` mints a new keypair; pass `null` to restore the node:crypto
14
+ * default. Workers-only wiring — the default keeps generate-on-first-use behavior. */
15
+ export declare function setKeypairGenerator(generator: KeypairGenerator | null): void;
16
+ /**
17
+ * The twin's RSA signing keypair for `root`, generated + persisted on first use and
18
+ * stable thereafter (persisted in kernel state, so signing and the served JWKS share
19
+ * ONE key). Deterministic kid derived from the public key's modulus, so the JWKS `kid`
20
+ * matches the token header `kid` — what a verifier uses to pick the key.
21
+ */
22
+ export declare function ensureKeypair(root?: string): Promise<ClerkKeypair>;
23
+ /**
24
+ * Sign a JWT (RS256) with the twin's persisted private key. The header carries the
25
+ * `kid` of the served JWKS so a verifier picks the right key. Returns the compact
26
+ * `header.payload.signature` token. Pure local crypto — no network.
27
+ */
28
+ export declare function signJwt(claims: Record<string, unknown>, opts?: {
29
+ root?: string;
30
+ expiresInSeconds?: number;
31
+ now?: number;
32
+ }): Promise<string>;
33
+ /**
34
+ * Sign a JWT with a bring-your-own HS256 secret (a JWT template's `custom_signing_key`).
35
+ * Real Clerk lets a template carry its own signing algorithm + secret (e.g. Supabase's
36
+ * shared HS256 secret); the twin signs with genuine HMAC-SHA256 so the downstream service
37
+ * verifies it with the SAME secret unmodified. No persisted keypair, no JWKS (HS256 is
38
+ * symmetric). Pure local crypto — no network.
39
+ */
40
+ export declare function signJwtHs256(claims: Record<string, unknown>, secret: string, opts?: {
41
+ expiresInSeconds?: number;
42
+ now?: number;
43
+ }): string;
44
+ /**
45
+ * Verify an HS256 JWT against the shared secret (constant-time) and check exp/nbf —
46
+ * what a downstream service does with a `custom_signing_key` template token. Pure local
47
+ * crypto — no network.
48
+ */
49
+ export declare function verifyJwtHs256(token: string, secret: string, opts?: {
50
+ now?: number;
51
+ }): {
52
+ valid: boolean;
53
+ payload?: Record<string, unknown>;
54
+ reason?: string;
55
+ };
56
+ /** The decoded parts of a JWT (no verification). */
57
+ export declare function decodeJwt(token: string): {
58
+ header: Record<string, unknown>;
59
+ payload: Record<string, unknown>;
60
+ };
61
+ /**
62
+ * Verify a token's RS256 signature against a JWKS document (the SAME shape the twin
63
+ * serves), and check exp/nbf. This is what an app does to trust a twin-issued token:
64
+ * `verifyJwtWithJwks(token, fetch('/.well-known/jwks.json'))` succeeds for a valid
65
+ * token, fails for a tampered/expired one. Pure local crypto — no network.
66
+ */
67
+ export declare function verifyJwtWithJwks(token: string, jwks: Jwks, opts?: {
68
+ now?: number;
69
+ }): {
70
+ valid: boolean;
71
+ payload?: Record<string, unknown>;
72
+ reason?: string;
73
+ };
74
+ export type Jwk = {
75
+ kty: 'RSA';
76
+ use: 'sig';
77
+ alg: 'RS256';
78
+ kid: string;
79
+ n: string;
80
+ e: string;
81
+ };
82
+ export type Jwks = {
83
+ keys: Jwk[];
84
+ };
85
+ /** The Clerk-shaped result of authenticating a request (mirrors `RequestState`). */
86
+ export type ClerkAuthState = {
87
+ isSignedIn: boolean;
88
+ userId: string | null;
89
+ sessionId: string | null;
90
+ orgId: string | null;
91
+ claims: Record<string, unknown> | null;
92
+ reason?: string;
93
+ };
94
+ /**
95
+ * Networkless verification of a Clerk session token — what `@clerk/backend`'s
96
+ * `authenticateRequest()` does on the server WITHOUT an extra API round-trip: verify the
97
+ * token's RS256 signature + exp/nbf against a (locally cached) JWKS, then derive the
98
+ * signed-in actor (sub→userId, sid→sessionId, org_id→orgId) from the claims. No network.
99
+ */
100
+ export declare function networklessVerifyToken(token: string, jwks: Jwks, opts?: {
101
+ now?: number;
102
+ }): ClerkAuthState;
103
+ /**
104
+ * Build the JWKS document the twin serves at /.well-known/jwks.json — the real Clerk
105
+ * JWKS shape. The RSA modulus/exponent are exported as base64url JWK members from the
106
+ * SAME persisted key used to sign, so a verifier picks the matching `kid` and trusts
107
+ * twin-issued tokens.
108
+ */
109
+ export declare function buildJwks(root?: string): Promise<Jwks>;
@@ -0,0 +1,230 @@
1
+ // Clerk JWT / JWKS — the highest-value capability of the Clerk twin.
2
+ //
3
+ // Real Clerk issues RS256-signed JWTs for sessions and JWT templates, and serves a
4
+ // JWKS document (/.well-known/jwks.json) an app verifies those tokens against. A
5
+ // faithful twin must do the SAME with REAL crypto: generate an RSA keypair on first
6
+ // use, persist it (via the kernel state, so it survives a process restart and is the
7
+ // SAME key for both signing and the served JWKS), sign tokens as genuine JWTs, and
8
+ // serve a genuine JWKS — so an app verifying a twin-issued token against the twin's
9
+ // JWKS succeeds UNMODIFIED (`jwt.verify(token, jwks)` works, claims round-trip).
10
+ //
11
+ // `node:crypto` is required LAZILY (inside the functions that use it), NOT as a
12
+ // top-level static import, so this module can be pulled into the browser bundle of
13
+ // the UI mirror without Bun's browser target choking on `node:crypto` — the signing
14
+ // helpers are server-only and never reached in the browser path.
15
+ import { applyTwinWrite, projectResources, nodeBuiltin } from '@volter/world-core';
16
+ function nodeCrypto() {
17
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
18
+ return nodeBuiltin('node:crypto');
19
+ }
20
+ const SERVICE = 'clerk';
21
+ // The keypair is stored as a single twin-internal resource so it persists in kernel
22
+ // state (the SAME substrate the rest of the twin uses — no parallel store). Its id is
23
+ // fixed; the `_`-prefixed fields are twin-internal (the conformance gate exempts them).
24
+ const KEYPAIR_TYPE = '_keypair';
25
+ const KEYPAIR_ID = 'clerk_signing_key';
26
+ /** DEFAULT keypair source: a fresh RSA-2048 keypair from node:crypto. This is what every
27
+ * Node/Bun twin uses — generate-on-first-use, unchanged. */
28
+ function nodeGenerateKeypair() {
29
+ const { generateKeyPairSync } = nodeCrypto();
30
+ const { publicKey, privateKey } = generateKeyPairSync('rsa', {
31
+ modulusLength: 2048,
32
+ publicKeyEncoding: { type: 'spki', format: 'pem' },
33
+ privateKeyEncoding: { type: 'pkcs8', format: 'pem' },
34
+ });
35
+ return { publicKeyPem: publicKey, privateKeyPem: privateKey };
36
+ }
37
+ // Injectable keypair seam (mirrors the WorldStore seam). The DEFAULT is node:crypto keygen,
38
+ // so the Node/Bun path and the conformance suite are byte-identical. A serverless host where
39
+ // RUNTIME RSA keygen is not viable installs a provider returning a PRE-GENERATED keypair:
40
+ // measured on the real Cloudflare edge, a single RSA-2048 `generateKeyPairSync` trips the
41
+ // free-plan 10ms CPU limit (HTTP 503, error 1102) ~28% of the time, whereas SIGNING once,
42
+ // `createPublicKey`/`createHash`, and the JWK export are all cheap and reliable. Baking the
43
+ // keypair removes the only heavyweight op from the edge; the kid is still derived from the
44
+ // public key by `kidFor`, so a stable baked key yields a STABLE kid (and it is persisted in
45
+ // kernel state on first use exactly as a generated one would be).
46
+ const keypairGenerator = { current: nodeGenerateKeypair }; // a slot, not module truth (protocol 2)
47
+ /** Override how `ensureKeypair` mints a new keypair; pass `null` to restore the node:crypto
48
+ * default. Workers-only wiring — the default keeps generate-on-first-use behavior. */
49
+ export function setKeypairGenerator(generator) {
50
+ keypairGenerator.current = generator ?? nodeGenerateKeypair;
51
+ }
52
+ /**
53
+ * The twin's RSA signing keypair for `root`, generated + persisted on first use and
54
+ * stable thereafter (persisted in kernel state, so signing and the served JWKS share
55
+ * ONE key). Deterministic kid derived from the public key's modulus, so the JWKS `kid`
56
+ * matches the token header `kid` — what a verifier uses to pick the key.
57
+ */
58
+ export async function ensureKeypair(root) {
59
+ const existing = projectResources(SERVICE, root).find((r) => r.type === KEYPAIR_TYPE && r.id === KEYPAIR_ID);
60
+ if (existing && typeof existing._privateKeyPem === 'string' && typeof existing._publicKeyPem === 'string') {
61
+ return { kid: String(existing._kid), publicKeyPem: existing._publicKeyPem, privateKeyPem: existing._privateKeyPem };
62
+ }
63
+ const { publicKeyPem, privateKeyPem } = keypairGenerator.current();
64
+ const kid = kidFor(publicKeyPem);
65
+ await applyTwinWrite(SERVICE, {
66
+ operation: '_keypair.create',
67
+ subjectType: KEYPAIR_TYPE,
68
+ subjectId: KEYPAIR_ID,
69
+ fields: { _kid: kid, _publicKeyPem: publicKeyPem, _privateKeyPem: privateKeyPem },
70
+ actor: { kind: 'system' },
71
+ }, root);
72
+ return { kid, publicKeyPem, privateKeyPem };
73
+ }
74
+ /** Stable key id = first 16 hex of SHA-256 over the public key DER (deterministic per key). */
75
+ function kidFor(publicKeyPem) {
76
+ const { createHash, createPublicKey } = nodeCrypto();
77
+ const der = createPublicKey(publicKeyPem).export({ type: 'spki', format: 'der' });
78
+ return `ins_${createHash('sha256').update(der).digest('hex').slice(0, 16)}`;
79
+ }
80
+ function base64url(input) {
81
+ return Buffer.from(input).toString('base64').replace(/=/g, '').replace(/\+/g, '-').replace(/\//g, '_');
82
+ }
83
+ function base64urlJson(obj) {
84
+ return base64url(JSON.stringify(obj));
85
+ }
86
+ /**
87
+ * Sign a JWT (RS256) with the twin's persisted private key. The header carries the
88
+ * `kid` of the served JWKS so a verifier picks the right key. Returns the compact
89
+ * `header.payload.signature` token. Pure local crypto — no network.
90
+ */
91
+ export async function signJwt(claims, opts = {}) {
92
+ const { createSign } = nodeCrypto();
93
+ const { kid, privateKeyPem } = await ensureKeypair(opts.root);
94
+ const iat = opts.now ?? Math.floor(Date.now() / 1000);
95
+ const exp = iat + (opts.expiresInSeconds ?? 60);
96
+ const header = { alg: 'RS256', typ: 'JWT', kid };
97
+ const payload = { iat, exp, nbf: iat, ...claims };
98
+ const signingInput = `${base64urlJson(header)}.${base64urlJson(payload)}`;
99
+ const signer = createSign('RSA-SHA256');
100
+ signer.update(signingInput);
101
+ signer.end();
102
+ const signature = base64url(signer.sign(privateKeyPem));
103
+ return `${signingInput}.${signature}`;
104
+ }
105
+ /**
106
+ * Sign a JWT with a bring-your-own HS256 secret (a JWT template's `custom_signing_key`).
107
+ * Real Clerk lets a template carry its own signing algorithm + secret (e.g. Supabase's
108
+ * shared HS256 secret); the twin signs with genuine HMAC-SHA256 so the downstream service
109
+ * verifies it with the SAME secret unmodified. No persisted keypair, no JWKS (HS256 is
110
+ * symmetric). Pure local crypto — no network.
111
+ */
112
+ export function signJwtHs256(claims, secret, opts = {}) {
113
+ const { createHmac } = nodeCrypto();
114
+ const iat = opts.now ?? Math.floor(Date.now() / 1000);
115
+ const exp = iat + (opts.expiresInSeconds ?? 60);
116
+ const header = { alg: 'HS256', typ: 'JWT' };
117
+ const payload = { iat, exp, nbf: iat, ...claims };
118
+ const signingInput = `${base64urlJson(header)}.${base64urlJson(payload)}`;
119
+ const signature = base64url(createHmac('sha256', secret).update(signingInput).digest());
120
+ return `${signingInput}.${signature}`;
121
+ }
122
+ /**
123
+ * Verify an HS256 JWT against the shared secret (constant-time) and check exp/nbf —
124
+ * what a downstream service does with a `custom_signing_key` template token. Pure local
125
+ * crypto — no network.
126
+ */
127
+ export function verifyJwtHs256(token, secret, opts = {}) {
128
+ const { createHmac, timingSafeEqual } = nodeCrypto();
129
+ let header, payload, parts;
130
+ try {
131
+ parts = token.split('.');
132
+ if (parts.length !== 3)
133
+ return { valid: false, reason: 'malformed' };
134
+ ({ header, payload } = decodeJwt(token));
135
+ }
136
+ catch {
137
+ return { valid: false, reason: 'malformed' };
138
+ }
139
+ if (header.alg !== 'HS256')
140
+ return { valid: false, reason: 'unexpected_alg' };
141
+ const expected = base64url(createHmac('sha256', secret).update(`${parts[0]}.${parts[1]}`).digest());
142
+ const a = Buffer.from(parts[2], 'utf8');
143
+ const b = Buffer.from(expected, 'utf8');
144
+ if (a.length !== b.length || !timingSafeEqual(a, b))
145
+ return { valid: false, reason: 'bad_signature' };
146
+ const now = opts.now ?? Math.floor(Date.now() / 1000);
147
+ if (typeof payload.exp === 'number' && now >= payload.exp)
148
+ return { valid: false, reason: 'expired' };
149
+ if (typeof payload.nbf === 'number' && now < payload.nbf)
150
+ return { valid: false, reason: 'not_yet_valid' };
151
+ return { valid: true, payload };
152
+ }
153
+ /** The decoded parts of a JWT (no verification). */
154
+ export function decodeJwt(token) {
155
+ const parts = token.split('.');
156
+ if (parts.length !== 3)
157
+ throw new Error('malformed jwt');
158
+ const dec = (s) => JSON.parse(Buffer.from(s.replace(/-/g, '+').replace(/_/g, '/'), 'base64').toString('utf8'));
159
+ return { header: dec(parts[0]), payload: dec(parts[1]) };
160
+ }
161
+ /**
162
+ * Verify a token's RS256 signature against a JWKS document (the SAME shape the twin
163
+ * serves), and check exp/nbf. This is what an app does to trust a twin-issued token:
164
+ * `verifyJwtWithJwks(token, fetch('/.well-known/jwks.json'))` succeeds for a valid
165
+ * token, fails for a tampered/expired one. Pure local crypto — no network.
166
+ */
167
+ export function verifyJwtWithJwks(token, jwks, opts = {}) {
168
+ const { createVerify, createPublicKey } = nodeCrypto();
169
+ let header, payload, parts;
170
+ try {
171
+ parts = token.split('.');
172
+ if (parts.length !== 3)
173
+ return { valid: false, reason: 'malformed' };
174
+ ({ header, payload } = decodeJwt(token));
175
+ }
176
+ catch {
177
+ return { valid: false, reason: 'malformed' };
178
+ }
179
+ if (header.alg !== 'RS256')
180
+ return { valid: false, reason: 'unexpected_alg' };
181
+ const key = jwks.keys.find((k) => k.kid === header.kid) ?? jwks.keys[0];
182
+ if (!key)
183
+ return { valid: false, reason: 'no_matching_key' };
184
+ // Reconstruct the public key from the JWK (n, e) — exactly what a real verifier does.
185
+ const publicKey = createPublicKey({ key: { kty: 'RSA', n: key.n, e: key.e }, format: 'jwk' });
186
+ const verifier = createVerify('RSA-SHA256');
187
+ verifier.update(`${parts[0]}.${parts[1]}`);
188
+ verifier.end();
189
+ const sig = Buffer.from(parts[2].replace(/-/g, '+').replace(/_/g, '/'), 'base64');
190
+ if (!verifier.verify(publicKey, sig))
191
+ return { valid: false, reason: 'bad_signature' };
192
+ const now = opts.now ?? Math.floor(Date.now() / 1000);
193
+ if (typeof payload.exp === 'number' && now >= payload.exp)
194
+ return { valid: false, reason: 'expired' };
195
+ if (typeof payload.nbf === 'number' && now < payload.nbf)
196
+ return { valid: false, reason: 'not_yet_valid' };
197
+ return { valid: true, payload };
198
+ }
199
+ /**
200
+ * Networkless verification of a Clerk session token — what `@clerk/backend`'s
201
+ * `authenticateRequest()` does on the server WITHOUT an extra API round-trip: verify the
202
+ * token's RS256 signature + exp/nbf against a (locally cached) JWKS, then derive the
203
+ * signed-in actor (sub→userId, sid→sessionId, org_id→orgId) from the claims. No network.
204
+ */
205
+ export function networklessVerifyToken(token, jwks, opts = {}) {
206
+ const result = verifyJwtWithJwks(token, jwks, opts);
207
+ if (!result.valid || !result.payload) {
208
+ return { isSignedIn: false, userId: null, sessionId: null, orgId: null, claims: null, ...(result.reason ? { reason: result.reason } : {}) };
209
+ }
210
+ const p = result.payload;
211
+ return {
212
+ isSignedIn: true,
213
+ userId: typeof p.sub === 'string' ? p.sub : null,
214
+ sessionId: typeof p.sid === 'string' ? p.sid : null,
215
+ orgId: typeof p.org_id === 'string' ? p.org_id : null,
216
+ claims: p,
217
+ };
218
+ }
219
+ /**
220
+ * Build the JWKS document the twin serves at /.well-known/jwks.json — the real Clerk
221
+ * JWKS shape. The RSA modulus/exponent are exported as base64url JWK members from the
222
+ * SAME persisted key used to sign, so a verifier picks the matching `kid` and trusts
223
+ * twin-issued tokens.
224
+ */
225
+ export async function buildJwks(root) {
226
+ const { createPublicKey } = nodeCrypto();
227
+ const { kid, publicKeyPem } = await ensureKeypair(root);
228
+ const jwk = createPublicKey(publicKeyPem).export({ format: 'jwk' });
229
+ return { keys: [{ kty: 'RSA', use: 'sig', alg: 'RS256', kid, n: String(jwk.n), e: String(jwk.e) }] };
230
+ }
@@ -0,0 +1,34 @@
1
+ export type ClerkRow = Record<string, any>;
2
+ /** A user's display name: "First Last", else username, else primary email, else id. */
3
+ export declare function formatUserName(u: ClerkRow): string;
4
+ /** The user's primary email address, resolving primary_email_address_id against the list. */
5
+ export declare function primaryEmail(u: ClerkRow): string;
6
+ /** A short status label for a user (banned/locked override active). */
7
+ export declare function userStatus(u: ClerkRow): string;
8
+ /** Format a Clerk epoch-millis timestamp as a short date, or an em dash. */
9
+ export declare function formatClerkDate(ms: unknown): string;
10
+ /** A status → CSS tone class for the status pill (shared design language). */
11
+ export declare function statusTone(value: string): string;
12
+ /** Flatten a (possibly nested) value into label/value lines for the detail panel. */
13
+ export type FlatLine = {
14
+ key: string;
15
+ value: string;
16
+ depth: number;
17
+ };
18
+ export declare function flattenClerkValue(value: unknown, prefix?: string, depth?: number, out?: FlatLine[]): FlatLine[];
19
+ /** Count members of an org (members_count, with a 0 fallback). */
20
+ export declare function orgMemberCount(o: ClerkRow): number;
21
+ /** Build the React/TSX admin client to browser JS (Bun bundles TSX); cached. */
22
+ export declare function buildClerkMirrorClient(): Promise<string>;
23
+ /** Serve the Clerk admin mirror UI (React app) + its backing REST API. */
24
+ export declare function createClerkMirrorServer(options: {
25
+ root?: string;
26
+ port?: number;
27
+ }): Promise<{
28
+ port: number;
29
+ stop: () => void;
30
+ }>;
31
+ /** The app-shell HTML (pure, for tests). The dashboard itself is the React client. */
32
+ export declare function clerkMirrorHtml(): string;
33
+ /** The mirror's stylesheet, for a host serving the shell's `assets/styles.css` itself (the hosted mirror mount). */
34
+ export declare function clerkMirrorStyles(): Promise<string>;
@@ -0,0 +1,160 @@
1
+ // Clerk MIRROR UI — a Clerk-dashboard-like admin view served as a React/TSX app
2
+ // (Bun-bundled, the repo convention). It renders by consuming the twin's OWN REST API on
3
+ // the same origin (/v1/<collection>) — the same endpoints an app uses. Per-vendor + concrete.
4
+ //
5
+ // PURE FRONTEND (R3): the mirror imports no handler and no twin internals — it MOUNTS the
6
+ // pack's OWN fetch adapter (createClerkTwinFetch) as its API backend and reads every byte of
7
+ // state back over the wire, exactly as the browser client does.
8
+ import { readFile } from 'node:fs/promises';
9
+ import { bundleClient, fileResponse } from '@volter/world-core';
10
+ import { serveHttp } from '@volter/world-core';
11
+ import { createClerkTwinFetch } from "./clerk-server.js";
12
+ // Resolved LAZILY (on first serve), not at module load: `new URL(..., import.meta.url)` at
13
+ // module scope evaluates at import time, which throws in a bundled/serverless context where
14
+ // `import.meta.url` is not a valid file base (e.g. workerd) even though the mirror UI is never
15
+ // served there. Computing them on demand keeps Node/Bun behavior identical while letting a
16
+ // serverless host import this module's barrel without a startup crash.
17
+ const clientEntryPath = () => new URL('../client/clerk-mirror.tsx', import.meta.url).pathname;
18
+ const clientCssPath = () => new URL('../client/clerk-mirror.css', import.meta.url).pathname;
19
+ /** A user's display name: "First Last", else username, else primary email, else id. */
20
+ export function formatUserName(u) {
21
+ const name = [u?.first_name, u?.last_name].filter(Boolean).join(' ').trim();
22
+ if (name)
23
+ return name;
24
+ if (u?.username)
25
+ return String(u.username);
26
+ const email = primaryEmail(u);
27
+ return email || String(u?.id ?? '—');
28
+ }
29
+ /** The user's primary email address, resolving primary_email_address_id against the list. */
30
+ export function primaryEmail(u) {
31
+ const list = Array.isArray(u?.email_addresses) ? u.email_addresses : [];
32
+ const primaryId = u?.primary_email_address_id;
33
+ const found = list.find((e) => e?.id === primaryId) ?? list[0];
34
+ if (found?.email_address)
35
+ return String(found.email_address);
36
+ if (u?.primary_email)
37
+ return String(u.primary_email);
38
+ return '';
39
+ }
40
+ /** A short status label for a user (banned/locked override active). */
41
+ export function userStatus(u) {
42
+ if (u?.banned)
43
+ return 'banned';
44
+ if (u?.locked)
45
+ return 'locked';
46
+ return 'active';
47
+ }
48
+ /** Format a Clerk epoch-millis timestamp as a short date, or an em dash. */
49
+ export function formatClerkDate(ms) {
50
+ if (typeof ms !== 'number' || !Number.isFinite(ms) || ms <= 0)
51
+ return '—';
52
+ try {
53
+ return new Date(ms).toISOString().slice(0, 10);
54
+ }
55
+ catch {
56
+ return '—';
57
+ }
58
+ }
59
+ /** A status → CSS tone class for the status pill (shared design language). */
60
+ export function statusTone(value) {
61
+ const v = value.toLowerCase();
62
+ if (['active', 'verified', 'accepted', 'admin'].includes(v))
63
+ return 'ok';
64
+ if (['pending', 'queued', 'locked', 'basic_member'].includes(v))
65
+ return 'warn';
66
+ if (['banned', 'revoked', 'expired', 'ended'].includes(v))
67
+ return 'bad';
68
+ return 'neutral';
69
+ }
70
+ export function flattenClerkValue(value, prefix = '', depth = 0, out = []) {
71
+ if (value === null || value === undefined) {
72
+ out.push({ key: prefix || '(value)', value: '—', depth });
73
+ }
74
+ else if (Array.isArray(value)) {
75
+ if (value.length === 0)
76
+ out.push({ key: prefix, value: '[]', depth });
77
+ else
78
+ value.forEach((v, i) => flattenClerkValue(v, `${prefix}[${i}]`, depth, out));
79
+ }
80
+ else if (typeof value === 'object') {
81
+ for (const [k, v] of Object.entries(value)) {
82
+ flattenClerkValue(v, prefix ? `${prefix}.${k}` : k, depth, out);
83
+ }
84
+ }
85
+ else {
86
+ out.push({ key: prefix || '(value)', value: String(value), depth });
87
+ }
88
+ return out;
89
+ }
90
+ /** Count members of an org (members_count, with a 0 fallback). */
91
+ export function orgMemberCount(o) {
92
+ return typeof o?.members_count === 'number' ? o.members_count : 0;
93
+ }
94
+ // ---------------------------------------------------------------------------
95
+ // Server-only (Bun) below — NOT imported by the browser client.
96
+ // ---------------------------------------------------------------------------
97
+ const APP_SHELL = `<!doctype html><html lang="en"><head><meta charset="utf-8" />
98
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
99
+ <base href="/"><title>Clerk twin — admin mirror</title>
100
+ <link rel="stylesheet" href="assets/styles.css" /></head>
101
+ <body><div id="root"></div><script type="module" src="assets/app.js"></script></body></html>`;
102
+ // cache: the built client bundle, memoized per process — a build artifact, never twin state (the tree
103
+ // holds what this UI renders); cleared on a failed build so the next request rebuilds.
104
+ let clientBundle = null;
105
+ /** Build the React/TSX admin client to browser JS (Bun bundles TSX); cached. */
106
+ export function buildClerkMirrorClient() {
107
+ if (!clientBundle) {
108
+ clientBundle = bundleClient(clientEntryPath())
109
+ .catch((error) => { clientBundle = null; throw error; });
110
+ }
111
+ return clientBundle;
112
+ }
113
+ /** Serve the Clerk admin mirror UI (React app) + its backing REST API. */
114
+ export async function createClerkMirrorServer(options) {
115
+ const twin = createClerkTwinFetch({ ...(options.root !== undefined ? { root: options.root } : {}) });
116
+ const server = await serveHttp({
117
+ // LOOPBACK-SPECIFIC bind (2026-08-20, the roving ui-verify flake): with the default
118
+ // wildcard hostname, `port: 0` can be handed a port some long-running app already LISTENS
119
+ // on at 127.0.0.1 (SO_REUSEADDR allows the overlapping non-identical bind), and the more
120
+ // specific loopback listener then shadows this server for every 127.0.0.1 fetch — the
121
+ // verify talks to a STRANGER (captured: a desktop app's asset server answering 404s on the
122
+ // mirror's port). Binding 127.0.0.1 makes the kernel allocate a port that is actually free
123
+ // on loopback, so the verify's fetches deterministically reach THIS server.
124
+ hostname: '127.0.0.1',
125
+ port: options.port ?? 0,
126
+ idleTimeout: 60,
127
+ async fetch(request) {
128
+ const url = new URL(request.url);
129
+ if (request.method === 'GET' && url.pathname === '/assets/app.js') {
130
+ try {
131
+ return new Response(await buildClerkMirrorClient(), { headers: { 'content-type': 'text/javascript; charset=utf-8' } });
132
+ }
133
+ catch (error) {
134
+ return new Response(String(error), { status: 500 });
135
+ }
136
+ }
137
+ if (request.method === 'GET' && url.pathname === '/assets/styles.css') {
138
+ return fileResponse(clientCssPath(), { headers: { 'content-type': 'text/css; charset=utf-8' } });
139
+ }
140
+ if (request.method === 'GET' && (url.pathname === '/' || url.pathname === '')) {
141
+ return new Response(APP_SHELL, { headers: { 'content-type': 'text/html; charset=utf-8' } });
142
+ }
143
+ // everything else → the twin's OWN FETCH ADAPTER (composition, R2): the Backend API the
144
+ // React client calls (/v1/<collection>), the Frontend API collections, the vendored
145
+ // clerk-js loader path and the uniform door (GET /twin) all come from the SAME closure
146
+ // `createClerkTwinServer` serves, so the mirror port cannot drift from the API port —
147
+ // one serving code path, one truth.
148
+ return twin(request);
149
+ },
150
+ });
151
+ return { port: server.port ?? options.port ?? 0, stop: () => server.stop(true) };
152
+ }
153
+ /** The app-shell HTML (pure, for tests). The dashboard itself is the React client. */
154
+ export function clerkMirrorHtml() {
155
+ return APP_SHELL;
156
+ }
157
+ /** The mirror's stylesheet, for a host serving the shell's `assets/styles.css` itself (the hosted mirror mount). */
158
+ export function clerkMirrorStyles() {
159
+ return readFile(clientCssPath(), 'utf8');
160
+ }
@@ -0,0 +1,35 @@
1
+ /** Options every Clerk-twin HTTP surface needs, independent of who owns the socket. */
2
+ export interface ClerkTwinFetchOptions {
3
+ root?: string;
4
+ readOnly?: boolean;
5
+ personas?: Array<Record<string, unknown>>;
6
+ }
7
+ /**
8
+ * The pack's whole HTTP surface as a plain `fetch` — Request in, Response out, no listener.
9
+ *
10
+ * This is the composable form (runtime contract R12b): a Worker / Durable Object entry has NO
11
+ * loopback ports, so it must mount a pack's handler IN-PROCESS. `createClerkTwinServer` is
12
+ * nothing but `Bun.serve` wrapped around this closure, so the standalone (R1) and hosted
13
+ * surfaces are the SAME code — there is no second HTTP adaptation to drift.
14
+ *
15
+ * Personas are seeded ONCE, when the factory is called; the per-request path only awaits that
16
+ * settled promise. A caller that passes no `personas` file seeds nothing.
17
+ *
18
+ * WHAT IT SERVES IS UNCHANGED (R9): GET /twin is built from constants, and the only
19
+ * clock on the path is `worldNow()`, the world's frozen instant.
20
+ *
21
+ * Workerd-clean since R20: the `/npm/@clerk/clerk-js` loader path serves the REAL
22
+ * pinned browser dist through the pack-asset seam (R20), because this pack's whole point is that the
23
+ * unmodified clerk-js bundle loads from it. That route is a local-CDN affordance for a browser
24
+ * lane; the API doors above it touch no filesystem.
25
+ */
26
+ export declare function createClerkTwinFetch(options?: ClerkTwinFetchOptions): (request: Request) => Promise<Response>;
27
+ export declare function createClerkTwinServer(options: {
28
+ root?: string;
29
+ port?: number;
30
+ readOnly?: boolean;
31
+ personas?: Array<Record<string, unknown>>;
32
+ }): Promise<{
33
+ port: number;
34
+ stop: () => void;
35
+ }>;