@fangorn-network/westmarch 0.0.11-dev → 0.0.13-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.
- package/package.json +5 -1
- package/site/agent.js +1 -1
- package/site/dist/assets/AccountNotFoundScreen-C4njXc69-BOfmiSH1.js +1 -0
- package/site/dist/assets/AddFundsSelectionScreen-RAoCn7ej-D_EsIeJu.js +31 -0
- package/site/dist/assets/Address-H8kD1d9O-C85sJ79B.js +17 -0
- package/site/dist/assets/AffirmativeConsentScreen-BG0MJxku-DdEPFOww.js +6 -0
- package/site/dist/assets/AllowlistRejectionScreen-Cae6e1Od-DhVy9iGN.js +1 -0
- package/site/dist/assets/ApiController-CYdiyu9B.js +5 -0
- package/site/dist/assets/ArrowsRightLeftIcon-cp60yobq.js +1 -0
- package/site/dist/assets/AuthenticateWithWalletScreen-CU6hIcFT-8rbYiYYE.js +1 -0
- package/site/dist/assets/AwaitingEvmToSolBridgingScreen-D0e_sZMS-2pkNfCno.js +1 -0
- package/site/dist/assets/AwaitingExternalEthereumTransferScreen-ur5HL4R7-7AQt25_k.js +1 -0
- package/site/dist/assets/AwaitingPasswordlessCodeScreen-DRHz76mM-BZY30TGs.js +103 -0
- package/site/dist/assets/AwaitingSolToEvmBridgingScreen-CdLRrGD2-BILOOLi_.js +1 -0
- package/site/dist/assets/BridgeNetworkSelectionView-CFGjB2nO-CvsbQcFv.js +68 -0
- package/site/dist/assets/CaptchaScreen-DbpvkIGx-D8eDcAkc.js +1 -0
- package/site/dist/assets/CheckCircleIcon-BM409mGI.js +1 -0
- package/site/dist/assets/CheckCircleIcon-NCOQc0Gs.js +1 -0
- package/site/dist/assets/Checkbox-D1EDeo41-rHlvsZzP.js +52 -0
- package/site/dist/assets/ChevronDownIcon-CW-4MSpE.js +1 -0
- package/site/dist/assets/Chip-CZKIKt9K-CutJG010.js +26 -0
- package/site/dist/assets/CoinbaseOnrampStatusScreen-BbyCJDXL-DLs9zX-Q.js +16 -0
- package/site/dist/assets/ConnectEmailForm-B-VRE0MN-N9J6T_YL.js +3 -0
- package/site/dist/assets/ConnectLedgerScreen-DWHABGot-h0uYIUi6.js +10 -0
- package/site/dist/assets/ConnectOnlyLandingScreen-CZYx9Bmp-LeuDMN1E.js +1 -0
- package/site/dist/assets/ConnectOnlyStatusScreen-DCRzjxHx-DaRa59tZ.js +1 -0
- package/site/dist/assets/ConnectOrCreateScreen-CUUYUO07-crHzh-TL.js +1 -0
- package/site/dist/assets/ConnectPhoneForm-Dek5xn4C-BEA4FmhI.js +95 -0
- package/site/dist/assets/ConnectWalletView-DqI-PTvX-CMQIad63.js +74 -0
- package/site/dist/assets/ConnectionStatusScreen-fUfROm9m-BeWLchcf.js +7 -0
- package/site/dist/assets/ConnectionStatusScreen-fUfROm9m-wu3a3kw4.js +1 -0
- package/site/dist/assets/ConnectorUtil-Cq4lWnfe.js +21 -0
- package/site/dist/assets/ConstantsUtil-DmLsRHAl.js +198 -0
- package/site/dist/assets/CopyToClipboard-i_OQSBJr-DujUHNzW.js +39 -0
- package/site/dist/assets/CopyableText-CQapvaMr-DMIdpDaU.js +28 -0
- package/site/dist/assets/CrossAppAuthScreen-CLw7ymZq-Csju14vF.js +1 -0
- package/site/dist/assets/CustomLandingScreenView-Cm_MBSyX-CBOrbNLo.js +22 -0
- package/site/dist/assets/DelegatedActionsConsentScreen-DYF2U4y5-BL5hzNUI.js +1 -0
- package/site/dist/assets/DelegatedActionsRevokeScreen-bPp6Uwyh-fcO51q5H.js +1 -0
- package/site/dist/assets/DepositAddressAddressStepView-4vdkb55L-B3vY888G.js +187 -0
- package/site/dist/assets/DepositAddressScreen-DBLRs7aI-DmdQaFI2.js +8 -0
- package/site/dist/assets/DepositAddressV3Screen-CDqIEMQw-BoupRyfV.js +1 -0
- package/site/dist/assets/EmailInputForm-Cqo1mda8-B2NG3K5V.js +124 -0
- package/site/dist/assets/EmbeddedWalletConnectingScreen-D4T7DUzs-D_AVgO4s.js +1 -0
- package/site/dist/assets/EmbeddedWalletCreatedScreen-D7WhW5ve-CLsJbPYQ.js +1 -0
- package/site/dist/assets/EmbeddedWalletKeyExportScreen-CqV4NYQ3-C9sAExzE.js +23 -0
- package/site/dist/assets/EmbeddedWalletOnAccountCreateScreen-BoKb3Q2S-DxaWAAKa.js +1 -0
- package/site/dist/assets/EmbeddedWalletPasswordUpdateScreen-D3rMlqS7-CxrfLr5q.js +1 -0
- package/site/dist/assets/EmbeddedWalletPasswordUpdateSplashScreen-BPFkWJeE-DHZRGoTN.js +1 -0
- package/site/dist/assets/EnrollTotp-Dibew4dp-SA2pvNEc.js +66 -0
- package/site/dist/assets/EnvelopeIcon-Dh2vSVj4.js +1 -0
- package/site/dist/assets/ErrorBanner-BcpGRt0h-BKOYTyCi.js +21 -0
- package/site/dist/assets/ErrorMessage-D8VaAP5m-CrZOnUyg.js +8 -0
- package/site/dist/assets/ErrorScreen-DipdTWzE-DcxVjMO4.js +1 -0
- package/site/dist/assets/ErrorScreen-DipdTWzE-c8g8En21.js +4 -0
- package/site/dist/assets/ExclamationCircleIcon-DUA2wMfO.js +1 -0
- package/site/dist/assets/ExclamationTriangleIcon-eZfaqcFq.js +1 -0
- package/site/dist/assets/FarcasterConnectStatusScreen-51tjUxqq-s_s5M2CZ.js +75 -0
- package/site/dist/assets/FarcasterSignerStatusScreen-6x-Uh95G-BHBR4k8H.js +28 -0
- package/site/dist/assets/FiatOnrampScreen-BAhYeiTI-BH_sU6EV.js +491 -0
- package/site/dist/assets/FingerPrintIcon-Dm6kxmg7.js +1 -0
- package/site/dist/assets/FundSolWalletWithExternalSolanaWallet-WtLwYaOl-B8TRV36j.js +1 -0
- package/site/dist/assets/FundWalletMethodHeader-BWNkokCT-BQdbJ5Bb.js +1 -0
- package/site/dist/assets/FundWithBankDepositScreen-DajkHxBD-9rPtyA3d.js +58 -0
- package/site/dist/assets/FundingEditAmountScreen-CpvpiO4M-GaXigGI9.js +1 -0
- package/site/dist/assets/FundingMethodSelectionScreen-Db7vhRlE-UsmtTqv4.js +1 -0
- package/site/dist/assets/GlobeAltIcon-vqrVV5ho.js +1 -0
- package/site/dist/assets/GooglePay-B53WnudL-BX5_WtCx.js +1 -0
- package/site/dist/assets/HCaptchaWrapper-CUi9LJsp-D-I8j7NO.js +4 -0
- package/site/dist/assets/InAppBrowserLoginNotPossible-BMR9br1T-BY3j50El.js +1 -0
- package/site/dist/assets/InfoBanner-Cb3p1z12-DLBl_Ywy.js +22 -0
- package/site/dist/assets/InjectedWalletIcon-DLcYOGDj-DLSV_NjP.js +1 -0
- package/site/dist/assets/InstallWalletScreen-DTA8dwLv-CxreyXoD.js +1 -0
- package/site/dist/assets/JsonTree-BHzNC-ic-DcNcbSoM.js +34 -0
- package/site/dist/assets/LabelXs-oqZNqbm_-iafrj25N.js +6 -0
- package/site/dist/assets/LandingScreen-CGWUoSUG-DK1EY-6v.js +1 -0
- package/site/dist/assets/Layouts-BMRfo5hw-CeCOyCLK.js +77 -0
- package/site/dist/assets/Link-BdDilT2T-BEDEdHuS.js +40 -0
- package/site/dist/assets/LinkConflictScreen-C3ZEPsgl-ClWoqvEL.js +77 -0
- package/site/dist/assets/LinkEmailScreen-dKo9frwc-C3v7glH0.js +1 -0
- package/site/dist/assets/LinkPasskeyScreen-zbrl_AI_-D72Gb0LW.js +117 -0
- package/site/dist/assets/LinkPasskeyScreen-zbrl_AI_-DYIl5Kr2.js +1 -0
- package/site/dist/assets/LinkPhoneScreen-oIUpfj0w-C0DuD14j.js +1 -0
- package/site/dist/assets/Loader-UAZqxsnw-Cy7hEE2f.js +62 -0
- package/site/dist/assets/LoadingSkeleton-BMsgO5PV-CiEyS5PZ.js +17 -0
- package/site/dist/assets/LockClosedIcon-BgY_5v_Z.js +1 -0
- package/site/dist/assets/LoginFailedScreen-CN0dJV6U-DhUMiJZJ.js +1 -0
- package/site/dist/assets/ManualTransferScreen-CHqcuqbs-tXiZDHmN.js +1 -0
- package/site/dist/assets/MfaAuthEnrollmentFlowScreen-Dj7gPTRC-CaW7xeCC.js +1 -0
- package/site/dist/assets/MfaAuthVerifyFlowScreen-DbFpyWMy-CeRqvx8k.js +1 -0
- package/site/dist/assets/MfaEnrollmentFlowScreen-DhLnGgnr-BkN1k4lh.js +1 -0
- package/site/dist/assets/MfaVerifyFlowScreen-C_XPjMRP-CXSqLVbE.js +1 -0
- package/site/dist/assets/ModalFooter-BCuEK_nz-c-khvG4Y.js +403 -0
- package/site/dist/assets/MoonpayStatusScreen-CzTUtokc-BRFN2eXr.js +16 -0
- package/site/dist/assets/OAuthStatusScreen-ufbOa-da-CeiGcSia.js +1 -0
- package/site/dist/assets/OpenLink-CUpJ1mOr-DfAvJRyK.js +39 -0
- package/site/dist/assets/PasskeySelectSignupOrLogin-xh2ScC_l-CIf5I7wU.js +1 -0
- package/site/dist/assets/PasskeyStatusScreen-Bla8MaOk-CLoL7QC-.js +6 -0
- package/site/dist/assets/PasswordRecoveryScreen-awGXZkQk-B9F67IYV.js +20 -0
- package/site/dist/assets/PhArrowCircleDown-D97G-BOA.js +14 -0
- package/site/dist/assets/PhArrowClockwise-DVgyFuez.js +14 -0
- package/site/dist/assets/PhArrowDown-87b1BizM.js +14 -0
- package/site/dist/assets/PhArrowLeft-Da0MfnbK.js +14 -0
- package/site/dist/assets/PhArrowRight-AdrIL4DW.js +14 -0
- package/site/dist/assets/PhArrowSquareOut-Bk2CMG3I.js +14 -0
- package/site/dist/assets/PhArrowUp-4sgyKPGx.js +14 -0
- package/site/dist/assets/PhArrowUpRight-BNghD2zq.js +14 -0
- package/site/dist/assets/PhArrowsClockwise-BXRn1GEl.js +14 -0
- package/site/dist/assets/PhArrowsDownUp-DM09Jo_3.js +14 -0
- package/site/dist/assets/PhArrowsLeftRight-MuKBLUoF.js +14 -0
- package/site/dist/assets/PhBank-fHbgCqqZ.js +14 -0
- package/site/dist/assets/PhBrowser-2-9m-AkM.js +14 -0
- package/site/dist/assets/PhCaretDown-BDNabFuL.js +14 -0
- package/site/dist/assets/PhCaretLeft-CI460R-A.js +14 -0
- package/site/dist/assets/PhCaretRight-D7ZS3Ls8.js +14 -0
- package/site/dist/assets/PhCaretUp-C-iIfyvO.js +14 -0
- package/site/dist/assets/PhCheck-DxQXn57r.js +14 -0
- package/site/dist/assets/PhCircleHalf-MJZeRBGF.js +14 -0
- package/site/dist/assets/PhClock-x3MS3Mwi.js +14 -0
- package/site/dist/assets/PhCompass-hYn3HhGN.js +14 -0
- package/site/dist/assets/PhCopy-CWNYcABI.js +14 -0
- package/site/dist/assets/PhCreditCard-Fy4pzwtt.js +14 -0
- package/site/dist/assets/PhCurrencyDollar-BgiaenCi.js +14 -0
- package/site/dist/assets/PhDesktop-CxrzCSv5.js +14 -0
- package/site/dist/assets/PhDeviceMobile-CsyA5Goi.js +14 -0
- package/site/dist/assets/PhDotsThree-D-k1BiYg.js +14 -0
- package/site/dist/assets/PhEnvelope-D8kzeNox.js +14 -0
- package/site/dist/assets/PhFunnelSimple-CfQs5DAW.js +14 -0
- package/site/dist/assets/PhGlobe-DvmSc9_A.js +14 -0
- package/site/dist/assets/PhIdentificationCard-CfkZm-5K.js +14 -0
- package/site/dist/assets/PhImage-Cf0J2ZfJ.js +14 -0
- package/site/dist/assets/PhInfo-Bwi51-2X.js +14 -0
- package/site/dist/assets/PhLightbulb-C4FZV7Es.js +14 -0
- package/site/dist/assets/PhMagnifyingGlass-C9u8jSCJ.js +14 -0
- package/site/dist/assets/PhPaperPlaneRight-zxQVvPLX.js +14 -0
- package/site/dist/assets/PhPlus-C4UoW-2n.js +14 -0
- package/site/dist/assets/PhPower-CFyWDmgD.js +14 -0
- package/site/dist/assets/PhPuzzlePiece-BjoNVfST.js +14 -0
- package/site/dist/assets/PhQrCode-CP3tFauY.js +14 -0
- package/site/dist/assets/PhQuestion-wOWJBd3G.js +14 -0
- package/site/dist/assets/PhQuestionMark-CV0k9C0Y.js +14 -0
- package/site/dist/assets/PhSealCheck-vIKzREuN.js +14 -0
- package/site/dist/assets/PhSignOut-CxELV-i0.js +14 -0
- package/site/dist/assets/PhSpinner-CGDmbzUd.js +14 -0
- package/site/dist/assets/PhTrash-C9PD0SAt.js +14 -0
- package/site/dist/assets/PhUser-0sWNXQeZ.js +14 -0
- package/site/dist/assets/PhVault-6JTskUcC.js +14 -0
- package/site/dist/assets/PhWarning-CoKs3gz6.js +14 -0
- package/site/dist/assets/PhWarningCircle-BXHw1fCt.js +14 -0
- package/site/dist/assets/PhX-DX0SFIqC.js +14 -0
- package/site/dist/assets/PhoneIcon-CvIiPwYQ.js +1 -0
- package/site/dist/assets/PinInput-DbZ0b1i1-CDXZBdQx.js +247 -0
- package/site/dist/assets/PrivyPluginContext-DA-yS5vO-CtQWBiV2.js +1 -0
- package/site/dist/assets/QrCode-DbnZwlkH-h6Bhoe5U.js +22 -0
- package/site/dist/assets/RecoveryOAuthStatusScreen-CsgtTI2x-D-A5P3PX.js +1 -0
- package/site/dist/assets/RecoveryPasswordCreateScreen-Be-qJ-LU-C8lTSeSr.js +1 -0
- package/site/dist/assets/RecoverySelectionScreen-D1iGtpmi-P5P3plkH.js +7 -0
- package/site/dist/assets/SIWXUtil-TUCxa7aA.js +1 -0
- package/site/dist/assets/Screen-D30meWsY-CCeVNuWs.js +175 -0
- package/site/dist/assets/ScreenHeader-CHmc4-Lu-DjyrH7IK.js +31 -0
- package/site/dist/assets/ScreenLayout-OwaQQcxH-CrQM6kvA.js +1 -0
- package/site/dist/assets/SelectSourceAsset-CWFog6gm-D7yTw87h.js +140 -0
- package/site/dist/assets/SetAutomaticRecoveryScreen-BO_OEqAZ-f0iDIGmw.js +14 -0
- package/site/dist/assets/SetWalletPasswordForm-DwCTVtAh-kq1zvA7d.js +11 -0
- package/site/dist/assets/ShieldCheckIcon-o6RHYev1.js +1 -0
- package/site/dist/assets/SignRequestScreen-BHKv32KR-DDpMYyJ1.js +26 -0
- package/site/dist/assets/SolanaWalletConnector-C7Lqk-Wz-DPwhuzcI.js +1 -0
- package/site/dist/assets/StackedContainer-B2vaEl56-eQCM2cmv.js +24 -0
- package/site/dist/assets/StandardSignAndSendTransactionScreen-CfhIXVtd-BJ-onCjv.js +20 -0
- package/site/dist/assets/Subtitle-CV-2yKE4-zxWw2m1Q.js +13 -0
- package/site/dist/assets/TelegramAuthScreen-UL9zLfO8-NWlMgNRX.js +1 -0
- package/site/dist/assets/Title-BnzYV3Is-B_JpTatT.js +7 -0
- package/site/dist/assets/TodoList-DnyULl18-C8Eyy28X.js +36 -0
- package/site/dist/assets/TransactionDetails-e9nesl30-C4MpIHR-.js +109 -0
- package/site/dist/assets/TransactionErrorView-BDBNqA_f-p1T9WVMx.js +178 -0
- package/site/dist/assets/TransferFromWalletScreen-Qvn1Yuno-88IQcRnY.js +31 -0
- package/site/dist/assets/TransferOrBridgeLoadingScreen-Dl1I_iIz-1fDAIxAf.js +6 -0
- package/site/dist/assets/TurnstileWrapper-B7sNddys-Jwy1tJtm.js +1 -0
- package/site/dist/assets/UpdateEmailScreen-DVOhPV0H-Jj2DQW8D.js +1 -0
- package/site/dist/assets/UpdatePhoneScreen-CXRswTNZ-DwYIUBqi.js +1 -0
- package/site/dist/assets/UserLimitReachedScreen-5we2DHn8-D7m70C4b.js +1 -0
- package/site/dist/assets/Value-DTgR824E-BRuIGiec.js +27 -0
- package/site/dist/assets/WalletCards-DH1rqayz-Bgp9Fsgs.js +1 -0
- package/site/dist/assets/WalletIcon-gKf0gTw6.js +1 -0
- package/site/dist/assets/WalletInfoCard-sq_2wgFg-DpNSAGte.js +29 -0
- package/site/dist/assets/WalletInterstitialScreen-Sh7LfsAh-DG-RuO-F.js +1 -0
- package/site/dist/assets/WalletLink-DK5LB5Ha-DHaL350n.js +20 -0
- package/site/dist/assets/WalletOverflowButton-bfCnp-9T-CUyIJFzt.js +1 -0
- package/site/dist/assets/WarningBanner-ZZqCEtZK-2eU4Qo74.js +21 -0
- package/site/dist/assets/__vite-browser-external-CitKSmYk.js +1 -0
- package/site/dist/assets/_esm-B26FZg5Y.js +7 -0
- package/site/dist/assets/_esm-BdeM6pxJ.js +1 -0
- package/site/dist/assets/accounts-D96UKWkC.js +1 -0
- package/site/dist/assets/accounts-DiZ-0VmN.js +1 -0
- package/site/dist/assets/analytics-mkkvFRju-BRBcadka.js +1 -0
- package/site/dist/assets/baseSepolia-DX-qGsik.js +1 -0
- package/site/dist/assets/basic-oIwwSyu4.js +1575 -0
- package/site/dist/assets/capitalizeFirstLetter-DmLYqXsO-DtOXx-2n.js +1 -0
- package/site/dist/assets/ccip-65sIfSPR.js +1 -0
- package/site/dist/assets/ccip-BZvRTL6g.js +7 -0
- package/site/dist/assets/ccip-DA_zG341.js +1 -0
- package/site/dist/assets/chain-DM3oH6Px.js +8 -0
- package/site/dist/assets/check-BPgcwEPP.js +1 -0
- package/site/dist/assets/chevron-down-BSsbXkK-.js +1 -0
- package/site/dist/assets/circle-alert-DWaeLZNj.js +1 -0
- package/site/dist/assets/circle-check-big-Chb1ivw9.js +1 -0
- package/site/dist/assets/circle-x-AV9Cet0R.js +1 -0
- package/site/dist/assets/client-CZG0ndth.js +2 -0
- package/site/dist/assets/client-Dsa7_3V3.js +9 -0
- package/site/dist/assets/coinbase-DCPC2L_R-D3aIgpyd.js +3 -0
- package/site/dist/assets/copy-Ckr0AkL6.js +1 -0
- package/site/dist/assets/core-snws5xwv.js +12 -0
- package/site/dist/assets/createLucideIcon-IPW50ckY.js +1 -0
- package/site/dist/assets/defineChain-CiuCXUZW.js +1 -0
- package/site/dist/assets/dijkstra-Drfl93V4.js +1 -0
- package/site/dist/assets/dist-Cm7pNAtL.js +1 -0
- package/site/dist/assets/dist-CoS6E-3x.js +1 -0
- package/site/dist/assets/dist-Dl07uGq1.js +1 -0
- package/site/dist/assets/dist-DnGANz51.js +16 -0
- package/site/dist/assets/embed.worker-ugGhEqCV.js +1 -0
- package/site/dist/assets/errors-BQ3N-RVt-BLqjTPNR.js +1 -0
- package/site/dist/assets/esm-B5cbIQaz.js +37 -0
- package/site/dist/assets/esm-ByALO6mA.js +1 -0
- package/site/dist/assets/esm-C3DslVJx.js +1 -0
- package/site/dist/assets/esm-Ci1ogKuK.js +1 -0
- package/site/dist/assets/esm-n2lWo7kz.js +1 -0
- package/site/dist/assets/ethers-zTjbodk5-wHhL_BQ1.js +1 -0
- package/site/dist/assets/eventemitter3-CL76jPsW.js +1 -0
- package/site/dist/assets/external-link-D-uehwM2.js +1 -0
- package/site/dist/assets/farcaster-DPlSjvF5-BqTvDXBR.js +1 -0
- package/site/dist/assets/features-DQ0UYy6K.js +2 -0
- package/site/dist/assets/fingerprint-pattern-D8ytA16Q.js +1 -0
- package/site/dist/assets/floating-ui.react-dom-DKWOL9UG.js +1 -0
- package/site/dist/assets/floating-ui.react-xRkl9O3u.js +1 -0
- package/site/dist/assets/formatErc20TokenAmount-BuPk9xcy-BVqOKQif.js +1 -0
- package/site/dist/assets/formatter-CVbp4SlJ.js +1 -0
- package/site/dist/assets/get-entropy-details-for-user-dHRH5Gpi-Dukf7_kJ.js +1 -0
- package/site/dist/assets/getChainName-DjpPdUSc-DUyKDrnp.js +1 -0
- package/site/dist/assets/getErc20Balance-jXNpFf0N-Bb9WM31M.js +1 -0
- package/site/dist/assets/getErc20TokenInfo-BNTrzLMP-KPrdn04K.js +1 -0
- package/site/dist/assets/getFormattedUsdFromLamports-De3U9GlO-Gx4_wxON.js +1 -0
- package/site/dist/assets/getUsdcMintAddress-BVgm9GRo-r2UnDeEy.js +1 -0
- package/site/dist/assets/guards-BIW-GiMJ-CHfXo8XI.js +1 -0
- package/site/dist/assets/hooks.module-BYZGfwDl.js +1 -0
- package/site/dist/assets/hourglass-CPG1HZmf.js +1 -0
- package/site/dist/assets/id-UqEwL2BI-BkKm533U.js +1 -0
- package/site/dist/assets/index-B5YmgwLH.js +8 -0
- package/site/dist/assets/index-BdEw5wyl-ChSJvPZk.js +1 -0
- package/site/dist/assets/index-CWARkn2w-Cezl_uBr.js +61 -0
- package/site/dist/assets/index-DvMddJcd-BatvgC-S.js +12 -0
- package/site/dist/assets/index-YiCw0Y_x-CX5i3Z87.js +437 -0
- package/site/dist/assets/index.browser-B-i-Lj3J.js +1 -0
- package/site/dist/assets/index.browser-BMmUcykv.js +1 -0
- package/site/dist/assets/index.es-BmqyoBEM.js +2 -0
- package/site/dist/assets/index.es-C1v1or--.js +3 -0
- package/site/dist/assets/isPaymentRequestAvailable-Bq1cemEn-By6r0dVB.js +1 -0
- package/site/dist/assets/jsx-runtime-BbDfbRii.js +1 -0
- package/site/dist/assets/landmark-CH6LV6F0.js +1 -0
- package/site/dist/assets/lib-BsS8z8Lj.js +1 -0
- package/site/dist/assets/localBatchGatewayRequest-3kLrX_c7.js +32 -0
- package/site/dist/assets/lock-DcskI4Bb.js +1 -0
- package/site/dist/assets/logger-CsXm3oIv-B0UYpNFI.js +1 -0
- package/site/dist/assets/mail-Bs0r5yOi.js +1 -0
- package/site/dist/assets/modal-context-CwmSeFcv-DruX9J1E.js +1 -0
- package/site/dist/assets/native-BKj27wfc.js +1 -0
- package/site/dist/assets/ofetch.CWycOUEr-CHp-crOQ.js +1 -0
- package/site/dist/assets/parseAbi-Csg-8t59.js +2 -0
- package/site/dist/assets/parseAbiParameters-BWbIMYe4.js +1 -0
- package/site/dist/assets/parseEther-VjhVo3dd.js +1 -0
- package/site/dist/assets/pkce-DXF0yKjP-ChQhE0st.js +1 -0
- package/site/dist/assets/preload-helper-uBIymjUX.js +1 -0
- package/site/dist/assets/privy-context-81KmsBw2-CjWGzyg7.js +2 -0
- package/site/dist/assets/property-DuZ9DLP4.js +3 -0
- package/site/dist/assets/react-DCXkXSrv.js +1 -0
- package/site/dist/assets/react-DQnMl2Xv.js +1 -0
- package/site/dist/assets/react-DrJ0MmMO.js +1 -0
- package/site/dist/assets/react-auth-sHnipzbS.js +1 -0
- package/site/dist/assets/react-dom-5dW7aKoP.js +1 -0
- package/site/dist/assets/reservoir-x-nGuZkT-BMX127i6.js +1 -0
- package/site/dist/assets/rolldown-runtime-BcKkbAw3.js +1 -0
- package/site/dist/assets/safe-url-D7SRPu33-CkMedGro.js +1 -0
- package/site/dist/assets/secp256k1-C4nzcPo-.js +1 -0
- package/site/dist/assets/secp256k1-D92aGNnU.js +1 -0
- package/site/dist/assets/secp256k1-DmbwyFau.js +1 -0
- package/site/dist/assets/secp256k1-_MleGpqL.js +1 -0
- package/site/dist/assets/secp256k1-xl2og-wO.js +1 -0
- package/site/dist/assets/serializeAuthorizationList-CX8hGL56.js +1 -0
- package/site/dist/assets/serializeSignature-DfxkPnu-.js +2 -0
- package/site/dist/assets/sha2-BU_QyRTx.js +1 -0
- package/site/dist/assets/shared-DRZUmnL5-xqAUARWo.js +193 -0
- package/site/dist/assets/shared-FM0rljBt--Avg6q2R.js +21 -0
- package/site/dist/assets/shouldProceedtoEmbeddedWalletCreationFlow-B3vyavrh-BK_FBkaE.js +1 -0
- package/site/dist/assets/simulateTransaction-CfuOrae4-64lWYJAL.js +1 -0
- package/site/dist/assets/smartphone-CcEZ-XAy.js +1 -0
- package/site/dist/assets/src-BBjkfi-Q.js +1 -0
- package/site/dist/assets/storage-Ufl800Ne-D0bZBw-H.js +9 -0
- package/site/dist/assets/stringify-BlDm7tuc.js +21 -0
- package/site/dist/assets/stripe.esm-CZRDpc-N.js +2 -0
- package/site/dist/assets/styles-BsotlekN-CXEB4Ud9.js +9 -0
- package/site/dist/assets/styles-Cm9H63WO-Br4QtzUL.js +92 -0
- package/site/dist/assets/styles-DVyDvTdj-BTABn2K8.js +74 -0
- package/site/dist/assets/styles-hslXy6xG-D-49b1rk.js +164 -0
- package/site/dist/assets/telegram-B-JqnkqZ-RBoY3PLx.js +1 -0
- package/site/dist/assets/to-ui-error-DWe-qwS3-Cx2bk1kZ.js +4 -0
- package/site/dist/assets/toViemAccount-B5iDGq1b-Ba8L7zed.js +2 -0
- package/site/dist/assets/transaction-BNTP-bFm-M5tJx8vY.js +1 -0
- package/site/dist/assets/transfer-6YztDh-t-BVQkTvG-.js +1 -0
- package/site/dist/assets/{transformers.web-CM54uIeJ.js → transformers.web-CVP3pJOS.js} +1 -1
- package/site/dist/assets/triangle-alert-CWjYH75H.js +1 -0
- package/site/dist/assets/twitch-5IOe4sIQ-lDtgk0os.js +1 -0
- package/site/dist/assets/types-4CuOD23i.js +1 -0
- package/site/dist/assets/use-headless-crypto-deposit-Yn-QRLB3-LUIVFBSd.js +1 -0
- package/site/dist/assets/use-unlink-wallet-BKK4_5Ur-CC2pq27z.js +1 -0
- package/site/dist/assets/useActiveWallet-B-yZYGc6-D7Ik-LxJ.js +123 -0
- package/site/dist/assets/useGetSolPrice-x7gfUIHJ-D1hmQfpA.js +1 -0
- package/site/dist/assets/useGetTokenPrice-CaoUkb79-ZnbuJ-vP.js +1 -0
- package/site/dist/assets/useI18n-C-5n_noF-BcqC76yj.js +1 -0
- package/site/dist/assets/useWalletBalance-CZnP5f_f-Dw2GIJ4g.js +1 -0
- package/site/dist/assets/useWallets-X1ndvJ_U-DRjz7uYD.js +1 -0
- package/site/dist/assets/utils-BkR7EQjg.js +1 -0
- package/site/dist/assets/utils-DJhBNOZA.js +1 -0
- package/site/dist/assets/utils-DdckVfQr.js +1 -0
- package/site/dist/assets/w3m-modal-BeVrBOIf.js +1174 -0
- package/site/dist/assets/wallet-Bn85Sg2W.js +1 -0
- package/site/dist/assets/wallet-DMLc-ukR.js +2 -0
- package/site/dist/assets/wallet-connect-BvJtUsDt-Y03hhqFN.js +1 -0
- package/site/dist/assets/walletconnect-registry-xxG8XLCb-D1SSFvMp.js +1 -0
- package/site/dist/assets/walletconnect-v2-3frQFwbg-CrtLXofr.js +12 -0
- package/site/dist/assets/wui-ux-by-reown-D34ILNLS.js +1147 -0
- package/site/dist/assets/x-rlSp9U7W.js +1 -0
- package/site/dist/index.html +6 -6
- package/src/agent/view-tools.js +5 -8
- package/src/agent/x402.js +11 -0
- package/src/core/embed.js +33 -8
- package/src/discover/explore.js +20 -15
- package/src/publish/lint.js +55 -6
- package/src/publish/ship.js +4 -4
- package/src/publish/view.js +9 -7
- package/site/dist/assets/__vite-browser-external-CKnVkMRn.js +0 -1
- package/site/dist/assets/embed.worker-CZXpLhAu.js +0 -1
- package/site/dist/assets/index-oyUqokZh.js +0 -8
- package/site/dist/assets/preload-helper-BaNbYf_w.js +0 -1
- package/site/dist/assets/rolldown-runtime-Dd_uD5pT.js +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as e}from"./createLucideIcon-IPW50ckY.js";var t=e(`x`,[[`path`,{d:`M18 6 6 18`,key:`1bl5f8`}],[`path`,{d:`m6 6 12 12`,key:`d8bk6v`}]]);export{t};
|
package/site/dist/index.html
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
<!doctype html>
|
|
2
2
|
<html lang="en">
|
|
3
|
-
<script type="module" crossorigin src="./assets/index-
|
|
4
|
-
<link rel="modulepreload" crossorigin href="./assets/rolldown-runtime-
|
|
5
|
-
<link rel="modulepreload" crossorigin href="./assets/preload-helper-
|
|
3
|
+
<script type="module" crossorigin src="./assets/index-B5YmgwLH.js"></script>
|
|
4
|
+
<link rel="modulepreload" crossorigin href="./assets/rolldown-runtime-BcKkbAw3.js">
|
|
5
|
+
<link rel="modulepreload" crossorigin href="./assets/preload-helper-uBIymjUX.js">
|
|
6
6
|
<link rel="modulepreload" crossorigin href="./assets/roles-C9V_uDr_.js">
|
|
7
7
|
|
|
8
8
|
<meta charset="utf-8">
|
|
9
9
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
10
10
|
<title>Fangorn app</title>
|
|
11
|
-
<style>:root{--bg:#fbfbf8;--fg:#1a1c19;--muted:#6a6f68;--line:#dfe1db;--accent:#2f5d45;--mark:#e6eedb;--hot:#b4432f;--edge:#b7bab2;--font:system-ui, sans-serif;--font-display:var(--font);--radius:3px;--gutter:16px;--measure:760px;--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light}@media (prefers-color-scheme:dark){:root:not([data-theme=light]){--bg:#121412;--fg:#e4e6e0;--muted:#959a92;--line:#2a2e29;--accent:#8fbf9f;--mark:#2d3b2a;--hot:#d9674f;--edge:#4b5049;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}}*{box-sizing:border-box}body{background:var(--bg);color:var(--fg);font:16px/1.5 var(--font);margin:0}a{color:var(--accent)}button,input{font:inherit;color:inherit}button{cursor:pointer;border:1px solid var(--line);border-radius:var(--radius);background:0 0;padding:4px 10px}button:disabled{opacity:.45;cursor:default}:focus-visible{outline:2px solid var(--accent);outline-offset:2px}ul{margin:0;padding:0;list-style:none}h2{text-transform:uppercase;letter-spacing:.08em;color:var(--muted);margin:28px 0 8px;font-size:.75rem;font-weight:600}h2.page,.record h2{font:600 1.3rem/1.3 var(--font-display);text-transform:none;letter-spacing:0;color:var(--fg);margin:4px 0 12px}h3{margin:0;font-size:1rem}small,time,.hint,.empty,.about,#status,.resultsbar,.detail{color:var(--muted)}small,time,.hint{font-size:.8rem}.detail{margin:0;font-size:.9rem}mark{background:var(--mark);color:inherit}.bar{z-index:2;background:var(--bg);border-bottom:1px solid var(--line);position:sticky;top:0}.bar>div,main,footer{max-width:var(--measure);padding-inline:var(--gutter);margin:0 auto}.bar>div{flex-wrap:wrap;align-items:center;gap:12px;padding-block:10px;display:flex}#home{color:var(--fg);font:600 1.1rem var(--font-display);white-space:nowrap;text-decoration:none}#q{flex:240px}#q input{border:1px solid var(--line);border-radius:var(--radius);background:0 0;width:100%;padding:8px 10px}nav{gap:14px;font-size:.9rem;display:flex}nav a{color:var(--muted);text-decoration:none}nav a.on,nav a:hover{color:var(--fg)}main{padding-block:16px 48px}.list,article{border-top:1px solid var(--line)}.row{border-bottom:1px solid var(--line);align-items:flex-start;gap:10px;padding:10px 0;display:flex}.main{overflow-wrap:anywhere;flex-direction:column;flex:1;gap:2px;min-width:0;display:flex}.title{color:var(--fg);font-weight:500;text-decoration:none}.title:hover{color:var(--accent)}.resultsbar{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px;margin-bottom:8px;font-size:.9rem;display:flex}.sort,.chips,.acts,.votes{flex-wrap:wrap;align-items:center;gap:6px;display:flex}.chips{margin:4px 0 16px}.chip{padding:2px 10px;font-size:.85rem}.chip.on,.vote[aria-pressed=true]{border-color:var(--accent);background:var(--mark)}.vote{padding:2px 7px;line-height:1.3}.more,.linkish{color:var(--accent);border:0;padding:8px 0 0;font-size:.9rem}.act{color:var(--fg);border:1px solid var(--line);border-radius:var(--radius);padding:4px 10px;font-size:.88rem;text-decoration:none}article{padding:12px 0 4px}article header{flex-direction:column;margin-bottom:4px;display:flex}article .list{border-top:0}article .row:last-child{border-bottom:0}.record{border-top:0}.record dl{grid-template-columns:max-content 1fr;gap:2px 14px;margin:12px 0;font-size:.88rem;display:grid}.record dt{color:var(--muted);text-transform:capitalize}.record dd{margin:0}.acts{margin:12px 0 4px}.doc iframe{border:1px solid var(--line);background:#fff;width:100%;height:80vh;margin-top:12px}.taste{margin-bottom:20px}.pills{flex-wrap:wrap;gap:6px;margin:6px 0;display:flex}.pills li{border:1px solid var(--line);border-radius:var(--radius);align-items:center;gap:2px;padding:0 0 0 8px;font-size:.85rem;display:inline-flex}.pills li.no{color:var(--muted);text-decoration:line-through}.pills button{color:var(--muted);border:0;padding:0 8px}.knobs{grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:12px;margin:12px 0;display:grid}.knob{gap:2px;font-size:.85rem;display:grid}.knob span{justify-content:space-between;font-weight:600;display:flex}.knob input{width:100%;accent-color:var(--accent)}body.wide{--measure:1200px}.mapbar input{border:1px solid var(--line);border-radius:var(--radius);background:0 0;width:100%;margin-bottom:8px;padding:8px 10px}.mapwrap{grid-template-columns:minmax(0,1fr) minmax(0,1fr);align-items:start;gap:16px;display:grid}@media (width<=760px){.mapwrap{grid-template-columns:1fr}}svg.map{width:100%;height:auto;display:block;position:sticky;top:70px}svg.map path{stroke:var(--edge);stroke-width:.8px;cursor:pointer}svg.map path:hover,svg.map path:focus{stroke:var(--accent);stroke-width:2px;outline:none}svg.map path.near{stroke:var(--accent);stroke-width:2px;stroke-dasharray:4 3}svg.map path.on{stroke:var(--fg);stroke-width:2.6px}.h0{fill:var(--bg);background:var(--bg)}.h1{fill:color-mix(in srgb, var(--hot) 18%, var(--bg));background:color-mix(in srgb, var(--hot) 18%, var(--bg))}.h2{fill:color-mix(in srgb, var(--hot) 36%, var(--bg));background:color-mix(in srgb, var(--hot) 36%, var(--bg))}.h3{fill:color-mix(in srgb, var(--hot) 56%, var(--bg));background:color-mix(in srgb, var(--hot) 56%, var(--bg))}.h4{fill:color-mix(in srgb, var(--hot) 78%, var(--bg));background:color-mix(in srgb, var(--hot) 78%, var(--bg))}.h5{fill:var(--hot);background:var(--hot)}.sw{border:1px solid var(--edge);vertical-align:-1px;width:14px;height:12px;display:inline-block}.panel h3{margin:4px 0}.panel .chips{margin:6px 0}.panel .list{margin-top:8px}footer{color:var(--muted);padding-block:0 32px;font-size:.8rem}</style>
|
|
11
|
+
<style>:root{--bg:#fbfbf8;--fg:#1a1c19;--muted:#6a6f68;--line:#dfe1db;--accent:#2f5d45;--mark:#e6eedb;--hot:#b4432f;--edge:#b7bab2;--font:system-ui, sans-serif;--font-display:var(--font);--radius:3px;--gutter:16px;--measure:760px;--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light}@media (prefers-color-scheme:dark){:root:not([data-theme=light]){--bg:#121412;--fg:#e4e6e0;--muted:#959a92;--line:#2a2e29;--accent:#8fbf9f;--mark:#2d3b2a;--hot:#d9674f;--edge:#4b5049;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}}*{box-sizing:border-box}body{background:var(--bg);color:var(--fg);font:16px/1.5 var(--font);margin:0}a{color:var(--accent)}button,input{font:inherit;color:inherit}button{cursor:pointer;border:1px solid var(--line);border-radius:var(--radius);background:0 0;padding:4px 10px}button:disabled{opacity:.45;cursor:default}:focus-visible{outline:2px solid var(--accent);outline-offset:2px}ul{margin:0;padding:0;list-style:none}h2{text-transform:uppercase;letter-spacing:.08em;color:var(--muted);margin:28px 0 8px;font-size:.75rem;font-weight:600}h2.page,.record h2{font:600 1.3rem/1.3 var(--font-display);text-transform:none;letter-spacing:0;color:var(--fg);margin:4px 0 12px}h3{margin:0;font-size:1rem}small,time,.hint,.empty,.about,#status,.resultsbar,.detail{color:var(--muted)}small,time,.hint{font-size:.8rem}.paid{border:1px solid var(--line);border-radius:var(--radius);gap:6px;margin:12px 0;padding:10px 14px;display:grid}.paid h3{margin:0;font-size:1rem}.paid ul{margin:0;padding-left:18px}.detail{margin:0;font-size:.9rem}mark{background:var(--mark);color:inherit}.bar{z-index:2;background:var(--bg);border-bottom:1px solid var(--line);position:sticky;top:0}.bar>div,main,footer{max-width:var(--measure);padding-inline:var(--gutter);margin:0 auto}.bar>div{flex-wrap:wrap;align-items:center;gap:12px;padding-block:10px;display:flex}#home{color:var(--fg);font:600 1.1rem var(--font-display);white-space:nowrap;text-decoration:none}#q{flex:240px}#q input{border:1px solid var(--line);border-radius:var(--radius);background:0 0;width:100%;padding:8px 10px}nav{gap:14px;font-size:.9rem;display:flex}nav a{color:var(--muted);text-decoration:none}nav a.on,nav a:hover{color:var(--fg)}main{padding-block:16px 48px}.list,article{border-top:1px solid var(--line)}.row{border-bottom:1px solid var(--line);align-items:flex-start;gap:10px;padding:10px 0;display:flex}.main{overflow-wrap:anywhere;flex-direction:column;flex:1;gap:2px;min-width:0;display:flex}.title{color:var(--fg);font-weight:500;text-decoration:none}.title:hover{color:var(--accent)}.resultsbar{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px;margin-bottom:8px;font-size:.9rem;display:flex}.sort,.chips,.acts,.votes{flex-wrap:wrap;align-items:center;gap:6px;display:flex}.chips{margin:4px 0 16px}.picker{color:var(--muted);flex-direction:column;gap:4px;margin:4px 0 16px;font-size:.85rem;display:inline-flex}.picker select{font:inherit;color:var(--fg);background:var(--bg);border:1px solid var(--edge);border-radius:var(--radius);min-width:min(320px,100%);padding:6px 10px;font-size:1rem}details.about summary{cursor:pointer;color:var(--fg);font-size:1.05rem}details.about p{color:var(--muted);margin:6px 0 0}.chip{padding:2px 10px;font-size:.85rem}.chip.on,.vote[aria-pressed=true]{border-color:var(--accent);background:var(--mark)}.vote{padding:2px 7px;line-height:1.3}.star{color:var(--muted);border:0;padding:4px 6px;font-size:1.25rem;line-height:1}.star[aria-pressed=true]{color:var(--accent);background:0 0}.more,.linkish{color:var(--accent);border:0;padding:8px 0 0;font-size:.9rem}.act{color:var(--fg);border:1px solid var(--line);border-radius:var(--radius);padding:4px 10px;font-size:.88rem;text-decoration:none}article{padding:12px 0 4px}article header{flex-direction:column;margin-bottom:4px;display:flex}article .list{border-top:0}article .row:last-child{border-bottom:0}.record{border-top:0}.record dl{grid-template-columns:max-content 1fr;gap:2px 14px;margin:12px 0;font-size:.88rem;display:grid}.record dt{color:var(--muted);text-transform:capitalize}.record dd{margin:0}.acts{margin:12px 0 4px}.doc iframe{border:1px solid var(--line);background:#fff;width:100%;height:80vh;margin-top:12px}.taste{margin-bottom:20px}.pills{flex-wrap:wrap;gap:6px;margin:6px 0;display:flex}.pills li{border:1px solid var(--line);border-radius:var(--radius);align-items:center;gap:2px;padding:0 0 0 8px;font-size:.85rem;display:inline-flex}.pills li.no{color:var(--muted);text-decoration:line-through}.pills button{color:var(--muted);border:0;padding:0 8px}.knobs{grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:12px;margin:12px 0;display:grid}.knob{gap:2px;font-size:.85rem;display:grid}.knob span{justify-content:space-between;font-weight:600;display:flex}.knob input{width:100%;accent-color:var(--accent)}body.wide{--measure:1200px}.mapbar input{border:1px solid var(--line);border-radius:var(--radius);background:0 0;width:100%;margin-bottom:8px;padding:8px 10px}.mapwrap{grid-template-columns:minmax(0,1fr) minmax(0,1fr);align-items:start;gap:16px;display:grid}@media (width<=760px){.mapwrap{grid-template-columns:1fr}}svg.map{width:100%;height:auto;display:block;position:sticky;top:70px}svg.map path{stroke:var(--edge);stroke-width:.8px;cursor:pointer}svg.map path:hover,svg.map path:focus{stroke:var(--accent);stroke-width:2px;outline:none}svg.map path.near{stroke:var(--accent);stroke-width:2px;stroke-dasharray:4 3}svg.map path.on{stroke:var(--fg);stroke-width:2.6px}.h0{fill:var(--bg);background:var(--bg)}.h1{fill:color-mix(in srgb, var(--hot) 18%, var(--bg));background:color-mix(in srgb, var(--hot) 18%, var(--bg))}.h2{fill:color-mix(in srgb, var(--hot) 36%, var(--bg));background:color-mix(in srgb, var(--hot) 36%, var(--bg))}.h3{fill:color-mix(in srgb, var(--hot) 56%, var(--bg));background:color-mix(in srgb, var(--hot) 56%, var(--bg))}.h4{fill:color-mix(in srgb, var(--hot) 78%, var(--bg));background:color-mix(in srgb, var(--hot) 78%, var(--bg))}.h5{fill:var(--hot);background:var(--hot)}.sw{border:1px solid var(--edge);vertical-align:-1px;width:14px;height:12px;display:inline-block}.panel h3{margin:4px 0}.panel .chips{margin:6px 0}.panel .list{margin-top:8px}footer{color:var(--muted);padding-block:0 32px;font-size:.8rem}</style>
|
|
12
12
|
<link rel="stylesheet" href="./theme.css">
|
|
13
13
|
<header class="bar"><div>
|
|
14
14
|
<a id="home" href="#/"><span id="name">Fangorn app</span></a>
|
|
15
15
|
<form id="q" role="search"><input type="search" disabled placeholder="Loading…" aria-label="Search"></form>
|
|
16
|
-
<nav><a href="#/for-you">For you</a><a href="#/saved">
|
|
16
|
+
<nav><a href="#/for-you">For you</a><a href="#/saved">Saved<span id="nsaved"></span></a><a href="#/history">History</a><a href="#/wallet" id="walletlink" hidden>Wallet</a></nav>
|
|
17
17
|
</div></header>
|
|
18
18
|
<main id="view"><p id="status">Loading the data…</p></main>
|
|
19
|
-
<footer>Search runs in your browser; your searches
|
|
19
|
+
<footer>Search runs in your browser; your searches and saved records stay on this device unless you export them.
|
|
20
20
|
Documents are the publishers' own, shown as they published them. Agents: <a href="./.well-known/agent-card.json">agent card</a>.</footer>
|
|
21
21
|
</html>
|
package/src/agent/view-tools.js
CHANGED
|
@@ -178,16 +178,13 @@ export function viewTools(app, { fetchCatalog = fetch } = {}) {
|
|
|
178
178
|
if (!id) throw new Error("id is required");
|
|
179
179
|
const hit = loadedRows().find(({ r, view }) => r.id === id || r[rolesOf(view).identity] === id);
|
|
180
180
|
const key = hit ? hit.r[rolesOf(hit.view).identity] ?? id : id;
|
|
181
|
-
const {
|
|
182
|
-
const r = await payAndFetch(p.url.replace("{id}", encodeURIComponent(key)),
|
|
183
|
-
{ privateKey: process.env.FANGORN_MCP_WALLET_KEY, maxPrice: cap });
|
|
184
|
-
if (r.status !== 200) return { id: key, error: `HTTP ${r.status}: ${r.body.slice(0, 200)}` };
|
|
185
|
-
const digest = [...new Uint8Array(await crypto.subtle.digest("SHA-256", new TextEncoder().encode(r.body)))]
|
|
186
|
-
.map((b) => b.toString(16).padStart(2, "0")).join("");
|
|
181
|
+
const { buyRecord } = await import("./x402.js");
|
|
187
182
|
const want = hit?.r.paid_sha256;
|
|
183
|
+
const r = await buyRecord(p, key, { want, privateKey: process.env.FANGORN_MCP_WALLET_KEY, maxPrice: cap });
|
|
184
|
+
if (r.error) return r;
|
|
188
185
|
return { id: key, paid: r.price ? price : "free", transaction: r.receipt?.transaction ?? null, network: r.receipt?.network ?? p.network,
|
|
189
|
-
verified: want ? (
|
|
190
|
-
record:
|
|
186
|
+
verified: want ? (r.verified ? "matches the published sha256" : `MISMATCH: published ${want}, got ${r.digest}`) : "not checked (search for the record first)",
|
|
187
|
+
record: r.record };
|
|
191
188
|
};
|
|
192
189
|
tools.push({ name: "buy", description: `Buy one ${n} record's paid detail for ${price} (x402 on ${p.network}): ${p.description || "the structured record"}. ` +
|
|
193
190
|
"Pass an id from search. Paid from this server's wallet (FANGORN_MCP_WALLET_KEY), never above FANGORN_MCP_MAX_PRICE.",
|
package/src/agent/x402.js
CHANGED
|
@@ -62,6 +62,17 @@ export async function payAndFetch(url, { privateKey, account, maxPrice, fetchImp
|
|
|
62
62
|
return { status: paid.status, body, price: req.maxAmountRequired, receipt: receiptHeader ? JSON.parse(unb64(receiptHeader)) : null };
|
|
63
63
|
}
|
|
64
64
|
|
|
65
|
+
/** Buy one record an app sells (its agent card's `paid`) and check it against the sha256 the
|
|
66
|
+
* app published for it (`want`, the row's `paid_sha256`): what was paid for is what was
|
|
67
|
+
* committed. Shared by fangorn-mcp's `buy` and the stock page. */
|
|
68
|
+
export async function buyRecord(paid, key, { want, account, privateKey, maxPrice = paid.price, fetchImpl } = {}) {
|
|
69
|
+
const r = await payAndFetch(paid.url.replace("{id}", encodeURIComponent(key)), { account, privateKey, maxPrice, fetchImpl });
|
|
70
|
+
if (r.status !== 200) return { id: key, error: `HTTP ${r.status}: ${r.body.slice(0, 200)}` };
|
|
71
|
+
const digest = [...new Uint8Array(await crypto.subtle.digest("SHA-256", new TextEncoder().encode(r.body)))]
|
|
72
|
+
.map((b) => b.toString(16).padStart(2, "0")).join("");
|
|
73
|
+
return { id: key, price: r.price, receipt: r.receipt, digest, verified: want ? want === digest : null, record: JSON.parse(r.body) };
|
|
74
|
+
}
|
|
75
|
+
|
|
65
76
|
// ── self-check: `node src/agent/x402.js` — a stand-in seller that checks the signature ──
|
|
66
77
|
if (typeof process !== "undefined" && import.meta.url === `file://${process.argv[1]}` && process.argv[1].endsWith("/x402.js")) {
|
|
67
78
|
const { privateKeyToAccount, generatePrivateKey } = await import("viem/accounts");
|
package/src/core/embed.js
CHANGED
|
@@ -13,6 +13,11 @@
|
|
|
13
13
|
|
|
14
14
|
const MODEL = "nomic-ai/nomic-embed-text-v1.5";
|
|
15
15
|
const DIM = 256;
|
|
16
|
+
// The document side's precision. q8 everywhere by default (the browser's queries are q8).
|
|
17
|
+
// WESTMARCH_EMBED_DTYPE=fp16 is a different encoder (~0.96 cosine to q8): a view records it
|
|
18
|
+
// and refuses to mix the two (view.js), so switching an app is one --rebake.
|
|
19
|
+
const DTYPE = globalThis.process?.env?.WESTMARCH_EMBED_DTYPE ?? "q8";
|
|
20
|
+
export const EMBED_DTYPE = DTYPE;
|
|
16
21
|
|
|
17
22
|
// Stamped onto every vector a publisher commits. Vectors from different models
|
|
18
23
|
// (or dims) are not comparable — cosine between them is noise, and silently so.
|
|
@@ -25,10 +30,11 @@ let _extractor = null;
|
|
|
25
30
|
const extractor = () => (_extractor ??= (async () => {
|
|
26
31
|
const { pipeline } = await import("@huggingface/transformers");
|
|
27
32
|
// WESTMARCH_EMBED_DEVICE=cuda puts the publisher's document side on a GPU (Node only; needs
|
|
28
|
-
// onnxruntime-node's CUDA binaries
|
|
29
|
-
//
|
|
33
|
+
// onnxruntime-node's CUDA binaries and the matching CUDA runtime, cuBLAS, cuRAND and cuDNN on
|
|
34
|
+
// LD_LIBRARY_PATH). q8's integer ops do not run on CUDA, so q8 there is slower than on CPU:
|
|
35
|
+
// pair it with WESTMARCH_EMBED_DTYPE=fp16, which is ~4x faster than CPU q8, batched.
|
|
30
36
|
const device = globalThis.process?.env?.WESTMARCH_EMBED_DEVICE;
|
|
31
|
-
return pipeline("feature-extraction", MODEL, { dtype:
|
|
37
|
+
return pipeline("feature-extraction", MODEL, { dtype: DTYPE, ...(device && { device }) });
|
|
32
38
|
})());
|
|
33
39
|
|
|
34
40
|
/** Standardize over the full vector, slice to `dim`, L2-normalize the slice. */
|
|
@@ -59,11 +65,30 @@ export async function embedQueryDirect(text) {
|
|
|
59
65
|
return matryoshka(output.data);
|
|
60
66
|
}
|
|
61
67
|
|
|
62
|
-
/** One document, in-process.
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
68
|
+
/** One document, in-process. Calls made together are embedded as one batch (a GPU's
|
|
69
|
+
* speed); q8 stays at batch 1, since batching moves its activation quantization. */
|
|
70
|
+
export function embedDocumentDirect(text) {
|
|
71
|
+
return new Promise((resolve, reject) => {
|
|
72
|
+
pending.push({ text, resolve, reject });
|
|
73
|
+
if (pending.length === 1) setTimeout(flushDocuments, 0);
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
const BATCH = DTYPE === "q8" ? 1 : 32;
|
|
77
|
+
let pending = [];
|
|
78
|
+
async function flushDocuments() {
|
|
79
|
+
const all = pending;
|
|
80
|
+
pending = [];
|
|
81
|
+
try {
|
|
82
|
+
const ex = await extractor();
|
|
83
|
+
for (let i = 0; i < all.length; i += BATCH) {
|
|
84
|
+
const part = all.slice(i, i + BATCH);
|
|
85
|
+
const output = await ex(part.map((p) => `search_document: ${p.text}`), { pooling: "mean", normalize: false });
|
|
86
|
+
const d = output.dims.at(-1);
|
|
87
|
+
part.forEach((p, j) => p.resolve(matryoshka(output.data.slice(j * d, (j + 1) * d))));
|
|
88
|
+
}
|
|
89
|
+
} catch (e) {
|
|
90
|
+
for (const p of all) p.reject(e);
|
|
91
|
+
}
|
|
67
92
|
}
|
|
68
93
|
|
|
69
94
|
/** Load the model in-process, and settle when it is actually ready. */
|
package/src/discover/explore.js
CHANGED
|
@@ -122,8 +122,12 @@ async function getLogsSince(client, start, filter) {
|
|
|
122
122
|
/**
|
|
123
123
|
* Every verified app, with its 8004 agent, reputation, and catalog.
|
|
124
124
|
* Unverified apps are dropped, not listed; `dropped` says why, for debugging.
|
|
125
|
+
*
|
|
126
|
+
* `onUpdate({ apps, pending })`, if given, is called once the bindings are read
|
|
127
|
+
* and again as each app lands or drops, so a page can show apps as they arrive.
|
|
128
|
+
* `pending` counts the bound apps not yet settled.
|
|
125
129
|
*/
|
|
126
|
-
export async function readDirectory(client, { chain = CHAIN } = {}) {
|
|
130
|
+
export async function readDirectory(client, { chain = CHAIN, onUpdate = () => {} } = {}) {
|
|
127
131
|
const [bindLogs, regLogs] = await Promise.all([
|
|
128
132
|
getLogsSince(client, chain.appRegistryFrom ?? 0n, { address: chain.appRegistry, event: APP_AGENT_CHANGED }),
|
|
129
133
|
getLogsSince(client, chain.identityFrom ?? 0n, { address: chain.identity, event: REGISTERED }),
|
|
@@ -131,23 +135,24 @@ export async function readDirectory(client, { chain = CHAIN } = {}) {
|
|
|
131
135
|
const registered = regLogs.map((l) => ({ agentId: l.args.agentId, owner: l.args.owner, block: l.blockNumber }));
|
|
132
136
|
const latest = new Map(); // logs come oldest first: the last write wins
|
|
133
137
|
for (const l of bindLogs) latest.set(l.args.app_id, { uri: l.args.agent_uri, block: l.blockNumber });
|
|
138
|
+
const bound = [...latest].filter(([, { uri }]) => uri); // an empty uri is unbound on purpose
|
|
134
139
|
|
|
135
|
-
//
|
|
136
|
-
//
|
|
137
|
-
//
|
|
138
|
-
const dropped = [];
|
|
139
|
-
|
|
140
|
-
|
|
140
|
+
// One pipeline per app, so the quick ones need not wait on Quorum's 1.7 MB
|
|
141
|
+
// catalog. Only a card failure drops an app; an owner or catalog that fails
|
|
142
|
+
// leaves it listed with less to say about it.
|
|
143
|
+
const apps = [], dropped = [];
|
|
144
|
+
let pending = bound.length;
|
|
145
|
+
const settle = () => { pending--; apps.sort((a, b) => a.name.localeCompare(b.name)); onUpdate({ apps: [...apps], pending }); };
|
|
146
|
+
onUpdate({ apps: [], pending });
|
|
147
|
+
await Promise.all(bound.map(async ([appId, { uri, block }]) => {
|
|
148
|
+
let card;
|
|
141
149
|
try {
|
|
142
150
|
if (!/^https:\/\//.test(uri)) throw new Error("card is not https");
|
|
143
|
-
|
|
151
|
+
card = await json(uri);
|
|
144
152
|
const why = verifyCard(card, appId, chain);
|
|
145
153
|
if (why) throw new Error(why);
|
|
146
|
-
|
|
147
|
-
} catch (e) { dropped.push({ card: uri, why: e?.message ?? String(e) }); return null; }
|
|
148
|
-
}))).filter(Boolean);
|
|
154
|
+
} catch (e) { dropped.push({ card: uri, why: e?.message ?? String(e) }); return settle(); }
|
|
149
155
|
|
|
150
|
-
const apps = await Promise.all(verified.map(async ({ appId, uri, block, card }) => {
|
|
151
156
|
const p = card.capabilities.extensions.find((e) => e.uri === APP_EXTENSION).params;
|
|
152
157
|
const [[owner, agentId, rep], { corpora, unreachable }] = await Promise.all([
|
|
153
158
|
client.readContract({ address: chain.appRegistry, abi: APPS, functionName: "getAppOwner", args: [appId] }).catch(() => null)
|
|
@@ -158,7 +163,7 @@ export async function readDirectory(client, { chain = CHAIN } = {}) {
|
|
|
158
163
|
survey((p.views ?? []).filter((v) => /^https:\/\//.test(v))),
|
|
159
164
|
]);
|
|
160
165
|
const name = typeof card.name === "string" && card.name.trim() ? card.name.trim() : `App ${appId.slice(0, 10)}`;
|
|
161
|
-
|
|
166
|
+
apps.push({
|
|
162
167
|
app: slug(name), name, description: typeof card.description === "string" ? card.description : "",
|
|
163
168
|
site: https(card.url), card: uri, appId, owner,
|
|
164
169
|
boundAt: Number(block), fromBlock: Number(p.fromBlock),
|
|
@@ -169,9 +174,9 @@ export async function readDirectory(client, { chain = CHAIN } = {}) {
|
|
|
169
174
|
rows: corpora.length ? corpora.reduce((n, c) => n + (c.rows || 0), 0) : null,
|
|
170
175
|
unreachable: unreachable.length,
|
|
171
176
|
domains: corpora.map((c) => ({ name: c.domain, description: c.description, rows: c.rows, coverage: c.coverage, model: c.model })),
|
|
172
|
-
};
|
|
177
|
+
});
|
|
178
|
+
settle();
|
|
173
179
|
}));
|
|
174
|
-
apps.sort((a, b) => a.name.localeCompare(b.name));
|
|
175
180
|
return { apps, dropped };
|
|
176
181
|
}
|
|
177
182
|
|
package/src/publish/lint.js
CHANGED
|
@@ -18,9 +18,9 @@
|
|
|
18
18
|
// there are three real outcomes — the reader cannot find you, they find you and
|
|
19
19
|
// cannot read you, or they read you and cannot go anywhere.
|
|
20
20
|
|
|
21
|
-
import { configure, loadShard, resetShard, trimView } from "../core/shard.js";
|
|
21
|
+
import { configure, loadShard, resetShard, setDomains, trimView } from "../core/shard.js";
|
|
22
22
|
import { shapeOf } from "../agent/ui.js";
|
|
23
|
-
import { inSample, rolesFrom, textOf } from "../core/roles.js";
|
|
23
|
+
import { inSample, linkOf, rolesFrom, textOf } from "../core/roles.js";
|
|
24
24
|
|
|
25
25
|
/** The model every corpus on this network is baked with. Cosine between two
|
|
26
26
|
* models' vectors is noise that still looks like a score, so a mismatch is not
|
|
@@ -63,14 +63,37 @@ async function served(url, { bytes = null, timeoutMs = 8000 } = {}) {
|
|
|
63
63
|
finally { clearTimeout(t); }
|
|
64
64
|
}
|
|
65
65
|
|
|
66
|
+
/** Does a row's link open for a person? A GET that follows redirects. An error status says
|
|
67
|
+
* no, and so does a body too small to be a page or a document: Legistar answers a link built
|
|
68
|
+
* from the wrong id with HTTP 200 and the 19 bytes "Invalid parameters!". Returns why not,
|
|
69
|
+
* or null. Only the first ~1 KB is read. */
|
|
70
|
+
async function opens(url, timeoutMs = 15000) {
|
|
71
|
+
const ctl = new AbortController();
|
|
72
|
+
const t = setTimeout(() => ctl.abort(), timeoutMs);
|
|
73
|
+
try {
|
|
74
|
+
const res = await fetch(url, { redirect: "follow", signal: ctl.signal });
|
|
75
|
+
if (!res.ok) return `HTTP ${res.status}`;
|
|
76
|
+
let n = 0;
|
|
77
|
+
const reader = res.body?.getReader();
|
|
78
|
+
while (reader && n < 1024) { const { done, value } = await reader.read(); if (done) break; n += value.length; }
|
|
79
|
+
reader?.cancel().catch(() => {});
|
|
80
|
+
return n < 300 ? `answered with ${n} bytes` : null;
|
|
81
|
+
} catch (e) { return e.name === "AbortError" ? "timed out" : e.message; }
|
|
82
|
+
finally { clearTimeout(t); }
|
|
83
|
+
}
|
|
84
|
+
|
|
66
85
|
/**
|
|
67
86
|
* Lint one baked view.
|
|
68
87
|
*
|
|
69
88
|
* `rows` samples the free shard — the only way to catch a paywall that lies and
|
|
70
89
|
* vectors that are not there. It is the free index, the same bytes any reader
|
|
71
90
|
* downloads, but it is the slow part; pass `rows: false` for catalog-only.
|
|
91
|
+
*
|
|
92
|
+
* `links` opens a few sampled rows' links on the source sites: a link that is
|
|
93
|
+
* built wrong looks fine in every record and fails only for the person who
|
|
94
|
+
* follows it. Off by default, since it reaches other people's servers.
|
|
72
95
|
*/
|
|
73
|
-
export async function lint(view, { rows = true, model = NETWORK_MODEL, timeoutMs } = {}) {
|
|
96
|
+
export async function lint(view, { rows = true, links = false, model = NETWORK_MODEL, timeoutMs } = {}) {
|
|
74
97
|
const at = trimView(view);
|
|
75
98
|
const found = [];
|
|
76
99
|
let cat;
|
|
@@ -182,6 +205,10 @@ export async function lint(view, { rows = true, model = NETWORK_MODEL, timeoutMs
|
|
|
182
205
|
|
|
183
206
|
if (rows) {
|
|
184
207
|
resetShard();
|
|
208
|
+
// This domain's rows, not the first 2,000 of the whole view (which every domain
|
|
209
|
+
// used to be graded on, reloaded once per domain). ponytail: setDomains also
|
|
210
|
+
// matches by prefix, so "…-milwaukee" brings "…-milwaukee-county" along; mild for a sample.
|
|
211
|
+
setDomains([d.name]);
|
|
185
212
|
// The text role is evaluated AT PARSE TIME, so a lint that does not
|
|
186
213
|
// wire it reads the default sniff and grades a corpus on prose the
|
|
187
214
|
// publisher never declared. (This file had that bug too, which is
|
|
@@ -276,6 +303,18 @@ export async function lint(view, { rows = true, model = NETWORK_MODEL, timeoutMs
|
|
|
276
303
|
// any row, which is exactly the dead end the rule is looking for,
|
|
277
304
|
// and a manifest-only check would have passed it.
|
|
278
305
|
deadEnd(sample.filter((r) => shapeOf(r, roles) !== "read").length);
|
|
306
|
+
|
|
307
|
+
// Having a link is not the same as the link opening. Three, spread across the
|
|
308
|
+
// sample, one at a time: enough to catch a link built wrong for every row.
|
|
309
|
+
if (links) {
|
|
310
|
+
const urls = sample.map((r) => linkOf(r, roles)).filter(Boolean);
|
|
311
|
+
const picks = [...new Set([0, 0.5, 0.99].map((q) => urls[Math.floor(q * urls.length)]))].filter(Boolean);
|
|
312
|
+
const bad = [];
|
|
313
|
+
for (const u of picks) { const why = await opens(u, timeoutMs); if (why) bad.push(`${u} (${why})`); }
|
|
314
|
+
if (bad.length) add("degrades", `${bad.length} of ${picks.length} sampled links do not open`,
|
|
315
|
+
`${bad.join("; ")}. A reader who follows them lands on an error, and nothing else looks wrong.`,
|
|
316
|
+
"Check how the link is built (presentation.externalUrl, or the rows' own url field) against the source site.");
|
|
317
|
+
}
|
|
279
318
|
} else {
|
|
280
319
|
deadEnd(0);
|
|
281
320
|
}
|
|
@@ -310,7 +349,7 @@ export function format(r) {
|
|
|
310
349
|
if (typeof process !== "undefined" && import.meta.url === `file://${process.argv[1]}` && process.argv[1].endsWith("/lint.js")) {
|
|
311
350
|
const arg = process.argv.slice(2).find((a) => !a.startsWith("--"));
|
|
312
351
|
if (arg) {
|
|
313
|
-
console.log(format(await lint(arg, { rows: !process.argv.includes("--no-rows") })));
|
|
352
|
+
console.log(format(await lint(arg, { rows: !process.argv.includes("--no-rows"), links: process.argv.includes("--links") })));
|
|
314
353
|
process.exit(0);
|
|
315
354
|
}
|
|
316
355
|
|
|
@@ -325,7 +364,9 @@ if (typeof process !== "undefined" && import.meta.url === `file://${process.argv
|
|
|
325
364
|
|
|
326
365
|
let CATALOG = null, MANIFEST = null, ROWS = [], LOCKED_SERVED = true;
|
|
327
366
|
globalThis.fetch = async (url) => {
|
|
328
|
-
const { pathname } = new URL(String(url), "https://ok.test");
|
|
367
|
+
const { pathname, hostname } = new URL(String(url), "https://ok.test");
|
|
368
|
+
// A source site: /bad answers as Legistar does to a link built from the wrong id.
|
|
369
|
+
if (hostname === "src.test") return body(pathname === "/bad" ? "Invalid parameters!" : `<!doctype html>${"x".repeat(600)}`);
|
|
329
370
|
if (!CATALOG) return { ok: false, status: 404, headers: new Headers() };
|
|
330
371
|
if (pathname.endsWith("/cdn/catalog")) return body(CATALOG);
|
|
331
372
|
if (/\/cdn\/domains\/[^/]+\/manifest$/.test(pathname)) return MANIFEST ? body(MANIFEST) : { ok: false, status: 404, headers: new Headers() };
|
|
@@ -495,7 +536,15 @@ if (typeof process !== "undefined" && import.meta.url === `file://${process.argv
|
|
|
495
536
|
if (!r.domains[0].findings.find((f) => f.what.includes("ships anyway")).why.includes("1 of 2")) throw new Error("say how many rows leaked, not just which fields");
|
|
496
537
|
|
|
497
538
|
if (!format(r).includes("films")) throw new Error("the report must name the domain");
|
|
539
|
+
|
|
540
|
+
// Links that every record carries and none of which open.
|
|
541
|
+
MANIFEST = { name: "films", shards: [{ file: "shard-0000-films.ndjson" }], role_map: { title: "name", text: ["desc"] },
|
|
542
|
+
presentation: { externalUrl: { video: "{url}" } } };
|
|
543
|
+
ROWS = ["good", "bad", "bad"].map((p, i) => ({ track_id: `l${i}`, owner: "0x1", fields: { entityType: "video", name: `L${i}`, desc: "d", url: `https://src.test/${p}` } }));
|
|
544
|
+
if (has(await lint("https://ok.test/q/v1"), "do not open")) throw new Error("links are only opened when asked (--links)");
|
|
545
|
+
r = await lint("https://ok.test/q/v1", { links: true });
|
|
546
|
+
if (!has(r, "1 of 2 sampled links do not open")) throw new Error(`a link answering "Invalid parameters!" must be caught: ${format(r)}`);
|
|
498
547
|
console.log("lint.js self-check ok — unreachable reported not thrown, missing coverage is blocking, a complete bake is silent, "
|
|
499
548
|
+ "foreign model excluded, sniffed shape flagged, a dead end judged on the rows rather than the declaration and waived by a reference into another corpus, a text role that is really the filename caught, "
|
|
500
|
-
+ "a paywall naming fields the free shard ships, a paid payload served in the clear from the public view without mistaking a host's HTML fallback for one, and a text role sold whole with no free sample");
|
|
549
|
+
+ "a link that answers with an error page, a paywall naming fields the free shard ships, a paid payload served in the clear from the public view without mistaking a host's HTML fallback for one, and a text role sold whole with no free sample");
|
|
501
550
|
}
|
package/src/publish/ship.js
CHANGED
|
@@ -161,7 +161,7 @@ function assertSameDeployment(cli) {
|
|
|
161
161
|
|
|
162
162
|
// ── the steps ─────────────────────────────────────────────────────────────────
|
|
163
163
|
|
|
164
|
-
export async function ship(configPath, { crawl = true, deploy = true, dry = false, replace = false, only = null, register = false } = {}) {
|
|
164
|
+
export async function ship(configPath, { crawl = true, deploy = true, dry = false, replace = false, only = null, register = false, rebake = false } = {}) {
|
|
165
165
|
const cfg = loadConfig(configPath);
|
|
166
166
|
if (!register && (!Object.keys(cfg.types).length || !cfg.sources.length))
|
|
167
167
|
throw new Error(`${configPath}: no types or sources yet, so nothing to build; --register sets up the app alone`);
|
|
@@ -246,7 +246,7 @@ export async function ship(configPath, { crawl = true, deploy = true, dry = fals
|
|
|
246
246
|
const namespaces = [...new Set(cfg.sources.map((s) => s.namespace))];
|
|
247
247
|
if (register && !dry) view.writeCatalog(join(site, "view")); // empty, or what an earlier build left
|
|
248
248
|
const report = dry || register ? {} : await view.publishView({ fangorn, app: cfg.app, namespaces, out: join(site, "view"),
|
|
249
|
-
fromBlock: BigInt(state.fromBlock), embed: view.cachedEmbed(join(dir, "vectors.ndjson")), log });
|
|
249
|
+
fromBlock: BigInt(state.fromBlock), embed: view.cachedEmbed(join(dir, "vectors.ndjson")), rebake, log });
|
|
250
250
|
|
|
251
251
|
// 6. the page, the card, the headers
|
|
252
252
|
if (!existsSync(join(STOCK, "index.html"))) throw new Error(`no stock page at ${STOCK}; run \`npx vite build\` in westmarch/site`);
|
|
@@ -480,7 +480,7 @@ if (process.argv[1]?.endsWith("ship.js") || process.argv[1]?.endsWith("westmarch
|
|
|
480
480
|
}
|
|
481
481
|
const [path, ...flags] = process.argv.slice(2);
|
|
482
482
|
if (!path || flags.includes("--help")) {
|
|
483
|
-
console.error("usage: westmarch-ship app.json [--no-crawl] [--no-deploy] [--dry-run] [--replace] [--only ns1,ns2]\n" +
|
|
483
|
+
console.error("usage: westmarch-ship app.json [--no-crawl] [--no-deploy] [--dry-run] [--replace] [--rebake] [--only ns1,ns2]\n" +
|
|
484
484
|
" westmarch-ship app.json --register [--dry-run] (claim, join, empty site, card bound: no data)\n" +
|
|
485
485
|
" westmarch-ship app.json --local <out> [--crawl] [--only ns1,ns2] (no chain, no deploy)");
|
|
486
486
|
process.exit(path ? 0 : 2);
|
|
@@ -492,7 +492,7 @@ if (process.argv[1]?.endsWith("ship.js") || process.argv[1]?.endsWith("westmarch
|
|
|
492
492
|
process.exit(0);
|
|
493
493
|
}
|
|
494
494
|
await ship(path, { crawl: !flags.includes("--no-crawl"), deploy: !flags.includes("--no-deploy"), dry: flags.includes("--dry-run"),
|
|
495
|
-
replace: flags.includes("--replace"), register: flags.includes("--register"),
|
|
495
|
+
replace: flags.includes("--replace"), register: flags.includes("--register"), rebake: flags.includes("--rebake"),
|
|
496
496
|
only })
|
|
497
497
|
.catch((e) => { console.error(`[ship] ✗ ${e.message}`); process.exit(1); });
|
|
498
498
|
process.exit(0); // a CUDA embedder keeps the process alive (and can abort in its teardown)
|
package/src/publish/view.js
CHANGED
|
@@ -32,12 +32,12 @@
|
|
|
32
32
|
import { gunzipSync, gzipSync } from "node:zlib";
|
|
33
33
|
import { createHash } from "node:crypto";
|
|
34
34
|
import { appendFileSync, existsSync, mkdirSync, readFileSync, readdirSync, renameSync, rmSync, writeFileSync } from "node:fs";
|
|
35
|
-
import { EMBED_DIM, EMBED_MODEL, embedDocumentDirect, packVec, unpackVec } from "../core/embed.js";
|
|
35
|
+
import { EMBED_DIM, EMBED_DTYPE, EMBED_MODEL, embedDocumentDirect, packVec, unpackVec } from "../core/embed.js";
|
|
36
36
|
import { coverage as fitCoverage } from "../market/reactions.js";
|
|
37
37
|
|
|
38
38
|
export const SCHEMA_NAMESPACE = "fangorn.schema";
|
|
39
39
|
export const TYPE_TAG = "fangorn.type.v1";
|
|
40
|
-
export const EMBEDDER = { runtime: "transformers.js", model: EMBED_MODEL, dtype:
|
|
40
|
+
export const EMBEDDER = { runtime: "transformers.js", model: EMBED_MODEL, dtype: EMBED_DTYPE };
|
|
41
41
|
const SINGULAR = ["identity", "title", "subtitle", "temporal", "spatial", "media"];
|
|
42
42
|
const MULTI = ["tags", "measures", "relations", "text"];
|
|
43
43
|
const ZERO = "0x0000000000000000000000000000000000000000";
|
|
@@ -263,11 +263,13 @@ async function publishDomain({ fangorn, schema, publisher, ns, domain, dir, reba
|
|
|
263
263
|
|
|
264
264
|
let n = 0;
|
|
265
265
|
const lines = [];
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
const
|
|
269
|
-
|
|
270
|
-
|
|
266
|
+
// 32 at a time: the embedder batches calls made together (embed.js), the GPU's speed.
|
|
267
|
+
for (let i = 0; i < fresh.length; i += 32) {
|
|
268
|
+
const ids = fresh.slice(i, i + 32);
|
|
269
|
+
const vs = await Promise.all(ids.map((id) => embed(composeText(records.get(id), rolesOf.get(records.get(id).entityType)))));
|
|
270
|
+
ids.forEach((id, j) => lines.push(JSON.stringify({ track_id: id, fields: records.get(id), v: packVec(vs[j]) })));
|
|
271
|
+
if (Math.floor((n + ids.length) / 1000) > Math.floor(n / 1000)) log(`${domain}: embedded ${n + ids.length}/${fresh.length}`);
|
|
272
|
+
n += ids.length;
|
|
271
273
|
}
|
|
272
274
|
if (!fresh.length && !gone.length && had.manifest && !rebake) {
|
|
273
275
|
applySpec(dir, had.manifest, schema, had.rows, dead); // a schema change alone still lands
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./rolldown-runtime-Dd_uD5pT.js";var t=e(((e,t)=>{t.exports={}}));export default t();
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
let e=null;const t=()=>e??=(async()=>{let{pipeline:e}=await import(`./transformers.web-D8W1u_I2.js`),t={}.WESTMARCH_EMBED_DEVICE;return e(`feature-extraction`,`nomic-ai/nomic-embed-text-v1.5`,{dtype:`q8`,...t&&{device:t}})})();function n(e,t=256){let n=e.length,r=0;for(let t=0;t<n;t++)r+=e[t];r/=n;let i=0;for(let t=0;t<n;t++)i+=(e[t]-r)**2;let a=Math.sqrt(i/n+1e-5),o=Array(Math.min(t,n));for(let t=0;t<o.length;t++)o[t]=(e[t]-r)/a;let s=0;for(let e of o)s+=e*e;if(s=Math.sqrt(s),s)for(let e=0;e<o.length;e++)o[e]/=s;return o}async function r(e){return n((await(await t())(`search_query: ${e}`,{pooling:`mean`,normalize:!1})).data)}async function i(e){return n((await(await t())(`search_document: ${e}`,{pooling:`mean`,normalize:!1})).data)}const a=()=>t().then(()=>{});function o(e){let t=new Uint8Array(e.length);for(let n=0;n<e.length;n++){let r=Math.round(Math.max(-1,Math.min(1,e[n]))*127);t[n]=r<0?r+256:r}let n=``;for(let e of t)n+=String.fromCharCode(e);return btoa(n)}function s(e){try{let t=atob(e),n=new(globalThis.Float16Array??Float32Array)(t.length);for(let e=0;e<t.length;e++){let r=t.charCodeAt(e);n[e]=(r>127?r-256:r)/127}return n.length?n:null}catch{return null}}function c(e){let t=new Uint8Array(Math.ceil(e.length/8));for(let n=0;n<e.length;n++)e[n]>=0&&(t[n>>3]|=128>>(n&7));let n=``;for(let e of t)n+=String.fromCharCode(e);return btoa(n)}function l(e){try{let t=atob(e.padEnd(Math.ceil(e.length/4)*4,`=`)),n=new Float32Array(t.length*8);for(let e=0;e<n.length;e++)n[e]=t.charCodeAt(e>>3)>>7-(e&7)&1?1:-1;return n.length?n:null}catch{return null}}if(typeof process<`u`&&import.meta.url===`file://${process.argv[1]}`&&process.argv[1].endsWith(`/embed.js`)){let e=n(Array.from({length:768},(e,t)=>Math.sin(t))),t=0;for(let n of e)t+=n*n;if(Math.abs(Math.sqrt(t)-1)>1e-6)throw Error(`matryoshka must L2-normalize`);if(e.length!==256)throw Error(`matryoshka must truncate to 256`);let r=s(o(e));if(r.length!==e.length)throw Error(`pack/unpack changed the dimension`);let i=0,a=0;for(let t=0;t<e.length;t++)i+=e[t]*r[t],a+=r[t]*r[t];let u=i/Math.sqrt(a);if(u<.999)throw Error(`int8 round-trip cosine ${u} — too lossy to rank with`);let d=s(o([-1,-.5,0,.5,1]));if(d[0]>-.99||d[1]>-.49||d[1]<-.51)throw Error(`negative components corrupted: ${[...d]}`);if(s(`!!!not base64!!!`)!==null)throw Error(`malformed vector must return null, not throw`);let f=c(e);if(f.length>48)throw Error(`sign bits must stay link-sized, got ${f.length} chars`);let p=l(f);if(p.length!==e.length)throw Error(`sign round-trip changed the dimension`);for(let t=0;t<e.length;t++)if(Math.sign(p[t])!==(e[t]<0?-1:1))throw Error(`sign flipped at ${t}`);if(c(p)!==f)throw Error(`sign packing must be idempotent`);if(l(`!!!not base64!!!`)!==null)throw Error(`malformed bits must return null, not throw`);console.log(`embed.js self-check ok — matryoshka norm, int8 round-trip, negatives, malformed input, sign bits`)}const u={query:r,document:i};self.onmessage=async({data:{id:e,kind:t,text:n}})=>{try{if(t===`warm`)return await a(),self.postMessage({id:e,vec:null});self.postMessage({id:e,vec:await u[t](n)})}catch(t){self.postMessage({id:e,error:t?.message??String(t)})}};
|