@fangorn-network/westmarch 2026.10.2-0.0-dev → 2026.10.2-2.0-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 (584) hide show
  1. package/docs/app-to-agent.md +25 -41
  2. package/package.json +6 -5
  3. package/site/dist/assets/AccountNotFoundScreen-C4njXc69-DyVH4CEz.js +1 -0
  4. package/site/dist/assets/AddFundsSelectionScreen-RAoCn7ej-Dz1--SS9.js +31 -0
  5. package/site/dist/assets/Address-H8kD1d9O-BdFZmRwI.js +17 -0
  6. package/site/dist/assets/AffirmativeConsentScreen-BG0MJxku-CxaCAisL.js +6 -0
  7. package/site/dist/assets/AllowlistRejectionScreen-Cae6e1Od-JGk7vndN.js +1 -0
  8. package/site/dist/assets/ApiController-CTLbMCcH.js +5 -0
  9. package/site/dist/assets/ArrowsRightLeftIcon-B8g9adpz.js +1 -0
  10. package/site/dist/assets/AuthenticateWithWalletScreen-CU6hIcFT-CXD9_OP8.js +1 -0
  11. package/site/dist/assets/AwaitingEvmToSolBridgingScreen-D0e_sZMS-BtJCglvU.js +1 -0
  12. package/site/dist/assets/AwaitingExternalEthereumTransferScreen-ur5HL4R7-BgC2TsqH.js +1 -0
  13. package/site/dist/assets/AwaitingPasswordlessCodeScreen-DRHz76mM-B9OzLeEO.js +103 -0
  14. package/site/dist/assets/AwaitingSolToEvmBridgingScreen-CdLRrGD2-C7r5snUL.js +1 -0
  15. package/site/dist/assets/BridgeNetworkSelectionView-CFGjB2nO-BTV0NRio.js +68 -0
  16. package/site/dist/assets/CaptchaScreen-DbpvkIGx-7rSZIuM-.js +1 -0
  17. package/site/dist/assets/CheckCircleIcon-B1l17ioc.js +1 -0
  18. package/site/dist/assets/CheckCircleIcon-BGSI8nKf.js +1 -0
  19. package/site/dist/assets/Checkbox-D1EDeo41-BUfq0w99.js +52 -0
  20. package/site/dist/assets/ChevronDownIcon-B6uJvPHu.js +1 -0
  21. package/site/dist/assets/Chip-CZKIKt9K-r9Nk__0-.js +26 -0
  22. package/site/dist/assets/CoinbaseOnrampStatusScreen-BbyCJDXL-DWWNHxmR.js +16 -0
  23. package/site/dist/assets/ConnectEmailForm-B-VRE0MN-CRQwS0Xu.js +3 -0
  24. package/site/dist/assets/ConnectLedgerScreen-DWHABGot-CZcCt31O.js +10 -0
  25. package/site/dist/assets/ConnectOnlyLandingScreen-CZYx9Bmp-C5IOf-SQ.js +1 -0
  26. package/site/dist/assets/ConnectOnlyStatusScreen-DCRzjxHx-cwg74F3A.js +1 -0
  27. package/site/dist/assets/ConnectOrCreateScreen-CUUYUO07-D28oeK6b.js +1 -0
  28. package/site/dist/assets/ConnectPhoneForm-Dek5xn4C-EEdkKeTp.js +95 -0
  29. package/site/dist/assets/ConnectWalletView-DqI-PTvX-C2mEzukj.js +74 -0
  30. package/site/dist/assets/ConnectionStatusScreen-fUfROm9m-CH_7r8iV.js +7 -0
  31. package/site/dist/assets/ConnectionStatusScreen-fUfROm9m-Z33kis0B.js +1 -0
  32. package/site/dist/assets/ConnectorUtil-DH4NePk5.js +21 -0
  33. package/site/dist/assets/ConstantsUtil-DmLsRHAl.js +198 -0
  34. package/site/dist/assets/CopyToClipboard-i_OQSBJr-_G88JCVR.js +39 -0
  35. package/site/dist/assets/CopyableText-CQapvaMr-CGGfc_zM.js +28 -0
  36. package/site/dist/assets/CrossAppAuthScreen-CLw7ymZq-C9Okoc0V.js +1 -0
  37. package/site/dist/assets/CustomLandingScreenView-Cm_MBSyX-D2l6hdSl.js +22 -0
  38. package/site/dist/assets/DelegatedActionsConsentScreen-DYF2U4y5-Dda3KKqS.js +1 -0
  39. package/site/dist/assets/DelegatedActionsRevokeScreen-bPp6Uwyh-DG8kJPt1.js +1 -0
  40. package/site/dist/assets/DepositAddressAddressStepView-4vdkb55L-CcOUfn6f.js +187 -0
  41. package/site/dist/assets/DepositAddressScreen-DBLRs7aI-DeituDNh.js +8 -0
  42. package/site/dist/assets/DepositAddressV3Screen-CDqIEMQw-FDg6K14-.js +1 -0
  43. package/site/dist/assets/{EmailInputForm-Cqo1mda8-CZD4r5LM.js → EmailInputForm-Cqo1mda8-BmbxvPHC.js} +11 -11
  44. package/site/dist/assets/EmbeddedWalletConnectingScreen-D4T7DUzs-B05CQ9rx.js +1 -0
  45. package/site/dist/assets/EmbeddedWalletCreatedScreen-D7WhW5ve-Cxd1b9XH.js +1 -0
  46. package/site/dist/assets/EmbeddedWalletKeyExportScreen-CqV4NYQ3-CrJy0ViX.js +23 -0
  47. package/site/dist/assets/EmbeddedWalletOnAccountCreateScreen-BoKb3Q2S-Bakaa3zu.js +1 -0
  48. package/site/dist/assets/EmbeddedWalletPasswordUpdateScreen-D3rMlqS7-j78vKrcj.js +1 -0
  49. package/site/dist/assets/EmbeddedWalletPasswordUpdateSplashScreen-BPFkWJeE-D3dr7W9_.js +1 -0
  50. package/site/dist/assets/EnrollTotp-Dibew4dp-BXbYV8nI.js +66 -0
  51. package/site/dist/assets/EnvelopeIcon-DjPofnRI.js +1 -0
  52. package/site/dist/assets/ErrorBanner-BcpGRt0h-BhH6_V-9.js +21 -0
  53. package/site/dist/assets/{ErrorMessage-D8VaAP5m-oSruKN8L.js → ErrorMessage-D8VaAP5m-Bs7uX2a9.js} +2 -2
  54. package/site/dist/assets/ErrorScreen-DipdTWzE-BgPRgnOb.js +4 -0
  55. package/site/dist/assets/ErrorScreen-DipdTWzE-CvxXC6pz.js +1 -0
  56. package/site/dist/assets/ExclamationCircleIcon-BE-WGrut.js +1 -0
  57. package/site/dist/assets/ExclamationTriangleIcon-Ca1Xlc_f.js +1 -0
  58. package/site/dist/assets/FarcasterConnectStatusScreen-51tjUxqq-De2JvZdV.js +75 -0
  59. package/site/dist/assets/FarcasterSignerStatusScreen-6x-Uh95G-bLp3hXoO.js +28 -0
  60. package/site/dist/assets/FiatOnrampScreen-BAhYeiTI-Jr6D6JiZ.js +491 -0
  61. package/site/dist/assets/FingerPrintIcon-DOCbS93y.js +1 -0
  62. package/site/dist/assets/FundSolWalletWithExternalSolanaWallet-WtLwYaOl-A_G5kfa1.js +1 -0
  63. package/site/dist/assets/FundWalletMethodHeader-BWNkokCT-LPv35wkD.js +1 -0
  64. package/site/dist/assets/FundWithBankDepositScreen-DajkHxBD-0hfGrfvf.js +58 -0
  65. package/site/dist/assets/FundingEditAmountScreen-CpvpiO4M-Dz0s_NWR.js +1 -0
  66. package/site/dist/assets/FundingMethodSelectionScreen-Db7vhRlE-ZGm-3-Io.js +1 -0
  67. package/site/dist/assets/GlobeAltIcon-BBRl2MMn.js +1 -0
  68. package/site/dist/assets/GooglePay-B53WnudL-BGiVpB8y.js +1 -0
  69. package/site/dist/assets/HCaptchaWrapper-CUi9LJsp-CHdfIeD_.js +4 -0
  70. package/site/dist/assets/InAppBrowserLoginNotPossible-BMR9br1T-Cgoiow3m.js +1 -0
  71. package/site/dist/assets/InfoBanner-Cb3p1z12-_YqQmRiu.js +22 -0
  72. package/site/dist/assets/InjectedWalletIcon-DLcYOGDj-tuIrKQHH.js +1 -0
  73. package/site/dist/assets/InstallWalletScreen-DTA8dwLv-BMU_wa61.js +1 -0
  74. package/site/dist/assets/{JsonTree-BHzNC-ic-pAEq1bl9.js → JsonTree-BHzNC-ic-DcVr0YF0.js} +3 -3
  75. package/site/dist/assets/{LabelXs-oqZNqbm_-D09YjVR4.js → LabelXs-oqZNqbm_-CNprGVQM.js} +2 -2
  76. package/site/dist/assets/LandingScreen-CGWUoSUG-fH6rsQen.js +1 -0
  77. package/site/dist/assets/{Layouts-BMRfo5hw-D2u1-w8g.js → Layouts-BMRfo5hw-e-sepi6F.js} +16 -16
  78. package/site/dist/assets/Link-BdDilT2T-BdwlRJch.js +40 -0
  79. package/site/dist/assets/LinkConflictScreen-C3ZEPsgl-BXKN2Qm5.js +77 -0
  80. package/site/dist/assets/LinkEmailScreen-dKo9frwc-Cyn7Q8p1.js +1 -0
  81. package/site/dist/assets/LinkPasskeyScreen-zbrl_AI_-CWiqnwLM.js +117 -0
  82. package/site/dist/assets/LinkPasskeyScreen-zbrl_AI_-YmDevJzf.js +1 -0
  83. package/site/dist/assets/LinkPhoneScreen-oIUpfj0w-h7shW-Ay.js +1 -0
  84. package/site/dist/assets/Loader-UAZqxsnw-DJEVblm1.js +62 -0
  85. package/site/dist/assets/{LoadingSkeleton-BMsgO5PV-BRMh4Fv4.js → LoadingSkeleton-BMsgO5PV-D2atjsP5.js} +6 -6
  86. package/site/dist/assets/LockClosedIcon-9EFzWK1C.js +1 -0
  87. package/site/dist/assets/LoginFailedScreen-CN0dJV6U-By3Si77a.js +1 -0
  88. package/site/dist/assets/ManualTransferScreen-CHqcuqbs-BAHPY8rs.js +1 -0
  89. package/site/dist/assets/MfaAuthEnrollmentFlowScreen-Dj7gPTRC-CLjffFG1.js +1 -0
  90. package/site/dist/assets/MfaAuthVerifyFlowScreen-DbFpyWMy-BmQg1Y61.js +1 -0
  91. package/site/dist/assets/MfaEnrollmentFlowScreen-DhLnGgnr-DmBtTtlw.js +1 -0
  92. package/site/dist/assets/MfaVerifyFlowScreen-C_XPjMRP-4a683Bmf.js +1 -0
  93. package/site/dist/assets/ModalFooter-BCuEK_nz-C_71qsaz.js +403 -0
  94. package/site/dist/assets/MoonpayStatusScreen-CzTUtokc-DEHHcEf8.js +16 -0
  95. package/site/dist/assets/OAuthStatusScreen-ufbOa-da-BjAb_WsY.js +1 -0
  96. package/site/dist/assets/OpenLink-CUpJ1mOr-BLWFsPOW.js +39 -0
  97. package/site/dist/assets/PasskeySelectSignupOrLogin-xh2ScC_l-2PJTJxX-.js +1 -0
  98. package/site/dist/assets/PasskeyStatusScreen-Bla8MaOk-DCEg761l.js +6 -0
  99. package/site/dist/assets/PasswordRecoveryScreen-awGXZkQk-8nVjNc8k.js +20 -0
  100. package/site/dist/assets/{PhArrowCircleDown-BtlNV0TZ.js → PhArrowCircleDown-D97G-BOA.js} +5 -5
  101. package/site/dist/assets/PhArrowClockwise-DVgyFuez.js +14 -0
  102. package/site/dist/assets/PhArrowDown-87b1BizM.js +14 -0
  103. package/site/dist/assets/PhArrowLeft-Da0MfnbK.js +14 -0
  104. package/site/dist/assets/PhArrowRight-AdrIL4DW.js +14 -0
  105. package/site/dist/assets/{PhArrowSquareOut-DnQ7n_B4.js → PhArrowSquareOut-Bk2CMG3I.js} +5 -5
  106. package/site/dist/assets/PhArrowUp-4sgyKPGx.js +14 -0
  107. package/site/dist/assets/PhArrowUpRight-BNghD2zq.js +14 -0
  108. package/site/dist/assets/{PhArrowsClockwise-Brtx2Re-.js → PhArrowsClockwise-BXRn1GEl.js} +5 -5
  109. package/site/dist/assets/{PhArrowsDownUp-PZosTqZG.js → PhArrowsDownUp-DM09Jo_3.js} +5 -5
  110. package/site/dist/assets/PhArrowsLeftRight-MuKBLUoF.js +14 -0
  111. package/site/dist/assets/{PhBank-hhPAIPVb.js → PhBank-fHbgCqqZ.js} +5 -5
  112. package/site/dist/assets/PhBrowser-2-9m-AkM.js +14 -0
  113. package/site/dist/assets/PhCaretDown-BDNabFuL.js +14 -0
  114. package/site/dist/assets/PhCaretLeft-CI460R-A.js +14 -0
  115. package/site/dist/assets/PhCaretRight-D7ZS3Ls8.js +14 -0
  116. package/site/dist/assets/PhCaretUp-C-iIfyvO.js +14 -0
  117. package/site/dist/assets/PhCheck-DxQXn57r.js +14 -0
  118. package/site/dist/assets/{PhCircleHalf-Bk9C4DvT.js → PhCircleHalf-MJZeRBGF.js} +5 -5
  119. package/site/dist/assets/PhClock-x3MS3Mwi.js +14 -0
  120. package/site/dist/assets/{PhCompass-Df1ugFO-.js → PhCompass-hYn3HhGN.js} +5 -5
  121. package/site/dist/assets/PhCopy-CWNYcABI.js +14 -0
  122. package/site/dist/assets/{PhCreditCard-CZpdid2n.js → PhCreditCard-Fy4pzwtt.js} +5 -5
  123. package/site/dist/assets/{PhCurrencyDollar-B6IKKjue.js → PhCurrencyDollar-BgiaenCi.js} +5 -5
  124. package/site/dist/assets/{PhDesktop-BuCDXYJj.js → PhDesktop-CxrzCSv5.js} +5 -5
  125. package/site/dist/assets/PhDeviceMobile-CsyA5Goi.js +14 -0
  126. package/site/dist/assets/PhDotsThree-D-k1BiYg.js +14 -0
  127. package/site/dist/assets/PhEnvelope-D8kzeNox.js +14 -0
  128. package/site/dist/assets/PhFunnelSimple-CfQs5DAW.js +14 -0
  129. package/site/dist/assets/{PhGlobe-q1mqj65V.js → PhGlobe-DvmSc9_A.js} +5 -5
  130. package/site/dist/assets/{PhIdentificationCard-BeLXJpfZ.js → PhIdentificationCard-CfkZm-5K.js} +5 -5
  131. package/site/dist/assets/{PhImage-BYrKfN9k.js → PhImage-Cf0J2ZfJ.js} +5 -5
  132. package/site/dist/assets/{PhInfo-X33f06Ej.js → PhInfo-Bwi51-2X.js} +5 -5
  133. package/site/dist/assets/{PhLightbulb-DMZJsowR.js → PhLightbulb-C4FZV7Es.js} +5 -5
  134. package/site/dist/assets/PhMagnifyingGlass-C9u8jSCJ.js +14 -0
  135. package/site/dist/assets/{PhPaperPlaneRight-Dvo-nXr9.js → PhPaperPlaneRight-zxQVvPLX.js} +5 -5
  136. package/site/dist/assets/PhPlus-C4UoW-2n.js +14 -0
  137. package/site/dist/assets/{PhPower-D8-AcNM6.js → PhPower-CFyWDmgD.js} +5 -5
  138. package/site/dist/assets/{PhPuzzlePiece-C-7mYqGO.js → PhPuzzlePiece-BjoNVfST.js} +5 -5
  139. package/site/dist/assets/{PhQrCode-uIXlI5ER.js → PhQrCode-CP3tFauY.js} +5 -5
  140. package/site/dist/assets/{PhQuestion-rUoqC2sC.js → PhQuestion-wOWJBd3G.js} +5 -5
  141. package/site/dist/assets/{PhQuestionMark-W55Txvvb.js → PhQuestionMark-CV0k9C0Y.js} +5 -5
  142. package/site/dist/assets/{PhSealCheck-BeVLq9PH.js → PhSealCheck-vIKzREuN.js} +5 -5
  143. package/site/dist/assets/{PhSignOut-Cq2PivQ6.js → PhSignOut-CxELV-i0.js} +5 -5
  144. package/site/dist/assets/{PhSpinner-CZMtAFdX.js → PhSpinner-CGDmbzUd.js} +5 -5
  145. package/site/dist/assets/{PhTrash-BamrmMsN.js → PhTrash-C9PD0SAt.js} +5 -5
  146. package/site/dist/assets/{PhUser-A2fxqIV0.js → PhUser-0sWNXQeZ.js} +5 -5
  147. package/site/dist/assets/{PhVault-B8m1usHw.js → PhVault-6JTskUcC.js} +5 -5
  148. package/site/dist/assets/{PhWarning-CpkID9oi.js → PhWarning-CoKs3gz6.js} +5 -5
  149. package/site/dist/assets/PhWarningCircle-BXHw1fCt.js +14 -0
  150. package/site/dist/assets/PhX-DX0SFIqC.js +14 -0
  151. package/site/dist/assets/PhoneIcon-CZ47md80.js +1 -0
  152. package/site/dist/assets/PinInput-DbZ0b1i1-BrTXu3Km.js +247 -0
  153. package/site/dist/assets/PrivyPluginContext-DA-yS5vO-CY60yubk.js +1 -0
  154. package/site/dist/assets/QrCode-DbnZwlkH-CcMrWV5D.js +22 -0
  155. package/site/dist/assets/RecoveryOAuthStatusScreen-CsgtTI2x-DgeDnHOK.js +1 -0
  156. package/site/dist/assets/RecoveryPasswordCreateScreen-Be-qJ-LU-CvJJwLhK.js +1 -0
  157. package/site/dist/assets/RecoverySelectionScreen-D1iGtpmi-CADtGtSV.js +7 -0
  158. package/site/dist/assets/SIWXUtil-Cpiv91-M.js +1 -0
  159. package/site/dist/assets/{Screen-D30meWsY-DDum2qlY.js → Screen-D30meWsY-vEusJ7KX.js} +22 -22
  160. package/site/dist/assets/{ScreenHeader-CHmc4-Lu-BqrAEXbV.js → ScreenHeader-CHmc4-Lu-BvGTLg53.js} +4 -4
  161. package/site/dist/assets/ScreenLayout-OwaQQcxH-cfOTmyl0.js +1 -0
  162. package/site/dist/assets/{SelectSourceAsset-CWFog6gm-8iXuqbAs.js → SelectSourceAsset-CWFog6gm-DxYklZYs.js} +18 -18
  163. package/site/dist/assets/SetAutomaticRecoveryScreen-BO_OEqAZ-oeqeo05x.js +14 -0
  164. package/site/dist/assets/SetWalletPasswordForm-DwCTVtAh-BxFee9UA.js +11 -0
  165. package/site/dist/assets/ShieldCheckIcon-eFjsosCA.js +1 -0
  166. package/site/dist/assets/SignRequestScreen-BHKv32KR-z8ixfIma.js +26 -0
  167. package/site/dist/assets/SolanaWalletConnector-C7Lqk-Wz-Bc_lvdiF.js +1 -0
  168. package/site/dist/assets/{StackedContainer-B2vaEl56-C-ojzCoQ.js → StackedContainer-B2vaEl56-Do5dXB8-.js} +2 -2
  169. package/site/dist/assets/StandardSignAndSendTransactionScreen-CfhIXVtd-DudetZAc.js +20 -0
  170. package/site/dist/assets/{Subtitle-CV-2yKE4-o-1FQLlX.js → Subtitle-CV-2yKE4-DV0o1av3.js} +2 -2
  171. package/site/dist/assets/TelegramAuthScreen-UL9zLfO8-Bo3sONvf.js +1 -0
  172. package/site/dist/assets/{Title-BnzYV3Is-RX1f0RV-.js → Title-BnzYV3Is-C3qOPnO_.js} +2 -2
  173. package/site/dist/assets/TodoList-DnyULl18-BvxvubbF.js +36 -0
  174. package/site/dist/assets/TransactionDetails-e9nesl30-WWflkOIi.js +109 -0
  175. package/site/dist/assets/TransactionErrorView-BDBNqA_f-CotYKcgf.js +178 -0
  176. package/site/dist/assets/TransferFromWalletScreen-Qvn1Yuno-sVFlWqa8.js +31 -0
  177. package/site/dist/assets/TransferOrBridgeLoadingScreen-Dl1I_iIz-CV2-mY19.js +6 -0
  178. package/site/dist/assets/TurnstileWrapper-B7sNddys-oPbuMTQt.js +1 -0
  179. package/site/dist/assets/UpdateEmailScreen-DVOhPV0H-D_mjSpAy.js +1 -0
  180. package/site/dist/assets/UpdatePhoneScreen-CXRswTNZ-6RLG0ahv.js +1 -0
  181. package/site/dist/assets/UserLimitReachedScreen-5we2DHn8-CaVN0bti.js +1 -0
  182. package/site/dist/assets/{Value-DTgR824E-DZpvBCWi.js → Value-DTgR824E-Bp6WGZZm.js} +7 -7
  183. package/site/dist/assets/WalletCards-DH1rqayz-D3cOTb9x.js +1 -0
  184. package/site/dist/assets/WalletIcon-DOIZhb2l.js +1 -0
  185. package/site/dist/assets/WalletInfoCard-sq_2wgFg-bOqfl5MA.js +29 -0
  186. package/site/dist/assets/WalletInterstitialScreen-Sh7LfsAh-DWaVkMCA.js +1 -0
  187. package/site/dist/assets/WalletLink-DK5LB5Ha-DjUZvqs-.js +20 -0
  188. package/site/dist/assets/WalletOverflowButton-bfCnp-9T-B6P7DQXA.js +1 -0
  189. package/site/dist/assets/WarningBanner-ZZqCEtZK-Bc2YKZb7.js +21 -0
  190. package/site/dist/assets/__vite-browser-external-NciY4Vu1.js +1 -0
  191. package/site/dist/assets/_esm-BZP3cXTv.js +1 -0
  192. package/site/dist/assets/_esm-ZmzBJpEs.js +6 -0
  193. package/site/dist/assets/accounts-D4AXF17G.js +1 -0
  194. package/site/dist/assets/accounts-IkdFx9nq.js +1 -0
  195. package/site/dist/assets/analytics-mkkvFRju-BRBcadka.js +1 -0
  196. package/site/dist/assets/baseSepolia-Bn1j1Ysw.js +1 -0
  197. package/site/dist/assets/basic-Cz1YiCSk.js +1575 -0
  198. package/site/dist/assets/capitalizeFirstLetter-DmLYqXsO-DtOXx-2n.js +1 -0
  199. package/site/dist/assets/ccip-B1J3oTZx.js +7 -0
  200. package/site/dist/assets/ccip-Bd7261zy.js +1 -0
  201. package/site/dist/assets/ccip-D6EHKpjI.js +1 -0
  202. package/site/dist/assets/chain-scefkYIH.js +5 -0
  203. package/site/dist/assets/check-DHnllI8N.js +1 -0
  204. package/site/dist/assets/chevron-down-1y-r4bGO.js +1 -0
  205. package/site/dist/assets/circle-alert-OwxamXUX.js +1 -0
  206. package/site/dist/assets/circle-check-big-3sZGVC10.js +1 -0
  207. package/site/dist/assets/circle-x-DQjNUV9J.js +1 -0
  208. package/site/dist/assets/client-B-BpRtwY.js +1 -0
  209. package/site/dist/assets/client-BfIR1FvH.js +9 -0
  210. package/site/dist/assets/coinbase-DCPC2L_R-YEuIn3jh.js +3 -0
  211. package/site/dist/assets/copy-DMOX_yn7.js +1 -0
  212. package/site/dist/assets/core-GIEmxmAa.js +12 -0
  213. package/site/dist/assets/createLucideIcon-BsERoFTA.js +1 -0
  214. package/site/dist/assets/defineChain-B-SQDLTG.js +1 -0
  215. package/site/dist/assets/dijkstra-CY95afk4.js +1 -0
  216. package/site/dist/assets/dist-CoS6E-3x.js +1 -0
  217. package/site/dist/assets/dist-Cp6IXeJd.js +1 -0
  218. package/site/dist/assets/dist-CrNxmdZj.js +1 -0
  219. package/site/dist/assets/dist-DYGtf4F0.js +16 -0
  220. package/site/dist/assets/embed.worker-Cnl4VGr3.js +1 -0
  221. package/site/dist/assets/errors-BQ3N-RVt-CZPAWCgC.js +1 -0
  222. package/site/dist/assets/esm-C3DslVJx.js +1 -0
  223. package/site/dist/assets/esm-Ci1ogKuK.js +1 -0
  224. package/site/dist/assets/esm-Co94ENUV.js +37 -0
  225. package/site/dist/assets/esm-bb8SANZh.js +1 -0
  226. package/site/dist/assets/esm-n2lWo7kz.js +1 -0
  227. package/site/dist/assets/ethers-zTjbodk5-Cs648CnD.js +1 -0
  228. package/site/dist/assets/eventemitter3-Dzc_0Uq2.js +1 -0
  229. package/site/dist/assets/external-link-BBPG3rG7.js +1 -0
  230. package/site/dist/assets/farcaster-DPlSjvF5-CzBCmgyL.js +1 -0
  231. package/site/dist/assets/features-CuiHbgEJ.js +2 -0
  232. package/site/dist/assets/fingerprint-pattern-CjLtyIxB.js +1 -0
  233. package/site/dist/assets/floating-ui.react-DmaCfayr.js +1 -0
  234. package/site/dist/assets/floating-ui.react-dom-CaoMF8mP.js +1 -0
  235. package/site/dist/assets/formatErc20TokenAmount-BuPk9xcy-BVqOKQif.js +1 -0
  236. package/site/dist/assets/formatter-CVbp4SlJ.js +1 -0
  237. package/site/dist/assets/get-entropy-details-for-user-dHRH5Gpi-BNiOFXbK.js +1 -0
  238. package/site/dist/assets/getChainName-DjpPdUSc-DUyKDrnp.js +1 -0
  239. package/site/dist/assets/getErc20Balance-jXNpFf0N-q4bV8kQq.js +1 -0
  240. package/site/dist/assets/getErc20TokenInfo-BNTrzLMP-DcnTFrXN.js +1 -0
  241. package/site/dist/assets/getFormattedUsdFromLamports-De3U9GlO-Gx4_wxON.js +1 -0
  242. package/site/dist/assets/getUsdcMintAddress-BVgm9GRo-r2UnDeEy.js +1 -0
  243. package/site/dist/assets/guards-BIW-GiMJ-D3tWTQAR.js +1 -0
  244. package/site/dist/assets/hooks.module-BYZGfwDl.js +1 -0
  245. package/site/dist/assets/hourglass-D_GfQdJr.js +1 -0
  246. package/site/dist/assets/id-UqEwL2BI-CTlvRMA5.js +1 -0
  247. package/site/dist/assets/index-BdEw5wyl-kLbhqLbv.js +1 -0
  248. package/site/dist/assets/index-C2h3EneX.js +8 -0
  249. package/site/dist/assets/{index-CWARkn2w-D6ikWJWj.js → index-CWARkn2w-DxuckIFn.js} +7 -7
  250. package/site/dist/assets/index-DvMddJcd-CNBb4VUn.js +12 -0
  251. package/site/dist/assets/index-YiCw0Y_x-Czl0tWfF.js +436 -0
  252. package/site/dist/assets/index.browser-B-i-Lj3J.js +1 -0
  253. package/site/dist/assets/index.browser-BMmUcykv.js +1 -0
  254. package/site/dist/assets/index.es-Crd0TyUS.js +2 -0
  255. package/site/dist/assets/index.es-DQbup1WG.js +3 -0
  256. package/site/dist/assets/isPaymentRequestAvailable-Bq1cemEn-Cjf3l05I.js +1 -0
  257. package/site/dist/assets/jsx-runtime-CndCZlyt.js +1 -0
  258. package/site/dist/assets/landmark-BZPqMFEf.js +1 -0
  259. package/site/dist/assets/lib-DGtzi2DK.js +1 -0
  260. package/site/dist/assets/localBatchGatewayRequest-B71J8sQ9.js +29 -0
  261. package/site/dist/assets/lock-DyN_c-ud.js +1 -0
  262. package/site/dist/assets/logger-CsXm3oIv-B0UYpNFI.js +1 -0
  263. package/site/dist/assets/mail-V_mcPb64.js +1 -0
  264. package/site/dist/assets/modal-context-CwmSeFcv-DPWNJrfK.js +1 -0
  265. package/site/dist/assets/native-BKj27wfc.js +1 -0
  266. package/site/dist/assets/ofetch.CWycOUEr-Duby3iHT.js +1 -0
  267. package/site/dist/assets/parseAbi-Csg-8t59.js +2 -0
  268. package/site/dist/assets/parseAbiParameters-BWbIMYe4.js +1 -0
  269. package/site/dist/assets/parseEther-CHS0GNkM.js +1 -0
  270. package/site/dist/assets/pkce-DXF0yKjP-7_VY-d83.js +1 -0
  271. package/site/dist/assets/preload-helper-CRzLMJPS.js +1 -0
  272. package/site/dist/assets/privy-context-81KmsBw2-DiR6-Yq8.js +2 -0
  273. package/site/dist/assets/property-DuZ9DLP4.js +3 -0
  274. package/site/dist/assets/react-BfYA1q0G.js +1 -0
  275. package/site/dist/assets/react-CK2HRI1t.js +1 -0
  276. package/site/dist/assets/react-DxGeY8B8.js +1 -0
  277. package/site/dist/assets/react-auth-sHnipzbS.js +1 -0
  278. package/site/dist/assets/react-dom-BI2Koe4o.js +1 -0
  279. package/site/dist/assets/reservoir-x-nGuZkT-BguVFH3D.js +1 -0
  280. package/site/dist/assets/roles-BDPDWrwo.js +1 -0
  281. package/site/dist/assets/roles-DKPW79Ca.js +1 -0
  282. package/site/dist/assets/rolldown-runtime-Bjp52BOI.js +1 -0
  283. package/site/dist/assets/safe-url-D7SRPu33-CkMedGro.js +1 -0
  284. package/site/dist/assets/secp256k1-BeYL8aZl.js +1 -0
  285. package/site/dist/assets/secp256k1-Bh4MSkhz.js +1 -0
  286. package/site/dist/assets/secp256k1-Ci4cqHl0.js +1 -0
  287. package/site/dist/assets/secp256k1-DsxXqbXv.js +1 -0
  288. package/site/dist/assets/secp256k1-N9RUmafO.js +1 -0
  289. package/site/dist/assets/serializeAuthorizationList-DGMik9Wx.js +1 -0
  290. package/site/dist/assets/serializeSignature-CWKpxoab.js +2 -0
  291. package/site/dist/assets/sha2-C6s7zZmb.js +1 -0
  292. package/site/dist/assets/{shared-DRZUmnL5-MWD-C-pp.js → shared-DRZUmnL5-BewE5wK8.js} +33 -33
  293. package/site/dist/assets/{shared-FM0rljBt-c4eSjzGj.js → shared-FM0rljBt-CxLACri_.js} +6 -6
  294. package/site/dist/assets/shouldProceedtoEmbeddedWalletCreationFlow-B3vyavrh-BkAKsRNi.js +1 -0
  295. package/site/dist/assets/simulateTransaction-CfuOrae4-PjA_tGjX.js +1 -0
  296. package/site/dist/assets/smartphone-3p8nFSTE.js +1 -0
  297. package/site/dist/assets/src-BBjkfi-Q.js +1 -0
  298. package/site/dist/assets/storage-Ufl800Ne-1qCR2JMO.js +8 -0
  299. package/site/dist/assets/stringify-DqUj9VzO.js +20 -0
  300. package/site/dist/assets/stripe.esm-DEi2D291.js +2 -0
  301. package/site/dist/assets/styles-BsotlekN-Aq27nZGc.js +9 -0
  302. package/site/dist/assets/{styles-Cm9H63WO-Cv1TbqYi.js → styles-Cm9H63WO-p_ic_dxE.js} +17 -17
  303. package/site/dist/assets/{styles-DVyDvTdj-CI4xZNHp.js → styles-DVyDvTdj-CjsWqAld.js} +8 -8
  304. package/site/dist/assets/{styles-hslXy6xG-DeVcFoDD.js → styles-hslXy6xG-D5QHIrJU.js} +23 -23
  305. package/site/dist/assets/telegram-B-JqnkqZ-Dqkm4rDn.js +1 -0
  306. package/site/dist/assets/to-ui-error-DWe-qwS3-Bi1HUQI9.js +4 -0
  307. package/site/dist/assets/toViemAccount-B5iDGq1b-CdFZwv07.js +2 -0
  308. package/site/dist/assets/transaction-BNTP-bFm-M5tJx8vY.js +1 -0
  309. package/site/dist/assets/transfer-6YztDh-t-BVQkTvG-.js +1 -0
  310. package/site/dist/assets/transformers.web-BTyOEJ0C.js +40 -0
  311. package/site/dist/assets/transformers.web-CUZUFjAK.js +49 -0
  312. package/site/dist/assets/triangle-alert-BG3Qw-Hq.js +1 -0
  313. package/site/dist/assets/twitch-5IOe4sIQ-CaXHFlAu.js +1 -0
  314. package/site/dist/assets/types-4CuOD23i.js +1 -0
  315. package/site/dist/assets/use-headless-crypto-deposit-Yn-QRLB3-CQqeyhGY.js +1 -0
  316. package/site/dist/assets/use-unlink-wallet-BKK4_5Ur-C0xQN_Lp.js +1 -0
  317. package/site/dist/assets/useActiveWallet-B-yZYGc6-BkK6rFBm.js +123 -0
  318. package/site/dist/assets/useGetSolPrice-x7gfUIHJ-CLVXqv6I.js +1 -0
  319. package/site/dist/assets/useGetTokenPrice-CaoUkb79-DAXXs3rs.js +1 -0
  320. package/site/dist/assets/useI18n-C-5n_noF-CGpkgIVy.js +1 -0
  321. package/site/dist/assets/useWalletBalance-CZnP5f_f-Cfd64m4n.js +1 -0
  322. package/site/dist/assets/useWallets-X1ndvJ_U-CAYqg7Za.js +1 -0
  323. package/site/dist/assets/utils-BkR7EQjg.js +1 -0
  324. package/site/dist/assets/utils-DJhBNOZA.js +1 -0
  325. package/site/dist/assets/utils-DdckVfQr.js +1 -0
  326. package/site/dist/assets/w3m-modal-B4H_uiPH.js +1174 -0
  327. package/site/dist/assets/wallet-BNI12IYk.js +1 -0
  328. package/site/dist/assets/wallet-CITSaPlB.js +2 -0
  329. package/site/dist/assets/wallet-connect-BvJtUsDt-CVlSNIXP.js +1 -0
  330. package/site/dist/assets/walletconnect-registry-xxG8XLCb-BpzpBq5s.js +1 -0
  331. package/site/dist/assets/walletconnect-v2-3frQFwbg-CzZ6oybX.js +12 -0
  332. package/site/dist/assets/{index-CztIxJB6.js → wui-ux-by-reown-XyHdtV1O.js} +296 -296
  333. package/site/dist/assets/x-gjDrY2rk.js +1 -0
  334. package/site/dist/index.html +5 -117
  335. package/site/worker.js +20 -32
  336. package/src/agent/mcp.js +46 -14
  337. package/src/agent/view-tools.js +3 -11
  338. package/src/agent/x402.js +3 -42
  339. package/src/discover/apps.js +37 -2
  340. package/src/discover/explore.js +19 -13
  341. package/src/publish/init.js +74 -0
  342. package/src/publish/ship.js +90 -79
  343. package/src/publish/view-cli.js +6 -3
  344. package/src/publish/view.js +27 -43
  345. package/template/README.md +49 -0
  346. package/template/app.json +27 -0
  347. package/template/eval/goals.md +7 -0
  348. package/template/eval/golden.jsonl +0 -0
  349. package/template/gitignore +3 -0
  350. package/template/package.json +13 -0
  351. package/template/wrangler.json +12 -0
  352. package/site/dist/assets/AccountNotFoundScreen-C4njXc69-RUyAWRzV.js +0 -1
  353. package/site/dist/assets/AddFundsSelectionScreen-RAoCn7ej-ZV-LlYBe.js +0 -31
  354. package/site/dist/assets/Address-H8kD1d9O-CGQnt7Pu.js +0 -17
  355. package/site/dist/assets/AffirmativeConsentScreen-BG0MJxku-CKn2JLwq.js +0 -6
  356. package/site/dist/assets/AllowlistRejectionScreen-Cae6e1Od-9oIP9fma.js +0 -1
  357. package/site/dist/assets/ArrowsRightLeftIcon-BEhBD_6N.js +0 -1
  358. package/site/dist/assets/AuthenticateWithWalletScreen-CU6hIcFT-D1wLlSJs.js +0 -1
  359. package/site/dist/assets/AwaitingEvmToSolBridgingScreen-D0e_sZMS-CSBbHTyz.js +0 -1
  360. package/site/dist/assets/AwaitingExternalEthereumTransferScreen-ur5HL4R7-BsRq-xBt.js +0 -1
  361. package/site/dist/assets/AwaitingPasswordlessCodeScreen-DRHz76mM-BPdhsKvN.js +0 -103
  362. package/site/dist/assets/AwaitingSolToEvmBridgingScreen-CdLRrGD2-CEGNdrkr.js +0 -1
  363. package/site/dist/assets/BridgeNetworkSelectionView-CFGjB2nO-Da9P7eSx.js +0 -68
  364. package/site/dist/assets/CaptchaScreen-DbpvkIGx-BecgMnD_.js +0 -1
  365. package/site/dist/assets/CheckCircleIcon-DBiWFjO6.js +0 -1
  366. package/site/dist/assets/CheckCircleIcon-DzG2ROJZ.js +0 -1
  367. package/site/dist/assets/Checkbox-D1EDeo41-DMHcj9o_.js +0 -52
  368. package/site/dist/assets/ChevronDownIcon-2Os56gUt.js +0 -1
  369. package/site/dist/assets/Chip-CZKIKt9K-BWzs9fj5.js +0 -26
  370. package/site/dist/assets/CoinbaseOnrampStatusScreen-BbyCJDXL-CFvcSiDs.js +0 -16
  371. package/site/dist/assets/ConnectEmailForm-B-VRE0MN-BozkCg8q.js +0 -3
  372. package/site/dist/assets/ConnectLedgerScreen-DWHABGot-DaCnbBzh.js +0 -10
  373. package/site/dist/assets/ConnectOnlyLandingScreen-CZYx9Bmp-DUkCLkxD.js +0 -1
  374. package/site/dist/assets/ConnectOnlyStatusScreen-DCRzjxHx-Dv_5nMkZ.js +0 -1
  375. package/site/dist/assets/ConnectOrCreateScreen-CUUYUO07-DSGEeB3Y.js +0 -1
  376. package/site/dist/assets/ConnectPhoneForm-Dek5xn4C-C-s4s_Lq.js +0 -95
  377. package/site/dist/assets/ConnectWalletView-DqI-PTvX-BKX7fdYr.js +0 -74
  378. package/site/dist/assets/ConnectionStatusScreen-fUfROm9m-DSoAuMFZ.js +0 -7
  379. package/site/dist/assets/CopyToClipboard-i_OQSBJr-CZTXyfV0.js +0 -39
  380. package/site/dist/assets/CopyableText-CQapvaMr-DHO818I0.js +0 -28
  381. package/site/dist/assets/CrossAppAuthScreen-CLw7ymZq-DW4nRGfz.js +0 -1
  382. package/site/dist/assets/CustomLandingScreenView-Cm_MBSyX-DH8Nnb4Y.js +0 -22
  383. package/site/dist/assets/DelegatedActionsConsentScreen-DYF2U4y5-gfUS_uV5.js +0 -1
  384. package/site/dist/assets/DelegatedActionsRevokeScreen-bPp6Uwyh-DZj9HTHc.js +0 -1
  385. package/site/dist/assets/DepositAddressAddressStepView-4vdkb55L-eHYsDK9W.js +0 -187
  386. package/site/dist/assets/DepositAddressScreen-DBLRs7aI-DK_XVgVk.js +0 -8
  387. package/site/dist/assets/DepositAddressV3Screen-CDqIEMQw-6gRZzhLe.js +0 -1
  388. package/site/dist/assets/EmbeddedWalletConnectingScreen-D4T7DUzs-BZu2ae0k.js +0 -1
  389. package/site/dist/assets/EmbeddedWalletCreatedScreen-D7WhW5ve-86pviemJ.js +0 -1
  390. package/site/dist/assets/EmbeddedWalletKeyExportScreen-CqV4NYQ3-vDcvT53Y.js +0 -23
  391. package/site/dist/assets/EmbeddedWalletOnAccountCreateScreen-BoKb3Q2S-rNJAtSJc.js +0 -1
  392. package/site/dist/assets/EmbeddedWalletPasswordUpdateScreen-D3rMlqS7-I8Q95280.js +0 -1
  393. package/site/dist/assets/EmbeddedWalletPasswordUpdateSplashScreen-BPFkWJeE-Coi7OxoI.js +0 -1
  394. package/site/dist/assets/EnrollTotp-Dibew4dp-DC7FrDgo.js +0 -66
  395. package/site/dist/assets/EnvelopeIcon-DY6ERnW7.js +0 -1
  396. package/site/dist/assets/ErrorBanner-BcpGRt0h-BvESwN99.js +0 -21
  397. package/site/dist/assets/ErrorScreen-DipdTWzE-DnKGxH1Z.js +0 -4
  398. package/site/dist/assets/ExclamationCircleIcon-BZhlqH0r.js +0 -1
  399. package/site/dist/assets/ExclamationTriangleIcon-CkAOJIYV.js +0 -1
  400. package/site/dist/assets/FarcasterConnectStatusScreen-51tjUxqq-4pi7jooW.js +0 -75
  401. package/site/dist/assets/FarcasterSignerStatusScreen-6x-Uh95G-z2XCMaLL.js +0 -28
  402. package/site/dist/assets/FiatOnrampScreen-BAhYeiTI-CBVA9v1-.js +0 -491
  403. package/site/dist/assets/FingerPrintIcon-ra2dqmJO.js +0 -1
  404. package/site/dist/assets/FundSolWalletWithExternalSolanaWallet-WtLwYaOl-DwAwc6Ny.js +0 -1
  405. package/site/dist/assets/FundWalletMethodHeader-BWNkokCT-CZszQsZf.js +0 -1
  406. package/site/dist/assets/FundWithBankDepositScreen-DajkHxBD-DfX6nvFQ.js +0 -58
  407. package/site/dist/assets/FundingEditAmountScreen-CpvpiO4M-CDS_sk_t.js +0 -1
  408. package/site/dist/assets/FundingMethodSelectionScreen-Db7vhRlE-CPfNQemT.js +0 -1
  409. package/site/dist/assets/GlobeAltIcon-SEUEIe_E.js +0 -1
  410. package/site/dist/assets/GooglePay-B53WnudL-aap7zwag.js +0 -1
  411. package/site/dist/assets/HCaptchaWrapper-CUi9LJsp-DgSjCjQI.js +0 -4
  412. package/site/dist/assets/InAppBrowserLoginNotPossible-BMR9br1T-DO4wICml.js +0 -1
  413. package/site/dist/assets/InfoBanner-Cb3p1z12-CDWt2ADo.js +0 -22
  414. package/site/dist/assets/InjectedWalletIcon-DLcYOGDj-Ba19XoBr.js +0 -1
  415. package/site/dist/assets/InstallWalletScreen-DTA8dwLv-DGpewEch.js +0 -1
  416. package/site/dist/assets/LandingScreen-CGWUoSUG-CUOCWUXd.js +0 -1
  417. package/site/dist/assets/Link-BdDilT2T-BYiP1zvW.js +0 -40
  418. package/site/dist/assets/LinkConflictScreen-C3ZEPsgl-Tb6cAepT.js +0 -77
  419. package/site/dist/assets/LinkEmailScreen-dKo9frwc-pq0NF2JO.js +0 -1
  420. package/site/dist/assets/LinkPasskeyScreen-zbrl_AI_-D9MOmDqg.js +0 -117
  421. package/site/dist/assets/LinkPhoneScreen-oIUpfj0w-B80UJqAZ.js +0 -1
  422. package/site/dist/assets/LockClosedIcon-BqkoEL9J.js +0 -1
  423. package/site/dist/assets/LoginFailedScreen-CN0dJV6U-DlnOM-Kh.js +0 -1
  424. package/site/dist/assets/ManualTransferScreen-CHqcuqbs-DSShupq9.js +0 -1
  425. package/site/dist/assets/MfaAuthEnrollmentFlowScreen-Dj7gPTRC-DUPV_SLA.js +0 -1
  426. package/site/dist/assets/MfaAuthVerifyFlowScreen-DbFpyWMy-D96GpzXX.js +0 -1
  427. package/site/dist/assets/MfaEnrollmentFlowScreen-DhLnGgnr-CYQDa4ND.js +0 -1
  428. package/site/dist/assets/MfaVerifyFlowScreen-C_XPjMRP-CJtSAXGN.js +0 -1
  429. package/site/dist/assets/ModalFooter-BCuEK_nz-D2I8KWtk.js +0 -403
  430. package/site/dist/assets/MoonpayStatusScreen-CzTUtokc-Bx5aHy-z.js +0 -16
  431. package/site/dist/assets/OAuthStatusScreen-ufbOa-da-CS6988X2.js +0 -1
  432. package/site/dist/assets/OpenLink-CUpJ1mOr-EZWVSX2r.js +0 -39
  433. package/site/dist/assets/PasskeySelectSignupOrLogin-xh2ScC_l-BY4eK5Jh.js +0 -1
  434. package/site/dist/assets/PasskeyStatusScreen-Bla8MaOk-LXys76u9.js +0 -6
  435. package/site/dist/assets/PasswordRecoveryScreen-awGXZkQk-RczvLvmo.js +0 -20
  436. package/site/dist/assets/PhArrowClockwise-mOiWYLMV.js +0 -14
  437. package/site/dist/assets/PhArrowDown-CkoOD89h.js +0 -14
  438. package/site/dist/assets/PhArrowLeft-C0jlxVhM.js +0 -14
  439. package/site/dist/assets/PhArrowRight-BI-V03Xf.js +0 -14
  440. package/site/dist/assets/PhArrowUp-izKvURUW.js +0 -14
  441. package/site/dist/assets/PhArrowUpRight-Bn-JhHsY.js +0 -14
  442. package/site/dist/assets/PhArrowsLeftRight-CYsRQ2qh.js +0 -14
  443. package/site/dist/assets/PhBrowser-BjzAmrHO.js +0 -14
  444. package/site/dist/assets/PhCaretDown-ddSjwcwm.js +0 -14
  445. package/site/dist/assets/PhCaretLeft-B7YLoNEF.js +0 -14
  446. package/site/dist/assets/PhCaretRight-BY8D5MIg.js +0 -14
  447. package/site/dist/assets/PhCaretUp-BG10nSut.js +0 -14
  448. package/site/dist/assets/PhCheck-DrKd7pBC.js +0 -14
  449. package/site/dist/assets/PhClock-Sj17weCB.js +0 -14
  450. package/site/dist/assets/PhCopy-rgttky8E.js +0 -14
  451. package/site/dist/assets/PhDeviceMobile-CnybhXY-.js +0 -14
  452. package/site/dist/assets/PhDotsThree-CSAEcba1.js +0 -14
  453. package/site/dist/assets/PhEnvelope-SmaNeXoQ.js +0 -14
  454. package/site/dist/assets/PhFunnelSimple-DKx35ITq.js +0 -14
  455. package/site/dist/assets/PhMagnifyingGlass-B6D0sWFL.js +0 -14
  456. package/site/dist/assets/PhPlus-CBvZvLax.js +0 -14
  457. package/site/dist/assets/PhWarningCircle-Cm58gXb9.js +0 -14
  458. package/site/dist/assets/PhX-C3b4cCEy.js +0 -14
  459. package/site/dist/assets/PhoneIcon-CzbssTb8.js +0 -1
  460. package/site/dist/assets/PinInput-DbZ0b1i1-1DtLWL81.js +0 -247
  461. package/site/dist/assets/QrCode-DbnZwlkH-ChwcUk_h.js +0 -22
  462. package/site/dist/assets/RecoveryOAuthStatusScreen-CsgtTI2x-C79jd345.js +0 -1
  463. package/site/dist/assets/RecoveryPasswordCreateScreen-Be-qJ-LU-C9c0x-yq.js +0 -1
  464. package/site/dist/assets/RecoverySelectionScreen-D1iGtpmi-PNqHb6CI.js +0 -7
  465. package/site/dist/assets/ScreenLayout-OwaQQcxH-B4Z8FjFp.js +0 -1
  466. package/site/dist/assets/SetAutomaticRecoveryScreen-BO_OEqAZ-CUpQZ9wq.js +0 -14
  467. package/site/dist/assets/SetWalletPasswordForm-DwCTVtAh-ZzvPLj2s.js +0 -15
  468. package/site/dist/assets/ShieldCheckIcon-Bjwe_-PV.js +0 -1
  469. package/site/dist/assets/SignRequestScreen-BHKv32KR-0qGeNipB.js +0 -26
  470. package/site/dist/assets/StandardSignAndSendTransactionScreen-CfhIXVtd-C3lgJb68.js +0 -20
  471. package/site/dist/assets/TelegramAuthScreen-UL9zLfO8-l35_C2DG.js +0 -1
  472. package/site/dist/assets/TodoList-DnyULl18-JxWWU9KA.js +0 -36
  473. package/site/dist/assets/TransactionDetails-e9nesl30-C91nJPM9.js +0 -109
  474. package/site/dist/assets/TransactionErrorView-BDBNqA_f-Cpm-4xzm.js +0 -178
  475. package/site/dist/assets/TransferFromWalletScreen-Qvn1Yuno-BWCH7-Si.js +0 -31
  476. package/site/dist/assets/TransferOrBridgeLoadingScreen-Dl1I_iIz-BWMeJabk.js +0 -6
  477. package/site/dist/assets/TurnstileWrapper-B7sNddys-Dgr80Gih.js +0 -1
  478. package/site/dist/assets/UpdateEmailScreen-DVOhPV0H-Clk4zk-8.js +0 -1
  479. package/site/dist/assets/UpdatePhoneScreen-CXRswTNZ-BgRsoR3B.js +0 -1
  480. package/site/dist/assets/UserLimitReachedScreen-5we2DHn8-D-SU-vAz.js +0 -1
  481. package/site/dist/assets/WalletCards-DH1rqayz-UuZ4i_Ze.js +0 -1
  482. package/site/dist/assets/WalletIcon-B1i03Vqc.js +0 -1
  483. package/site/dist/assets/WalletInfoCard-sq_2wgFg-TXTxmb8L.js +0 -29
  484. package/site/dist/assets/WalletInterstitialScreen-Sh7LfsAh-CbrFb0ON.js +0 -1
  485. package/site/dist/assets/WalletLink-DK5LB5Ha-BYQZV7UV.js +0 -20
  486. package/site/dist/assets/WalletOverflowButton-bfCnp-9T-CNgSPnTS.js +0 -1
  487. package/site/dist/assets/WarningBanner-ZZqCEtZK-DNZUUOph.js +0 -21
  488. package/site/dist/assets/__vite-browser-external-BIHI7g3E.js +0 -1
  489. package/site/dist/assets/analytics-mkkvFRju-DOXuftJB.js +0 -1
  490. package/site/dist/assets/basic-C9wn6QoQ.js +0 -1575
  491. package/site/dist/assets/bytes-CjWw8TJh.js +0 -1
  492. package/site/dist/assets/capitalizeFirstLetter-DmLYqXsO-tV1Idewc.js +0 -1
  493. package/site/dist/assets/ccip-BhHEqVIW.js +0 -1
  494. package/site/dist/assets/check-C_DTyjLS.js +0 -1
  495. package/site/dist/assets/chevron-down-iklXXH-z.js +0 -1
  496. package/site/dist/assets/circle-alert-KEOUF48T.js +0 -1
  497. package/site/dist/assets/circle-check-big-BJ_ADwB4.js +0 -1
  498. package/site/dist/assets/circle-x-BSfWmhYk.js +0 -1
  499. package/site/dist/assets/client-BnDcP42J.js +0 -9
  500. package/site/dist/assets/client-DH86IrJA.js +0 -125
  501. package/site/dist/assets/coinbase-DCPC2L_R-2ivYfoMv.js +0 -3
  502. package/site/dist/assets/copy-sK00DOfH.js +0 -1
  503. package/site/dist/assets/core-CRE213RM.js +0 -211
  504. package/site/dist/assets/createLucideIcon-D9OK_uxG.js +0 -1
  505. package/site/dist/assets/custom-V1wex-Di.js +0 -1
  506. package/site/dist/assets/dijkstra-COg3n3zL.js +0 -1
  507. package/site/dist/assets/embed.worker-BRIYO7m8.js +0 -1
  508. package/site/dist/assets/encodePacked-DyXYq3Cc.js +0 -1
  509. package/site/dist/assets/ethers-zTjbodk5-DSYOi6tU.js +0 -1
  510. package/site/dist/assets/external-link-Cdp8NBio.js +0 -1
  511. package/site/dist/assets/fallback-DiFue5Zm.js +0 -1
  512. package/site/dist/assets/farcaster-DPlSjvF5-DP2DLoHZ.js +0 -1
  513. package/site/dist/assets/features-B6BTj_BL.js +0 -5
  514. package/site/dist/assets/fingerprint-pattern-gFJTz5e4.js +0 -1
  515. package/site/dist/assets/floating-ui.react-D9ndYqYK.js +0 -1
  516. package/site/dist/assets/floating-ui.react-dom-CNbOgOFt.js +0 -1
  517. package/site/dist/assets/formatErc20TokenAmount-BuPk9xcy-CkAr4Oc0.js +0 -1
  518. package/site/dist/assets/getChainName-DjpPdUSc-c2urPd0g.js +0 -1
  519. package/site/dist/assets/getErc20Balance-jXNpFf0N-mFQ9Iqk-.js +0 -1
  520. package/site/dist/assets/getErc20TokenInfo-BNTrzLMP-Dx5he_uG.js +0 -1
  521. package/site/dist/assets/getFormattedUsdFromLamports-De3U9GlO-C446pzMl.js +0 -1
  522. package/site/dist/assets/getTransactionCount-80UHlwAV.js +0 -1
  523. package/site/dist/assets/getUsdcMintAddress-BVgm9GRo-FDalV59C.js +0 -1
  524. package/site/dist/assets/hashTypedData-Beq57Ogb.js +0 -22
  525. package/site/dist/assets/hooks.module-ClpaQ1Tg.js +0 -1
  526. package/site/dist/assets/hourglass-CB7z_I9H.js +0 -1
  527. package/site/dist/assets/http-BocEfKYb.js +0 -19
  528. package/site/dist/assets/index-0knDOgU9.js +0 -1
  529. package/site/dist/assets/index-9jNeS_nC.js +0 -1
  530. package/site/dist/assets/index-B--T-Fmt.js +0 -16
  531. package/site/dist/assets/index-BDkarAkX.js +0 -2
  532. package/site/dist/assets/index-BMfMy017.js +0 -679
  533. package/site/dist/assets/index-BOd8jv8-.js +0 -1
  534. package/site/dist/assets/index-BdEw5wyl-2VGMzHIs.js +0 -1
  535. package/site/dist/assets/index-C8ThRelw.js +0 -9
  536. package/site/dist/assets/index-D4LdLFDC.js +0 -1
  537. package/site/dist/assets/index-D6T-s6sR.js +0 -1
  538. package/site/dist/assets/index-D7396TWe.js +0 -1
  539. package/site/dist/assets/index-DdxtHe81.js +0 -2
  540. package/site/dist/assets/index-DvMddJcd-D7AEQrzj.js +0 -12
  541. package/site/dist/assets/index-nibyPLVP.js +0 -1
  542. package/site/dist/assets/index.browser-B6Bt5URJ.js +0 -1
  543. package/site/dist/assets/isPaymentRequestAvailable-Bq1cemEn-D7xtzRqA.js +0 -1
  544. package/site/dist/assets/landmark-CMLKifhk.js +0 -1
  545. package/site/dist/assets/lock-BkyjNE8h.js +0 -1
  546. package/site/dist/assets/mail-B6-Tq9Ld.js +0 -1
  547. package/site/dist/assets/native-CJ5et6AR.js +0 -1
  548. package/site/dist/assets/nonceManager-zkW7cM66.js +0 -1
  549. package/site/dist/assets/parseEther-C7aOvuze.js +0 -1
  550. package/site/dist/assets/parseSignature-BIjcuWdB.js +0 -1
  551. package/site/dist/assets/preload-helper-PPVm8Dsz.js +0 -1
  552. package/site/dist/assets/privateKeyToAccount-CRvvpHWf.js +0 -1
  553. package/site/dist/assets/property-CnFDNXw5.js +0 -3
  554. package/site/dist/assets/react-auth_false-DedQs79w.js +0 -1
  555. package/site/dist/assets/reservoir-x-nGuZkT-DFxAFt2v.js +0 -1
  556. package/site/dist/assets/roles-DV_6FRBZ.js +0 -1
  557. package/site/dist/assets/safe-url-D7SRPu33-A8zMgOTd.js +0 -1
  558. package/site/dist/assets/serializeErc6492Signature-CeJeL3h6.js +0 -1
  559. package/site/dist/assets/serializeTransaction-L-_Ej-jW.js +0 -8
  560. package/site/dist/assets/shouldProceedtoEmbeddedWalletCreationFlow-B3vyavrh-CF2QteTJ.js +0 -1
  561. package/site/dist/assets/simulateTransaction-CfuOrae4-BHUMPf6Q.js +0 -1
  562. package/site/dist/assets/smartphone-DAN5rY0T.js +0 -1
  563. package/site/dist/assets/stripe.esm-Dv8C3q95.js +0 -2
  564. package/site/dist/assets/styles-BsotlekN-Cjuu2SDV.js +0 -9
  565. package/site/dist/assets/telegram-B-JqnkqZ-DTjJLkIF.js +0 -1
  566. package/site/dist/assets/to-ui-error-DWe-qwS3-Dx3yzcV0.js +0 -4
  567. package/site/dist/assets/toAccount-Bq6rbpbI.js +0 -1
  568. package/site/dist/assets/transaction-BNTP-bFm-CrebgH-D.js +0 -1
  569. package/site/dist/assets/transactionReceipt-BwJl-gjg.js +0 -1
  570. package/site/dist/assets/transfer-6YztDh-t-DU6hH7CZ.js +0 -1
  571. package/site/dist/assets/transformers.web-BEKVh7pD.js +0 -40
  572. package/site/dist/assets/transformers.web-aWa49tv1.js +0 -40
  573. package/site/dist/assets/triangle-alert-ndoiBs4y.js +0 -1
  574. package/site/dist/assets/twitch-5IOe4sIQ-BXviIywg.js +0 -1
  575. package/site/dist/assets/useGetSolPrice-x7gfUIHJ-C7axYJ--.js +0 -1
  576. package/site/dist/assets/useGetTokenPrice-CaoUkb79-CR4CrguU.js +0 -1
  577. package/site/dist/assets/useI18n-C-5n_noF-C_t8QqBJ.js +0 -1
  578. package/site/dist/assets/useWalletBalance-CZnP5f_f-BnSHLVI_.js +0 -1
  579. package/site/dist/assets/w3m-modal-Bz5KWTQ-.js +0 -1174
  580. package/site/dist/assets/wallet-DTM31trz.js +0 -2
  581. package/site/dist/assets/wallet-UESEqPei.js +0 -1
  582. package/site/dist/assets/wallet-connect-BvJtUsDt-CnvUnFbz.js +0 -1
  583. package/site/dist/assets/walletconnect-v2-3frQFwbg-CzQk99gS.js +0 -15
  584. package/site/dist/assets/x-B2_XdOVQ.js +0 -1
