@ghostlytools/cli 1.1.1 → 1.1.3

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.
@@ -1,5 +1,5 @@
1
1
  import { a as fileBytesOf, c as removeFileBytes, d as __exportAll, i as fileBytes, n as blobDigest } from "./fileBytes-DxiJHmTk.js";
2
- import { $a as filePartName, $i as BUTTON_ID, $n as freshHubs, $o as createChatInvite, $r as IdentityExchange, $s as randomBytes, $t as isPubkyKey, A as GROUP_EDIT_TEXT_BYTES, Aa as RTC_CONFIG, An as findEndpoint, Ao as readSetUpdate, Ar as newWakeToken, As as RelayTransport, At as encodeDidDhtPacket, Ba as LEGACY_SERVICES, Bi as GROUP_REACTION_FRAME, Bo as enrollCancelReason, Br as HOLD_LIMITS, Bs as createRelayPayload, Bt as USDT_PUBLIC_RPC, C as groupWakes, Ca as formatLocalTarget, Co as readHandoffHello, Cr as nextPinNumber, Cs as nextTurnPosition, D as GroupSession, Da as decodeControl, Dn as ENDPOINT, Do as sealHandoffPiece, Dr as WAKE_CALL_INTERVAL_MS, Ds as turnKeys, Dt as didDhtDocument, E as GROUP_READ_NOTE, Ea as LIMITS, En as decodeBolt11, Eo as readHandoffVerified, Er as readPin, Es as signTurnRelease, Fi as dhtEditId, Fn as INVITE_TAKEN, Fr as vapidKeysMatch, Fs as budgetRetryMs, Ft as ONCHAIN_PROVIDER, Ga as HANDOFF_HAVE, Gi as reactionEmoji, Gn as MESH_HUBS, Go as enrollProofFrame, Gr as CapsExchange, Gs as identityFromSeed, Gt as validatePaymentTarget, Ha as HANDOFF_ACK, Hi as ReactionWindow, Ho as enrollDoneFrame, Hr as HoldRefusedError, Ht as assertTokenUnits, Ia as parseCallSignal, Ii as parseLinkPreview, In as LIVENESS_PING_MS, Is as isDiscoveryBudgetError, It as PaymentPreflightError, Ja as HANDOFF_PAKE, Ji as validReactionNumber, Jn as pickMeshHubs, Jo as verifyEnrollProof, Jr as dialDescriptors, Js as verify, Jt as SPARK_PROVIDER, Ka as HANDOFF_HELLO, Ki as reactionIsNewer, Kn as mayBeHub, Ko as readEnrollGrant, Kr as DHT_TEXT_CAPABILITY, Ks as identityFromSeedB64, Kt as walletNetworkOf, Li as forwardedAgain, Ln as pairedMessageFrame, Lr as EDIT_CAPABILITY, Ls as withRequestOptions, Lt as SEPOLIA_TEST_USDT, M as parseCommunityEdit, Mi as EDIT_BUFFER_MS, Mn as parseCashuRequestPayload, Mo as setUpdateFrame, Mr as relayRequest, Ms as normalizeRelayUrl, Mt as signDidDhtPacket, N as mentionsMember, Ni as EDIT_RATE_WINDOW_MS, Nn as parseFedimintRequestPayload, No as signTombstone, Nr as wakeRequest, Nt as ETHEREUM_USDT, Oa as encodeControl, Oi as fileMessageText, On as cashuRequestPayload, Or as WakeLimiter, Os as turnName, Ot as didDhtFromPublicKey, P as groupName, Pi as RateWindow, Pn as GhostLink, Po as verifySetUpdate, Pr as checkPushEndpoint, Ps as traceLink, Pt as EVM_TEST_CHAINS, Qa as HANDOFF_VERIFIED, Qi as replySnippet, Qn as doorHubs, Qo as OwnInviteError, Qs as fromBase64Url, Ra as emptyLinkRecords, Ri as readForwarded, Rn as CarriedTransport, Rr as HOLD_CAPABILITY, Rs as PacketTooLargeError, Rt as SEPOLIA_TEST_USDT_FAUCET, S as groupWakeFrame, Sa as GhostlyHttpError, Si as safeBlobType, So as readHandoffHave, Sr as mayPin, Ss as firstDeviceSetSecret, Ta as webLocalFetch, Tn as engineText, To as readHandoffTurnFrame, Tr as pinNumberHolds, Ts as signTurnPacket, Ua as HANDOFF_CANCEL, Ui as nextReactionNumber, Un as groupSignalFrame, Uo as enrollGrantFrame, Ur as newMailbox, Ut as assertWholeSats, Va as serviceIdFromName, Vi as REACTION_LIMITS, Vo as enrollDigits, Vr as HoldKeys, Vt as WALLET_NETWORKS, Wa as HANDOFF_DONE, Wi as queueReaction, Wn as readGroupSignal, Wo as enrollHelloFrame, Wr as readManifest, Ws as createIdentity, Wt as formatPaymentAmount, Xa as HANDOFF_REQUEST, Xi as pairedReplyAuthor, Xn as beaconKeys, Xo as deviceInviteJoinerParams, Xs as sanitizeAvatar, Xt as sparkInvoiceDetails, Ya as HANDOFF_PIECE_BYTES, Yi as wireReaction, Yn as COMMUNITY_TOPOLOGY, Yo as createDeviceInvite, Yt as sparkAddressKind, Za as HANDOFF_TIMINGS, Zi as readReply, Zn as beaconRecords, Zo as readDeviceInvite, Zr as IDENTITY_REVOCATION_LABEL, Zs as bytesEqual, Zt as isBitcoinAddress, _ as knockRecords, _a as edgeParams, _i as peekDhtMailbox, _o as handoffVersions, _r as TypingSender, _s as TURN_SETTLE_MS, a as sealGroupTyping, aa as sameButtonText, ai as receivedIdentityStatus, ao as handoffContext, ar as pickHubs, as as ENROLL_CAPABILITY, ba as RELAY_POLL_INTERVALS, bi as parseImageMeta, bo as readHandoffCancel, bs as TURN_LAST_SEQUENCE, c as GROUP_READ_NOTE_COMMUNITY, ca as claimedTime, ci as PeerProofs, co as handoffDigest, cr as readBeaconHead, cs as deviceEchoNonce, d as encodeCommunityLink, da as shownTime, di as TRANSPORTS, do as handoffManifestFrames, dr as ChatFiles, ds as devicePingFrame, ec as toBase64Url, eo as handoffAttemptAllowed, er as lobbyKeys, es as decodeInviteCode, et as isAtprotoDid, fa as GROUP_MEMBER_CAP, fi as automaticTransport, fo as handoffOfferFrame, fr as FILE_LIMITS, fs as newDeviceSetSecret, g as knockIdentity, ga as verifyCommitSignature, gi as DHT_MESSAGE_TTL, go as handoffStreamKey, gs as TURN_RAISE_READ_TIMEOUT_MS, h as entryParams, ha as rosterHas, ho as handoffRetryAfter, i as openGroupTyping, ia as checkStatusCard, ii as newIdentityBinding, io as handoffCancelFrame, ir as newerHead, is as DEVICES_CAPABILITY, j as carryMentions, ji as parseVideoMeta, jn as isFederationId, jo as setAckFrame, jr as parseWakeFrame, js as currentRelays, ki as parseVoiceMeta, kn as fedimintRequestPayload, kr as deviceWakeRequest, ks as DEFAULT_RELAYS, kt as encodeDidDhtDeactivated, l as communityHasFrame, la as heardTime, li as emptyProofLedger, lo as handoffEphemeral, lr as readLobby, ls as deviceKeyZ32, m as encodeGroupEntryLink, ma as MEMBER_KEY, mi as irohRelayUrl, mo as handoffReleaseFrame, mr as transferStalled, ms as webCryptoSigner, n as GroupTypingBoard, na as STATUS_CARD_LIMITS, nc as utf8Decode, ni as identityRevocationValue, no as handoffAttemptSucceeded, nr as mergeBeacon, o as COMMUNITY_LIMITS, oa as statusCardText, oi as revokesIdentity, oo as handoffContextProof, or as rankHubs, os as HANDOFF_CAPABILITY, p as decodeGroupEntryLink, pi as irohDescriptor, po as handoffPakeFrame, pr as transferEnded, ps as seedSigner, qa as HANDOFF_OFFER, qi as readReaction, qn as meshHubs, qo as readEnrollHello, qr as capsDescriptors, qs as publicKeyFromZ32, qt as SPARK_NETWORKS, r as groupTypingEpoch, rc as utf8Encode, ri as identityStatement, ro as handoffBusyFrame, rr as mergeLobby, rs as inviteOwnership, s as CommunitySession, sa as arrivalKey, si as lastSharedWithMe, so as handoffDataFrame, sr as readBeacon, ss as deviceEchoFrame, tc as toZ32, ti as emptyIdentityLedger, to as handoffAttemptFailed, tr as lobbyRecords, ts as encodeInviteCode, tt as normalizeAtprotoHandle, u as decodeCommunityLink, ua as receivedTimestamp, ui as validExternalKey, uo as handoffHelloFrame, ur as shouldBeHub, us as deviceLinkPairing, v as mergeKnocks, va as DirectPathWatch, vi as DHT_FILE_CAPABILITY, vo as newHandoffId, vs as classifyTurnRead, w as parseGroupWakeFrame, wa as parseLocalTarget, wn as engineError, wo as readHandoffPake, wr as pinIsNewer, ws as readTurnPacket, x as GroupWakeLimiter, xa as presenceSeenAt, xo as readHandoffDone, xr as PIN_LIMITS, xs as TURN_MAX, y as readKnocks, yi as dhtFileId, yo as readHandoffAck, yr as typingActivity, ys as turnPutSummary, za as HTTP_SERVICE_PROTO, zi as COMMUNITY_REACTION_FRAME, zo as enrollCancelFrame, zr as HOLD_DATED_BACK_MS, zt as TEST_USDT_FAUCET_AMOUNT } from "./src-CJdPTl7Q.js";
2
+ import { $a as filePartName, $i as BUTTON_ID, $n as freshHubs, $o as createChatInvite, $r as IdentityExchange, $s as randomBytes, $t as isPubkyKey, A as GROUP_EDIT_TEXT_BYTES, Aa as RTC_CONFIG, An as findEndpoint, Ao as readSetUpdate, Ar as newWakeToken, As as RelayTransport, At as encodeDidDhtPacket, Ba as LEGACY_SERVICES, Bi as GROUP_REACTION_FRAME, Bo as enrollCancelReason, Br as HOLD_LIMITS, Bs as createRelayPayload, Bt as USDT_PUBLIC_RPC, C as groupWakes, Ca as formatLocalTarget, Co as readHandoffHello, Cr as nextPinNumber, Cs as nextTurnPosition, D as GroupSession, Da as decodeControl, Dn as ENDPOINT, Do as sealHandoffPiece, Dr as WAKE_CALL_INTERVAL_MS, Ds as turnKeys, Dt as didDhtDocument, E as GROUP_READ_NOTE, Ea as LIMITS, En as decodeBolt11, Eo as readHandoffVerified, Er as readPin, Es as signTurnRelease, Fi as dhtEditId, Fn as INVITE_TAKEN, Fr as vapidKeysMatch, Fs as budgetRetryMs, Ft as ONCHAIN_PROVIDER, Ga as HANDOFF_HAVE, Gi as reactionEmoji, Gn as MESH_HUBS, Go as enrollProofFrame, Gr as CapsExchange, Gs as identityFromSeed, Gt as validatePaymentTarget, Ha as HANDOFF_ACK, Hi as ReactionWindow, Ho as enrollDoneFrame, Hr as HoldRefusedError, Ht as assertTokenUnits, Ia as parseCallSignal, Ii as parseLinkPreview, In as LIVENESS_PING_MS, Is as isDiscoveryBudgetError, It as PaymentPreflightError, Ja as HANDOFF_PAKE, Ji as validReactionNumber, Jn as pickMeshHubs, Jo as verifyEnrollProof, Jr as dialDescriptors, Js as verify, Jt as SPARK_PROVIDER, Ka as HANDOFF_HELLO, Ki as reactionIsNewer, Kn as mayBeHub, Ko as readEnrollGrant, Kr as DHT_TEXT_CAPABILITY, Ks as identityFromSeedB64, Kt as walletNetworkOf, Li as forwardedAgain, Ln as pairedMessageFrame, Lr as EDIT_CAPABILITY, Ls as withRequestOptions, Lt as SEPOLIA_TEST_USDT, M as parseCommunityEdit, Mi as EDIT_BUFFER_MS, Mn as parseCashuRequestPayload, Mo as setUpdateFrame, Mr as relayRequest, Ms as normalizeRelayUrl, Mt as signDidDhtPacket, N as mentionsMember, Ni as EDIT_RATE_WINDOW_MS, Nn as parseFedimintRequestPayload, No as signTombstone, Nr as wakeRequest, Nt as ETHEREUM_USDT, Oa as encodeControl, Oi as fileMessageText, On as cashuRequestPayload, Or as WakeLimiter, Os as turnName, Ot as didDhtFromPublicKey, P as groupName, Pi as RateWindow, Pn as GhostLink, Po as verifySetUpdate, Pr as checkPushEndpoint, Ps as traceLink, Pt as EVM_TEST_CHAINS, Qa as HANDOFF_VERIFIED, Qi as replySnippet, Qn as doorHubs, Qo as OwnInviteError, Qs as fromBase64Url, Ra as emptyLinkRecords, Ri as readForwarded, Rn as CarriedTransport, Rr as HOLD_CAPABILITY, Rs as PacketTooLargeError, Rt as SEPOLIA_TEST_USDT_FAUCET, S as groupWakeFrame, Sa as GhostlyHttpError, Si as safeBlobType, So as readHandoffHave, Sr as mayPin, Ss as firstDeviceSetSecret, Ta as webLocalFetch, Tn as engineText, To as readHandoffTurnFrame, Tr as pinNumberHolds, Ts as signTurnPacket, Ua as HANDOFF_CANCEL, Ui as nextReactionNumber, Un as groupSignalFrame, Uo as enrollGrantFrame, Ur as newMailbox, Ut as assertWholeSats, Va as serviceIdFromName, Vi as REACTION_LIMITS, Vo as enrollDigits, Vr as HoldKeys, Vt as WALLET_NETWORKS, Wa as HANDOFF_DONE, Wi as queueReaction, Wn as readGroupSignal, Wo as enrollHelloFrame, Wr as readManifest, Ws as createIdentity, Wt as formatPaymentAmount, Xa as HANDOFF_REQUEST, Xi as pairedReplyAuthor, Xn as beaconKeys, Xo as deviceInviteJoinerParams, Xs as sanitizeAvatar, Xt as sparkInvoiceDetails, Ya as HANDOFF_PIECE_BYTES, Yi as wireReaction, Yn as COMMUNITY_TOPOLOGY, Yo as createDeviceInvite, Yt as sparkAddressKind, Za as HANDOFF_TIMINGS, Zi as readReply, Zn as beaconRecords, Zo as readDeviceInvite, Zr as IDENTITY_REVOCATION_LABEL, Zs as bytesEqual, Zt as isBitcoinAddress, _ as knockRecords, _a as edgeParams, _i as peekDhtMailbox, _o as handoffVersions, _r as TypingSender, _s as TURN_SETTLE_MS, a as sealGroupTyping, aa as sameButtonText, ai as receivedIdentityStatus, ao as handoffContext, ar as pickHubs, as as ENROLL_CAPABILITY, ba as RELAY_POLL_INTERVALS, bi as parseImageMeta, bo as readHandoffCancel, bs as TURN_LAST_SEQUENCE, c as GROUP_READ_NOTE_COMMUNITY, ca as claimedTime, ci as PeerProofs, co as handoffDigest, cr as readBeaconHead, cs as deviceEchoNonce, d as encodeCommunityLink, da as shownTime, di as TRANSPORTS, do as handoffManifestFrames, dr as ChatFiles, ds as devicePingFrame, ec as toBase64Url, eo as handoffAttemptAllowed, er as lobbyKeys, es as decodeInviteCode, et as isAtprotoDid, fa as GROUP_MEMBER_CAP, fi as automaticTransport, fo as handoffOfferFrame, fr as FILE_LIMITS, fs as newDeviceSetSecret, g as knockIdentity, ga as verifyCommitSignature, gi as DHT_MESSAGE_TTL, go as handoffStreamKey, gs as TURN_RAISE_READ_TIMEOUT_MS, h as entryParams, ha as rosterHas, ho as handoffRetryAfter, i as openGroupTyping, ia as checkStatusCard, ii as newIdentityBinding, io as handoffCancelFrame, ir as newerHead, is as DEVICES_CAPABILITY, j as carryMentions, ji as parseVideoMeta, jn as isFederationId, jo as setAckFrame, jr as parseWakeFrame, js as currentRelays, ki as parseVoiceMeta, kn as fedimintRequestPayload, kr as deviceWakeRequest, ks as DEFAULT_RELAYS, kt as encodeDidDhtDeactivated, l as communityHasFrame, la as heardTime, li as emptyProofLedger, lo as handoffEphemeral, lr as readLobby, ls as deviceKeyZ32, m as encodeGroupEntryLink, ma as MEMBER_KEY, mi as irohRelayUrl, mo as handoffReleaseFrame, mr as transferStalled, ms as webCryptoSigner, n as GroupTypingBoard, na as STATUS_CARD_LIMITS, nc as utf8Decode, ni as identityRevocationValue, no as handoffAttemptSucceeded, nr as mergeBeacon, o as COMMUNITY_LIMITS, oa as statusCardText, oi as revokesIdentity, oo as handoffContextProof, or as rankHubs, os as HANDOFF_CAPABILITY, p as decodeGroupEntryLink, pi as irohDescriptor, po as handoffPakeFrame, pr as transferEnded, ps as seedSigner, qa as HANDOFF_OFFER, qi as readReaction, qn as meshHubs, qo as readEnrollHello, qr as capsDescriptors, qs as publicKeyFromZ32, qt as SPARK_NETWORKS, r as groupTypingEpoch, rc as utf8Encode, ri as identityStatement, ro as handoffBusyFrame, rr as mergeLobby, rs as inviteOwnership, s as CommunitySession, sa as arrivalKey, si as lastSharedWithMe, so as handoffDataFrame, sr as readBeacon, ss as deviceEchoFrame, tc as toZ32, ti as emptyIdentityLedger, to as handoffAttemptFailed, tr as lobbyRecords, ts as encodeInviteCode, tt as normalizeAtprotoHandle, u as decodeCommunityLink, ua as receivedTimestamp, ui as validExternalKey, uo as handoffHelloFrame, ur as shouldBeHub, us as deviceLinkPairing, v as mergeKnocks, va as DirectPathWatch, vi as DHT_FILE_CAPABILITY, vo as newHandoffId, vs as classifyTurnRead, w as parseGroupWakeFrame, wa as parseLocalTarget, wn as engineError, wo as readHandoffPake, wr as pinIsNewer, ws as readTurnPacket, x as GroupWakeLimiter, xa as presenceSeenAt, xo as readHandoffDone, xr as PIN_LIMITS, xs as TURN_MAX, y as readKnocks, yi as dhtFileId, yo as readHandoffAck, yr as typingActivity, ys as turnPutSummary, za as HTTP_SERVICE_PROTO, zi as COMMUNITY_REACTION_FRAME, zo as enrollCancelFrame, zr as HOLD_DATED_BACK_MS, zt as TEST_USDT_FAUCET_AMOUNT } from "./src-C_E99PGx.js";
3
3
  import { a as deleteDatabase, c as profileOpenFailure, d as wrap, i as databaseName, l as store, n as STORES$1, o as fileStore, r as clearProfileStores, s as openDb, t as CARD_INDEX, u as transact } from "./idb-Co2lObpU.js";
