@fangorn-network/westmarch 0.0.20-dev → 0.1.1
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.
- package/README.md +35 -5
- package/docs/app-to-agent.md +113 -620
- package/package.json +18 -18
- package/site/dist/assets/__vite-browser-external-D2U8RZpp.js +1 -0
- package/site/dist/assets/embed.worker-CmS57Zti.js +1 -0
- package/site/dist/assets/index-CkP1WhkV.js +8 -0
- package/site/dist/assets/roles-BDPDWrwo.js +1 -0
- package/site/dist/assets/rolldown-runtime-COiEfhsA.js +1 -0
- package/site/dist/assets/transformers.web-CUZUFjAK.js +49 -0
- package/site/dist/assets/transformers.web-CwR_IYQV.js +40 -0
- package/site/dist/index.html +4 -5
- package/site/feed.js +16 -1
- package/site/no-model.js +4 -0
- package/site/worker.js +382 -59
- package/src/agent/agent-card.js +51 -37
- package/src/agent/mcp.js +173 -500
- package/src/agent/tools.js +3 -2
- package/src/agent/ui.js +1 -1
- package/src/agent/view-tools.js +11 -30
- package/src/agent/x402.js +194 -85
- package/src/core/embed.js +56 -53
- package/src/core/embed.worker.js +1 -1
- package/src/core/rank.js +1 -1
- package/src/core/roles.js +7 -7
- package/src/core/shard.js +12 -8
- package/src/discover/apps.js +103 -67
- package/src/discover/corpora.js +1 -1
- package/src/discover/directory.js +3 -3
- package/src/market/cohort.js +1 -1
- package/src/market/demand.js +1 -1
- package/src/market/reactions.js +24 -18
- package/src/publish/devnet.js +146 -0
- package/src/publish/graph.js +1 -1
- package/src/publish/init.js +74 -0
- package/src/publish/lint.js +3 -2
- package/src/publish/ship.js +433 -288
- package/src/publish/view-cli.js +14 -10
- package/src/publish/view.js +485 -255
- package/src/taste/steam.js +1 -1
- package/src/taste/taste-doc.js +4 -3
- package/src/taste/taste.js +3 -3
- package/src/taste/vault.js +4 -2
- package/template/README.md +48 -0
- package/template/app.json +27 -0
- package/template/eval/goals.md +7 -0
- package/template/eval/golden.jsonl +0 -0
- package/template/gitignore +3 -0
- package/template/package.json +13 -0
- package/template/wrangler.json +12 -0
- package/plugin/scripts/fx.mjs +0 -268
- package/site/dist/assets/AccountNotFoundScreen-C4njXc69-BOfmiSH1.js +0 -1
- package/site/dist/assets/AddFundsSelectionScreen-RAoCn7ej-D_EsIeJu.js +0 -31
- package/site/dist/assets/Address-H8kD1d9O-C85sJ79B.js +0 -17
- package/site/dist/assets/AffirmativeConsentScreen-BG0MJxku-DdEPFOww.js +0 -6
- package/site/dist/assets/AllowlistRejectionScreen-Cae6e1Od-DhVy9iGN.js +0 -1
- package/site/dist/assets/ApiController-CYdiyu9B.js +0 -5
- package/site/dist/assets/ArrowsRightLeftIcon-cp60yobq.js +0 -1
- package/site/dist/assets/AuthenticateWithWalletScreen-CU6hIcFT-8rbYiYYE.js +0 -1
- package/site/dist/assets/AwaitingEvmToSolBridgingScreen-D0e_sZMS-2pkNfCno.js +0 -1
- package/site/dist/assets/AwaitingExternalEthereumTransferScreen-ur5HL4R7-7AQt25_k.js +0 -1
- package/site/dist/assets/AwaitingPasswordlessCodeScreen-DRHz76mM-BZY30TGs.js +0 -103
- package/site/dist/assets/AwaitingSolToEvmBridgingScreen-CdLRrGD2-BILOOLi_.js +0 -1
- package/site/dist/assets/BridgeNetworkSelectionView-CFGjB2nO-CvsbQcFv.js +0 -68
- package/site/dist/assets/CaptchaScreen-DbpvkIGx-D8eDcAkc.js +0 -1
- package/site/dist/assets/CheckCircleIcon-BM409mGI.js +0 -1
- package/site/dist/assets/CheckCircleIcon-NCOQc0Gs.js +0 -1
- package/site/dist/assets/Checkbox-D1EDeo41-rHlvsZzP.js +0 -52
- package/site/dist/assets/ChevronDownIcon-CW-4MSpE.js +0 -1
- package/site/dist/assets/Chip-CZKIKt9K-CutJG010.js +0 -26
- package/site/dist/assets/CoinbaseOnrampStatusScreen-BbyCJDXL-DLs9zX-Q.js +0 -16
- package/site/dist/assets/ConnectEmailForm-B-VRE0MN-N9J6T_YL.js +0 -3
- package/site/dist/assets/ConnectLedgerScreen-DWHABGot-h0uYIUi6.js +0 -10
- package/site/dist/assets/ConnectOnlyLandingScreen-CZYx9Bmp-LeuDMN1E.js +0 -1
- package/site/dist/assets/ConnectOnlyStatusScreen-DCRzjxHx-DaRa59tZ.js +0 -1
- package/site/dist/assets/ConnectOrCreateScreen-CUUYUO07-crHzh-TL.js +0 -1
- package/site/dist/assets/ConnectPhoneForm-Dek5xn4C-BEA4FmhI.js +0 -95
- package/site/dist/assets/ConnectWalletView-DqI-PTvX-CMQIad63.js +0 -74
- package/site/dist/assets/ConnectionStatusScreen-fUfROm9m-BeWLchcf.js +0 -7
- package/site/dist/assets/ConnectionStatusScreen-fUfROm9m-wu3a3kw4.js +0 -1
- package/site/dist/assets/ConnectorUtil-Cq4lWnfe.js +0 -21
- package/site/dist/assets/ConstantsUtil-DmLsRHAl.js +0 -198
- package/site/dist/assets/CopyToClipboard-i_OQSBJr-DujUHNzW.js +0 -39
- package/site/dist/assets/CopyableText-CQapvaMr-DMIdpDaU.js +0 -28
- package/site/dist/assets/CrossAppAuthScreen-CLw7ymZq-Csju14vF.js +0 -1
- package/site/dist/assets/CustomLandingScreenView-Cm_MBSyX-CBOrbNLo.js +0 -22
- package/site/dist/assets/DelegatedActionsConsentScreen-DYF2U4y5-BL5hzNUI.js +0 -1
- package/site/dist/assets/DelegatedActionsRevokeScreen-bPp6Uwyh-fcO51q5H.js +0 -1
- package/site/dist/assets/DepositAddressAddressStepView-4vdkb55L-B3vY888G.js +0 -187
- package/site/dist/assets/DepositAddressScreen-DBLRs7aI-DmdQaFI2.js +0 -8
- package/site/dist/assets/DepositAddressV3Screen-CDqIEMQw-BoupRyfV.js +0 -1
- package/site/dist/assets/EmailInputForm-Cqo1mda8-B2NG3K5V.js +0 -124
- package/site/dist/assets/EmbeddedWalletConnectingScreen-D4T7DUzs-D_AVgO4s.js +0 -1
- package/site/dist/assets/EmbeddedWalletCreatedScreen-D7WhW5ve-CLsJbPYQ.js +0 -1
- package/site/dist/assets/EmbeddedWalletKeyExportScreen-CqV4NYQ3-C9sAExzE.js +0 -23
- package/site/dist/assets/EmbeddedWalletOnAccountCreateScreen-BoKb3Q2S-DxaWAAKa.js +0 -1
- package/site/dist/assets/EmbeddedWalletPasswordUpdateScreen-D3rMlqS7-CxrfLr5q.js +0 -1
- package/site/dist/assets/EmbeddedWalletPasswordUpdateSplashScreen-BPFkWJeE-DHZRGoTN.js +0 -1
- package/site/dist/assets/EnrollTotp-Dibew4dp-SA2pvNEc.js +0 -66
- package/site/dist/assets/EnvelopeIcon-Dh2vSVj4.js +0 -1
- package/site/dist/assets/ErrorBanner-BcpGRt0h-BKOYTyCi.js +0 -21
- package/site/dist/assets/ErrorMessage-D8VaAP5m-CrZOnUyg.js +0 -8
- package/site/dist/assets/ErrorScreen-DipdTWzE-DcxVjMO4.js +0 -1
- package/site/dist/assets/ErrorScreen-DipdTWzE-c8g8En21.js +0 -4
- package/site/dist/assets/ExclamationCircleIcon-DUA2wMfO.js +0 -1
- package/site/dist/assets/ExclamationTriangleIcon-eZfaqcFq.js +0 -1
- package/site/dist/assets/FarcasterConnectStatusScreen-51tjUxqq-s_s5M2CZ.js +0 -75
- package/site/dist/assets/FarcasterSignerStatusScreen-6x-Uh95G-BHBR4k8H.js +0 -28
- package/site/dist/assets/FiatOnrampScreen-BAhYeiTI-BH_sU6EV.js +0 -491
- package/site/dist/assets/FingerPrintIcon-Dm6kxmg7.js +0 -1
- package/site/dist/assets/FundSolWalletWithExternalSolanaWallet-WtLwYaOl-B8TRV36j.js +0 -1
- package/site/dist/assets/FundWalletMethodHeader-BWNkokCT-BQdbJ5Bb.js +0 -1
- package/site/dist/assets/FundWithBankDepositScreen-DajkHxBD-9rPtyA3d.js +0 -58
- package/site/dist/assets/FundingEditAmountScreen-CpvpiO4M-GaXigGI9.js +0 -1
- package/site/dist/assets/FundingMethodSelectionScreen-Db7vhRlE-UsmtTqv4.js +0 -1
- package/site/dist/assets/GlobeAltIcon-vqrVV5ho.js +0 -1
- package/site/dist/assets/GooglePay-B53WnudL-BX5_WtCx.js +0 -1
- package/site/dist/assets/HCaptchaWrapper-CUi9LJsp-D-I8j7NO.js +0 -4
- package/site/dist/assets/InAppBrowserLoginNotPossible-BMR9br1T-BY3j50El.js +0 -1
- package/site/dist/assets/InfoBanner-Cb3p1z12-DLBl_Ywy.js +0 -22
- package/site/dist/assets/InjectedWalletIcon-DLcYOGDj-DLSV_NjP.js +0 -1
- package/site/dist/assets/InstallWalletScreen-DTA8dwLv-CxreyXoD.js +0 -1
- package/site/dist/assets/JsonTree-BHzNC-ic-DcNcbSoM.js +0 -34
- package/site/dist/assets/LabelXs-oqZNqbm_-iafrj25N.js +0 -6
- package/site/dist/assets/LandingScreen-CGWUoSUG-DK1EY-6v.js +0 -1
- package/site/dist/assets/Layouts-BMRfo5hw-CeCOyCLK.js +0 -77
- package/site/dist/assets/Link-BdDilT2T-BEDEdHuS.js +0 -40
- package/site/dist/assets/LinkConflictScreen-C3ZEPsgl-ClWoqvEL.js +0 -77
- package/site/dist/assets/LinkEmailScreen-dKo9frwc-C3v7glH0.js +0 -1
- package/site/dist/assets/LinkPasskeyScreen-zbrl_AI_-D72Gb0LW.js +0 -117
- package/site/dist/assets/LinkPasskeyScreen-zbrl_AI_-DYIl5Kr2.js +0 -1
- package/site/dist/assets/LinkPhoneScreen-oIUpfj0w-C0DuD14j.js +0 -1
- package/site/dist/assets/Loader-UAZqxsnw-Cy7hEE2f.js +0 -62
- package/site/dist/assets/LoadingSkeleton-BMsgO5PV-CiEyS5PZ.js +0 -17
- package/site/dist/assets/LockClosedIcon-BgY_5v_Z.js +0 -1
- package/site/dist/assets/LoginFailedScreen-CN0dJV6U-DhUMiJZJ.js +0 -1
- package/site/dist/assets/ManualTransferScreen-CHqcuqbs-tXiZDHmN.js +0 -1
- package/site/dist/assets/MfaAuthEnrollmentFlowScreen-Dj7gPTRC-CaW7xeCC.js +0 -1
- package/site/dist/assets/MfaAuthVerifyFlowScreen-DbFpyWMy-CeRqvx8k.js +0 -1
- package/site/dist/assets/MfaEnrollmentFlowScreen-DhLnGgnr-BkN1k4lh.js +0 -1
- package/site/dist/assets/MfaVerifyFlowScreen-C_XPjMRP-CXSqLVbE.js +0 -1
- package/site/dist/assets/ModalFooter-BCuEK_nz-c-khvG4Y.js +0 -403
- package/site/dist/assets/MoonpayStatusScreen-CzTUtokc-BRFN2eXr.js +0 -16
- package/site/dist/assets/OAuthStatusScreen-ufbOa-da-CeiGcSia.js +0 -1
- package/site/dist/assets/OpenLink-CUpJ1mOr-DfAvJRyK.js +0 -39
- package/site/dist/assets/PasskeySelectSignupOrLogin-xh2ScC_l-CIf5I7wU.js +0 -1
- package/site/dist/assets/PasskeyStatusScreen-Bla8MaOk-CLoL7QC-.js +0 -6
- package/site/dist/assets/PasswordRecoveryScreen-awGXZkQk-B9F67IYV.js +0 -20
- package/site/dist/assets/PhArrowCircleDown-D97G-BOA.js +0 -14
- package/site/dist/assets/PhArrowClockwise-DVgyFuez.js +0 -14
- package/site/dist/assets/PhArrowDown-87b1BizM.js +0 -14
- package/site/dist/assets/PhArrowLeft-Da0MfnbK.js +0 -14
- package/site/dist/assets/PhArrowRight-AdrIL4DW.js +0 -14
- package/site/dist/assets/PhArrowSquareOut-Bk2CMG3I.js +0 -14
- package/site/dist/assets/PhArrowUp-4sgyKPGx.js +0 -14
- package/site/dist/assets/PhArrowUpRight-BNghD2zq.js +0 -14
- package/site/dist/assets/PhArrowsClockwise-BXRn1GEl.js +0 -14
- package/site/dist/assets/PhArrowsDownUp-DM09Jo_3.js +0 -14
- package/site/dist/assets/PhArrowsLeftRight-MuKBLUoF.js +0 -14
- package/site/dist/assets/PhBank-fHbgCqqZ.js +0 -14
- package/site/dist/assets/PhBrowser-2-9m-AkM.js +0 -14
- package/site/dist/assets/PhCaretDown-BDNabFuL.js +0 -14
- package/site/dist/assets/PhCaretLeft-CI460R-A.js +0 -14
- package/site/dist/assets/PhCaretRight-D7ZS3Ls8.js +0 -14
- package/site/dist/assets/PhCaretUp-C-iIfyvO.js +0 -14
- package/site/dist/assets/PhCheck-DxQXn57r.js +0 -14
- package/site/dist/assets/PhCircleHalf-MJZeRBGF.js +0 -14
- package/site/dist/assets/PhClock-x3MS3Mwi.js +0 -14
- package/site/dist/assets/PhCompass-hYn3HhGN.js +0 -14
- package/site/dist/assets/PhCopy-CWNYcABI.js +0 -14
- package/site/dist/assets/PhCreditCard-Fy4pzwtt.js +0 -14
- package/site/dist/assets/PhCurrencyDollar-BgiaenCi.js +0 -14
- package/site/dist/assets/PhDesktop-CxrzCSv5.js +0 -14
- package/site/dist/assets/PhDeviceMobile-CsyA5Goi.js +0 -14
- package/site/dist/assets/PhDotsThree-D-k1BiYg.js +0 -14
- package/site/dist/assets/PhEnvelope-D8kzeNox.js +0 -14
- package/site/dist/assets/PhFunnelSimple-CfQs5DAW.js +0 -14
- package/site/dist/assets/PhGlobe-DvmSc9_A.js +0 -14
- package/site/dist/assets/PhIdentificationCard-CfkZm-5K.js +0 -14
- package/site/dist/assets/PhImage-Cf0J2ZfJ.js +0 -14
- package/site/dist/assets/PhInfo-Bwi51-2X.js +0 -14
- package/site/dist/assets/PhLightbulb-C4FZV7Es.js +0 -14
- package/site/dist/assets/PhMagnifyingGlass-C9u8jSCJ.js +0 -14
- package/site/dist/assets/PhPaperPlaneRight-zxQVvPLX.js +0 -14
- package/site/dist/assets/PhPlus-C4UoW-2n.js +0 -14
- package/site/dist/assets/PhPower-CFyWDmgD.js +0 -14
- package/site/dist/assets/PhPuzzlePiece-BjoNVfST.js +0 -14
- package/site/dist/assets/PhQrCode-CP3tFauY.js +0 -14
- package/site/dist/assets/PhQuestion-wOWJBd3G.js +0 -14
- package/site/dist/assets/PhQuestionMark-CV0k9C0Y.js +0 -14
- package/site/dist/assets/PhSealCheck-vIKzREuN.js +0 -14
- package/site/dist/assets/PhSignOut-CxELV-i0.js +0 -14
- package/site/dist/assets/PhSpinner-CGDmbzUd.js +0 -14
- package/site/dist/assets/PhTrash-C9PD0SAt.js +0 -14
- package/site/dist/assets/PhUser-0sWNXQeZ.js +0 -14
- package/site/dist/assets/PhVault-6JTskUcC.js +0 -14
- package/site/dist/assets/PhWarning-CoKs3gz6.js +0 -14
- package/site/dist/assets/PhWarningCircle-BXHw1fCt.js +0 -14
- package/site/dist/assets/PhX-DX0SFIqC.js +0 -14
- package/site/dist/assets/PhoneIcon-CvIiPwYQ.js +0 -1
- package/site/dist/assets/PinInput-DbZ0b1i1-CDXZBdQx.js +0 -247
- package/site/dist/assets/PrivyPluginContext-DA-yS5vO-CtQWBiV2.js +0 -1
- package/site/dist/assets/QrCode-DbnZwlkH-h6Bhoe5U.js +0 -22
- package/site/dist/assets/RecoveryOAuthStatusScreen-CsgtTI2x-D-A5P3PX.js +0 -1
- package/site/dist/assets/RecoveryPasswordCreateScreen-Be-qJ-LU-C8lTSeSr.js +0 -1
- package/site/dist/assets/RecoverySelectionScreen-D1iGtpmi-P5P3plkH.js +0 -7
- package/site/dist/assets/SIWXUtil-TUCxa7aA.js +0 -1
- package/site/dist/assets/Screen-D30meWsY-CCeVNuWs.js +0 -175
- package/site/dist/assets/ScreenHeader-CHmc4-Lu-DjyrH7IK.js +0 -31
- package/site/dist/assets/ScreenLayout-OwaQQcxH-CrQM6kvA.js +0 -1
- package/site/dist/assets/SelectSourceAsset-CWFog6gm-D7yTw87h.js +0 -140
- package/site/dist/assets/SetAutomaticRecoveryScreen-BO_OEqAZ-f0iDIGmw.js +0 -14
- package/site/dist/assets/SetWalletPasswordForm-DwCTVtAh-kq1zvA7d.js +0 -11
- package/site/dist/assets/ShieldCheckIcon-o6RHYev1.js +0 -1
- package/site/dist/assets/SignRequestScreen-BHKv32KR-DDpMYyJ1.js +0 -26
- package/site/dist/assets/SolanaWalletConnector-C7Lqk-Wz-DPwhuzcI.js +0 -1
- package/site/dist/assets/StackedContainer-B2vaEl56-eQCM2cmv.js +0 -24
- package/site/dist/assets/StandardSignAndSendTransactionScreen-CfhIXVtd-BJ-onCjv.js +0 -20
- package/site/dist/assets/Subtitle-CV-2yKE4-zxWw2m1Q.js +0 -13
- package/site/dist/assets/TelegramAuthScreen-UL9zLfO8-NWlMgNRX.js +0 -1
- package/site/dist/assets/Title-BnzYV3Is-B_JpTatT.js +0 -7
- package/site/dist/assets/TodoList-DnyULl18-C8Eyy28X.js +0 -36
- package/site/dist/assets/TransactionDetails-e9nesl30-C4MpIHR-.js +0 -109
- package/site/dist/assets/TransactionErrorView-BDBNqA_f-p1T9WVMx.js +0 -178
- package/site/dist/assets/TransferFromWalletScreen-Qvn1Yuno-88IQcRnY.js +0 -31
- package/site/dist/assets/TransferOrBridgeLoadingScreen-Dl1I_iIz-1fDAIxAf.js +0 -6
- package/site/dist/assets/TurnstileWrapper-B7sNddys-Jwy1tJtm.js +0 -1
- package/site/dist/assets/UpdateEmailScreen-DVOhPV0H-Jj2DQW8D.js +0 -1
- package/site/dist/assets/UpdatePhoneScreen-CXRswTNZ-DwYIUBqi.js +0 -1
- package/site/dist/assets/UserLimitReachedScreen-5we2DHn8-D7m70C4b.js +0 -1
- package/site/dist/assets/Value-DTgR824E-BRuIGiec.js +0 -27
- package/site/dist/assets/WalletCards-DH1rqayz-Bgp9Fsgs.js +0 -1
- package/site/dist/assets/WalletIcon-gKf0gTw6.js +0 -1
- package/site/dist/assets/WalletInfoCard-sq_2wgFg-DpNSAGte.js +0 -29
- package/site/dist/assets/WalletInterstitialScreen-Sh7LfsAh-DG-RuO-F.js +0 -1
- package/site/dist/assets/WalletLink-DK5LB5Ha-DHaL350n.js +0 -20
- package/site/dist/assets/WalletOverflowButton-bfCnp-9T-CUyIJFzt.js +0 -1
- package/site/dist/assets/WarningBanner-ZZqCEtZK-2eU4Qo74.js +0 -21
- package/site/dist/assets/__vite-browser-external-CitKSmYk.js +0 -1
- package/site/dist/assets/_esm-B26FZg5Y.js +0 -7
- package/site/dist/assets/_esm-BdeM6pxJ.js +0 -1
- package/site/dist/assets/accounts-D96UKWkC.js +0 -1
- package/site/dist/assets/accounts-DiZ-0VmN.js +0 -1
- package/site/dist/assets/analytics-mkkvFRju-BRBcadka.js +0 -1
- package/site/dist/assets/baseSepolia-DX-qGsik.js +0 -1
- package/site/dist/assets/basic-oIwwSyu4.js +0 -1575
- package/site/dist/assets/capitalizeFirstLetter-DmLYqXsO-DtOXx-2n.js +0 -1
- package/site/dist/assets/ccip-65sIfSPR.js +0 -1
- package/site/dist/assets/ccip-BZvRTL6g.js +0 -7
- package/site/dist/assets/ccip-DA_zG341.js +0 -1
- package/site/dist/assets/chain-DM3oH6Px.js +0 -8
- package/site/dist/assets/check-BPgcwEPP.js +0 -1
- package/site/dist/assets/chevron-down-BSsbXkK-.js +0 -1
- package/site/dist/assets/circle-alert-DWaeLZNj.js +0 -1
- package/site/dist/assets/circle-check-big-Chb1ivw9.js +0 -1
- package/site/dist/assets/circle-x-AV9Cet0R.js +0 -1
- package/site/dist/assets/client-CZG0ndth.js +0 -2
- package/site/dist/assets/client-Dsa7_3V3.js +0 -9
- package/site/dist/assets/coinbase-DCPC2L_R-D3aIgpyd.js +0 -3
- package/site/dist/assets/copy-Ckr0AkL6.js +0 -1
- package/site/dist/assets/core-snws5xwv.js +0 -12
- package/site/dist/assets/createLucideIcon-IPW50ckY.js +0 -1
- package/site/dist/assets/defineChain-CiuCXUZW.js +0 -1
- package/site/dist/assets/dijkstra-Drfl93V4.js +0 -1
- package/site/dist/assets/dist-Cm7pNAtL.js +0 -1
- package/site/dist/assets/dist-CoS6E-3x.js +0 -1
- package/site/dist/assets/dist-Dl07uGq1.js +0 -1
- package/site/dist/assets/dist-DnGANz51.js +0 -16
- package/site/dist/assets/embed.worker-ugGhEqCV.js +0 -1
- package/site/dist/assets/errors-BQ3N-RVt-BLqjTPNR.js +0 -1
- package/site/dist/assets/esm-B5cbIQaz.js +0 -37
- package/site/dist/assets/esm-ByALO6mA.js +0 -1
- package/site/dist/assets/esm-C3DslVJx.js +0 -1
- package/site/dist/assets/esm-Ci1ogKuK.js +0 -1
- package/site/dist/assets/esm-n2lWo7kz.js +0 -1
- package/site/dist/assets/ethers-zTjbodk5-wHhL_BQ1.js +0 -1
- package/site/dist/assets/eventemitter3-CL76jPsW.js +0 -1
- package/site/dist/assets/external-link-D-uehwM2.js +0 -1
- package/site/dist/assets/farcaster-DPlSjvF5-BqTvDXBR.js +0 -1
- package/site/dist/assets/features-DQ0UYy6K.js +0 -2
- package/site/dist/assets/fingerprint-pattern-D8ytA16Q.js +0 -1
- package/site/dist/assets/floating-ui.react-dom-DKWOL9UG.js +0 -1
- package/site/dist/assets/floating-ui.react-xRkl9O3u.js +0 -1
- package/site/dist/assets/formatErc20TokenAmount-BuPk9xcy-BVqOKQif.js +0 -1
- package/site/dist/assets/formatter-CVbp4SlJ.js +0 -1
- package/site/dist/assets/get-entropy-details-for-user-dHRH5Gpi-Dukf7_kJ.js +0 -1
- package/site/dist/assets/getChainName-DjpPdUSc-DUyKDrnp.js +0 -1
- package/site/dist/assets/getErc20Balance-jXNpFf0N-Bb9WM31M.js +0 -1
- package/site/dist/assets/getErc20TokenInfo-BNTrzLMP-KPrdn04K.js +0 -1
- package/site/dist/assets/getFormattedUsdFromLamports-De3U9GlO-Gx4_wxON.js +0 -1
- package/site/dist/assets/getUsdcMintAddress-BVgm9GRo-r2UnDeEy.js +0 -1
- package/site/dist/assets/guards-BIW-GiMJ-CHfXo8XI.js +0 -1
- package/site/dist/assets/hooks.module-BYZGfwDl.js +0 -1
- package/site/dist/assets/hourglass-CPG1HZmf.js +0 -1
- package/site/dist/assets/id-UqEwL2BI-BkKm533U.js +0 -1
- package/site/dist/assets/index-1HYFYA-W.js +0 -8
- package/site/dist/assets/index-BdEw5wyl-ChSJvPZk.js +0 -1
- package/site/dist/assets/index-CWARkn2w-Cezl_uBr.js +0 -61
- package/site/dist/assets/index-DvMddJcd-BatvgC-S.js +0 -12
- package/site/dist/assets/index-YiCw0Y_x-CX5i3Z87.js +0 -437
- package/site/dist/assets/index.browser-B-i-Lj3J.js +0 -1
- package/site/dist/assets/index.browser-BMmUcykv.js +0 -1
- package/site/dist/assets/index.es-BmqyoBEM.js +0 -2
- package/site/dist/assets/index.es-C1v1or--.js +0 -3
- package/site/dist/assets/isPaymentRequestAvailable-Bq1cemEn-By6r0dVB.js +0 -1
- package/site/dist/assets/jsx-runtime-BbDfbRii.js +0 -1
- package/site/dist/assets/landmark-CH6LV6F0.js +0 -1
- package/site/dist/assets/lib-BsS8z8Lj.js +0 -1
- package/site/dist/assets/localBatchGatewayRequest-3kLrX_c7.js +0 -32
- package/site/dist/assets/lock-DcskI4Bb.js +0 -1
- package/site/dist/assets/logger-CsXm3oIv-B0UYpNFI.js +0 -1
- package/site/dist/assets/mail-Bs0r5yOi.js +0 -1
- package/site/dist/assets/modal-context-CwmSeFcv-DruX9J1E.js +0 -1
- package/site/dist/assets/native-BKj27wfc.js +0 -1
- package/site/dist/assets/ofetch.CWycOUEr-CHp-crOQ.js +0 -1
- package/site/dist/assets/parseAbi-Csg-8t59.js +0 -2
- package/site/dist/assets/parseAbiParameters-BWbIMYe4.js +0 -1
- package/site/dist/assets/parseEther-VjhVo3dd.js +0 -1
- package/site/dist/assets/pkce-DXF0yKjP-ChQhE0st.js +0 -1
- package/site/dist/assets/preload-helper-uBIymjUX.js +0 -1
- package/site/dist/assets/privy-context-81KmsBw2-CjWGzyg7.js +0 -2
- package/site/dist/assets/property-DuZ9DLP4.js +0 -3
- package/site/dist/assets/react-DCXkXSrv.js +0 -1
- package/site/dist/assets/react-DQnMl2Xv.js +0 -1
- package/site/dist/assets/react-DrJ0MmMO.js +0 -1
- package/site/dist/assets/react-auth-sHnipzbS.js +0 -1
- package/site/dist/assets/react-dom-5dW7aKoP.js +0 -1
- package/site/dist/assets/reservoir-x-nGuZkT-BMX127i6.js +0 -1
- package/site/dist/assets/roles-32M1l9jI.js +0 -1
- package/site/dist/assets/rolldown-runtime-BcKkbAw3.js +0 -1
- package/site/dist/assets/safe-url-D7SRPu33-CkMedGro.js +0 -1
- package/site/dist/assets/secp256k1-C4nzcPo-.js +0 -1
- package/site/dist/assets/secp256k1-D92aGNnU.js +0 -1
- package/site/dist/assets/secp256k1-DmbwyFau.js +0 -1
- package/site/dist/assets/secp256k1-_MleGpqL.js +0 -1
- package/site/dist/assets/secp256k1-xl2og-wO.js +0 -1
- package/site/dist/assets/serializeAuthorizationList-CX8hGL56.js +0 -1
- package/site/dist/assets/serializeSignature-DfxkPnu-.js +0 -2
- package/site/dist/assets/sha2-BU_QyRTx.js +0 -1
- package/site/dist/assets/shared-DRZUmnL5-xqAUARWo.js +0 -193
- package/site/dist/assets/shared-FM0rljBt--Avg6q2R.js +0 -21
- package/site/dist/assets/shouldProceedtoEmbeddedWalletCreationFlow-B3vyavrh-BK_FBkaE.js +0 -1
- package/site/dist/assets/simulateTransaction-CfuOrae4-64lWYJAL.js +0 -1
- package/site/dist/assets/smartphone-CcEZ-XAy.js +0 -1
- package/site/dist/assets/src-BBjkfi-Q.js +0 -1
- package/site/dist/assets/storage-Ufl800Ne-D0bZBw-H.js +0 -9
- package/site/dist/assets/stringify-BlDm7tuc.js +0 -21
- package/site/dist/assets/stripe.esm-CZRDpc-N.js +0 -2
- package/site/dist/assets/styles-BsotlekN-CXEB4Ud9.js +0 -9
- package/site/dist/assets/styles-Cm9H63WO-Br4QtzUL.js +0 -92
- package/site/dist/assets/styles-DVyDvTdj-BTABn2K8.js +0 -74
- package/site/dist/assets/styles-hslXy6xG-D-49b1rk.js +0 -164
- package/site/dist/assets/telegram-B-JqnkqZ-RBoY3PLx.js +0 -1
- package/site/dist/assets/to-ui-error-DWe-qwS3-Cx2bk1kZ.js +0 -4
- package/site/dist/assets/toViemAccount-B5iDGq1b-Ba8L7zed.js +0 -2
- package/site/dist/assets/transaction-BNTP-bFm-M5tJx8vY.js +0 -1
- package/site/dist/assets/transfer-6YztDh-t-BVQkTvG-.js +0 -1
- package/site/dist/assets/transformers.web-CVP3pJOS.js +0 -40
- package/site/dist/assets/transformers.web-D8W1u_I2.js +0 -49
- package/site/dist/assets/triangle-alert-CWjYH75H.js +0 -1
- package/site/dist/assets/twitch-5IOe4sIQ-lDtgk0os.js +0 -1
- package/site/dist/assets/types-4CuOD23i.js +0 -1
- package/site/dist/assets/use-headless-crypto-deposit-Yn-QRLB3-LUIVFBSd.js +0 -1
- package/site/dist/assets/use-unlink-wallet-BKK4_5Ur-CC2pq27z.js +0 -1
- package/site/dist/assets/useActiveWallet-B-yZYGc6-D7Ik-LxJ.js +0 -123
- package/site/dist/assets/useGetSolPrice-x7gfUIHJ-D1hmQfpA.js +0 -1
- package/site/dist/assets/useGetTokenPrice-CaoUkb79-ZnbuJ-vP.js +0 -1
- package/site/dist/assets/useI18n-C-5n_noF-BcqC76yj.js +0 -1
- package/site/dist/assets/useWalletBalance-CZnP5f_f-Dw2GIJ4g.js +0 -1
- package/site/dist/assets/useWallets-X1ndvJ_U-DRjz7uYD.js +0 -1
- package/site/dist/assets/utils-BkR7EQjg.js +0 -1
- package/site/dist/assets/utils-DJhBNOZA.js +0 -1
- package/site/dist/assets/utils-DdckVfQr.js +0 -1
- package/site/dist/assets/w3m-modal-BeVrBOIf.js +0 -1174
- package/site/dist/assets/wallet-Bn85Sg2W.js +0 -1
- package/site/dist/assets/wallet-Bnzeiqed.js +0 -2
- package/site/dist/assets/wallet-connect-BvJtUsDt-Y03hhqFN.js +0 -1
- package/site/dist/assets/walletconnect-registry-xxG8XLCb-D1SSFvMp.js +0 -1
- package/site/dist/assets/walletconnect-v2-3frQFwbg-CrtLXofr.js +0 -12
- package/site/dist/assets/wui-ux-by-reown-D34ILNLS.js +0 -1147
- package/site/dist/assets/x-rlSp9U7W.js +0 -1
- package/src/discover/explore.js +0 -271
- package/src/market/settle.js +0 -165
- package/src/market/terms.js +0 -200
- package/src/publish/cli.js +0 -336
- package/src/publish/envelope.js +0 -185
- package/src/publish/manifest.js +0 -142
package/src/taste/steam.js
CHANGED
|
@@ -237,7 +237,7 @@ export const summarize = (seed) =>
|
|
|
237
237
|
`${seed.hours} hours · ${seed.likes.length} liked, ${seed.dislikes.length} bounced off`;
|
|
238
238
|
|
|
239
239
|
// ── self-check: `node src/taste/steam.js` ─────────────────────────────────────
|
|
240
|
-
if (
|
|
240
|
+
if (import.meta.url === `file://${globalThis.process?.argv?.[1]}` && process.argv[1].endsWith("/steam.js")) {
|
|
241
241
|
// A localconfig.vdf, cut down but structurally exact — including the mixed
|
|
242
242
|
// casing of the Valve/valve segment that defeats a hardcoded path.
|
|
243
243
|
const VDF = `
|
package/src/taste/taste-doc.js
CHANGED
|
@@ -30,6 +30,7 @@
|
|
|
30
30
|
// they like drama. Subtracting the corpus mean from both sides asks the only
|
|
31
31
|
// question worth asking: of the ways this catalogue varies, which ones are you?
|
|
32
32
|
import { values } from "../core/roles.js";
|
|
33
|
+
import { EMBED_MODEL, EMBED_DIM } from "../core/embed.js";
|
|
33
34
|
|
|
34
35
|
/** Below this a term's "meaning" is a handful of rows, and on a small enough
|
|
35
36
|
* handful it is one row wearing a word — which is both noise and, on a corpus
|
|
@@ -223,7 +224,7 @@ export function tasteDoc({ t = null, catalogues = [], instructions = "", now = n
|
|
|
223
224
|
"it down is for: a taste you cannot read is a taste you cannot correct.", "",
|
|
224
225
|
"## For an agent reading this", "",
|
|
225
226
|
"- Rank candidates by cosine to `q`, minus 0.6 times the positive part of cosine to `no`.",
|
|
226
|
-
|
|
227
|
+
`- Every corpus on this network embeds with \`${EMBED_MODEL}\` truncated to ${EMBED_DIM}`,
|
|
227
228
|
" dimensions, so `q` is comparable against a catalogue this reader has never opened.",
|
|
228
229
|
"- Diversify the result (MMR, lambda 0.7). Six episodes of one series is not a recommendation.",
|
|
229
230
|
"- Do not re-recommend anything under *What I named*.",
|
|
@@ -236,7 +237,7 @@ export function tasteDoc({ t = null, catalogues = [], instructions = "", now = n
|
|
|
236
237
|
}
|
|
237
238
|
|
|
238
239
|
// ── self-check: `node src/taste/taste-doc.js` ─────────────────────────────────
|
|
239
|
-
if (
|
|
240
|
+
if (import.meta.url === `file://${globalThis.process?.argv?.[1]}` && process.argv[1].endsWith("/taste-doc.js")) {
|
|
240
241
|
const { taste } = await import("./taste.js");
|
|
241
242
|
|
|
242
243
|
// A catalogue with a KNOWN shape: two axes, and a tag at each end of each.
|
|
@@ -313,7 +314,7 @@ if (typeof process !== "undefined" && import.meta.url === `file://${process.argv
|
|
|
313
314
|
if (!md.startsWith("# taste.md")) throw new Error("it is a document, and it says so first");
|
|
314
315
|
if (md.indexOf("No trailers. Ever.") > md.indexOf("What I am drawn to")) throw new Error("what the person wrote comes before what the machine inferred");
|
|
315
316
|
if (!md.includes("**silent**") || md.includes("**newsreel**")) throw new Error("the prose must follow the vectors");
|
|
316
|
-
if (!md.includes(
|
|
317
|
+
if (!md.includes(EMBED_MODEL)) throw new Error("an agent reading this must be told what space q lives in");
|
|
317
318
|
for (const h of ["## Standing instructions", "## What I am drawn to", "## What I pass on", "## Where I am heading", "## What I named", "## For an agent reading this"]) {
|
|
318
319
|
if (!md.includes(h)) throw new Error(`missing section: ${h}`);
|
|
319
320
|
}
|
package/src/taste/taste.js
CHANGED
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
// no — the kernel's pass centroid (where you are NOT going)
|
|
30
30
|
|
|
31
31
|
import { emptyKernel, onLike, onPass, queryVector } from "@fangorn-network/markov";
|
|
32
|
-
import { packVec, unpackVec } from "../core/embed.js";
|
|
32
|
+
import { SPACE, packVec, unpackVec } from "../core/embed.js";
|
|
33
33
|
import { cosine, diversify, norm } from "../core/rank.js";
|
|
34
34
|
|
|
35
35
|
const unit = (v) => { if (!v) return null; const n = norm(v); const o = new Float32Array(v.length); for (let i = 0; i < v.length; i++) o[i] = v[i] / n; return o; };
|
|
@@ -188,7 +188,7 @@ export function discover(rows, likes = [], dislikes = [], { limit = 20, seed = 1
|
|
|
188
188
|
* rather than a profile held about them.
|
|
189
189
|
*/
|
|
190
190
|
export const exportTaste = (t) => t && ({
|
|
191
|
-
v: 1, model:
|
|
191
|
+
v: 1, model: SPACE, drift: t.drift, n: t.n,
|
|
192
192
|
q: packVec(Array.from(t.q)),
|
|
193
193
|
mu: packVec(Array.from(t.mu)),
|
|
194
194
|
// The heading, not just the position. `q` is `mu + drift·v`, so an export
|
|
@@ -247,7 +247,7 @@ export function withProvenance(t, { carried = null, likes = [], dislikes = [] }
|
|
|
247
247
|
}
|
|
248
248
|
|
|
249
249
|
// ── self-check: `node src/taste/taste.js` ─────────────────────────────────────
|
|
250
|
-
if (
|
|
250
|
+
if (import.meta.url === `file://${globalThis.process?.argv?.[1]}` && process.argv[1].endsWith("/taste.js")) {
|
|
251
251
|
|
|
252
252
|
// recommend() returns {row, score} — NOT {row, s}. kingsfoil's agent read
|
|
253
253
|
// h.s and reported every recommendation with score: undefined.
|
package/src/taste/vault.js
CHANGED
|
@@ -35,6 +35,8 @@
|
|
|
35
35
|
// somewhere to put the version, and there is no second reader to coordinate with
|
|
36
36
|
// yet. Add a `keyEpoch` to the vertex when one exists.
|
|
37
37
|
|
|
38
|
+
import { SPACE } from "../core/embed.js";
|
|
39
|
+
|
|
38
40
|
const ENC = new TextEncoder();
|
|
39
41
|
const DEC = new TextDecoder();
|
|
40
42
|
|
|
@@ -94,7 +96,7 @@ export async function open(key, blob) {
|
|
|
94
96
|
export const TASTE_ID = "self/taste";
|
|
95
97
|
export const tasteVertex = (blob) => ({
|
|
96
98
|
id: TASTE_ID, tag: "taste",
|
|
97
|
-
payload: { kind: "taste", model:
|
|
99
|
+
payload: { kind: "taste", model: SPACE, enc: `vault-v${VAULT_VERSION}`, blob: JSON.stringify(blob) },
|
|
98
100
|
});
|
|
99
101
|
|
|
100
102
|
/** Pull the sealed blob back out of whatever `fangorn read` handed over. */
|
|
@@ -105,7 +107,7 @@ export function tasteFrom(vertices = []) {
|
|
|
105
107
|
}
|
|
106
108
|
|
|
107
109
|
// ── self-check: `node src/taste/vault.js` ───────────────────────────────────
|
|
108
|
-
if (
|
|
110
|
+
if (import.meta.url === `file://${globalThis.process?.argv?.[1]}` && process.argv[1].endsWith("/vault.js")) {
|
|
109
111
|
const { privateKeyToAccount } = await import("viem/accounts");
|
|
110
112
|
const KEY_A = `0x${"11".repeat(32)}`, KEY_B = `0x${"22".repeat(32)}`;
|
|
111
113
|
// A "machine": a fresh client over the same key, holding no state at all.
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# A Fangorn app
|
|
2
|
+
|
|
3
|
+
This repo holds the app's recipe, not its data: what a record is (`app.json`), what a good
|
|
4
|
+
answer looks like (`eval/`), and the Worker that serves it (`wrangler.json`). It can be
|
|
5
|
+
public. The data lives on chain and IPFS, committed by its publishers; the Worker
|
|
6
|
+
indexes it every 5 minutes, and serves the site, the view, `/mcp` and the agent card.
|
|
7
|
+
|
|
8
|
+
## Deploy
|
|
9
|
+
|
|
10
|
+
[](https://deploy.workers.cloudflare.com/?url=https://github.com/fangorn-network/westmarch/tree/main/template)
|
|
11
|
+
|
|
12
|
+
1. Press the button. Name the Worker after the app (`my-app`) and its R2 bucket
|
|
13
|
+
`my-app-view`. Cloudflare copies this repo into your GitHub, makes the bucket and
|
|
14
|
+
deploys; every push to `main` deploys again.
|
|
15
|
+
2. At fangorn.network, give the app its Worker's URL. Your wallet creates the app's repo,
|
|
16
|
+
`<your wallet>:my-app`, and binds its card there.
|
|
17
|
+
|
|
18
|
+
An app name with a dot or an underscore can't be a Worker name.
|
|
19
|
+
|
|
20
|
+
`npm run build` (`westmarch build`) is what Cloudflare runs: it builds the site and writes
|
|
21
|
+
the app's config into `wrangler.json`, without signing or deploying anything.
|
|
22
|
+
|
|
23
|
+
## Make it yours
|
|
24
|
+
|
|
25
|
+
Edit `app.json`: `name`, `description`, and the type: rename `my-app.item.v1` and map your
|
|
26
|
+
fields in `role_map`. Push, and the Worker follows.
|
|
27
|
+
|
|
28
|
+
## Publish data
|
|
29
|
+
|
|
30
|
+
Any wallet commits records of its type, from anywhere:
|
|
31
|
+
|
|
32
|
+
```sh
|
|
33
|
+
echo '{"records":[{"id":"first","type":"my-app.item.v1","payload":{"id":"first","title":"Hello","text":"The first item.","tags":["demo"]}}]}' > items.json
|
|
34
|
+
fangorn repo init items
|
|
35
|
+
fangorn commit items.json -m "first items"
|
|
36
|
+
fangorn push
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
The view picks it up within 5 minutes at `<url>/view`. A source that crawls something
|
|
40
|
+
on a schedule goes in `app.json` `sources`, and publishes with
|
|
41
|
+
`npx westmarch-ship app.json --no-deploy` (the push to `main` deploys; without the flag it
|
|
42
|
+
would deploy a second copy over this Worker). See westmarch's docs.
|
|
43
|
+
|
|
44
|
+
## Keep it good
|
|
45
|
+
|
|
46
|
+
Write `eval/goals.md` (who it serves) and `eval/golden.jsonl` (one check per line:
|
|
47
|
+
`{"id","q","expect","min","goal"}`), then grade the live view:
|
|
48
|
+
`npx westmarch-eval <url>/view`.
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"app": "my-app",
|
|
3
|
+
"name": "my-app",
|
|
4
|
+
"description": "One sentence: what is in here, and who it is for.",
|
|
5
|
+
"network": "baseSepolia",
|
|
6
|
+
"site": {
|
|
7
|
+
"project": "my-app",
|
|
8
|
+
"examples": []
|
|
9
|
+
},
|
|
10
|
+
"tags": [],
|
|
11
|
+
"types": {
|
|
12
|
+
"my-app.item.v1": {
|
|
13
|
+
"description": "One item: what a record is, in the words a searcher would use.",
|
|
14
|
+
"role_map": {
|
|
15
|
+
"identity": "id",
|
|
16
|
+
"title": "title",
|
|
17
|
+
"tags": ["tags"],
|
|
18
|
+
"text": ["text"]
|
|
19
|
+
},
|
|
20
|
+
"presentation": {
|
|
21
|
+
"types": { "my-app.item.v1": { "singular": "item", "plural": "items" } },
|
|
22
|
+
"facets": ["tags"]
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
"sources": []
|
|
27
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# Goals
|
|
2
|
+
|
|
3
|
+
One section per kind of person this app serves. Each check in golden.jsonl names one with `goal`.
|
|
4
|
+
|
|
5
|
+
## <goal-id>: who finds what
|
|
6
|
+
- **They ask:** two or three real questions, in their words.
|
|
7
|
+
- **Failure looks like:** what a wrong or missing answer would be.
|
|
File without changes
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"private": true,
|
|
3
|
+
"type": "module",
|
|
4
|
+
"scripts": {
|
|
5
|
+
"build": "westmarch build",
|
|
6
|
+
"deploy": "wrangler deploy"
|
|
7
|
+
},
|
|
8
|
+
"dependencies": {
|
|
9
|
+
"@fangorn-network/westmarch": "0.1.1",
|
|
10
|
+
"@huggingface/transformers": "^4.3.1",
|
|
11
|
+
"wrangler": "^4.83.0"
|
|
12
|
+
}
|
|
13
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "my-app",
|
|
3
|
+
"main": "node_modules/@fangorn-network/westmarch/site/worker.js",
|
|
4
|
+
"compatibility_date": "2025-09-15",
|
|
5
|
+
"compatibility_flags": ["nodejs_compat"],
|
|
6
|
+
"assets": { "directory": ".ship/site", "binding": "ASSETS" },
|
|
7
|
+
"r2_buckets": [{ "binding": "VIEW", "bucket_name": "my-app-view" }],
|
|
8
|
+
"ai": { "binding": "AI" },
|
|
9
|
+
"triggers": { "crons": ["*/5 * * * *"] },
|
|
10
|
+
"alias": { "@huggingface/transformers": "./node_modules/@fangorn-network/westmarch/site/no-model.js" },
|
|
11
|
+
"vars": {}
|
|
12
|
+
}
|
package/plugin/scripts/fx.mjs
DELETED
|
@@ -1,268 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
// The Fangorn app index, headless. One command per verb, JSON on stdout.
|
|
3
|
-
//
|
|
4
|
-
// WHY THERE IS NO MCP SERVER HERE
|
|
5
|
-
// -------------------------------
|
|
6
|
-
// An index that POINTS AT apps rather than hosting them needs no runtime of its
|
|
7
|
-
// own. Every verb below is a function `@fangorn/westmarch` already exports, and
|
|
8
|
-
// the agent's shell is the transport. Nobody has to stand up a server to be in
|
|
9
|
-
// the index — a publisher bakes a view, and that is the whole obligation.
|
|
10
|
-
//
|
|
11
|
-
// WHY THIS IS A PLUGIN AND NOT A PAGE
|
|
12
|
-
// -----------------------------------
|
|
13
|
-
// One thing here is not stateless: the taste kernel. It lives in
|
|
14
|
-
// ~/.fangorn/taste.json — on the filesystem, between the human and the agent —
|
|
15
|
-
// because it has to outlive any one app, any one tab and any one ORIGIN.
|
|
16
|
-
// localStorage cannot do that: a taste learned in fangorn.tv is invisible to the
|
|
17
|
-
// next app by construction, which is the whole reason apps keep rebuilding it.
|
|
18
|
-
// A file the agent can read is the shortest thing that carries it across.
|
|
19
|
-
//
|
|
20
|
-
// ponytail: a plaintext file, no wallet, no sync. `src/taste/vault.js` is the
|
|
21
|
-
// upgrade path — same object, sealed to a signature, kept in the graph — and it
|
|
22
|
-
// is worth doing the day the kernel needs to travel between machines, not now.
|
|
23
|
-
// ponytail: every command re-fetches its view. Fine at 917 rows, ~seconds at
|
|
24
|
-
// 42k; add a disk cache keyed by view URL when a big corpus makes it hurt.
|
|
25
|
-
|
|
26
|
-
import { homedir } from "node:os";
|
|
27
|
-
import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
28
|
-
import { join } from "node:path";
|
|
29
|
-
import { configure, domainManifests, loadShard, trimView } from "../../src/core/shard.js";
|
|
30
|
-
import { findCorpora, sourcesFromChain } from "../../src/discover/directory.js";
|
|
31
|
-
import { linkOf, rolesFrom, textOf, titleOf } from "../../src/core/roles.js";
|
|
32
|
-
import { exportTaste, recommend, taste } from "../../src/taste/taste.js";
|
|
33
|
-
import { EMBED_MODEL, embedQuery, packVec, unpackVec } from "../../src/core/embed.js";
|
|
34
|
-
import { browse, describe, facet, getRow, neighbors, search } from "../../src/agent/tools.js";
|
|
35
|
-
|
|
36
|
-
const HOME = process.env.FANGORN_HOME ?? join(homedir(), ".fangorn");
|
|
37
|
-
const TASTE = join(HOME, "taste.json");
|
|
38
|
-
|
|
39
|
-
// ── the kernel on disk ───────────────────────────────────────────────────────
|
|
40
|
-
const store = () => { try { return JSON.parse(readFileSync(TASTE, "utf8")); } catch { return { model: EMBED_MODEL, likes: [], dislikes: [] }; } };
|
|
41
|
-
const save = (s) => { mkdirSync(HOME, { recursive: true }); writeFileSync(TASTE, JSON.stringify(s, null, 1)); };
|
|
42
|
-
/** Picks are stored PACKED (base64 int8, the shard encoding) and unpacked here.
|
|
43
|
-
* Storing the picks rather than only the derived vector is what keeps the
|
|
44
|
-
* kernel correctable: you can read what it was built from and drop one. */
|
|
45
|
-
const picks = (l = []) => l.map((p) => ({ ...p, vector: unpackVec(p.v) })).filter((p) => p.vector);
|
|
46
|
-
const kernel = (s = store()) => taste(picks(s.likes), picks(s.dislikes));
|
|
47
|
-
|
|
48
|
-
// ── args ─────────────────────────────────────────────────────────────────────
|
|
49
|
-
const argv = process.argv.slice(2);
|
|
50
|
-
const [cmd, ...rest] = argv;
|
|
51
|
-
const pos = rest.filter((a) => !a.startsWith("--"));
|
|
52
|
-
const flag = (n, d) => { const a = rest.find((x) => x.startsWith(`--${n}=`)); return a === undefined ? d : a.slice(n.length + 3); };
|
|
53
|
-
const num = (n, d) => { const v = flag(n); return v === undefined ? d : Number(v); };
|
|
54
|
-
const pairs = (s) => s ? Object.fromEntries(String(s).split(",").map((p) => p.split("=").map((x) => x.trim()))) : undefined;
|
|
55
|
-
const list = (s) => String(s ?? "").split(",").map((x) => x.trim()).filter(Boolean);
|
|
56
|
-
const out = (o) => console.log(JSON.stringify(o, null, 1));
|
|
57
|
-
const die = (m) => { console.error(m); process.exit(1); };
|
|
58
|
-
|
|
59
|
-
// ── a view, loaded ───────────────────────────────────────────────────────────
|
|
60
|
-
let roles = rolesFrom([], []);
|
|
61
|
-
async function load(view) {
|
|
62
|
-
if (!view) die("need a view URL");
|
|
63
|
-
const base = trimView(view);
|
|
64
|
-
configure({
|
|
65
|
-
resolveView: () => base,
|
|
66
|
-
// Roles must be ready BEFORE the first row is parsed: rowText runs during
|
|
67
|
-
// parsing, so deriving them afterwards leaves every row with empty text
|
|
68
|
-
// and lexical search silently matching nothing.
|
|
69
|
-
onManifests: (ms) => { roles = rolesFrom(ms); },
|
|
70
|
-
rowText: (f) => textOf(f, roles),
|
|
71
|
-
});
|
|
72
|
-
const rows = await loadShard(base);
|
|
73
|
-
roles = rolesFrom(domainManifests(), rows);
|
|
74
|
-
let model = null;
|
|
75
|
-
try { model = (await (await fetch(`${base}/cdn/catalog`)).json()).embedding_model ?? null; } catch { /* unranked, not fatal */ }
|
|
76
|
-
return { rows, roles, base, model };
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
/** A query vector, or null with the reason. Never throws: every verb here
|
|
80
|
-
* degrades to lexical and SAYS so rather than returning confident nonsense. */
|
|
81
|
-
const qvOf = async (q) => { try { return { qv: await embedQuery(q), why: null }; } catch (e) { return { qv: null, why: e?.message ?? String(e) }; } };
|
|
82
|
-
|
|
83
|
-
/** The corpus and the kernel must share an embedding space or cosine between
|
|
84
|
-
* them is noise that still looks like a score. */
|
|
85
|
-
const mismatch = (model, s) => model && s.model && model !== s.model
|
|
86
|
-
? `taste was built with ${s.model}, this corpus is ${model} — scores would be noise` : null;
|
|
87
|
-
|
|
88
|
-
const sources = async () => {
|
|
89
|
-
const f = flag("sources"); if (f) return list(f);
|
|
90
|
-
if (process.env.FANGORN_SOURCES) return list(process.env.FANGORN_SOURCES);
|
|
91
|
-
try { return JSON.parse(readFileSync(join(HOME, "sources.json"), "utf8")); } catch { /* none pinned */ }
|
|
92
|
-
return chainSources();
|
|
93
|
-
};
|
|
94
|
-
|
|
95
|
-
// Every app bound on chain, the scan fangorn-mcp's list-apps runs. From the
|
|
96
|
-
// current AppRegistry's first event on Arbitrum Sepolia; --from-block overrides.
|
|
97
|
-
async function chainSources() {
|
|
98
|
-
// The SDK scans 1,000 blocks per log request by default, which on the public
|
|
99
|
-
// RPC takes minutes; fangorn-mcp's install line sets the same window.
|
|
100
|
-
process.env.FANGORN_LOG_WINDOW ??= "100000";
|
|
101
|
-
const [{ Fangorn, FangornConfig }, { generatePrivateKey }] = await Promise.all([
|
|
102
|
-
import("@fangorn-network/sdk"), import("viem/accounts")]);
|
|
103
|
-
const fangorn = Fangorn.create({ privateKey: generatePrivateKey(), config: FangornConfig }); // reads only
|
|
104
|
-
const { sources } = await sourcesFromChain(fangorn, { fromBlock: BigInt(flag("from-block", "311637349")) });
|
|
105
|
-
return sources;
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
// ── verbs ────────────────────────────────────────────────────────────────────
|
|
109
|
-
switch (cmd) {
|
|
110
|
-
|
|
111
|
-
// WHICH app has this. Downloads no corpus — coverage centroids only, ~4KB each.
|
|
112
|
-
case "find": {
|
|
113
|
-
const src = await sources();
|
|
114
|
-
if (!src.length) die("no apps found on chain; pass --sources=a,b or write ~/.fangorn/sources.json");
|
|
115
|
-
out(await findCorpora(pos.join(" "), { sources: src, embed: embedQuery, model: EMBED_MODEL, limit: num("limit", 10) }));
|
|
116
|
-
break;
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
case "describe": {
|
|
120
|
-
const { rows, roles: r, model } = await load(pos[0]);
|
|
121
|
-
out({
|
|
122
|
-
...describe(rows), model,
|
|
123
|
-
shape: r.declared ? "declared" : "sniffed",
|
|
124
|
-
title: r.title, subtitle: r.subtitle, tags: r.tags, text: r.text,
|
|
125
|
-
entityTypes: r.entityTypes, gates: r.gates,
|
|
126
|
-
// Where the reader goes next. The index's job ends here.
|
|
127
|
-
launch: r.launch, externalUrl: r.externalUrl, actions: r.actions,
|
|
128
|
-
});
|
|
129
|
-
break;
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
case "browse": {
|
|
133
|
-
const { rows, roles: r } = await load(pos[0]);
|
|
134
|
-
out(browse(rows, r, { type: flag("type"), where: pairs(flag("where")), sort: flag("sort"),
|
|
135
|
-
desc: flag("asc") === undefined, limit: num("limit", 20), offset: num("offset", 0), fields: list(flag("fields")) }));
|
|
136
|
-
break;
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
case "search": {
|
|
140
|
-
const { rows, roles: r } = await load(pos[0]);
|
|
141
|
-
const q = pos.slice(1).join(" ");
|
|
142
|
-
const { qv, why } = await qvOf(q);
|
|
143
|
-
out({ query: q, mode: qv ? "semantic where rows have vectors" : "lexical", ...(why ? { why } : {}),
|
|
144
|
-
hits: search(rows, q, r, { qv, limit: num("limit", 10), where: pairs(flag("where")), fields: list(flag("fields")) }) });
|
|
145
|
-
break;
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
case "facet": {
|
|
149
|
-
const { rows } = await load(pos[0]);
|
|
150
|
-
out(facet(rows, pos[1], { limit: num("limit", 20), where: pairs(flag("where")) }));
|
|
151
|
-
break;
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
case "row": {
|
|
155
|
-
const { rows, roles: r } = await load(pos[0]);
|
|
156
|
-
const g = getRow(rows, pos[1], r);
|
|
157
|
-
out(g ? { ...g, url: linkOf(rows.find((x) => x.id === g.id) ?? {}, r) } : null);
|
|
158
|
-
break;
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
case "similar": {
|
|
162
|
-
const { rows, roles: r } = await load(pos[0]);
|
|
163
|
-
out(neighbors(rows, pos[1], r, { limit: num("limit", 10), fields: list(flag("fields")) }));
|
|
164
|
-
break;
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
// ── the kernel ───────────────────────────────────────────────────────────────
|
|
168
|
-
case "like": case "dislike": {
|
|
169
|
-
const { rows, roles: r, base, model } = await load(pos[0]);
|
|
170
|
-
const s = store();
|
|
171
|
-
const into = cmd === "like" ? s.likes : s.dislikes;
|
|
172
|
-
const added = [];
|
|
173
|
-
for (const id of pos.slice(1)) {
|
|
174
|
-
const row = rows.find((x) => x.id === id);
|
|
175
|
-
if (!row) { console.error(`no row ${id}`); continue; }
|
|
176
|
-
if (!row.vector) { console.error(`${id} has no vector — nothing to learn from`); continue; }
|
|
177
|
-
// Newest last: taste() weights by recency, so order in the file is signal.
|
|
178
|
-
const at = into.findIndex((p) => p.id === id);
|
|
179
|
-
if (at >= 0) into.splice(at, 1);
|
|
180
|
-
into.push({ id, title: titleOf(row, r), view: base, at: new Date().toISOString().slice(0, 10), v: packVec(Array.from(row.vector)) });
|
|
181
|
-
added.push(id);
|
|
182
|
-
}
|
|
183
|
-
s.model ??= model ?? EMBED_MODEL;
|
|
184
|
-
save(s);
|
|
185
|
-
const t = kernel(s);
|
|
186
|
-
out({ added, likes: s.likes.length, dislikes: s.dislikes.length, taste: t && exportTaste(t), file: TASTE });
|
|
187
|
-
break;
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
case "forget": {
|
|
191
|
-
const s = store();
|
|
192
|
-
const drop = new Set(pos);
|
|
193
|
-
const before = s.likes.length + s.dislikes.length;
|
|
194
|
-
s.likes = s.likes.filter((p) => !drop.has(p.id));
|
|
195
|
-
s.dislikes = s.dislikes.filter((p) => !drop.has(p.id));
|
|
196
|
-
save(s);
|
|
197
|
-
out({ removed: before - s.likes.length - s.dislikes.length, likes: s.likes.length, dislikes: s.dislikes.length });
|
|
198
|
-
break;
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
case "taste": {
|
|
202
|
-
const s = store();
|
|
203
|
-
const t = kernel(s);
|
|
204
|
-
out(t ? { model: s.model, n: t.n, from: t.from, rejected: t.rejected, drift: t.drift,
|
|
205
|
-
// Where each pick was learned. A kernel built in one publisher's
|
|
206
|
-
// corpus is meant to be pointed at another's — this is the record
|
|
207
|
-
// of whether it actually has been.
|
|
208
|
-
views: [...new Set([...s.likes, ...s.dislikes].map((p) => p.view))],
|
|
209
|
-
export: exportTaste(t), file: TASTE }
|
|
210
|
-
: { n: 0, file: TASTE, note: "nothing liked yet — `fx like <view> <id>`" });
|
|
211
|
-
break;
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
// The headline: rank a corpus by a taste learned somewhere else entirely.
|
|
215
|
-
case "recommend": {
|
|
216
|
-
const { rows, roles: r, model } = await load(pos[0]);
|
|
217
|
-
const s = store();
|
|
218
|
-
const t = kernel(s);
|
|
219
|
-
if (!t) die("no taste yet — `fx like <view> <id>` first");
|
|
220
|
-
const warn = mismatch(model, s);
|
|
221
|
-
if (warn) die(warn);
|
|
222
|
-
const seen = new Set([...s.likes, ...s.dislikes].map((p) => p.id));
|
|
223
|
-
out({ from: t.from, against: pos[0],
|
|
224
|
-
hits: recommend(rows, t, { limit: num("limit", 10), exclude: seen })
|
|
225
|
-
.map(({ row, score }) => ({ id: row.id, title: titleOf(row, r), score, url: linkOf(row, r) })) });
|
|
226
|
-
break;
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
// ── the handoff. The index points; the app does the work. ────────────────────
|
|
230
|
-
case "launch": {
|
|
231
|
-
const { rows, roles: r } = await load(pos[0]);
|
|
232
|
-
const id = flag("row");
|
|
233
|
-
if (id) {
|
|
234
|
-
const row = rows.find((x) => x.id === id);
|
|
235
|
-
if (!row) die(`no row ${id}`);
|
|
236
|
-
out({ url: linkOf(row, r), title: titleOf(row, r) });
|
|
237
|
-
break;
|
|
238
|
-
}
|
|
239
|
-
if (!r.launch) die("this corpus declares no presentation.launch — nowhere to hand off to");
|
|
240
|
-
const t = kernel();
|
|
241
|
-
const fill = { taste: t ? JSON.stringify(exportTaste(t)) : "", q: pos.slice(1).join(" ") };
|
|
242
|
-
const url = String(r.launch).replace(/\{(\w+)\}/g, (_, k) => encodeURIComponent(fill[k] ?? ""));
|
|
243
|
-
const u = new URL(url);
|
|
244
|
-
if (u.protocol !== "https:" && u.protocol !== "http:") die(`refusing a ${u.protocol} launch URL`);
|
|
245
|
-
// The kernel travels in the URL because that is the only channel a page on
|
|
246
|
-
// someone else's origin can receive it on. It is the app's copy from here.
|
|
247
|
-
out({ url: u.toString(), carries: t ? { n: t.n, from: t.from } : null });
|
|
248
|
-
break;
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
default:
|
|
252
|
-
console.log(`fx <verb>
|
|
253
|
-
|
|
254
|
-
find <query> [--sources=a,b|--from-block=N] which app has this. No corpus downloaded.
|
|
255
|
-
describe <view> rows, field coverage, roles, where it hands off
|
|
256
|
-
browse <view> [--type= --where=k=v --sort= --asc --limit= --offset=]
|
|
257
|
-
search <view> <query> [--where=k=v --limit=] semantic where rows have vectors, else lexical
|
|
258
|
-
facet <view> <field> [--where=k=v --limit=] count a field's values
|
|
259
|
-
row <view> <id> one record, whole
|
|
260
|
-
similar <view> <id> [--limit=] nearest by vector
|
|
261
|
-
|
|
262
|
-
like|dislike <view> <id...> teach the kernel. Writes ${TASTE}
|
|
263
|
-
forget <id...> drop picks from it
|
|
264
|
-
taste what it is, and what it was built from
|
|
265
|
-
recommend <view> [--limit=] rank ANY corpus by it
|
|
266
|
-
|
|
267
|
-
launch <view> [query] | launch <view> --row=<id> the handoff URL, carrying the kernel`);
|
|
268
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{$ as e,D as t}from"./privy-context-81KmsBw2-CjWGzyg7.js";import{t as n}from"./jsx-runtime-BbDfbRii.js";import{t as r}from"./createLucideIcon-IPW50ckY.js";import{n as i}from"./modal-context-CwmSeFcv-DruX9J1E.js";import{t as a}from"./ScreenLayout-OwaQQcxH-CrQM6kvA.js";var o=r(`circle-question-mark`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3`,key:`1u773s`}],[`path`,{d:`M12 17h.01`,key:`p32p05`}]]),s=n(),c=({title:e=`Account not found`,subtitle:t,appName:n=`this app`,ctaText:r=`Try logging in again`,onRetry:i})=>(0,s.jsx)(a,{title:e,subtitle:t||`Please try logging in again or go to ${n} to create an account.`,icon:o,iconVariant:`warning`,primaryCta:{label:r,onClick:i},watermark:!0}),l={component:()=>{let{navigate:n,setModalData:r,data:a}=i(),o=t(),{getAuthMeta:l,client:u}=e();return(0,s.jsx)(c,{appName:o?.name,onRetry:()=>{let e=l();r({...a,login:{...a?.login,...e?.disableSignup?{disableSignup:!0}:{}}}),u?.authFlow&&(u.authFlow=void 0),n(`LandingScreen`)}})}};export{l as AccountNotFoundScreen,l as default,c as AccountNotFoundScreenView};
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import{s as e}from"./rolldown-runtime-BcKkbAw3.js";import{D as t}from"./privy-context-81KmsBw2-CjWGzyg7.js";import{t as n}from"./jsx-runtime-BbDfbRii.js";import{t as r}from"./react-DrJ0MmMO.js";import{n as i,t as a}from"./landmark-CH6LV6F0.js";import{t as o}from"./wallet-Bn85Sg2W.js";import{n as s}from"./modal-context-CwmSeFcv-DruX9J1E.js";import{c}from"./Loader-UAZqxsnw-Cy7hEE2f.js";import{t as l}from"./index-CWARkn2w-Cezl_uBr.js";import{n as u,t as d}from"./GooglePay-B53WnudL-BX5_WtCx.js";import{n as f,r as p,t as m}from"./isPaymentRequestAvailable-Bq1cemEn-By6r0dVB.js";import{r as h}from"./styles-DVyDvTdj-BTABn2K8.js";import{c as g,l as _,p as v}from"./styles-hslXy6xG-D-49b1rk.js";import{l as y,y as b}from"./use-headless-crypto-deposit-Yn-QRLB3-LUIVFBSd.js";var x=n(),S=e(r(),1),C={component:()=>{let e=b(),{onUserCloseViaDialogOrKeybindRef:n}=s(),r=t(),c=(0,S.useRef)(!1),C=m(f),O=m(p),[k,A]=(0,S.useState)(!1),j=C?`APPLE_PAY`:!1===C&&O?`GOOGLE_PAY`:null,M=!0===C||!1===C&&O!==void 0,N=!e?.startFiat||M||k;(0,S.useEffect)((()=>{let e=window.setTimeout((()=>A(!0)),2e3);return()=>window.clearTimeout(e)}),[]),(0,S.useEffect)((()=>{e&&(c.current=!1)}),[e]);let P=(0,S.useRef)(null);(0,S.useEffect)((()=>{e&&!e.error&&N&&P.current!==e&&(P.current=e,e.recordRowsViewed?.({walletPay:e.startFiat?j:void 0,walletPayTimedOut:e.startFiat?!M:void 0}))}),[N,e,j,M]);let F=(0,S.useCallback)((async()=>{!c.current&&e&&(c.current=!0,y(),await e.onCancel())}),[e]);if((0,S.useEffect)((()=>(n.current=F,()=>{n.current===F&&(n.current=null)})),[F,n]),!e)return null;if(e.error)return(0,x.jsx)(g,{title:`Unable to add funds`,subtitle:e.error,showClose:!0,onClose:F,primaryCta:{label:`Close`,onClick:F}});let I=async t=>{c.current||(c.current=!0,await e.startFiat?.(t))};return(0,x.jsx)(g,{title:`Pay with`,subtitle:`Debit cards typically have higher success rates than credit cards, even with Apple Pay or Google Pay.`,showClose:!0,onClose:F,children:N?(0,x.jsxs)(h,{style:{marginTop:`1rem`},$colorScheme:r.appearance.palette.colorScheme,children:[e.startFiat&&(0,x.jsxs)(_,{onClick:()=>I(`CREDIT_DEBIT_CARD`),children:[(0,x.jsx)(T,{children:(0,x.jsx)(i,{})}),(0,x.jsxs)(E,{children:[(0,x.jsx)(v,{children:`Debit or credit card`}),(0,x.jsx)(D,{children:`Less than 10 minutes`})]})]}),e.startFiat&&j===`APPLE_PAY`&&(0,x.jsxs)(_,{onClick:()=>I(`APPLE_PAY`),children:[(0,x.jsx)(T,{children:(0,x.jsx)(u,{width:18,height:18})}),(0,x.jsxs)(E,{children:[(0,x.jsx)(v,{children:`Apple Pay`}),(0,x.jsx)(D,{children:`Less than 10 minutes`})]})]}),e.startFiat&&j===`GOOGLE_PAY`&&(0,x.jsxs)(_,{onClick:()=>I(`GOOGLE_PAY`),children:[(0,x.jsx)(T,{children:(0,x.jsx)(d,{width:18,height:18})}),(0,x.jsxs)(E,{children:[(0,x.jsx)(v,{children:`Google Pay`}),(0,x.jsx)(D,{children:`Less than 10 minutes`})]})]}),e.startFiat&&(0,x.jsxs)(_,{onClick:()=>I(`BANK`),children:[(0,x.jsx)(T,{children:(0,x.jsx)(a,{})}),(0,x.jsxs)(E,{children:[(0,x.jsx)(v,{children:`Bank account`}),(0,x.jsx)(D,{children:`1–2 days`})]})]}),e.startCrypto&&(0,x.jsxs)(_,{onClick:async()=>{c.current||(c.current=!0,await e.startCrypto?.())},children:[(0,x.jsx)(T,{children:(0,x.jsx)(o,{})}),(0,x.jsxs)(E,{children:[(0,x.jsx)(v,{children:`Crypto wallet or exchange`}),(0,x.jsx)(D,{children:`Instant`})]})]})]}):(0,x.jsx)(w,{children:(0,x.jsx)(l,{size:`50px`})})})}},w=c.div`
|
|
2
|
-
display: flex;
|
|
3
|
-
justify-content: center;
|
|
4
|
-
align-items: center;
|
|
5
|
-
margin-top: 1rem;
|
|
6
|
-
min-height: 8rem;
|
|
7
|
-
`,T=c.span`
|
|
8
|
-
width: 2rem;
|
|
9
|
-
height: 2rem;
|
|
10
|
-
border-radius: var(--privy-border-radius-full);
|
|
11
|
-
background-color: var(--privy-color-background-2);
|
|
12
|
-
color: var(--privy-color-icon-muted);
|
|
13
|
-
display: flex;
|
|
14
|
-
align-items: center;
|
|
15
|
-
justify-content: center;
|
|
16
|
-
flex-shrink: 0;
|
|
17
|
-
overflow: hidden;
|
|
18
|
-
|
|
19
|
-
svg {
|
|
20
|
-
width: 1.125rem;
|
|
21
|
-
height: 1.125rem;
|
|
22
|
-
}
|
|
23
|
-
`,E=c.span`
|
|
24
|
-
display: flex;
|
|
25
|
-
flex-direction: column;
|
|
26
|
-
align-items: flex-start;
|
|
27
|
-
`,D=c.span`
|
|
28
|
-
font-size: 0.875rem;
|
|
29
|
-
line-height: 1.25rem;
|
|
30
|
-
color: var(--privy-color-foreground-3);
|
|
31
|
-
`;export{C as AddFundsSelectionScreen,C as default};
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import{s as e}from"./rolldown-runtime-BcKkbAw3.js";import{t}from"./jsx-runtime-BbDfbRii.js";import{t as n}from"./react-DrJ0MmMO.js";import{t as r}from"./check-BPgcwEPP.js";import{t as i}from"./copy-Ckr0AkL6.js";import{c as a}from"./Loader-UAZqxsnw-Cy7hEE2f.js";import{o}from"./ModalFooter-BCuEK_nz-c-khvG4Y.js";import{p as s}from"./storage-Ufl800Ne-D0bZBw-H.js";var c=t(),l=e(n(),1),u=({address:e,showCopyIcon:t,url:n,className:a})=>{let[u,m]=(0,l.useState)(!1);function h(t){t.stopPropagation(),navigator.clipboard.writeText(e).then((()=>m(!0))).catch(console.error)}return(0,l.useEffect)((()=>{if(u){let e=setTimeout((()=>m(!1)),3e3);return()=>clearTimeout(e)}}),[u]),(0,c.jsxs)(d,n?{children:[(0,c.jsx)(p,{title:e,className:a,href:`${n}/address/${e}`,target:`_blank`,children:s(e)}),t&&(0,c.jsx)(o,{onClick:h,size:`sm`,style:{gap:`0.375rem`},children:(0,c.jsxs)(c.Fragment,u?{children:[`Copied`,(0,c.jsx)(r,{size:16})]}:{children:[`Copy`,(0,c.jsx)(i,{size:16})]})})]}:{children:[(0,c.jsx)(f,{title:e,className:a,children:s(e)}),t&&(0,c.jsx)(o,{onClick:h,size:`sm`,style:{gap:`0.375rem`,fontSize:`14px`},children:(0,c.jsxs)(c.Fragment,u?{children:[`Copied`,(0,c.jsx)(r,{size:14})]}:{children:[`Copy`,(0,c.jsx)(i,{size:14})]})})]})},d=a.span`
|
|
2
|
-
display: inline-flex;
|
|
3
|
-
align-items: center;
|
|
4
|
-
gap: 0.5rem;
|
|
5
|
-
`,f=a.span`
|
|
6
|
-
font-size: 14px;
|
|
7
|
-
font-weight: 500;
|
|
8
|
-
color: var(--privy-color-foreground);
|
|
9
|
-
`,p=a.a`
|
|
10
|
-
font-size: 14px;
|
|
11
|
-
color: var(--privy-color-foreground);
|
|
12
|
-
text-decoration: none;
|
|
13
|
-
|
|
14
|
-
&:hover {
|
|
15
|
-
text-decoration: underline;
|
|
16
|
-
}
|
|
17
|
-
`;export{u as t};
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import"./rolldown-runtime-BcKkbAw3.js";import{$ as e,D as t,i as n}from"./privy-context-81KmsBw2-CjWGzyg7.js";import{t as r}from"./jsx-runtime-BbDfbRii.js";import{t as i}from"./react-DrJ0MmMO.js";import{t as a}from"./createLucideIcon-IPW50ckY.js";import{t as o}from"./external-link-D-uehwM2.js";import{n as s}from"./modal-context-CwmSeFcv-DruX9J1E.js";import{c}from"./Loader-UAZqxsnw-Cy7hEE2f.js";import{l}from"./ModalFooter-BCuEK_nz-c-khvG4Y.js";import{t as u}from"./ScreenLayout-OwaQQcxH-CrQM6kvA.js";import{t as d}from"./shouldProceedtoEmbeddedWalletCreationFlow-B3vyavrh-BK_FBkaE.js";var f=a(`file-check`,[[`path`,{d:`M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z`,key:`1oefj6`}],[`path`,{d:`M14 2v5a1 1 0 0 0 1 1h5`,key:`wfsgrz`}],[`path`,{d:`m9 15 2 2 4-4`,key:`1grp1n`}]]),p=r();i();var m={component:()=>{let{user:r,logout:i}=n(),{onUserCloseViaDialogOrKeybindRef:a,setModalData:o,navigate:c}=s(),l=t(),{acceptTerms:u,closePrivyModal:f,createAnalyticsEvent:m}=e(),g=e=>{e?.preventDefault(),f({shouldCallAuthOnSuccess:!1}),i()};return a.current=g,(0,p.jsx)(h,{termsAndConditionsUrl:l?.legal.termsAndConditionsUrl,privacyPolicyUrl:l?.legal.privacyPolicyUrl,onAccept:async e=>{e?.preventDefault(),await u(),r&&d(r,l.embeddedWallets)?(o({createWallet:{onSuccess:()=>{},onFailure:e=>{console.error(e),m({eventName:`embedded_wallet_creation_failure_logout`,payload:{error:e,screen:`AffirmativeConsentScreen`}}),i()},callAuthOnSuccessOnClose:!0}}),c(`EmbeddedWalletOnAccountCreateScreen`)):f()},onDecline:g})}},h=({termsAndConditionsUrl:e,privacyPolicyUrl:t,onAccept:n,onDecline:r,title:i=`One last step`,subtitle:a=`By signing up, you agree to our terms and privacy policy.`})=>(0,p.jsx)(u,{title:i,subtitle:a,icon:f,primaryCta:{label:`Accept`,onClick:n},secondaryCta:{label:`No thanks`,onClick:r},watermark:!0,children:(e||t)&&(0,p.jsxs)(g,{children:[e&&(0,p.jsxs)(l,{variant:`muted`,href:e,target:`_blank`,size:`lg`,style:{justifyContent:`space-between`},as:`a`,children:[`View Terms`,(0,p.jsx)(o,{width:16,height:16,strokeWidth:2.25})]}),t&&(0,p.jsxs)(l,{variant:`muted`,href:t,target:`_blank`,size:`lg`,style:{justifyContent:`space-between`},as:`a`,children:[`View Privacy Policy`,(0,p.jsx)(o,{width:16,height:16,strokeWidth:2.25})]})]})}),g=c.div`
|
|
2
|
-
display: flex;
|
|
3
|
-
flex-direction: column;
|
|
4
|
-
gap: 12px;
|
|
5
|
-
margin-top: var(--screen-space);
|
|
6
|
-
`;export{m as AffirmativeConsentScreen,m as default,h as AffirmativeConsentScreenView};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import"./rolldown-runtime-BcKkbAw3.js";import{D as e}from"./privy-context-81KmsBw2-CjWGzyg7.js";import{t}from"./jsx-runtime-BbDfbRii.js";import{t as n}from"./react-DrJ0MmMO.js";import{t as r}from"./lock-DcskI4Bb.js";import{n as i}from"./modal-context-CwmSeFcv-DruX9J1E.js";import{t as a}from"./ScreenLayout-OwaQQcxH-CrQM6kvA.js";import{t as o}from"./safe-url-D7SRPu33-CkMedGro.js";var s=t();n();var c=({title:e=`You don't have access to this app`,subtitle:t=`Have you been invited?`,ctaText:n=`Try another account`,ctaLink:i,onCtaClick:c})=>(0,s.jsx)(a,{title:e,subtitle:t,icon:r,iconVariant:`warning`,primaryCta:{label:n,onClick:()=>{let e=o(i);e?window.open(e,`_blank`,`noopener,noreferrer`):c?.()}},watermark:!0}),l={component:()=>{let{navigate:t}=i(),n=e(),r=n?.allowlistConfig.errorTitle||`You don't have access to this app`,a=n?.allowlistConfig.errorDetail||`Have you been invited?`,o=n?.allowlistConfig.errorCtaText||`Try another account`,l=n?.allowlistConfig.errorCtaLink;return(0,s.jsx)(c,{title:r,subtitle:a,ctaText:o,ctaLink:l??void 0,onCtaClick:()=>{t(`LandingScreen`)}})}};export{l as AllowlistRejectionScreen,l as default,c as AllowlistRejectionScreenView};
|