@@ -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
@@ -0,0 +1,74 @@
1
+ #!/usr/bin/env node
2
+ // A new app from the template: its recipe (app.json, wrangler.json, eval/), no data.
3
+ // npx @fangorn-network/westmarch init <app> [dir] [--no-install]
4
+ // westmarch build the deploy button's build step (ship.js buildForDeploy)
5
+ // The app's data is what its members commit; the repo this makes can be public.
6
+ import { cpSync, existsSync, mkdtempSync, readdirSync, readFileSync, renameSync, rmSync, writeFileSync } from "node:fs";
7
+ import { spawnSync } from "node:child_process";
8
+ import { tmpdir } from "node:os";
9
+ import { dirname, join, resolve } from "node:path";
10
+ import { fileURLToPath } from "node:url";
11
+ import { buildForDeploy, nameApp } from "./ship.js";
12
+
13
+ const ROOT = join(dirname(fileURLToPath(import.meta.url)), "../..");
14
+ const TEMPLATE = join(ROOT, "template");
15
+ // What fangorn.network accepts: a name a shell and a URL need no quoting for.
16
+ const APP_NAME = /^[a-z0-9][a-z0-9._-]{1,62}$/;
17
+
18
+ export function init(app, dir = app, { install = true, log = console.log } = {}) {
19
+ if (!APP_NAME.test(app ?? "")) throw new Error(`"${app}": 2-63 characters, lowercase letters, digits, dot, dash or underscore`);
20
+ dir = resolve(dir);
21
+ if (existsSync(dir) && readdirSync(dir).length) throw new Error(`${dir} is not empty`);
22
+ cpSync(TEMPLATE, dir, { recursive: true });
23
+ renameSync(join(dir, "gitignore"), join(dir, ".gitignore")); // npm drops a published .gitignore
24
+
25
+ const cfg = nameApp(JSON.parse(readFileSync(join(dir, "app.json"), "utf8")), app);
26
+ writeFileSync(join(dir, "app.json"), JSON.stringify(cfg, null, 1) + "\n");
27
+ const w = JSON.parse(readFileSync(join(dir, "wrangler.json"), "utf8"));
28
+ Object.assign(w, { name: cfg.site.project, r2_buckets: [{ ...w.r2_buckets[0], bucket_name: `${cfg.site.project}-view` }] });
29
+ writeFileSync(join(dir, "wrangler.json"), JSON.stringify(w, null, 1) + "\n");
30
+ writeFileSync(join(dir, "README.md"), readFileSync(join(dir, "README.md"), "utf8").replaceAll("my-app", app));
31
+ const pkg = JSON.parse(readFileSync(join(dir, "package.json"), "utf8"));
32
+ pkg.dependencies["@fangorn-network/westmarch"] = `^${JSON.parse(readFileSync(join(ROOT, "package.json"), "utf8")).version}`;
33
+ writeFileSync(join(dir, "package.json"), JSON.stringify(pkg, null, 2) + "\n");
34
+
35
+ if (install) {
36
+ const sh = (cmd, ...args) => { if (spawnSync(cmd, args, { cwd: dir, stdio: "inherit" }).status !== 0) throw new Error(`${cmd} ${args[0]} failed`); };
37
+ sh("npm", "install"); // the lock CI installs from
38
+ sh("git", "init", "-q", "-b", "main");
39
+ sh("git", "add", "-A");
40
+ sh("git", "commit", "-q", "-m", `${app}: from the westmarch template`);
41
+ }
42
+ log(`${app} is in ${dir}. Next:
43
+ 1. app.json: the description, and the type's fields (role_map)
44
+ 2. npx westmarch-ship app.json # claims ${app} if it isn't yet, deploys the Worker, registers its agent`);
45
+ return dir;
46
+ }
47
+
48
+ if (process.argv[2] === "--selfcheck") {
49
+ const dir = join(mkdtempSync(join(tmpdir(), "init-")), "app");
50
+ try {
51
+ init("my.app_1", dir, { install: false, log: () => {} });
52
+ const cfg = JSON.parse(readFileSync(join(dir, "app.json"), "utf8"));
53
+ if (cfg.app !== "my.app_1" || cfg.site.project !== "my-app-1" || !cfg.types["my.app_1.item.v1"]?.presentation.types["my.app_1.item.v1"])
54
+ throw new Error(`app.json not filled: ${JSON.stringify(cfg)}`);
55
+ if (!existsSync(join(dir, ".gitignore"))) throw new Error("template files missing");
56
+ const w = JSON.parse(readFileSync(join(dir, "wrangler.json"), "utf8"));
57
+ if (w.name !== "my-app-1" || w.r2_buckets[0].bucket_name !== "my-app-1-view") throw new Error(`wrangler.json not filled: ${JSON.stringify(w)}`);
58
+ if (readFileSync(join(dir, "README.md"), "utf8").includes("my-app")) throw new Error("README still names my-app");
59
+ let threw = false;
60
+ try { init("x", join(dir, "y"), { install: false, log: () => {} }); } catch { threw = true; }
61
+ if (!threw) throw new Error("a one-letter name must be refused");
62
+ console.log("init: ok");
63
+ } finally { rmSync(dirname(dir), { recursive: true, force: true }); }
64
+ } else if (process.argv[2] === "init") {
65
+ const [app, dir] = process.argv.slice(3).filter((a) => !a.startsWith("--"));
66
+ try { init(app, dir, { install: !process.argv.includes("--no-install") }); }
67
+ catch (e) { console.error(e.message); process.exit(1); }
68
+ } else if (process.argv[2] === "build") {
69
+ try { await buildForDeploy(process.argv[3] ?? "app.json"); }
70
+ catch (e) { console.error(e.message); process.exit(1); }
71
+ } else {
72
+ console.error("usage: westmarch init <app> [dir] [--no-install] | westmarch build [app.json]");
73
+ process.exit(2);
74
+ }
@@ -14,16 +14,15 @@
14
14
  //