4
4
  import { $ as onAdaptersChanged, A as intentRepository, C as ProviderSources, Ct as FileAppender, D as requireTurn, Dt as streamStored, E as refuseAway, Et as storedSize, F as ModeGate, G as fakesLightning, H as BITCOIN_INVOICE_ON_TESTNET, I as WrongNetworkError, J as mintNetwork, K as isTestMint, L as networkLabel, M as sealSeed, N as unsealSeed, O as setAwayWallets, P as ModeChanged, Q as identityProviders, R as CASHU_MINT_SOURCE, S as lightningPaying, St as paymentWireId, T as awayFrom, Tt as removeStored, U as DEFAULT_MINTS, V as WALLET_TYPES, W as TEST_MINT, X as BACKUP_MEDIA_TYPE, Y as paysItsOwnInvoices, Z as MAX_BACKUP_BYTES, _ as normalizePhrase, _t as pairedWireReply, a as createFailure, at as SourceConfigError, b as breezDatabasesFor, bt as replyTo, c as paymentNetwork, ct as networkMode, d as networkReason, dt as resolveAtprotoDid, et as registeredLightningProviders, f as rpcHost, ft as setOwnDidSource, g as isRecoveryPhrase, gt as groupReply, h as cardsKey, ht as chosenResolver, i as assertConfirmedReal, it as PROVIDER_PLATFORMS, j as newDeviceKey, k as setSingleWriterGate, l as paymentNetworksOf, lt as redact, m as LightningCards, mt as verifyIdentity, n as loadFedimintSdk, nt as reserveAdapterIds, o as createTiming, ot as SourceUnreachableError, p as CASHU_CARD, pt as boundedIdentityFetch, q as isWorthlessMint, r as WALLET_NAMES, rt as NothingSpentError, s as crossNetwork, st as isNothingSpentError, t as fedimintDatabase, tt as registeredOnchainProviders, u as walletInstances, ut as assertPublicServer, v as breezDatabase, vt as receivedPairedReply, w as sourceKey, wt as readStored$1, x as dropBreezDatabase, xt as paymentAlias, y as breezDatabaseInUse, yt as replyRef, z as cashuMint } from "../ghostly.mjs";
