@fangorn-network/westmarch 2026.10.20-dev → 2026.10.22-dev

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 (586) hide show
  1. package/README.md +4 -2
  2. package/docs/app-to-agent.md +48 -46
  3. package/package.json +6 -5
  4. package/site/dist/assets/AccountNotFoundScreen-C4njXc69-DyVH4CEz.js +1 -0
  5. package/site/dist/assets/AddFundsSelectionScreen-RAoCn7ej-Dz1--SS9.js +31 -0
  6. package/site/dist/assets/Address-H8kD1d9O-BdFZmRwI.js +17 -0
  7. package/site/dist/assets/AffirmativeConsentScreen-BG0MJxku-CxaCAisL.js +6 -0
  8. package/site/dist/assets/AllowlistRejectionScreen-Cae6e1Od-JGk7vndN.js +1 -0
  9. package/site/dist/assets/ApiController-CTLbMCcH.js +5 -0
  10. package/site/dist/assets/ArrowsRightLeftIcon-B8g9adpz.js +1 -0
  11. package/site/dist/assets/AuthenticateWithWalletScreen-CU6hIcFT-CXD9_OP8.js +1 -0
  12. package/site/dist/assets/AwaitingEvmToSolBridgingScreen-D0e_sZMS-BtJCglvU.js +1 -0
  13. package/site/dist/assets/AwaitingExternalEthereumTransferScreen-ur5HL4R7-BgC2TsqH.js +1 -0
  14. package/site/dist/assets/AwaitingPasswordlessCodeScreen-DRHz76mM-B9OzLeEO.js +103 -0
  15. package/site/dist/assets/AwaitingSolToEvmBridgingScreen-CdLRrGD2-C7r5snUL.js +1 -0
  16. package/site/dist/assets/BridgeNetworkSelectionView-CFGjB2nO-BTV0NRio.js +68 -0
  17. package/site/dist/assets/CaptchaScreen-DbpvkIGx-7rSZIuM-.js +1 -0
  18. package/site/dist/assets/CheckCircleIcon-B1l17ioc.js +1 -0
  19. package/site/dist/assets/CheckCircleIcon-BGSI8nKf.js +1 -0
  20. package/site/dist/assets/Checkbox-D1EDeo41-BUfq0w99.js +52 -0
  21. package/site/dist/assets/ChevronDownIcon-B6uJvPHu.js +1 -0
  22. package/site/dist/assets/Chip-CZKIKt9K-r9Nk__0-.js +26 -0
  23. package/site/dist/assets/CoinbaseOnrampStatusScreen-BbyCJDXL-DWWNHxmR.js +16 -0
  24. package/site/dist/assets/ConnectEmailForm-B-VRE0MN-CRQwS0Xu.js +3 -0
  25. package/site/dist/assets/ConnectLedgerScreen-DWHABGot-CZcCt31O.js +10 -0
  26. package/site/dist/assets/ConnectOnlyLandingScreen-CZYx9Bmp-C5IOf-SQ.js +1 -0
  27. package/site/dist/assets/ConnectOnlyStatusScreen-DCRzjxHx-cwg74F3A.js +1 -0
  28. package/site/dist/assets/ConnectOrCreateScreen-CUUYUO07-D28oeK6b.js +1 -0
  29. package/site/dist/assets/ConnectPhoneForm-Dek5xn4C-EEdkKeTp.js +95 -0
  30. package/site/dist/assets/ConnectWalletView-DqI-PTvX-C2mEzukj.js +74 -0
  31. package/site/dist/assets/ConnectionStatusScreen-fUfROm9m-CH_7r8iV.js +7 -0
  32. package/site/dist/assets/ConnectionStatusScreen-fUfROm9m-Z33kis0B.js +1 -0
  33. package/site/dist/assets/ConnectorUtil-DH4NePk5.js +21 -0
  34. package/site/dist/assets/ConstantsUtil-DmLsRHAl.js +198 -0
  35. package/site/dist/assets/CopyToClipboard-i_OQSBJr-_G88JCVR.js +39 -0
  36. package/site/dist/assets/CopyableText-CQapvaMr-CGGfc_zM.js +28 -0
  37. package/site/dist/assets/CrossAppAuthScreen-CLw7ymZq-C9Okoc0V.js +1 -0
  38. package/site/dist/assets/CustomLandingScreenView-Cm_MBSyX-D2l6hdSl.js +22 -0
  39. package/site/dist/assets/DelegatedActionsConsentScreen-DYF2U4y5-Dda3KKqS.js +1 -0
  40. package/site/dist/assets/DelegatedActionsRevokeScreen-bPp6Uwyh-DG8kJPt1.js +1 -0
  41. package/site/dist/assets/DepositAddressAddressStepView-4vdkb55L-CcOUfn6f.js +187 -0
  42. package/site/dist/assets/DepositAddressScreen-DBLRs7aI-DeituDNh.js +8 -0
  43. package/site/dist/assets/DepositAddressV3Screen-CDqIEMQw-FDg6K14-.js +1 -0
  44. package/site/dist/assets/{EmailInputForm-Cqo1mda8-CZD4r5LM.js → EmailInputForm-Cqo1mda8-BmbxvPHC.js} +11 -11
  45. package/site/dist/assets/EmbeddedWalletConnectingScreen-D4T7DUzs-B05CQ9rx.js +1 -0
  46. package/site/dist/assets/EmbeddedWalletCreatedScreen-D7WhW5ve-Cxd1b9XH.js +1 -0
  47. package/site/dist/assets/EmbeddedWalletKeyExportScreen-CqV4NYQ3-CrJy0ViX.js +23 -0
  48. package/site/dist/assets/EmbeddedWalletOnAccountCreateScreen-BoKb3Q2S-Bakaa3zu.js +1 -0
  49. package/site/dist/assets/EmbeddedWalletPasswordUpdateScreen-D3rMlqS7-j78vKrcj.js +1 -0
  50. package/site/dist/assets/EmbeddedWalletPasswordUpdateSplashScreen-BPFkWJeE-D3dr7W9_.js +1 -0
  51. package/site/dist/assets/EnrollTotp-Dibew4dp-BXbYV8nI.js +66 -0
  52. package/site/dist/assets/EnvelopeIcon-DjPofnRI.js +1 -0
  53. package/site/dist/assets/ErrorBanner-BcpGRt0h-BhH6_V-9.js +21 -0
  54. package/site/dist/assets/{ErrorMessage-D8VaAP5m-oSruKN8L.js → ErrorMessage-D8VaAP5m-Bs7uX2a9.js} +2 -2
  55. package/site/dist/assets/ErrorScreen-DipdTWzE-BgPRgnOb.js +4 -0
  56. package/site/dist/assets/ErrorScreen-DipdTWzE-CvxXC6pz.js +1 -0
  57. package/site/dist/assets/ExclamationCircleIcon-BE-WGrut.js +1 -0
  58. package/site/dist/assets/ExclamationTriangleIcon-Ca1Xlc_f.js +1 -0
  59. package/site/dist/assets/FarcasterConnectStatusScreen-51tjUxqq-De2JvZdV.js +75 -0
  60. package/site/dist/assets/FarcasterSignerStatusScreen-6x-Uh95G-bLp3hXoO.js +28 -0
  61. package/site/dist/assets/FiatOnrampScreen-BAhYeiTI-Jr6D6JiZ.js +491 -0
  62. package/site/dist/assets/FingerPrintIcon-DOCbS93y.js +1 -0
  63. package/site/dist/assets/FundSolWalletWithExternalSolanaWallet-WtLwYaOl-A_G5kfa1.js +1 -0
  64. package/site/dist/assets/FundWalletMethodHeader-BWNkokCT-LPv35wkD.js +1 -0
  65. package/site/dist/assets/FundWithBankDepositScreen-DajkHxBD-0hfGrfvf.js +58 -0
  66. package/site/dist/assets/FundingEditAmountScreen-CpvpiO4M-Dz0s_NWR.js +1 -0
  67. package/site/dist/assets/FundingMethodSelectionScreen-Db7vhRlE-ZGm-3-Io.js +1 -0
  68. package/site/dist/assets/GlobeAltIcon-BBRl2MMn.js +1 -0
  69. package/site/dist/assets/GooglePay-B53WnudL-BGiVpB8y.js +1 -0
  70. package/site/dist/assets/HCaptchaWrapper-CUi9LJsp-CHdfIeD_.js +4 -0
  71. package/site/dist/assets/InAppBrowserLoginNotPossible-BMR9br1T-Cgoiow3m.js +1 -0
  72. package/site/dist/assets/InfoBanner-Cb3p1z12-_YqQmRiu.js +22 -0
  73. package/site/dist/assets/InjectedWalletIcon-DLcYOGDj-tuIrKQHH.js +1 -0
  74. package/site/dist/assets/InstallWalletScreen-DTA8dwLv-BMU_wa61.js +1 -0
  75. package/site/dist/assets/{JsonTree-BHzNC-ic-pAEq1bl9.js → JsonTree-BHzNC-ic-DcVr0YF0.js} +3 -3
  76. package/site/dist/assets/{LabelXs-oqZNqbm_-D09YjVR4.js → LabelXs-oqZNqbm_-CNprGVQM.js} +2 -2
  77. package/site/dist/assets/LandingScreen-CGWUoSUG-fH6rsQen.js +1 -0
  78. package/site/dist/assets/{Layouts-BMRfo5hw-D2u1-w8g.js → Layouts-BMRfo5hw-e-sepi6F.js} +16 -16
  79. package/site/dist/assets/Link-BdDilT2T-BdwlRJch.js +40 -0
  80. package/site/dist/assets/LinkConflictScreen-C3ZEPsgl-BXKN2Qm5.js +77 -0
  81. package/site/dist/assets/LinkEmailScreen-dKo9frwc-Cyn7Q8p1.js +1 -0
  82. package/site/dist/assets/LinkPasskeyScreen-zbrl_AI_-CWiqnwLM.js +117 -0
  83. package/site/dist/assets/LinkPasskeyScreen-zbrl_AI_-YmDevJzf.js +1 -0
  84. package/site/dist/assets/LinkPhoneScreen-oIUpfj0w-h7shW-Ay.js +1 -0
  85. package/site/dist/assets/Loader-UAZqxsnw-DJEVblm1.js +62 -0
  86. package/site/dist/assets/{LoadingSkeleton-BMsgO5PV-BRMh4Fv4.js → LoadingSkeleton-BMsgO5PV-D2atjsP5.js} +6 -6
  87. package/site/dist/assets/LockClosedIcon-9EFzWK1C.js +1 -0
  88. package/site/dist/assets/LoginFailedScreen-CN0dJV6U-By3Si77a.js +1 -0
  89. package/site/dist/assets/ManualTransferScreen-CHqcuqbs-BAHPY8rs.js +1 -0
  90. package/site/dist/assets/MfaAuthEnrollmentFlowScreen-Dj7gPTRC-CLjffFG1.js +1 -0
  91. package/site/dist/assets/MfaAuthVerifyFlowScreen-DbFpyWMy-BmQg1Y61.js +1 -0
  92. package/site/dist/assets/MfaEnrollmentFlowScreen-DhLnGgnr-DmBtTtlw.js +1 -0
  93. package/site/dist/assets/MfaVerifyFlowScreen-C_XPjMRP-4a683Bmf.js +1 -0
  94. package/site/dist/assets/ModalFooter-BCuEK_nz-C_71qsaz.js +403 -0
  95. package/site/dist/assets/MoonpayStatusScreen-CzTUtokc-DEHHcEf8.js +16 -0
  96. package/site/dist/assets/OAuthStatusScreen-ufbOa-da-BjAb_WsY.js +1 -0
  97. package/site/dist/assets/OpenLink-CUpJ1mOr-BLWFsPOW.js +39 -0
  98. package/site/dist/assets/PasskeySelectSignupOrLogin-xh2ScC_l-2PJTJxX-.js +1 -0
  99. package/site/dist/assets/PasskeyStatusScreen-Bla8MaOk-DCEg761l.js +6 -0
  100. package/site/dist/assets/PasswordRecoveryScreen-awGXZkQk-8nVjNc8k.js +20 -0
  101. package/site/dist/assets/{PhArrowCircleDown-BtlNV0TZ.js → PhArrowCircleDown-D97G-BOA.js} +5 -5
  102. package/site/dist/assets/PhArrowClockwise-DVgyFuez.js +14 -0
  103. package/site/dist/assets/PhArrowDown-87b1BizM.js +14 -0
  104. package/site/dist/assets/PhArrowLeft-Da0MfnbK.js +14 -0
  105. package/site/dist/assets/PhArrowRight-AdrIL4DW.js +14 -0
  106. package/site/dist/assets/{PhArrowSquareOut-DnQ7n_B4.js → PhArrowSquareOut-Bk2CMG3I.js} +5 -5
  107. package/site/dist/assets/PhArrowUp-4sgyKPGx.js +14 -0
  108. package/site/dist/assets/PhArrowUpRight-BNghD2zq.js +14 -0
  109. package/site/dist/assets/{PhArrowsClockwise-Brtx2Re-.js → PhArrowsClockwise-BXRn1GEl.js} +5 -5
  110. package/site/dist/assets/{PhArrowsDownUp-PZosTqZG.js → PhArrowsDownUp-DM09Jo_3.js} +5 -5
  111. package/site/dist/assets/PhArrowsLeftRight-MuKBLUoF.js +14 -0
  112. package/site/dist/assets/{PhBank-hhPAIPVb.js → PhBank-fHbgCqqZ.js} +5 -5
  113. package/site/dist/assets/PhBrowser-2-9m-AkM.js +14 -0
  114. package/site/dist/assets/PhCaretDown-BDNabFuL.js +14 -0
  115. package/site/dist/assets/PhCaretLeft-CI460R-A.js +14 -0
  116. package/site/dist/assets/PhCaretRight-D7ZS3Ls8.js +14 -0
  117. package/site/dist/assets/PhCaretUp-C-iIfyvO.js +14 -0
  118. package/site/dist/assets/PhCheck-DxQXn57r.js +14 -0
  119. package/site/dist/assets/{PhCircleHalf-Bk9C4DvT.js → PhCircleHalf-MJZeRBGF.js} +5 -5
  120. package/site/dist/assets/PhClock-x3MS3Mwi.js +14 -0
  121. package/site/dist/assets/{PhCompass-Df1ugFO-.js → PhCompass-hYn3HhGN.js} +5 -5
  122. package/site/dist/assets/PhCopy-CWNYcABI.js +14 -0
  123. package/site/dist/assets/{PhCreditCard-CZpdid2n.js → PhCreditCard-Fy4pzwtt.js} +5 -5
  124. package/site/dist/assets/{PhCurrencyDollar-B6IKKjue.js → PhCurrencyDollar-BgiaenCi.js} +5 -5
  125. package/site/dist/assets/{PhDesktop-BuCDXYJj.js → PhDesktop-CxrzCSv5.js} +5 -5
  126. package/site/dist/assets/PhDeviceMobile-CsyA5Goi.js +14 -0
  127. package/site/dist/assets/PhDotsThree-D-k1BiYg.js +14 -0
  128. package/site/dist/assets/PhEnvelope-D8kzeNox.js +14 -0
  129. package/site/dist/assets/PhFunnelSimple-CfQs5DAW.js +14 -0
  130. package/site/dist/assets/{PhGlobe-q1mqj65V.js → PhGlobe-DvmSc9_A.js} +5 -5
  131. package/site/dist/assets/{PhIdentificationCard-BeLXJpfZ.js → PhIdentificationCard-CfkZm-5K.js} +5 -5
  132. package/site/dist/assets/{PhImage-BYrKfN9k.js → PhImage-Cf0J2ZfJ.js} +5 -5
  133. package/site/dist/assets/{PhInfo-X33f06Ej.js → PhInfo-Bwi51-2X.js} +5 -5
  134. package/site/dist/assets/{PhLightbulb-DMZJsowR.js → PhLightbulb-C4FZV7Es.js} +5 -5
  135. package/site/dist/assets/PhMagnifyingGlass-C9u8jSCJ.js +14 -0
  136. package/site/dist/assets/{PhPaperPlaneRight-Dvo-nXr9.js → PhPaperPlaneRight-zxQVvPLX.js} +5 -5
  137. package/site/dist/assets/PhPlus-C4UoW-2n.js +14 -0
  138. package/site/dist/assets/{PhPower-D8-AcNM6.js → PhPower-CFyWDmgD.js} +5 -5
  139. package/site/dist/assets/{PhPuzzlePiece-C-7mYqGO.js → PhPuzzlePiece-BjoNVfST.js} +5 -5
  140. package/site/dist/assets/{PhQrCode-uIXlI5ER.js → PhQrCode-CP3tFauY.js} +5 -5
  141. package/site/dist/assets/{PhQuestion-rUoqC2sC.js → PhQuestion-wOWJBd3G.js} +5 -5
  142. package/site/dist/assets/{PhQuestionMark-W55Txvvb.js → PhQuestionMark-CV0k9C0Y.js} +5 -5
  143. package/site/dist/assets/{PhSealCheck-BeVLq9PH.js → PhSealCheck-vIKzREuN.js} +5 -5
  144. package/site/dist/assets/{PhSignOut-Cq2PivQ6.js → PhSignOut-CxELV-i0.js} +5 -5
  145. package/site/dist/assets/{PhSpinner-CZMtAFdX.js → PhSpinner-CGDmbzUd.js} +5 -5
  146. package/site/dist/assets/{PhTrash-BamrmMsN.js → PhTrash-C9PD0SAt.js} +5 -5
  147. package/site/dist/assets/{PhUser-A2fxqIV0.js → PhUser-0sWNXQeZ.js} +5 -5
  148. package/site/dist/assets/{PhVault-B8m1usHw.js → PhVault-6JTskUcC.js} +5 -5
  149. package/site/dist/assets/{PhWarning-CpkID9oi.js → PhWarning-CoKs3gz6.js} +5 -5
  150. package/site/dist/assets/PhWarningCircle-BXHw1fCt.js +14 -0
  151. package/site/dist/assets/PhX-DX0SFIqC.js +14 -0
  152. package/site/dist/assets/PhoneIcon-CZ47md80.js +1 -0
  153. package/site/dist/assets/PinInput-DbZ0b1i1-BrTXu3Km.js +247 -0
  154. package/site/dist/assets/PrivyPluginContext-DA-yS5vO-CY60yubk.js +1 -0
  155. package/site/dist/assets/QrCode-DbnZwlkH-CcMrWV5D.js +22 -0
  156. package/site/dist/assets/RecoveryOAuthStatusScreen-CsgtTI2x-DgeDnHOK.js +1 -0
  157. package/site/dist/assets/RecoveryPasswordCreateScreen-Be-qJ-LU-CvJJwLhK.js +1 -0
  158. package/site/dist/assets/RecoverySelectionScreen-D1iGtpmi-CADtGtSV.js +7 -0
  159. package/site/dist/assets/SIWXUtil-Cpiv91-M.js +1 -0
  160. package/site/dist/assets/{Screen-D30meWsY-DDum2qlY.js → Screen-D30meWsY-vEusJ7KX.js} +22 -22
  161. package/site/dist/assets/{ScreenHeader-CHmc4-Lu-BqrAEXbV.js → ScreenHeader-CHmc4-Lu-BvGTLg53.js} +4 -4
  162. package/site/dist/assets/ScreenLayout-OwaQQcxH-cfOTmyl0.js +1 -0
  163. package/site/dist/assets/{SelectSourceAsset-CWFog6gm-8iXuqbAs.js → SelectSourceAsset-CWFog6gm-DxYklZYs.js} +18 -18
  164. package/site/dist/assets/SetAutomaticRecoveryScreen-BO_OEqAZ-oeqeo05x.js +14 -0
  165. package/site/dist/assets/SetWalletPasswordForm-DwCTVtAh-BxFee9UA.js +11 -0
  166. package/site/dist/assets/ShieldCheckIcon-eFjsosCA.js +1 -0
  167. package/site/dist/assets/SignRequestScreen-BHKv32KR-z8ixfIma.js +26 -0
  168. package/site/dist/assets/SolanaWalletConnector-C7Lqk-Wz-Bc_lvdiF.js +1 -0
  169. package/site/dist/assets/{StackedContainer-B2vaEl56-C-ojzCoQ.js → StackedContainer-B2vaEl56-Do5dXB8-.js} +2 -2
  170. package/site/dist/assets/StandardSignAndSendTransactionScreen-CfhIXVtd-DudetZAc.js +20 -0
  171. package/site/dist/assets/{Subtitle-CV-2yKE4-o-1FQLlX.js → Subtitle-CV-2yKE4-DV0o1av3.js} +2 -2
  172. package/site/dist/assets/TelegramAuthScreen-UL9zLfO8-Bo3sONvf.js +1 -0
  173. package/site/dist/assets/{Title-BnzYV3Is-RX1f0RV-.js → Title-BnzYV3Is-C3qOPnO_.js} +2 -2
  174. package/site/dist/assets/TodoList-DnyULl18-BvxvubbF.js +36 -0
  175. package/site/dist/assets/TransactionDetails-e9nesl30-WWflkOIi.js +109 -0
  176. package/site/dist/assets/TransactionErrorView-BDBNqA_f-CotYKcgf.js +178 -0
  177. package/site/dist/assets/TransferFromWalletScreen-Qvn1Yuno-sVFlWqa8.js +31 -0
  178. package/site/dist/assets/TransferOrBridgeLoadingScreen-Dl1I_iIz-CV2-mY19.js +6 -0
  179. package/site/dist/assets/TurnstileWrapper-B7sNddys-oPbuMTQt.js +1 -0
  180. package/site/dist/assets/UpdateEmailScreen-DVOhPV0H-D_mjSpAy.js +1 -0
  181. package/site/dist/assets/UpdatePhoneScreen-CXRswTNZ-6RLG0ahv.js +1 -0
  182. package/site/dist/assets/UserLimitReachedScreen-5we2DHn8-CaVN0bti.js +1 -0
  183. package/site/dist/assets/{Value-DTgR824E-DZpvBCWi.js → Value-DTgR824E-Bp6WGZZm.js} +7 -7
  184. package/site/dist/assets/WalletCards-DH1rqayz-D3cOTb9x.js +1 -0
  185. package/site/dist/assets/WalletIcon-DOIZhb2l.js +1 -0
  186. package/site/dist/assets/WalletInfoCard-sq_2wgFg-bOqfl5MA.js +29 -0
  187. package/site/dist/assets/WalletInterstitialScreen-Sh7LfsAh-DWaVkMCA.js +1 -0
  188. package/site/dist/assets/WalletLink-DK5LB5Ha-DjUZvqs-.js +20 -0
  189. package/site/dist/assets/WalletOverflowButton-bfCnp-9T-B6P7DQXA.js +1 -0
  190. package/site/dist/assets/WarningBanner-ZZqCEtZK-Bc2YKZb7.js +21 -0
  191. package/site/dist/assets/__vite-browser-external-NciY4Vu1.js +1 -0
  192. package/site/dist/assets/_esm-BZP3cXTv.js +1 -0
  193. package/site/dist/assets/_esm-ZmzBJpEs.js +6 -0
  194. package/site/dist/assets/accounts-D4AXF17G.js +1 -0
  195. package/site/dist/assets/accounts-IkdFx9nq.js +1 -0
  196. package/site/dist/assets/analytics-mkkvFRju-BRBcadka.js +1 -0
  197. package/site/dist/assets/baseSepolia-Bn1j1Ysw.js +1 -0
  198. package/site/dist/assets/basic-Cz1YiCSk.js +1575 -0
  199. package/site/dist/assets/capitalizeFirstLetter-DmLYqXsO-DtOXx-2n.js +1 -0
  200. package/site/dist/assets/ccip-B1J3oTZx.js +7 -0
  201. package/site/dist/assets/ccip-Bd7261zy.js +1 -0
  202. package/site/dist/assets/ccip-D6EHKpjI.js +1 -0
  203. package/site/dist/assets/chain-scefkYIH.js +5 -0
  204. package/site/dist/assets/check-DHnllI8N.js +1 -0
  205. package/site/dist/assets/chevron-down-1y-r4bGO.js +1 -0
  206. package/site/dist/assets/circle-alert-OwxamXUX.js +1 -0
  207. package/site/dist/assets/circle-check-big-3sZGVC10.js +1 -0
  208. package/site/dist/assets/circle-x-DQjNUV9J.js +1 -0
  209. package/site/dist/assets/client-B-BpRtwY.js +1 -0
  210. package/site/dist/assets/client-BfIR1FvH.js +9 -0
  211. package/site/dist/assets/coinbase-DCPC2L_R-YEuIn3jh.js +3 -0
  212. package/site/dist/assets/copy-DMOX_yn7.js +1 -0
  213. package/site/dist/assets/core-GIEmxmAa.js +12 -0
  214. package/site/dist/assets/createLucideIcon-BsERoFTA.js +1 -0
  215. package/site/dist/assets/defineChain-B-SQDLTG.js +1 -0
  216. package/site/dist/assets/dijkstra-CY95afk4.js +1 -0
  217. package/site/dist/assets/dist-CoS6E-3x.js +1 -0
  218. package/site/dist/assets/dist-Cp6IXeJd.js +1 -0
  219. package/site/dist/assets/dist-CrNxmdZj.js +1 -0
  220. package/site/dist/assets/dist-DYGtf4F0.js +16 -0
  221. package/site/dist/assets/embed.worker-Cnl4VGr3.js +1 -0
  222. package/site/dist/assets/errors-BQ3N-RVt-CZPAWCgC.js +1 -0
  223. package/site/dist/assets/esm-C3DslVJx.js +1 -0
  224. package/site/dist/assets/esm-Ci1ogKuK.js +1 -0
  225. package/site/dist/assets/esm-Co94ENUV.js +37 -0
  226. package/site/dist/assets/esm-bb8SANZh.js +1 -0
  227. package/site/dist/assets/esm-n2lWo7kz.js +1 -0
  228. package/site/dist/assets/ethers-zTjbodk5-Cs648CnD.js +1 -0
  229. package/site/dist/assets/eventemitter3-Dzc_0Uq2.js +1 -0
  230. package/site/dist/assets/external-link-BBPG3rG7.js +1 -0
  231. package/site/dist/assets/farcaster-DPlSjvF5-CzBCmgyL.js +1 -0
  232. package/site/dist/assets/features-CuiHbgEJ.js +2 -0
  233. package/site/dist/assets/fingerprint-pattern-CjLtyIxB.js +1 -0
  234. package/site/dist/assets/floating-ui.react-DmaCfayr.js +1 -0
  235. package/site/dist/assets/floating-ui.react-dom-CaoMF8mP.js +1 -0
  236. package/site/dist/assets/formatErc20TokenAmount-BuPk9xcy-BVqOKQif.js +1 -0
  237. package/site/dist/assets/formatter-CVbp4SlJ.js +1 -0
  238. package/site/dist/assets/get-entropy-details-for-user-dHRH5Gpi-BNiOFXbK.js +1 -0
  239. package/site/dist/assets/getChainName-DjpPdUSc-DUyKDrnp.js +1 -0
  240. package/site/dist/assets/getErc20Balance-jXNpFf0N-q4bV8kQq.js +1 -0
  241. package/site/dist/assets/getErc20TokenInfo-BNTrzLMP-DcnTFrXN.js +1 -0
  242. package/site/dist/assets/getFormattedUsdFromLamports-De3U9GlO-Gx4_wxON.js +1 -0
  243. package/site/dist/assets/getUsdcMintAddress-BVgm9GRo-r2UnDeEy.js +1 -0
  244. package/site/dist/assets/guards-BIW-GiMJ-D3tWTQAR.js +1 -0
  245. package/site/dist/assets/hooks.module-BYZGfwDl.js +1 -0
  246. package/site/dist/assets/hourglass-D_GfQdJr.js +1 -0
  247. package/site/dist/assets/id-UqEwL2BI-CTlvRMA5.js +1 -0
  248. package/site/dist/assets/index-BdEw5wyl-kLbhqLbv.js +1 -0
  249. package/site/dist/assets/index-C2h3EneX.js +8 -0
  250. package/site/dist/assets/{index-CWARkn2w-D6ikWJWj.js → index-CWARkn2w-DxuckIFn.js} +7 -7
  251. package/site/dist/assets/index-DvMddJcd-CNBb4VUn.js +12 -0
  252. package/site/dist/assets/index-YiCw0Y_x-Czl0tWfF.js +436 -0
  253. package/site/dist/assets/index.browser-B-i-Lj3J.js +1 -0
  254. package/site/dist/assets/index.browser-BMmUcykv.js +1 -0
  255. package/site/dist/assets/index.es-Crd0TyUS.js +2 -0
  256. package/site/dist/assets/index.es-DQbup1WG.js +3 -0
  257. package/site/dist/assets/isPaymentRequestAvailable-Bq1cemEn-Cjf3l05I.js +1 -0
  258. package/site/dist/assets/jsx-runtime-CndCZlyt.js +1 -0
  259. package/site/dist/assets/landmark-BZPqMFEf.js +1 -0
  260. package/site/dist/assets/lib-DGtzi2DK.js +1 -0
  261. package/site/dist/assets/localBatchGatewayRequest-B71J8sQ9.js +29 -0
  262. package/site/dist/assets/lock-DyN_c-ud.js +1 -0
  263. package/site/dist/assets/logger-CsXm3oIv-B0UYpNFI.js +1 -0
  264. package/site/dist/assets/mail-V_mcPb64.js +1 -0
  265. package/site/dist/assets/modal-context-CwmSeFcv-DPWNJrfK.js +1 -0
  266. package/site/dist/assets/native-BKj27wfc.js +1 -0
  267. package/site/dist/assets/ofetch.CWycOUEr-Duby3iHT.js +1 -0
  268. package/site/dist/assets/parseAbi-Csg-8t59.js +2 -0
  269. package/site/dist/assets/parseAbiParameters-BWbIMYe4.js +1 -0
  270. package/site/dist/assets/parseEther-CHS0GNkM.js +1 -0
  271. package/site/dist/assets/pkce-DXF0yKjP-7_VY-d83.js +1 -0
  272. package/site/dist/assets/preload-helper-CRzLMJPS.js +1 -0
  273. package/site/dist/assets/privy-context-81KmsBw2-DiR6-Yq8.js +2 -0
  274. package/site/dist/assets/property-DuZ9DLP4.js +3 -0
  275. package/site/dist/assets/react-BfYA1q0G.js +1 -0
  276. package/site/dist/assets/react-CK2HRI1t.js +1 -0
  277. package/site/dist/assets/react-DxGeY8B8.js +1 -0
  278. package/site/dist/assets/react-auth-sHnipzbS.js +1 -0
  279. package/site/dist/assets/react-dom-BI2Koe4o.js +1 -0
  280. package/site/dist/assets/reservoir-x-nGuZkT-BguVFH3D.js +1 -0
  281. package/site/dist/assets/roles-BDPDWrwo.js +1 -0
  282. package/site/dist/assets/roles-DKPW79Ca.js +1 -0
  283. package/site/dist/assets/rolldown-runtime-Bjp52BOI.js +1 -0
  284. package/site/dist/assets/safe-url-D7SRPu33-CkMedGro.js +1 -0
  285. package/site/dist/assets/secp256k1-BeYL8aZl.js +1 -0
  286. package/site/dist/assets/secp256k1-Bh4MSkhz.js +1 -0
  287. package/site/dist/assets/secp256k1-Ci4cqHl0.js +1 -0
  288. package/site/dist/assets/secp256k1-DsxXqbXv.js +1 -0
  289. package/site/dist/assets/secp256k1-N9RUmafO.js +1 -0
  290. package/site/dist/assets/serializeAuthorizationList-DGMik9Wx.js +1 -0
  291. package/site/dist/assets/serializeSignature-CWKpxoab.js +2 -0
  292. package/site/dist/assets/sha2-C6s7zZmb.js +1 -0
  293. package/site/dist/assets/{shared-DRZUmnL5-MWD-C-pp.js → shared-DRZUmnL5-BewE5wK8.js} +33 -33
  294. package/site/dist/assets/{shared-FM0rljBt-c4eSjzGj.js → shared-FM0rljBt-CxLACri_.js} +6 -6
  295. package/site/dist/assets/shouldProceedtoEmbeddedWalletCreationFlow-B3vyavrh-BkAKsRNi.js +1 -0
  296. package/site/dist/assets/simulateTransaction-CfuOrae4-PjA_tGjX.js +1 -0
  297. package/site/dist/assets/smartphone-3p8nFSTE.js +1 -0
  298. package/site/dist/assets/src-BBjkfi-Q.js +1 -0
  299. package/site/dist/assets/storage-Ufl800Ne-1qCR2JMO.js +8 -0
  300. package/site/dist/assets/stringify-DqUj9VzO.js +20 -0
  301. package/site/dist/assets/stripe.esm-DEi2D291.js +2 -0
  302. package/site/dist/assets/styles-BsotlekN-Aq27nZGc.js +9 -0
  303. package/site/dist/assets/{styles-Cm9H63WO-Cv1TbqYi.js → styles-Cm9H63WO-p_ic_dxE.js} +17 -17
  304. package/site/dist/assets/{styles-DVyDvTdj-CI4xZNHp.js → styles-DVyDvTdj-CjsWqAld.js} +8 -8
  305. package/site/dist/assets/{styles-hslXy6xG-DeVcFoDD.js → styles-hslXy6xG-D5QHIrJU.js} +23 -23
  306. package/site/dist/assets/telegram-B-JqnkqZ-Dqkm4rDn.js +1 -0
  307. package/site/dist/assets/to-ui-error-DWe-qwS3-Bi1HUQI9.js +4 -0
  308. package/site/dist/assets/toViemAccount-B5iDGq1b-CdFZwv07.js +2 -0
  309. package/site/dist/assets/transaction-BNTP-bFm-M5tJx8vY.js +1 -0
  310. package/site/dist/assets/transfer-6YztDh-t-BVQkTvG-.js +1 -0
  311. package/site/dist/assets/transformers.web-BTyOEJ0C.js +40 -0
  312. package/site/dist/assets/transformers.web-CUZUFjAK.js +49 -0
  313. package/site/dist/assets/triangle-alert-BG3Qw-Hq.js +1 -0
  314. package/site/dist/assets/twitch-5IOe4sIQ-CaXHFlAu.js +1 -0
  315. package/site/dist/assets/types-4CuOD23i.js +1 -0
  316. package/site/dist/assets/use-headless-crypto-deposit-Yn-QRLB3-CQqeyhGY.js +1 -0
  317. package/site/dist/assets/use-unlink-wallet-BKK4_5Ur-C0xQN_Lp.js +1 -0
  318. package/site/dist/assets/useActiveWallet-B-yZYGc6-BkK6rFBm.js +123 -0
  319. package/site/dist/assets/useGetSolPrice-x7gfUIHJ-CLVXqv6I.js +1 -0
  320. package/site/dist/assets/useGetTokenPrice-CaoUkb79-DAXXs3rs.js +1 -0
  321. package/site/dist/assets/useI18n-C-5n_noF-CGpkgIVy.js +1 -0
  322. package/site/dist/assets/useWalletBalance-CZnP5f_f-Cfd64m4n.js +1 -0
  323. package/site/dist/assets/useWallets-X1ndvJ_U-CAYqg7Za.js +1 -0
  324. package/site/dist/assets/utils-BkR7EQjg.js +1 -0
  325. package/site/dist/assets/utils-DJhBNOZA.js +1 -0
  326. package/site/dist/assets/utils-DdckVfQr.js +1 -0
  327. package/site/dist/assets/w3m-modal-B4H_uiPH.js +1174 -0
  328. package/site/dist/assets/wallet-BNI12IYk.js +1 -0
  329. package/site/dist/assets/wallet-CITSaPlB.js +2 -0
  330. package/site/dist/assets/wallet-connect-BvJtUsDt-CVlSNIXP.js +1 -0
  331. package/site/dist/assets/walletconnect-registry-xxG8XLCb-BpzpBq5s.js +1 -0
  332. package/site/dist/assets/walletconnect-v2-3frQFwbg-CzZ6oybX.js +12 -0
  333. package/site/dist/assets/{index-CztIxJB6.js → wui-ux-by-reown-XyHdtV1O.js} +296 -296
  334. package/site/dist/assets/x-gjDrY2rk.js +1 -0
  335. package/site/dist/index.html +5 -117
  336. package/site/worker.js +6 -30
  337. package/src/agent/mcp.js +47 -15
  338. package/src/agent/view-tools.js +3 -11
  339. package/src/agent/x402.js +3 -42
  340. package/src/discover/apps.js +37 -2
  341. package/src/discover/explore.js +19 -13
  342. package/src/publish/init.js +74 -0
  343. package/src/publish/ship.js +36 -79
  344. package/src/publish/view-cli.js +6 -3
  345. package/src/publish/view.js +27 -43
  346. package/template/.github/workflows/ship.yml +33 -0
  347. package/template/README.md +38 -0
  348. package/template/app.json +27 -0
  349. package/template/ci/ship.sh +21 -0
  350. package/template/eval/goals.md +7 -0
  351. package/template/eval/golden.jsonl +0 -0
  352. package/template/gitignore +3 -0
  353. package/template/package.json +8 -0
  354. package/site/dist/assets/AccountNotFoundScreen-C4njXc69-RUyAWRzV.js +0 -1
  355. package/site/dist/assets/AddFundsSelectionScreen-RAoCn7ej-ZV-LlYBe.js +0 -31
  356. package/site/dist/assets/Address-H8kD1d9O-CGQnt7Pu.js +0 -17
  357. package/site/dist/assets/AffirmativeConsentScreen-BG0MJxku-CKn2JLwq.js +0 -6
  358. package/site/dist/assets/AllowlistRejectionScreen-Cae6e1Od-9oIP9fma.js +0 -1
  359. package/site/dist/assets/ArrowsRightLeftIcon-BEhBD_6N.js +0 -1
  360. package/site/dist/assets/AuthenticateWithWalletScreen-CU6hIcFT-D1wLlSJs.js +0 -1
  361. package/site/dist/assets/AwaitingEvmToSolBridgingScreen-D0e_sZMS-CSBbHTyz.js +0 -1
  362. package/site/dist/assets/AwaitingExternalEthereumTransferScreen-ur5HL4R7-BsRq-xBt.js +0 -1
  363. package/site/dist/assets/AwaitingPasswordlessCodeScreen-DRHz76mM-BPdhsKvN.js +0 -103
  364. package/site/dist/assets/AwaitingSolToEvmBridgingScreen-CdLRrGD2-CEGNdrkr.js +0 -1
  365. package/site/dist/assets/BridgeNetworkSelectionView-CFGjB2nO-Da9P7eSx.js +0 -68
  366. package/site/dist/assets/CaptchaScreen-DbpvkIGx-BecgMnD_.js +0 -1
  367. package/site/dist/assets/CheckCircleIcon-DBiWFjO6.js +0 -1
  368. package/site/dist/assets/CheckCircleIcon-DzG2ROJZ.js +0 -1
  369. package/site/dist/assets/Checkbox-D1EDeo41-DMHcj9o_.js +0 -52
  370. package/site/dist/assets/ChevronDownIcon-2Os56gUt.js +0 -1
  371. package/site/dist/assets/Chip-CZKIKt9K-BWzs9fj5.js +0 -26
  372. package/site/dist/assets/CoinbaseOnrampStatusScreen-BbyCJDXL-CFvcSiDs.js +0 -16
  373. package/site/dist/assets/ConnectEmailForm-B-VRE0MN-BozkCg8q.js +0 -3
  374. package/site/dist/assets/ConnectLedgerScreen-DWHABGot-DaCnbBzh.js +0 -10
  375. package/site/dist/assets/ConnectOnlyLandingScreen-CZYx9Bmp-DUkCLkxD.js +0 -1
  376. package/site/dist/assets/ConnectOnlyStatusScreen-DCRzjxHx-Dv_5nMkZ.js +0 -1
  377. package/site/dist/assets/ConnectOrCreateScreen-CUUYUO07-DSGEeB3Y.js +0 -1
  378. package/site/dist/assets/ConnectPhoneForm-Dek5xn4C-C-s4s_Lq.js +0 -95
  379. package/site/dist/assets/ConnectWalletView-DqI-PTvX-BKX7fdYr.js +0 -74
  380. package/site/dist/assets/ConnectionStatusScreen-fUfROm9m-DSoAuMFZ.js +0 -7
  381. package/site/dist/assets/CopyToClipboard-i_OQSBJr-CZTXyfV0.js +0 -39
  382. package/site/dist/assets/CopyableText-CQapvaMr-DHO818I0.js +0 -28
  383. package/site/dist/assets/CrossAppAuthScreen-CLw7ymZq-DW4nRGfz.js +0 -1
  384. package/site/dist/assets/CustomLandingScreenView-Cm_MBSyX-DH8Nnb4Y.js +0 -22
  385. package/site/dist/assets/DelegatedActionsConsentScreen-DYF2U4y5-gfUS_uV5.js +0 -1
  386. package/site/dist/assets/DelegatedActionsRevokeScreen-bPp6Uwyh-DZj9HTHc.js +0 -1
  387. package/site/dist/assets/DepositAddressAddressStepView-4vdkb55L-eHYsDK9W.js +0 -187
  388. package/site/dist/assets/DepositAddressScreen-DBLRs7aI-DK_XVgVk.js +0 -8
  389. package/site/dist/assets/DepositAddressV3Screen-CDqIEMQw-6gRZzhLe.js +0 -1
  390. package/site/dist/assets/EmbeddedWalletConnectingScreen-D4T7DUzs-BZu2ae0k.js +0 -1
  391. package/site/dist/assets/EmbeddedWalletCreatedScreen-D7WhW5ve-86pviemJ.js +0 -1
  392. package/site/dist/assets/EmbeddedWalletKeyExportScreen-CqV4NYQ3-vDcvT53Y.js +0 -23
  393. package/site/dist/assets/EmbeddedWalletOnAccountCreateScreen-BoKb3Q2S-rNJAtSJc.js +0 -1
  394. package/site/dist/assets/EmbeddedWalletPasswordUpdateScreen-D3rMlqS7-I8Q95280.js +0 -1
  395. package/site/dist/assets/EmbeddedWalletPasswordUpdateSplashScreen-BPFkWJeE-Coi7OxoI.js +0 -1
  396. package/site/dist/assets/EnrollTotp-Dibew4dp-DC7FrDgo.js +0 -66
  397. package/site/dist/assets/EnvelopeIcon-DY6ERnW7.js +0 -1
  398. package/site/dist/assets/ErrorBanner-BcpGRt0h-BvESwN99.js +0 -21
  399. package/site/dist/assets/ErrorScreen-DipdTWzE-DnKGxH1Z.js +0 -4
  400. package/site/dist/assets/ExclamationCircleIcon-BZhlqH0r.js +0 -1
  401. package/site/dist/assets/ExclamationTriangleIcon-CkAOJIYV.js +0 -1
  402. package/site/dist/assets/FarcasterConnectStatusScreen-51tjUxqq-4pi7jooW.js +0 -75
  403. package/site/dist/assets/FarcasterSignerStatusScreen-6x-Uh95G-z2XCMaLL.js +0 -28
  404. package/site/dist/assets/FiatOnrampScreen-BAhYeiTI-CBVA9v1-.js +0 -491
  405. package/site/dist/assets/FingerPrintIcon-ra2dqmJO.js +0 -1
  406. package/site/dist/assets/FundSolWalletWithExternalSolanaWallet-WtLwYaOl-DwAwc6Ny.js +0 -1
  407. package/site/dist/assets/FundWalletMethodHeader-BWNkokCT-CZszQsZf.js +0 -1
  408. package/site/dist/assets/FundWithBankDepositScreen-DajkHxBD-DfX6nvFQ.js +0 -58
  409. package/site/dist/assets/FundingEditAmountScreen-CpvpiO4M-CDS_sk_t.js +0 -1
  410. package/site/dist/assets/FundingMethodSelectionScreen-Db7vhRlE-CPfNQemT.js +0 -1
  411. package/site/dist/assets/GlobeAltIcon-SEUEIe_E.js +0 -1
  412. package/site/dist/assets/GooglePay-B53WnudL-aap7zwag.js +0 -1
  413. package/site/dist/assets/HCaptchaWrapper-CUi9LJsp-DgSjCjQI.js +0 -4
  414. package/site/dist/assets/InAppBrowserLoginNotPossible-BMR9br1T-DO4wICml.js +0 -1
  415. package/site/dist/assets/InfoBanner-Cb3p1z12-CDWt2ADo.js +0 -22
  416. package/site/dist/assets/InjectedWalletIcon-DLcYOGDj-Ba19XoBr.js +0 -1
  417. package/site/dist/assets/InstallWalletScreen-DTA8dwLv-DGpewEch.js +0 -1
  418. package/site/dist/assets/LandingScreen-CGWUoSUG-CUOCWUXd.js +0 -1
  419. package/site/dist/assets/Link-BdDilT2T-BYiP1zvW.js +0 -40
  420. package/site/dist/assets/LinkConflictScreen-C3ZEPsgl-Tb6cAepT.js +0 -77
  421. package/site/dist/assets/LinkEmailScreen-dKo9frwc-pq0NF2JO.js +0 -1
  422. package/site/dist/assets/LinkPasskeyScreen-zbrl_AI_-D9MOmDqg.js +0 -117
  423. package/site/dist/assets/LinkPhoneScreen-oIUpfj0w-B80UJqAZ.js +0 -1
  424. package/site/dist/assets/LockClosedIcon-BqkoEL9J.js +0 -1
  425. package/site/dist/assets/LoginFailedScreen-CN0dJV6U-DlnOM-Kh.js +0 -1
  426. package/site/dist/assets/ManualTransferScreen-CHqcuqbs-DSShupq9.js +0 -1
  427. package/site/dist/assets/MfaAuthEnrollmentFlowScreen-Dj7gPTRC-DUPV_SLA.js +0 -1
  428. package/site/dist/assets/MfaAuthVerifyFlowScreen-DbFpyWMy-D96GpzXX.js +0 -1
  429. package/site/dist/assets/MfaEnrollmentFlowScreen-DhLnGgnr-CYQDa4ND.js +0 -1
  430. package/site/dist/assets/MfaVerifyFlowScreen-C_XPjMRP-CJtSAXGN.js +0 -1
  431. package/site/dist/assets/ModalFooter-BCuEK_nz-D2I8KWtk.js +0 -403
  432. package/site/dist/assets/MoonpayStatusScreen-CzTUtokc-Bx5aHy-z.js +0 -16
  433. package/site/dist/assets/OAuthStatusScreen-ufbOa-da-CS6988X2.js +0 -1
  434. package/site/dist/assets/OpenLink-CUpJ1mOr-EZWVSX2r.js +0 -39
  435. package/site/dist/assets/PasskeySelectSignupOrLogin-xh2ScC_l-BY4eK5Jh.js +0 -1
  436. package/site/dist/assets/PasskeyStatusScreen-Bla8MaOk-LXys76u9.js +0 -6
  437. package/site/dist/assets/PasswordRecoveryScreen-awGXZkQk-RczvLvmo.js +0 -20
  438. package/site/dist/assets/PhArrowClockwise-mOiWYLMV.js +0 -14
  439. package/site/dist/assets/PhArrowDown-CkoOD89h.js +0 -14
  440. package/site/dist/assets/PhArrowLeft-C0jlxVhM.js +0 -14
  441. package/site/dist/assets/PhArrowRight-BI-V03Xf.js +0 -14
  442. package/site/dist/assets/PhArrowUp-izKvURUW.js +0 -14
  443. package/site/dist/assets/PhArrowUpRight-Bn-JhHsY.js +0 -14
  444. package/site/dist/assets/PhArrowsLeftRight-CYsRQ2qh.js +0 -14
  445. package/site/dist/assets/PhBrowser-BjzAmrHO.js +0 -14
  446. package/site/dist/assets/PhCaretDown-ddSjwcwm.js +0 -14
  447. package/site/dist/assets/PhCaretLeft-B7YLoNEF.js +0 -14
  448. package/site/dist/assets/PhCaretRight-BY8D5MIg.js +0 -14
  449. package/site/dist/assets/PhCaretUp-BG10nSut.js +0 -14
  450. package/site/dist/assets/PhCheck-DrKd7pBC.js +0 -14
  451. package/site/dist/assets/PhClock-Sj17weCB.js +0 -14
  452. package/site/dist/assets/PhCopy-rgttky8E.js +0 -14
  453. package/site/dist/assets/PhDeviceMobile-CnybhXY-.js +0 -14
  454. package/site/dist/assets/PhDotsThree-CSAEcba1.js +0 -14
  455. package/site/dist/assets/PhEnvelope-SmaNeXoQ.js +0 -14
  456. package/site/dist/assets/PhFunnelSimple-DKx35ITq.js +0 -14
  457. package/site/dist/assets/PhMagnifyingGlass-B6D0sWFL.js +0 -14
  458. package/site/dist/assets/PhPlus-CBvZvLax.js +0 -14
  459. package/site/dist/assets/PhWarningCircle-Cm58gXb9.js +0 -14
  460. package/site/dist/assets/PhX-C3b4cCEy.js +0 -14
  461. package/site/dist/assets/PhoneIcon-CzbssTb8.js +0 -1
  462. package/site/dist/assets/PinInput-DbZ0b1i1-1DtLWL81.js +0 -247
  463. package/site/dist/assets/QrCode-DbnZwlkH-ChwcUk_h.js +0 -22
  464. package/site/dist/assets/RecoveryOAuthStatusScreen-CsgtTI2x-C79jd345.js +0 -1
  465. package/site/dist/assets/RecoveryPasswordCreateScreen-Be-qJ-LU-C9c0x-yq.js +0 -1
  466. package/site/dist/assets/RecoverySelectionScreen-D1iGtpmi-PNqHb6CI.js +0 -7
  467. package/site/dist/assets/ScreenLayout-OwaQQcxH-B4Z8FjFp.js +0 -1
  468. package/site/dist/assets/SetAutomaticRecoveryScreen-BO_OEqAZ-CUpQZ9wq.js +0 -14
  469. package/site/dist/assets/SetWalletPasswordForm-DwCTVtAh-ZzvPLj2s.js +0 -15
  470. package/site/dist/assets/ShieldCheckIcon-Bjwe_-PV.js +0 -1
  471. package/site/dist/assets/SignRequestScreen-BHKv32KR-0qGeNipB.js +0 -26
  472. package/site/dist/assets/StandardSignAndSendTransactionScreen-CfhIXVtd-C3lgJb68.js +0 -20
  473. package/site/dist/assets/TelegramAuthScreen-UL9zLfO8-l35_C2DG.js +0 -1
  474. package/site/dist/assets/TodoList-DnyULl18-JxWWU9KA.js +0 -36
  475. package/site/dist/assets/TransactionDetails-e9nesl30-C91nJPM9.js +0 -109
  476. package/site/dist/assets/TransactionErrorView-BDBNqA_f-Cpm-4xzm.js +0 -178
  477. package/site/dist/assets/TransferFromWalletScreen-Qvn1Yuno-BWCH7-Si.js +0 -31
  478. package/site/dist/assets/TransferOrBridgeLoadingScreen-Dl1I_iIz-BWMeJabk.js +0 -6
  479. package/site/dist/assets/TurnstileWrapper-B7sNddys-Dgr80Gih.js +0 -1
  480. package/site/dist/assets/UpdateEmailScreen-DVOhPV0H-Clk4zk-8.js +0 -1
  481. package/site/dist/assets/UpdatePhoneScreen-CXRswTNZ-BgRsoR3B.js +0 -1
  482. package/site/dist/assets/UserLimitReachedScreen-5we2DHn8-D-SU-vAz.js +0 -1
  483. package/site/dist/assets/WalletCards-DH1rqayz-UuZ4i_Ze.js +0 -1
  484. package/site/dist/assets/WalletIcon-B1i03Vqc.js +0 -1
  485. package/site/dist/assets/WalletInfoCard-sq_2wgFg-TXTxmb8L.js +0 -29
  486. package/site/dist/assets/WalletInterstitialScreen-Sh7LfsAh-CbrFb0ON.js +0 -1
  487. package/site/dist/assets/WalletLink-DK5LB5Ha-BYQZV7UV.js +0 -20
  488. package/site/dist/assets/WalletOverflowButton-bfCnp-9T-CNgSPnTS.js +0 -1
  489. package/site/dist/assets/WarningBanner-ZZqCEtZK-DNZUUOph.js +0 -21
  490. package/site/dist/assets/__vite-browser-external-BIHI7g3E.js +0 -1
  491. package/site/dist/assets/analytics-mkkvFRju-DOXuftJB.js +0 -1
  492. package/site/dist/assets/basic-C9wn6QoQ.js +0 -1575
  493. package/site/dist/assets/bytes-CjWw8TJh.js +0 -1
  494. package/site/dist/assets/capitalizeFirstLetter-DmLYqXsO-tV1Idewc.js +0 -1
  495. package/site/dist/assets/ccip-BhHEqVIW.js +0 -1
  496. package/site/dist/assets/check-C_DTyjLS.js +0 -1
  497. package/site/dist/assets/chevron-down-iklXXH-z.js +0 -1
  498. package/site/dist/assets/circle-alert-KEOUF48T.js +0 -1
  499. package/site/dist/assets/circle-check-big-BJ_ADwB4.js +0 -1
  500. package/site/dist/assets/circle-x-BSfWmhYk.js +0 -1
  501. package/site/dist/assets/client-BnDcP42J.js +0 -9
  502. package/site/dist/assets/client-DH86IrJA.js +0 -125
  503. package/site/dist/assets/coinbase-DCPC2L_R-2ivYfoMv.js +0 -3
  504. package/site/dist/assets/copy-sK00DOfH.js +0 -1
  505. package/site/dist/assets/core-CRE213RM.js +0 -211
  506. package/site/dist/assets/createLucideIcon-D9OK_uxG.js +0 -1
  507. package/site/dist/assets/custom-V1wex-Di.js +0 -1
  508. package/site/dist/assets/dijkstra-COg3n3zL.js +0 -1
  509. package/site/dist/assets/embed.worker-BRIYO7m8.js +0 -1
  510. package/site/dist/assets/encodePacked-DyXYq3Cc.js +0 -1
  511. package/site/dist/assets/ethers-zTjbodk5-DSYOi6tU.js +0 -1
  512. package/site/dist/assets/external-link-Cdp8NBio.js +0 -1
  513. package/site/dist/assets/fallback-DiFue5Zm.js +0 -1
  514. package/site/dist/assets/farcaster-DPlSjvF5-DP2DLoHZ.js +0 -1
  515. package/site/dist/assets/features-B6BTj_BL.js +0 -5
  516. package/site/dist/assets/fingerprint-pattern-gFJTz5e4.js +0 -1
  517. package/site/dist/assets/floating-ui.react-D9ndYqYK.js +0 -1
  518. package/site/dist/assets/floating-ui.react-dom-CNbOgOFt.js +0 -1
  519. package/site/dist/assets/formatErc20TokenAmount-BuPk9xcy-CkAr4Oc0.js +0 -1
  520. package/site/dist/assets/getChainName-DjpPdUSc-c2urPd0g.js +0 -1
  521. package/site/dist/assets/getErc20Balance-jXNpFf0N-mFQ9Iqk-.js +0 -1
  522. package/site/dist/assets/getErc20TokenInfo-BNTrzLMP-Dx5he_uG.js +0 -1
  523. package/site/dist/assets/getFormattedUsdFromLamports-De3U9GlO-C446pzMl.js +0 -1
  524. package/site/dist/assets/getTransactionCount-80UHlwAV.js +0 -1
  525. package/site/dist/assets/getUsdcMintAddress-BVgm9GRo-FDalV59C.js +0 -1
  526. package/site/dist/assets/hashTypedData-Beq57Ogb.js +0 -22
  527. package/site/dist/assets/hooks.module-ClpaQ1Tg.js +0 -1
  528. package/site/dist/assets/hourglass-CB7z_I9H.js +0 -1
  529. package/site/dist/assets/http-BocEfKYb.js +0 -19
  530. package/site/dist/assets/index-0knDOgU9.js +0 -1
  531. package/site/dist/assets/index-9jNeS_nC.js +0 -1
  532. package/site/dist/assets/index-B--T-Fmt.js +0 -16
  533. package/site/dist/assets/index-BDkarAkX.js +0 -2
  534. package/site/dist/assets/index-BMfMy017.js +0 -679
  535. package/site/dist/assets/index-BOd8jv8-.js +0 -1
  536. package/site/dist/assets/index-BdEw5wyl-2VGMzHIs.js +0 -1
  537. package/site/dist/assets/index-C8ThRelw.js +0 -9
  538. package/site/dist/assets/index-D4LdLFDC.js +0 -1
  539. package/site/dist/assets/index-D6T-s6sR.js +0 -1
  540. package/site/dist/assets/index-D7396TWe.js +0 -1
  541. package/site/dist/assets/index-DdxtHe81.js +0 -2
  542. package/site/dist/assets/index-DvMddJcd-D7AEQrzj.js +0 -12
  543. package/site/dist/assets/index-nibyPLVP.js +0 -1
  544. package/site/dist/assets/index.browser-B6Bt5URJ.js +0 -1
  545. package/site/dist/assets/isPaymentRequestAvailable-Bq1cemEn-D7xtzRqA.js +0 -1
  546. package/site/dist/assets/landmark-CMLKifhk.js +0 -1
  547. package/site/dist/assets/lock-BkyjNE8h.js +0 -1
  548. package/site/dist/assets/mail-B6-Tq9Ld.js +0 -1
  549. package/site/dist/assets/native-CJ5et6AR.js +0 -1
  550. package/site/dist/assets/nonceManager-zkW7cM66.js +0 -1
  551. package/site/dist/assets/parseEther-C7aOvuze.js +0 -1
  552. package/site/dist/assets/parseSignature-BIjcuWdB.js +0 -1
  553. package/site/dist/assets/preload-helper-PPVm8Dsz.js +0 -1
  554. package/site/dist/assets/privateKeyToAccount-CRvvpHWf.js +0 -1
  555. package/site/dist/assets/property-CnFDNXw5.js +0 -3
  556. package/site/dist/assets/react-auth_false-DedQs79w.js +0 -1
  557. package/site/dist/assets/reservoir-x-nGuZkT-DFxAFt2v.js +0 -1
  558. package/site/dist/assets/roles-DV_6FRBZ.js +0 -1
  559. package/site/dist/assets/safe-url-D7SRPu33-A8zMgOTd.js +0 -1
  560. package/site/dist/assets/serializeErc6492Signature-CeJeL3h6.js +0 -1
  561. package/site/dist/assets/serializeTransaction-L-_Ej-jW.js +0 -8
  562. package/site/dist/assets/shouldProceedtoEmbeddedWalletCreationFlow-B3vyavrh-CF2QteTJ.js +0 -1
  563. package/site/dist/assets/simulateTransaction-CfuOrae4-BHUMPf6Q.js +0 -1
  564. package/site/dist/assets/smartphone-DAN5rY0T.js +0 -1
  565. package/site/dist/assets/stripe.esm-Dv8C3q95.js +0 -2
  566. package/site/dist/assets/styles-BsotlekN-Cjuu2SDV.js +0 -9
  567. package/site/dist/assets/telegram-B-JqnkqZ-DTjJLkIF.js +0 -1
  568. package/site/dist/assets/to-ui-error-DWe-qwS3-Dx3yzcV0.js +0 -4
  569. package/site/dist/assets/toAccount-Bq6rbpbI.js +0 -1
  570. package/site/dist/assets/transaction-BNTP-bFm-CrebgH-D.js +0 -1
  571. package/site/dist/assets/transactionReceipt-BwJl-gjg.js +0 -1
  572. package/site/dist/assets/transfer-6YztDh-t-DU6hH7CZ.js +0 -1
  573. package/site/dist/assets/transformers.web-BEKVh7pD.js +0 -40
  574. package/site/dist/assets/transformers.web-aWa49tv1.js +0 -40
  575. package/site/dist/assets/triangle-alert-ndoiBs4y.js +0 -1
  576. package/site/dist/assets/twitch-5IOe4sIQ-BXviIywg.js +0 -1
  577. package/site/dist/assets/useGetSolPrice-x7gfUIHJ-C7axYJ--.js +0 -1
  578. package/site/dist/assets/useGetTokenPrice-CaoUkb79-CR4CrguU.js +0 -1
  579. package/site/dist/assets/useI18n-C-5n_noF-C_t8QqBJ.js +0 -1
  580. package/site/dist/assets/useWalletBalance-CZnP5f_f-BnSHLVI_.js +0 -1
  581. package/site/dist/assets/w3m-modal-Bz5KWTQ-.js +0 -1174
  582. package/site/dist/assets/wallet-DTM31trz.js +0 -2
  583. package/site/dist/assets/wallet-UESEqPei.js +0 -1
  584. package/site/dist/assets/wallet-connect-BvJtUsDt-CnvUnFbz.js +0 -1
  585. package/site/dist/assets/walletconnect-v2-3frQFwbg-CzQk99gS.js +0 -15
  586. package/site/dist/assets/x-B2_XdOVQ.js +0 -1
