@fangorn-network/westmarch 0.0.12-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.
Files changed (339) hide show
  1. package/package.json +5 -1
  2. package/site/agent.js +1 -1
  3. package/site/dist/assets/AccountNotFoundScreen-C4njXc69-BOfmiSH1.js +1 -0
  4. package/site/dist/assets/AddFundsSelectionScreen-RAoCn7ej-D_EsIeJu.js +31 -0
  5. package/site/dist/assets/Address-H8kD1d9O-C85sJ79B.js +17 -0
  6. package/site/dist/assets/AffirmativeConsentScreen-BG0MJxku-DdEPFOww.js +6 -0
  7. package/site/dist/assets/AllowlistRejectionScreen-Cae6e1Od-DhVy9iGN.js +1 -0
  8. package/site/dist/assets/ApiController-CYdiyu9B.js +5 -0
  9. package/site/dist/assets/ArrowsRightLeftIcon-cp60yobq.js +1 -0
  10. package/site/dist/assets/AuthenticateWithWalletScreen-CU6hIcFT-8rbYiYYE.js +1 -0
  11. package/site/dist/assets/AwaitingEvmToSolBridgingScreen-D0e_sZMS-2pkNfCno.js +1 -0
  12. package/site/dist/assets/AwaitingExternalEthereumTransferScreen-ur5HL4R7-7AQt25_k.js +1 -0
  13. package/site/dist/assets/AwaitingPasswordlessCodeScreen-DRHz76mM-BZY30TGs.js +103 -0
  14. package/site/dist/assets/AwaitingSolToEvmBridgingScreen-CdLRrGD2-BILOOLi_.js +1 -0
  15. package/site/dist/assets/BridgeNetworkSelectionView-CFGjB2nO-CvsbQcFv.js +68 -0
  16. package/site/dist/assets/CaptchaScreen-DbpvkIGx-D8eDcAkc.js +1 -0
  17. package/site/dist/assets/CheckCircleIcon-BM409mGI.js +1 -0
  18. package/site/dist/assets/CheckCircleIcon-NCOQc0Gs.js +1 -0
  19. package/site/dist/assets/Checkbox-D1EDeo41-rHlvsZzP.js +52 -0
  20. package/site/dist/assets/ChevronDownIcon-CW-4MSpE.js +1 -0
  21. package/site/dist/assets/Chip-CZKIKt9K-CutJG010.js +26 -0
  22. package/site/dist/assets/CoinbaseOnrampStatusScreen-BbyCJDXL-DLs9zX-Q.js +16 -0
  23. package/site/dist/assets/ConnectEmailForm-B-VRE0MN-N9J6T_YL.js +3 -0
  24. package/site/dist/assets/ConnectLedgerScreen-DWHABGot-h0uYIUi6.js +10 -0
  25. package/site/dist/assets/ConnectOnlyLandingScreen-CZYx9Bmp-LeuDMN1E.js +1 -0
  26. package/site/dist/assets/ConnectOnlyStatusScreen-DCRzjxHx-DaRa59tZ.js +1 -0
  27. package/site/dist/assets/ConnectOrCreateScreen-CUUYUO07-crHzh-TL.js +1 -0
  28. package/site/dist/assets/ConnectPhoneForm-Dek5xn4C-BEA4FmhI.js +95 -0
  29. package/site/dist/assets/ConnectWalletView-DqI-PTvX-CMQIad63.js +74 -0
  30. package/site/dist/assets/ConnectionStatusScreen-fUfROm9m-BeWLchcf.js +7 -0
  31. package/site/dist/assets/ConnectionStatusScreen-fUfROm9m-wu3a3kw4.js +1 -0
  32. package/site/dist/assets/ConnectorUtil-Cq4lWnfe.js +21 -0
  33. package/site/dist/assets/ConstantsUtil-DmLsRHAl.js +198 -0
  34. package/site/dist/assets/CopyToClipboard-i_OQSBJr-DujUHNzW.js +39 -0
  35. package/site/dist/assets/CopyableText-CQapvaMr-DMIdpDaU.js +28 -0
  36. package/site/dist/assets/CrossAppAuthScreen-CLw7ymZq-Csju14vF.js +1 -0
  37. package/site/dist/assets/CustomLandingScreenView-Cm_MBSyX-CBOrbNLo.js +22 -0
  38. package/site/dist/assets/DelegatedActionsConsentScreen-DYF2U4y5-BL5hzNUI.js +1 -0
  39. package/site/dist/assets/DelegatedActionsRevokeScreen-bPp6Uwyh-fcO51q5H.js +1 -0
  40. package/site/dist/assets/DepositAddressAddressStepView-4vdkb55L-B3vY888G.js +187 -0
  41. package/site/dist/assets/DepositAddressScreen-DBLRs7aI-DmdQaFI2.js +8 -0
  42. package/site/dist/assets/DepositAddressV3Screen-CDqIEMQw-BoupRyfV.js +1 -0
  43. package/site/dist/assets/EmailInputForm-Cqo1mda8-B2NG3K5V.js +124 -0
  44. package/site/dist/assets/EmbeddedWalletConnectingScreen-D4T7DUzs-D_AVgO4s.js +1 -0
  45. package/site/dist/assets/EmbeddedWalletCreatedScreen-D7WhW5ve-CLsJbPYQ.js +1 -0
  46. package/site/dist/assets/EmbeddedWalletKeyExportScreen-CqV4NYQ3-C9sAExzE.js +23 -0
  47. package/site/dist/assets/EmbeddedWalletOnAccountCreateScreen-BoKb3Q2S-DxaWAAKa.js +1 -0
  48. package/site/dist/assets/EmbeddedWalletPasswordUpdateScreen-D3rMlqS7-CxrfLr5q.js +1 -0
  49. package/site/dist/assets/EmbeddedWalletPasswordUpdateSplashScreen-BPFkWJeE-DHZRGoTN.js +1 -0
  50. package/site/dist/assets/EnrollTotp-Dibew4dp-SA2pvNEc.js +66 -0
  51. package/site/dist/assets/EnvelopeIcon-Dh2vSVj4.js +1 -0
  52. package/site/dist/assets/ErrorBanner-BcpGRt0h-BKOYTyCi.js +21 -0
  53. package/site/dist/assets/ErrorMessage-D8VaAP5m-CrZOnUyg.js +8 -0
  54. package/site/dist/assets/ErrorScreen-DipdTWzE-DcxVjMO4.js +1 -0
  55. package/site/dist/assets/ErrorScreen-DipdTWzE-c8g8En21.js +4 -0
  56. package/site/dist/assets/ExclamationCircleIcon-DUA2wMfO.js +1 -0
  57. package/site/dist/assets/ExclamationTriangleIcon-eZfaqcFq.js +1 -0
  58. package/site/dist/assets/FarcasterConnectStatusScreen-51tjUxqq-s_s5M2CZ.js +75 -0
  59. package/site/dist/assets/FarcasterSignerStatusScreen-6x-Uh95G-BHBR4k8H.js +28 -0
  60. package/site/dist/assets/FiatOnrampScreen-BAhYeiTI-BH_sU6EV.js +491 -0
  61. package/site/dist/assets/FingerPrintIcon-Dm6kxmg7.js +1 -0
  62. package/site/dist/assets/FundSolWalletWithExternalSolanaWallet-WtLwYaOl-B8TRV36j.js +1 -0
  63. package/site/dist/assets/FundWalletMethodHeader-BWNkokCT-BQdbJ5Bb.js +1 -0
  64. package/site/dist/assets/FundWithBankDepositScreen-DajkHxBD-9rPtyA3d.js +58 -0
  65. package/site/dist/assets/FundingEditAmountScreen-CpvpiO4M-GaXigGI9.js +1 -0
  66. package/site/dist/assets/FundingMethodSelectionScreen-Db7vhRlE-UsmtTqv4.js +1 -0
  67. package/site/dist/assets/GlobeAltIcon-vqrVV5ho.js +1 -0
  68. package/site/dist/assets/GooglePay-B53WnudL-BX5_WtCx.js +1 -0
  69. package/site/dist/assets/HCaptchaWrapper-CUi9LJsp-D-I8j7NO.js +4 -0
  70. package/site/dist/assets/InAppBrowserLoginNotPossible-BMR9br1T-BY3j50El.js +1 -0
  71. package/site/dist/assets/InfoBanner-Cb3p1z12-DLBl_Ywy.js +22 -0
  72. package/site/dist/assets/InjectedWalletIcon-DLcYOGDj-DLSV_NjP.js +1 -0
  73. package/site/dist/assets/InstallWalletScreen-DTA8dwLv-CxreyXoD.js +1 -0
  74. package/site/dist/assets/JsonTree-BHzNC-ic-DcNcbSoM.js +34 -0
  75. package/site/dist/assets/LabelXs-oqZNqbm_-iafrj25N.js +6 -0
  76. package/site/dist/assets/LandingScreen-CGWUoSUG-DK1EY-6v.js +1 -0
  77. package/site/dist/assets/Layouts-BMRfo5hw-CeCOyCLK.js +77 -0
  78. package/site/dist/assets/Link-BdDilT2T-BEDEdHuS.js +40 -0
  79. package/site/dist/assets/LinkConflictScreen-C3ZEPsgl-ClWoqvEL.js +77 -0
  80. package/site/dist/assets/LinkEmailScreen-dKo9frwc-C3v7glH0.js +1 -0
  81. package/site/dist/assets/LinkPasskeyScreen-zbrl_AI_-D72Gb0LW.js +117 -0
  82. package/site/dist/assets/LinkPasskeyScreen-zbrl_AI_-DYIl5Kr2.js +1 -0
  83. package/site/dist/assets/LinkPhoneScreen-oIUpfj0w-C0DuD14j.js +1 -0
  84. package/site/dist/assets/Loader-UAZqxsnw-Cy7hEE2f.js +62 -0
  85. package/site/dist/assets/LoadingSkeleton-BMsgO5PV-CiEyS5PZ.js +17 -0
  86. package/site/dist/assets/LockClosedIcon-BgY_5v_Z.js +1 -0
  87. package/site/dist/assets/LoginFailedScreen-CN0dJV6U-DhUMiJZJ.js +1 -0
  88. package/site/dist/assets/ManualTransferScreen-CHqcuqbs-tXiZDHmN.js +1 -0
  89. package/site/dist/assets/MfaAuthEnrollmentFlowScreen-Dj7gPTRC-CaW7xeCC.js +1 -0
  90. package/site/dist/assets/MfaAuthVerifyFlowScreen-DbFpyWMy-CeRqvx8k.js +1 -0
  91. package/site/dist/assets/MfaEnrollmentFlowScreen-DhLnGgnr-BkN1k4lh.js +1 -0
  92. package/site/dist/assets/MfaVerifyFlowScreen-C_XPjMRP-CXSqLVbE.js +1 -0
  93. package/site/dist/assets/ModalFooter-BCuEK_nz-c-khvG4Y.js +403 -0
  94. package/site/dist/assets/MoonpayStatusScreen-CzTUtokc-BRFN2eXr.js +16 -0
  95. package/site/dist/assets/OAuthStatusScreen-ufbOa-da-CeiGcSia.js +1 -0
  96. package/site/dist/assets/OpenLink-CUpJ1mOr-DfAvJRyK.js +39 -0
  97. package/site/dist/assets/PasskeySelectSignupOrLogin-xh2ScC_l-CIf5I7wU.js +1 -0
  98. package/site/dist/assets/PasskeyStatusScreen-Bla8MaOk-CLoL7QC-.js +6 -0
  99. package/site/dist/assets/PasswordRecoveryScreen-awGXZkQk-B9F67IYV.js +20 -0
  100. package/site/dist/assets/PhArrowCircleDown-D97G-BOA.js +14 -0
  101. package/site/dist/assets/PhArrowClockwise-DVgyFuez.js +14 -0
  102. package/site/dist/assets/PhArrowDown-87b1BizM.js +14 -0
  103. package/site/dist/assets/PhArrowLeft-Da0MfnbK.js +14 -0
  104. package/site/dist/assets/PhArrowRight-AdrIL4DW.js +14 -0
  105. package/site/dist/assets/PhArrowSquareOut-Bk2CMG3I.js +14 -0
  106. package/site/dist/assets/PhArrowUp-4sgyKPGx.js +14 -0
  107. package/site/dist/assets/PhArrowUpRight-BNghD2zq.js +14 -0
  108. package/site/dist/assets/PhArrowsClockwise-BXRn1GEl.js +14 -0
  109. package/site/dist/assets/PhArrowsDownUp-DM09Jo_3.js +14 -0
  110. package/site/dist/assets/PhArrowsLeftRight-MuKBLUoF.js +14 -0
  111. package/site/dist/assets/PhBank-fHbgCqqZ.js +14 -0
  112. package/site/dist/assets/PhBrowser-2-9m-AkM.js +14 -0
  113. package/site/dist/assets/PhCaretDown-BDNabFuL.js +14 -0
  114. package/site/dist/assets/PhCaretLeft-CI460R-A.js +14 -0
  115. package/site/dist/assets/PhCaretRight-D7ZS3Ls8.js +14 -0
  116. package/site/dist/assets/PhCaretUp-C-iIfyvO.js +14 -0
  117. package/site/dist/assets/PhCheck-DxQXn57r.js +14 -0
  118. package/site/dist/assets/PhCircleHalf-MJZeRBGF.js +14 -0
  119. package/site/dist/assets/PhClock-x3MS3Mwi.js +14 -0
  120. package/site/dist/assets/PhCompass-hYn3HhGN.js +14 -0
  121. package/site/dist/assets/PhCopy-CWNYcABI.js +14 -0
  122. package/site/dist/assets/PhCreditCard-Fy4pzwtt.js +14 -0
  123. package/site/dist/assets/PhCurrencyDollar-BgiaenCi.js +14 -0
  124. package/site/dist/assets/PhDesktop-CxrzCSv5.js +14 -0
  125. package/site/dist/assets/PhDeviceMobile-CsyA5Goi.js +14 -0
  126. package/site/dist/assets/PhDotsThree-D-k1BiYg.js +14 -0
  127. package/site/dist/assets/PhEnvelope-D8kzeNox.js +14 -0
  128. package/site/dist/assets/PhFunnelSimple-CfQs5DAW.js +14 -0
  129. package/site/dist/assets/PhGlobe-DvmSc9_A.js +14 -0
  130. package/site/dist/assets/PhIdentificationCard-CfkZm-5K.js +14 -0
  131. package/site/dist/assets/PhImage-Cf0J2ZfJ.js +14 -0
  132. package/site/dist/assets/PhInfo-Bwi51-2X.js +14 -0
  133. package/site/dist/assets/PhLightbulb-C4FZV7Es.js +14 -0
  134. package/site/dist/assets/PhMagnifyingGlass-C9u8jSCJ.js +14 -0
  135. package/site/dist/assets/PhPaperPlaneRight-zxQVvPLX.js +14 -0
  136. package/site/dist/assets/PhPlus-C4UoW-2n.js +14 -0
  137. package/site/dist/assets/PhPower-CFyWDmgD.js +14 -0
  138. package/site/dist/assets/PhPuzzlePiece-BjoNVfST.js +14 -0
  139. package/site/dist/assets/PhQrCode-CP3tFauY.js +14 -0
  140. package/site/dist/assets/PhQuestion-wOWJBd3G.js +14 -0
  141. package/site/dist/assets/PhQuestionMark-CV0k9C0Y.js +14 -0
  142. package/site/dist/assets/PhSealCheck-vIKzREuN.js +14 -0
  143. package/site/dist/assets/PhSignOut-CxELV-i0.js +14 -0
  144. package/site/dist/assets/PhSpinner-CGDmbzUd.js +14 -0
  145. package/site/dist/assets/PhTrash-C9PD0SAt.js +14 -0
  146. package/site/dist/assets/PhUser-0sWNXQeZ.js +14 -0
  147. package/site/dist/assets/PhVault-6JTskUcC.js +14 -0
  148. package/site/dist/assets/PhWarning-CoKs3gz6.js +14 -0
  149. package/site/dist/assets/PhWarningCircle-BXHw1fCt.js +14 -0
  150. package/site/dist/assets/PhX-DX0SFIqC.js +14 -0
  151. package/site/dist/assets/PhoneIcon-CvIiPwYQ.js +1 -0
  152. package/site/dist/assets/PinInput-DbZ0b1i1-CDXZBdQx.js +247 -0
  153. package/site/dist/assets/PrivyPluginContext-DA-yS5vO-CtQWBiV2.js +1 -0
  154. package/site/dist/assets/QrCode-DbnZwlkH-h6Bhoe5U.js +22 -0
  155. package/site/dist/assets/RecoveryOAuthStatusScreen-CsgtTI2x-D-A5P3PX.js +1 -0
  156. package/site/dist/assets/RecoveryPasswordCreateScreen-Be-qJ-LU-C8lTSeSr.js +1 -0
  157. package/site/dist/assets/RecoverySelectionScreen-D1iGtpmi-P5P3plkH.js +7 -0
  158. package/site/dist/assets/SIWXUtil-TUCxa7aA.js +1 -0
  159. package/site/dist/assets/Screen-D30meWsY-CCeVNuWs.js +175 -0
  160. package/site/dist/assets/ScreenHeader-CHmc4-Lu-DjyrH7IK.js +31 -0
  161. package/site/dist/assets/ScreenLayout-OwaQQcxH-CrQM6kvA.js +1 -0
  162. package/site/dist/assets/SelectSourceAsset-CWFog6gm-D7yTw87h.js +140 -0
  163. package/site/dist/assets/SetAutomaticRecoveryScreen-BO_OEqAZ-f0iDIGmw.js +14 -0
  164. package/site/dist/assets/SetWalletPasswordForm-DwCTVtAh-kq1zvA7d.js +11 -0
  165. package/site/dist/assets/ShieldCheckIcon-o6RHYev1.js +1 -0
  166. package/site/dist/assets/SignRequestScreen-BHKv32KR-DDpMYyJ1.js +26 -0
  167. package/site/dist/assets/SolanaWalletConnector-C7Lqk-Wz-DPwhuzcI.js +1 -0
  168. package/site/dist/assets/StackedContainer-B2vaEl56-eQCM2cmv.js +24 -0
  169. package/site/dist/assets/StandardSignAndSendTransactionScreen-CfhIXVtd-BJ-onCjv.js +20 -0
  170. package/site/dist/assets/Subtitle-CV-2yKE4-zxWw2m1Q.js +13 -0
  171. package/site/dist/assets/TelegramAuthScreen-UL9zLfO8-NWlMgNRX.js +1 -0
  172. package/site/dist/assets/Title-BnzYV3Is-B_JpTatT.js +7 -0
  173. package/site/dist/assets/TodoList-DnyULl18-C8Eyy28X.js +36 -0
  174. package/site/dist/assets/TransactionDetails-e9nesl30-C4MpIHR-.js +109 -0
  175. package/site/dist/assets/TransactionErrorView-BDBNqA_f-p1T9WVMx.js +178 -0
  176. package/site/dist/assets/TransferFromWalletScreen-Qvn1Yuno-88IQcRnY.js +31 -0
  177. package/site/dist/assets/TransferOrBridgeLoadingScreen-Dl1I_iIz-1fDAIxAf.js +6 -0
  178. package/site/dist/assets/TurnstileWrapper-B7sNddys-Jwy1tJtm.js +1 -0
  179. package/site/dist/assets/UpdateEmailScreen-DVOhPV0H-Jj2DQW8D.js +1 -0
  180. package/site/dist/assets/UpdatePhoneScreen-CXRswTNZ-DwYIUBqi.js +1 -0
  181. package/site/dist/assets/UserLimitReachedScreen-5we2DHn8-D7m70C4b.js +1 -0
  182. package/site/dist/assets/Value-DTgR824E-BRuIGiec.js +27 -0
  183. package/site/dist/assets/WalletCards-DH1rqayz-Bgp9Fsgs.js +1 -0
  184. package/site/dist/assets/WalletIcon-gKf0gTw6.js +1 -0
  185. package/site/dist/assets/WalletInfoCard-sq_2wgFg-DpNSAGte.js +29 -0
  186. package/site/dist/assets/WalletInterstitialScreen-Sh7LfsAh-DG-RuO-F.js +1 -0
  187. package/site/dist/assets/WalletLink-DK5LB5Ha-DHaL350n.js +20 -0
  188. package/site/dist/assets/WalletOverflowButton-bfCnp-9T-CUyIJFzt.js +1 -0
  189. package/site/dist/assets/WarningBanner-ZZqCEtZK-2eU4Qo74.js +21 -0
  190. package/site/dist/assets/__vite-browser-external-CitKSmYk.js +1 -0
  191. package/site/dist/assets/_esm-B26FZg5Y.js +7 -0
  192. package/site/dist/assets/_esm-BdeM6pxJ.js +1 -0
  193. package/site/dist/assets/accounts-D96UKWkC.js +1 -0
  194. package/site/dist/assets/accounts-DiZ-0VmN.js +1 -0
  195. package/site/dist/assets/analytics-mkkvFRju-BRBcadka.js +1 -0
  196. package/site/dist/assets/baseSepolia-DX-qGsik.js +1 -0
  197. package/site/dist/assets/basic-oIwwSyu4.js +1575 -0
  198. package/site/dist/assets/capitalizeFirstLetter-DmLYqXsO-DtOXx-2n.js +1 -0
  199. package/site/dist/assets/ccip-65sIfSPR.js +1 -0
  200. package/site/dist/assets/ccip-BZvRTL6g.js +7 -0
  201. package/site/dist/assets/ccip-DA_zG341.js +1 -0
  202. package/site/dist/assets/chain-DM3oH6Px.js +8 -0
  203. package/site/dist/assets/check-BPgcwEPP.js +1 -0
  204. package/site/dist/assets/chevron-down-BSsbXkK-.js +1 -0
  205. package/site/dist/assets/circle-alert-DWaeLZNj.js +1 -0
  206. package/site/dist/assets/circle-check-big-Chb1ivw9.js +1 -0
  207. package/site/dist/assets/circle-x-AV9Cet0R.js +1 -0
  208. package/site/dist/assets/client-CZG0ndth.js +2 -0
  209. package/site/dist/assets/client-Dsa7_3V3.js +9 -0
  210. package/site/dist/assets/coinbase-DCPC2L_R-D3aIgpyd.js +3 -0
  211. package/site/dist/assets/copy-Ckr0AkL6.js +1 -0
  212. package/site/dist/assets/core-snws5xwv.js +12 -0
  213. package/site/dist/assets/createLucideIcon-IPW50ckY.js +1 -0
  214. package/site/dist/assets/defineChain-CiuCXUZW.js +1 -0
  215. package/site/dist/assets/dijkstra-Drfl93V4.js +1 -0
  216. package/site/dist/assets/dist-Cm7pNAtL.js +1 -0
  217. package/site/dist/assets/dist-CoS6E-3x.js +1 -0
  218. package/site/dist/assets/dist-Dl07uGq1.js +1 -0
  219. package/site/dist/assets/dist-DnGANz51.js +16 -0
  220. package/site/dist/assets/embed.worker-ugGhEqCV.js +1 -0
  221. package/site/dist/assets/errors-BQ3N-RVt-BLqjTPNR.js +1 -0
  222. package/site/dist/assets/esm-B5cbIQaz.js +37 -0
  223. package/site/dist/assets/esm-ByALO6mA.js +1 -0
  224. package/site/dist/assets/esm-C3DslVJx.js +1 -0
  225. package/site/dist/assets/esm-Ci1ogKuK.js +1 -0
  226. package/site/dist/assets/esm-n2lWo7kz.js +1 -0
  227. package/site/dist/assets/ethers-zTjbodk5-wHhL_BQ1.js +1 -0
  228. package/site/dist/assets/eventemitter3-CL76jPsW.js +1 -0
  229. package/site/dist/assets/external-link-D-uehwM2.js +1 -0
  230. package/site/dist/assets/farcaster-DPlSjvF5-BqTvDXBR.js +1 -0
  231. package/site/dist/assets/features-DQ0UYy6K.js +2 -0
  232. package/site/dist/assets/fingerprint-pattern-D8ytA16Q.js +1 -0
  233. package/site/dist/assets/floating-ui.react-dom-DKWOL9UG.js +1 -0
  234. package/site/dist/assets/floating-ui.react-xRkl9O3u.js +1 -0
  235. package/site/dist/assets/formatErc20TokenAmount-BuPk9xcy-BVqOKQif.js +1 -0
  236. package/site/dist/assets/formatter-CVbp4SlJ.js +1 -0
  237. package/site/dist/assets/get-entropy-details-for-user-dHRH5Gpi-Dukf7_kJ.js +1 -0
  238. package/site/dist/assets/getChainName-DjpPdUSc-DUyKDrnp.js +1 -0
  239. package/site/dist/assets/getErc20Balance-jXNpFf0N-Bb9WM31M.js +1 -0
  240. package/site/dist/assets/getErc20TokenInfo-BNTrzLMP-KPrdn04K.js +1 -0
  241. package/site/dist/assets/getFormattedUsdFromLamports-De3U9GlO-Gx4_wxON.js +1 -0
  242. package/site/dist/assets/getUsdcMintAddress-BVgm9GRo-r2UnDeEy.js +1 -0
  243. package/site/dist/assets/guards-BIW-GiMJ-CHfXo8XI.js +1 -0
  244. package/site/dist/assets/hooks.module-BYZGfwDl.js +1 -0
  245. package/site/dist/assets/hourglass-CPG1HZmf.js +1 -0
  246. package/site/dist/assets/id-UqEwL2BI-BkKm533U.js +1 -0
  247. package/site/dist/assets/index-B5YmgwLH.js +8 -0
  248. package/site/dist/assets/index-BdEw5wyl-ChSJvPZk.js +1 -0
  249. package/site/dist/assets/index-CWARkn2w-Cezl_uBr.js +61 -0
  250. package/site/dist/assets/index-DvMddJcd-BatvgC-S.js +12 -0
  251. package/site/dist/assets/index-YiCw0Y_x-CX5i3Z87.js +437 -0
  252. package/site/dist/assets/index.browser-B-i-Lj3J.js +1 -0
  253. package/site/dist/assets/index.browser-BMmUcykv.js +1 -0
  254. package/site/dist/assets/index.es-BmqyoBEM.js +2 -0
  255. package/site/dist/assets/index.es-C1v1or--.js +3 -0
  256. package/site/dist/assets/isPaymentRequestAvailable-Bq1cemEn-By6r0dVB.js +1 -0
  257. package/site/dist/assets/jsx-runtime-BbDfbRii.js +1 -0
  258. package/site/dist/assets/landmark-CH6LV6F0.js +1 -0
  259. package/site/dist/assets/lib-BsS8z8Lj.js +1 -0
  260. package/site/dist/assets/localBatchGatewayRequest-3kLrX_c7.js +32 -0
  261. package/site/dist/assets/lock-DcskI4Bb.js +1 -0
  262. package/site/dist/assets/logger-CsXm3oIv-B0UYpNFI.js +1 -0
  263. package/site/dist/assets/mail-Bs0r5yOi.js +1 -0
  264. package/site/dist/assets/modal-context-CwmSeFcv-DruX9J1E.js +1 -0
  265. package/site/dist/assets/native-BKj27wfc.js +1 -0
  266. package/site/dist/assets/ofetch.CWycOUEr-CHp-crOQ.js +1 -0
  267. package/site/dist/assets/parseAbi-Csg-8t59.js +2 -0
  268. package/site/dist/assets/parseAbiParameters-BWbIMYe4.js +1 -0
  269. package/site/dist/assets/parseEther-VjhVo3dd.js +1 -0
  270. package/site/dist/assets/pkce-DXF0yKjP-ChQhE0st.js +1 -0
  271. package/site/dist/assets/preload-helper-uBIymjUX.js +1 -0
  272. package/site/dist/assets/privy-context-81KmsBw2-CjWGzyg7.js +2 -0
  273. package/site/dist/assets/property-DuZ9DLP4.js +3 -0
  274. package/site/dist/assets/react-DCXkXSrv.js +1 -0
  275. package/site/dist/assets/react-DQnMl2Xv.js +1 -0
  276. package/site/dist/assets/react-DrJ0MmMO.js +1 -0
  277. package/site/dist/assets/react-auth-sHnipzbS.js +1 -0
  278. package/site/dist/assets/react-dom-5dW7aKoP.js +1 -0
  279. package/site/dist/assets/reservoir-x-nGuZkT-BMX127i6.js +1 -0
  280. package/site/dist/assets/rolldown-runtime-BcKkbAw3.js +1 -0
  281. package/site/dist/assets/safe-url-D7SRPu33-CkMedGro.js +1 -0
  282. package/site/dist/assets/secp256k1-C4nzcPo-.js +1 -0
  283. package/site/dist/assets/secp256k1-D92aGNnU.js +1 -0
  284. package/site/dist/assets/secp256k1-DmbwyFau.js +1 -0
  285. package/site/dist/assets/secp256k1-_MleGpqL.js +1 -0
  286. package/site/dist/assets/secp256k1-xl2og-wO.js +1 -0
  287. package/site/dist/assets/serializeAuthorizationList-CX8hGL56.js +1 -0
  288. package/site/dist/assets/serializeSignature-DfxkPnu-.js +2 -0
  289. package/site/dist/assets/sha2-BU_QyRTx.js +1 -0
  290. package/site/dist/assets/shared-DRZUmnL5-xqAUARWo.js +193 -0
  291. package/site/dist/assets/shared-FM0rljBt--Avg6q2R.js +21 -0
  292. package/site/dist/assets/shouldProceedtoEmbeddedWalletCreationFlow-B3vyavrh-BK_FBkaE.js +1 -0
  293. package/site/dist/assets/simulateTransaction-CfuOrae4-64lWYJAL.js +1 -0
  294. package/site/dist/assets/smartphone-CcEZ-XAy.js +1 -0
  295. package/site/dist/assets/src-BBjkfi-Q.js +1 -0
  296. package/site/dist/assets/storage-Ufl800Ne-D0bZBw-H.js +9 -0
  297. package/site/dist/assets/stringify-BlDm7tuc.js +21 -0
  298. package/site/dist/assets/stripe.esm-CZRDpc-N.js +2 -0
  299. package/site/dist/assets/styles-BsotlekN-CXEB4Ud9.js +9 -0
  300. package/site/dist/assets/styles-Cm9H63WO-Br4QtzUL.js +92 -0
  301. package/site/dist/assets/styles-DVyDvTdj-BTABn2K8.js +74 -0
  302. package/site/dist/assets/styles-hslXy6xG-D-49b1rk.js +164 -0
  303. package/site/dist/assets/telegram-B-JqnkqZ-RBoY3PLx.js +1 -0
  304. package/site/dist/assets/to-ui-error-DWe-qwS3-Cx2bk1kZ.js +4 -0
  305. package/site/dist/assets/toViemAccount-B5iDGq1b-Ba8L7zed.js +2 -0
  306. package/site/dist/assets/transaction-BNTP-bFm-M5tJx8vY.js +1 -0
  307. package/site/dist/assets/transfer-6YztDh-t-BVQkTvG-.js +1 -0
  308. package/site/dist/assets/{transformers.web-CM54uIeJ.js → transformers.web-CVP3pJOS.js} +1 -1
  309. package/site/dist/assets/triangle-alert-CWjYH75H.js +1 -0
  310. package/site/dist/assets/twitch-5IOe4sIQ-lDtgk0os.js +1 -0
  311. package/site/dist/assets/types-4CuOD23i.js +1 -0
  312. package/site/dist/assets/use-headless-crypto-deposit-Yn-QRLB3-LUIVFBSd.js +1 -0
  313. package/site/dist/assets/use-unlink-wallet-BKK4_5Ur-CC2pq27z.js +1 -0
  314. package/site/dist/assets/useActiveWallet-B-yZYGc6-D7Ik-LxJ.js +123 -0
  315. package/site/dist/assets/useGetSolPrice-x7gfUIHJ-D1hmQfpA.js +1 -0
  316. package/site/dist/assets/useGetTokenPrice-CaoUkb79-ZnbuJ-vP.js +1 -0
  317. package/site/dist/assets/useI18n-C-5n_noF-BcqC76yj.js +1 -0
  318. package/site/dist/assets/useWalletBalance-CZnP5f_f-Dw2GIJ4g.js +1 -0
  319. package/site/dist/assets/useWallets-X1ndvJ_U-DRjz7uYD.js +1 -0
  320. package/site/dist/assets/utils-BkR7EQjg.js +1 -0
  321. package/site/dist/assets/utils-DJhBNOZA.js +1 -0
  322. package/site/dist/assets/utils-DdckVfQr.js +1 -0
  323. package/site/dist/assets/w3m-modal-BeVrBOIf.js +1174 -0
  324. package/site/dist/assets/wallet-Bn85Sg2W.js +1 -0
  325. package/site/dist/assets/wallet-DMLc-ukR.js +2 -0
  326. package/site/dist/assets/wallet-connect-BvJtUsDt-Y03hhqFN.js +1 -0
  327. package/site/dist/assets/walletconnect-registry-xxG8XLCb-D1SSFvMp.js +1 -0
  328. package/site/dist/assets/walletconnect-v2-3frQFwbg-CrtLXofr.js +12 -0
  329. package/site/dist/assets/wui-ux-by-reown-D34ILNLS.js +1147 -0
  330. package/site/dist/assets/x-rlSp9U7W.js +1 -0
  331. package/site/dist/index.html +6 -6
  332. package/src/agent/view-tools.js +5 -8
  333. package/src/agent/x402.js +11 -0
  334. package/src/publish/lint.js +55 -6
  335. package/site/dist/assets/__vite-browser-external-CKnVkMRn.js +0 -1
  336. package/site/dist/assets/embed.worker-CZXpLhAu.js +0 -1
  337. package/site/dist/assets/index-oyUqokZh.js +0 -8
  338. package/site/dist/assets/preload-helper-BaNbYf_w.js +0 -1
  339. 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};