5
5
  import { hkdf } from "@noble/hashes/hkdf.js";
@@ -10799,7 +10799,7 @@ function nostrPost(note) {
10799
10799
  }
10800
10800
  /**
10801
10801
  * Nostr: kind-1 notes and the kind-3 follow list of exactly the proven key, from the relays in the person's settings
10802
- * (never relays named in events, hints or NIP-65 lists: docs/wisps/3xx-nostr-social.md). Replies are left out; a page
10802
+ * (never relays named in events, hints or NIP-65 lists: docs/wisps/309-nostr-social.md). Replies are left out; a page
10803
10803
  * reads twice as many notes to find ten that are not. Followers cannot be listed without trusting a counting service.
10804
10804
  */
10805
10805
  var nostrActivity = {
@@ -19095,7 +19095,7 @@ function canEdit(message) {
19095
19095
  }
19096
19096
  /** A group message's id: `<sender>:<epoch>:<seq>` in a private group, `<sender>:<epoch>:<commit>:<seq>` in a community. */
19097
19097
  var GROUP_MESSAGE_ID = /^[a-z0-9]{52}:\d+:(?:[0-9a-f]{16}:)?\d+$/;
19098
- /** A text of mine in a group (WISP 9xx § Edits): one the group carried under its id, not a payment, a note or an event line. */
19098
+ /** A text of mine in a group (WISP 902 § Edits): one the group carried under its id, not a payment, a note or an event line. */
19099
19099
  function canEditInGroup(message) {
19100
19100
  return message.sender === "me" && message.linkId.startsWith("group:") && GROUP_MESSAGE_ID.test(message.id) && !message.file && !message.paymentId && !message.event && !message.groupPay;
19101
19101
  }
@@ -19109,9 +19109,9 @@ function takesPeerEdit(message, text) {
19109
19109
  /**
19110
19110
  * The message after edit `seq`, made at `at`: the new text (and the preview and the status card that came with it, or
19111
19111
  * none: each belongs to its version), the version it replaces kept in the history. A text that did not change adds no
19112
- * version. A status card's update adds none either (WISP 4xx · Status Cards): it replaces the card in place, and its
19112
+ * version. A status card's update adds none either (WISP 405 · Status Cards): it replaces the card in place, and its
19113
19113
  * text is only the card's fallback, so a bot's thousands of updates keep one card and no trail of versions. Buttons
19114
- * (WISP 4xx · Message Buttons) are the exception: their text is the question people answer, so a new one keeps the
19114
+ * (WISP 406 · Message Buttons) are the exception: their text is the question people answer, so a new one keeps the
19115
19115
  * version it replaces, and only a change of the buttons alone (the answer marked, closed) adds none.
19116
19116
  */
19117
19117
  function withEdit(message, edit) {
@@ -19745,7 +19745,7 @@ var EditQueue = class {
19745
19745
  /** A card's updates from someone else are applied (stored, shown) at most once per this long, per message. */
19746
19746
  var CARD_APPLY_GAP_MS = 1e3;
19747
19747
  /**
19748
- * Received status card updates, paced per message (WISP 4xx · Status Cards): the first applies at once, the rest within
19748
+ * Received status card updates, paced per message (WISP 405 · Status Cards): the first applies at once, the rest within
19749
19749
  * `CARD_APPLY_GAP_MS` wait, and only the highest edit number of them applies when the time is up. A sender that
19750
19750
  * ignores its own pace costs this side one write and one render a second per card, whatever it sends.
19751
19751
  */
@@ -20771,8 +20771,8 @@ var HUB_CLOCK_SLACK_MS = COMMUNITY_TOPOLOGY.beaconEveryMs * 1.5;
20771
20771
  /** A hub's clock is remembered this long after its entry was last in the beacon. */
20772
20772
  var HUB_CLOCK_KEPT_MS = 6e5;
20773
20773
  /**
20774
- * Each hub's clock as its beacon entry showed it (WISP 9xx · Group Community § Topology, Clocks that differ; the mesh's
20775
- * hubs read their beacon the same way, WISP 9xx · Group Mesh § Hubs). Held against mine as it is, a hub whose clock is
20774
+ * Each hub's clock as its beacon entry showed it (WISP 903 · Group Community § Topology, Clocks that differ; the mesh's
20775
+ * hubs read their beacon the same way, WISP 902 · Group Mesh § Hubs). Held against mine as it is, a hub whose clock is
20776
20776
  * a minute and a half from mine never looks fresh (its entry is "stale", or "not come yet"): a member saw no hub and a
20777
20777
  * hub with such a clock was no hub to anyone. So a hub's clock is learned from its entry: when the entry moved between
20778
20778
  * two readings of mine at most `readGapMs` apart, it was written between them, and what it says the time was then,
@@ -21223,14 +21223,14 @@ var Communities = class {
21223
21223
  messageId: result.id
21224
21224
  };
21225
21225
  }
21226
- /** An application frame to everyone in the group (WISP 9xx · Group Community § Payments). */
21226
+ /** An application frame to everyone in the group (WISP 903 · Group Community § Payments). */
21227
21227
  async sendApp(groupId, frame) {
21228
21228
  const live = this.live.get(groupId);
21229
21229
  if (!live) throw new Error("You are not in this group yet");
21230
21230
  const result = await live.session.sendApp(frame, this.host.myNick?.(), this.now());
21231
21231
  if ("error" in result) throw new Error(result.error);
21232
21232
  }
21233
- /** An edit of my message, through the group like any frame (WISP 9xx · Group Community § Edits). An error when it cannot go now. */
21233
+ /** An edit of my message, through the group like any frame (WISP 903 · Group Community § Edits). An error when it cannot go now. */
21234
21234
  async sendEdit(groupId, edit) {
21235
21235
  const live = this.live.get(groupId);
21236
21236
  if (!live) return "You are not in this group yet";
@@ -21635,7 +21635,7 @@ var Communities = class {
21635
21635
  }
21636
21636
  /**
21637
21637
  * The members this hub may keep edges with: `hubCapacity`, or on an app with a budget of connections (a Mac, WISP
21638
- * 9xx · Group Mesh § Hubs, Budget) what its other groups and 1:1 chats leave (`peerRoom`), less its edges to the
21638
+ * 902 · Group Mesh § Hubs, Budget) what its other groups and 1:1 chats leave (`peerRoom`), less its edges to the
21639
21639
  * other hubs and, for taking someone new (`entries`), its entry sessions.
21640
21640
  */
21641
21641
  capacity(groupId, live, now, entries = true) {
@@ -21672,7 +21672,7 @@ var Communities = class {
21672
21672
  return true;
21673
21673
  }
21674
21674
  /**
21675
- * The newest message frame I hold, for the beacon's head (WISP 9xx § Head): what a member's other profile on the
21675
+ * The newest message frame I hold, for the beacon's head (WISP 903 § Head): what a member's other profile on the
21676
21676
  * same device compares with what it took, to show that something new was said while it was not running.
21677
21677
  */
21678
21678
  newestFrame(live) {
@@ -22428,7 +22428,7 @@ var GONE_LINGER_MS = 15e3;
22428
22428
  */
22429
22429
  var HUB_CLOCK_READ_GAP_MS = 75e3;
22430
22430
  /**
22431
- * The hubs of the private groups this device is in (WISP 9xx · Group Mesh § Hubs): whether a group runs on hubs, who
22431
+ * The hubs of the private groups this device is in (WISP 902 · Group Mesh § Hubs): whether a group runs on hubs, who
22432
22432
  * they are (the community's sealed beacon and lobbies, under the epoch's rendezvous secret), whether I am one, which
22433
22433
  * edges that asks for, and passing frames on as a hub. `Groups` owns the sessions and the edges; this decides.
22434
22434
  */
@@ -22501,7 +22501,7 @@ var MeshHubs = class {
22501
22501
  this.live.delete(groupId);
22502
22502
  }
22503
22503
  /**
22504
- * The edges this app may keep in a group, within its budget of connections (WISP 9xx · Group Mesh § Hubs, Budget):
22504
+ * The edges this app may keep in a group, within its budget of connections (WISP 902 · Group Mesh § Hubs, Budget):
22505
22505
  * what the other groups' links do not hold, less what the groups I am a hub of still have to open. Undefined for an
22506
22506
  * app without a budget. What this group holds itself does not count: a hub that stepped down would fit again at once.
22507
22507
  */
@@ -22912,7 +22912,7 @@ var MeshHubs = class {
22912
22912
  }
22913
22913
  /**
22914
22914
  * As a hub, what the session took for the first time goes on to every other edge that is up: not back where it came
22915
- * from, nor to its author. Everyone else takes it as a frame handed on (WISP 9xx § Catch-up).
22915
+ * from, nor to its author. Everyone else takes it as a frame handed on (WISP 902 § Catch-up).
22916
22916
  */
22917
22917
  passOn(groupId, session, from, frames) {
22918
22918
  if (!this.live.get(groupId)?.hub || !frames.length) return 0;
@@ -22955,7 +22955,7 @@ function authorOf(frame) {
22955
22955
  //#endregion
22956
22956
  //#region ../browser/src/engine/groupTyping.ts
22957
22957
  /**
22958
- * Typing in private groups (WISP 9xx · Group Mesh § Typing): this side's word goes sealed on every open edge to a
22958
+ * Typing in private groups (WISP 902 · Group Mesh § Typing): this side's word goes sealed on every open edge to a
22959
22959
  * member, and each member's word is shown until its `stop`, its message, or 6 s without a new `start`. Never stored.
22960
22960
  * Community groups do not carry it yet (their frames are all stored messages).
22961
22961
  */
@@ -23022,7 +23022,7 @@ var GroupTypings = class {
23022
23022
  //#endregion
23023
23023
  //#region ../browser/src/engine/meshSignals.ts
23024
23024
  /**
23025
- * Edge signaling through members (WISP 9xx · Group Mesh § Signaling through members; `CarriedTransport` in core): which
23025
+ * Edge signaling through members (WISP 902 · Group Mesh § Signaling through members; `CarriedTransport` in core): which
23026
23026
  * links an edge's packet is handed to, what a member does with one that is for someone else, and what happens to one
23027
23027
  * that is for me. A packet is the edge's own Pkarr packet, signed under a key only its two ends derive: whoever
23028
23028
  * carries it sees a signed blob, as a relay does, and the edge checks it as it checks a relay's answer.
@@ -23395,7 +23395,7 @@ var HERE_PER_MINUTE = 4;
23395
23395
  * re-offer) slows in proportion, and an edge to someone away (read to notice them come back) by the square root:
23396
23396
  * at 32 members, every four minutes and every minute, so 31 edges cost about 8 reads a minute when everyone is here
23397
23397
  * and 32 when nobody is. Whoever reaches a member coming back first tells the others (`group-here`), who then look
23398
- * fast for it (WISP 9xx § Cost per member).
23398
+ * fast for it (WISP 902 § Cost per member).
23399
23399
  */
23400
23400
  function meshEdgeScale(members, connected = true) {
23401
23401
  const ratio = Math.max(1, (members - 1) / 8);
@@ -23489,15 +23489,15 @@ var Groups = class {
23489
23489
  communities;
23490
23490
  /** My messages and edits an edge of a private group took. */
23491
23491
  frames = new FramesTaken();
23492
- /** Hubs of the private groups past 16 members (WISP 9xx · Group Mesh § Hubs). */
23492
+ /** Hubs of the private groups past 16 members (WISP 902 · Group Mesh § Hubs). */
23493
23493
  hubs;
23494
23494
  /** Groups whose edges are being reconciled because their hubs changed: one at a time. */
23495
23495
  hubReconcile = /* @__PURE__ */ new Set();
23496
23496
  /** Groups a commit took me out of, and when: their edges close `REMOVED_LINGER_MS` later. */
23497
23497
  removedAt = /* @__PURE__ */ new Map();
23498
- /** Who is typing in each private group, and this side's word there (WISP 9xx · Group Mesh § Typing). */
23498
+ /** Who is typing in each private group, and this side's word there (WISP 902 · Group Mesh § Typing). */
23499
23499
  typings;
23500
- /** Edge signaling through members (WISP 9xx · Group Mesh § Signaling through members). */
23500
+ /** Edge signaling through members (WISP 902 · Group Mesh § Signaling through members). */
23501
23501
  signals;
23502
23502
  constructor(host, store = db, timings = ENTRY_TIMINGS, communityTimings = COMMUNITY_TIMINGS, random, hubTimings = MESH_HUB_TIMINGS) {
23503
23503
  this.host = host;
@@ -23677,7 +23677,7 @@ var Groups = class {
23677
23677
  return this.isCommunity(groupId) ? this.communities.taken(groupId, key) : this.frames.count(groupId, key);
23678
23678
  }
23679
23679
  /**
23680
- * Says an edit of my message to the group (WISP 9xx § Edits): over the edges of a private group (to member `to`
23680
+ * Says an edit of my message to the group (WISP 902 § Edits): over the edges of a private group (to member `to`
23681
23681
  * alone, when given), through a community like any frame. An error when it cannot go now.
23682
23682
  */
23683
23683
  async sendEdit(groupId, edit, to) {
@@ -23762,7 +23762,7 @@ var Groups = class {
23762
23762
  }
23763
23763
  /**
23764
23764
  * Sends a text; `messageId` is the id it is kept under here (what history, replies and reactions name). `forwarded`:
23765
- * the hop count of a forwarded text (WISP 9xx § Forwards). `card`: a checked status card, the text its fallback.
23765
+ * the hop count of a forwarded text (WISP 902 § Forwards). `card`: a checked status card, the text its fallback.
23766
23766
  */
23767
23767
  async send(groupId, text, mentions = [], reply, forwarded, card) {
23768
23768
  if (this.isCommunity(groupId)) return card ? this.communities.send(groupId, text, mentions, reply, forwarded, card) : this.communities.send(groupId, text, mentions, reply, forwarded);
@@ -23776,7 +23776,7 @@ var Groups = class {
23776
23776
  };
23777
23777
  }
23778
23778
  /**
23779
- * This side is typing in a private group (with what it is doing), or stopped (WISP 9xx · Group Mesh § Typing).
23779
+ * This side is typing in a private group (with what it is doing), or stopped (WISP 902 · Group Mesh § Typing).
23780
23780
  * Nothing for a community: it does not carry typing yet.
23781
23781
  */
23782
23782
  setTyping(groupId, typing, activity) {
@@ -23995,7 +23995,7 @@ var Groups = class {
23995
23995
  }
23996
23996
  /**
23997
23997
  * The admin pins a member of a private group as a hub, excludes one from being a hub, or leaves it to the member's
23998
- * app (`null`): said in the group's metadata, which every member keeps (WISP 9xx · Group Mesh § Hubs).
23998
+ * app (`null`): said in the group's metadata, which every member keeps (WISP 902 · Group Mesh § Hubs).
23999
23999
  */
24000
24000
  async setHub(groupId, key, role) {
24001
24001
  if (this.isCommunity(groupId)) throw new Error("A community group chooses its hubs by itself");
@@ -24005,12 +24005,12 @@ var Groups = class {
24005
24005
  rotate(groupId) {
24006
24006
  return this.isCommunity(groupId) ? this.communities.rotate(groupId) : this.session(groupId).rotate();
24007
24007
  }
24008
- /** The admin sets or removes the group's picture; every member gets it over the edges (WISP 9xx § Metadata). */
24008
+ /** The admin sets or removes the group's picture; every member gets it over the edges (WISP 902 § Metadata). */
24009
24009
  async setPicture(groupId, picture) {
24010
24010
  if (this.isCommunity(groupId)) return this.communities.setPicture(groupId, picture);
24011
24011
  await this.session(groupId).setPicture(picture);
24012
24012
  }
24013
- /** The admin renames the group; every member gets the name over the edges, beside the picture (WISP 9xx § Metadata). */
24013
+ /** The admin renames the group; every member gets the name over the edges, beside the picture (WISP 902 § Metadata). */
24014
24014
  async rename(groupId, name) {
24015
24015
  if (this.isCommunity(groupId)) return this.communities.rename(groupId, name);
24016
24016
  await this.session(groupId).rename(name);
@@ -24173,7 +24173,7 @@ var Groups = class {
24173
24173
  }
24174
24174
  }
24175
24175
  /**
24176
- * Private groups past 16 members: their hubs (WISP 9xx · Group Mesh § Hubs), then their edges, when what the hubs
24176
+ * Private groups past 16 members: their hubs (WISP 902 · Group Mesh § Hubs), then their edges, when what the hubs
24177
24177
  * ask for is not what exists (a hub came or went, I became one, a member asked me).
24178
24178
  */
24179
24179
  async hubsTick(now) {
@@ -24224,7 +24224,7 @@ var Groups = class {
24224
24224
  return Object.entries(this.stored.get(groupId)?.contacts ?? {}).find(([, id]) => id === linkId)?.[0];
24225
24225
  }
24226
24226
  /**
24227
- * My packet for the edge to `to`, handed to links that reach that member or may pass it on (WISP 9xx · Group Mesh
24227
+ * My packet for the edge to `to`, handed to links that reach that member or may pass it on (WISP 902 · Group Mesh
24228
24228
  * § Signaling through members): how many took it, and whether one of them surely reaches that member. None in a
24229
24229
  * community, whose members keep no edges with each other.
24230
24230
  */
@@ -24581,7 +24581,7 @@ var Groups = class {
24581
24581
  }
24582
24582
  /**
24583
24583
  * A reaction: from the member whose edge it came on (`group-react`), or signed by a member and passed on by a hub
24584
- * (`group-reacted`). As a hub, a signed one goes on to the other edges (WISP 9xx · Group Mesh § Hubs).
24584
+ * (`group-reacted`). As a hub, a signed one goes on to the other edges (WISP 902 · Group Mesh § Hubs).
24585
24585
  */
24586
24586
  async reaction(groupId, session, from, raw) {
24587
24587
  if (session.status !== "active" || raw.g !== groupId) return;
@@ -24992,7 +24992,7 @@ var Groups = class {
24992
24992
  //#endregion
24993
24993
  //#region ../browser/src/engine/groupEdges.ts
24994
24994
  /**
24995
- * An edge of a group as the group page shows it (WISP 9xx § Mesh): open means group frames flow, which
24995
+ * An edge of a group as the group page shows it (WISP 902 § Mesh): open means group frames flow, which
24996
24996
  * is what "reachable" means everywhere else in groups; what carries it; when the member was last heard.
24997
24997
  */
24998
24998
  function edgeView(live, now = Date.now(), noSlot = false) {
@@ -25016,7 +25016,7 @@ function edgeView(live, now = Date.now(), noSlot = false) {
25016
25016
  //#endregion
25017
25017
  //#region ../browser/src/engine/groupPayments.ts
25018
25018
  /**
25019
- * Payments in a group (WISP 9xx § Payments). The money, the invoice and the receipts travel only on the edge
25019
+ * Payments in a group (WISP 902 § Payments). The money, the invoice and the receipts travel only on the edge
25020
25020
  * between the two members, as they would on a 1:1 chat (the PaymentDesk does that part, with the edge's link as
25021
25021
  * the chat). What the rest of the group learns is a `group-pay` note, sent by each side about its own part over
25022
25022
  * every edge: who pays whom, how much, over what, and how it stands. A note is believed only from the member it
@@ -25335,7 +25335,7 @@ var GroupEdits = class {
25335
25335
  host;
25336
25336
  now;
25337
25337
  buffer;
25338
- /** Members' status card updates, applied at most once a second per message (WISP 4xx · Status Cards). */
25338
+ /** Members' status card updates, applied at most once a second per message (WISP 405 · Status Cards). */
25339
25339
  cards;
25340
25340
  sendPace = /* @__PURE__ */ new Map();
25341
25341
  receivePace = /* @__PURE__ */ new Map();
@@ -25351,7 +25351,7 @@ var GroupEdits = class {
25351
25351
  /**
25352
25352
  * Edits a text of mine in a group: the new text here at once, and to the group as soon as the pace allows. Mentions
25353
25353
  * the message had stay where their words still are; `added` are those picked while editing. `card`: the status card
25354
- * of the new version, already checked (WISP 4xx · Status Cards); a card message then takes `STATUS_CARD_LIMITS.edits`.
25354
+ * of the new version, already checked (WISP 405 · Status Cards); a card message then takes `STATUS_CARD_LIMITS.edits`.
25355
25355
  */
25356
25356
  async edit(groupId, messageId, raw, added = [], card) {
25357
25357
  const refuse = (error) => ({
@@ -25538,7 +25538,7 @@ var GroupEdits = class {
25538
25538
  //#endregion
25539
25539
  //#region ../browser/src/shared/payLinks.ts
25540
25540
  /**
25541
- * The desk's links to members of a community group (WISP 9xx · Group Community § Payments): payments with a member
25541
+ * The desk's links to members of a community group (WISP 903 · Group Community § Payments): payments with a member
25542
25542
  * go through the group, sealed to them, over `cpay:<group>:<member>`; a request to everyone over `cpay:<group>`.
25543
25543
  */
25544
25544
  var pairLinkId = (groupId, member) => `cpay:${groupId}:${member}`;
@@ -25554,7 +25554,7 @@ function parsePayLink(linkId) {
25554
25554
  //#endregion
25555
25555
  //#region ../browser/src/engine/communityPay.ts
25556
25556
  /**
25557
- * Payments in community groups (WISP 9xx · Group Community § Payments). Members have no edge to each other: what
25557
+ * Payments in community groups (WISP 903 · Group Community § Payments). Members have no edge to each other: what
25558
25558
  * two members say about a payment (`pay-req`, `pay-ask`, `pay`, `pay-res`) is sealed to the other one inside a frame
25559
25559
  * the whole group carries (`CommunitySession.sendPair`), so hubs relay it and keep it for a member who was away
25560
25560
  * without being able to read it. A request to the whole group, and its "paid", go to everyone as an application
@@ -26003,7 +26003,7 @@ var HOLD_FETCH_BYTES_PER_S = 65536;
26003
26003
  var holdFetchTimeoutMs = (max) => HOLD_FETCH_MS + Math.ceil(max / HOLD_FETCH_BYTES_PER_S) * 1e3;
26004
26004
  var hex$2 = (bytes) => Array.from(bytes, (b) => b.toString(16).padStart(2, "0")).join("");
26005
26005
  /**
26006
- * Store-and-forward for away contacts (WISP 4xx, `hold/1`), on both ends of every chat that turned it
26006
+ * Store-and-forward for away contacts (WISP 404, `hold/1`), on both ends of every chat that turned it
26007
26007
  * on: what this device sends while the contact is away is sealed and put in this device's own storage,
26008
26008
  * named in a manifest, and pointed at from a small record on the DHT; what the contact held for this
26009
26009
  * device is picked up from its pointer, checked and stored in order, and acknowledged on this device's
@@ -27513,7 +27513,7 @@ var ProfilePeek = class {
27513
27513
  };
27514
27514
  }
27515
27515
  /**
27516
- * A community group: its beacon, which hubs republish every 30 s with the newest frame they hold (WISP 9xx § Head).
27516
+ * A community group: its beacon, which hubs republish every 30 s with the newest frame they hold (WISP 903 § Head).
27517
27517
  * New when this profile has not taken that frame. Nothing is opened but the head.
27518
27518
  */
27519
27519
  async community(group, transport) {
@@ -27750,7 +27750,7 @@ var S3Store = class {
27750
27750
  }
27751
27751
  /**
27752
27752
  * A URL that reads one object with no credential until `seconds` from now: what an away contact is
27753
- * handed to pick up what was held for it (WISP 4xx). The secret key never leaves this device; the
27753
+ * handed to pick up what was held for it (WISP 404). The secret key never leaves this device; the
27754
27754
  * signature covers the exact object, method and lifetime, so the URL reads that object and nothing else.
27755
27755
  */
27756
27756
  async presign(name, seconds) {
@@ -29752,7 +29752,7 @@ var PaymentDesk = class {
29752
29752
  return { paymentId: id };
29753
29753
  }
29754
29754
  /**
29755
- * A request to a whole group (WISP 9xx § Payments): one request, on one rail, sent to every member over their
29755
+ * A request to a whole group (WISP 902 § Payments): one request, on one rail, sent to every member over their
29756
29756
  * edge; the first payment that settles it wins. One rail only, because each enforces "once" by itself: a
29757
29757
  * Lightning invoice can be paid once, and ecash is checked here before it is redeemed (a later token is refused
29758
29758
  * unredeemed, so its payer takes it back). Two rails at once would let an invoice and a token both pay it.
@@ -30052,7 +30052,7 @@ var PaymentDesk = class {
30052
30052
  endpoints: [...payment.invoice ? [[ENDPOINT.bolt11, payment.invoice]] : [], ...payment.mints?.length ? [[ENDPOINT.cashu, cashuRequestPayload(payment.mints)]] : []]
30053
30053
  };
30054
30054
  }
30055
- /** `held`: picked up from the contact's storage while it was away (WISP 4xx): only what this device allows counts, and only Cashu or Lightning. */
30055
+ /** `held`: picked up from the contact's storage while it was away (WISP 404): only what this device allows counts, and only Cashu or Lightning. */
30056
30056
  async onPaymentRequest(linkId, request, held = false) {
30057
30057
  if (this.find(linkId, request.id)?.linkId === linkId) return;
30058
30058
  if (held && (findEndpoint(request.endpoints, ENDPOINT.usdt) || findEndpoint(request.endpoints, ENDPOINT.arkade) || findEndpoint(request.endpoints, ENDPOINT.bark) || findEndpoint(request.endpoints, ENDPOINT.bitcoin) || findEndpoint(request.endpoints, ENDPOINT.fedimint) || findEndpoint(request.endpoints, ENDPOINT.spark))) return;
@@ -32557,7 +32557,7 @@ var GhostlyNode = class GhostlyNode {
32557
32557
  editQueues = /* @__PURE__ */ new Map();
32558
32558
  /** The contacts' edits of messages not here yet. */
32559
32559
  editBuffer = new EditBuffer();
32560
- /** Received status card updates, applied at most once a second per message (WISP 4xx · Status Cards). */
32560
+ /** Received status card updates, applied at most once a second per message (WISP 405 · Status Cards). */
32561
32561
  cardEdits = new CardEditPacer();
32562
32562
  /** When each message's buttons were last pressed here (`pressButton`). */
32563
32563
  pressedAt = /* @__PURE__ */ new Map();
@@ -32565,7 +32565,7 @@ var GhostlyNode = class GhostlyNode {
32565
32565
  wakeLimiter = new WakeLimiter();
32566
32566
  /** Call wake-ups have their own, shorter limit: a call is rarer than a message and cannot wait five minutes. */
32567
32567
  callWakeLimiter = new WakeLimiter(WAKE_CALL_INTERVAL_MS);
32568
- /** Mentions in private groups: one per member per 5 minutes, four per group per minute (WISP 9xx · Group Mesh § Wake-up push). */
32568
+ /** Mentions in private groups: one per member per 5 minutes, four per group per minute (WISP 902 · Group Mesh § Wake-up push). */
32569
32569
  groupWakeLimiter = new GroupWakeLimiter();
32570
32570
  /** `group-wake` frames read per edge, a handful a minute. */
32571
32571
  groupWakeReceived = /* @__PURE__ */ new Map();
@@ -32603,7 +32603,7 @@ var GhostlyNode = class GhostlyNode {
32603
32603
  paymentTimer = null;
32604
32604
  /** Every minute, the reviews no Approve can send any more are cancelled (dropStaleReviews). */
32605
32605
  staleReviewTimer;
32606
- /** Group links: admins read knocks, joiners knock (WISP 9xx § Entry link). */
32606
+ /** Group links: admins read knocks, joiners knock (WISP 902 § Entry link). */
32607
32607
  groupEntryTimer = null;
32608
32608
  walletView = {
32609
32609
  mints: [],
@@ -32872,7 +32872,7 @@ var GhostlyNode = class GhostlyNode {
32872
32872
  await this.sparkWallets[network].adapter?.sync();
32873
32873
  }
32874
32874
  })));
32875
- /** Store-and-forward for away contacts (WISP 4xx): items sealed into this device's own storage, picked up from the contact's. */
32875
+ /** Store-and-forward for away contacts (WISP 404): items sealed into this device's own storage, picked up from the contact's. */
32876
32876
  holdStore = null;
32877
32877
  hold = new HoldEngine({
32878
32878
  transport: void 0,
@@ -33094,7 +33094,7 @@ var GhostlyNode = class GhostlyNode {
33094
33094
  publish: (seed, records) => this.transport.publish(identityFromSeed(seed), records),
33095
33095
  resolve: async (key) => (await this.transport.resolve(key))?.records ?? null
33096
33096
  });
33097
- /** The profile's did:dht: a key of its own, public, never tied to a chat (WISP 3xx-did-dht). */
33097
+ /** The profile's did:dht: a key of its own, public, never tied to a chat (WISP 310-did-dht). */
33098
33098
  did = new ProfileDid({
33099
33099
  online: () => this.networkOn,
33100
33100
  emit: () => this.emitState(),
@@ -33322,7 +33322,7 @@ var GhostlyNode = class GhostlyNode {
33322
33322
  communityPair: (groupId, sender, payload) => this.communityPay.receivePair(groupId, sender, payload)
33323
33323
  });
33324
33324
  /**
33325
- * Payments in community groups (WISP 9xx · Group Community § Payments): the desk pays and requests over a link
33325
+ * Payments in community groups (WISP 903 · Group Community § Payments): the desk pays and requests over a link
33326
33326
  * per member that sends through the group, sealed to that member; the group request goes to everyone at once.
33327
33327
  */
33328
33328
  communityPay = new CommunityPay({
@@ -33338,7 +33338,7 @@ var GhostlyNode = class GhostlyNode {
33338
33338
  emit: () => this.emitState()
33339
33339
  });
33340
33340
  /**
33341
- * Edits in groups (WISP 9xx § Edits): mine said to the group at the pace allowed, the members' on their messages.
33341
+ * Edits in groups (WISP 902 § Edits): mine said to the group at the pace allowed, the members' on their messages.
33342
33342
  * Never a new message: no sound, no unread.
33343
33343
  */
33344
33344
  groupEdits = new GroupEdits({
@@ -33374,7 +33374,7 @@ var GhostlyNode = class GhostlyNode {
33374
33374
  return this.outsideEdge(linkId) ? null : this.links.get(linkId)?.link ?? this.communityPay.link(linkId);
33375
33375
  }
33376
33376
  /**
33377
- * Payments in groups (WISP 9xx § Payments): the money goes over the edge to one member through the desk, like a
33377
+ * Payments in groups (WISP 902 § Payments): the money goes over the edge to one member through the desk, like a
33378
33378
  * chat's; what the group sees of it goes to every member as a `group-pay` note.
33379
33379
  */
33380
33380
  groupPayments = new GroupPayments({
@@ -35053,7 +35053,7 @@ var GhostlyNode = class GhostlyNode {
35053
35053
  }));
35054
35054
  }
35055
35055
  /**
35056
- * `card`: a bot's status card (WISP 4xx · Status Cards), checked here by the sender's rule; the text is its fallback,
35056
+ * `card`: a bot's status card (WISP 405 · Status Cards), checked here by the sender's rule; the text is its fallback,
35057
35057
  * written from the card when none is given. Only the headless runtime and SDKs send one: the app never offers it.
35058
35058
  */
35059
35059
  async sendMessage(params) {
@@ -35068,7 +35068,7 @@ var GhostlyNode = class GhostlyNode {
35068
35068
  error: "Nothing to send",
35069
35069
  refused: true
35070
35070
  };
35071
- const live = this.links.get(linkId);
35071
+ const live = await this.linkWhenAdded(linkId);
35072
35072
  const trimmed = text.trim();
35073
35073
  const bytes = new TextEncoder().encode(trimmed).length;
35074
35074
  if (live && !live.stored.profile && !(live.link?.isDataLinkOpen && trimmed.length <= LIMITS.maxChatMessageBytes / 4) && bytes > 500) return {
@@ -35293,7 +35293,7 @@ var GhostlyNode = class GhostlyNode {
35293
35293
  static dhtByChoice(live) {
35294
35294
  return live?.stored.deliveryMode === "dht" || live?.link?.dhtDelivery?.peerMode === "dht";
35295
35295
  }
35296
- /** A status card a caller asks to send, by the sender's rule (WISP 4xx · Status Cards), or why it cannot go. */
35296
+ /** A status card a caller asks to send, by the sender's rule (WISP 405 · Status Cards), or why it cannot go. */
35297
35297
  static cardToSend(raw) {
35298
35298
  const checked = checkStatusCard(raw);
35299
35299
  return "error" in checked ? `Status card: ${checked.error}` : checked.card;
@@ -35418,7 +35418,7 @@ var GhostlyNode = class GhostlyNode {
35418
35418
  return !!live?.caps?.peer?.capabilities.includes(EDIT_CAPABILITY);
35419
35419
  }
35420
35420
  /**
35421
- * A question of mine with buttons went on the DHT floor or into a hold, which carry its text alone (WISP 4xx · Message
35421
+ * A question of mine with buttons went on the DHT floor or into a hold, which carry its text alone (WISP 406 · Message
35422
35422
  * Buttons): its buttons are due to go again live. Once: a row that had them restored already stays so.
35423
35423
  */
35424
35424
  async buttonsWentBare(linkId, message) {
@@ -35426,7 +35426,7 @@ var GhostlyNode = class GhostlyNode {
35426
35426
  await db.patchMessage(linkId, message.id, (current) => current.sender === "me" && current.card?.kind === "buttons" && !current.buttonsRestore ? { buttonsRestore: "due" } : null);
35427
35427
  }
35428
35428
  /**
35429
- * Buttons the contact may not have (WISP 4xx · Message Buttons): a question whose text went on the DHT floor or into a
35429
+ * Buttons the contact may not have (WISP 406 · Message Buttons): a question whose text went on the DHT floor or into a
35430
35430
  * hold reached the contact as text alone, and a copy under the same id that comes live later is taken as the one
35431
35431
  * already there. Once the chat is live with an app that shows buttons (`buttons/1`) and takes edits, each such
35432
35432
  * question goes again as an edit of its buttons alone: the same text, so no version and no edit mark. Once per
@@ -35526,7 +35526,7 @@ var GhostlyNode = class GhostlyNode {
35526
35526
  }
35527
35527
  await this.outboxFor(linkId).transmit(messageId, { manual: true });
35528
35528
  }
35529
- /** The contact is away, and both sides chose to hold what is sent meanwhile (WISP 4xx). */
35529
+ /** The contact is away, and both sides chose to hold what is sent meanwhile (WISP 404). */
35530
35530
  holdingFor(live) {
35531
35531
  return !!live.stored.profile && !!live.link && !live.link.isDataLinkOpen && this.hold.canHold(live.stored.id);
35532
35532
  }
@@ -35875,7 +35875,7 @@ var GhostlyNode = class GhostlyNode {
35875
35875
  ...forwarded && { forwarded }
35876
35876
  };
35877
35877
  const wire = reply && pairedWireReply(reply);
35878
- const live = this.links.get(linkId);
35878
+ const live = this.linksAdding.has(linkId) ? await this.linkWhenAdded(linkId) : this.links.get(linkId);
35879
35879
  const fail = (error) => {
35880
35880
  const transfer = {
35881
35881
  state: "failed",
@@ -36634,7 +36634,7 @@ var GhostlyNode = class GhostlyNode {
36634
36634
  return this.groups.messages(groupId);
36635
36635
  }
36636
36636
  /**
36637
- * Presses a button of a message someone else sent to a chat or a group (`group:<id>`), WISP 4xx · Message Buttons:
36637
+ * Presses a button of a message someone else sent to a chat or a group (`group:<id>`), WISP 406 · Message Buttons:
36638
36638
  * a reply to it whose text is the button's label and whose `r` names the button, so the author learns who pressed
36639
36639
  * what, and an app without buttons reads an ordinary reply. Refused: my own message, a button it does not have,
36640
36640
  * buttons the author closed, a question I already answered with a `once` button, a second press within a second.
@@ -36725,7 +36725,7 @@ var GhostlyNode = class GhostlyNode {
36725
36725
  result.error ??= error;
36726
36726
  };
36727
36727
  const groupId = to.startsWith("group:") ? to.slice(6) : void 0;
36728
- const live = groupId ? void 0 : this.links.get(to);
36728
+ const live = groupId ? void 0 : await this.linkWhenAdded(to);
36729
36729
  if (groupId ? !this.membership(groupId) : !live || live.stored.group !== void 0) {
36730
36730
  note(groupId ? "You are not in this group" : "Chat not found");
36731
36731
  continue;
@@ -37099,7 +37099,7 @@ var GhostlyNode = class GhostlyNode {
37099
37099
  if (typing === true && this.settings.sendTyping !== false) live.link?.setTyping(true, typingActivity(kind, status));
37100
37100
  else live.link?.setTyping(false);
37101
37101
  }
37102
- /** WISP 9xx · Group Mesh § Typing: the same word in a private group, on its edges; a community says nothing yet. */
37102
+ /** WISP 902 · Group Mesh § Typing: the same word in a private group, on its edges; a community says nothing yet. */
37103
37103
  setGroupTyping({ groupId, typing, kind, status }) {
37104
37104
  if (typeof groupId !== "string") return;
37105
37105
  if (typing === true && this.settings.sendTyping !== false) this.groups.setTyping(groupId, true, typingActivity(kind, status));
@@ -37851,6 +37851,7 @@ var GhostlyNode = class GhostlyNode {
37851
37851
  const paying = params.target.method === "cashu" ? mintNetwork(params.target.provider) : walletNetworkOf(params.target.network);
37852
37852
  if (params.network && params.network !== paying) throw new Error(crossNetwork(params.network, paying));
37853
37853
  if (params.linkId) {
37854
+ await this.linkWhenAdded(params.linkId);
37854
37855
  const link = this.paymentLink(params.linkId);
37855
37856
  if (!link) throw new Error("The peer is offline");
37856
37857
  const payee = this.links.get(params.linkId)?.stored.peerPubKeyZ32 ?? parsePayLink(params.linkId)?.member ?? "";
@@ -37951,8 +37952,8 @@ var GhostlyNode = class GhostlyNode {
37951
37952
  }).catch(() => []);
37952
37953
  }
37953
37954
  /** `network`: the Cashu card of that network sends (its mints). `confirmedReal`: required on Mainnet. */
37954
- sendPayment(params) {
37955
- const live = this.links.get(params.linkId);
37955
+ async sendPayment(params) {
37956
+ const live = await this.linkWhenAdded(params.linkId);
37956
37957
  if (live && this.holdingFor(live)) throw new Error("Ecash is not held for an away contact. Send a request instead, or wait until they are back.");
37957
37958
  return this.desk.send({
37958
37959
  ...params,
@@ -37961,7 +37962,8 @@ var GhostlyNode = class GhostlyNode {
37961
37962
  }
37962
37963
  /** `network`: the card's network; the request is paid only by a wallet of that network. */
37963
37964
  /** `card`: the Lightning card the request's invoice comes from; absent, the network's default for receiving. */
37964
- requestPayment(params) {
37965
+ async requestPayment(params) {
37966
+ await this.linkWhenAdded(params.linkId);
37965
37967
  return this.desk.request({
37966
37968
  linkId: params.linkId,
37967
37969
  amount: params.amount,
@@ -37973,7 +37975,7 @@ var GhostlyNode = class GhostlyNode {
37973
37975
  ...params.rail === "cashu" || params.rail === "lightning" ? { rail: params.rail } : {}
37974
37976
  });
37975
37977
  }
37976
- /** A request any member of a group may pay, once (WISP 9xx § Payments). */
37978
+ /** A request any member of a group may pay, once (WISP 902 § Payments). */
37977
37979
  requestGroupPayment(params) {
37978
37980
  const group = this.groups.views().find((g) => g.id === params.groupId);
37979
37981
  if (group?.status !== "active") throw new Error("You are not in this group");
@@ -37984,8 +37986,9 @@ var GhostlyNode = class GhostlyNode {
37984
37986
  });
37985
37987
  }
37986
37988
  /** Paying on a card without a request (Ark, Bark, Spark, USDT, on-chain): the contact's app answers with one, on this card's network. */
37987
- askToPay(params) {
37989
+ async askToPay(params) {
37988
37990
  if (params.method !== "arkade" && params.method !== "usdt" && params.method !== "bark" && params.method !== "bitcoin" && params.method !== "fedimint" && params.method !== "spark") throw new Error("Only Ark, Bark, Spark, USDT, on-chain Bitcoin and Fedimint are paid this way");
37991
+ await this.linkWhenAdded(params.linkId);
37989
37992
  return this.desk.ask({
37990
37993
  ...params,
37991
37994
  network: this.net(params.network)
@@ -38622,9 +38625,9 @@ var GhostlyNode = class GhostlyNode {
38622
38625
  }
38623
38626
  /**
38624
38627
  * Whether this profile holds anything a person would lose if it became a standby here: a chat, a group, an identity,
38625
- * money or a payment, or a wallet with keys of its own. The wallets a new profile gets by itself (Mainnet Cashu and
38626
- * USDT, `walletSetup.ts`) count only once they hold, wait for or have moved money: otherwise no new install could
38627
- * join. `loading`: what they hold is not known yet (the engine is starting, or the USDT balance was not read).
38628
+ * money or a payment, or a wallet with keys of its own. The wallets a new profile gets by itself (Mainnet Cashu, with
38629
+ * the Cashu mints' Lightning card, and USDT, `walletSetup.ts`) count only once they hold, wait for or have moved
38630
+ * money: otherwise no new install could join. `loading`: what they hold is not known yet (the engine is starting, or the USDT balance was not read).
38628
38631
  */
38629
38632
  inUse() {
38630
38633
  if (this.links.size > 0 || this.groups.views().length > 0 || this.identities.views().length > 0) return "in-use";
@@ -38633,7 +38636,7 @@ var GhostlyNode = class GhostlyNode {
38633
38636
  const networks = [this.walletView, ...Object.values(this.walletView.networks ?? {})];
38634
38637
  const holds = (network) => !!network && (money(network.balance) || (network.history?.length ?? 0) > 0 || (network.awaiting?.length ?? 0) > 0 || money(network.setAside) || money(network.openSwaps) || money(network.swapsAmount) || money(network.unconfirmed) || !!network.usdt?.configured && (money(network.usdt.balance) || money(network.usdt.gasBalance)));
38635
38638
  if (networks.some(holds)) return "in-use";
38636
- const firstRun = (wallet) => wallet.network === "mainnet" && (wallet.type === "cashu" || wallet.type === "usdt");
38639
+ const firstRun = (wallet) => wallet.network === "mainnet" && (wallet.type === "cashu" || wallet.type === "usdt" || wallet.type === "lightning" && wallet.card === "cashu");
38637
38640
  if ((this.walletView.wallets ?? []).some((wallet) => !firstRun(wallet))) return "in-use";
38638
38641
  return networks.some((network) => !!network?.usdt?.configured && (network.usdt.locked || !network.usdt.read)) ? "loading" : null;
38639
38642
  }
@@ -38890,6 +38893,15 @@ var GhostlyNode = class GhostlyNode {
38890
38893
  async existingLink(id) {
38891
38894
  return await this.linksAdding.get(id) ?? id;
38892
38895
  }
38896
+ /**
38897
+ * The chat by its id, once it has started if it is still being added: the app may send to it by that id (a message,
38898
+ * a file, a forward, a payment) right after a reload, and that send waits for the chat rather than say "You are
38899
+ * offline" for that moment. A chat not being added is returned at once, offline or not; one whose adding failed is gone.
38900
+ */
38901
+ async linkWhenAdded(linkId) {
38902
+ await this.linksAdding.get(linkId)?.catch(() => {});
38903
+ return this.links.get(linkId);
38904
+ }
38893
38905
  addLink(params, inviteCode) {
38894
38906
  const id = identityFromSeedB64(params.seedB64).pubKeyZ32.slice(0, 16);
38895
38907
  const adding = this.addLinkNow(params, inviteCode).finally(() => {
@@ -39256,7 +39268,7 @@ var GhostlyNode = class GhostlyNode {
39256
39268
  if (native) this.ensureNativeEndpoints(linkId);
39257
39269
  }
39258
39270
  /**
39259
- * Whether a group's link (an edge, an entry session) runs native endpoints (WISP 9xx § Transports): where this app has
39271
+ * Whether a group's link (an edge, an entry session) runs native endpoints (WISP 902 § Transports): where this app has
39260
39272
  * no WebRTC (the Linux Desktop), and where the member's has none, as its packet said. Between two apps that have
39261
39273
  * WebRTC it runs none, as before: a group of eight would otherwise hold seven listeners per transport for nothing.
39262
39274
  */
@@ -39269,7 +39281,7 @@ var GhostlyNode = class GhostlyNode {
39269
39281
  * (`DirectEvidence`): a network that lets no direct connection through (a VPN, a firewall, on either side). WebRTC is
39270
39282
  * all an edge between two apps that have it runs, and there is no TURN server unless someone set one, so the edge
39271
39283
  * never went live, and the member stayed unreachable for as long as that network lasted. The edge starts again as on an
39272
- * app with no WebRTC (WISP 9xx § Transports): it runs its native endpoints and says so in its packet (`_tr`, with no
39284
+ * app with no WebRTC (WISP 902 § Transports): it runs its native endpoints and says so in its packet (`_tr`, with no
39273
39285
  * `webrtc/1`), the member's app starts its own for it as it does for a Linux Desktop, and the two meet over Iroh
39274
39286
  * through its relay. For this run of the app only.
39275
39287
  */
@@ -39772,7 +39784,7 @@ var GhostlyNode = class GhostlyNode {
39772
39784
  get nativeFactories() {
39773
39785
  const relay = this.relaysHyperdht ? this.hyperdhtRelay : "";
39774
39786
  return {
39775
- ...relay ? { "hyperdht/1": async (seedB64) => (await import("./hyperdhtRelay-CVLCuqVr.js")).createRelayedHyperEndpoint(seedB64, relay) } : {},
39787
+ ...relay ? { "hyperdht/1": async (seedB64) => (await import("./hyperdhtRelay-CHMS7_KO.js")).createRelayedHyperEndpoint(seedB64, relay) } : {},
39776
39788
  ...this.options.nativeTransports,
39777
39789
  ...this.ownIrohRelays ? { "iroh/1": (seedB64) => this.options.nativeTransports["iroh/1"](seedB64, this.settings.irohRelays?.length ? { relays: [...this.settings.irohRelays] } : {}) } : {},
39778
39790
  ...this.options.irohWeb ? { "iroh/1": (seedB64) => createIrohWebEndpoint(seedB64, { relays: this.irohRelays }) } : {}
@@ -40493,4 +40505,4 @@ function signalKind(signal) {
40493
40505
  //#endregion
40494
40506
  export { EngineServer, hyperdhtRelayProblem as n, server_exports as t };
40495
40507
 
40496
- //# sourceMappingURL=server-vGoe9MET.js.map
40508
+ //# sourceMappingURL=server-9AM0ta6q.js.map