@@ -0,0 +1 @@
1
+ import{t as e}from"./createLucideIcon-BsERoFTA.js";var t=e(`x`,[[`path`,{d:`M18 6 6 18`,key:`1bl5f8`}],[`path`,{d:`m6 6 12 12`,key:`d8bk6v`}]]);export{t};
@@ -1,126 +1,14 @@
1
1
  <!doctype html>
2
2
  <html lang="en">
3
- <script type="module" crossorigin src="./assets/index-C8ThRelw.js"></script>
4
- <link rel="modulepreload" crossorigin href="./assets/preload-helper-PPVm8Dsz.js">
5
- <link rel="modulepreload" crossorigin href="./assets/roles-DV_6FRBZ.js">
3
+ <script type="module" crossorigin src="./assets/index-C2h3EneX.js"></script>
4
+ <link rel="modulepreload" crossorigin href="./assets/rolldown-runtime-Bjp52BOI.js">
5
+ <link rel="modulepreload" crossorigin href="./assets/preload-helper-CRzLMJPS.js">
6
+ <link rel="modulepreload" crossorigin href="./assets/roles-DKPW79Ca.js">
6
7
 
7
8
  <meta charset="utf-8">
8
9
  <meta name="viewport" content="width=device-width, initial-scale=1">
9
10
  <title>Fangorn app</title>
