@ghostlytools/cli 1.3.3 → 1.3.5

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 (58) hide show
  1. package/README.md +1 -1
  2. package/SKILL.md +2 -1
  3. package/dist/assets/{api-Bg7bh_6E.js → api-CgPyYfjH.js} +2 -2
  4. package/dist/assets/{api-B1fADtqd.js → api-Do7NjRg2.js} +44 -9
  5. package/dist/assets/api-Do7NjRg2.js.map +1 -0
  6. package/dist/assets/{apiKit-BsUZPHLn.js → apiKit-eh5qBKIl.js} +2 -2
  7. package/dist/assets/{apiKit-BsUZPHLn.js.map → apiKit-eh5qBKIl.js.map} +1 -1
  8. package/dist/assets/{apps-DepomCiX.js → apps-B83dRFga.js} +1 -1
  9. package/dist/assets/{apps-BaUNt-5c.js → apps-Cl9MtELY.js} +2 -2
  10. package/dist/assets/{apps-BaUNt-5c.js.map → apps-Cl9MtELY.js.map} +1 -1
  11. package/dist/assets/{arkade-CNnMaoEQ.js → arkade-B5Xn40bC.js} +2 -2
  12. package/dist/assets/{arkade-CNnMaoEQ.js.map → arkade-B5Xn40bC.js.map} +1 -1
  13. package/dist/assets/{backup-Bbz3lyC5.js → backup-BjZcDFjL.js} +4 -4
  14. package/dist/assets/{backup-Bbz3lyC5.js.map → backup-BjZcDFjL.js.map} +1 -1
  15. package/dist/assets/{backup-B5Q1W-Ey.js → backup-CDOh2tuw.js} +1 -1
  16. package/dist/assets/buttons-CFabREDv.js +2 -0
  17. package/dist/assets/{buttons-DS1iURp8.js → buttons-CUKHafux.js} +3 -3
  18. package/dist/assets/{buttons-DS1iURp8.js.map → buttons-CUKHafux.js.map} +1 -1
  19. package/dist/assets/{envelope-fNC941z4.js → envelope-wspXCjle.js} +2 -2
  20. package/dist/assets/{envelope-fNC941z4.js.map → envelope-wspXCjle.js.map} +1 -1
  21. package/dist/assets/{groupFiles-6qnLCnOm.js → groupFiles-Cfrjo3YS.js} +31 -4
  22. package/dist/assets/{groupFiles-6qnLCnOm.js.map → groupFiles-Cfrjo3YS.js.map} +1 -1
  23. package/dist/assets/{host-Dj3C1fn3.js → host-BdS-7nRW.js} +8 -8
  24. package/dist/assets/{host-Dj3C1fn3.js.map → host-BdS-7nRW.js.map} +1 -1
  25. package/dist/assets/{hyperdhtRelay-CrgYQN-g.js → hyperdhtRelay-H97Vz73W.js} +2 -2
  26. package/dist/assets/{hyperdhtRelay-CrgYQN-g.js.map → hyperdhtRelay-H97Vz73W.js.map} +1 -1
  27. package/dist/assets/{irohWeb-DSyLp5Re.js → irohWeb-jErC-V0J.js} +2 -2
  28. package/dist/assets/{irohWeb-DSyLp5Re.js.map → irohWeb-jErC-V0J.js.map} +1 -1
  29. package/dist/assets/{main-BDd11Yd1.js → main-C14lA5aK.js} +24 -18
  30. package/dist/assets/main-C14lA5aK.js.map +1 -0
  31. package/dist/assets/{mainline-CLTo0nGa.js → mainline-CYI1tZT7.js} +2 -2
  32. package/dist/assets/{mainline-CLTo0nGa.js.map → mainline-CYI1tZT7.js.map} +1 -1
  33. package/dist/assets/{networkReason-DwcadZz5.js → networkReason-CiHrd-kG.js} +2 -2
  34. package/dist/assets/{networkReason-DwcadZz5.js.map → networkReason-CiHrd-kG.js.map} +1 -1
  35. package/dist/assets/{nwc-BNFyyECH.js → nwc-0JYm8Vys.js} +3 -3
  36. package/dist/assets/{nwc-BNFyyECH.js.map → nwc-0JYm8Vys.js.map} +1 -1
  37. package/dist/assets/{nwcProvider-BbjJOfLD.js → nwcProvider-2coJAsqr.js} +2 -2
  38. package/dist/assets/{nwcProvider-BbjJOfLD.js.map → nwcProvider-2coJAsqr.js.map} +1 -1
  39. package/dist/assets/{registry-CoLHpxkb.js → registry-BptCF3tL.js} +3 -3
  40. package/dist/assets/{registry-CoLHpxkb.js.map → registry-BptCF3tL.js.map} +1 -1
  41. package/dist/assets/{registry-DoTb6uEr.js → registry-sML83UvL.js} +1 -1
  42. package/dist/assets/{resolve-BIDJ-UUl.js → resolve-2hGrvTen.js} +2 -2
  43. package/dist/assets/{resolve-BIDJ-UUl.js.map → resolve-2hGrvTen.js.map} +1 -1
  44. package/dist/assets/{server-Bx3RGkBC.js → server-BbPiCghe.js} +106 -35
  45. package/dist/assets/server-BbPiCghe.js.map +1 -0
  46. package/dist/assets/{src-D7gcJElT.js → src-BLzG4Sfv.js} +14 -2
  47. package/dist/assets/src-BLzG4Sfv.js.map +1 -0
  48. package/dist/assets/{turnRefs-PN644M9o.js → turnRefs-ClWSgjb0.js} +2 -2
  49. package/dist/assets/{turnRefs-PN644M9o.js.map → turnRefs-ClWSgjb0.js.map} +1 -1
  50. package/dist/assets/{usdt-B2TLRlYa.js → usdt-zwyn_AQK.js} +3 -3
  51. package/dist/assets/{usdt-B2TLRlYa.js.map → usdt-zwyn_AQK.js.map} +1 -1
  52. package/dist/ghostly.mjs +1 -1
  53. package/package.json +1 -1
  54. package/dist/assets/api-B1fADtqd.js.map +0 -1
  55. package/dist/assets/buttons-CUd7j0ZA.js +0 -2
  56. package/dist/assets/main-BDd11Yd1.js.map +0 -1
  57. package/dist/assets/server-Bx3RGkBC.js.map +0 -1
  58. package/dist/assets/src-D7gcJElT.js.map +0 -1
@@ -1,16 +1,16 @@
1
1
  import { n as traceJoin } from "./joinTrace-CjRDFy85.js";