15
15
  // 1. claim the app (first run only; the claim block becomes the card's fromBlock).
16
16
  // The claimer is the app's first member, so its own updates are accepted.
17
- // 2. commit the schema, if the one on chain differs from app.json's `types`
18
- // 3. run each source, which crawls and publishes straight into the app
19
- // 4. the stock page, the card and _headers → .ship/site
20
- // 5. deploy the Worker: its R2 bucket, Workers AI, the cron, CONFIG
21
- // 6. register the ERC-8004 agent and bind the card, if the chain points elsewhere
17
+ // 2. run each source, which crawls and publishes straight into the app
18
+ // 3. the stock page, the card and _headers → .ship/site
19
+ // 4. deploy the Worker: its R2 bucket, Workers AI, the cron, CONFIG (app.json's schema rides in it)
20
+ // 5. register the ERC-8004 agent and bind the card, if the chain points elsewhere
22
21
  //
23
- // The Worker picks up what 2 and 3 published on its next cron run (every few minutes),
22
+ // The Worker picks up what 2 published on its next cron run (every few minutes),
24
23
  // so the view follows the chain with nobody running anything.
25
24
  //
26
- // --register is the fast path, run before there is any data: 1, 4, 5 and 6 binding the card
25
+ // --register is the fast path, run before there is any data: 1, 3, 4 and 5 binding the card
27
26
  // without minting. The mint copies the card's skills into its IPFS registration file and is