@@ -1,21 +1,21 @@
1
1
  <!doctype html>
2
2
  <html lang="en">
3
- <script type="module" crossorigin src="./assets/index-oyUqokZh.js"></script>
4
- <link rel="modulepreload" crossorigin href="./assets/rolldown-runtime-Dd_uD5pT.js">
5
- <link rel="modulepreload" crossorigin href="./assets/preload-helper-BaNbYf_w.js">
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">Liked<span id="nsaved"></span></a><a href="#/history">History</a></nav>
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, likes and dislikes stay on this device unless you export them.
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>
@@ -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 { payAndFetch } = await import("./x402.js");
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 ? (want === digest ? "matches the published sha256" : `MISMATCH: published ${want}, got ${digest}`) : "not checked (search for the record first)",
190
- record: JSON.parse(r.body) };
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");
@@ -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
  }
@@ -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)})}};
@@ -1,8 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./transformers.web-CM54uIeJ.js","./rolldown-runtime-Dd_uD5pT.js","./preload-helper-BaNbYf_w.js","./__vite-browser-external-CKnVkMRn.js","./roles-YDRjv_PY.js","./roles-C9V_uDr_.js"])))=>i.map(i=>d[i]);
2
- import{i as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./preload-helper-BaNbYf_w.js";import{c as n,d as r,f as i,g as a,h as o,m as s,n as c,p as l,r as u,s as d}from"./roles-C9V_uDr_.js";(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),t.credentials=e.crossOrigin===`use-credentials`?`include`:e.crossOrigin===`anonymous`?`omit`:`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var f=`nomic-ai/nomic-embed-text-v1.5`,p=256,m=null,h=()=>m??=(async()=>{let{pipeline:e}=await t(async()=>{let{pipeline:e}=await import(`./transformers.web-CM54uIeJ.js`);return{pipeline:e}},__vite__mapDeps([0,1,2]),import.meta.url),n={}.WESTMARCH_EMBED_DEVICE;return e(`feature-extraction`,f,{dtype:`q8`,...n&&{device:n}})})();function g(e,t=p){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 _(e){return g((await(await h())(`search_query: ${e}`,{pooling:`mean`,normalize:!1})).data)}var v=()=>typeof window<`u`&&typeof Worker<`u`,y=null,b=0,x=new Map;function S(){return y||(y=new Worker(new URL(new URL(`embed.worker-CZXpLhAu.js`,import.meta.url).href,``+import.meta.url),{type:`module`}),y.onmessage=({data:e})=>{let t=x.get(e.id);t&&(x.delete(e.id),e.error?t.reject(Error(e.error)):t.resolve(e.vec))},y.onerror=e=>{for(let t of x.values())t.reject(Error(`embed worker: ${e?.message??`failed to start`}`));x.clear(),y=null},y)}var ee=(e,t)=>new Promise((n,r)=>{let i=++b;x.set(i,{resolve:n,reject:r}),S().postMessage({id:i,kind:e,text:t})}),te=e=>v()?ee(`query`,e):_(e);function C(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 w(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 T(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 ne(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=g(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!==p)throw Error(`matryoshka must truncate to ${p}`);let n=w(C(e));if(n.length!==e.length)throw Error(`pack/unpack changed the dimension`);let r=0,i=0;for(let t=0;t<e.length;t++)r+=e[t]*n[t],i+=n[t]*n[t];let a=r/Math.sqrt(i);if(a<.999)throw Error(`int8 round-trip cosine ${a} — too lossy to rank with`);let o=w(C([-1,-.5,0,.5,1]));if(o[0]>-.99||o[1]>-.49||o[1]<-.51)throw Error(`negative components corrupted: ${[...o]}`);if(w(`!!!not base64!!!`)!==null)throw Error(`malformed vector must return null, not throw`);let s=T(e);if(s.length>48)throw Error(`sign bits must stay link-sized, got ${s.length} chars`);let c=ne(s);if(c.length!==e.length)throw Error(`sign round-trip changed the dimension`);for(let t=0;t<e.length;t++)if(Math.sign(c[t])!==(e[t]<0?-1:1))throw Error(`sign flipped at ${t}`);if(T(c)!==s)throw Error(`sign packing must be idempotent`);if(ne(`!!!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`)}var E=(e,t,n)=>{let r=0;for(let n=0;n<t.length&&n<e.vector.length;n++)r+=e.vector[n]*t[n];return r/(e.norm*n)},D=e=>{let t=0;for(let n of e)t+=n*n;return Math.sqrt(t)||1};function re(e,t=1){if(e.length<3)return-1/0;let n=e.reduce((e,t)=>e+t,0)/e.length,r=Math.sqrt(e.reduce((e,t)=>e+(t-n)**2,0)/e.length);return r>1e-6?n+t*r:-1/0}function ie(e,{limit:t=10,lambda:n=.7,key:r=`s`}={}){if(n>=1||e.length<=1)return e.slice(0,t);let i=e.slice(0,Math.max(t*6,30)),a=[];for(;a.length<t&&i.length;){let e=0,t=-1/0;for(let o=0;o<i.length;o++){let s=0;for(let e of a){if(!i[o].row?.vector||!e.row?.vector)continue;let t=E(i[o].row,e.row.vector,e.row.norm);t>s&&(s=t)}let c=n*i[o][r]-(1-n)*s;c>t&&(t=c,e=o)}a.push(i.splice(e,1)[0])}return a}var ae=e=>e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`),oe=e=>RegExp(`\\b${ae(e)}\\b`);function O(e,t){let n=String(e.text??``).toLowerCase();if(!n)return 0;let r=t.split(/\s+/).filter(Boolean);if(!r.length)return 0;let i=0;for(let e of r)oe(e).test(n)&&i++;if(!i)return 0;let a=n.indexOf(t);return Math.min(1,.5*(i/r.length)+(oe(t).test(n)?.35:0)+(a>=0?.15*(1-a/n.length):0))}function se(e,t){let n=e[0],r=0;for(let i of e){let e=O({text:i.text},t);e>r&&(r=e,n=i)}return n}function ce(e=[],t){let n=D(t);return e.map(e=>{let r=e.coverage;if(!r?.vectors?.length)return{...e,affinity:null};let i=-1;for(let e of r.vectors){let r=0,a=0;for(let n=0;n<e.length&&n<t.length;n++)r+=e[n]*t[n],a+=e[n]*e[n];let o=r/((Math.sqrt(a)||1)*n);o>i&&(i=o)}return{...e,affinity:i}}).sort((e,t)=>(t.affinity??-1/0)-(e.affinity??-1/0))}if(typeof process<`u`&&import.meta.url===`file://${process.argv[1]}`&&process.argv[1].endsWith(`/rank.js`)){if(O({text:`intoxicated education`},`cat`)!==0)throw Error(`substring matched — word boundaries lost`);if(O({text:`a cat sat`},`cat`)<=0)throw Error(`whole word must match`);let e=O({text:`cold war submarines`},`cold war`),t=O({text:`cold nights, the war ended`},`cold war`);if(!(e>t))throw Error(`phrase bonus lost: ${e} vs ${t}`);if(O({text:`what is c++`},`c++`)===void 0)throw Error(`must not throw on regex metachars`);if(Math.abs(E({vector:[1,0,0,0],norm:1},[1,0],1)-1)>1e-9)throw Error(`cosine must truncate to the query`);if(re([.5,.5,.5,.5])!==-1/0)throw Error(`no spread must admit everything, not nothing`);if(re([.4,.4])!==-1/0)throw Error(`too few rows to have a distribution`);let n=re([.4,.41,.42,.9]);if(!(.9>=n&&.42<n))throw Error(`floor did not separate the outlier: ${n}`);let r=[{text:`opening titles`},{text:`the submarine dives`}];if(se(r,`submarine`).text!==`the submarine dives`)throw Error(`wrong passage quoted`);if(se(r,`nothing here`).text!==`opening titles`)throw Error(`must fall back to the first passage`);{let e=(e,t)=>({vector:[e,t],norm:Math.sqrt(e*e+t*t)||1}),t=[{row:{id:`ep1`,...e(1,0)},s:.9},{row:{id:`ep2`,...e(1,.01)},s:.89},{row:{id:`ep3`,...e(1,.02)},s:.88},{row:{id:`other`,...e(0,1)},s:.7}],n=ie(t,{limit:2,lambda:1}).map(e=>e.row.id);if(n.join()!==`ep1,ep2`)throw Error(`lambda 1 must be the old behaviour: ${n}`);let r=ie(t,{limit:2,lambda:.7}).map(e=>e.row.id);if(r.join()!==`ep1,other`)throw Error(`MMR must not return the same episode twice: ${r}`);if(ie(t,{limit:4,lambda:.5})[0].row.id!==`ep1`)throw Error(`the top hit must survive`);if(ie([{row:{id:`a`},s:1}],{limit:3}).length!==1)throw Error(`vectorless rows must pass through`)}let i=ce([{name:`old`,coverage:null},{name:`far`,coverage:{vectors:[[0,1]]}},{name:`near`,coverage:{vectors:[[1,0]]}}],[1,0]);if(i.map(e=>e.name).join(`,`)!==`near,far,old`)throw Error(`domains misranked: ${i.map(e=>e.name)}`);if(i[2].affinity!==null)throw Error(`an unmeasured domain must be null, not 0`);console.log(`rank.js self-check ok — word boundaries, matryoshka cosine, z-floor, MMR drops near-duplicates without moving the top hit, passage pick, domain affinity`)}var le=null,ue=null,k=null,de=new Map,fe=new Map,pe=new Map,me=e=>[e.name,e.path,e.desc].filter(Boolean).join(` `),he=null,ge=null;function A({resolveView:e,rowText:t,onManifests:n}={}){e&&(he=e),t&&(me=t),n&&(ge=n)}var _e=()=>{de.clear(),fe.clear(),pe.clear(),le=null,ue=null,k=null};function ve(e){ue=e?be(e):null}var ye=()=>ue,be=e=>String(e).replace(/\/+$/,``).replace(/\/(stream|cdn)$/,``);function xe(){return he?le??=Promise.resolve().then(()=>he()).then(e=>e?be(e):null).catch(e=>{throw le=null,e}):Promise.resolve(null)}function Se(e){let t=(Array.isArray(e)?e:String(e??``).split(`,`)).map(e=>String(e).trim()).filter(Boolean);k=t.length?t:null}var Ce=e=>!k||k.some(t=>e===t||e.split(`/`).pop()===t||e.startsWith(t)),we=`no quickbeam view configured — pass a view base, or wire one with configure({ resolveView })`;async function j(e,t){let n=e??ue??await xe();if(!n)throw Error(we);let r=fe.get(n);r||fe.set(n,r=new Set),t&&r.add(t);let i=de.get(n);if(i)return i;let a=Me(n,e=>{for(let t of r)try{t(e)}catch{}}).finally(()=>fe.delete(n)).catch(e=>{throw de.delete(n),e});return de.set(n,a),a}async function Te(e){let t=await fetch(e);if(!t.ok)throw Error(`shard: HTTP ${t.status} for ${e}`);return Ee(new Uint8Array(await t.arrayBuffer()))}var Ee=async e=>e[0]===31&&e[1]===139?await new Response(new Blob([e]).stream().pipeThrough(new DecompressionStream(`gzip`))).text():new TextDecoder().decode(e);function De(e,t){let n=e.fields??{},r=typeof e.v==`string`?w(e.v):Array.isArray(e.embedding)?e.embedding:typeof n.embed?.vec==`string`?w(n.embed.vec):null,i=0;if(r)for(let e of r)i+=e*e;return{id:e.track_id,owner:e.owner,...n,text:me(n,t),vector:r,norm:Math.sqrt(i)||1}}async function Oe(e){let t=0;for(let n of e)t+=n.length;let n=new Uint8Array(t),r=0;for(let t of e)n.set(t,r),r+=t.length;return[...new Uint8Array(await crypto.subtle.digest(`SHA-256`,n))].map(e=>e.toString(16).padStart(2,`0`)).join(``)}async function ke(e,t,n,r){if(!t)return;if(!r){console.warn(`shard: cannot verify ${e} — the transport decoded it (Content-Encoding), and the manifest digest is over the gzipped bytes`);return}let i=await Oe(n);if(i!==t)throw Error(`shard: ${e} does not match the digest in its manifest (expected ${t.slice(0,12)}…, got ${i.slice(0,12)}…)`)}async function Ae(e,t,n){let r=await fetch(e);if(!r.ok)throw Error(`shard: HTTP ${r.status} for ${e}`);if(!r.body){let i=new Uint8Array(await r.arrayBuffer());await ke(e,n,[i],i[0]===31&&i[1]===139);for(let e of(await Ee(i)).split(`
3
- `))t(e);return}let i=r.body.getReader(),a=await i.read(),o=a.value??new Uint8Array,s=n?[]:null,c=new ReadableStream({start(e){o.length&&(s?.push(o),e.enqueue(o)),a.done&&e.close()},async pull(e){let{done:t,value:n}=await i.read();t?e.close():(s?.push(n),e.enqueue(n))},cancel(e){return i.cancel(e)}}),l=o[0]===31&&o[1]===139,u=l?c.pipeThrough(new DecompressionStream(`gzip`)):c,d=new TextDecoder,f=``;for(let r=u.getReader();;){let{done:i,value:a}=await r.read();f+=i?d.decode():d.decode(a,{stream:!0});let o=f.split(`
4
- `);f=i?``:o.pop();for(let e of o)t(e);if(i){f&&t(f),await ke(e,n,s,l);return}}}var je=250;async function Me(e,t){let n=`${e}/cdn`,{domains:r=[]}=JSON.parse(await Te(`${n}/catalog`)),i=r.filter(e=>Ce(e.name));k&&i.length!==r.length&&console.info(`shard: pulling ${i.length} of ${r.length} domains (allowlist: ${k.join(`,`)})`),k&&!i.length&&console.warn(`shard: allowlist ${k.join(`,`)} matched none of ${r.map(e=>e.name).join(`, `)} — nothing will load`),i.length||console.warn(`shard: quickbeam view ${n} has no baked domains yet — nothing to read until the watcher bakes one.`);let a=new Map,o=new Set,s=await Promise.all(i.map(async e=>{let t=`${n}/domains/${encodeURIComponent(e.name)}`,r=JSON.parse(await Te(`${t}/manifest`));for(let e of r.tombstones??[])o.add(e);return{at:t,manifest:r,shards:r.shards??[]}})),c=s.map(e=>e.manifest);pe.set(e,c);try{ge?.(c,e)}catch(e){console.warn(`shard: onManifests threw, continuing with the default rowText —`,e)}let l=Date.now(),u=e=>{!t||!e&&Date.now()-l<je||(t([...a.values()]),l=Date.now())};return await Promise.all(s.map(async({at:t,shards:n})=>{for(let r of n)await Ae(`${t}/shards/${r.file}`,t=>{if(!t.trim())return;let n=De(JSON.parse(t),e);o.has(n.id)||a.set(n.id,n),u()},r.sha256),u(!0)})),[...a.values()]}function Ne(e,t){let n=null,r=!1;return(async()=>{let i=t??ue??await xe();if(!i||r)return;n=new EventSource(`${i}/stream`);let a=()=>{_e(),e()};n.addEventListener(`added`,a),n.addEventListener(`change`,a)})().catch(()=>{}),()=>{r=!0,n?.close()}}async function Pe(e,{url:t}={}){let n=t??ue??await xe();if(!n)throw Error(we);let{domains:r=[]}=JSON.parse(await Te(`${n}/cdn/catalog`));return ce(r,e)}if(typeof process<`u`&&import.meta.url===`file://${process.argv[1]}`&&process.argv[1].endsWith(`/shard.js`)){let{gzipSync:n}=await t(async()=>{let{gzipSync:t}=await import(`./__vite-browser-external-CKnVkMRn.js`).then(t=>e(t.default,1));return{gzipSync:t}},__vite__mapDeps([3,1]),import.meta.url),r=console.warn,i=console.info;console.warn=console.info=()=>{};let a=(e,t,n={},r)=>({track_id:`${e}:${t}`,owner:e,...r?{embedding:r}:{},fields:{entityType:`file`,name:t.split(`/`).pop(),path:t,...n}}),o=e=>e.map(e=>JSON.stringify(e)).join(`
5
- `),s=`https://registry.test/q/qb_test`,c=e=>{let t=Buffer.from(e),n=Math.max(1,Math.floor(t.length/2));return{ok:!0,headers:new Headers,arrayBuffer:async()=>t,body:new ReadableStream({start(e){e.enqueue(new Uint8Array(t.subarray(0,n))),e.enqueue(new Uint8Array(t.subarray(n))),e.close()}})}},l=async e=>[...new Uint8Array(await crypto.subtle.digest(`SHA-256`,e))].map(e=>e.toString(16).padStart(2,`0`)).join(``),u=async(e,{tombstones:t={},gzipped:r=!0,keep:i=!1,coverage:a={},digest:u=!1,corrupt:d=!1}={})=>{let f=new Map;for(let[r,i]of Object.entries(e)){let e=i.map((e,t)=>`shard-000${t}-${r}.ndjson.gz`),a=new Map(e.map((e,t)=>[e,o(i[t])])),s=u?await Promise.all(e.map(async e=>l(n(Buffer.from(d?a.get(e)+`
6
- `:a.get(e)))))):e.map(()=>void 0);f.set(r,{manifest:JSON.stringify({name:r,shards:e.map((e,t)=>({file:e,...s[t]?{sha256:s[t]}:{}})),tombstones:t[r]??[]}),bodies:a})}globalThis.fetch=async e=>{let{pathname:t}=new URL(String(e),`https://app.test`);if(t.includes(`/stream/`))return{ok:!1,status:404};if(t.endsWith(`/cdn/catalog`))return c(JSON.stringify({domains:[...f.keys()].map(e=>({name:e,...a[e]?{coverage:a[e]}:{}}))}));let i=t.match(/\/cdn\/domains\/([^/]+)\/manifest$/);if(i)return f.has(i[1])?c(f.get(i[1]).manifest):{ok:!1,status:404};if(i=t.match(/\/cdn\/domains\/([^/]+)\/shards\/([^/]+)$/),i){let e=f.get(i[1])?.bodies.get(i[2]);return e===void 0?{ok:!1,status:404}:c(r?n(Buffer.from(e)):Buffer.from(e))}return{ok:!1,status:404}},i||_e(),A({resolveView:()=>`${s}/stream`})},d=async(e,t={})=>u({d0:e},{...t,tombstones:{d0:t.tombstones??[]}}),f=e=>e.map(e=>e.path).sort().join(`,`);if(await d([[a(`0xa`,`a.md`)]]),f(await j())!==`a.md`)throw Error(`resolveView never reached the loader`);if(await d([[a(`0xa`,`plain.md`)]],{gzipped:!1}),f(await j())!==`plain.md`)throw Error(`an already-decoded body must still parse`);if(await d([[a(`0xa`,`signed.md`)]],{digest:!0}),f(await j())!==`signed.md`)throw Error(`a shard matching its digest must load`);await d([[a(`0xa`,`tampered.md`)]],{digest:!0,corrupt:!0});let p=null;try{await j()}catch(e){p=e}if(!p)throw Error(`a shard that does not match its digest must fail the load`);if(!/does not match the digest/.test(p.message))throw Error(`wrong error: ${p.message}`);p=null;try{await j()}catch(e){p=e}if(!p)throw Error(`a failed verification must not leave the rows in the cache`);let m=``;if(console.warn=e=>{m+=e},await d([[a(`0xa`,`unverifiable.md`)]],{digest:!0,gzipped:!1}),f(await j())!==`unverifiable.md`)throw Error(`an unverifiable body must still load`);if(!/cannot verify/.test(m))throw Error(`an unverifiable shard must say so, not pass silently`);if(console.warn=()=>{},await u({aaa:[[a(`0xa`,`a.md`,{desc:`alpha`}),a(`0xa`,`gone.md`,{desc:`retracted`})]],bbb:[[a(`0xb`,`b.md`,{desc:`beta`})]]},{tombstones:{aaa:[`0xa:gone.md`]}}),f(await j())!==`a.md,b.md`)throw Error(`domains must merge and tombstones retract`);for(let e of[`bbb`,[`bbb`],`bb`])if(await u({aaa:[[a(`0xa`,`a.md`)]],bbb:[[a(`0xb`,`b.md`)]]}),Se(e),f(await j())!==`b.md`)throw Error(`allowlist ${JSON.stringify(e)} did not narrow the load`);if(await u({aaa:[[a(`0xa`,`a.md`)]]}),Se(null),f(await j())!==`a.md`)throw Error(`a null allowlist must pull everything`);await d([[a(`0xa`,`a.md`),a(`0xa`,`gone.md`)],[a(`0xa`,`b.md`)]],{tombstones:[`0xa:gone.md`]});{let e=[],t=await j(void 0,t=>e.push(t.length));if(e.length!==2||e[0]!==1||e[1]!==2)throw Error(`must emit per shard, got ${e}`);if(t.length!==2)throw Error(`the final rows must still be whole`);if(e.some(e=>e>2))throw Error(`a tombstoned row must never surface in a partial emit`)}await d([[a(`0xa`,`a.md`)],[a(`0xa`,`b.md`)]]);{let e=[],t=[],n=j(void 0,t=>e.push(t.length)),r=j(void 0,e=>t.push(e.length));if(await Promise.all([n,r]),!e.length)throw Error(`the starting caller must still receive partials`);if(!t.length)throw Error(`a caller that joins an in-flight load must receive partials too`)}if(_e(),A({resolveView:()=>`${s}/stream`}),globalThis.fetch=async()=>({ok:!1,status:500}),await j().then(()=>{throw Error(`a 500 must reject`)},()=>{}),await d([[a(`0xa`,`a.md`)]],{keep:!0}),f(await j())!==`a.md`)throw Error(`a failed load poisoned the cache — the next read must retry`);{let e=[];await u({d0:[[a(`0xa`,`a.md`,{blurb:`declared prose`})]]}),A({onManifests:t=>e.push(`manifests:${t[0]?.name}`),rowText:t=>(e.push(`rowText`),t.blurb??``)});let t=await j();if(e[0]!==`manifests:d0`)throw Error(`onManifests must fire first, got ${e}`);if(!e.includes(`rowText`))throw Error(`rowText never ran`);if(t[0].text!==`declared prose`)throw Error(`the manifest-derived rowText did not reach toRow`);if(_e(),A({resolveView:()=>`${s}/stream`,onManifests:()=>{throw Error(`boom`)}}),(await j()).length!==1)throw Error(`a throwing onManifests must not fail the load`);A({onManifests:()=>{}})}if(await d([[a(`0xa`,`ep1.md`,{cues:[{text:`the submarine dives`}]})]]),(await j())[0].text.includes(`submarine`))throw Error(`the default rowText must not know about cues`);if(A({rowText:e=>e.cues?.length?e.cues.map(e=>e.text).join(` `):[e.name,e.path,e.desc].filter(Boolean).join(` `)}),_e(),A({resolveView:()=>`${s}/stream`}),!(await j())[0].text.includes(`submarine`))throw Error(`a configured rowText must reach toRow`);{let e=new Set;if(A({rowText:(t,n)=>(e.add(n),t.name??``),onManifests:(t,n)=>{e.add(`m:${n}`)}}),_e(),A({resolveView:()=>`${s}/stream`}),await j(),!e.has(s))throw Error(`rowText must receive its trimmed view base, saw ${[...e]}`);if(!e.has(`m:${s}`))throw Error(`onManifests must receive its view`);A({rowText:e=>[e.name,e.path,e.desc].filter(Boolean).join(` `),onManifests:()=>{}})}await d([[a(`0xa`,`v.md`,{},[3,4]),a(`0xa`,`packed.md`,{embed:{vec:`fwA=`}}),a(`0xa`,`none.md`)]]);{let e=new Map((await j()).map(e=>[e.path,e]));if(Math.abs(e.get(`v.md`).norm-5)>1e-9)throw Error(`norm must be precomputed from the plain float array`);if(!e.get(`packed.md`).vector)throw Error(`the base64 int8 form a publisher commits must unpack`);if(e.get(`none.md`).vector!==null)throw Error(`a row with no vector must be null, and rank lexically`);if(e.get(`none.md`).norm!==1)throw Error(`a zero norm would divide search by zero`)}{await u({d0:[[{track_id:`p1`,owner:`0xa`,v:`AH+B`,fields:{entityType:`file`,name:`packed.md`,path:`packed.md`}},{track_id:`p2`,owner:`0xa`,embedding:[0,1,-1],fields:{entityType:`file`,name:`old.md`,path:`old.md`}}]]});let e=new Map((await j()).map(e=>[e.path,e])),t=e.get(`packed.md`).vector,n=e.get(`old.md`).vector;if(!t)throw Error("the bake's `v` key must unpack");for(let e=0;e<3;e++)if(Math.abs(t[e]-n[e])>1/127)throw Error(`packed and float forms disagree at ${e}: ${t[e]} vs ${n[e]}`);if(Math.abs(e.get(`packed.md`).norm-e.get(`old.md`).norm)>.02)throw Error(`norm must match across wire forms`)}await u({near:[[a(`0xa`,`a.md`)]],far:[[a(`0xb`,`b.md`)]],old:[[a(`0xc`,`c.md`)]]},{coverage:{near:{vectors:[[1,0]]},far:{vectors:[[0,1]]}}});{let e=await Pe([1,0]);if(e.map(e=>e.name).join(`,`)!==`near,far,old`)throw Error(`suggestDomains misranked: ${e.map(e=>e.name)}`)}await d([[a(`0xa`,`before.md`)]]);{let e=new Map,t=``,n=!1;globalThis.EventSource=class{constructor(e){t=e}addEventListener(t,n){e.set(t,n)}close(){n=!0}};let r=0,i=Ne(()=>{r++});if(await new Promise(e=>setTimeout(e,0)),t!==`${s}/stream`)throw Error(`watchShard must open the view's SSE stream, got ${t}`);if(e.has(`snapshot`))throw Error(`snapshot is the connect-time census, not a change`);if(f(await j())!==`before.md`)throw Error(`watchShard fixture never loaded`);if(await d([[a(`0xa`,`after.md`)]],{keep:!0}),e.get(`change`)(),r!==1)throw Error("a `change` event must reach the caller");if(f(await j())!==`after.md`)throw Error("a `change` must drop the cache so the next read re-pulls");if(i(),!n)throw Error(`the unsubscribe must close the stream`)}if(await u({d0:[[a(`0xa`,`home.md`)]],other:[[a(`0xb`,`guest.md`)]]}),await j(),ve(`${s}/cdn`),ye()!==s)throw Error(`setView must trim to the base every route hangs off`);if(ve(null),ye()!==null)throw Error(`setView(null) must go back to the app default`);console.warn=r,console.info=i,console.log(`shard.js self-check ok — resolveView, gzip sniff, shard digests, domain merge + tombstones + allowlist, streaming, late subscriber, cache poisoning, rowText, vectors, suggestDomains, watchShard`)}var Fe=new Set([`text`,`vector`,`norm`,`id`,`owner`,`embed`]),Ie=(e,t,n=[])=>{let r=c(e,t,n),i=d(e,t);return i?{...r,url:i}:r};function Le(e){let t=new Map,n=0,r=0;for(let i of e){i.vector&&(n++,r||=i.vector.length);for(let e of Object.keys(i))Fe.has(e)||i[e]!=null&&i[e]!==``&&t.set(e,(t.get(e)??0)+1)}return{rows:e.length,withVectors:n,vectorDim:r,owners:[...new Set(e.map(e=>e.owner).filter(Boolean))],fields:[...t].sort((e,t)=>t[1]-e[1]).map(([t,n])=>({name:t,on:n,pct:Math.round(100*n/(e.length||1))}))}}var Re=.15,ze=new WeakMap,Be=(e,t)=>{let n=ze.get(e);return n===void 0&&(n=[s(e,t),i(e,t)??``,...(t.tags??[]).flatMap(t=>a(e[t]??``)),e.text??``].join(` `),ze.set(e,n)),n};function M(e,t,n,{qv:r=null,limit:i=10,fields:a,where:o,lexBoost:s=Re}={}){let c=t.trim().toLowerCase();if(!c)return[];let l=r?D(r):1;o&&(e=e.filter(e=>Ve(e,o)));let u=e.map(e=>r&&e.vector?{r:e,score:E(e,r,l)+(s?s*O({text:Be(e,n)},c):0),mode:`semantic`}:{r:e,score:O({text:Be(e,n)},c),mode:`lexical`}),d=u.filter(e=>e.mode===`semantic`).map(e=>e.score),f=Math.min(re(d),d.length?Math.max(...d):1/0);return u.filter(e=>e.mode===`semantic`?e.score>=f:e.score>0).sort((e,t)=>t.score-e.score).slice(0,i).map(({r:e,score:t,mode:r})=>({...Ie(e,n,a),score:Number(t.toFixed(4)),mode:r}))}var Ve=(e,t)=>!t||Object.entries(t).every(([t,n])=>a(e[t]??``).some(e=>e.toLowerCase()===String(n).toLowerCase()));function He(e,t,{limit:n=20,where:r}={}){let i=new Map,o=0;for(let n of e){if(!Ve(n,r))continue;let e=n[t];if(e==null||e===``){o++;continue}for(let t of a(e))i.set(t,(i.get(t)??0)+1)}let s=[...i].sort((e,t)=>t[1]-e[1]);return{field:t,distinct:i.size,missing:o,top:s.slice(0,n).map(([e,t])=>({value:e,count:t}))}}function N(e,t,{type:n,where:r,sort:i,desc:a=!0,limit:s=20,offset:c=0,fields:l}={}){let d=e.filter(e=>(!n||o(e)?.toLowerCase()===String(n).toLowerCase())&&Ve(e,r)),f=d.length;if(i){let e=e=>e==null||e===``?null:Number(e);d=[...d].sort((t,n)=>{let[r,o]=[t[i],n[i]];if((r==null||r===``)!=(o==null||o===``))return r==null||r===``?1:-1;let[s,c]=[e(r),e(o)],l=Number.isFinite(s)&&Number.isFinite(c)?s-c:String(r??``).localeCompare(String(o??``));return a?-l:l})}return{total:f,offset:c,returned:Math.min(s,Math.max(0,f-c)),collections:n?void 0:u(t,e).map(e=>({type:e.type,plural:e.plural,count:e.count})),rows:d.slice(c,c+s).map(e=>Ie(e,t,l))}}function Ue(e,t,n,{limit:r=10,fields:i}={}){let a=e.find(e=>e.id===t);if(!a?.vector)return{seed:a?Ie(a,n,i):null,near:[]};let o=a.norm;return{seed:Ie(a,n,i),near:e.filter(e=>e.id!==t&&e.vector).map(e=>({r:e,score:E(e,a.vector,o)})).sort((e,t)=>t.score-e.score).slice(0,r).map(({r:e,score:t})=>({...Ie(e,n,i),score:Number(t.toFixed(4))}))}}function We(e,t,n){if(!t)return null;let r=e.find(e=>e.id===t)??(n?.identity?e.find(e=>String(e[n.identity])===String(t)):null)??e.find(e=>e.path===t||e.name===t||s(e,n)===t);if(!r)return null;let{vector:i,norm:a,...o}=r;return{...o,hasVector:!!i,vectorDim:i?.length??0}}if(typeof process<`u`&&import.meta.url===`file://${process.argv[1]}`&&process.argv[1].endsWith(`/tools.js`)){let{rolesFrom:e}=await t(async()=>{let{rolesFrom:e}=await import(`./roles-YDRjv_PY.js`);return{rolesFrom:e}},__vite__mapDeps([4,5]),import.meta.url),n=(e,t,n)=>({id:e,owner:`0xa`,...t,text:[t.name,t.desc].filter(Boolean).join(` `),vector:n??null,norm:n?D(n):1}),r=[n(`1`,{name:`Duet S01E02`,series:`Duet`,year:`1987`,subject:`['Sitcom', 'Comedy']`,desc:`a forgotten fox sitcom`},[1,0,0]),n(`2`,{name:`Duet S01E03`,series:`Duet`,year:`1987`,subject:`['Sitcom']`,desc:`more of the same sitcom`},[.99,.1,0]),n(`3`,{name:`Atomic Cafe`,series:``,year:`1982`,subject:`['Documentary', 'Cold War']`,desc:`nuclear test footage`},[0,1,0]),n(`4`,{name:`untitled reel`,year:`1954`})],i=e([],r);if(i.title[0]!==`name`)throw Error(`fixture roles wrong: ${i.title}`);let o=Le(r);if(o.rows!==4||o.withVectors!==3||o.vectorDim!==3)throw Error(`describe lost the corpus shape`);let s=o.fields.find(e=>e.name===`series`);if(s.on!==2||s.pct!==50)throw Error(`empty strings must not count as coverage: ${JSON.stringify(s)}`);if(o.fields.some(e=>Fe.has(e.name)))throw Error(`plumbing fields must not be offered as content`);if(o.owners.join()!==`0xa`)throw Error(`owners lost`);let c=M(r,`sitcom`,i,{qv:[1,0,0],limit:10});if(c[0].id!==`1`||c[0].title!==`Duet S01E02`)throw Error(`semantic: wrong top hit ${c[0]?.id}`);if(c[0].mode!==`semantic`)throw Error(`mode must be reported, not inferred`);if(c.some(e=>e.id===`3`))throw Error(`the z-floor must drop the unrelated row: ${JSON.stringify(c)}`);if(!M([r[0],r[1],r[2]],`sitcom`,i,{qv:[1,0,0]}).length)throw Error(`an exact match must never be filtered out by its own floor`);if(c=M(r,`nuclear`,i,{limit:10}),c[0]?.id!==`3`||c[0].mode!==`lexical`)throw Error(`must degrade to lexical, and say so`);if(M(r,` `,i).length)throw Error(`an empty query must return nothing, not everything`);if(M(r,`untitled reel`,i)[0]?.id!==`4`)throw Error(`a vectorless row must still be searchable lexically`);let l=He(r,`subject`);if(l.top[0].value!==`Sitcom`||l.top[0].count!==2)throw Error(`list-ish values must split: ${JSON.stringify(l.top)}`);if(l.missing!==1)throw Error(`a field absent from a row must be counted missing, not skipped silently`);if(He(r,`year`).distinct!==3)throw Error(`plain values must not be split`);if(a(`Sitcom,Comedy,Fox`).length!==3)throw Error(`a machine-joined list must split`);if(a(`Wilson, Michael G.`).length!==1)throw Error(`a comma followed by a space is prose, not a list`);if(a(`1987`).length!==1)throw Error(`a plain value must stay whole`);let u=He(r,`year`,{where:{subject:`Sitcom`}});if(u.distinct!==1||u.top[0].value!==`1987`)throw Error(`where must narrow the facet: ${JSON.stringify(u.top)}`);if(He(r,`year`,{where:{subject:`sitcom`}}).distinct!==1)throw Error(`where must match case-insensitively`);if(He(r,`year`,{where:{subject:`Sit`}}).distinct!==0)throw Error(`where must match whole values, not substrings`);let d=N(r,i,{limit:2});if(d.total!==4||d.rows.length!==2)throw Error(`browse must page: ${JSON.stringify(d)}`);if(d.collections.length!==0)throw Error(`a typeless corpus must report zero collections, not invent one`);if(N(r,i,{offset:3}).rows.length!==1)throw Error(`offset must page to the tail`);if(N(r,i,{offset:99}).rows.length!==0)throw Error(`an offset past the end must be empty, not wrapped`);let f=r.map(e=>({...e,entityType:e.id===`3`?`Film`:`Episode`})),p=N(f,i,{limit:1}).collections;if(p.map(e=>`${e.type}:${e.count}`).join()!==`Episode:3,Film:1`)throw Error(`collections must count and sort: ${JSON.stringify(p)}`);if(N(f,i,{type:`film`}).total!==1)throw Error(`type must match case-insensitively`);if(N(f,i,{type:`film`}).collections!==void 0)throw Error(`a typed browse is already inside a collection`);if(N(f,i,{type:`Episode`,where:{year:`1987`}}).total!==2)throw Error(`browse must honour where`);let m=[{id:`a`,rating:`9`},{id:`b`,rating:`10`},{id:`c`}],h=N(m,i,{sort:`rating`}).rows.map(e=>e.id);if(h.join()!==`b,a,c`)throw Error(`numeric sort + missing-last wrong: ${h}`);if(N(m,i,{sort:`rating`,desc:!1}).rows[0].id!==`a`)throw Error(`ascending sort ignored`);let g=Ue(r,`1`,i);if(g.near[0].id!==`2`)throw Error(`nearest neighbour missed the near-identical row`);if(g.near.some(e=>e.id===`1`))throw Error(`a row must not be its own neighbour`);if(g.near.some(e=>e.id===`4`))throw Error(`a vectorless row cannot be a neighbour`);if(Ue(r,`4`,i).near.length)throw Error(`a vectorless seed must return nothing, not throw`);if(Ue(r,`nope`,i).seed!==null)throw Error(`an unknown seed must be null, not undefined`);let _=We(r,`3`,i);if(_.name!==`Atomic Cafe`||!_.hasVector||_.vectorDim!==3)throw Error(`getRow lost the record`);if(`vector`in _||`norm`in _)throw Error(`the raw vector must never reach a tool result`);if(We(r,`nope`,i)!==null)throw Error(`an unknown id must be null`);let v=Ie(n(`x`,{name:`n`,categories:`d`.repeat(500)}),e([{role_map:{title:`name`,tags:[`categories`]}}]));if(v.categories.length>200)throw Error(`brief must truncate a long field`);if(v.title!==`n`)throw Error(`brief must title from the declared field`);{let e=[{id:`a`,name:`cold war thriller`,year:1965,vector:[1,0],norm:1},{id:`b`,name:`cold war comedy`,year:1999,vector:[1,0],norm:1},{id:`c`,name:`beach party`,year:1964,vector:[0,1],norm:1},{id:`d`,name:`surf movie`,year:1966,vector:[0,1],norm:1}],t={title:[`name`],subtitle:[],tags:[],text:[`name`],measures:[],fields:[`year`]};if(!M(e,`cold war`,t,{qv:[1,0],limit:10}).some(e=>e.title===`cold war comedy`))throw Error(`unfiltered search must see every era`);let n=M(e,`cold war`,t,{qv:[1,0],limit:10,where:{year:1965}});if(n.length!==1||n[0].title!==`cold war thriller`)throw Error(`where must narrow a semantic search: ${JSON.stringify(n)}`);if(M(e,`cold war`,t,{qv:[0,1],limit:10,where:{year:1964}})[0]?.title!==`beach party`)throw Error(`the floor must be measured over the filtered rows`)}{let e=[{id:`a`,name:`cold war thriller`,vector:[1,0],norm:1}],t={title:[`name`],subtitle:[],tags:[],text:[`name`],measures:[],fields:[]},n=M(e,`cold war`,t,{qv:[1,0],limit:5});if(!Array.isArray(n))throw Error(`search must return a flat array, not {hits}`);if(n[0].score===void 0||n[0].mode===void 0)throw Error(`search rows carry score+mode`);for(let n of[void 0,null,``])if(We(e,n,t)!==null)throw Error(`getRow(${JSON.stringify(n)}) must be null`)}console.log(`tools.js self-check ok — coverage not schema, semantic/lexical modes + z-floor, list-ish facets + where, neighbours, whole-row fetch, previews truncate`)}var Ge=e=>new Float32Array(e),Ke=e=>new Float32Array(e),qe=(e,t)=>{let n=new Float32Array(e.length);for(let r=0;r<e.length;r++)n[r]=e[r]+t[r];return n},Je=(e,t)=>{let n=new Float32Array(e.length);for(let r=0;r<e.length;r++)n[r]=e[r]-t[r];return n},P=(e,t)=>{let n=new Float32Array(e.length);for(let r=0;r<e.length;r++)n[r]=e[r]*t;return n},Ye=(e,t)=>{let n=0;for(let r=0;r<e.length;r++)n+=e[r]*t[r];return n},Xe=e=>Math.sqrt(Ye(e,e)),Ze=(e,t)=>Xe(Je(e,t)),Qe=e=>{if(e.length===0)throw Error(`centroid: empty input`);let t=e[0].length,n=new Float32Array(t);for(let r of e)for(let e=0;e<t;e++)n[e]+=r[e];for(let r=0;r<t;r++)n[r]/=e.length;return n},$e=(e,t)=>{let n=Xe(t);if(n<1e-10)return Ke(e);let r=P(t,1/n),i=Ye(e,r);return i<=0?Ke(e):Je(e,P(r,i))},F={d:768,alpha:.1,beta:.3,lambda_max:.4,sigma_base:.5,sigma_max:1,rho:.8,epsilon:1e-6,prior_k:1,pass_window:20,gamma_base:.15,gamma_reg:2,temp_base:1,temp_max:3,alpha_facet:.3,facet_decay:.05,pass_facet_pen:.2,beta_group:.7,group_logistic_c:3,rho_scalar:.8,scalar_sigma:.5,tau_facet:1,tau_group:2,tau_scalar:.5,facet_floor:.01,delta_pass:1,theta_B:3,fatigue_threshold:.3},et=(e,t)=>{let n=1-t;return Object.fromEntries(Object.entries(e).map(([e,t])=>[e,Object.fromEntries(Object.entries(t).map(([e,t])=>[e,t*n]))]))},tt=(e,t,n)=>{if(!t)return e;let r={...e};for(let[e,i]of Object.entries(t)){if(!i.length)continue;let t={...r[e]??{}};for(let e of i)t[e]=Math.max((t[e]??0)+n,0);r[e]=t}return r},nt=e=>typeof e==`number`&&e>0&&Number.isFinite(e),rt=e=>{if(e.length===0)return{passCentroid:null,passRadius:0};let t=Qe(e),n=0;for(let r of e){let e=Ze(r,t);e>n&&(n=e)}return{passCentroid:t,passRadius:n}},it=(e={})=>{let{sigma_base:t=F.sigma_base,d:n=F.d}=e;return{mu:Ge(n),v:Ge(n),sigma:t,passes:[],passCentroid:null,passRadius:0,t:0,entropy:.2,facets:{},groups:{},scalarPref:null,neg:{},blacklist:new Set,muted:new Set}},at=(e,t={})=>{let{lambda_max:n=F.lambda_max}=t,r=Xe(e.v);if(r<1e-10)return Ke(e.mu);let i=P(e.v,1/r),a=n*Math.tanh(r);return qe(e.mu,P(i,a))},ot=(e,t,n=null,r={})=>{let{alpha:i=F.alpha,beta:a=F.beta,sigma_base:o=F.sigma_base,rho:s=F.rho,prior_k:c=F.prior_k,alpha_facet:l=F.alpha_facet,facet_decay:u=F.facet_decay,beta_group:d=F.beta_group,rho_scalar:f=F.rho_scalar}=r,p=t.embedding,m=e.mu,h=e.t+1,g=i/(1-(1-i)**h),_=qe(m,P(Je(p,m),g));if(n!==null){let e=c/h;_=qe(_,P(Je(n,_),Math.min(e,1)))}let v=e.t===0?e.v:qe(P(e.v,a),P(Je(p,m),1-a)),y=s*e.sigma+(1-s)*o,b=tt(et(e.facets,u),t.facets,l),x=t.group===void 0?e.groups:{...e.groups,[t.group]:d*(e.groups[t.group]??0)+(1-d)},S=nt(t.scalar)?e.scalarPref===null?Math.log(t.scalar):f*e.scalarPref+(1-f)*Math.log(t.scalar):e.scalarPref;return{...e,mu:_,v,sigma:y,t:h,entropy:Math.max(e.entropy*.95,.05),facets:b,groups:x,scalarPref:S}},st=(e,t,n={})=>{let{sigma_max:r=F.sigma_max,gamma_base:i=F.gamma_base,pass_window:a=F.pass_window,pass_facet_pen:o=F.pass_facet_pen,beta_group:s=F.beta_group,delta_pass:c=F.delta_pass,theta_B:l=F.theta_B,epsilon:u=F.epsilon,fatigue_threshold:d=F.fatigue_threshold}=n,f=t.embedding,p=e.mu,m=e.entropy,h=t.group,g=e.neg,_=e.blacklist,v=e.groups,y=e.muted;if(h!==void 0){let t=e.groups[h]??0;t>d?(y=new Set(e.muted),y.add(h)):(g={...e.neg,[h]:(e.neg[h]??0)+c},_=new Set(e.blacklist),g[h]>l&&_.add(h),v={...e.groups,[h]:s*t+(1-s)*-1})}let b=tt(e.facets,t.facets,-o),x=$e(e.v,Je(f,p)),S=Je(p,f),ee=Xe(S),te=i*(1+m),C=e.t>0&&ee>=u?qe(p,P(S,te/ee)):p,w=[...e.passes,Ke(f)];w.length>a&&w.shift();let{passCentroid:T,passRadius:ne}=rt(w);return{...e,mu:C,v:x,sigma:Math.min(e.sigma*1.1,r),passes:w,passCentroid:T,passRadius:ne,entropy:Math.min(m*1.1+.02,1),facets:b,groups:v,neg:g,blacklist:_,muted:y}},ct=e=>{if(!e)return null;let t=D(e),n=new Float32Array(e.length);for(let r=0;r<e.length;r++)n[r]=e[r]/t;return n};function I(e=[],t=[],{drift:n=.35}={}){let r=e.filter(e=>e?.vector?.length);if(!r.length)return null;let i={d:r[0].vector.length,alpha:1-2**(-1/8)},a=e=>({embedding:Float32Array.from(e.vector)}),o=it(i);for(let e of r)o=ot(o,a(e),null,i);r.length<4&&(o={...o,v:new Float32Array(i.d)});let s=t.filter(e=>e?.vector?.length);for(let e of s)o=st(o,a(e),i);return{mu:ct(o.mu),v:D(o.v)>1e-6&&r.length>=4?ct(o.v):null,q:ct(at(o,{lambda_max:n})),no:ct(o.passCentroid),drift:n,from:r.map(e=>e.title??e.id).slice(-12),rejected:s.map(e=>e.title??e.id).slice(-12),n:r.length}}var lt=.6,ut=(e,t)=>{if(!e?.vector||!t)return null;let n=ft(t),r=e.norm?e:{vector:e.vector,norm:D(e.vector)},i=E(r,t.q,n.q);return t.no?i-lt*Math.max(0,E(r,t.no,n.no)):i},dt=new WeakMap;function ft(e){let t=dt.get(e);return(!t||t.qv!==e.q||t.nov!==e.no)&&dt.set(e,t={qv:e.q,nov:e.no,q:D(e.q),no:e.no?D(e.no):1}),t}function L(e,t,{limit:n=10,exclude:r=new Set,lambda:i=.7}={}){return t?ie(e.filter(e=>e.vector&&!r.has(e.id)).map(e=>({row:e,s:ut(e,t)})).sort((e,t)=>t.s-e.s),{limit:n,lambda:i}).map(({row:e,s:t})=>({row:e,score:Number(t.toFixed(4))})):[]}var pt={lookahead:[.35,`how far past what you like, toward where your recent likes are heading (the kernel's drift)`],variety:[.3,`how different the picks are from each other`],surprise:[0,`how much chance reorders the list; 0 is strict best-first`],reach:[0,`how far out from the closest matches to start: 0 is nearest, 1 skips the nearest ~400`]},mt=(e,t)=>Math.min(1,Math.max(0,Number.isFinite(Number(e))?Number(e):t));function R(e,t=[],n=[],{limit:r=20,seed:i=1,exclude:a=new Set,...o}={}){let s=Object.fromEntries(Object.entries(pt).map(([e,[t]])=>[e,mt(o[e],t)])),c=I(t,n,{drift:s.lookahead});if(!c)return{taste:null,knobs:{...s,seed:i},picks:[]};let l=new Set([...a,...t.map(e=>e.id),...n.map(e=>e.id)]),u=e.filter(e=>e.vector&&!l.has(e.id)),d=Math.round(s.reach*Math.min(400,u.length/4)),f=d+300,p=[];for(let e of u){let t=ut(e,c);if(p.length===f&&!(t>p[f-1].s))continue;let n=p.length;for(;n>0&&p[n-1].s<t;)n--;p.splice(n,0,{row:e,s:t}),p.length>f&&p.pop()}let m=p.slice(d);if(s.surprise){let e=Number(i)>>>0||1,t=()=>{e=e+1831565813>>>0;let t=Math.imul(e^e>>>15,1|e);return t^=t+Math.imul(t^t>>>7,61|t),((t^t>>>14)>>>0)/4294967296};m=m.map(e=>({...e,s:e.s+.04*s.surprise*-Math.log(-Math.log(t()*.999998+1e-6))})).sort((e,t)=>t.s-e.s)}return{taste:{from:c.from,rejected:c.rejected,heading:!!c.v,n:c.n},knobs:{...s,seed:i},picks:ie(m,{limit:r,lambda:1-.6*s.variety}).map(({row:e,s:t})=>({row:e,score:Number(t.toFixed(4))}))}}var z=e=>e&&{v:1,model:`nomic-256`,drift:e.drift,n:e.n,q:C(Array.from(e.q)),mu:C(Array.from(e.mu)),...e.v?{d:C(Array.from(e.v))}:{},...e.no?{no:C(Array.from(e.no))}:{},from:e.from,rejected:e.rejected};function ht(e){if(!e?.q)return null;let t=w(e.q),n=w(e.mu??e.q);return t?{q:t,mu:n??t,v:e.d?w(e.d):null,no:e.no?w(e.no):null,drift:e.drift??.35,from:e.from??[],rejected:e.rejected??[],n:e.n??0}:null}var gt=`(remembered`;function _t(e,{carried:t=null,likes:n=[],dislikes:r=[]}={}){if(!e)return e;let i=t??{from:[],rejected:[],n:0},a=e=>e.filter(e=>!String(e?.id??``).startsWith(gt)).map(e=>e.title??e.id),o=a(n);return{...e,v:e.v??i.v??null,from:[...i.from??[],...o].slice(-12),rejected:[...i.rejected??[],...a(r)].slice(-12),n:(i.n??0)+o.length}}if(typeof process<`u`&&import.meta.url===`file://${process.argv[1]}`&&process.argv[1].endsWith(`/taste.js`)){{let e=L([{id:`a`,vector:[1,0],norm:1},{id:`b`,vector:[0,1],norm:1}],{q:[1,0]});if(!e.length)throw Error(`recommend must rank rows with vectors`);if(e[0].row===void 0)throw Error(`recommend rows carry .row`);if(typeof e[0].score!=`number`)throw Error(`recommend rows carry .score (not .s)`)}let e=(e,t,n=e)=>({id:e,title:n,vector:Float32Array.from(t),norm:D(t)}),t=[1,0,0],n=[0,1,0],r=[0,0,1],i=(e,t,n)=>e.map((e,r)=>e*(1-n)+t[r]*n),a=I([e(`a`,t),e(`b`,i(t,r,.2)),e(`c`,i(t,r,.1))]);if(!a)throw Error(`three likes must make a taste`);if(a.v!==null)throw Error(`under four picks there is no older half — direction must not be invented`);if(E({vector:a.q,norm:D(a.q)},Float32Array.from(t),1)<.9)throw Error(`q must sit near what was liked`);let o=[e(`x`,n,`a comedy`),e(`y`,i(t,r,.15),`a bleak documentary`),e(`z`,r,`a documentary`)];if(L(o,a)[0].row.title!==`a bleak documentary`)throw Error(`taste must rank an unseen pool`);let s=[e(`1`,t),e(`2`,i(t,n,.2)),e(`3`,i(t,n,.4)),e(`4`,i(t,n,.6))];if(a=I(s),a.v===null)throw Error(`four picks must yield a direction`);let c=E({vector:a.q,norm:D(a.q)},Float32Array.from(n),1),l=E({vector:a.mu,norm:D(a.mu)},Float32Array.from(n),1);if(!(c>l))throw Error(`q must lean further toward where it is heading than mu: ${c} vs ${l}`);let u=I(s,[],{drift:0});if(E({vector:u.q,norm:D(u.q)},u.mu,D(u.mu))<.999)throw Error(`drift 0 must be mu`);let d=[e(`p`,i(t,n,.7))],f=[e(`m`,t,`bleak`),e(`n`,n,`comic`)];if(L(f,I(d))[0].row.title!==`comic`)throw Error(`sanity: the taste leans comic`);if(L(f,I(d,[e(`q`,n)]))[0].row.title!==`bleak`)throw Error(`rejecting comic must flip the ranking to bleak`);let p=e(`a`,t,`the one they liked`);if(L([p,e(`other`,i(t,r,.1),`similar`)],I([p]),{exclude:new Set([`a`])}).some(e=>e.row.id===`a`))throw Error(`must not recommend what the taste was built from`);a=I(s);let m=z(a),h=JSON.stringify(m).length,g=ht(m);if(!g)throw Error(`a taste must survive the round trip`);let _=L(o,a).map(e=>e.row.id).join(),v=L(o,g).map(e=>e.row.id).join();if(_!==v)throw Error(`ranking changed across the wire: ${_} vs ${v}`);if(!m.from.length)throw Error(`a taste must say what it was built from, or it cannot be corrected`);if(!a.v)throw Error(`this fixture is meant to have a heading`);if(!g.v)throw Error(`a heading must survive the wire — q leans on it, so an export without it lies`);if(E({vector:g.v,norm:D(g.v)},a.v,D(a.v))<.98)throw Error(`…and must survive it intact`);if(ht({})!==null||ht(null)!==null)throw Error(`a malformed taste must be null, not a crash`);if(I([])!==null)throw Error(`no likes is no taste, not an empty one`);if(L(o,null).length)throw Error(`no taste recommends nothing`);if(ut({vector:null},a)!==null)throw Error(`a vectorless row scores null, not NaN`);{let e=(e,t)=>{let n=t*Math.PI/180;return{id:e,vector:[Math.cos(n),Math.sin(n)],norm:1}},t=[e(`run1`,0),e(`run2`,.8),e(`run3`,1.6),e(`run4`,2.4),e(`other`,60)],n=I([{id:`seed`,...e(`seed`,30)}]),r=L(t,n,{limit:3,lambda:1}).map(e=>e.row.id);if(r.some(e=>e===`other`))throw Error(`relevance alone must fill up with the run: ${r}`);let i=L(t,n,{limit:3}).map(e=>e.row.id);if(!i.includes(`other`))throw Error(`MMR must spend a slot on something else: ${i}`);if(i[0]!==r[0])throw Error(`the best match must still come first: ${i[0]} vs ${r[0]}`)}{let a=z(I([e(`a`,t,`The Golem`),e(`b`,n,`Nosferatu`),e(`c`,r,`Metropolis`)],[e(`z`,r,`Wrestling`)]));if(a.n!==3||a.from.length!==3)throw Error(`a fresh export carries what it was built from`);let o=ht(a),s=[{id:`(remembered)`,title:`what you liked before · ${o.n} picks`,vector:o.q}],c=o.no?[{id:`(remembered-no)`,title:`what you passed on before`,vector:o.no}]:[];if(z(I(s,c)).n!==1)throw Error(`this is the loss the next assertion is about`);let l=z(_t(I(s,c),{carried:o,likes:s,dislikes:c}));if(l.n!==3)throw Error(`a restored taste must not report itself as one pick: ${l.n}`);if(!l.from.includes(`Nosferatu`))throw Error(`…and must still name what it was built from`);if(l.from.some(e=>e.startsWith(`(remembered`)))throw Error(`the synthetic placeholder is not a title`);if(!l.rejected.includes(`Wrestling`))throw Error(`rejections are provenance too`);let u=[...s,e(`d`,n,`Sunrise`)],d=z(_t(I(u,c),{carried:o,likes:u,dislikes:c}));if(d.n!==4)throw Error(`a new pick must count once: ${d.n}`);if(d.from.filter(e=>e===`Nosferatu`).length!==1)throw Error(`…and must not duplicate the carried ones`);{let r=ht(z(I([e(`p`,t,`1`),e(`q`,i(t,n,.3),`2`),e(`r`,i(t,n,.6),`3`),e(`s`,n,`4`)]))),a=[{id:`(remembered)`,title:`before`,vector:r.q}];if(!_t(I(a),{carried:r,likes:a}).v)throw Error(`a restored session must keep the heading its own q was built with`);if(I(a).v)throw Error(`…which the kernel alone cannot supply from one entry`)}let f=z(_t(I(s,c),{carried:ht(l),likes:s,dislikes:c}));if(f.n!==3||f.from.join()!==l.from.join())throw Error(`a second reload must change nothing`)}{let e=Array.from({length:40},(e,t)=>{let n=t*Math.PI/80;return{id:`g${t}`,title:`g${t}`,vector:[Math.cos(n),Math.sin(n)],norm:1}}),t=[e[0]],n=[e[39]],r=e=>e.picks.map(e=>e.row.id).join(),i=R(e,t,n,{limit:5});if(i.picks[0].row.id!==`g1`)throw Error(`nearest first by default: ${r(i)}`);if(i.picks.some(e=>e.row.id===`g0`||e.row.id===`g39`))throw Error(`discover must not return what was voted on`);if(R(e,t,[],{limit:5,reach:1}).picks[0].row.id===`g1`)throw Error(`reach must skip the nearest`);if(r(R(e,t,[],{limit:5,surprise:1,seed:7}))!==r(R(e,t,[],{limit:5,surprise:1,seed:7})))throw Error(`the same seed must give the same list`);if(R(e,[],[],{}).picks.length)throw Error(`no likes, no picks`)}console.log(`taste.js self-check ok — discover's knobs, mu/v/q, drift leans forward, rejection steers, portable in ${h}B, ranks a pool it never saw, MMR keeps a run of near-duplicates from filling the list, provenance and heading survive the restore collapse and do not drift on reload`)}var B=e=>({content:[{type:`text`,text:JSON.stringify(e)}]}),vt=(e,t=[])=>({type:`object`,properties:e,required:t});function yt(e){let t=document.modelContext;t?.registerTool&&(t.registerTool({name:`describe`,description:`What this app holds: its fields and how often each is present. Call it first.`,inputSchema:vt({}),execute:async()=>B(Le(e.rows))}),t.registerTool({name:`search`,description:"Search by meaning: a question in plain words. Optional equality filters in `where`.",inputSchema:vt({query:{type:`string`},limit:{type:`number`},where:{type:`object`}},[`query`]),execute:async({query:t,limit:n=10,where:r})=>B(M(e.rows,t,e.roles,{qv:await e.queryVector(t),limit:n,where:r}))}),t.registerTool({name:`get`,description:`One record in full, by the id search returns.`,inputSchema:vt({id:{type:`string`}},[`id`]),execute:async({id:t})=>B(We(e.rows,t,e.roles)??{error:`no record ${t}`})}),t.registerTool({name:`count`,description:`Count the distinct values of a field: the shape of the data before reading it.`,inputSchema:vt({field:{type:`string`},where:{type:`object`},limit:{type:`number`}},[`field`]),execute:async({field:t,where:n,limit:r=20})=>B(He(e.rows,t,{where:n,limit:r}))}),t.registerTool({name:`session`,description:`What the person on this page saved and searched this session, and the taste (a vector over this app's records) their choices make.`,inputSchema:vt({}),execute:async()=>B(e.session?.()??{saved:[],searches:[],taste:null})}),t.registerTool({name:`rate`,description:`Record that the person liked or disliked a record (or clear it), by the id search returns. Builds the taste discover ranks with.`,inputSchema:vt({id:{type:`string`},verdict:{type:`string`,enum:[`like`,`dislike`,`clear`]}},[`id`,`verdict`]),execute:async({id:t,verdict:n})=>B(e.rate?.(t,n)??{error:`this page keeps no taste`})}),t.registerTool({name:`discover`,description:`Records for a taste: a kernel over what was liked (newest last) and disliked, not a text search. Pass likes and dislikes (ids from search), or omit them to use the taste on this page. Knobs are 0–1.`,inputSchema:vt({likes:{type:`array`,items:{type:`string`}},dislikes:{type:`array`,items:{type:`string`}},...Object.fromEntries(Object.entries(pt).map(([e,[t,n]])=>[e,{type:`number`,minimum:0,maximum:1,default:t,description:n}])),seed:{type:`integer`,description:`Same seed, same shuffle`},limit:{type:`integer`,minimum:1,maximum:50,default:10}}),execute:async({likes:t,dislikes:n,limit:r=10,...i})=>{let a=t=>t.map(t=>e.rows.find(n=>n.id===We(e.rows,t,e.roles)?.id)).filter(e=>e?.vector),o=t?{likes:a(t),dislikes:a(n??[])}:e.votes?.()??{likes:[],dislikes:[]};if(!o.likes.length)return B({error:`like at least one record first (ids from search, or rate)`});let s=R(e.rows,o.likes,o.dislikes,{...i,limit:Math.min(50,r)});return B({...s,picks:s.picks.map(({row:t,score:n})=>({...We(e.rows,t.id,e.roles),score:n}))})}}))}function bt(e,t){let n=t=>new Set(e.slice(0,5e3).flatMap(e=>a(e[t]??``))).size;return t.facets?.[0]??t.tags.find(e=>{let t=n(e);return t>=2&&t<=12})??null}function xt(e,t,{facet:r=null,only:a=null,today:o=new Date().toISOString().slice(0,10)}={}){let c=new Map;for(let o of e){let e=String(n(o,t.temporal)??``).slice(0,10);if(!e)continue;let l=r?String(o[r]??``):``;if(a&&l!==a)continue;let u=i(o,t)??``,d=`${l}|${u}|${e}`,f=c.get(d);f||c.set(d,f={key:d,date:e,place:l,label:u,byTitle:new Map});let p=s(o,t).toLowerCase(),m=f.byTitle.get(p);(!m||V(m,t).length<V(o,t).length)&&f.byTitle.set(p,o)}let l=[...c.values()].map(({byTitle:e,...t})=>({...t,items:[...e.values()]}));return{upcoming:l.filter(e=>e.date>o).sort((e,t)=>e.date.localeCompare(t.date)||e.place.localeCompare(t.place)),past:l.filter(e=>e.date<=o).sort((e,t)=>t.date.localeCompare(e.date)||e.place.localeCompare(t.place))}}function V(e,t){let n=s(e,t),r=String(e.text??``),i=r.startsWith(n.replace(/\.$/,``))?r.slice(n.replace(/\.$/,``).length).replace(/^[.\s]+/,``):r;return i===n?``:i.trim()}if(typeof process<`u`&&process.argv[1]?.endsWith(`/feed.js`)){let{rolesFrom:e}=await t(async()=>{let{rolesFrom:e}=await import(`./roles-YDRjv_PY.js`);return{rolesFrom:e}},__vite__mapDeps([4,5]),import.meta.url),n=e([{role_map:{title:`heading`,subtitle:`meeting`,temporal:`date`,tags:[`city`,`body`],text:[`text`]},presentation:{facets:[`city`]}}]),r=(e,t,n,r=n)=>({city:e,date:t,heading:n,meeting:`Board · ${t}`,body:`Board`,text:r}),i=[r(`A`,`2026-01-01`,`Budget`),r(`A`,`2026-01-01`,`Budget`,`Budget. Approved 5-0.`),r(`A`,`2026-01-01`,`Roads`),r(`B`,`2026-02-01`,`Parks`),r(`A`,`2026-03-01`,`Zoning`),{heading:`undated`}],a=(e,t,n)=>{if(JSON.stringify(e)!==JSON.stringify(t))throw Error(`${n}: ${JSON.stringify(e)}`)};a(bt(i,n),`city`,`the declared facet wins`);let{upcoming:o,past:s}=xt(i,n,{facet:`city`,today:`2026-02-15`});a(o.map(e=>e.key),[`A|Board · 2026-03-01|2026-03-01`],`a future date is coming up`),a(s.map(e=>`${e.place}${e.date}`),[`B2026-02-01`,`A2026-01-01`],`past, latest first`),a(s[1].items.map(e=>V(e,n)),[`Approved 5-0.`,``],`one item per title, the one that says what happened`),a(xt(i,n,{facet:`city`,only:`B`,today:`2026-02-15`}).past.length,1,`narrowed to one place`),console.log(`feed.js self-check ok — declared facet, upcoming vs past, one item per title keeping the decision, narrowed by place`)}var St=(e,t,n)=>{try{return JSON.parse(e?.getItem(t)??`null`)??n}catch{return n}},H=(e,t,n)=>{try{e?.setItem(t,JSON.stringify(n))}catch{}};function Ct({local:e,session:t,app:n=`app`}={}){let r={saved:`${n}:saved`,passed:`${n}:passed`,history:`${n}:history`};return{saved:()=>St(e,r.saved,[]),passed:()=>St(e,r.passed,[]),history:()=>St(t,r.history,[]),isSaved(e){return this.saved().some(t=>t.key===e)},toggleSave(t){let n=this.saved(),i=n.findIndex(e=>e.key===t.key);return i>=0?n.splice(i,1):n.push({...t,savedAt:new Date().toISOString()}),H(e,r.saved,n),H(e,r.passed,this.passed().filter(e=>e.key!==t.key)),i<0},pass(t){H(e,r.passed,[...this.passed().filter(e=>e.key!==t.key),t].slice(-50)),H(e,r.saved,this.saved().filter(e=>e.key!==t.key))},unvote(t){H(e,r.saved,this.saved().filter(e=>e.key!==t)),H(e,r.passed,this.passed().filter(e=>e.key!==t))},remember(e){let n=e.trim();n&&H(t,r.history,[{q:n,at:new Date().toISOString()},...this.history().filter(e=>e.q!==n)].slice(0,50))},clear(n){H(n===`history`?t:e,r[n],[])},votes(){let e=e=>({id:e.key,title:e.title,vector:e.v?w(e.v):null});return{likes:this.saved().map(e),dislikes:this.passed().map(e)}},taste(){let{likes:e,dislikes:t}=this.votes();return I(e,t)},bundle({name:e=n,url:t=``}={}){return{app:e,url:t,exported:new Date().toISOString(),saved:this.saved().map(({v:e,...t})=>t),searches:this.history(),taste:z(this.taste())}}}}var wt=(e,{key:t,title:n,subtitle:r,place:i,date:a,link:o,detail:s})=>({key:t,title:n,subtitle:r,place:i,date:a,url:o??null,detail:s??``,...e.vector?{v:C(Array.from(e.vector))}:{}}),Tt=e=>`"${String(e??``).replace(/"/g,`""`)}"`,Et=e=>[`title,place,subtitle,date,url,detail`,...e.map(e=>[e.title,e.place,e.subtitle,e.date,e.url,e.detail].map(Tt).join(`,`))].join(`
7
- `),Dt=(e,t=`Saved`)=>[`# ${t}`,``,...e.map(e=>`- **${e.url?`[${e.title}](${e.url})`:e.title}** — ${[e.place,e.subtitle].filter(Boolean).join(` · `)}${e.detail?`\n ${e.detail}`:``}`)].join(`
8
- `);if(typeof process<`u`&&process.argv[1]?.endsWith(`/store.js`)){let e=()=>{let e=new Map;return{getItem:t=>e.get(t)??null,setItem:(t,n)=>e.set(t,n)}},t=Ct({local:e(),session:e(),app:`t`}),n=e=>({vector:Array.from({length:8},(t,n)=>n===e?1:.1)}),r=wt(n(0),{key:`a`,title:`Budget`,place:`X`,date:`2026-01-01`}),i=wt(n(1),{key:`b`,title:`Roads, "east"`,place:`Y`}),a=(e,t,n)=>{if(JSON.stringify(e)!==JSON.stringify(t))throw Error(`${n}: ${JSON.stringify(e)}`)};if(a(t.taste(),null,`no taste before a save`),t.toggleSave(r),t.toggleSave(i),a(t.saved().map(e=>e.key),[`a`,`b`],`saved in order`),!t.taste()?.q)throw Error(`saves make a taste`);t.pass(i),a([t.saved().map(e=>e.key),t.passed().map(e=>e.key)],[[`a`],[`b`]],`passing on an item unsaves it`),a(t.taste().rejected,[`Roads, "east"`],`and it steers the taste away`),t.remember(`snow`),t.remember(`budget`),t.remember(`snow`),a(t.history().map(e=>e.q),[`snow`,`budget`],`history: newest first, no repeats`);let o=t.bundle({name:`T`});if(o.saved[0].v||!o.taste?.q||o.searches.length!==2)throw Error(`the bundle carries choices and taste, not raw vectors`);if(!Et([i]).includes(`"Roads, ""east"""`))throw Error(`CSV quoting`);if(Ct({local:{getItem(){throw Error(`blocked`)},setItem(){throw Error(`blocked`)}}}).saved().length!==0)throw Error(`blocked storage reads as empty`);console.log(`store.js self-check ok — saves and passes steer a taste, history dedupes, the bundle carries no raw vectors, CSV quotes, blocked storage is empty not fatal`)}var Ot=`http://www.w3.org/2000/svg`,kt=(e,t={})=>{let n=document.createElementNS(Ot,e);for(let[e,r]of Object.entries(t))n.setAttribute(e,r);return n},At=e=>e.toLocaleString(),jt=new Set([`state`]);function Mt(e,{el:t,show:n,row:r,placeOf:i,ctx:s}){let c=s.roles,l=Object.keys(e.paths),u=null,d=null,f=null,p={q:``,hits:null};function m(){if(u?.n===s.rows.length)return u;let t=s.rows.map(t=>{let n=a(t[e.field]??``).filter(t=>e.paths[t]);return n.length?n:[e.places?.[i(t)]].filter(Boolean)}),n=new Map;for(let e of s.rows){let t=o(e);n.set(t,(n.get(t)??0)+1)}let r=[...n].sort((e,t)=>t[1]-e[1])[0]?.[0],c=new Map(l.map(e=>[e,[]]));s.rows.forEach((e,n)=>{for(let e of t[n])c.get(e)?.push(n)});let d=0,f=null,p=0,m=new Map;s.rows.forEach((e,n)=>{if(!e.vector||o(e)!==r||!t[n].length)return;d||=e.vector.length,f??=new Float64Array(d);let i=1/(e.norm||Math.hypot(...e.vector)||1);for(let r of t[n]){let t=m.get(r)??{v:new Float64Array(d),n:0};for(let n=0;n<d;n++)t.v[n]+=e.vector[n]*i;t.n++,m.set(r,t)}for(let t=0;t<d;t++)f[t]+=e.vector[t]*i;p++});let h=new Map;for(let[e,t]of m){if(t.n<20)continue;let n=t.v.map((e,n)=>e/t.n-f[n]/p),r=Math.hypot(...n)||1;h.set(e,n.map(e=>e/r))}return u={n:s.rows.length,regionsOf:t,by:c,main:r,types:n,centroid:h},u}function h(e){let{centroid:t}=m(),n=t.get(e);return n?[...t].filter(([t])=>t!==e).map(([e,t])=>({region:e,score:t.reduce((e,t,r)=>e+t*n[r],0)})).sort((e,t)=>t.score-e.score).slice(0,5):[]}let g=(e,t=2)=>{let n=c.types?.[e];return(t===1?n?.singular:n?.plural)??e??`Records`},_=e=>c.types?.[e]?.icon??``;function v(e){let{regionsOf:t}=m(),n=new Map,r=e??s.rows.map((e,t)=>t);for(let e of r)if(!(f&&o(s.rows[e])!==f))for(let r of t[e])n.set(r,(n.get(r)??0)+1);return n}async function y(e){if(!e)return null;if(p.q===e&&p.hits)return p.hits;let t=s.queryVector(e),n=await Promise.race([t,new Promise(e=>setTimeout(()=>e(void 0),400))]);return n===void 0&&t.then(t=>{t&&p.q===e&&!p.meaning&&(p={q:e,hits:b(e,t),meaning:!0},S(e,d))}),p={q:e,hits:b(e,n??null),meaning:n!==void 0},p.hits}function b(e,t){let n=new Map(s.rows.map((e,t)=>[e.id,t]));return M(s.rows,e,c,{qv:t,limit:600}).map(e=>n.get(e.id)).filter(e=>e!=null)}let x=(e,t=d)=>{location.hash=`#/map/${encodeURIComponent(e)}${t?`/${encodeURIComponent(t)}`:``}`};async function S(r=``,i=null){d=i&&e.paths[i]?i:null;let a=await y(r),c=v(a),u=Math.max(1,...c.values()),b=e=>e?Math.min(5,1+Math.floor((a?e/u:Math.log10(e)/Math.log10(u))*4.999)):0,te=d?new Set(h(d).map(e=>e.region)):new Set,C=kt(`svg`,{viewBox:`0 0 ${e.width} ${e.height}`,role:`img`,"aria-label":a?`Map: where “${r}” comes up`:`Map: where records are`,class:`map`});for(let t of l){let n=kt(`path`,{d:e.paths[t],class:`h${b(c.get(t)??0)}${t===d?` on`:``}${te.has(t)?` near`:``}`,tabindex:0,"aria-label":`${t}: ${At(c.get(t)??0)}`});n.append(kt(`title`)),n.firstChild.textContent=`${t} · ${At(c.get(t)??0)} ${a?`matching`:(f?g(f):`records`).toLowerCase()}`;let i=()=>x(r,d===t?null:t);n.addEventListener(`click`,i),n.addEventListener(`keydown`,e=>{(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),i())}),C.append(n)}let w=t(`input`,{type:`search`,value:r,placeholder:`Search the map: data center, PFAS, solar rezoning…`,"aria-label":`Search the map`});w.addEventListener(`keydown`,e=>{e.key===`Enter`&&x(w.value.trim())});let T=a?new Map:m().types;for(let e of a??[]){let t=o(s.rows[e]);T.set(t,(T.get(t)??0)+1)}let ne=T.size>1||a?t(`div`,{className:`chips`},[[null,a?.length??s.rows.length],...T].map(([e,n])=>t(`button`,{type:`button`,className:e===f?`chip on`:`chip`,onclick:()=>{f=e,S(r,d)}},`${e?`${_(e)} ${g(e,n)}`:`All`} (${At(n)})`))):null,E=l.filter(e=>c.get(e)).length,D=a?`“${r}”: ${At([...c.values()].reduce((e,t)=>e+t,0))} matches in ${E} of ${l.length} regions. Darker is more.${p.meaning?``:` (Matching words; search by meaning is loading.)`}`:`${f?g(f):`Records`} in ${E} of ${l.length} regions. Select a region, or search.`;n(t(`div`,{className:`mapbar`},w),ne,t(`p`,{className:`hint`},D),t(`div`,{className:`mapwrap`},C,t(`aside`,{className:`panel`},ee(d,r,a))),t(`p`,{className:`hint`},`Legend: `,[0,1,2,3,4,5].map(e=>t(`span`,{className:`sw h${e}`})),a?` none → most matches`:` none → most records`))}function ee(n,i,l){if(!n)return[t(`h3`,{},`Select a region`),t(`p`,{className:`hint`},`Its records by kind and tag, the ones that match, and the regions most like it.`)];let{by:u}=m(),d=new Set(u.get(n)),p=(l?l.filter(e=>d.has(e)):[...d]).filter(e=>!f||o(s.rows[e])===f).map(e=>s.rows[e]),v=new Map;for(let e of p){let t=o(e);v.set(t,(v.get(t)??0)+1)}let y=(c.tags??[]).filter(t=>t!==e.field&&!jt.has(t)).map(e=>{let t=new Map;for(let n of p)for(let r of a(n[e]??``))t.set(r,(t.get(r)??0)+1);return[e,[...t].sort((e,t)=>t[1]-e[1]).slice(0,6)]}).filter(([,e])=>e.length>1),b=e=>String(e[c.temporal?.[0]]??``),S=(l?p:p.slice().sort((e,t)=>b(t).localeCompare(b(e)))).slice(0,25),ee=h(n);return[t(`h3`,{},n,` `,t(`button`,{type:`button`,className:`linkish`,"aria-label":`Close`,onclick:()=>x(i,null)},`✕`)),t(`p`,{className:`hint`},[...v].map(([e,t])=>`${_(e)} ${At(t)} ${g(e,t).toLowerCase()}`).join(` · `)||`Nothing here`+(l?` matches.`:` yet.`)),ee.length?t(`div`,{className:`chips`},t(`small`,{title:`Regions whose records are closest in meaning; outlined on the map`},`Reads most like: `),ee.map(({region:e})=>t(`button`,{type:`button`,className:`chip`,onclick:()=>x(i,e)},e))):null,y.map(([e,n])=>t(`div`,{className:`chips`},t(`small`,{},`${e.replace(/_/g,` `)}: `),n.map(([e,n])=>t(`button`,{type:`button`,className:`chip`,title:`Search the map for “${e}”`,onclick:()=>x(e)},`${e} (${n})`)))),S.length?t(`ul`,{className:`list`},S.map(e=>r(e))):null,p.length>S.length?t(`p`,{className:`hint`},`${At(p.length-S.length)} more. `,t(`a`,{href:`#/search/${encodeURIComponent(i||n)}`},`Open in search`)):null]}return{render:S}}var U=e=>document.querySelector(e),W=(e,t={},...n)=>{let r=Object.assign(document.createElement(e),t);return r.append(...n.flat(1/0).filter(e=>e!=null&&e!==!1)),r},Nt=(e,t=220)=>e.length>t?`${e.slice(0,e.lastIndexOf(` `,t))} …`:e,Pt=e=>e?new Date(`${String(e).slice(0,10)}T12:00:00`).toLocaleDateString(void 0,{weekday:`short`,month:`short`,day:`numeric`,year:`numeric`}):``,G={rows:[],roles:r([]),queryVector:e=>te(e).catch(()=>null)},Ft,It=new Promise(e=>{Ft=e});A({onManifests:e=>{G.roles=r(e),Ft()},rowText:e=>l(e,G.roles)});var Lt=await fetch(`./.well-known/agent-card.json`).then(e=>e.json()).catch(()=>({})),Rt=(Lt.capabilities?.extensions??[]).map(e=>e.params?.paid).find(Boolean)??null,zt=Lt.name??`Fangorn app`;document.title=zt,U(`#name`).textContent=zt,fetch(`./nav.json`).then(e=>e.json()).then(e=>U(`nav`).append(...e.map(e=>W(`a`,{href:e.href},e.label)))).catch(()=>{});var Bt=await fetch(`./map.json`).then(e=>(e.headers.get(`content-type`)??``).includes(`json`)?e.json():null).catch(()=>null);Bt&&U(`nav`).prepend(W(`a`,{href:`#/map`},`Map`));var Vt=U(`#q input`);Vt.disabled=!1;var Ht=zt.toLowerCase().replace(/\W+/g,`-`),K=Ct({local:globalThis.localStorage,session:globalThis.sessionStorage,app:Ht});G.session=()=>K.bundle({name:zt,url:location.origin});var Ut=new URL(`view`,location.href).href,Wt=await fetch(`${Ut}/cdn/catalog`).then(e=>e.json()).then(e=>e.domains.reduce((e,t)=>e+(t.count??0),0)).catch(()=>0),Gt=!1,Kt=0,qt=j(Ut,e=>{G.rows=e,Qt(),Date.now()-Kt>1500&&/^(#\/?)?$/.test(location.hash)&&(Kt=Date.now(),kn())});await It;var q=G.roles,Jt=e=>String((q.identity&&e[q.identity])??e.id),Yt=new Map,Xt=new Map,J=null,Zt=[];function Qt(){Yt=new Map(G.rows.map(e=>[Jt(e),e])),Xt=new Map(G.rows.map(e=>[e.id,e])),J??=bt(G.rows,q),Zt=J?[...G.rows.reduce((e,t)=>{let n=Y(t);return n&&e.set(n,(e.get(n)??0)+1),e},new Map)].sort((e,t)=>e[0].localeCompare(t[0])):[];let e=G.rows.length.toLocaleString();Vt.placeholder=Gt&&!G.rows.length?`No records yet`:Gt?`Search ${e} records${Zt.length>1?` in ${Zt.length} places`:``}…`:`Loading ${e}${Wt?` of ${Wt.toLocaleString()}`:``} records… (search what is here)`}var Y=e=>J?a(e[J]??``)[0]??``:``,$t=e=>String(e[q.temporal?.[0]]??``).slice(0,10),en=e=>d(e,q),tn=e=>wt(e,{key:Jt(e),title:s(e,q),subtitle:i(e,q),place:Y(e),date:$t(e),link:en(e),detail:V(e,q)}),nn=e=>/[a-z]/.test(e)||!/[A-Z]{5}/.test(e)?e:e.toLowerCase().replace(/\b[a-z]{1,3}\b/g,(e,t)=>/^(and|or|of|the|to|for|in|on|at|by|a|an|as|is|be|no|from)$/.test(e)?e:e.toUpperCase()).replace(/^\W*\w/,e=>e.toUpperCase()).replace(/([.:;!?]\s+|\u2013\s+|-\s+)(\w)/g,(e,t,n)=>t+n.toUpperCase()),rn=e=>nn(s(e,q)),an=e=>`#/item/${encodeURIComponent(Jt(e))}`,on=(e,t)=>{if(!t.length)return[e];let n=RegExp(`(${t.map(e=>e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)).join(`|`)})`,`ig`);return String(e).split(n).map((e,t)=>t%2?W(`mark`,{},e):e)},sn=e=>K.isSaved(e)?`like`:K.passed().some(t=>t.key===e)?`dislike`:null;G.rate=(e,t)=>{if(![`like`,`dislike`,`clear`].includes(t))return{error:`verdict is like, dislike or clear`};let n=Xt.get(e)??Yt.get(String(e))??Xt.get(We(G.rows,e,q)?.id);if(!n)return{error:`no record ${e}`};let r=Jt(n);return K.unvote(r),t===`like`&&K.toggleSave(tn(n)),t===`dislike`&&K.pass(tn(n)),ln(),On(),/^#\/for-you/.test(location.hash)&&Tn(),{likes:K.saved().map(e=>e.title),dislikes:K.passed().map(e=>e.title)}},G.votes=()=>{let e=e=>{let t=Yt.get(e.id);return t?{id:t.id,title:e.title,vector:t.vector}:e},{likes:t,dislikes:n}=K.votes();return{likes:t.map(e).filter(e=>e.vector),dislikes:n.map(e).filter(e=>e.vector)}};var cn=e=>W(`span`,{className:`votes`},[[`like`,`👍`,`I like this`],[`dislike`,`👎`,`Not for me`]].map(([t,n,r])=>{let i=W(`button`,{type:`button`,className:`vote`,title:r,ariaLabel:`${r}: ${s(e,q)}`,onclick:n=>{n.preventDefault(),G.rate(e.id,sn(Jt(e))===t?`clear`:t)}},n);return Object.assign(i.dataset,{key:Jt(e),vote:t}),i}));function ln(){for(let e of document.querySelectorAll(`button.vote`))e.setAttribute(`aria-pressed`,String(sn(e.dataset.key)===e.dataset.vote))}var X=(e,{terms:t=[],also:n=0,meta:r=!0}={})=>{let a=V(e,q);return W(`li`,{className:`row`},W(`div`,{className:`main`},W(`a`,{href:an(e),className:`title`},on(rn(e),t)),r?W(`small`,{},[Y(e),i(e,q)].filter(Boolean).join(` · `)):null,a?W(`p`,{className:`detail`},on(Nt(a),t)):null,n?W(`small`,{className:`also`},`and ${n} more record${n>1?`s`:``} of the same item`):null),cn(e))},Z=null,un=()=>Zt.length>1?W(`div`,{className:`chips`},[[null,G.rows.length],...Zt].map(([e,t])=>W(`button`,{type:`button`,className:e===Z?`chip on`:`chip`,title:`${t.toLocaleString()} records`,onclick:()=>{Z=e,kn()}},e??`All`))):null,dn=e=>!Z||Y(e)===Z,fn=U(`#view`),Q=(...e)=>{fn.replaceChildren(...e.flat().filter(Boolean)),ln(),window.scrollTo(0,0)};function pn(e){let t=W(`ul`,{},e.items.slice(0,5).map(e=>X(e,{meta:!1}))),n=e.items.length>5?W(`button`,{type:`button`,className:`more`,onclick:n=>{t.append(...e.items.slice(5).map(e=>X(e,{meta:!1}))),n.target.remove()}},`${e.items.length-5} more`):null;return W(`article`,{},W(`header`,{},W(`time`,{dateTime:e.date},Pt(e.date)),W(`h3`,{},[e.place,e.label.replace(/\s*·\s*\d{4}-\d\d-\d\d$/,``)].filter(Boolean).join(` — `))),t,n)}var mn=12;function hn(){let{upcoming:e,past:t}=xt(G.rows,q,{facet:J,only:Z}),{likes:n,dislikes:r}=G.votes(),i=R(G.rows.filter(dn),n,r,{...$,limit:6});Q(Lt.description?W(`p`,{className:`about`},Lt.description):null,un(),i.picks.length?W(`section`,{},W(`h2`,{},`For you`),W(`p`,{className:`hint`},`From the ${i.taste.n} item${i.taste.n>1?`s`:``} you liked. `,W(`a`,{href:`#/for-you`},`Tune`)),W(`ul`,{className:`list`},i.picks.map(({row:e})=>X(e)))):null,e.length?W(`section`,{},W(`h2`,{},`Coming up`),e.slice(0,8).map(pn)):null,t.length?W(`section`,{},W(`h2`,{},`Recently`),t.slice(0,mn).map(pn),t.length>mn?W(`button`,{type:`button`,className:`more`,onclick:()=>{mn+=12,hn()}},`Show more`):null):null,!e.length&&!t.length?W(`p`,{className:`empty`},Gt?G.rows.length?`Nothing dated here yet. Search above.`:`This app is registered and being built. Its records will appear here once they are published.`:`Loading the records…`):null)}var gn=`relevance`,_n=0,vn=null;async function yn(e){document.activeElement!==U(`#q input`)&&(U(`#q input`).value=e);let t=++_n,n=G.queryVector(e),r=await Promise.race([n,new Promise(e=>setTimeout(()=>e(void 0),400))]);t===_n&&(r===void 0&&n.then(n=>{n&&t===_n&&bn(e,n)}),bn(e,r??null,r===void 0))}function bn(e,t,n=!1){let r=M(G.rows,e,q,{qv:t,limit:80,...Z&&J?{where:{[J]:Z}}:{}}),i=new Map;for(let e of r){let t=Xt.get(e.id);if(!t)continue;let n=`${Y(t)}|${s(t,q).toLowerCase()}`,r=i.get(n);r?(r.also++,V(t,q).length>V(r.r,q).length&&(r.r=t)):i.set(n,{r:t,also:0})}let a=[...i.values()];gn===`newest`&&(a=a.sort((e,t)=>$t(t.r).localeCompare($t(e.r))));let o=e.toLowerCase().split(/\W+/).filter(e=>e.length>2),c=W(`div`,{className:`sort`},`Sort: `,[`relevance`,`newest`].map(r=>W(`button`,{type:`button`,className:r===gn?`chip on`:`chip`,onclick:()=>{gn=r,bn(e,t,n)}},r)));Q(un(),W(`div`,{className:`resultsbar`},W(`span`,{},`${a.length} result${a.length===1?``:`s`} for “${e}”${Z?` in ${Z}`:``}`,n?W(`small`,{},` · matching words; search by meaning is loading`):null),c),a.length?W(`ul`,{className:`list`},a.slice(0,40).map(({r:e,also:t})=>X(e,{terms:o,also:t}))):W(`p`,{className:`empty`},`No matches. Try other words, or All places.`))}function xn(e){let t=Yt.get(e);if(!t)return Q(W(`p`,{className:`empty`},`That record is not in this app any more. `,W(`a`,{href:`#/`},`Home`)));let n=en(t),r=V(t,q),a=new Set([`id`,`owner`,`text`,`vector`,`norm`,`embed`,`entityType`,q.identity,...q.title,...q.subtitle,...q.media,...q.temporal??[]]),o=Object.entries(t).filter(([e,t])=>!a.has(e)&&!/(_id|_sha256)$/.test(e)&&(typeof t==`string`||typeof t==`number`)&&String(t).length<120),c=W(`div`,{className:`doc`}),l=n?W(`button`,{type:`button`,className:`act`,onclick:()=>{if(c.firstChild){c.replaceChildren(),l.textContent=`View document`;return}c.append(W(`iframe`,{src:`./doc?u=${encodeURIComponent(n)}${Number(t.page)>1?`#page=${t.page}`:``}`,title:`Source document`,loading:`lazy`})),l.textContent=`Hide document`}},`View document`):null,u=xt(G.rows.filter(e=>Y(e)===Y(t)&&$t(e)===$t(t)&&i(e,q)===i(t,q)),q,{facet:J}),d=[...u.upcoming,...u.past].flatMap(e=>e.items).filter(e=>s(e,q)!==s(t,q)),f=Ue(G.rows,t.id,q,{limit:12}).near.map(e=>Xt.get(e.id)).filter(e=>e&&s(e,q)!==s(t,q)).slice(0,6);Q(W(`p`,{},W(`a`,{href:`#/`,onclick:e=>{history.length>1&&(e.preventDefault(),history.back())}},`← Back`)),W(`article`,{className:`record`},W(`small`,{},[Y(t),i(t,q)].filter(Boolean).join(` · `)),W(`h2`,{},rn(t)),r?W(`p`,{},r):W(`p`,{className:`hint`},`No decision is recorded under this item (it may be on an agenda, before the meeting).`),o.length?W(`dl`,{},o.map(([e,t])=>[W(`dt`,{},e.replace(/_/g,` `)),W(`dd`,{},String(t))])):null,W(`div`,{className:`acts`},cn(t),l,n?W(`a`,{href:n,target:`_blank`,rel:`noopener`,className:`act`},`Source ↗`):null),Rt&&t.paid_sha256?W(`p`,{className:`hint`},`Agents can buy this item's structured record for ${Number(Rt.price)/10**(Rt.decimals??6)} ${Rt.symbol??`USDC`} (x402).`):null,c),d.length?W(`section`,{},W(`h2`,{},`Same meeting`),W(`ul`,{className:`list`},d.slice(0,12).map(e=>X(e,{meta:!1})))):null,f.length?W(`section`,{},W(`h2`,{},`Similar`),W(`ul`,{className:`list`},f.map(e=>X(e)))):null)}function Sn(e,t,n){let r=W(`a`,{href:URL.createObjectURL(new Blob([t],{type:n})),download:e});document.body.append(r),r.click(),r.remove()}var Cn={get(){try{return JSON.parse(localStorage.getItem(`${Ht}:knobs`))??{}}catch{return{}}},set(e){try{localStorage.setItem(`${Ht}:knobs`,JSON.stringify(e))}catch{}}},$={...Object.fromEntries(Object.entries(pt).map(([e,[t]])=>[e,t])),...Cn.get(),seed:1},wn={lookahead:[`Lookahead`,`what you like now`,`where you're heading`],variety:[`Variety`,`close to each other`,`all different`],surprise:[`Surprise`,`best first`,`shuffled`],reach:[`Reach`,`nearest`,`further out`]};function Tn(){let{likes:e,dislikes:t}=G.votes(),n=R(G.rows.filter(dn),e,t,{...$,limit:30}),r=e=>{let[t,n,r]=wn[e],i=W(`output`,{},`${Math.round($[e]*100)}%`),a=W(`input`,{type:`range`,min:0,max:1,step:.05,value:$[e],id:`k-${e}`,title:pt[e][1]});return a.oninput=()=>{i.textContent=`${Math.round(a.value*100)}%`},a.onchange=()=>{$[e]=Number(a.value),Cn.set({...$,seed:void 0}),Tn(),document.getElementById(`k-${e}`)?.focus()},W(`label`,{className:`knob`,htmlFor:`k-${e}`},W(`span`,{},t,i),a,W(`small`,{},`${n} ↔ ${r}`))},i=(e,t)=>W(`li`,{className:t?`no`:``},e.title,W(`button`,{type:`button`,ariaLabel:`Forget ${e.title}`,onclick:()=>G.rate(e.id,`clear`)},`×`));Q(W(`h2`,{className:`page`},`For you`),un(),W(`section`,{className:`taste`},e.length||t.length?W(`ul`,{className:`pills`},e.slice(-30).map(e=>i(e)),t.slice(-10).map(e=>i(e,!0))):W(`p`,{className:`hint`},`Tap 👍 on records you like and 👎 on ones you don't. Newer likes count more; it all stays in this browser.`),n.taste?W(`p`,{className:`hint`},n.taste.heading?`Your recent likes point somewhere new; Lookahead follows them.`:`Like 4 or more and Lookahead can follow where your taste is heading.`):null,W(`div`,{className:`knobs`},Object.keys(pt).map(r)),W(`button`,{type:`button`,className:`act`,disabled:!$.surprise,title:$.surprise?``:`Turn up Surprise to reroll`,onclick:()=>{$.seed++,Tn()}},`Reroll`)),n.picks.length?W(`ul`,{className:`list`},n.picks.map(({row:e})=>X(e))):null)}function En(){let e=K.saved(),t=K.taste(),n=zt.toLowerCase().replace(/\W+/g,`-`),r=()=>JSON.stringify(K.bundle({name:zt,url:location.origin}),null,1),i=W(`button`,{type:`button`,className:`act`,onclick:async()=>{try{await navigator.clipboard.writeText(r()),i.textContent=`Copied`}catch{Sn(`${n}-session.json`,r(),`application/json`)}}},`Copy for an agent`);Q(W(`h2`,{className:`page`},`Liked (${e.length})`),e.length?W(`div`,{className:`acts`},W(`button`,{type:`button`,className:`act`,onclick:()=>Sn(`${n}-saved.json`,r(),`application/json`)},`Export JSON`),W(`button`,{type:`button`,className:`act`,onclick:()=>Sn(`${n}-saved.csv`,Et(e),`text/csv`)},`CSV`),W(`button`,{type:`button`,className:`act`,onclick:()=>Sn(`${n}-saved.md`,Dt(e,`${zt}: saved`),`text/markdown`)},`Markdown`),i):W(`p`,{className:`empty`},`Nothing liked yet. Tap 👍 on a record; likes stay on this device.`),t?W(`p`,{className:`hint`},`"For you" is built from these ${t.n}${t.rejected.length?`, and away from ${t.rejected.length} you passed on`:``}. It lives in this browser; the export carries it, so an agent can use it too. `,W(`button`,{type:`button`,className:`linkish`,onclick:()=>{K.clear(`passed`),En(),On()}},`Forget what I passed on`)):null,W(`ul`,{className:`list`},e.slice().reverse().map(e=>{let t=Yt.get(e.key);return W(`li`,{className:`row`},W(`div`,{className:`main`},W(`a`,{href:t?an(t):e.url??`#/`,className:`title`},e.title),W(`small`,{},[e.place,e.subtitle].filter(Boolean).join(` · `)),e.detail?W(`p`,{className:`detail`},Nt(e.detail)):null),W(`button`,{type:`button`,className:`vote`,ariaLabel:`Forget ${e.title}`,title:`Forget`,onclick:()=>{K.unvote(e.key),En(),On()}},`×`))})))}function Dn(){let e=K.history();Q(W(`h2`,{className:`page`},`Searches this session`),e.length?W(`ul`,{className:`list`},e.map(({q:e,at:t})=>W(`li`,{className:`row`},W(`div`,{className:`main`},W(`a`,{href:`#/search/${encodeURIComponent(e)}`,className:`title`},e),W(`small`,{},new Date(t).toLocaleTimeString()))))):W(`p`,{className:`empty`},`No searches yet.`),e.length?W(`button`,{type:`button`,className:`act`,onclick:()=>{K.clear(`history`),Dn()}},`Clear`):null)}function On(){let e=K.saved().length;U(`#nsaved`).textContent=e?` (${e})`:``}function kn(){let[,e=``,t=``]=location.hash.match(/^#\/([^/]*)\/?(.*)$/)??[],n=decodeURIComponent(t);for(let t of document.querySelectorAll(`nav a`))t.classList.toggle(`on`,t.getAttribute(`href`)===`#/${e}`);return document.body.classList.toggle(`wide`,e===`map`),e===`search`&&n?yn(n):e===`item`&&n?xn(n):e===`saved`?En():e===`for-you`?Tn():e===`history`?Dn():e===`map`&&Bt?(vn??=Mt(Bt,{el:W,show:Q,row:X,placeOf:Y,ctx:G})).render(...t.split(`/`).map(decodeURIComponent)):(U(`#q input`).value=``,hn())}var An;Vt.oninput=()=>{clearTimeout(An);let e=Vt.value.trim();An=setTimeout(()=>{if(!e){location.hash.startsWith(`#/search`)&&(location.hash=`#/`);return}history.replaceState(null,``,`#/search/${encodeURIComponent(e)}`),yn(e)},250)},U(`#q`).onsubmit=e=>{e.preventDefault();let t=Vt.value.trim();t&&(K.remember(t),location.hash=`#/search/${encodeURIComponent(t)}`)},fn.addEventListener(`click`,e=>{e.target.closest(`a.title`)&&location.hash.startsWith(`#/search/`)&&K.remember(Vt.value)}),window.onhashchange=kn,On(),kn(),G.rows=await qt,Gt=!0,Qt(),yt(G),kn();
@@ -1 +0,0 @@
1
- var e=function(e,t){return new URL(e,t).href},t={},n=function(e){return e.pathname.endsWith(`.css`)},r=function(r,i,a){let o=Promise.resolve();if(i&&i.length>0){let r,s=document.querySelector(`meta[property=csp-nonce]`),c=s?.nonce||s?.getAttribute(`nonce`);function l(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}function u(e){return import.meta.resolve?new URL(import.meta.resolve(e)):new URL(e,import.meta.url)}o=l(i.map(i=>{i=e(i,a);let o=u(i);if(o.href in t)return;t[o.href]=!0;let s=n(o);if(r===void 0){r={all:new Set,styles:new Set};let e=document.getElementsByTagName(`link`);for(let t=e.length-1;t>=0;t--){let n=e[t];r.all.add(n.href),n.rel===`stylesheet`&&r.styles.add(n.href)}}if((s?r.styles:r.all).has(o.href))return;let l=document.createElement(`link`);if(l.rel=s?`stylesheet`:`modulepreload`,s||(l.as=`script`),l.crossOrigin=``,l.href=o.href,c&&l.setAttribute(`nonce`,c),document.head.appendChild(l),s)return new Promise((e,t)=>{l.addEventListener(`load`,e),l.addEventListener(`error`,()=>t(Error(`Unable to preload CSS for ${o}`)))})}).filter(e=>e!==void 0))}function s(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return o.then(e=>{for(let t of e||[])t.status===`rejected`&&s(t.reason);return r().catch(s)})};export{r as t};
@@ -1 +0,0 @@
1
- var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t),e=null),t.exports),s=(e,n)=>{let r={};for(var i in e)t(r,i,{get:e[i],enumerable:!0});return n||t(r,Symbol.toStringTag,{value:`Module`}),r},c=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},l=(n,r,o)=>(o=n==null?{}:e(i(n)),c(r||!n||!n.__esModule||!a.call(n,`default`)?t(o,`default`,{value:n,enumerable:!0}):o,n)),u=(e=>typeof require<`u`?require:typeof Proxy<`u`?new Proxy(e,{get:(e,t)=>(typeof require<`u`?require:e)[t]}):e)(function(e){if(typeof require<`u`)return require.apply(this,arguments);throw Error('Calling `require` for "'+e+"\" in an environment that doesn't expose the `require` function. See https://rolldown.rs/in-depth/bundling-cjs#require-external-modules for more details.")});export{l as i,s as n,u as r,o as t};