2
- import { $c as currentRelays, $i as revokesIdentity, $n as GROUP_FILE_LIMITS, $r as WAKE_CALL_INTERVAL_MS, $t as didDhtFromPublicKey, A as CommunitySession, Aa as forwardedAgain, Ac as devicePingFrame, Ao as rosterAdmin, Ar as newerHead, As as handoffOfferFrame, B as knockRecords, Ba as readReaction, Bc as TURN_MAX, Bi as capsDescriptors, Bn as findEndpoint, Bo as GhostlyHttpError, Br as transferStalled, Bs as readHandoffHave, C as sha256Paced, Ca as parseImageMeta, Cc as DEVICES_CAPABILITY, Ci as readManifest, Cl as randomBytes, Cn as isBitcoinAddress, Cr as beaconRecords, Cs as handoffContext, D as openGroupTyping, Da as RateWindow, Dc as deviceEchoNonce, Dl as utf8Encode, Do as MEMBER_KEY, Dr as lobbyRecords, Ds as handoffEphemeral, E as groupTypingEpoch, Ea as EDIT_RATE_WINDOW_MS, Ec as deviceEchoFrame, El as utf8Decode, Er as lobbyKeys, Es as handoffDigest, Et as normalizeAtprotoHandle, Fa as ReactionWindow, Fc as TURN_RAISE_READ_TIMEOUT_MS, Fr as readLobby, Fs as handoffVersions, G as groupWakeFrame, Ga as replySnippet, Gc as signTurnRelease, Gn as INVITE_TAKEN, Go as decodeControl, Gr as typingActivity, Gs as sealHandoffPiece, H as readKnocks, Ha as wireReaction, Hc as nextTurnPosition, Hn as parseCashuRequestPayload, Ho as parseLocalTarget, Hs as readHandoffPake, I as decodeGroupEntryLink, Ia as nextReactionNumber, Ic as TURN_SETTLE_MS, In as decodeBolt11, Io as DHT_POLL_INTERVALS, Ir as shouldBeHub, Is as newHandoffId, J as GROUP_LIMITS, Jc as turnName, Ji as emptyIdentityLedger, Jn as pairedMessageFits, Jo as RTC_CONFIG, Jr as mayPin, Js as readSetUpdate, K as groupWakes, Ka as BUTTON_ID, Kc as turnInstance, Ki as IdentityExchange, Kn as LIVENESS_PING_MS, Ko as encodeControl, L as encodeGroupEntryLink, La as queueReaction, Lc as classifyTurnRead, Ln as ENDPOINT, Lr as ChatFiles, Ls as readHandoffAck, M as communityHasFrame, Ma as COMMUNITY_REACTION_FRAME, Mc as seedSigner, Mo as verifyCommitSignature, Mr as rankHubs, Ms as handoffReleaseFrame, N as decodeCommunityLink, Na as GROUP_REACTION_FRAME, Nc as webCryptoSigner, No as edgeParams, Nr as readBeacon, Ns as handoffRetryAfter, O as sealGroupTyping, Oa as dhtEditId, Oc as deviceKeyZ32, Oo as commitHash, Or as mergeBeacon, Os as handoffHelloFrame, P as encodeCommunityLink, Pa as REACTION_LIMITS, Po as DirectPathWatch, Pr as readBeaconHead, Ps as handoffStreamKey, Q as frameBytes, Qc as RelayTransport, Qi as receivedIdentityStatus, Qn as parseEngineError, Qr as readPin, Qs as verifySetUpdate, Qt as didDhtDocument, R as entryParams, Ra as reactionEmoji, Rc as turnPutSummary, Ri as CapsExchange, Rn as cashuRequestPayload, Ro as RELAY_POLL_INTERVALS, Rr as FILE_LIMITS, Rs as readHandoffCancel, S as readAppBundleAsync, Sa as parseVideoMeta, Si as newMailbox, Sn as sparkInvoiceDetails, So as canonicalJson, Sr as beaconKeys, Ss as handoffCancelFrame, T as GroupTypingBoard, Ta as EDIT_BUFFER_MS, Tc as HANDOFF_CAPABILITY, Tl as toZ32, Tn as isPubkyKey, To as GROUP_MEMBER_CAP, Tr as freshHubs, Ts as handoffDataFrame, Tt as isAtprotoDid, Ua as pairedReplyAuthor, Uc as readTurnPacket, Un as parseFedimintRequestPayload, Uo as webLocalFetch, Ur as TypingSender, Us as readHandoffTurnFrame, V as mergeKnocks, Va as validReactionNumber, Vc as firstDeviceSetSecret, Vi as dialDescriptors, Vn as isFederationId, Vo as formatLocalTarget, Vs as readHandoffHello, W as GroupWakeLimiter, Wa as readReply, Wc as signTurnPacket, Wi as IDENTITY_REVOCATION_LABEL, Wn as GhostLink, Wo as LIMITS, Ws as readHandoffVerified, X as GROUP_READ_NOTE, Xc as turnVerifierMark, Xi as identityStatement, Xn as engineError, Xr as pinIsNewer, Xs as setUpdateFrame, Yc as turnStatedVerifier, Yi as identityRevocationValue, Yn as pairedMessageFrame, Yr as nextPinNumber, Ys as setAckFrame, Z as GroupSession, Za as STATUS_CARD_LIMITS, Zc as DEFAULT_RELAYS, Zi as newIdentityBinding, Zn as engineText, Zr as pinNumberHolds, Zs as signTombstone, _c as createChatInvite, _i as HOLD_DATED_BACK_MS, _n as validatePaymentTarget, _o as isAppRef, _r as MESH_HUBS, _s as filePartName, a as planAppUpdate, aa as automaticTransport, ac as enrollDigits, ai as wakeRequest, al as withRequestOptions, an as EVM_TEST_CHAINS, ao as arrivalKey, as as serviceIdFromName, at as groupName, b as pacer, ba as parseVoiceMeta, bi as HoldRefusedError, bl as bytesEqual, bn as SPARK_PROVIDER, br as pickMeshHubs, bs as handoffAttemptSucceeded, cc as enrollHelloFrame, cl as createRelayPayload, cn as SEPOLIA_TEST_USDT, co as receivedTimestamp, cs as HANDOFF_DONE, d as APP_BUNDLE_LIMITS, da as DHT_FILE_CAPABILITY, dc as readEnrollHello, di as APPS_CAPABILITY, dn as USDT_PUBLIC_RPC, do as APP_STATEMENT_LIMITS, ds as HANDOFF_OFFER, ea as lastSharedWithMe, ei as WakeLimiter, el as normalizeRelayUrl, en as encodeDidDhtDeactivated, es as parseCallSignal, f as APP_BUNDLE_MAGIC, fa as dhtFileId, fc as verifyEnrollProof, fi as BUTTONS_CAPABILITY, fl as createIdentity, fn as WALLET_NETWORKS, fo as appFingerprint, fs as HANDOFF_PAKE, g as appViewOf, gc as OwnInviteError, gi as HOLD_CAPABILITY, gl as verify, gn as formatPaymentAmount, go as isAppKey, gr as readGroupSignal, gs as HANDOFF_VERIFIED, h as appDigest, ha as sanitizeMime, hc as readDeviceInvite, hi as UPGRADE_CAPABILITY, hl as publicKeyFromZ32, hn as assertWholeSats, ho as isAppHash, hr as groupSignalFrame, hs as HANDOFF_TIMINGS, i as checkAppBeforeRun, ia as TRANSPORTS, ic as enrollCancelReason, ii as relayRequest, il as isDiscoveryBudgetError, in as ETHEREUM_USDT, io as statusCardText, ir as groupFileFallback, is as LEGACY_SERVICES, it as mentionsMember, j as GROUP_READ_NOTE_COMMUNITY, ja as readForwarded, jc as newDeviceSetSecret, jo as rosterHas, jr as pickHubs, js as handoffPakeFrame, k as COMMUNITY_LIMITS, ka as parseLinkPreview, kc as deviceLinkPairing, ko as parseGroupCommit, kr as mergeLobby, ks as handoffManifestFrames, l as readAppStoreSteps, la as DHT_MESSAGE_TTL, lc as enrollProofFrame, li as chatAppId, lo as shownTime, ls as HANDOFF_HAVE, ma as sanitizeFileName, mc as deviceInviteJoinerParams, mi as STATUS_CARD_CAPABILITY, ml as identityFromSeedB64, mn as assertTokenUnits, ms as HANDOFF_REQUEST, n as appStoreDecision, na as emptyProofLedger, ni as newWakeToken, nl as traceLink, no as checkStatusCard, ns as emptyLinkRecords, nt as carryMentions, o as APP_STORE_LIMITS, oc as enrollDoneFrame, oi as checkPushEndpoint, ol as PacketTooLargeError, on as ONCHAIN_PROVIDER, oo as claimedTime, or as readGroupFileMeta, os as HANDOFF_ACK, p as APP_ICON_PATH, pa as formatFileSize, pc as createDeviceInvite, pi as EDIT_CAPABILITY, pl as identityFromSeed, pn as arkAddressPrefix, po as appRef, ps as HANDOFF_PIECE_BYTES, q as parseGroupWakeFrame, qc as turnKeys, qn as PAIRED_FRAME_TOO_LARGE, qr as PIN_LIMITS, r as appUpdateDecision, ra as validExternalKey, rc as enrollCancelFrame, ri as parseWakeFrame, rl as budgetRetryMs, rn as signDidDhtPacket, ro as sameButtonText, rs as HTTP_SERVICE_PROTO, rt as parseCommunityEdit, sc as enrollGrantFrame, si as vapidKeysMatch, sn as PaymentPreflightError, so as heardTime, ss as HANDOFF_CANCEL, t as appRevocationFor, ta as PeerProofs, ti as deviceWakeRequest, tn as encodeDidDhtPacket, tt as GROUP_EDIT_TEXT_BYTES, ua as peekDhtMailbox, uc as readEnrollGrant, ui as isAppVersion, un as TEST_USDT_FAUCET_AMOUNT, ur as CarriedTransport, us as HANDOFF_HELLO, vc as decodeInviteCode, vi as HOLD_LIMITS, vl as sanitizeAvatar, vn as walletNetworkOf, vo as readAppRevocation, vr as mayBeHub, vs as handoffAttemptAllowed, wc as ENROLL_CAPABILITY, wl as toBase64Url, wo as readCanonicalJson, wr as doorHubs, ws as handoffContextProof, xc as inviteOwnership, xi as isHoldUrl, xl as fromBase64Url, xn as sparkAddressKind, xr as COMMUNITY_TOPOLOGY, xs as handoffBusyFrame, y as isAppUrl, ya as fileMessageText, yc as encodeInviteCode, yi as HoldKeys, yl as sanitizeDisplayText, yn as SPARK_NETWORKS, yr as meshHubs, ys as handoffAttemptFailed, z as knockIdentity, za as reactionIsNewer, zc as TURN_LAST_SEQUENCE, zi as DHT_TEXT_CAPABILITY, zn as fedimintRequestPayload, zo as presenceSeenAt, zr as transferEnded, zs as readHandoffDone } from "./src-D7gcJElT.js";
2
+ import { $c as currentRelays, $i as revokesIdentity, $n as GROUP_FILE_LIMITS, $r as WAKE_CALL_INTERVAL_MS, $t as didDhtFromPublicKey, A as CommunitySession, Aa as forwardedAgain, Ac as devicePingFrame, Ao as rosterAdmin, Ar as newerHead, As as handoffOfferFrame, B as knockRecords, Ba as readReaction, Bc as TURN_MAX, Bi as capsDescriptors, Bn as findEndpoint, Bo as GhostlyHttpError, Br as transferStalled, Bs as readHandoffHave, C as sha256Paced, Ca as parseImageMeta, Cc as DEVICES_CAPABILITY, Ci as readManifest, Cl as randomBytes, Cn as isBitcoinAddress, Cr as beaconRecords, Cs as handoffContext, D as openGroupTyping, Da as RateWindow, Dc as deviceEchoNonce, Dl as utf8Encode, Do as MEMBER_KEY, Dr as lobbyRecords, Ds as handoffEphemeral, E as groupTypingEpoch, Ea as EDIT_RATE_WINDOW_MS, Ec as deviceEchoFrame, El as utf8Decode, Er as lobbyKeys, Es as handoffDigest, Et as normalizeAtprotoHandle, Fa as ReactionWindow, Fc as TURN_RAISE_READ_TIMEOUT_MS, Fr as readLobby, Fs as handoffVersions, G as groupWakeFrame, Ga as replySnippet, Gc as signTurnRelease, Gn as INVITE_TAKEN, Go as decodeControl, Gr as typingActivity, Gs as sealHandoffPiece, H as readKnocks, Ha as wireReaction, Hc as nextTurnPosition, Hn as parseCashuRequestPayload, Ho as parseLocalTarget, Hs as readHandoffPake, I as decodeGroupEntryLink, Ia as nextReactionNumber, Ic as TURN_SETTLE_MS, In as decodeBolt11, Io as DHT_POLL_INTERVALS, Ir as shouldBeHub, Is as newHandoffId, J as GROUP_LIMITS, Jc as turnName, Ji as emptyIdentityLedger, Jn as pairedMessageFits, Jo as RTC_CONFIG, Jr as mayPin, Js as readSetUpdate, K as groupWakes, Ka as BUTTON_ID, Kc as turnInstance, Ki as IdentityExchange, Kn as LIVENESS_PING_MS, Ko as encodeControl, L as encodeGroupEntryLink, La as queueReaction, Lc as classifyTurnRead, Ln as ENDPOINT, Lr as ChatFiles, Ls as readHandoffAck, M as communityHasFrame, Ma as COMMUNITY_REACTION_FRAME, Mc as seedSigner, Mo as verifyCommitSignature, Mr as rankHubs, Ms as handoffReleaseFrame, N as decodeCommunityLink, Na as GROUP_REACTION_FRAME, Nc as webCryptoSigner, No as edgeParams, Nr as readBeacon, Ns as handoffRetryAfter, O as sealGroupTyping, Oa as dhtEditId, Oc as deviceKeyZ32, Oo as commitHash, Or as mergeBeacon, Os as handoffHelloFrame, P as encodeCommunityLink, Pa as REACTION_LIMITS, Po as DirectPathWatch, Pr as readBeaconHead, Ps as handoffStreamKey, Q as frameBytes, Qc as RelayTransport, Qi as receivedIdentityStatus, Qn as parseEngineError, Qr as readPin, Qs as verifySetUpdate, Qt as didDhtDocument, R as entryParams, Ra as reactionEmoji, Rc as turnPutSummary, Ri as CapsExchange, Rn as cashuRequestPayload, Ro as RELAY_POLL_INTERVALS, Rr as FILE_LIMITS, Rs as readHandoffCancel, S as readAppBundleAsync, Sa as parseVideoMeta, Si as newMailbox, Sn as sparkInvoiceDetails, So as canonicalJson, Sr as beaconKeys, Ss as handoffCancelFrame, T as GroupTypingBoard, Ta as EDIT_BUFFER_MS, Tc as HANDOFF_CAPABILITY, Tl as toZ32, Tn as isPubkyKey, To as GROUP_MEMBER_CAP, Tr as freshHubs, Ts as handoffDataFrame, Tt as isAtprotoDid, Ua as pairedReplyAuthor, Uc as readTurnPacket, Un as parseFedimintRequestPayload, Uo as webLocalFetch, Ur as TypingSender, Us as readHandoffTurnFrame, V as mergeKnocks, Va as validReactionNumber, Vc as firstDeviceSetSecret, Vi as dialDescriptors, Vn as isFederationId, Vo as formatLocalTarget, Vs as readHandoffHello, W as GroupWakeLimiter, Wa as readReply, Wc as signTurnPacket, Wi as IDENTITY_REVOCATION_LABEL, Wn as GhostLink, Wo as LIMITS, Ws as readHandoffVerified, X as GROUP_READ_NOTE, Xc as turnVerifierMark, Xi as identityStatement, Xn as engineError, Xr as pinIsNewer, Xs as setUpdateFrame, Yc as turnStatedVerifier, Yi as identityRevocationValue, Yn as pairedMessageFrame, Yr as nextPinNumber, Ys as setAckFrame, Z as GroupSession, Za as STATUS_CARD_LIMITS, Zc as DEFAULT_RELAYS, Zi as newIdentityBinding, Zn as engineText, Zr as pinNumberHolds, Zs as signTombstone, _c as createChatInvite, _i as HOLD_DATED_BACK_MS, _n as validatePaymentTarget, _o as isAppRef, _r as MESH_HUBS, _s as filePartName, a as planAppUpdate, aa as automaticTransport, ac as enrollDigits, ai as wakeRequest, al as withRequestOptions, an as EVM_TEST_CHAINS, ao as arrivalKey, as as serviceIdFromName, at as groupName, b as pacer, ba as parseVoiceMeta, bi as HoldRefusedError, bl as bytesEqual, bn as SPARK_PROVIDER, br as pickMeshHubs, bs as handoffAttemptSucceeded, cc as enrollHelloFrame, cl as createRelayPayload, cn as SEPOLIA_TEST_USDT, co as receivedTimestamp, cs as HANDOFF_DONE, d as APP_BUNDLE_LIMITS, da as DHT_FILE_CAPABILITY, dc as readEnrollHello, di as APPS_CAPABILITY, dn as USDT_PUBLIC_RPC, do as APP_STATEMENT_LIMITS, ds as HANDOFF_OFFER, ea as lastSharedWithMe, ei as WakeLimiter, el as normalizeRelayUrl, en as encodeDidDhtDeactivated, es as parseCallSignal, f as APP_BUNDLE_MAGIC, fa as dhtFileId, fc as verifyEnrollProof, fi as BUTTONS_CAPABILITY, fl as createIdentity, fn as WALLET_NETWORKS, fo as appFingerprint, fs as HANDOFF_PAKE, g as appViewOf, gc as OwnInviteError, gi as HOLD_CAPABILITY, gl as verify, gn as formatPaymentAmount, go as isAppKey, gr as readGroupSignal, gs as HANDOFF_VERIFIED, h as appDigest, ha as sanitizeMime, hc as readDeviceInvite, hi as UPGRADE_CAPABILITY, hl as publicKeyFromZ32, hn as assertWholeSats, ho as isAppHash, hr as groupSignalFrame, hs as HANDOFF_TIMINGS, i as checkAppBeforeRun, ia as TRANSPORTS, ic as enrollCancelReason, ii as relayRequest, il as isDiscoveryBudgetError, in as ETHEREUM_USDT, io as statusCardText, ir as groupFileFallback, is as LEGACY_SERVICES, it as mentionsMember, j as GROUP_READ_NOTE_COMMUNITY, ja as readForwarded, jc as newDeviceSetSecret, jo as rosterHas, jr as pickHubs, js as handoffPakeFrame, k as COMMUNITY_LIMITS, ka as parseLinkPreview, kc as deviceLinkPairing, ko as parseGroupCommit, kr as mergeLobby, ks as handoffManifestFrames, l as readAppStoreSteps, la as DHT_MESSAGE_TTL, lc as enrollProofFrame, li as chatAppId, lo as shownTime, ls as HANDOFF_HAVE, ma as sanitizeFileName, mc as deviceInviteJoinerParams, mi as STATUS_CARD_CAPABILITY, ml as identityFromSeedB64, mn as assertTokenUnits, ms as HANDOFF_REQUEST, n as appStoreDecision, na as emptyProofLedger, ni as newWakeToken, nl as traceLink, no as checkStatusCard, ns as emptyLinkRecords, nt as carryMentions, o as APP_STORE_LIMITS, oc as enrollDoneFrame, oi as checkPushEndpoint, ol as PacketTooLargeError, on as ONCHAIN_PROVIDER, oo as claimedTime, or as readGroupFileMeta, os as HANDOFF_ACK, p as APP_ICON_PATH, pa as formatFileSize, pc as createDeviceInvite, pi as EDIT_CAPABILITY, pl as identityFromSeed, pn as arkAddressPrefix, po as appRef, ps as HANDOFF_PIECE_BYTES, q as parseGroupWakeFrame, qc as turnKeys, qn as PAIRED_FRAME_TOO_LARGE, qr as PIN_LIMITS, r as appUpdateDecision, ra as validExternalKey, rc as enrollCancelFrame, ri as parseWakeFrame, rl as budgetRetryMs, rn as signDidDhtPacket, ro as sameButtonText, rs as HTTP_SERVICE_PROTO, rt as parseCommunityEdit, sc as enrollGrantFrame, si as vapidKeysMatch, sn as PaymentPreflightError, so as heardTime, ss as HANDOFF_CANCEL, t as appRevocationFor, ta as PeerProofs, ti as deviceWakeRequest, tn as encodeDidDhtPacket, tt as GROUP_EDIT_TEXT_BYTES, ua as peekDhtMailbox, uc as readEnrollGrant, ui as isAppVersion, un as TEST_USDT_FAUCET_AMOUNT, ur as CarriedTransport, us as HANDOFF_HELLO, vc as decodeInviteCode, vi as HOLD_LIMITS, vl as sanitizeAvatar, vn as walletNetworkOf, vo as readAppRevocation, vr as mayBeHub, vs as handoffAttemptAllowed, wc as ENROLL_CAPABILITY, wl as toBase64Url, wo as readCanonicalJson, wr as doorHubs, ws as handoffContextProof, xc as inviteOwnership, xi as isHoldUrl, xl as fromBase64Url, xn as sparkAddressKind, xr as COMMUNITY_TOPOLOGY, xs as handoffBusyFrame, y as isAppUrl, ya as fileMessageText, yc as encodeInviteCode, yi as HoldKeys, yl as sanitizeDisplayText, yn as SPARK_NETWORKS, yr as meshHubs, ys as handoffAttemptFailed, z as knockIdentity, za as reactionIsNewer, zc as TURN_LAST_SEQUENCE, zi as DHT_TEXT_CAPABILITY, zn as fedimintRequestPayload, zo as presenceSeenAt, zr as transferEnded, zs as readHandoffDone } from "./src-BLzG4Sfv.js";
3
3
  import { i as SourceUnreachableError, n as PROVIDER_PLATFORMS, o as isNothingSpentError, r as SourceConfigError, t as NothingSpentError, u as redact } from "./types-C4_KafL_.js";