28
27
  // never redone, so it waits for the first full ship, when the card lists what the app does.
29
28
  //
@@ -35,10 +34,9 @@ import { spawn, spawnSync } from "node:child_process";
35
34
  import { createHash, randomBytes } from "node:crypto";
36
35
  import { cpSync, existsSync, mkdirSync, readFileSync, readdirSync, realpathSync, rmSync, writeFileSync } from "node:fs";
37
36
  import { createRequire } from "node:module";
38
- import { dirname, join, resolve } from "node:path";
37
+ import { dirname, join, relative, resolve } from "node:path";
39
38
  import { homedir } from "node:os";
40
39
  import { fileURLToPath, pathToFileURL } from "node:url";
41
- import { RELATION_TAG, TYPE_TAG } from "./view.js";
42
40
 
43
41
  const HERE = dirname(fileURLToPath(import.meta.url));
44
42
  // USDC per x402 network (CAIP-2): its address and EIP-712 domain, as each contract reports them.
@@ -151,16 +149,6 @@ export function loadConfig(path) {
151
149
  return { relations: [], tags: [], types: {}, ...c };
152
150
  }
153
151
 
154
- /** The schema commit for `types` + `relations`: one fangorn.type.v1 record per type, one
155
- * fangorn.relation.v1 record per allowed reference. A file for `fangorn commit --replace`. */
156
- export function schemaRecords(types, relations = []) {
157
- return { records: [
158
- ...Object.entries(types).map(([tag, t]) => ({ id: `type:${tag}`, type: TYPE_TAG, payload: {
159
- tag, description: t.description ?? "", role_map: t.role_map ?? {}, presentation: t.presentation ?? {} } })),
160
- ...relations.map((r) => ({ id: `rel:${r.rel}:${r.from}:${r.to}`, type: RELATION_TAG, payload: { rel: r.rel, from: r.from, to: r.to } })),
161
- ] };
162
- }
163
-
164
152
  /** The Worker's wrangler config: the stock worker, the site as its assets, its bucket, the AI
165
153
  * binding, the cron and CONFIG. `worker` is site/worker.js unless a test points elsewhere. */