10
- <style>
11
- /* The fangorn base: structure and a few tokens, no paint. An app repaints by shipping its own
12
- theme.css (site.pages/theme.css), loaded after this; override the tokens first, rules if you must. */
13
- :root {
14
- --bg: #fbfbf8; --fg: #1a1c19; --muted: #6a6f68; --line: #dfe1db; --accent: #2f5d45;
15
- --mark: #e6eedb; --hot: #b4432f; --edge: #b7bab2;
16
- --font: system-ui, sans-serif; --font-display: var(--font); --radius: 3px; --gutter: 16px; --measure: 760px;
17
- color-scheme: light;
18
- }
19
- @media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) {
20
- --bg: #121412; --fg: #e4e6e0; --muted: #959a92; --line: #2a2e29; --accent: #8fbf9f;
21
- --mark: #2d3b2a; --hot: #d9674f; --edge: #4b5049; color-scheme: dark; } }
22
- * { box-sizing: border-box; }
23
- body { background: var(--bg); color: var(--fg); font: 16px/1.5 var(--font); margin: 0; }
24
- a { color: var(--accent); } button, input { font: inherit; color: inherit; }
25
- button { cursor: pointer; background: none; border: 1px solid var(--line); border-radius: var(--radius); padding: 4px 10px; }
26
- button:disabled { opacity: .45; cursor: default; }
27
- :focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
28
- ul { list-style: none; padding: 0; margin: 0; }
29
- h2 { font-size: .75rem; font-weight: 600; text-transform: uppercase; letter-spacing: .08em; color: var(--muted); margin: 28px 0 8px; }
30
- h2.page, .record h2 { font: 600 1.3rem/1.3 var(--font-display); text-transform: none; letter-spacing: 0; color: var(--fg); margin: 4px 0 12px; }
31
- h3 { margin: 0; font-size: 1rem; }
32
- small, time, .hint, .empty, .about, #status, .resultsbar, .detail { color: var(--muted); }
33
- small, time, .hint { font-size: .8rem; }
34
- .paid { border: 1px solid var(--line); border-radius: var(--radius); padding: 10px 14px; margin: 12px 0; display: grid; gap: 6px; }
35
- .paid h3 { margin: 0; font-size: 1rem; } .paid ul { margin: 0; padding-left: 18px; } .detail { margin: 0; font-size: .9rem; }
36
- .forsale { color: var(--accent); font-weight: 600; }
37
- mark { background: var(--mark); color: inherit; }
38
-
39
- /* the bar: name, search, sections */
40
- .bar { position: sticky; top: 0; z-index: 2; background: var(--bg); border-bottom: 1px solid var(--line); }
41
- .bar > div, main, footer { max-width: var(--measure); margin: 0 auto; padding-inline: var(--gutter); }
42
- .bar > div { padding-block: 10px; display: flex; gap: 12px; align-items: center; flex-wrap: wrap; }
43
- #home { color: var(--fg); text-decoration: none; font: 600 1.1rem var(--font-display); white-space: nowrap; }
44
- #q { flex: 1 1 240px; }
45
- #q input { width: 100%; padding: 8px 10px; border: 1px solid var(--line); border-radius: var(--radius); background: transparent; }
46
- /* Where to go on the left; the reader's account and the app's own pages after a rule. */
47
- nav { display: flex; gap: 14px; font-size: .9rem; } nav > span { display: flex; gap: inherit; }
48
- #aside:not(:empty) { border-left: 1px solid var(--line); padding-left: 14px; }
49
- nav a { color: var(--muted); text-decoration: none; } nav a.on, nav a:hover { color: var(--fg); }
50
- main { padding-block: 16px 48px; }
51
-
52
- /* results: one rule between rows, votes on the right */
53
- .list, article { border-top: 1px solid var(--line); }
54
- .row { display: flex; gap: 10px; align-items: flex-start; padding: 10px 0; border-bottom: 1px solid var(--line); }
55
- .main { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; overflow-wrap: anywhere; }
56
- .title { color: var(--fg); text-decoration: none; font-weight: 500; } .title:hover { color: var(--accent); }
57
- .resultsbar { display: flex; justify-content: space-between; align-items: center; gap: 8px; flex-wrap: wrap; margin-bottom: 8px; font-size: .9rem; }
58
- .sort, .chips, .acts, .votes { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; }
59
- .chips { margin: 4px 0 16px; }
60
- .picker { display: inline-flex; flex-direction: column; gap: 4px; margin: 4px 0 16px; font-size: .85rem; color: var(--muted); }
61
- .picker select { font: inherit; font-size: 1rem; color: var(--fg); background: var(--bg); border: 1px solid var(--edge); border-radius: var(--radius); padding: 6px 10px; min-width: min(320px, 100%); }
62
- details.about summary { cursor: pointer; color: var(--fg); font-size: 1.05rem; }
63
- details.about p { color: var(--muted); margin: 6px 0 0; }
64
- .chip { font-size: .85rem; padding: 2px 10px; }
65
- .chip.on, .vote[aria-pressed="true"] { border-color: var(--accent); background: var(--mark); }
66
- .vote { padding: 2px 7px; line-height: 1.3; }
67
- .star { font-size: 1.25rem; line-height: 1; padding: 4px 6px; border: 0; color: var(--muted); }
68
- .star[aria-pressed="true"] { color: var(--accent); background: none; }
69
- .more, .linkish { border: 0; color: var(--accent); padding: 8px 0 0; font-size: .9rem; }
70
- .act { font-size: .88rem; text-decoration: none; color: var(--fg); border: 1px solid var(--line); border-radius: var(--radius); padding: 4px 10px; }
71
-
72
- /* occasions on the front page, one record */
73
- article { padding: 12px 0 4px; } article header { display: flex; flex-direction: column; margin-bottom: 4px; }
74
- article .list { border-top: 0; } article .row:last-child { border-bottom: 0; }
75
- .record { border-top: 0; }
76
- .record dl { display: grid; grid-template-columns: max-content 1fr; gap: 2px 14px; font-size: .88rem; margin: 12px 0; }
77
- .record dt { color: var(--muted); text-transform: capitalize; } .record dd { margin: 0; }
78
- .acts { margin: 12px 0 4px; }
79
- .signal { padding: 14px 0 6px; } .signal h3 { margin: 4px 0 6px; font: 600 1.15rem/1.3 var(--font-display); }
80
- .signal .meta { display: flex; flex-wrap: wrap; gap: 4px 10px; align-items: center; font-size: .78rem; color: var(--muted); text-transform: uppercase; letter-spacing: .04em; }
81
- .stage { color: var(--accent); font-weight: 700; }
82
- .steps { list-style: none; margin: 8px 0 0; padding: 0; } .steps li { display: grid; grid-template-columns: 7.5em 1fr; gap: 10px; padding: 5px 0; border-top: 1px solid var(--line); font-size: .9rem; }
83
- .steps time { color: var(--muted); font-variant-numeric: tabular-nums; }
84
- .doc iframe { width: 100%; height: 80vh; border: 1px solid var(--line); margin-top: 12px; background: #fff; }
85
-
86
- /* For you: what the taste is built from, and the four knobs */
87
- .taste { margin-bottom: 20px; }
88
- .pills { display: flex; flex-wrap: wrap; gap: 6px; margin: 6px 0; }
89
- .pills li { display: inline-flex; align-items: center; gap: 2px; border: 1px solid var(--line); border-radius: var(--radius); padding: 0 0 0 8px; font-size: .85rem; }
90
- .pills li.no { text-decoration: line-through; color: var(--muted); }
91
- .pills button { border: 0; padding: 0 8px; color: var(--muted); }
92
- .knobs { display: grid; gap: 12px; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); margin: 12px 0; }
93
- .knob { display: grid; gap: 2px; font-size: .85rem; }
94
- .knob span { display: flex; justify-content: space-between; font-weight: 600; }
95
- .knob input { width: 100%; accent-color: var(--accent); }
96
-
97
- /* the map, for apps that ship map.json */
98
- body.wide { --measure: 1200px; }
99
- .mapbar input { width: 100%; padding: 8px 10px; border: 1px solid var(--line); border-radius: var(--radius); background: transparent; margin-bottom: 8px; }
100
- .mapwrap { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 16px; align-items: start; }
101
- @media (max-width: 760px) { .mapwrap { grid-template-columns: 1fr; } }
102
- svg.map { width: 100%; height: auto; display: block; position: sticky; top: 70px; }
103
- svg.map path { stroke: var(--edge); stroke-width: .8; cursor: pointer; }
104
- svg.map path:hover, svg.map path:focus { stroke: var(--accent); stroke-width: 2; outline: none; }
105
- svg.map path.near { stroke: var(--accent); stroke-width: 2; stroke-dasharray: 4 3; }
106
- svg.map path.on { stroke: var(--fg); stroke-width: 2.6; }
107
- .h0 { fill: var(--bg); background: var(--bg); }
108
- .h1 { fill: color-mix(in srgb, var(--hot) 18%, var(--bg)); background: color-mix(in srgb, var(--hot) 18%, var(--bg)); }
109
- .h2 { fill: color-mix(in srgb, var(--hot) 36%, var(--bg)); background: color-mix(in srgb, var(--hot) 36%, var(--bg)); }
110
- .h3 { fill: color-mix(in srgb, var(--hot) 56%, var(--bg)); background: color-mix(in srgb, var(--hot) 56%, var(--bg)); }
111
- .h4 { fill: color-mix(in srgb, var(--hot) 78%, var(--bg)); background: color-mix(in srgb, var(--hot) 78%, var(--bg)); }
112
- .h5 { fill: var(--hot); background: var(--hot); }
113
- .sw { display: inline-block; width: 14px; height: 12px; border: 1px solid var(--edge); vertical-align: -1px; }
114
- .panel h3 { margin: 4px 0; } .panel .chips { margin: 6px 0; } .panel .list { margin-top: 8px; }
115
-
116
- footer { padding-block: 0 32px; color: var(--muted); font-size: .8rem; }
117
- /* what is inside, a pass, an agent's line */
118
- .gate .stats { font-size: 1.05rem; } .gate .stats strong { font: 600 1.4rem var(--font-display); }
119
- .buy { justify-self: start; border-color: var(--accent); background: var(--accent); color: var(--bg); padding: 8px 16px; font-weight: 600; }
120
- .agents { margin-top: 28px; } .copy { display: grid; gap: 4px; margin: 10px 0; }
121
- .copy pre { margin: 0; padding: 8px 10px; border: 1px solid var(--line); border-radius: var(--radius); overflow-x: auto; font-size: .8rem; }
122
- .copy .chip { justify-self: start; }
123
- </style>
11
+ <style>:root{--bg:#fbfbf8;--fg:#1a1c19;--muted:#6a6f68;--line:#dfe1db;--accent:#2f5d45;--mark:#e6eedb;--hot:#b4432f;--edge:#b7bab2;--font:system-ui, sans-serif;--font-display:var(--font);--radius:3px;--gutter:16px;--measure:760px;--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light}@media (prefers-color-scheme:dark){:root:not([data-theme=light]){--bg:#121412;--fg:#e4e6e0;--muted:#959a92;--line:#2a2e29;--accent:#8fbf9f;--mark:#2d3b2a;--hot:#d9674f;--edge:#4b5049;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}}*{box-sizing:border-box}body{background:var(--bg);color:var(--fg);font:16px/1.5 var(--font);margin:0}a{color:var(--accent)}button,input{font:inherit;color:inherit}button{cursor:pointer;border:1px solid var(--line);border-radius:var(--radius);background:0 0;padding:4px 10px}button:disabled{opacity:.45;cursor:default}:focus-visible{outline:2px solid var(--accent);outline-offset:2px}ul{margin:0;padding:0;list-style:none}h2{text-transform:uppercase;letter-spacing:.08em;color:var(--muted);margin:28px 0 8px;font-size:.75rem;font-weight:600}h2.page,.record h2{font:600 1.3rem/1.3 var(--font-display);text-transform:none;letter-spacing:0;color:var(--fg);margin:4px 0 12px}h3{margin:0;font-size:1rem}small,time,.hint,.empty,.about,#status,.resultsbar,.detail{color:var(--muted)}small,time,.hint{font-size:.8rem}.paid{border:1px solid var(--line);border-radius:var(--radius);gap:6px;margin:12px 0;padding:10px 14px;display:grid}.paid h3{margin:0;font-size:1rem}.paid ul{margin:0;padding-left:18px}.detail{margin:0;font-size:.9rem}.forsale{color:var(--accent);font-weight:600}mark{background:var(--mark);color:inherit}.bar{z-index:2;background:var(--bg);border-bottom:1px solid var(--line);position:sticky;top:0}.bar>div,main,footer{max-width:var(--measure);padding-inline:var(--gutter);margin:0 auto}.bar>div{flex-wrap:wrap;align-items:center;gap:12px;padding-block:10px;display:flex}#home{color:var(--fg);font:600 1.1rem var(--font-display);white-space:nowrap;text-decoration:none}#q{flex:240px}#q input{border:1px solid var(--line);border-radius:var(--radius);background:0 0;width:100%;padding:8px 10px}nav{gap:14px;font-size:.9rem;display:flex}nav>span{gap:inherit;display:flex}#aside:not(:empty){border-left:1px solid var(--line);padding-left:14px}nav a{color:var(--muted);text-decoration:none}nav a.on,nav a:hover{color:var(--fg)}main{padding-block:16px 48px}.list,article{border-top:1px solid var(--line)}.row{border-bottom:1px solid var(--line);align-items:flex-start;gap:10px;padding:10px 0;display:flex}.main{overflow-wrap:anywhere;flex-direction:column;flex:1;gap:2px;min-width:0;display:flex}.title{color:var(--fg);font-weight:500;text-decoration:none}.title:hover{color:var(--accent)}.resultsbar{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px;margin-bottom:8px;font-size:.9rem;display:flex}.sort,.chips,.acts,.votes{flex-wrap:wrap;align-items:center;gap:6px;display:flex}.chips{margin:4px 0 16px}.picker{color:var(--muted);flex-direction:column;gap:4px;margin:4px 0 16px;font-size:.85rem;display:inline-flex}.picker select{font:inherit;color:var(--fg);background:var(--bg);border:1px solid var(--edge);border-radius:var(--radius);min-width:min(320px,100%);padding:6px 10px;font-size:1rem}details.about summary{cursor:pointer;color:var(--fg);font-size:1.05rem}details.about p{color:var(--muted);margin:6px 0 0}.chip{padding:2px 10px;font-size:.85rem}.chip.on,.vote[aria-pressed=true]{border-color:var(--accent);background:var(--mark)}.vote{padding:2px 7px;line-height:1.3}.star{color:var(--muted);border:0;padding:4px 6px;font-size:1.25rem;line-height:1}.star[aria-pressed=true]{color:var(--accent);background:0 0}.more,.linkish{color:var(--accent);border:0;padding:8px 0 0;font-size:.9rem}.act{color:var(--fg);border:1px solid var(--line);border-radius:var(--radius);padding:4px 10px;font-size:.88rem;text-decoration:none}article{padding:12px 0 4px}article header{flex-direction:column;margin-bottom:4px;display:flex}article .list{border-top:0}article .row:last-child{border-bottom:0}.record{border-top:0}.record dl{grid-template-columns:max-content 1fr;gap:2px 14px;margin:12px 0;font-size:.88rem;display:grid}.record dt{color:var(--muted);text-transform:capitalize}.record dd{margin:0}.acts{margin:12px 0 4px}.signal{padding:14px 0 6px}.signal h3{font:600 1.15rem/1.3 var(--font-display);margin:4px 0 6px}.signal .meta{color:var(--muted);text-transform:uppercase;letter-spacing:.04em;flex-wrap:wrap;align-items:center;gap:4px 10px;font-size:.78rem;display:flex}.stage{color:var(--accent);font-weight:700}.steps{margin:8px 0 0;padding:0;list-style:none}.steps li{border-top:1px solid var(--line);grid-template-columns:7.5em 1fr;gap:10px;padding:5px 0;font-size:.9rem;display:grid}.steps time{color:var(--muted);font-variant-numeric:tabular-nums}.doc iframe{border:1px solid var(--line);background:#fff;width:100%;height:80vh;margin-top:12px}.taste{margin-bottom:20px}.pills{flex-wrap:wrap;gap:6px;margin:6px 0;display:flex}.pills li{border:1px solid var(--line);border-radius:var(--radius);align-items:center;gap:2px;padding:0 0 0 8px;font-size:.85rem;display:inline-flex}.pills li.no{color:var(--muted);text-decoration:line-through}.pills button{color:var(--muted);border:0;padding:0 8px}.knobs{grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:12px;margin:12px 0;display:grid}.knob{gap:2px;font-size:.85rem;display:grid}.knob span{justify-content:space-between;font-weight:600;display:flex}.knob input{width:100%;accent-color:var(--accent)}body.wide{--measure:1200px}.mapbar input{border:1px solid var(--line);border-radius:var(--radius);background:0 0;width:100%;margin-bottom:8px;padding:8px 10px}.mapwrap{grid-template-columns:minmax(0,1fr) minmax(0,1fr);align-items:start;gap:16px;display:grid}@media (width<=760px){.mapwrap{grid-template-columns:1fr}}svg.map{width:100%;height:auto;display:block;position:sticky;top:70px}svg.map path{stroke:var(--edge);stroke-width:.8px;cursor:pointer}svg.map path:hover,svg.map path:focus{stroke:var(--accent);stroke-width:2px;outline:none}svg.map path.near{stroke:var(--accent);stroke-width:2px;stroke-dasharray:4 3}svg.map path.on{stroke:var(--fg);stroke-width:2.6px}.h0{fill:var(--bg);background:var(--bg)}.h1{fill:color-mix(in srgb, var(--hot) 18%, var(--bg));background:color-mix(in srgb, var(--hot) 18%, var(--bg))}.h2{fill:color-mix(in srgb, var(--hot) 36%, var(--bg));background:color-mix(in srgb, var(--hot) 36%, var(--bg))}.h3{fill:color-mix(in srgb, var(--hot) 56%, var(--bg));background:color-mix(in srgb, var(--hot) 56%, var(--bg))}.h4{fill:color-mix(in srgb, var(--hot) 78%, var(--bg));background:color-mix(in srgb, var(--hot) 78%, var(--bg))}.h5{fill:var(--hot);background:var(--hot)}.sw{border:1px solid var(--edge);vertical-align:-1px;width:14px;height:12px;display:inline-block}.panel h3{margin:4px 0}.panel .chips{margin:6px 0}.panel .list{margin-top:8px}footer{color:var(--muted);padding-block:0 32px;font-size:.8rem}.gate .stats{font-size:1.05rem}.gate .stats strong{font:600 1.4rem var(--font-display)}.buy{border-color:var(--accent);background:var(--accent);color:var(--bg);justify-self:start;padding:8px 16px;font-weight:600}.agents{margin-top:28px}.copy{gap:4px;margin:10px 0;display:grid}.copy pre{border:1px solid var(--line);border-radius:var(--radius);margin:0;padding:8px 10px;font-size:.8rem;overflow-x:auto}.copy .chip{justify-self:start}</style>
124
12
  <link rel="stylesheet" href="./theme.css">
125
13
  <header class="bar"><div>
126
14
  <a id="home" href="#/"><span id="name">Fangorn app</span></a>
package/site/worker.js CHANGED
@@ -19,9 +19,6 @@
19
19
  // POST /paid {ids} many keys for one price, paid by one payment or several (vouchers).
20
20
  // Its 402 carries the Bazaar extension, so the facilitator lists it on
21
21
  // the first sale; /openapi.json and /.well-known/x402 name it for x402scan
22
- // POST /key {ids, tokenId, issuedAt, signature}
23
- // keys for a member: Barliman checks the signed request against the
24
- // MembershipRegistry (`canRead`), and nothing is paid here
25
22
  // anything else the static site (the stock page, the card)
26
23
  //
27
24
  // The paid records are not here. Each is already in the app's committed rows on IPFS,
@@ -30,7 +27,7 @@
30
27
  // paying, so nobody pays for a record that does not exist, and decrypts and checks it after.
31
28
  //
32
29
  // Bindings: VIEW (R2), AI (Workers AI), ASSETS (the site), CONFIG (a JSON var: app, name,
33
- // description, fromBlock, repos, paid, deployment), and optionally RPC_URL and IPFS_GATEWAY
30
+ // description, fromBlock, schema, repos, paid, deployment), and optionally RPC_URL and IPFS_GATEWAY
34
31
  // (vars) and PAID_SECRET (a secret).
35
32
 
36
33
  import { Fangorn, FangornConfig, SupportedNetworks, repoExcluded } from "@fangorn-network/sdk";
@@ -108,7 +105,7 @@ export async function index(env, { log = console.log } = {}) {
108
105
  // Imported here: x402.js's self-check imports this module, and a cycle at load would deadlock it.
109
106
  const { openRow } = await import("../src/agent/x402.js");
110
107
  const report = await publishView({
111
- fangorn: r.fangorn, app: CONFIG.app, repos: CONFIG.repos, store: r2Store(env.VIEW),
108
+ fangorn: r.fangorn, app: CONFIG.app, schema: CONFIG.schema, repos: CONFIG.repos, store: r2Store(env.VIEW),
112
109
  presented: await presented(r, state), embedBatch: encode(env, DOCUMENT), embedder: await embedderOf(env), log,
113
110
  ...(CONFIG.private ? { open: (p) => openRow(env.PAID_SECRET, p) } : {}),
114
111
  });
@@ -396,26 +393,6 @@ async function sellBatch(request, env, url) {
396
393
  return json({ keys: await keysFor(env, found), missing, receipts, paid: auths.map((a) => a.nonce) });
397
394
  }
398
395
 
399
- // POST /key: keys for a member. Barliman recovers who signed the request and asks the
400
- // MembershipRegistry whether that address may read this app now; this worker trusts its answer.
401
- // ponytail: one Barliman call per request; cache {tokenId, reader} → until if it gets busy.
402
- async function member(request, env) {
403
- const M = CONFIG.paid.membership;
404
- if (!M) return json({ error: "this app sells no memberships" }, 404);
405
- let b;
406
- try { b = await request.json(); } catch { return json({ error: "body must be JSON" }, 400); }
407
- const ids = [...new Set(b?.ids ?? [])].filter((x) => typeof x === "string");
408
- if (!ids.length || ids.length > MAX_BATCH) return json({ error: `between 1 and ${MAX_BATCH} ids` }, 400);
409
- let check;
410
- try {
411
- const r = await fetch(`${M.barliman}/check`, { method: "POST", headers: { "content-type": "application/json" },
412
- body: JSON.stringify({ appId: M.appId, tokenId: String(b.tokenId), ids, issuedAt: b.issuedAt, signature: b.signature }) });
413
- check = await r.json();
414
- } catch (e) { return json({ error: `could not check the membership: ${e.message}` }, 502); }
415
- if (!check.ok) return json({ error: check.error ?? "this membership cannot read this app now", until: check.until ?? null }, 403);
416
- return json({ keys: await keysFor(env, ids), reader: check.reader, until: check.until });
417
- }
418
-
419
396
  // ── a private app ─────────────────────────────────────────────────────────────
420
397
  // CONFIG.private: the rows are sealed on chain (x402.js's sealRow), opened by the cron with
421
398
  // PAID_SECRET, and the view is served only with access: a pass bought at POST /pass (one x402
@@ -495,7 +472,6 @@ const worker = {
495
472
  if (p === "/doc") return doc(request, env, url);
496
473
  if (p === "/paid" && request.method === "POST") return CONFIG.paid ? sellBatch(request, env, url) : json({ error: "nothing is sold here" }, 404);
497
474
  if (p.startsWith("/paid/")) return CONFIG.paid ? sell(request, env, url) : json({ error: "nothing is sold here" }, 404);
498
- if (p === "/key" && request.method === "POST") return CONFIG.paid ? member(request, env) : json({ error: "nothing is sold here" }, 404);
499
475
 
500
476
  const res = await env.ASSETS.fetch(request);
501
477
  const out = new Response(res.body, res);
@@ -512,7 +488,7 @@ export default worker;
512
488
 
513
489
  // ── self-check: `node site/worker.js` — a fake bucket, a fake AI binding, a fake registry ──
514
490
  if (typeof process !== "undefined" && import.meta.url === `file://${process.argv[1]}` && process.argv[1]?.endsWith("/worker.js")) {
515
- const { localFangorn, SCHEMA_REPO, TYPE_TAG } = await import("../src/publish/view.js");
491
+ const { localFangorn } = await import("../src/publish/view.js");
516
492
  const eq = (a, b, m) => { if (JSON.stringify(a) !== JSON.stringify(b)) throw new Error(`${m}: ${JSON.stringify(a)} != ${JSON.stringify(b)}`); };
517
493
 
518
494
  const objs = new Map();
@@ -541,14 +517,14 @@ if (typeof process !== "undefined" && import.meta.url === `file://${process.argv
541
517
 
542
518
  const APP = `0x${"ab".repeat(32)}`, OWNER = `0x${"11".repeat(20)}`, PUB = `0x${"22".repeat(20)}`, TAG = "shop.item.v1";
543
519
  const rec = (cid, type, payload) => ({ id: cid, cid, type, payload });
520
+ CONFIG.schema = { types: { [TAG]: { role_map: { identity: "sku", title: "name", text: "about", media: "doc" } } } };
544
521
  const chain = {
545
- [`${OWNER}/${SCHEMA_REPO}`]: { records: [rec("t", TYPE_TAG, { tag: TAG, role_map: { identity: "sku", title: "name", text: "about", media: "doc" } })] },
546
522
  [`${PUB}/shop`]: { records: [
547
523
  rec("c1", TAG, { sku: "a1", name: "Oak table", about: "a solid oak dining table", doc: "https://docs.example/oak.pdf" }),
548
524
  rec("c2", TAG, { sku: "b2", name: "Brass lamp", about: "a brass reading lamp" })] },
549
525
  };
550
526
  const fangorn = localFangorn(chain, { appId: APP, owner: OWNER });
551
- await publishView({ fangorn, app: APP, store: r2Store(VIEW), embedBatch: encode(env, DOCUMENT), embedder: WORKER_EMBEDDER, log: () => {} });
527
+ await publishView({ fangorn, app: APP, schema: CONFIG.schema, store: r2Store(VIEW), embedBatch: encode(env, DOCUMENT), embedder: WORKER_EMBEDDER, log: () => {} });
552
528
  eq([calls[0].model, calls[0].text[0].startsWith(DOCUMENT)], [AI_MODEL, true], "documents go to the AI binding with the document prompt");
553
529
 
554
530
  const call = async (method, params) => (await (await worker.fetch(new Request("https://shop.test/mcp",
@@ -575,7 +551,7 @@ if (typeof process !== "undefined" && import.meta.url === `file://${process.argv
575
551
  const sealedAgain = await sealRow(SECRET, { sku: "v1", name: "Velvet chair", about: "a green velvet armchair" });
576
552
  eq(sealedAgain, chain[`${PUB}/vault`].records[0].payload, "an unchanged row seals to the same bytes (the same CID: not embedded again)");
577
553
  if (JSON.stringify(sealedAgain).includes("Velvet")) throw new Error("a sealed row must not carry its plaintext");
578
- await publishView({ fangorn, app: APP, store: r2Store(VIEW), embedBatch: encode(env, DOCUMENT), embedder: WORKER_EMBEDDER, log: () => {},
554
+ await publishView({ fangorn, app: APP, schema: CONFIG.schema, store: r2Store(VIEW), embedBatch: encode(env, DOCUMENT), embedder: WORKER_EMBEDDER, log: () => {},
579
555
  open: (p) => openRow(SECRET, p) });
580
556
  env.PAID_SECRET = SECRET;
581
557
  CONFIG = env.CONFIG = { ...env.CONFIG, private: { network: "eip155:84532", asset: `0x${"aa".repeat(20)}`, payTo: `0x${"5e".repeat(20)}`,
package/src/agent/mcp.js CHANGED
@@ -21,6 +21,7 @@
21
21
  // price is handed back to the agent, to say to the person.
22
22
 
23
23
  import net from "node:net";
24
+ import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
24
25
  import { homedir } from "node:os";
25
26
  import { createInterface } from "node:readline";
26
27
  import { APP_EXTENSION, listApps, toApp } from "../discover/apps.js";
@@ -88,7 +89,7 @@ export async function remoteTools(url, fetcher = fetch, { access = null, wallet
88
89
  if (!asked) return r;
89
90
  if (!wallet) return { ...r, content: [...r.content, { type: "text", text: "This server has no wallet (FANGORN_MCP_WALLET_KEY), so nothing was paid: tell the person the price." }] };
90
91
  const x = await import("./x402.js");
91
- const account = (await import("viem/accounts")).privateKeyToAccount(wallet);
92
+ const account = (await import("viem/accounts")).privateKeyToAccount(`0x${wallet.trim().replace(/^0x/i, "")}`); // a key file may lack 0x
92
93
  if (access && maxPass != null && BigInt(access.pass) <= usdc(maxPass)) {
93
94
  bearer = (await x.buyPass(access, { account, fetchImpl: fetcher })).token;
94
95
  return rpc("tools/call", params);
@@ -102,7 +103,7 @@ export async function remoteTools(url, fetcher = fetch, { access = null, wallet
102
103
  // ── the network ─────────────────────────────────────────────────────────────
103
104
  // Catalogs, manifests and cards change on a rebake: held for a minute, so one
104
105
  // search (or resolving then verifying a card) does not fetch each twice.
105
- const CACHE = `${homedir()}/.cache/fangorn-mcp`; // the embedding model, for find-apps
106
+ const CACHE = `${homedir()}/.cache/fangorn-mcp`; // the embedding model (find-apps) and the chain logs read
106
107
  function cachingFetch(real = globalThis.fetch) {
107
108
  const memo = new Map();
108
109
  return async (input, init) => {
@@ -126,6 +127,27 @@ function cachingFetch(real = globalThis.fetch) {
126
127
  };
127
128
  }
128
129
 
130
+ /**
131
+ * The chain logs a scan has read, on disk, so a new session reads only the
132
+ * blocks since (apps.js cachedLogs). Logs carry bigints; JSON does not.
133
+ * ponytail: two servers writing at once can tear the file. A torn file reads
134
+ * as empty and the next scan starts over; write-then-rename if that ever bites.
135
+ */
136
+ function fileStore(path) {
137
+ const big = (_, v) => (typeof v === "bigint" ? { $n: String(v) } : v);
138
+ const unbig = (_, v) => (v?.$n !== undefined ? BigInt(v.$n) : v);
139
+ let data;
140
+ try { data = JSON.parse(readFileSync(path, "utf8"), unbig); } catch { data = {}; }
141
+ return {
142
+ get: (k) => data[k],
143
+ set: (k, v) => {
144
+ data[k] = v;
145
+ try { mkdirSync(CACHE, { recursive: true }); writeFileSync(path, JSON.stringify(data, big)); }
146
+ catch (e) { log(`log cache not saved: ${e.message}`); }
147
+ },
148
+ };
149
+ }
150
+
129
151
  /** JSON-RPC over newline-delimited stdio. Returns `notify` for server → client messages. */
130
152
  export function serve(handlers, { input = process.stdin, output = process.stdout } = {}) {
131
153
  const send = (m) => output.write(JSON.stringify({ jsonrpc: "2.0", ...m }) + "\n");
@@ -348,12 +370,25 @@ const vt = await import("./view-tools.js");
348
370
  const fb = argv.indexOf("--from-block");
349
371
  // The SDK's deployment by default: pass --from-block for another one.
350
372
  const fromBlock = fb >= 0 ? BigInt(argv[fb + 1]) : (await network()).appRegistryFromBlock;
351
- let found, foundAt = 0, explored, exploredAt = 0;
373
+ let found, foundAt = 0, explored, exploredAt = 0, pub, warming;
374
+ const chainClient = async () => {
375
+ if (!pub) {
376
+ const [{ createPublicClient, http }, net] = await Promise.all([import("viem"), network()]);
377
+ pub = createPublicClient({ chain: net.chain, transport: http(net.rpcUrl) });
378
+ }
379
+ return pub;
380
+ };
381
+ const store = fileStore(`${CACHE}/logs-${(await network()).chain.id}.json`);
382
+ // The embedder is for find-apps' ranking alone. Loading it blocks the thread for
383
+ // seconds, so not at startup, where it would hold up list-apps.
384
+ const warmEmbedder = () => (warming ??= vt.warm({ cacheDir: `${CACHE}/models` }).then((ok) => ok ? trace("embedder ready")
385
+ : log(`embedder unavailable, searching by words: ${vt.warmError}`)));
352
386
  const deps = {
353
- // ponytail: cached for a minute. The scan is a few RPC calls plus a fetch per card.
387
+ // ponytail: cached for a minute. The logs since the last scan, plus a fetch per card.
354
388
  findApps: async () => {
355
389
  if (!found || Date.now() - foundAt > 60_000) {
356
- const { apps, rejected } = await listApps(await fangorn(), { fromBlock });
390
+ const [f, head] = await Promise.all([fangorn(), chainClient().then((c) => c.getBlockNumber())]);
391
+ const { apps, rejected } = await listApps(f, { fromBlock, toBlock: head, store });
357
392
  found = { apps, rejected };
358
393
  foundAt = Date.now();
359
394
  }
@@ -361,9 +396,10 @@ const deps = {
361
396
  },
362
397
  // ponytail: cached for a minute, like findApps. Two getLogs, a card and catalog per app.
363
398
  exploreApps: async (query) => {
399
+ if (query?.trim()) warmEmbedder(); // loads behind the directory read; a first download ranks by words
364
400
  if (!explored || Date.now() - exploredAt > 60_000) {
365
- const [ex, { createPublicClient, http }, net] = await Promise.all([import("../discover/explore.js"), import("viem"), network()]);
366
- explored = { ex, dir: await ex.readDirectory(createPublicClient({ chain: net.chain, transport: http(net.rpcUrl) }), { chain: ex.chainOf(net) }) };
401
+ const [ex, client, net] = await Promise.all([import("../discover/explore.js"), chainClient(), network()]);
402
+ explored = { ex, dir: await ex.readDirectory(client, { chain: ex.chainOf(net), store }) };
367
403
  exploredAt = Date.now();
368
404
  }
369
405
  const { ex, dir } = explored;
@@ -386,16 +422,12 @@ const deps = {
386
422
  };
387
423
  const h = handlers(deps);
388
424
  // The client starts this server with the session, long before an agent opens an
389
- // app: load the SDK and the embedding model then, behind the agent's first
390
- // thought. After the initialize reply, not before: both block the thread while
391
- // they load, and the client is waiting on that reply.
425
+ // app: load the SDK then, behind the agent's first thought. After the initialize
426
+ // reply, not before: it blocks the thread while it loads, and the client is
427
+ // waiting on that reply.
392
428
  const reply = h.initialize;
393
429
  h.initialize = async (p) => {
394
- setImmediate(() => {
395
- fangorn().then(() => trace("sdk ready"), () => {});
396
- vt.warm({ cacheDir: `${CACHE}/models` }).then((ok) => ok ? trace("embedder ready")
397
- : log(`embedder unavailable, searching by words: ${vt.warmError}`));
398
- });
430
+ setImmediate(() => fangorn().then(() => trace("sdk ready"), () => {}));
399
431
  return reply(p);
400
432
  };
401
433
  deps.notify = serve(h);
@@ -11,7 +11,7 @@
11
11
  // - a search goes to the 3 views whose coverage sketch best matches the query,
12
12
  // not to all of them (Kingsfoil: ~3 of 23 views, ~92% of the true top 10 with
13
13
  // a 32-vector sketch). The result names what was searched and what was not.
14
- // - `warm()` starts the embedder the moment an app is opened, and a search
14
+ // - `warm()` starts the embedder before the first query (fangorn-mcp: on find-apps), and a search
15
15
  // never waits on a first-time model download.
16
16
  //
17
17
  // `get`/`similar`/`count` answer over what is loaded, and say so.
@@ -188,20 +188,12 @@ export function viewTools(app, { fetchCatalog = fetch, queryVector: embedQ = que
188
188
  return { key: hit ? hit.r[rolesOf(hit.view).identity] ?? id : id, want: hit?.r.paid_sha256, ct: hit?.r.paid_ct };
189
189
  };
190
190
  run.buy = async ({ id, ids }) => {
191
- const { buyBatch, withLock, readAsMember } = await import("./x402.js");
191
+ const { buyBatch, withLock } = await import("./x402.js");
192
192
  const rs = (ids?.length ? ids : id ? [id] : []).map(resolve);
193
193
  const ct = Object.fromEntries(rs.filter((r) => r.ct).map((r) => [r.key, r.ct]));
194
194
  const want = Object.fromEntries(rs.filter((r) => r.want).map((r) => [r.key, r.want]));
195
195
  const verdict = (records) => { const bad = records.filter((x) => x.verified === false).map((x) => x.id);
196
196
  return bad.length ? `MISMATCH for ${bad.join(", ")}` : "every record opened matches its published sha256"; };
197
- // A membership the agent was named on (FANGORN_MCP_READER_KEY + FANGORN_MCP_MEMBERSHIP,
198
- // the token id): read for free, nothing paid.
199
- if (process.env.FANGORN_MCP_READER_KEY && process.env.FANGORN_MCP_MEMBERSHIP && p.membership) {
200
- const { privateKeyToAccount } = await import("viem/accounts");
201
- const r = await readAsMember(p, rs.map((r) => r.key).filter((k) => ct[k]), { reader: privateKeyToAccount(process.env.FANGORN_MCP_READER_KEY),
202
- tokenId: process.env.FANGORN_MCP_MEMBERSHIP, ct, want });
203
- return { read: r.records.length, with: "membership", until: r.until, verified: verdict(r.records), records: r.records.map(({ id, record, error }) => ({ id, record, error })) };
204
- }
205
197
  if (ids?.length) {
206
198
  // Many at once, one price: from the allowance file (FANGORN_MCP_VOUCHERS, vouchers the
207
199
  // person's wallet signed) if there is one, else one payment from the wallet key.
@@ -234,7 +226,7 @@ export function viewTools(app, { fetchCatalog = fetch, queryVector: embedQ = que
234
226
  tools.push({ name: "buy", description: `Buy one ${n} record's paid detail for ${price} (x402 on ${p.network}): ${p.description || "the structured record"}. ` +
235
227
  "Pass an id from search, or ids for up to 1000 at once (one price, one manifest of hashes and transactions). " +
236
228
  "The record is already in the row, sealed; this buys its key and opens it. " +
237
- "Read free with a membership the agent was named on (FANGORN_MCP_READER_KEY + FANGORN_MCP_MEMBERSHIP); otherwise paid from the allowance (FANGORN_MCP_VOUCHERS) or this server's wallet (FANGORN_MCP_WALLET_KEY), never above FANGORN_MCP_MAX_PRICE a record.",
229
+ "Paid from the allowance (FANGORN_MCP_VOUCHERS) or this server's wallet (FANGORN_MCP_WALLET_KEY), never above FANGORN_MCP_MAX_PRICE a record.",
238
230
  inputSchema: { type: "object", properties: { id: str("A record id from search or get"), ids: { type: "array", items: { type: "string" }, description: "Several record ids, bought together" } } } });
239
231
  }
240
232
 
package/src/agent/x402.js CHANGED
@@ -171,30 +171,6 @@ export async function buyRecord(paid, key, { ct, want, account, privateKey, maxP
171
171
  return { id: key, price: r.price, receipt: r.receipt, digest: opened.sha256, verified: opened.verified, record: opened.record };
172
172
  }
173
173
 
174
- /** The typed data a reader signs to read with a membership: a copy of @fangorn-network/barliman's
175
- * src/read.js, which its /check verifies. ponytail: import it once barliman is on npm. */
176
- export const readTypedData = ({ registry, chainId, appId, tokenId, ids, issuedAt }) => ({
177
- domain: { name: "Fangorn Read", version: "1", chainId: Number(chainId), verifyingContract: registry },
178
- types: { Read: [{ name: "app", type: "bytes32" }, { name: "tokenId", type: "uint256" }, { name: "ids", type: "string[]" }, { name: "issuedAt", type: "uint256" }] },
179
- primaryType: "Read",
180
- message: { app: appId, tokenId: BigInt(tokenId), ids, issuedAt: BigInt(issuedAt) },
181
- });
182
-
183
- /** Read records with a membership: `reader` (the holder, or the agent it named) signs the
184
- * request, the app's worker has Barliman check it, and the keys come back. Nothing is paid. */
185
- export async function readAsMember(paid, ids, { reader, tokenId, ct = {}, want = {}, fetchImpl = fetch } = {}) {
186
- const m = paid.membership;
187
- if (!m) throw new Error("this app sells no memberships");
188
- const issuedAt = Math.floor(Date.now() / 1000);
189
- const signature = await reader.signTypedData(readTypedData({ registry: m.registry, chainId: m.chainId, appId: m.appId, tokenId, ids, issuedAt }));
190
- const url = paid.key_url ?? paid.url.replace(/\/paid\/\{id\}$/, "/key");
191
- const res = await fetchImpl(url, { method: "POST", headers: { "content-type": "application/json" },
192
- body: JSON.stringify({ ids, tokenId: String(tokenId), issuedAt, signature }) });
193
- const body = await res.json();
194
- if (res.status !== 200) throw new Error(`membership refused: ${body.error ?? res.status}`);
195
- return { records: await openAll(body.keys, ct, want), until: body.until };
196
- }
197
-
198
174
  // ── Batches and vouchers ──────────────────────────────────────────────────────────────────
199
175
  // `POST <app>/paid {ids}` answers 402 with one price for every record it has; PAYMENT-SIGNATURE may then
200
176
  // carry several payments (a JSON array) that add up to exactly that price. A payment signs
@@ -331,8 +307,7 @@ if (typeof process !== "undefined" && import.meta.url === `file://${process.argv
331
307
  // that checks signatures and refuses a nonce settled twice, and vouchers signed ahead.
332
308
  const { mkdtempSync, writeFileSync } = await import("node:fs");
333
309
  const { tmpdir } = await import("node:os");
334
- const membership = { registry: `0x${"12".repeat(20)}`, barliman: "https://barliman", chainId: CHAIN, appId: `0x${"ab".repeat(32)}` };
335
- const sale = { price: "100000", network: `eip155:${CHAIN}`, asset: USDC, payTo: SELLER, facilitator: "https://fac", ...DOMAIN, description: "", membership };
310
+ const sale = { price: "100000", network: `eip155:${CHAIN}`, asset: USDC, payTo: SELLER, facilitator: "https://fac", ...DOMAIN, description: "" };
336
311
  // Not a literal: the page bundles this module, and a bundler would follow it into the Worker.
337
312
  const WORKER = "../../site/worker.js";
338
313
  const worker = (await import(/* @vite-ignore */ WORKER)).default;
@@ -344,17 +319,9 @@ if (typeof process !== "undefined" && import.meta.url === `file://${process.argv
344
319
  want[id] = await sha256(new TextEncoder().encode(plain));
345
320
  }
346
321
  const env = { PAID_SECRET: SECRET, CONFIG: { name: "Test", paid: sale } };
347
- const member = privateKeyToAccount(generatePrivateKey()), memberToken = "77";
348
322
  const spent = new Set(), facilitated = [];
349
323
  const realFetch = globalThis.fetch;
350
- const { recoverTypedDataAddress } = await import("viem");
351
324
  globalThis.fetch = async (u, init) => {
352
- if (u === "https://barliman/check") { // a stand-in Barliman: the member's token reads, nobody else's
353
- const b = JSON.parse(init.body);
354
- const reader = await recoverTypedDataAddress({ ...readTypedData({ registry: membership.registry, chainId: CHAIN, ...b }), signature: b.signature });
355
- const ok = reader === member.address && b.tokenId === memberToken && b.appId === membership.appId;
356
- return new Response(JSON.stringify({ ok, reader, until: ok ? "1900000000" : "0" }));
357
- }
358
325
  const { x402Version, paymentPayload: p, paymentRequirements: q } = JSON.parse(init.body), a = p.payload.authorization;
359
326
  if (x402Version !== 2 || p.x402Version !== 2) throw new Error("the facilitator is spoken to in v2");
360
327
  facilitated.push(p);
@@ -372,7 +339,7 @@ if (typeof process !== "undefined" && import.meta.url === `file://${process.argv
372
339
  return new Response(JSON.stringify({ success: true, transaction: `0x${spent.size}` }));
373
340
  };
374
341
  const viaWorker = (u, init) => worker.fetch(new Request(u, init), env);
375
- const paidCard = { url: "https://x/paid/{id}", key_url: "https://x/key", price: sale.price, membership };
342
+ const paidCard = { url: "https://x/paid/{id}", price: sale.price };
376
343
  try {
377
344
  // One record, one payment: the key opens the row's sealed record, which matches its hash.
378
345
  const single = await buyRecord(paidCard, "a", { ct: ct.a, want: want.a, account: buyer, maxPrice: 100000n, fetchImpl: viaWorker });
@@ -419,12 +386,6 @@ if (typeof process !== "undefined" && import.meta.url === `file://${process.argv
419
386
  let threw = false;
420
387
  try { await buyBatch(paidCard, ["a", "b"], { vouchers: stack2, ct, want, fetchImpl: viaWorker }); } catch { threw = true; }
421
388
  if (!threw || stack2.length !== 1 || stack2[0] !== fresh) throw new Error(`refused batch must drop only the spent voucher: ${stack2.length}`);
422
- // A member reads for free: the signed request names the token; a stranger's is refused.
423
- const read = await readAsMember(paidCard, ["a", "c"], { reader: member, tokenId: memberToken, ct, want, fetchImpl: viaWorker });
424
- if (read.records.length !== 2 || !read.records.every((r) => r.verified === true)) throw new Error(`member read: ${JSON.stringify(read)}`);
425
- let stranger = false;
426
- try { await readAsMember(paidCard, ["a"], { reader: buyer, tokenId: memberToken, ct, want, fetchImpl: viaWorker }); } catch { stranger = true; }
427
- if (!stranger) throw new Error("a reader the membership does not name must be refused");
428
389
  // The allowance lock: two purchases at once take turns; a crashed one's lock is taken over.
429
390
  const vfile = `${mkdtempSync(`${tmpdir()}/wm-`)}/vouchers.json`, order = [];
430
391
  const turn = (name) => withLock(vfile, async () => { order.push(`${name}+`); await new Promise((ok) => setTimeout(ok, 50)); order.push(`${name}-`); });
@@ -435,6 +396,6 @@ if (typeof process !== "undefined" && import.meta.url === `file://${process.argv
435
396
  utimesSync(`${vfile}.lock`, new Date(Date.now() - 300_000), new Date(Date.now() - 300_000));
436
397
  if (await withLock(vfile, async () => 7) !== 7 || existsSync(`${vfile}.lock`)) throw new Error("a stale lock must be taken over and released");
437
398
  } finally { globalThis.fetch = realFetch; }
438
- console.log("x402.js batch self-check ok — keys, not records: each opens the row's sealed record and matches its hash; a member reads free and a stranger is refused; one price for the ids sealed in the rows, paid by one signature or by vouchers signed ahead, spent vouchers removed and refused if replayed, short payment refused, a half-settled batch delivers what was paid and drops spent vouchers, the allowance file is locked per purchase");
399
+ console.log("x402.js batch self-check ok — keys, not records: each opens the row's sealed record and matches its hash; one price for the ids sealed in the rows, paid by one signature or by vouchers signed ahead, spent vouchers removed and refused if replayed, short payment refused, a half-settled batch delivers what was paid and drops spent vouchers, the allowance file is locked per purchase");
439
400
  console.log("x402.js self-check ok — a signed EIP-3009 authorization the seller can verify, exactly the asked amount to the asked payee, the receipt read back, and a price over the cap refused before signing");
440
401
  }
@@ -48,16 +48,39 @@ export function toApp({ card, appId, fromBlock, repos }, cardUrl) {
48
48
  };
49
49
  }
50
50
 
51
+ // Blocks this close to the head can still reorg: read again every time, never stored.
52
+ const SETTLED = 64n;
53
+
54
+ /**
55
+ * Logs from `start` to `head`, oldest first, reading only the blocks `store`
56
+ * has not seen. A scan from the registry's deployment grows with the chain;
57
+ * this one grows with the time since the last call. `store` is `{ get, set }`
58
+ * of `{ to, logs }` by `key`; `read(from, to)` returns logs with `blockNumber`.
59
+ */
60
+ export async function cachedLogs(store, key, start, head, read) {
61
+ const hit = store.get(key) ?? { to: start - 1n, logs: [] };
62
+ const fresh = hit.to < head ? await read(hit.to + 1n, head) : [];
63
+ const settled = head - SETTLED;
64
+ if (settled > hit.to) store.set(key, { to: settled, logs: [...hit.logs, ...fresh.filter((l) => l.blockNumber <= settled)] });
65
+ return [...hit.logs, ...fresh];
66
+ }
67
+
51
68
  /**
52
69
  * Every app with a bound, verifiable card. The ones that fail are reported
53
70
  * with the reason, not dropped: a card that is down and a card that lies look
54
71
  * the same from outside, and an agent should see both.
55
72
  *
56
73
  * An app that cleared its uri (bound to "") is skipped. It is not an error.
74
+ *
75
+ * With a `store` (see cachedLogs) and `toBlock`, the logs read before are not
76
+ * read again; the cards are still all verified.
57
77
  */
58
- export async function listApps(fangorn, { fromBlock, toBlock } = {}) {
78
+ export async function listApps(fangorn, { fromBlock, toBlock, store } = {}) {
59
79
  if (fromBlock == null) throw new Error("listApps: pass fromBlock, a block at or before the AppRegistry's deployment — from 0 is one RPC call per 1000 blocks of chain history");
60
- const logs = await fangorn.getAppRegistry().getAppAgentLogs({ fromBlock: BigInt(fromBlock), toBlock });
80
+ const read = (from, to) => fangorn.getAppRegistry().getAppAgentLogs({ fromBlock: from, toBlock: to });
81
+ const logs = store && toBlock != null
82
+ ? await cachedLogs(store, `AppAgentChanged:${fromBlock}`, BigInt(fromBlock), BigInt(toBlock), read)
83
+ : await read(BigInt(fromBlock), toBlock);
61
84
  // Oldest first, so the last write wins. discoverApp re-reads the binding,
62
85
  // so a stale uri here is caught there, not trusted.
63
86
  const latest = new Map(logs.map((l) => [l.appId, l.agentUri]));
@@ -110,5 +133,17 @@ if (typeof process !== "undefined" && import.meta.url === `file://${process.argv
110
133
  eq(rejected.map((r) => r.why), ["not bound to app"], "a card that fails verification is reported");
111
134
  await listApps(fangorn).then(() => { throw new Error("missing fromBlock must throw"); }, () => {});
112
135
 
136
+ const m = new Map(), store = { get: (k) => m.get(k), set: (k, v) => m.set(k, v) }, asked = [];
137
+ const chain = [{ blockNumber: 10n, n: 1 }, { blockNumber: 150n, n: 2 }, { blockNumber: 190n, n: 3 }];
138
+ const read = async (from, to) => (asked.push([from, to]), chain.filter((l) => l.blockNumber >= from && l.blockNumber <= to));
139
+ eq((await cachedLogs(store, "k", 5n, 200n, read)).map((l) => l.n), [1, 2, 3], "first call reads it all");
140
+ eq(m.get("k").to, 136n, "stores only what is settled");
141
+ eq(m.get("k").logs.map((l) => l.n), [1], "the unsettled tail is not stored");
142
+ eq((await cachedLogs(store, "k", 5n, 210n, read)).map((l) => l.n), [1, 2, 3], "second call: same logs, no duplicates");
143
+ eq(asked, [[5n, 200n], [137n, 210n]], "second call reads only from the settled point");
144
+ asked.length = 0;
145
+ await cachedLogs(store, "k", 5n, 146n, read);
146
+ eq(asked, [], "head at the stored point: no read");
147
+
113
148
  console.log("apps.js self-check ok — latest card per app, unbound skipped, failures reported, views gated to http(s)");
114
149
  }
@@ -15,13 +15,13 @@
15
15
  // `client` is a viem PublicClient (getLogs, readContract): passed in, so this
16
16
  // runs in a tab and in node, and the self-check needs no chain.
17
17
  //
18
- // ponytail: windows grow with the chain (1 + 8 at block 316M, ~0.2s). Index
19
- // the logs somewhere if that ever gets slow.
18
+ // Windows grow with the chain. Pass `store` (apps.js cachedLogs) and only the
19
+ // blocks since the last read are scanned; the page passes none.
20
20
 
21
21
  import { parseAbi, parseAbiItem } from "viem";
22
22
  // The config module alone (viem only), not the SDK's root: this runs in a tab too.
23
23
  import { BaseSepoliaConfig } from "@fangorn-network/sdk/lib/config.js";
24
- import { APP_EXTENSION } from "./apps.js";
24
+ import { APP_EXTENSION, cachedLogs } from "./apps.js";
25
25
  import { survey, comparable } from "./directory.js";
26
26
  import { rankDomains, zFloor, lexScore } from "../core/rank.js";
27
27
 
@@ -123,14 +123,18 @@ async function reputation(client, agentId, chain) {
123
123
  }
124
124
 
125
125
  // `window`: the most blocks one getLogs may span on the client's RPC (chainOf says, per chain).
126
- async function getLogsSince(client, start, filter, window) {
126
+ async function getLogsSince(client, start, filter, window, store) {
127
127
  const head = await client.getBlockNumber();
128
- const windows = [];
129
- for (let from = start; from <= head; from += window) {
130
- const to = from + window - 1n < head ? from + window - 1n : head;
131
- windows.push(client.getLogs({ ...filter, fromBlock: from, toBlock: to }));
132
- }
133
- return (await Promise.all(windows)).flat(); // in window order: oldest first still holds
128
+ const read = async (start, head) => {
129
+ const windows = [];
130
+ for (let from = start; from <= head; from += window) {
131
+ const to = from + window - 1n < head ? from + window - 1n : head;
132
+ windows.push(client.getLogs({ ...filter, fromBlock: from, toBlock: to }));
133
+ }
134
+ // In window order: oldest first still holds. Only what readDirectory reads, so a store stays small.
135
+ return (await Promise.all(windows)).flat().map(({ args, blockNumber }) => ({ args, blockNumber }));
136
+ };
137
+ return store ? cachedLogs(store, `${filter.address}:${filter.event.name}:${start}`, start, head, read) : read(start, head);
134
138
  }
135
139
 
136
140
  /**
@@ -140,11 +144,13 @@ async function getLogsSince(client, start, filter, window) {
140
144
  * `onUpdate({ apps, pending })`, if given, is called once the bindings are read
141
145
  * and again as each app lands or drops, so a page can show apps as they arrive.
142
146
  * `pending` counts the bound apps not yet settled.
147
+ * `store`, if given, keeps the logs read (apps.js cachedLogs), so the next read
148
+ * scans only the blocks since.
143
149
  */
144
- export async function readDirectory(client, { chain = CHAIN, onUpdate = () => {} } = {}) {
150
+ export async function readDirectory(client, { chain = CHAIN, onUpdate = () => {}, store } = {}) {
145
151
  const [bindLogs, regLogs] = await Promise.all([
146
- getLogsSince(client, chain.appRegistryFrom ?? 0n, { address: chain.appRegistry, event: APP_AGENT_CHANGED }, chain.window ?? 1000n),
147
- getLogsSince(client, chain.identityFrom ?? 0n, { address: chain.identity, event: REGISTERED }, chain.window ?? 1000n),
152
+ getLogsSince(client, chain.appRegistryFrom ?? 0n, { address: chain.appRegistry, event: APP_AGENT_CHANGED }, chain.window ?? 1000n, store),
153
+ getLogsSince(client, chain.identityFrom ?? 0n, { address: chain.identity, event: REGISTERED }, chain.window ?? 1000n, store),
148
154
  ]);
149
155
  const registered = regLogs.map((l) => ({ agentId: l.args.agentId, owner: l.args.owner, block: l.blockNumber }));
150
156
  const latest = new Map(); // logs come oldest first: the last write wins