4
4
  import { t as bitcoindRpc } from "./bitcoindProvider-DGw3xBSa.js";
5
- import { t as nwc } from "./nwcProvider-BbjJOfLD.js";
5
+ import { t as nwc } from "./nwcProvider-2coJAsqr.js";
6
6
  import { a as clearProfileStores, c as fileStore, d as profileOpenFailure, f as store, i as STORES$1, l as newestWalletTx, m as wrap, n as APP_STORAGE_SCOPE_INDEX, o as databaseName, p as transact, r as CARD_INDEX, s as deleteDatabase, t as APP_STORAGE_CHAT_INDEX, u as openDb } from "./idb-B5L8wuOm.js";
7
- import { a as sealSeed, i as newDeviceKey, o as unsealSeed, r as intentRepository } from "./networkReason-DwcadZz5.js";
8
- import { $ as setSingleWriterGate, A as LightningCards, B as breezDatabaseInUse, C as FileAppender, D as streamStored, E as storedSize, F as ProviderSources, G as ModeChanged, H as dropBreezDatabase, I as sourceKey, J as networkLabel, K as ModeGate, L as CASHU_MINT_SOURCE, M as isRecoveryPhrase, N as normalizePhrase, P as lightningPaying, Q as setAwayWallets, R as cashuMint, S as WALLET_TYPES, T as removeStored, U as iceServerProblem, V as breezDatabasesFor, W as iceServerSetting, X as refuseAway, Y as awayFrom, Z as requireTurn, _ as crossNetwork, a as storedGroupFiles, b as walletInstances, c as receivedPairedReply, d as paymentAlias, f as paymentWireId, g as createTiming, h as createFailure, i as groupOfFile, j as cardsKey, k as CASHU_CARD, l as replyRef, m as assertConfirmedReal, n as groupFileId, o as groupReply, p as WALLET_NAMES, q as WrongNetworkError, r as groupFileText, s as pairedWireReply, t as GroupFileDesk, u as replyTo, v as paymentNetwork, w as readStored$1, y as paymentNetworksOf, z as breezDatabase } from "./groupFiles-6qnLCnOm.js";
9
- import { i as fedimintDatabase, n as createIrohWebEndpoint, o as loadFedimintSdk, r as irohRelayProblem, t as DEFAULT_IROH_RELAYS } from "./irohWeb-DSyLp5Re.js";
7
+ import { a as sealSeed, i as newDeviceKey, o as unsealSeed, r as intentRepository } from "./networkReason-CiHrd-kG.js";
8
+ import { $ as setSingleWriterGate, A as LightningCards, B as breezDatabaseInUse, C as FileAppender, D as streamStored, E as storedSize, F as ProviderSources, G as ModeChanged, H as dropBreezDatabase, I as sourceKey, J as networkLabel, K as ModeGate, L as CASHU_MINT_SOURCE, M as isRecoveryPhrase, N as normalizePhrase, P as lightningPaying, Q as setAwayWallets, R as cashuMint, S as WALLET_TYPES, T as removeStored, U as iceServerProblem, V as breezDatabasesFor, W as iceServerSetting, X as refuseAway, Y as awayFrom, Z as requireTurn, _ as crossNetwork, a as storedGroupFiles, b as walletInstances, c as receivedPairedReply, d as paymentAlias, f as paymentWireId, g as createTiming, h as createFailure, i as groupOfFile, j as cardsKey, k as CASHU_CARD, l as replyRef, m as assertConfirmedReal, n as groupFileId, o as groupReply, p as WALLET_NAMES, q as WrongNetworkError, r as groupFileText, s as pairedWireReply, t as GroupFileDesk, u as replyTo, v as paymentNetwork, w as readStored$1, y as paymentNetworksOf, z as breezDatabase } from "./groupFiles-Cfrjo3YS.js";
9
+ import { i as fedimintDatabase, n as createIrohWebEndpoint, o as loadFedimintSdk, r as irohRelayProblem, t as DEFAULT_IROH_RELAYS } from "./irohWeb-jErC-V0J.js";
10
10
  import { c as isTestMint, d as paysItsOwnInvoices, l as isWorthlessMint, n as DEFAULT_MINTS, o as fakesLightning, r as TEST_MINT, t as BITCOIN_INVOICE_ON_TESTNET, u as mintNetwork } from "./mints-BrlY773j.js";