166
154
  export function wranglerConfig({ name, site, account, cron = "*/5 * * * *", config, url, ipfsGateway, worker = join(HERE, "../../site/worker.js") }) {
@@ -186,13 +174,6 @@ export function wranglerConfig({ name, site, account, cron = "*/5 * * * *", conf
186
174
  const stable = (v) => Array.isArray(v) ? v.map(stable)
187
175
  : v && typeof v === "object" ? Object.fromEntries(Object.keys(v).sort().map((k) => [k, stable(v[k])])) : v;
188
176
 
189
- /** Same shape parseSchema returns, so a config and the chain compare directly. */
190
- const canonical = (types, relations = []) => JSON.stringify(stable({
191
- types: Object.fromEntries(Object.entries(types).sort(([a], [b]) => a.localeCompare(b))
192
- .map(([tag, t]) => [tag, { description: t.description ?? "", role_map: t.role_map ?? {}, presentation: t.presentation ?? {} }])),
193
- relations: [...relations].sort((a, b) => JSON.stringify(a).localeCompare(JSON.stringify(b))),
194
- }));
195
-
196
177
  // ── processes ─────────────────────────────────────────────────────────────────
197
178
 
198
179
  /** `${VAR}` and `${VAR:-default}` from the environment, so one app.json runs on a laptop
@@ -236,12 +217,75 @@ function assertSameDeployment(cli) {
236
217
  "they talk to different contracts. Point app.json's \"fangorn\" at a matching CLI.");
237
218
  }
238
219
 
220
+ /** The block `appId` was claimed in, or undefined: the AppRegistered log, window by window. */
221
+ export async function claimBlock(chain, FangornConfig, appId) {
222
+ const { parseAbiItem } = await import("viem");
223
+ const from = BigInt(FangornConfig.appRegistryFromBlock), to = await chain.getBlockNumber(), step = BigInt(FangornConfig.logWindow ?? 10000);
224
+ const event = parseAbiItem("event AppRegistered(bytes32 indexed app_id, address indexed owner)");
225
+ for (let a = from; a <= to; a += step) {
226
+ const [claimed] = await chain.getLogs({ address: FangornConfig.appRegistryContractAddress, event, args: { app_id: appId },
227
+ fromBlock: a, toBlock: a + step - 1n < to ? a + step - 1n : to });
228
+ if (claimed) return String(claimed.blockNumber);
229
+ }
230
+ }
231
+
232
+ /** The template's app.json as `app`'s: its name, its type tag `<app>.item.v1` and the Worker. */
233
+ export const TEMPLATE_APP = "my-app";
234
+ export function nameApp(cfg, app) {
235
+ const from = `${TEMPLATE_APP}.item.v1`, tag = `${app}.item.v1`;
236
+ const types = Object.fromEntries(Object.entries(cfg.types ?? {}).map(([k, t]) =>
237
+ k === from ? [tag, JSON.parse(JSON.stringify(t).replaceAll(from, tag))] : [k, t]));
238
+ return { ...cfg, app, name: cfg.name === TEMPLATE_APP ? app : cfg.name, types,
239
+ site: { ...cfg.site, project: app.replace(/[._]/g, "-") } }; // a Worker name: letters, digits, dashes
240
+ }
241
+
242
+ /**
243
+ * `westmarch build`: what Workers Builds runs under the deploy button. The site, with a card
244
+ * that names ORIGIN for its own URL (the Worker fills it in), and CONFIG, into the app's own
245
+ * wrangler.json, which `wrangler deploy` then ships with the bucket, AI and cron it declares.
246
+ * No chain writes and no Cloudflare calls: the owner claims the app and registers its agent
247
+ * from fangorn.network. While app.json still names the template's app, the app is the Worker's name.
248
+ *
249
+ * ponytail: free apps only; a paid or private one ships with westmarch-ship, which sets its secret.
250
+ */
251
+ export async function buildForDeploy(configPath, wranglerPath = join(dirname(resolve(configPath)), "wrangler.json")) {
252
+ const w = JSON.parse(readFileSync(wranglerPath, "utf8"));
253
+ let cfg = loadConfig(configPath);
254
+ if (cfg.app === TEMPLATE_APP) cfg = nameApp(cfg, w.name);
255
+ if (cfg.paid || cfg.private) throw new Error(`${configPath}: a paid or private app ships with westmarch-ship`);
256
+ if (!cfg.network) throw new Error(`${configPath}: "network" is required`);
257
+ if (!w.r2_buckets?.[0]?.bucket_name?.includes(w.name))
258
+ log(`the R2 bucket ${w.r2_buckets?.[0]?.bucket_name} doesn't name the Worker; two apps sharing one overwrite each other's view`);
259
+
260
+ process.env.FANGORN_NETWORK = process.env.CHAIN_NAME = cfg.network;
261
+ const [{ createPublicClient, http }, view, { ORIGIN }] = await Promise.all([import("viem"), import("./view.js"), import("../../site/worker.js")]);
262
+ const FangornConfig = await view.network(cfg.network);
263
+ const fangorn = await view.readOnlyFangorn();
264
+ fangorn.setAppId(cfg.app);
265
+ if (/^0x0+$/.test(await fangorn.getAppRegistry().getAppOwner()))
266
+ throw new Error(`${cfg.app} is unclaimed: claim it at fangorn.network first${/[._]/.test(cfg.app) ? "" : `, or set "app" in app.json to the name you claimed`}`);
267
+ const chain = createPublicClient({ transport: http(FangornConfig.rpcUrl) });
268
+ const fromBlock = cfg.fromBlock != null ? String(cfg.fromBlock) : await claimBlock(chain, FangornConfig, fangorn.getAppId());
269
+
270
+ const base = dirname(resolve(configPath));
271
+ const { site, writeCard } = await buildSite(cfg, base);
272
+ writeCard(ORIGIN, { fromBlock, repos: [] });
273
+ const gateway = process.env.FANGORN_IPFS_GATEWAY;
274
+ w.assets = { ...w.assets, directory: relative(dirname(resolve(wranglerPath)), site) };
275
+ w.vars = { ...w.vars, CONFIG: { app: cfg.app, name: cfg.name, description: cfg.description, fromBlock, network: cfg.network,
276
+ schema: { types: cfg.types, relations: cfg.relations }, repos: [], paid: null, private: null },
277
+ ...(gateway ? { IPFS_GATEWAY: gateway } : {}) };
278
+ writeFileSync(wranglerPath, JSON.stringify(w, null, 1) + "\n");
279
+ log(`built ${cfg.app} (fromBlock ${fromBlock}) into ${site}; wrangler deploy ships it`);
280
+ }
281
+
239
282
  // ── the steps ─────────────────────────────────────────────────────────────────
240
283
 
241
284
  export async function ship(configPath, { crawl = true, deploy = true, dry = false, replace = false, only = null, register = false } = {}) {
242
285
  const cfg = loadConfig(configPath);
243
- if (!register && (!Object.keys(cfg.types).length || !cfg.sources.length))
244
- throw new Error(`${configPath}: no types or sources yet, so nothing to build; --register sets up the app alone`);
286
+ // No sources is fine: the app then presents whatever its members commit (repos: [] = all of them).
287
+ if (!register && !Object.keys(cfg.types).length)
288
+ throw new Error(`${configPath}: no types yet, so nothing to build; --register sets up the app alone`);
245
289
  // No default: one that changed would claim every app that leaned on it again, elsewhere.
246
290
  if (!cfg.network) throw new Error(`${configPath}: "network" is required: "baseSepolia" for a new app, or the network the app was claimed on (before 2026-10-20 the default was "arbitrumSepolia")`);
247
291
  CLI = cliArgv(cfg);
@@ -276,8 +320,9 @@ export async function ship(configPath, { crawl = true, deploy = true, dry = fals
276
320
  const me = (fangornCli(cfg.app, ["wallet"]).match(/Address:\s+(0x[0-9a-fA-F]{40})/) ?? [])[1]?.toLowerCase();
277
321
  if (!me) throw new Error("`fangorn wallet` shows no address; run `fangorn init`");
278
322
  let owner = (await registry.getAppOwner()).toLowerCase();
323
+ const chain = createPublicClient({ transport: http(FangornConfig.rpcUrl) });
279
324
  if (/^0x0+$/.test(owner)) {
280
- const block = await createPublicClient({ transport: http(FangornConfig.rpcUrl) }).getBlockNumber();
325
+ const block = await chain.getBlockNumber();
281
326
  state.fromBlock = String(block);
282
327
  log(`${cfg.app} is unclaimed; claiming it for ${me} (fromBlock ${block})`);
283
328
  fangornCli(cfg.app, ["app", "claim"], { dry });
@@ -286,25 +331,12 @@ export async function ship(configPath, { crawl = true, deploy = true, dry = fals
286
331
  } else if (owner !== me) {
287
332
  throw new Error(`${cfg.app} belongs to ${owner}, not this wallet (${me}); pick another name`);
288
333
  }
334
+ // Claimed elsewhere (fangorn.network, the CLI): the view starts at the claim, found once.
335
+ if (state.fromBlock == null && cfg.fromBlock == null) state.fromBlock = await claimBlock(chain, FangornConfig, appId);
289
336
  state.fromBlock ??= String(cfg.fromBlock ?? FangornConfig.appRegistryFromBlock);
290
337
  log(`app ${cfg.app} = ${appId}, owner ${owner}, fromBlock ${state.fromBlock}`);
291
338
 
292
- // 2. schema
293
- if (!register) {
294
- let onChain = null;
295
- try { onChain = view.parseSchema((await fangorn.readRepo(owner, view.SCHEMA_REPO)).contents); } catch { /* none yet */ }
296
- if (!onChain || canonical(onChain.types, onChain.relations) !== canonical(cfg.types, cfg.relations)) {
297
- const sdir = join(dir, "schema");
298
- mkdirSync(sdir, { recursive: true });
299
- writeFileSync(join(sdir, "schema.json"), JSON.stringify(schemaRecords(cfg.types, cfg.relations), null, 1));
300
- log(`schema ${onChain ? "changed" : "is new"}: committing ${Object.keys(cfg.types).join(", ")}`);
301
- fangornCli(cfg.app, ["repo", "init", view.SCHEMA_REPO], { cwd: sdir, dry });
302
- fangornCli(cfg.app, ["commit", "schema.json", "-m", "schema", "--replace"], { cwd: sdir, dry });
303
- fangornCli(cfg.app, ["push"], { cwd: sdir, dry });
304
- } else log("schema unchanged");
305
- }
306
-
307
- // 3. sources: crawl + publish straight into the app. One source failing (a site that
339
+ // 2. sources: crawl + publish straight into the app. One source failing (a site that
308
340
  // blocks us, a feed that is down) keeps its last published data and does not stop the
309
341
  // others; the ship still exits non-zero at the end, naming it.
310
342
  const failed = [];
@@ -322,7 +354,7 @@ export async function ship(configPath, { crawl = true, deploy = true, dry = fals
322
354
  }
323
355
  }
324
356
 
325
- // 4. the page, the card, the headers
357
+ // 3. the page, the card, the headers
326
358
  const { site, writeCard } = await buildSite(cfg, base);
327
359
  // site.url: the app's own domain, routed to the Worker. Otherwise its workers.dev URL,
328
360
  // which is only known once it is deployed: the first deploy learns it and the card follows.
@@ -335,12 +367,8 @@ export async function ship(configPath, { crawl = true, deploy = true, dry = fals
335
367
  const sale = (u) => {
336
368
  if (!cfg.paid) return { paid: null, sale: null };
337
369
  const T = terms(cfg.paid), price = units(cfg.paid.price, T.decimals), description = cfg.paid.description ?? "";
338
- // A membership (MembershipRegistry, joined and claimed through Barliman) reads for free.
339
- const membership = cfg.paid.membership ? { registry: cfg.paid.membership.registry, barliman: cfg.paid.membership.barliman.replace(/\/$/, ""),
340
- chainId: cfg.paid.membership.chainId ?? FangornConfig.caip2, appId } : null;
341
- const paid = { url: `${u}/paid/{id}`, key_url: `${u}/key`, price, asset: T.asset, network: T.network, decimals: T.decimals, symbol: T.symbol,
342
- description, ...(membership ? { membership } : {}) };
343
- return { paid, sale: { ...T, price, description, ...(membership ? { membership } : {}) } };
370
+ const paid = { url: `${u}/paid/{id}`, price, asset: T.asset, network: T.network, decimals: T.decimals, symbol: T.symbol, description };
371
+ return { paid, sale: { ...T, price, description } };
344
372
  };
345
373
  const access = (u) => {
346
374
  const X = cfg.private;
@@ -354,13 +382,13 @@ export async function ship(configPath, { crawl = true, deploy = true, dry = fals
354
382
  const writeSite = (u) => writeCard(u, { fromBlock: state.fromBlock, repos, paid: sale(u).paid, access: access(u).card });
355
383
  writeSite(url ?? `https://${cfg.site.project}.workers.dev`);
356
384
 
357
- // 5. the Worker
385
+ // 4. the Worker
358
386
  const workerConfig = (u) => {
359
387
  const path = join(dir, "wrangler.json");
360
388
  writeFileSync(path, JSON.stringify(wranglerConfig({
361
389
  name: cfg.site.project, site, account: cfg.site.account, cron: cfg.site.cron, url: cfg.site.url, ipfsGateway: view.ipfsGateway(),
362
390
  config: { app: cfg.app, name: cfg.name, description: cfg.description, fromBlock: state.fromBlock, network: cfg.network,
363
- repos: register ? [] : repos, paid: sale(u).sale, private: access(u).config },
391
+ schema: { types: cfg.types, relations: cfg.relations }, repos: register ? [] : repos, paid: sale(u).sale, private: access(u).config },
364
392
  }), null, 1));
365
393
  return path;
366
394
  };
@@ -384,7 +412,7 @@ export async function ship(configPath, { crawl = true, deploy = true, dry = fals
384
412
  else if (cfg.paid) log("paid: set the key secret once with `npx wrangler secret put PAID_SECRET --config .ship/wrangler.json`");
385
413
  } else workerConfig(url ?? `https://${cfg.site.project}.workers.dev`);
386
414
 
387
- // 6. ERC-8004 + the binding
415
+ // 5. ERC-8004 + the binding
388
416
  const cardUrl = `${url}/.well-known/agent-card.json`;
389
417
  const bound = await registry.appAgentUri(appId).catch(() => "");
390
418
  const mint = () => {
@@ -407,7 +435,7 @@ export async function ship(configPath, { crawl = true, deploy = true, dry = fals
407
435
  } else if (deploy) log("card already bound");
408
436
 
409
437
  // A new app has no view until the cron runs, which may be hours off: build the first one now.
410
- if (deploy && !dry && !register && !await fetch(`${url}/view/cdn/catalog`).then((r) => r.ok, () => false)) {
438
+ if (deploy && !dry && !register && cfg.sources.length && !await fetch(`${url}/view/cdn/catalog`).then((r) => r.ok, () => false)) {
411
439
  log("no view yet: indexing it here rather than waiting for the cron");
412
440
  await indexHere(configPath).catch((e) => log(`✗ first index: ${e.message}; the cron will build it`));
413
441
  }
@@ -583,21 +611,18 @@ export function readStage(cfg, base, { crawl = false, only = null, log: say = lo
583
611
  }
584
612
 
585
613
  /**
586
- * The whole app on this machine (devnet.js): a local chain and IPFS, the app claimed and its
587
- * schema committed there, what the sources staged published into it, and its Worker under
614
+ * The whole app on this machine (devnet.js): a local chain and IPFS, the app claimed there, what the sources staged published into it, and its Worker under
588
615
  * `wrangler dev` with a local R2 and an encoder on localhost (or Workers AI with ai=true).
589
616
  * Runs the indexer once, says where everything is, and stays up until interrupted.
590
617
  */
591
618
  export async function devnetShip(configPath, { crawl = false, only = null, port = 8787, ai = false } = {}) {
592
619
  const cfg = loadConfig(configPath);
593
620
  const base = dirname(resolve(configPath));
594
- const [{ devnet }, { SCHEMA_REPO }] = await Promise.all([import("./devnet.js"), import("./view.js")]);
621
+ const { devnet } = await import("./devnet.js");
595
622
  const staged = readStage(cfg, base, { crawl, only });
596
623
  const net = await devnet({ log });
597
624
  const owner = await net.client(cfg.app);
598
625
  await owner.getAppRegistry().registerApp();
599
- await owner.initRepo(SCHEMA_REPO);
600
- await owner.uploadBatch(SCHEMA_REPO, schemaRecords(cfg.types, cfg.relations).records);
601
626
  // The claimer publishes the sources, as `fangorn` does in a ship.
602
627
  for (const [ns, records] of Object.entries(staged)) {
603
628
  if (!records.length) continue;
@@ -611,7 +636,7 @@ export async function devnetShip(configPath, { crawl = false, only = null, port
611
636
  const { site, writeCard } = await buildSite(cfg, base);
612
637
  writeCard(url, { fromBlock: "0", repos });
613
638
  const wcfg = wranglerConfig({ name: cfg.site.project, site, config: { app: cfg.app, name: cfg.name, description: cfg.description,
614
- fromBlock: "0", repos, paid: null, deployment: net.deployment } });
639
+ fromBlock: "0", schema: { types: cfg.types, relations: cfg.relations }, repos, paid: null, deployment: net.deployment } });
615
640
  // Its own R2 and state, apart from a deployed app's.
616
641
  wcfg.vars.RPC_URL = net.rpcUrl;
617
642
  wcfg.vars.IPFS_GATEWAY = net.gatewayUrl;
@@ -705,8 +730,7 @@ export async function buildLocal(configPath, out, { crawl = false, only = null,
705
730
  env.cacheDir = `${homedir()}/.cache/fangorn-mcp/models`;
706
731
  // Not the app's real id or owner: nothing here is compared with the chain.
707
732
  const appId = `0x${createHash("sha256").update(cfg.app).digest("hex")}`, owner = `0x${"10ca1".padStart(40, "0")}`;
708
- const chain = { [`${owner}/${view.SCHEMA_REPO}`]: {
709
- records: schemaRecords(cfg.types, cfg.relations).records.map((r) => ({ ...r, cid: r.id })) } };
733
+ const chain = {};
710
734
  // Storage addresses a record by its content, and so does this.
711
735
  for (const [ns, records] of Object.entries(readStage(cfg, base, { crawl, only, log: say })))
712
736
  chain[`${owner}/${ns}`] = { records: records.map((r) => ({ ...r, cid: createHash("sha256").update(JSON.stringify(stable(r.payload))).digest("hex") })) };
@@ -715,7 +739,7 @@ export async function buildLocal(configPath, out, { crawl = false, only = null,
715
739
  const embed = view.cachedEmbed(join(base, ".ship/vectors.ndjson"));
716
740
  const repos = [...new Set(cfg.sources.map((s) => s.namespace))].filter((n) => !only || only.includes(n));
717
741
  const report = await view.publishView({ fangorn: view.localFangorn(chain, { appId, owner }), app: cfg.app,
718
- repos, out, embed, log: say });
742
+ schema: { types: cfg.types, relations: cfg.relations }, repos, out, embed, log: say });
719
743
  const rows = Object.values(report).reduce((n, r) => n + r.added, 0);
720
744
  say(`local view: ${out} · ${rows} records, ${embed.misses} embedded, ${rows - embed.misses} from the vector cache`);
721
745
  return report;
@@ -724,19 +748,6 @@ export async function buildLocal(configPath, out, { crawl = false, only = null,
724
748
  // ── cli ───────────────────────────────────────────────────────────────────────
725
749
  if (process.argv[1]?.endsWith("ship.js") || process.argv[1]?.endsWith("westmarch-ship")) {
726
750
  if (process.argv[2] === "--selfcheck") {
727
- // The schema as committed, read back the way the chain returns it, must compare
728
- // equal to the config, or every run re-commits an unchanged schema.
729
- const { parseSchema } = await import("./view.js");
730
- const types = { "t.v1": { description: "d", role_map: { title: "name", text: ["body"] }, presentation: { externalUrl: { "t.v1": "{url}" } } },
731
- "u.v1": { description: "e", role_map: { title: "label" } } };
732
- const relations = [{ rel: "cites", from: "t.v1", to: "u.v1" }];
733
- const g = schemaRecords(types, relations);
734
- // Keys reversed at every depth, as a canonical (sorted) encoding hands them back.
735
- const reverse = (v) => Array.isArray(v) ? v.map(reverse)
736
- : v && typeof v === "object" ? Object.fromEntries(Object.keys(v).reverse().map((k) => [k, reverse(v[k])])) : v;
737
- const readBack = parseSchema({ records: g.records.map((r) => ({ ...r, cid: `cid-${r.id}`, payload: reverse(r.payload) })) });
738
- if (canonical(readBack.types, readBack.relations) !== canonical(types, relations)) throw new Error("schema does not round-trip");
739
- if (canonical(readBack.types, readBack.relations) === canonical({ ...types, "v.v1": {} }, relations)) throw new Error("a new type must count as a change");
740
751
  const row = { city: "Wisconsin Rapids", state: "WI", site: "https://x", args: ["--archive-page", "/569/A"] };
741
752
  const cmd = fill(["py", "--site", "{site}", "--city", "{city}", "{args...}", "--ns", "us-{state|lower}-{city|slug}"], row);
742
753
  if (JSON.stringify(cmd) !== JSON.stringify(["py", "--site", "https://x", "--city", "Wisconsin Rapids", "--archive-page", "/569/A", "--ns", "us-wi-wisconsin-rapids"]))
@@ -754,7 +765,7 @@ if (process.argv[1]?.endsWith("ship.js") || process.argv[1]?.endsWith("westmarch
754
765
  throw new Error(`private discovery: ${JSON.stringify(dp.x402)}`);
755
766
  if (units("0.01") !== "10000" || units("5") !== "5000000" || units("1.5", 2) !== "150") throw new Error("units");
756
767
  if (USDC["eip155:84532"].name !== "USDC" || USDC["eip155:8453"].name !== "USD Coin") throw new Error("USDC's EIP-712 name differs on Base Sepolia and Base");
757
- console.log("ship.js self-check ok — a committed schema reads back equal to its config, a new type counts as a change, a source template fills per row, the Worker config binds its bucket, AI and cron, and the paid route is priced per id in /openapi.json and named in /.well-known/x402");
768
+ console.log("ship.js self-check ok — a source template fills per row, the Worker config binds its bucket, AI and cron, and the paid route is priced per id in /openapi.json and named in /.well-known/x402");
758
769
  process.exit(0);
759
770
  }
760
771
  const [path, ...flags] = process.argv.slice(2);
@@ -1,12 +1,14 @@
1
1
  #!/usr/bin/env node
2
2
  // westmarch-view: publish what an app presents as a view (see view.js).
3
3
  //
4
- // westmarch-view --app my-app --out site/view [--repo catalog …] [--from-block N] [--rebake]
4
+ // westmarch-view --app my-app --out site/view [--config app.json] [--repo catalog …] [--from-block N] [--rebake]
5
5
  //
6
+ // The schema (types, relations) is read from --config; without it every type is guessed.
6
7
  // Reads only; needs no key. Deploy <out> with the site, and put its URL in the card's
7
8
  // `views`. An app on the free tier needs none of this: its Worker runs the same code on a
8
9
  // cron (site/worker.js).
9
10
 
11
+ import { readFileSync } from "node:fs";
10
12
  import { homedir } from "node:os";
11
13
 
12
14
  const flags = { repo: [] };
@@ -18,7 +20,7 @@ for (let i = 2; i < process.argv.length; i++) {
18
20
  if (m[1] === "repo") flags.repo.push(v); else flags[m[1]] = v;
19
21
  }
20
22
  if (flags.help || !flags.app || !flags.out) {
21
- console.error("usage: westmarch-view --app <name|0xid> --out <dir> [--repo <name> …] [--from-block N] [--rebake]");
23
+ console.error("usage: westmarch-view --app <name|0xid> --out <dir> [--config app.json] [--repo <name> …] [--from-block N] [--rebake]");
22
24
  process.exit(flags.help ? 0 : 2);
23
25
  }
24
26
 
@@ -31,7 +33,8 @@ const fangorn = await readOnlyFangorn();
31
33
 
32
34
  const t0 = Date.now();
33
35
  const report = await publishView({
34
- fangorn, app: flags.app, repos: flags.repo, out: flags.out,
36
+ fangorn, app: flags.app, repos: flags.repo,
37
+ schema: flags.config ? JSON.parse(readFileSync(flags.config, "utf8")) : undefined, out: flags.out,
35
38
  fromBlock: flags["from-block"], rebake: !!flags.rebake,
36
39
  log: (s) => console.error(s),
37
40
  });