11
- import { _ as reserveAdapterIds, b as testBuild, f as setOwnDidSource, g as registeredOnchainProviders, h as registeredLightningProviders, l as chosenResolver, n as resolveAtprotoDid, p as onAdaptersChanged, t as assertPublicServer, v as boundedIdentityFetch, y as verifyIdentity } from "./resolve-BIDJ-UUl.js";
11
+ import { _ as reserveAdapterIds, b as testBuild, f as setOwnDidSource, g as registeredOnchainProviders, h as registeredLightningProviders, l as chosenResolver, n as resolveAtprotoDid, p as onAdaptersChanged, t as assertPublicServer, v as boundedIdentityFetch, y as verifyIdentity } from "./resolve-2hGrvTen.js";
12
12
  import { c as fileSpace, f as FILE_BYTES_STEP, o as fileBytes, r as blobDigest, s as fileBytesOf, u as removeFileBytes } from "./fileBytes-Di7VZtmU.js";
13
- import { n as MAX_BACKUP_BYTES, t as BACKUP_MEDIA_TYPE } from "./envelope-fNC941z4.js";
13
+ import { n as MAX_BACKUP_BYTES, t as BACKUP_MEDIA_TYPE } from "./envelope-wspXCjle.js";
14
14
  import { t as hyperdhtRelayProblem } from "./hyperdhtRelay-BT_wRxab.js";
15
15
  import { sha256 } from "@noble/hashes/sha2.js";
16
16
  import { hkdf } from "@noble/hashes/hkdf.js";
@@ -199,7 +199,7 @@ function viewNews(before, after) {
199
199
  //#endregion
200
200
  //#region ../browser/src/engine/paymentAdapters/usdtWallet.ts
201
201
  /** The Ethereum libraries, a large part of the app: loaded once a USDT wallet is made, opened or restored, not with the engine. */
202
- var loadUsdt = () => import("./usdt-B2TLRlYa.js");
202
+ var loadUsdt = () => import("./usdt-zwyn_AQK.js");
203
203
  /** Every new profile starts with this wallet: an address to receive on, nothing to set up. */
204
204
  var DEFAULT_USDT = {
205
205
  network: "ethereum",
@@ -648,7 +648,7 @@ async function restoreArkDatabase(walletId, snapshot) {
648
648
  //#endregion
649
649
  //#region ../browser/src/engine/paymentAdapters/arkWallet.ts
650
650
  /** The Ark SDK, a large part of the app: loaded once an Ark wallet is made, opened or restored, not with the engine. */
651
- var loadArkade = () => import("./arkade-CNnMaoEQ.js");
651
+ var loadArkade = () => import("./arkade-B5Xn40bC.js");
652
652
  /** How long a Testnet wallet about to make way for another waits for its server to say what it holds. */
653
653
  var RETIRE_READ_MS = 1e4;
654
654
  /** Every new profile starts with this wallet: nothing to set up before receiving. */
@@ -6703,7 +6703,7 @@ var registry;
6703
6703
  var loading$1;
6704
6704
  var listeners = /* @__PURE__ */ new Set();
6705
6705
  function loadIdentityProviders() {
6706
- return loading$1 ??= import("./registry-DoTb6uEr.js").then((m) => {
6706
+ return loading$1 ??= import("./registry-sML83UvL.js").then((m) => {
6707
6707
  registry = m;
6708
6708
  for (const listener of listeners) listener();
6709
6709
  return m;
@@ -7723,6 +7723,11 @@ function checkedEvent(raw, maxContentLength = 16384, now = Date.now()) {
7723
7723
  tags: copy.tags.map((t) => [...t])
7724
7724
  };
7725
7725
  }
7726
+ /** Whether `raw` is `event` (one already checked) in every field, the tags included. */
7727
+ function sameEvent(event, raw) {
7728
+ const tags = raw.tags;
7729
+ return raw.id === event.id && raw.pubkey === event.pubkey && raw.sig === event.sig && raw.kind === event.kind && raw.created_at === event.created_at && raw.content === event.content && Array.isArray(tags) && tags.length === event.tags.length && event.tags.every((tag, i) => Array.isArray(tags[i]) && tags[i].length === tag.length && tag.every((x, j) => tags[i][j] === x));
7730
+ }
7726
7731
  var subscriptionId = () => "ghostly-" + Array.from(crypto.getRandomValues(/* @__PURE__ */ new Uint8Array(8)), (b) => b.toString(16).padStart(2, "0")).join("");
7727
7732
  /** Newest first, ties broken by the lexicographically smaller id (NIP-01's rule for replaceable events). */
7728
7733
  var byNewest = (a, b) => b.created_at - a.created_at || a.id.localeCompare(b.id);
@@ -7795,10 +7800,17 @@ async function readRelays(relays, filter, options = {}) {
7795
7800
  return;
7796
7801
  }
7797
7802
  if (frame[0] !== "EVENT") return;
7798
- const event = checkedEvent(frame[2], maxContentLength);
7799
- if (!event || !filter.kinds.includes(event.kind) || filter.authors && !filter.authors.includes(event.pubkey)) return;
7803
+ const raw = frame[2];
7804
+ if (!raw || typeof raw !== "object" || !filter.kinds.includes(raw.kind) || filter.authors && !filter.authors.includes(raw.pubkey)) return;
7805
+ const known = typeof raw.id === "string" ? seen.get(raw.id) : void 0;
7806
+ if (known) {
7807
+ if (!sameEvent(known, raw)) return;
7808
+ } else {
7809
+ const event = checkedEvent(raw, maxContentLength);
7810
+ if (!event) return;
7811
+ seen.set(event.id, event);
7812
+ }
7800
7813
  replied = true;
7801
- if (!seen.has(event.id)) seen.set(event.id, event);
7802
7814
  if (++count >= maxEvents) finish(true);
7803
7815
  };
7804
7816
  })));
@@ -9986,21 +9998,26 @@ var AppFetchError = class extends Error {
9986
9998
  }
9987
9999
  };
9988
10000
  function boundedAppFetch(options = {}) {
9989
- return async (url, { maxBytes, peek = false }) => {
10001
+ return async (url, { maxBytes, peek = false, revalidate = false, signal: stopped }) => {
9990
10002
  if (!isAppFetchUrl(url)) throw new AppFetchError("host", "Apps are read only from raw.githubusercontent.com, or from cdn.jsdelivr.net at a commit, over HTTPS");
9991
10003
  if (options.online && !options.online()) throw new AppFetchError("offline", "Offline");
10004
+ if (stopped?.aborted) throw new AppFetchError("network", "The read was stopped");
9992
10005
  const fetcher = options.fetcher ?? globalThis.fetch.bind(globalThis);
9993
10006
  const controller = new AbortController();
9994
10007
  const cut = () => {
9995
10008
  controller.abort(new DOMException("The read took too long", "TimeoutError"));
9996
10009
  };
10010
+ const stop = () => {
10011
+ controller.abort(new DOMException("The read was stopped", "AbortError"));
10012
+ };
10013
+ stopped?.addEventListener("abort", stop);
9997
10014
  const total = setTimeout(cut, options.totalMs ?? APP_FETCH_LIMITS.totalMs);
9998
10015
  let idle = setTimeout(cut, options.timeoutMs ?? APP_FETCH_LIMITS.timeoutMs);
9999
10016
  const heard = () => {
10000
10017
  clearTimeout(idle);
10001
10018
  idle = setTimeout(cut, options.idleMs ?? APP_FETCH_LIMITS.idleMs);
10002
10019
  };
10003
- const failure = (error) => controller.signal.aborted ? new AppFetchError("slow", "That took too long on this connection") : new AppFetchError("network", error instanceof Error ? error.message : String(error));
10020
+ const failure = (error) => stopped?.aborted ? new AppFetchError("network", "The read was stopped") : controller.signal.aborted ? new AppFetchError("slow", "That took too long on this connection") : new AppFetchError("network", error instanceof Error ? error.message : String(error));
10004
10021
  const { signal } = controller;
10005
10022
  let response;
10006
10023
  try {
@@ -10008,13 +10025,14 @@ function boundedAppFetch(options = {}) {
10008
10025
  signal,
10009
10026
  credentials: "omit",
10010
10027
  referrerPolicy: "no-referrer",
10011
- cache: "no-store",
10028
+ cache: revalidate && !peek ? "no-cache" : "no-store",
10012
10029
  redirect: "error",
10013
10030
  ...peek && { headers: { range: `bytes=0-${maxBytes - 1}` } }
10014
10031
  });
10015
10032
  } catch (error) {
10016
10033
  clearTimeout(total);
10017
10034
  clearTimeout(idle);
10035
+ stopped?.removeEventListener("abort", stop);
10018
10036
  throw failure(error);
10019
10037
  }
10020
10038
  heard();
@@ -10032,10 +10050,10 @@ function boundedAppFetch(options = {}) {
10032
10050
  }
10033
10051
  const reader = response.body?.getReader();
10034
10052
  if (reader) {
10035
- const stop = () => {
10053
+ const letGo = () => {
10036
10054
  reader.cancel().catch(() => {});
10037
10055
  };
10038
- signal.addEventListener("abort", stop);
10056
+ signal.addEventListener("abort", letGo);
10039
10057
  try {
10040
10058
  for (;;) {
10041
10059
  const { done, value } = await reader.read();
@@ -10055,13 +10073,14 @@ function boundedAppFetch(options = {}) {
10055
10073
  if (error instanceof AppFetchError) throw error;
10056
10074
  throw failure(error);
10057
10075
  } finally {
10058
- signal.removeEventListener("abort", stop);
10076
+ signal.removeEventListener("abort", letGo);
10059
10077
  await reader.cancel().catch(() => {});
10060
10078
  }
10061
10079
  }
10062
10080
  } finally {
10063
10081
  clearTimeout(total);
10064
10082
  clearTimeout(idle);
10083
+ stopped?.removeEventListener("abort", stop);
10065
10084
  }
10066
10085
  const bytes = new Uint8Array(length);
10067
10086
  let at = 0;
@@ -10388,6 +10407,8 @@ var Apps = class {
10388
10407
  runUsed = /* @__PURE__ */ new Map();
10389
10408
  /** Reads of a bundle under way, by digest: icons drawn at once share one read. */
10390
10409
  verifying = /* @__PURE__ */ new Map();
10410
+ /** Reads of a bundle's URL under way: an install screen opened again waits on the read the closed one began, not on a second. */
10411
+ bundleReads = /* @__PURE__ */ new Map();
10391
10412
  /**
10392
10413
  * The `icon.png` of each checked bundle, by digest (at most 256 KiB and 1024 × 1024 pixels, or null for none): every icon shown on the Apps
10393
10414
  * page, in a chat's cards and in the composer's Apps is read without the whole bundle again.
@@ -10403,6 +10424,10 @@ var Apps = class {
10403
10424
  timer = null;
10404
10425
  /** Drops what `staged` holds past `STAGED.ms`, set while it holds anything: a closed install screen sends no call. */
10405
10426
  sweep = null;
10427
+ /** The store `previewStore` last read and checked, for Add to take within `STAGED.ms` without reading it again. */
10428
+ previewed = null;
10429
+ /** Drops `previewed` past `STAGED.ms`: an index is up to 4 MiB, and a closed Add screen sends no call. */
10430
+ previewedSweep = null;
10406
10431
  checking = null;
10407
10432
  /** Runs the person started with Run anyway (`<ref> <digest>`), for this engine's life: a removal does not cut them off. */
10408
10433
  anyway = /* @__PURE__ */ new Set();
@@ -10459,6 +10484,7 @@ var Apps = class {
10459
10484
  if (this.sweep) clearTimeout(this.sweep);
10460
10485
  this.sweep = null;
10461
10486
  this.staged.clear();
10487
+ this.keepPreviewed(null);
10462
10488
  this.held.clear();
10463
10489
  this.heldStores = null;
10464
10490
  this.views = null;
@@ -10812,14 +10838,22 @@ var Apps = class {
10812
10838
  this.runUsed.delete(digest);
10813
10839
  }
10814
10840
  }
10815
- async fetchBundle(url) {
10816
- const bytes = await this.host.fetch(url, { maxBytes: APP_BUNDLE_LIMITS.bundleBytes });
10817
- const read = await readAppBundleAsync(bytes);
10818
- if (!read.ok) fail(read.reason, `This is not an app Ghostly can install${read.detail ? ` (${read.detail})` : ""}`);
10819
- return {
10820
- bundle: read.bundle,
10821
- bytes
10822
- };
10841
+ fetchBundle(url) {
10842
+ const running = this.bundleReads.get(url);
10843
+ if (running) return running;
10844
+ const read = (async () => {
10845
+ const bytes = await this.host.fetch(url, { maxBytes: APP_BUNDLE_LIMITS.bundleBytes });
10846
+ const read = await readAppBundleAsync(bytes);
10847
+ if (!read.ok) fail(read.reason, `This is not an app Ghostly can install${read.detail ? ` (${read.detail})` : ""}`);
10848
+ return {
10849
+ bundle: read.bundle,
10850
+ bytes
10851
+ };
10852
+ })().finally(() => {
10853
+ this.bundleReads.delete(url);
10854
+ });
10855
+ this.bundleReads.set(url, read);
10856
+ return read;
10823
10857
  }
10824
10858
  /**
10825
10859
  * Reads the index at `url`. With the index held for this store, bytes equal to it (by digest) are the held index: its
@@ -10829,7 +10863,16 @@ var Apps = class {
10829
10863
  * this store or another, a preview included, is not checked again.
10830
10864
  */
10831
10865
  async readStoreAt(url, heldKey, held) {
10832
- const [indexBytes, sigBytes] = await Promise.all([this.host.fetch(url, { maxBytes: APP_FETCH_LIMITS.storeIndexBytes }), this.host.fetch(besideUrl(url, "ghostly-store.sig"), { maxBytes: APP_FETCH_LIMITS.sigBytes })]);
10866
+ const stop = new AbortController();
10867
+ const read = (at, maxBytes) => this.host.fetch(at, {
10868
+ maxBytes,
10869
+ revalidate: true,
10870
+ signal: stop.signal
10871
+ }).catch((error) => {
10872
+ stop.abort();
10873
+ throw error;
10874
+ });
10875
+ const [indexBytes, sigBytes] = await Promise.all([read(url, APP_FETCH_LIMITS.storeIndexBytes), read(besideUrl(url, "ghostly-store.sig"), APP_FETCH_LIMITS.sigBytes)]);
10833
10876
  if (held?.index && held.digest !== void 0 && toBase64Url(await sha256Paced(indexBytes)) === held.digest) return {
10834
10877
  ok: true,
10835
10878
  store: {
@@ -10856,7 +10899,10 @@ var Apps = class {
10856
10899
  if (read.has(url)) continue;
10857
10900
  read.add(url);
10858
10901
  try {
10859
- const file = await this.readRevocationsFile(await this.host.fetch(url, { maxBytes: APP_FETCH_LIMITS.revocationsBytes }));
10902
+ const file = await this.readRevocationsFile(await this.host.fetch(url, {
10903
+ maxBytes: APP_FETCH_LIMITS.revocationsBytes,
10904
+ revalidate: true
10905
+ }));
10860
10906
  if (file) (out ??= []).push(...file.filter((r) => r.statement.app === ref));
10861
10907
  } catch {}
10862
10908
  }
@@ -10930,12 +10976,24 @@ var Apps = class {
10930
10976
  storeUrl(url) {
10931
10977
  return typeof url === "string" && appPasteUrl(url, "ghostly-store.json") || notReadable(url, "Stores are read only from raw.githubusercontent.com, or from cdn.jsdelivr.net at a commit, over HTTPS");
10932
10978
  }
10933
- /** Reads a store at a URL for the person to see before adding it. Nothing is kept. */
10979
+ keepPreviewed(previewed) {
10980
+ if (this.previewedSweep) clearTimeout(this.previewedSweep);
10981
+ this.previewedSweep = previewed ? setTimeout(() => this.keepPreviewed(null), STAGED.ms) : null;
10982
+ this.previewed = previewed;
10983
+ }
10984
+ /** Reads a store at a URL for the person to see before adding it. Nothing is stored: the checked index waits in memory for `addStore`. */
10934
10985
  async previewStore({ url }) {
10935
10986
  const at = this.storeUrl(url);
10987
+ this.keepPreviewed(null);
10936
10988
  const read = await this.readStoreAt(at);
10937
10989
  if (!read.ok) fail(read.reason, "This is not a store Ghostly can read");
10938
- const { index } = read.store;
10990
+ const { index, digest } = read.store;
10991
+ this.keepPreviewed({
10992
+ url: at,
10993
+ index,
10994
+ digest,
10995
+ at: this.now()
10996
+ });
10939
10997
  return {
10940
10998
  url: at,
10941
10999
  key: index.key,
@@ -10951,12 +11009,22 @@ var Apps = class {
10951
11009
  }
10952
11010
  /**
10953
11011
  * Adds a store the person chose: read at its URL and pinned to its key (`key`, when given, is the key the person saw,
10954
- * and another one is refused). A store already added under that key takes the URL and the newer index.
11012
+ * and another one is refused). A store already added under that key takes the URL and the newer index. The index the
11013
+ * preview just read at that URL, under that key, is taken as it is (only its expiry again), not downloaded again.
10955
11014
  */
10956
11015
  async addStore({ url, key }) {
10957
11016
  if (key !== void 0 && !isAppKey(key)) fail("store-key", "Not a store key");
10958
11017
  const at = this.storeUrl(url);
10959
- const read = await this.readStoreAt(at, key);
11018
+ const kept = this.previewed;
11019
+ this.keepPreviewed(null);
11020
+ const read = kept && kept.url === at && (key === void 0 || key === kept.index.key) && this.now() - kept.at <= STAGED.ms ? {
11021
+ ok: true,
11022
+ store: {
11023
+ index: kept.index,
11024
+ digest: kept.digest,
11025
+ expired: kept.index.expires < this.nowS()
11026
+ }
11027
+ } : await this.readStoreAt(at, key);
10960
11028
  if (!read.ok) fail(read.reason, "This is not a store Ghostly can read");
10961
11029
  const { index, digest } = read.store;
10962
11030
  const held = await this.storeRecord(index.key);
@@ -16258,6 +16326,7 @@ var DeviceLinks = class {
16258
16326
  packetTransports: true,
16259
16327
  transport: this.options.transport,
16260
16328
  pollIntervals: this.options.pollIntervals,
16329
+ madeAt: 0,
16261
16330
  autoConnect: true,
16262
16331
  createPeerConnection: () => {
16263
16332
  if (!this.createPeerConnection) throw new ReferenceError("RTCPeerConnection is not defined");
@@ -42260,6 +42329,7 @@ var GhostlyNode = class GhostlyNode {
42260
42329
  transport: live.carried ?? this.groupTransport,
42261
42330
  nick: !entry && this.quietEdge(stored) ? void 0 : this.sharedNick,
42262
42331
  pollIntervals: entry || this.groups.isCommunityGroup(group) ? this.pollIntervals : meshEdgeIntervals(this.pollIntervals, () => this.groups.meshSize(group)),
42332
+ madeAt: stored.createdAt,
42263
42333
  autoConnect: true,
42264
42334
  ...entry ? {
42265
42335
  oneShot: true,
@@ -42829,6 +42899,7 @@ var GhostlyNode = class GhostlyNode {
42829
42899
  return held.digest;
42830
42900
  },
42831
42901
  onFileIncoming: (file) => this.receiveFile(linkId, file),
42902
+ onFileRoom: async () => (await fileBytes()).room(),
42832
42903
  onFileProgress: (id, transferred, direction) => this.fileProgress(this.localFileId(linkId, id, direction), transferred),
42833
42904
  onFileComplete: (id, direction) => this.fileSettled(this.localFileId(linkId, id, direction, { failed: false }), void 0, linkId),
42834
42905
  onFilesFrame: (frame) => this.fileDesk.handle(linkId, frame),
@@ -42967,7 +43038,7 @@ var GhostlyNode = class GhostlyNode {
42967
43038
  get nativeFactories() {
42968
43039
  const relay = this.relaysHyperdht ? this.hyperdhtRelay : "";
42969
43040
  return {
42970
- ...relay ? { "hyperdht/1": async (seedB64) => (await import("./hyperdhtRelay-CrgYQN-g.js")).createRelayedHyperEndpoint(seedB64, relay) } : {},
43041
+ ...relay ? { "hyperdht/1": async (seedB64) => (await import("./hyperdhtRelay-H97Vz73W.js")).createRelayedHyperEndpoint(seedB64, relay) } : {},
42971
43042
  ...this.options.nativeTransports,
42972
43043
  ...this.ownIrohRelays ? { "iroh/1": (seedB64) => this.options.nativeTransports["iroh/1"](seedB64, this.settings.irohRelays?.length ? { relays: [...this.settings.irohRelays] } : {}) } : {},
42973
43044
  ...this.options.irohWeb ? { "iroh/1": (seedB64) => createIrohWebEndpoint(seedB64, { relays: this.irohRelays }) } : {}
@@ -43816,4 +43887,4 @@ function signalKind(signal) {
43816
43887
  //#endregion
43817
43888
  export { EngineServer };
43818
43889
 
43819
- //# sourceMappingURL=server-Bx3RGkBC.js.map
43890
+ //# sourceMappingURL=server-BbPiCghe.js.map