# ts-libs: the exports of the @spy4x/* packages on JSR, one per line. # Columns, separated by one tab: name, kind, import specifier, summary. # Search: git grep -n -i '' origin/main -- llms.txt # Use: deno add jsr:, then import { } from "". # Left out: a type or interface that describes the parameters of a listed function or class Foo, foo or createFoo and is named Foo plus Props, Labels, Options, Config, Deps, Input. Its signature: https://jsr.io//doc # Usage: each entry point's module doc, https://jsr.io//doc/ BalanceFailure type @spy4x/bank-statements One reason a statement did not verify. DEFAULT_MAX_BYTES constant @spy4x/bank-statements The default `maxBytes`: 10 MiB. DEFAULT_MAX_ROWS constant @spy4x/bank-statements The default `maxRows`. ParsedStatement interface @spy4x/bank-statements What a parser read from one file. PdfColumnRange interface @spy4x/bank-statements The x range of one column on a PDF page, in PDF points from the left edge. PdfToken type @spy4x/bank-statements One step of a PDF line pattern. ProfileMatch interface @spy4x/bank-statements A profile and how well a file fits it, from 0 (not at all) to 1 (every header name). RowError interface @spy4x/bank-statements A row the parser could not read, and why. StatementBalance interface @spy4x/bank-statements A balance the file states, with the line it is written on. StatementError class @spy4x/bank-statements Thrown when a whole file is refused. StatementErrorCode type @spy4x/bank-statements Why a whole file was refused. StatementFormat type @spy4x/bank-statements A file format detectFormat can name. StatementLimits interface @spy4x/bank-statements Size limits for a file from a stranger. StatementPdfLayout type @spy4x/bank-statements How a PDF statement's lines become the columns the rest of the profile names. StatementProfile interface @spy4x/bank-statements One bank's CSV export format. StatementRow interface @spy4x/bank-statements One transaction read from a statement. Verification type @spy4x/bank-statements What verifyStatement found. builtInProfiles constant @spy4x/bank-statements The profiles this package ships, one per CSV shape, each with a synthetic fixture in `fixtures/` and a test that parses and verifies it. detectFormat function @spy4x/bank-statements The format of a statement file, decided by its content, never by its name: `"%PDF-"` is a PDF, `OFXHEADER:` or an `` element is OFX or QFX, an XML `Document` in a CAMT.053 namespace is CAMT.053, `!Type:` is QIF, `:20:` with a `:60F:` balance is MT940, and text that splits into the same number of columns on most lines is CSV. foldHeader function @spy4x/bank-statements A header name as profiles compare it: Unicode-normalised, trimmed, lower case, one space. guessProfile function @spy4x/bank-statements Build a candidate profile for a CSV file from the file alone, for a person to confirm: the delimiter, the header line (the first line with as many columns as most lines), the date column and pattern, the amount as a debit and credit pair or one signed column, the number format, and the balance, payee, description and reference columns by their header names. matchProfile function @spy4x/bank-statements Rank `profiles` by how well `sample`, the start of a decoded CSV file, fits their fingerprint: the header line split on the profile's delimiter must have its column count, and the score is the share of header names equal in the same place. parseCamt053 function @spy4x/bank-statements Read a CAMT.053 file: its booked entries (`Ntry` with status `BOOK`; pending and informational ones are not in the balances, so they are left out), its opening balance (`OPBD`, or `PRCD`, the previous closing) and its closing balance (`CLBD`). parseMt940 function @spy4x/bank-statements Read an MT940 file. parseOfx function @spy4x/bank-statements Read an OFX or QFX file: its transactions (`STMTTRN`), in the statement currency (`CURDEF`), and its closing balance (`LEDGERBAL`). parseQif function @spy4x/bank-statements Read a QIF file's transactions. parseWithProfile function @spy4x/bank-statements Read CSV text with a profile. readStatement function @spy4x/bank-statements Read a statement file of any supported format. statementProfile constant @spy4x/bank-statements The arktype schema of StatementProfile, for a profile read from storage or an AI. verifyStatement function @spy4x/bank-statements Check a statement against its own balances. DEFAULT_SAMPLE_ROWS constant @spy4x/bank-statements/infer How many lines a sample has by default. InferFailure type @spy4x/bank-statements/infer Why no profile was found. InferredProfile type @spy4x/bank-statements/infer A file that reads and verifies, and where the way to read it came from. ProfileProposal type @spy4x/bank-statements/infer What the model proposes: the structure of a profile, without the date pattern and the number format, which are read from the real values. ProfileProposalRequest interface @spy4x/bank-statements/infer What the port is asked: the prompt to send, and the schema the reply's JSON must satisfy. ProposeProfile type @spy4x/bank-statements/infer The language model, as a port: resolves to the parsed JSON of the reply, or `null` when there is none. inferProfile function @spy4x/bank-statements/infer Find a profile that reads a statement and makes its balances add up. maskSample function @spy4x/bank-statements/infer The first `maxRows` of `lines`, masked so that no value leaves the host: every digit (any Unicode number) becomes `9`, every upper- or title-case letter `X`, and every other letter, mark, other symbol (an emoji, a circled letter), format character (invisible tag characters can spell text), lone surrogate, private-use or unassigned code point, and line or paragraph separator `x`. profilePrompt function @spy4x/bank-statements/infer The prompt that asks a model for a profile's structure from a masked sample: it says how the sample was masked, names each field of the reply, and contains the word "json" and an example reply, as DeepSeek's JSON mode requires. DEFAULT_MAX_PAGES constant @spy4x/bank-statements/pdf The default `maxPages`. NO_TEXT_LAYER_MESSAGE constant @spy4x/bank-statements/pdf What a `"no-text-layer"` refusal says. PdfLine interface @spy4x/bank-statements/pdf The words of one PDF line, left to right. PdfPage interface @spy4x/bank-statements/pdf One page's lines, top to bottom. PdfRefusal interface @spy4x/bank-statements/pdf A refused file, with a message a person can act on. PdfRefusalCode type @spy4x/bank-statements/pdf Why extractPdfLines refused a file. PdfWord interface @spy4x/bank-statements/pdf A word on a PDF line. extractPdfLines function @spy4x/bank-statements/pdf The lines of every page of a PDF, top to bottom, each line's words left to right with their x. parsePdfStatement function @spy4x/bank-statements/pdf Read the lines of a PDF statement with a profile that has a `pdf` layout. BillingError interface @spy4x/billing A failed request, safe to log: it never carries the secret key. BillingErrorCode type @spy4x/billing Why a request to the provider failed. BillingEvent type @spy4x/billing A verified webhook delivery, in provider-neutral terms. BillingEventRejectReason type @spy4x/billing Why a delivery was refused: the signature check's reasons, or a payload it cannot read. BillingEventType enum @spy4x/billing What happened, as the discriminant of BillingEvent. BillingPeriod enum @spy4x/billing How often a price bills. BillingProvider interface @spy4x/billing One payment provider behind one interface. CancelAtPeriodEndRequest interface @spy4x/billing What BillingProvider.setCancelAtPeriodEnd needs. CancelRequest interface @spy4x/billing What BillingProvider.cancelNow needs. CheckoutRequest interface @spy4x/billing What BillingProvider.createCheckout needs to start a subscription checkout. CheckoutSession interface @spy4x/billing A hosted checkout page to send the customer to. LastPaymentRequest interface @spy4x/billing What BillingProvider.readLastPayment needs. PaidPayment interface @spy4x/billing The newest payment that moved money for a subscription, read from the provider when asked rather than from an event, so it shows refunds made anywhere, the provider's dashboard included. ParseEventResult type @spy4x/billing Result of BillingProvider.parseEvent. Payment interface @spy4x/billing A payment, successful or failed, as an event reports it. PaymentEvent interface @spy4x/billing A payment that went through or failed. PlanRef interface @spy4x/billing One of the app's plans, mapped to the provider's price that bills it. PortalRequest interface @spy4x/billing What BillingProvider.createPortalSession needs. PortalSession interface @spy4x/billing A customer portal page, where the customer changes plan, card or cancels and sees invoices. QuantityRequest interface @spy4x/billing What BillingProvider.updateQuantity needs to change how many seats a plan bills. Refund interface @spy4x/billing A refund the provider created. RefundRequest interface @spy4x/billing What BillingProvider.refundPayment needs to refund a payment in full. RefundStatus enum @spy4x/billing Where a refund stands. STRIPE_API_VERSION constant @spy4x/billing The Stripe API version every request is pinned to. STRIPE_SIGNATURE_HEADER constant @spy4x/billing Stripe's `Stripe-Signature: t=,v1=[,v1=][,v0=]` header layout. Subscription interface @spy4x/billing A subscription as an event reports it. SubscriptionEvent interface @spy4x/billing A subscription created, changed or ended. SubscriptionStatus enum @spy4x/billing Where a subscription stands, as every provider reports it. TrialEndRequest interface @spy4x/billing What BillingProvider.setTrialEnd needs to give a subscription time at no charge. createStripeBilling function @spy4x/billing A Stripe BillingProvider. STRIPE_API_VERSION constant @spy4x/billing/stripe The Stripe API version every request is pinned to. STRIPE_SIGNATURE_HEADER constant @spy4x/billing/stripe Stripe's `Stripe-Signature: t=,v1=[,v1=][,v0=]` header layout. createStripeBilling function @spy4x/billing/stripe A Stripe BillingProvider. CalDavCalendar interface @spy4x/caldav A calendar collection. CalDavClient interface @spy4x/caldav A CalDAV client bound to one server and one user. CalDavDiscovery interface @spy4x/caldav Where the user's calendars live, found by CalDavClient.discover. CalDavError interface @spy4x/caldav A failed call: the code to branch on, a message for logs and, when there was one, the status. CalDavErrorCode enum @spy4x/caldav Why a call failed. CalDavMultiget interface @spy4x/caldav The outcome of CalDavClient.getObjects. CalDavObject interface @spy4x/caldav One calendar object resource: an iCalendar document and the etag it was read with. CalDavResult type @spy4x/caldav The outcome of a call: the value, or why it failed. CalDavSubscriptionEvent interface @spy4x/caldav One event of a calendar subscription, as CalDavClient.readSubscription returns it: every component of the feed with this UID (the master and its `RECURRENCE-ID` overrides) in one `VCALENDAR`, with the `VTIMEZONE`s they name. CalDavWrite interface @spy4x/caldav The outcome of a write: where the object is and its new etag. CreateObjectOptions interface @spy4x/caldav Options of CalDavClient.createObject. ListCalendarsOptions interface @spy4x/caldav Options of CalDavClient.listCalendars. ListObjectsOptions interface @spy4x/caldav Options of CalDavClient.listObjects. NewCalendar interface @spy4x/caldav Properties of a new calendar. createCalDavClient function @spy4x/caldav Create a client for one CalDAV server and one user. CachedObject interface @spy4x/caldav/indexeddb The part of a cached object the store reads. IndexedDbCalDavCache interface @spy4x/caldav/indexeddb A calendar and object cache over IndexedDB. IndexedDbCalDavCacheCustomOptions interface @spy4x/caldav/indexeddb Options for a cache of a richer object type: it must say how to build one. IndexedDbUnavailableError class @spy4x/caldav/indexeddb Thrown when the cache cannot be opened: IndexedDB missing, blocked or refused (private window). createIndexedDbCalDavCache function @spy4x/caldav/indexeddb Creates the cache. CalDavSync interface @spy4x/caldav/sync The engine made by createCalDavSync. CalDavSyncStore interface @spy4x/caldav/sync Where the copy lives. CalDavSyncTransport interface @spy4x/caldav/sync How the server is reached. StoredCalendar type @spy4x/caldav/sync A calendar as the store keeps it: what the server listed, plus how far the copy is in step. SyncCalendar interface @spy4x/caldav/sync The part of a calendar the engine reads. SyncChanges interface @spy4x/caldav/sync What a run changes in one calendar. SyncListOptions interface @spy4x/caldav/sync Options of the transport's object calls. SyncObject interface @spy4x/caldav/sync One calendar object: the raw iCalendar text and the version it came from. SyncObjectVersion interface @spy4x/caldav/sync An object's address and version, without its body. SyncOutcome interface @spy4x/caldav/sync What one CalDavSync.refresh found. SyncTransportResult type @spy4x/caldav/sync What a transport call reports. createCalDavSync function @spy4x/caldav/sync Builds the engine over a transport and a store. createClientTransport function @spy4x/caldav/sync A transport over a CalDavClient, for code that talks CalDAV directly (a server). childUrl function @spy4x/caldav/url The URL of a new member of `collectionUrl`, named `segment` encoded with `encodeURIComponent`. isSameOrigin function @spy4x/caldav/url Whether `target` is on the same origin as `serverUrl`: the same scheme, host and port. resolveHref function @spy4x/caldav/url Resolve an `href` from a multistatus body against the URL of the request that returned it. sameResource function @spy4x/caldav/url Whether two absolute URLs name the same resource: same origin, same query and the same path segments once each segment is percent-decoded. CalDavSendFailure type @spy4x/caldav/write How the queue reads a failed send. CalDavWriteCommand interface @spy4x/caldav/write What the queue sends for one entry. CalDavWriteError class @spy4x/caldav/write The error CalDavWriteTransport.send throws; carries what the server answered. CalDavWriteOptions interface @spy4x/caldav/write What an app supplies to turn a queue entry into a CalDAV request. CalDavWriteTransport interface @spy4x/caldav/write The three outbox ports this module fills. CalDavWriter type @spy4x/caldav/write The object calls a write transport needs. classifyCalDavError function @spy4x/caldav/write Reads a failed CalDAV call as the queue needs it. createCalDavWriteTransport function @spy4x/caldav/write Builds the `send`, `fetchServer` and `classify` ports of an outbox over CalDAV. isSafeEntityId function @spy4x/caldav/write Whether an entity id can name an object: letters, digits, `.`, `_`, `~` and `-`, and not `.` or `..`. objectUrl function @spy4x/caldav/write The address createCalDavWriteTransport gives a created entity's object. APPLE_ICAL_NS constant @spy4x/caldav/xml Apple's iCal namespace, home of `calendar-color` and `calendar-order`. CALDAV_NS constant @spy4x/caldav/xml The CalDAV namespace (RFC 4791). CALENDARSERVER_NS constant @spy4x/caldav/xml The CalendarServer namespace, home of `getctag`. CalendarProps interface @spy4x/caldav/xml Calendar collection properties written by mkcalendarBody and proppatchBody. CalendarQueryOptions interface @spy4x/caldav/xml Options of calendarQueryBody. DAV_NS constant @spy4x/caldav/xml The WebDAV namespace (RFC 4918). DEFAULT_MAX_XML_BYTES constant @spy4x/caldav/xml Default size limit of parseXml and parseMultistatus: 10 MiB of UTF-8. DEFAULT_MAX_XML_DEPTH constant @spy4x/caldav/xml Default nesting limit of parseXml and parseMultistatus. DavPropstat interface @spy4x/caldav/xml One `propstat` of a `response`: its HTTP status and the property elements under it. DavResponse interface @spy4x/caldav/xml One `response` of a multistatus. XmlAttribute interface @spy4x/caldav/xml An attribute with its namespace resolved. XmlElement interface @spy4x/caldav/xml An element with its namespace resolved. XmlError interface @spy4x/caldav/xml A refused document: the code to branch on and a message for logs. XmlErrorCode enum @spy4x/caldav/xml Why a document was refused. XmlName interface @spy4x/caldav/xml A namespace-qualified name. XmlNode type @spy4x/caldav/xml A child of an element: another element, or decoded text. XmlParseOptions interface @spy4x/caldav/xml Limits for parseXml and parseMultistatus. XmlResult type @spy4x/caldav/xml The outcome of a parse: the value, or why the document was refused. calendarMultigetBody function @spy4x/caldav/xml A `calendar-multiget` REPORT body (RFC 4791 §7.9) for `hrefs`, written as given. calendarQueryBody function @spy4x/caldav/xml A `calendar-query` REPORT body (RFC 4791 §7.8). childElement function @spy4x/caldav/xml The first child element of `element` named `namespace`/`name`. childElements function @spy4x/caldav/xml The child elements of `element` named `namespace`/`name`, in document order. escapeXml function @spy4x/caldav/xml Escape text for an XML element body or a double-quoted attribute value. getProp function @spy4x/caldav/xml The property `namespace`/`name` from a 2xx propstat of `response`; never from a 404 one. getPropText function @spy4x/caldav/xml The text of getProp, untrimmed, or `undefined` when the property is not there. mkcalendarBody function @spy4x/caldav/xml A `MKCALENDAR` body (RFC 4791 §5.3.1). parseMultistatus function @spy4x/caldav/xml Parse a `207 Multi-Status` body into its responses. parseXml function @spy4x/caldav/xml Parse an XML document into a tree of elements with resolved namespaces. propfindBody function @spy4x/caldav/xml A `PROPFIND` body asking for `props`. proppatchBody function @spy4x/caldav/xml A `PROPPATCH` body that sets the given calendar properties (RFC 4918 §9.2). serializeXml function @spy4x/caldav/xml Serialise an element tree as an XML document. textContent function @spy4x/caldav/xml All text under `element`, in document order, with nothing trimmed. xmlElement function @spy4x/caldav/xml Build an element. Canonicalization type @spy4x/email Which canonicalization RFC 6376 §3.4 applies to a header or a body. DARK_HTML_SHELL_THEME constant @spy4x/email The look `htmlWrap` had before HtmlShellOptions.theme existed: a dark navy body with light text and an orange brand link. DEFAULT_HTML_SHELL_THEME constant @spy4x/email `htmlWrap`'s default look: a neutral light shell with no product association, so a caller gets a plain, readable letter unless it asks for something else. DEFAULT_MAX_HEADER_FIELDS constant @spy4x/email Default DkimVerifyOptions.maxHeaderFields. DEFAULT_MAX_MESSAGE_LENGTH constant @spy4x/email Default DkimVerifyOptions.maxMessageLength: 10 MiB of octets, which is above the message size limit relays usually impose and far below anything that takes a noticeable time to canonicalize. DEFAULT_MAX_SIGNATURES constant @spy4x/email Default DkimVerifyOptions.maxSignatures. DEFAULT_MAX_SIGNED_HEADER_NAMES constant @spy4x/email Default DkimVerifyOptions.maxSignedHeaderNames. DkimAlgorithm type @spy4x/email Signature algorithms this verifier implements (RFC 6376 §3.3, RFC 8463). DkimBodyCoverage interface @spy4x/email How much of the canonicalized body a signature's `bh=` tag actually covers. DkimKeyAlgorithm type @spy4x/email Key algorithms a DNS TXT record's `k=` tag may name. DkimParseError class @spy4x/email Thrown for a malformed DKIM-Signature header or DNS key record. DkimPublicKey interface @spy4x/email A DKIM public key extracted from a DNS TXT record. DkimSignatureHeader interface @spy4x/email Parsed `DKIM-Signature` header value. DkimVerificationResult interface @spy4x/email Outcome of verifyDkim. DkimVerifyOptions interface @spy4x/email Options for verifyDkim and fetchDkimPublicKey. DnsTxtResolver interface @spy4x/email DNS TXT lookup contract, defaulting to `resolveTxt` of `@spy4x/net/dns`, which works on Deno, Node and Bun and needs `--allow-net` on Deno. EmailAddress interface @spy4x/email A parsed mailbox: the addr-spec, plus the display name that preceded it. EmailAttachment interface @spy4x/email One attachment: text content plus the metadata the MIME part needs. EmailMessage interface @spy4x/email Everything one send needs. EmailSender interface @spy4x/email The port every transport implements, and the only thing callers depend on. HtmlShellOptions interface @spy4x/email Everything the shell interpolates around a body. HtmlShellTheme interface @spy4x/email The four colours htmlWrap draws the shell in. ListUnsubscribe interface @spy4x/email The `List-Unsubscribe` targets of one message. MIN_RSA_KEY_BITS constant @spy4x/email RFC 8301 §3.2: "Verifiers MUST NOT consider signatures using RSA keys of less than 1024 bits as valid." ParsedRecipients interface @spy4x/email The recipient list after parsing: deduplicated, with what was dropped recorded. REDACTED_CREDENTIAL constant @spy4x/email Placeholder that replaces a credential in any string this module reports. SendFailure interface @spy4x/email No mail was sent, or some recipient was refused. SendResult type @spy4x/email Outcome of one send attempt. SendSuccess interface @spy4x/email Every recipient the transport saw was accepted by the server. SmtpOptions interface @spy4x/email Connection settings. SmtpSendInfo interface @spy4x/email The slice of a nodemailer send result this adapter reads. SmtpTransport interface @spy4x/email The slice of a nodemailer transport this adapter calls. SmtpTransportFactory interface @spy4x/email Builds a transport from a connection configuration. TRANSIT_ADDED_HEADER_NAMES constant @spy4x/email Header field names a relay is expected to add to a message in transit. assertNoControlCharacters function @spy4x/email Reject a value that carries a control character — CR and LF above all. assertSendableMessage function @spy4x/email Validate a message before any transport sees it. canonicalizeBody function @spy4x/email Deprecated: An internal step of `verifyDkim`, exported by mistake; it goes in 2.0. Canonicalize a message body per RFC 6376 §3.4.3 (simple) / §3.4.4 (relaxed). canonicalizeHeader function @spy4x/email Deprecated: An internal step of `verifyDkim`, exported by mistake; it goes in 2.0. Canonicalize one header field per RFC 6376 §3.4.1 (simple) / §3.4.2 (relaxed). createConsoleSender function @spy4x/email A sender that logs instead of sending, for local runs and for tests that need a port implementation without a mail server. createSmtpSender function @spy4x/email Create a sender for one SMTP configuration. emailButton function @spy4x/email A table-based "bulletproof" call-to-action button for the body of a mail. escapeHtml function @spy4x/email Escape a value for interpolation into HTML element text or a double-quoted attribute. fetchDkimPublicKey function @spy4x/email Fetch and parse a DKIM public key from DNS, from `._domainkey.`. formatAddress function @spy4x/email Render a mailbox for a log line or a plain-text body. frameInstantLong function @spy4x/email Render an instant as the recipient's own clock reads it, with the zone spelled out: `"Friday, 28 August 2026 at 04:00 (America/New_York)"`. frameInstantShort function @spy4x/email frameInstantLong without the zone name, for a subject line: `"Fri 28 Aug 04:00"`. frameWallClockLong function @spy4x/email Frame a `YYYY-MM-DD` + `HH:MM` wall clock written in `sourceTz` for a recipient in `recipientTz`, falling back to the zone the wall clock was written in. frameWallClockShort function @spy4x/email frameWallClockLong without the zone name, for a subject line. hasBody function @spy4x/email Deprecated: An internal step of `assertSendableMessage` and the SMTP sender, exported by mistake; it goes in 2.0. True when a body field carries something worth sending. htmlWrap function @spy4x/email Wrap a body in the shared letter-shaped shell. icalAttachment function @spy4x/email Build the ICS attachment for an event. isAddress function @spy4x/email True when `value` is an addr-spec this module will send to. isExampleAddress function @spy4x/email True when `address` is on a domain RFC 2606 reserves for examples: `example.com`, `example.net`, `example.org`, a subdomain of one, or the `.example` top-level domain. parseAddress function @spy4x/email Parse `Name ` or a bare addr-spec into its parts. parseAddresses function @spy4x/email Parse a recipient list, deduplicating case-insensitively. parseDkimPublicKey function @spy4x/email Parse a DKIM TXT record's `p=` field into a public key. parseDkimSignature function @spy4x/email Parse a `DKIM-Signature` header value (without the leading `DKIM-Signature:`) into structured form. refuseHeaderLineEndings function @spy4x/email Deprecated: An internal step of `verifyDkim`, exported by mistake; it goes in 2.0. Refuse a header block whose line endings are not uniform, and say why. sha256Base64 function @spy4x/email Deprecated: An internal step of `verifyDkim`, exported by mistake; it goes in 2.0. Compute the base64 SHA-256 digest of a string or of raw octets. splitMessage function @spy4x/email Deprecated: An internal step of `verifyDkim`, exported by mistake; it goes in 2.0. Split a raw RFC 5322 message into raw header lines and a raw body. verifyDkim function @spy4x/email Verify a message's DKIM signatures and report one verdict. verifyDkimSignatures function @spy4x/email Verify every `DKIM-Signature` field in the message and return one result each, in the order the fields appear. EmailAddress interface @spy4x/email/address A parsed mailbox: the addr-spec, plus the display name that preceded it. MAX_ADDR_SPEC_LENGTH constant @spy4x/email/address Longest addr-spec, in characters, that fits a `RCPT TO` path (RFC 5321 §4.5.3.1.3: 256 with the angle brackets). ParsedRecipients interface @spy4x/email/address The recipient list after parsing: deduplicated, with what was dropped recorded. assertNoControlCharacters function @spy4x/email/address Reject a value that carries a control character — CR and LF above all. formatAddress function @spy4x/email/address Render a mailbox for a log line or a plain-text body. isAddress function @spy4x/email/address True when `value` is an addr-spec this module will send to. isExampleAddress function @spy4x/email/address True when `address` is on a domain RFC 2606 reserves for examples: `example.com`, `example.net`, `example.org`, a subdomain of one, or the `.example` top-level domain. parseAddress function @spy4x/email/address Parse `Name ` or a bare addr-spec into its parts. parseAddresses function @spy4x/email/address Parse a recipient list, deduplicating case-insensitively. parseBareAddress function @spy4x/email/address The bare address a form field holds, trimmed and lowercased, or `null` when it holds anything else. Canonicalization type @spy4x/email/dkim-verify Which canonicalization RFC 6376 §3.4 applies to a header or a body. DEFAULT_MAX_HEADER_FIELDS constant @spy4x/email/dkim-verify Default DkimVerifyOptions.maxHeaderFields. DEFAULT_MAX_MESSAGE_LENGTH constant @spy4x/email/dkim-verify Default DkimVerifyOptions.maxMessageLength: 10 MiB of octets, which is above the message size limit relays usually impose and far below anything that takes a noticeable time to canonicalize. DEFAULT_MAX_SIGNATURES constant @spy4x/email/dkim-verify Default DkimVerifyOptions.maxSignatures. DEFAULT_MAX_SIGNED_HEADER_NAMES constant @spy4x/email/dkim-verify Default DkimVerifyOptions.maxSignedHeaderNames. DkimAlgorithm type @spy4x/email/dkim-verify Signature algorithms this verifier implements (RFC 6376 §3.3, RFC 8463). DkimBodyCoverage interface @spy4x/email/dkim-verify How much of the canonicalized body a signature's `bh=` tag actually covers. DkimKeyAlgorithm type @spy4x/email/dkim-verify Key algorithms a DNS TXT record's `k=` tag may name. DkimParseError class @spy4x/email/dkim-verify Thrown for a malformed DKIM-Signature header or DNS key record. DkimPublicKey interface @spy4x/email/dkim-verify A DKIM public key extracted from a DNS TXT record. DkimSignatureHeader interface @spy4x/email/dkim-verify Parsed `DKIM-Signature` header value. DkimVerificationResult interface @spy4x/email/dkim-verify Outcome of verifyDkim. DkimVerifyOptions interface @spy4x/email/dkim-verify Options for verifyDkim and fetchDkimPublicKey. DnsTxtResolver interface @spy4x/email/dkim-verify DNS TXT lookup contract, defaulting to `resolveTxt` of `@spy4x/net/dns`, which works on Deno, Node and Bun and needs `--allow-net` on Deno. MIN_RSA_KEY_BITS constant @spy4x/email/dkim-verify RFC 8301 §3.2: "Verifiers MUST NOT consider signatures using RSA keys of less than 1024 bits as valid." TRANSIT_ADDED_HEADER_NAMES constant @spy4x/email/dkim-verify Header field names a relay is expected to add to a message in transit. canonicalizeBody function @spy4x/email/dkim-verify Deprecated: An internal step of `verifyDkim`, exported by mistake; it goes in 2.0. Canonicalize a message body per RFC 6376 §3.4.3 (simple) / §3.4.4 (relaxed). canonicalizeHeader function @spy4x/email/dkim-verify Deprecated: An internal step of `verifyDkim`, exported by mistake; it goes in 2.0. Canonicalize one header field per RFC 6376 §3.4.1 (simple) / §3.4.2 (relaxed). fetchDkimPublicKey function @spy4x/email/dkim-verify Fetch and parse a DKIM public key from DNS, from `._domainkey.`. parseDkimPublicKey function @spy4x/email/dkim-verify Parse a DKIM TXT record's `p=` field into a public key. parseDkimSignature function @spy4x/email/dkim-verify Parse a `DKIM-Signature` header value (without the leading `DKIM-Signature:`) into structured form. refuseHeaderLineEndings function @spy4x/email/dkim-verify Deprecated: An internal step of `verifyDkim`, exported by mistake; it goes in 2.0. Refuse a header block whose line endings are not uniform, and say why. sha256Base64 function @spy4x/email/dkim-verify Deprecated: An internal step of `verifyDkim`, exported by mistake; it goes in 2.0. Compute the base64 SHA-256 digest of a string or of raw octets. splitMessage function @spy4x/email/dkim-verify Deprecated: An internal step of `verifyDkim`, exported by mistake; it goes in 2.0. Split a raw RFC 5322 message into raw header lines and a raw body. verifyDkim function @spy4x/email/dkim-verify Verify a message's DKIM signatures and report one verdict. verifyDkimSignatures function @spy4x/email/dkim-verify Verify every `DKIM-Signature` field in the message and return one result each, in the order the fields appear. DARK_HTML_SHELL_THEME constant @spy4x/email/html The look `htmlWrap` had before HtmlShellOptions.theme existed: a dark navy body with light text and an orange brand link. DEFAULT_HTML_SHELL_THEME constant @spy4x/email/html `htmlWrap`'s default look: a neutral light shell with no product association, so a caller gets a plain, readable letter unless it asks for something else. HtmlShellOptions interface @spy4x/email/html Everything the shell interpolates around a body. HtmlShellTheme interface @spy4x/email/html The four colours htmlWrap draws the shell in. emailButton function @spy4x/email/html A table-based "bulletproof" call-to-action button for the body of a mail. escapeHtml function @spy4x/email/html Escape a value for interpolation into HTML element text or a double-quoted attribute. htmlWrap function @spy4x/email/html Wrap a body in the shared letter-shaped shell. Letter interface @spy4x/email/letter A finished letter: the HTML part and the plain-text part. LetterBlock interface @spy4x/email/letter The letter's content: the same thing as HTML (already escaped) and as plain text. LetterInput interface @spy4x/email/letter What renderLetter needs. UNSUBSCRIBE_PLACEHOLDER constant @spy4x/email/letter Stands where a reader's own unsubscribe link goes in a letter rendered once and sent many times. bulletList function @spy4x/email/letter A bulleted list. button function @spy4x/email/letter A filled button. fillUnsubscribe function @spy4x/email/letter Put a reader's own link where UNSUBSCRIBE_PLACEHOLDER stands: escaped in the HTML part, as it is in the plain-text part. heading function @spy4x/email/letter A small heading, such as "In short". linkedImage function @spy4x/email/letter A picture linked to `href`, `width` pixels wide at most (default 600) and as wide as the column below that. paragraph function @spy4x/email/letter A paragraph of plain prose. renderLetter function @spy4x/email/letter Wrap the blocks in the letter layout and return both parts. EmailAttachment interface @spy4x/email/message One attachment: text content plus the metadata the MIME part needs. EmailMessage interface @spy4x/email/message Everything one send needs. ListUnsubscribe interface @spy4x/email/message The `List-Unsubscribe` targets of one message. assertSendableMessage function @spy4x/email/message Validate a message before any transport sees it. frameInstantLong function @spy4x/email/message Render an instant as the recipient's own clock reads it, with the zone spelled out: `"Friday, 28 August 2026 at 04:00 (America/New_York)"`. frameInstantShort function @spy4x/email/message frameInstantLong without the zone name, for a subject line: `"Fri 28 Aug 04:00"`. frameWallClockLong function @spy4x/email/message Frame a `YYYY-MM-DD` + `HH:MM` wall clock written in `sourceTz` for a recipient in `recipientTz`, falling back to the zone the wall clock was written in. frameWallClockShort function @spy4x/email/message frameWallClockLong without the zone name, for a subject line. hasBody function @spy4x/email/message Deprecated: An internal step of `assertSendableMessage` and the SMTP sender, exported by mistake; it goes in 2.0. True when a body field carries something worth sending. icalAttachment function @spy4x/email/message Build the ICS attachment for an event. listUnsubscribeHeaders function @spy4x/email/message The `List-Unsubscribe` and `List-Unsubscribe-Post` header values for a ListUnsubscribe, ready for the transport's `headers` option. EmailSender interface @spy4x/email/sender The port every transport implements, and the only thing callers depend on. SendFailure interface @spy4x/email/sender No mail was sent, or some recipient was refused. SendResult type @spy4x/email/sender Outcome of one send attempt. SendSuccess interface @spy4x/email/sender Every recipient the transport saw was accepted by the server. createConsoleSender function @spy4x/email/sender A sender that logs instead of sending, for local runs and for tests that need a port implementation without a mail server. EmailSender interface @spy4x/email/smtp The port every transport implements, and the only thing callers depend on. REDACTED_CREDENTIAL constant @spy4x/email/smtp Placeholder that replaces a credential in any string this module reports. SendFailure interface @spy4x/email/smtp No mail was sent, or some recipient was refused. SendResult type @spy4x/email/smtp Outcome of one send attempt. SendSuccess interface @spy4x/email/smtp Every recipient the transport saw was accepted by the server. SmtpOptions interface @spy4x/email/smtp Connection settings. SmtpSendInfo interface @spy4x/email/smtp The slice of a nodemailer send result this adapter reads. SmtpTransport interface @spy4x/email/smtp The slice of a nodemailer transport this adapter calls. SmtpTransportFactory interface @spy4x/email/smtp Builds a transport from a connection configuration. createSmtpSender function @spy4x/email/smtp Create a sender for one SMTP configuration. BLUESKY_DEFAULT_SERVICE constant @spy4x/integrations Where an account signs in when no `service` is given. BLUESKY_FEED_PAGES constant @spy4x/integrations Feed pages findBlueskyPostByLink reads by default: the latest 1,000 posts. BLUESKY_MAX_GRAPHEMES constant @spy4x/integrations The post lexicon's limit on `text`, in graphemes. BLUESKY_MAX_TEXT_BYTES constant @spy4x/integrations The post lexicon's limit on `text`, in UTF-8 bytes. BLUESKY_MAX_THUMB_BYTES constant @spy4x/integrations The largest image an external card's `thumb` takes. BLUESKY_PUBLIC_APPVIEW constant @spy4x/integrations The public AppView, which answers reads without a token. BackoffFn type @spy4x/integrations Computes a delay. BlueskyBlob interface @spy4x/integrations An uploaded blob, as the protocol references it from a record. BlueskyBlobResult type @spy4x/integrations Outcome of uploadBlueskyBlob. BlueskyFindResult type @spy4x/integrations Outcome of findBlueskyPostByLink: `null` when none of the pages read has the link. BlueskyHandleResult type @spy4x/integrations Outcome of resolveBlueskyHandle: the account's DID. BlueskyLinkCard interface @spy4x/integrations The link card. BlueskyPostRef interface @spy4x/integrations A post: its `at://` address, content id and public page. BlueskyPostResult type @spy4x/integrations Outcome of postBlueskyLink. BlueskyPostResults interface @spy4x/integrations ShareResults with Bluesky's own counts: likes are `reactions`, replies `comments`. BlueskyResultsResult type @spy4x/integrations Outcome of readBlueskyPostResults. BlueskySession interface @spy4x/integrations A signed-in account. BlueskySessionResult type @spy4x/integrations Outcome of createBlueskySession. COINGECKO_COINS constant @spy4x/integrations CoinGecko's ids of common coins, by code. ChatClient interface @spy4x/integrations A configured client. ChatJsonRequest interface @spy4x/integrations Options for chatJson. ChatJsonResult type @spy4x/integrations Outcome of chatJson. ChatMessage interface @spy4x/integrations One message of a conversation. Clock type @spy4x/integrations Deprecated: The same type as `NowFn` from `@spy4x/platform/universal/time`, which is now the home for this shape. Millisecond time source. CloudflarePurgeOptions interface @spy4x/integrations Options for purgeUrls. CloudflarePurgeResult interface @spy4x/integrations Outcome of a purge: `output` describes what happened on success, `error` on failure. CoinGeckoPlan type @spy4x/integrations CoinGecko's plans differ in host and key header: the free Demo plan, or a paid one. CombinedSignatureHeader interface @spy4x/integrations One header that carries the timestamp and the signatures together, as a list of `key=value` pairs: Stripe's `Stripe-Signature: t=1492774577,v1=5257…,v0=6ffb…` is `{ name: "Stripe-Signature", pairSeparator: ",", timestampKey: "t", signatureKey: "v1" }`. DEFAULT_REQUEST_TIMEOUT_MS constant @spy4x/integrations Bounds a single outgoing request, used by every client in this package unless a caller overrides it. DEVTO_MAX_PAGES constant @spy4x/integrations Pages the lookup reads at most before it gives up, so a looping answer cannot run forever. DEVTO_MAX_TAGS constant @spy4x/integrations The most tags Dev.to accepts on one article. DEVTO_PAGE_SIZE constant @spy4x/integrations Articles asked for per page of the lookup: the API's documented maximum. DevtoArticleRef interface @spy4x/integrations A Dev.to article: its numeric id and public address. DevtoClientOptions interface @spy4x/integrations Settings both calls share. DevtoCreateResult type @spy4x/integrations Outcome of createDevtoArticle: the new article on success, `error` on failure. DevtoFindResult type @spy4x/integrations Outcome of findDevtoArticleByCanonical: the article, or `null` when none of the key's articles has that canonical address. DevtoResultsResult type @spy4x/integrations Outcome of readDevtoArticleResults: the article's ShareResults (`score` is always `null`), or `null` when none of the key's articles has that id. ExchangeRateClientOptions interface @spy4x/integrations Options every client takes. ExchangeRateSource interface @spy4x/integrations A provider of daily exchange rates. FRANKFURTER_URL constant @spy4x/integrations Frankfurter's public instance. HACKERNEWS_SEARCH_LIMIT constant @spy4x/integrations Stories asked for per address search: plenty for one address, cheap to read. HASHNODE_API constant @spy4x/integrations Hashnode's GraphQL endpoint. HASHNODE_MAX_TAGS constant @spy4x/integrations The most tags Hashnode accepts on one post. HackerNewsFindResult type @spy4x/integrations Outcome of findHackerNewsStoriesByUrl; an empty list when nobody submitted it. HackerNewsResultsResult type @spy4x/integrations Outcome of readHackerNewsItemResults; `output: null` when no such story is indexed. HackerNewsStoryRef interface @spy4x/integrations A story that links to the address asked for. HashnodeClientOptions interface @spy4x/integrations Settings every call shares. HashnodeFindResult type @spy4x/integrations Outcome of findHashnodePostBySlug; a failure never means "not found". HashnodePostRef interface @spy4x/integrations A Hashnode post: its id and public address. HashnodePublicationRef type @spy4x/integrations Which publication to look in: its host (`blog.example.com`) or its id. HashnodePublishResult type @spy4x/integrations Outcome of publishHashnodePost. HashnodeResultsResult type @spy4x/integrations Outcome of readHashnodePostResults: the post's ShareResults; `null` is a number Hashnode does not report. HealthchecksClient class @spy4x/integrations healthchecks.io client. HealthchecksErrorCode type @spy4x/integrations Failure reasons `ping` can report. HealthchecksFailure interface @spy4x/integrations A ping that could not be delivered after retrying. HealthchecksOutcome enum @spy4x/integrations Which endpoint a ping targets. HealthchecksPing interface @spy4x/integrations One ping to send through HealthchecksClient.ping. HealthchecksResult type @spy4x/integrations Outcome of HealthchecksClient.ping. HealthchecksRetryOptions interface @spy4x/integrations Overrides for the client's default retry policy. HealthchecksSuccess interface @spy4x/integrations A ping that reached healthchecks.io and was accepted. INDEXNOW_MAX_URLS constant @spy4x/integrations The most addresses IndexNow accepts in one submission. IndexNowOptions interface @spy4x/integrations Options for submitIndexNow. IndexNowResult interface @spy4x/integrations Outcome of a submission: `output` describes what happened on success, `error` on failure. LINKEDIN_DEFAULT_SCOPES constant @spy4x/integrations The scopes that sign a member in and let the app post as them. LINKEDIN_MAX_COMMENTARY constant @spy4x/integrations The longest `commentary` LinkedIn accepts, in characters. LINKEDIN_VERSION constant @spy4x/integrations The Posts API version sent by default, `YYYYMM`: the newest LinkedIn listed in 2026-10. LLM_DEFAULT_TIMEOUT_MS constant @spy4x/integrations How long one call may take by default: a model can think for a while before it answers. LLM_PRESETS constant @spy4x/integrations The OpenAI-compatible endpoints of OpenAI, DeepSeek, Google Gemini and a local Ollama. LinkedinMember interface @spy4x/integrations The signed-in member. LinkedinMemberOptions interface @spy4x/integrations Settings the member's calls share. LinkedinMemberResult type @spy4x/integrations Outcome of readLinkedinMember. LinkedinPostRef interface @spy4x/integrations A LinkedIn post: its URN and public address. LinkedinShareLink interface @spy4x/integrations The article a share links to. LinkedinShareResult type @spy4x/integrations Outcome of postLinkedinShare. LinkedinTokens interface @spy4x/integrations A member's tokens. LinkedinTokensResult type @spy4x/integrations Outcome of exchangeLinkedinCode. LlmEndpoint interface @spy4x/integrations Where a provider's OpenAI-compatible API lives and how it differs from OpenAI's. LlmError interface @spy4x/integrations A failed call. LlmErrorCode type @spy4x/integrations Why a call failed. LlmUsage interface @spy4x/integrations Token counts of one reply, as the provider billed them. MastodonClientOptions interface @spy4x/integrations Settings both calls share. MastodonPostResult type @spy4x/integrations Outcome of postMastodonStatus. MastodonResultsResult type @spy4x/integrations Outcome of readMastodonStatusResults. MastodonStatusRef interface @spy4x/integrations A posted status: its id on the instance and its public address. MastodonStatusResults interface @spy4x/integrations ShareResults with Mastodon's own counts. MastodonVisibility type @spy4x/integrations Who sees a status; Mastodon's four values. NotificationSeverity enum @spy4x/integrations Severity gate. NtfyClient class @spy4x/integrations ntfy client. NtfyErrorCode type @spy4x/integrations Failure reasons `push` can report. NtfyFailure interface @spy4x/integrations A push that could not be delivered after retrying. NtfyPriority enum @spy4x/integrations ntfy priority, 1 (min) to 5 (max). NtfyPush interface @spy4x/integrations One notification to send through NtfyClient.push. NtfyPushed interface @spy4x/integrations A push that reached ntfy and was accepted. NtfyResult type @spy4x/integrations Outcome of NtfyClient.push. NtfyRetryOptions interface @spy4x/integrations Overrides for the client's default retry policy. NtfySkipped interface @spy4x/integrations A push that was never sent because its severity did not meet the gate. PURGE_BATCH_SIZE constant @spy4x/integrations Cloudflare's purge-by-URL endpoint accepts at most this many files per call. REDDIT_INFO_LIMIT constant @spy4x/integrations Submissions asked for at most: the most one `info.json` page holds. RandomSource type @spy4x/integrations Deprecated: Use `RandomSource` from "@spy4x/platform/universal/async". A source of numbers in `[0, 1)`, the shape `Math.random` has. Rates interface @spy4x/integrations What a source found for one day. RatesError interface @spy4x/integrations A failed call: which source, and why. RatesErrorCode type @spy4x/integrations Why a call failed. RatesResult type @spy4x/integrations Outcome of ExchangeRateSource.daily. RedditClientOptions interface @spy4x/integrations Settings both calls share. RedditFindResult type @spy4x/integrations Outcome of findRedditPostsByUrl; an empty list when nobody submitted the address. RedditPostRef interface @spy4x/integrations A submission that links to the address asked for. RedditPostResults interface @spy4x/integrations A post's ShareResults, plus the share of its votes that are upvotes (0 to 1). RedditResultsResult type @spy4x/integrations Outcome of readRedditPostResults; `output: null` when Reddit lists no such post. RetryPolicy interface @spy4x/integrations RetryRunOptions interface @spy4x/integrations RetryRunResult interface @spy4x/integrations ShareResults interface @spy4x/integrations How one shared copy did. Sleeper type @spy4x/integrations Waits a duration. SpendGuard interface @spy4x/integrations The port an app implements to cap what it spends, for example over `@spy4x/server/quota`'s `QuotaMeter`. SpendRequest interface @spy4x/integrations What a SpendGuard is asked to allow before a request is sent. UMAMI_FILTER_NAMES constant @spy4x/integrations The filters Umami's website reports take. UMAMI_LINK_NAME_MAX constant @spy4x/integrations Umami's limits for a link: a name of 100 characters, a url of 500, a slug of 8 to 100. UMAMI_LINK_URL_MAX constant @spy4x/integrations UMAMI_METRIC_TYPES constant @spy4x/integrations What a breakdown can count by, in Umami's names. UMAMI_SERIES_UNITS constant @spy4x/integrations The units a series can step by. UMAMI_SLUG_PATTERN constant @spy4x/integrations A slug this client sends: 8 to 100 letters, digits, `-` and `_`, so it is safe in a path. UmamiCheckResult interface @spy4x/integrations Outcome of checkUmami: `output` says what was seen on success, `error` on failure. UmamiConnection interface @spy4x/integrations Where an Umami instance is, and how to reach it. UmamiFilterName type @spy4x/integrations One of UMAMI_FILTER_NAMES. UmamiLink interface @spy4x/integrations A link as Umami stores it. UmamiLinkCreateOptions interface @spy4x/integrations Options for createUmamiLink. UmamiLinkResult type @spy4x/integrations Outcome of createUmamiLink: the link on success, why not on failure. UmamiMetric interface @spy4x/integrations One row of a breakdown: a value (`x`, such as a path or an event name) and its count (`y`). UmamiMetricType type @spy4x/integrations One of UMAMI_METRIC_TYPES: page views and visits by these, events by `event`. UmamiPageviews interface @spy4x/integrations UmamiSeries, with the previous period's when `compare` was asked for. UmamiPoint interface @spy4x/integrations One point of a series: the start of its unit as Umami prints it (`x`), and a count (`y`). UmamiPropertyValue interface @spy4x/integrations How many events carried one value of a property. UmamiReadResult type @spy4x/integrations Outcome of a read. UmamiSeries interface @spy4x/integrations Page views and visitors per unit of time. UmamiStats interface @spy4x/integrations UmamiTotals of the period and of the period of the same length just before it. UmamiTotals interface @spy4x/integrations A website's totals over a period: Umami's `/stats`. UmamiWebsiteCheck type @spy4x/integrations Outcome of checkUmamiWebsite. UmamiWebsiteProblem type @spy4x/integrations Why checkUmamiWebsite failed: `settings` for options that cannot work (no `http`/`https` base address, an empty token, a bad timeout), `website` for a website id that is no UUID or that the token cannot see, `token` for a token Umami refuses, `unreachable` for anything else. UmamiWebsiteRead interface @spy4x/integrations What every read of a website's numbers needs. WebhookRejectReason type @spy4x/integrations Why a delivery was rejected. WebhookVerifierConfig interface @spy4x/integrations Shared secret and header names verifyWebhookRequest needs to check a delivery. WebhookVerifyResult type @spy4x/integrations Result of verifyWebhookRequest: the verified body, or why it was rejected. chatJson function @spy4x/integrations Asks the model for JSON and checks it with `schema`. checkUmami function @spy4x/integrations Asks Umami's `GET /api/heartbeat` whether the instance answers. checkUmamiWebsite function @spy4x/integrations Checks that the token is accepted and can view the website, and says which of the two failed: `token` when Umami refuses the token, `website` when the token works but no website with that id is visible to it, `unreachable` for anything else. createBlueskySession function @spy4x/integrations Signs in with an app password. createChatClient function @spy4x/integrations Builds a client. createCoinGeckoRates function @spy4x/integrations Coin prices from CoinGecko's `GET /coins/{id}/history`, a snapshot at 00:00 UTC of the date asked. createDevtoArticle function @spy4x/integrations Posts `article` to Dev.to and returns its id and address. createExchangeRateApiRates function @spy4x/integrations Rates from exchangerate-api.com's history endpoint (`GET /v6/{key}/history/{base}/{year}/{month}/{day}`, Pro plan and above). createExponentialBackoff function @spy4x/integrations Deprecated: Thin wrapper over `backoffDelay` from "@spy4x/platform/universal/async", kept for this module's existing 1-based-attempt, `Retry-After`-aware call shape. Exponential backoff, clamped and optionally jittered. createFrankfurterRates function @spy4x/integrations Rates from Frankfurter v2 (`GET /v2/rates?date=&base="es=`), which needs no key. createUmamiLink function @spy4x/integrations Creates an Umami link and returns it. describeTransportError function @spy4x/integrations Describes a transport failure **without** the request URL. exchangeLinkedinCode function @spy4x/integrations Trades the callback's `code` for the member's tokens. findBlueskyPostByLink function @spy4x/integrations Finds the author's own post that links to `uri`, among the latest `maxPages` pages of their feed. findDevtoArticleByCanonical function @spy4x/integrations Finds the key owner's article whose `canonical_url` is `canonicalUrl`, published or not. findHackerNewsStoriesByUrl function @spy4x/integrations Lists the Hacker News stories whose address is `url`, ignoring the scheme, a trailing slash, the fragment and `utm_*` parameters, at most HACKERNEWS_SEARCH_LIMIT. findHashnodePostBySlug function @spy4x/integrations Finds the post with `slug` in a publication, given its host or id. findRedditPostsByUrl function @spy4x/integrations Lists the Reddit submissions of `url`, newest data Reddit has, at most REDDIT_INFO_LIMIT. healthchecksConfigFromEnv function @spy4x/integrations Reads a ping URL from an environment reader. isPermanentStatus function @spy4x/integrations Deprecated: No client in this package uses it; compare `status >= 400 && status < 500` in place. Statuses that will never succeed on a retry: the request itself is wrong. isRequestTimeout function @spy4x/integrations True when `cause` is the `TimeoutError` an `AbortSignal.timeout()` firing produces. isTransientStatus function @spy4x/integrations Statuses worth another attempt: rate limiting and upstream faults. linkedinAuthorizeUrl function @spy4x/integrations Builds the address that asks the member to sign in and grant `scopes`. ntfyConfigFromEnv function @spy4x/integrations Reads ntfy settings from an environment reader. parseRetryAfterMs function @spy4x/integrations Parses a `Retry-After` header. postBlueskyLink function @spy4x/integrations Posts `text` with a link card. postLinkedinShare function @spy4x/integrations Shares `link` with `commentary` on the member's own profile, visible to everyone. postMastodonStatus function @spy4x/integrations Posts a status and returns its id and address. publishHashnodePost function @spy4x/integrations Publishes a post to a Hashnode publication and returns its id and address. purgeUrls function @spy4x/integrations Purges `urls` from a Cloudflare zone, 30 per call, and reports the outcome. readBlueskyPostResults function @spy4x/integrations Reads a post's likes, replies, reposts and quotes from the public AppView. readDevtoArticleResults function @spy4x/integrations Reads how one of the key owner's articles did: views, reactions and comments. readHackerNewsItemResults function @spy4x/integrations Reads a Hacker News story's points and comment count. readHashnodePostResults function @spy4x/integrations Reads a post's views, reactions and comments, by its id or by its publication host and slug. readLinkedinMember function @spy4x/integrations Reads the signed-in member's id and author URN. readMastodonStatusResults function @spy4x/integrations Reads a status's favourites, reblogs and replies. readRedditPostResults function @spy4x/integrations Reads a Reddit post's comments, score and upvote ratio. readUmamiEventValues function @spy4x/integrations Reads how many custom events carried each value of one property, most first, such as the item of an `order-telegram` event (Umami's `GET /api/websites//event-data/values`). readUmamiMetrics function @spy4x/integrations Reads a breakdown of a website's period by `type`, largest first (Umami's `GET /api/websites//metrics`). readUmamiPageviews function @spy4x/integrations Reads page views and visitors per `unit` of a period, in `timezone` (Umami's `GET /api/websites//pageviews`). readUmamiStats function @spy4x/integrations Reads a website's totals over a period, and the same totals over the period of the same length just before it (Umami's `GET /api/websites//stats`). releaseResponseBody function @spy4x/integrations Releases a response's body without reading it. resolveBlueskyHandle function @spy4x/integrations Resolves a handle, such as `name.bsky.social`, to the account's DID. runWithRetry function @spy4x/integrations Runs `attempt` under `policy`. settle function @spy4x/integrations Consumes whatever a `Sleeper` returned. submitIndexNow function @spy4x/integrations Submits `urls` to IndexNow and reports the outcome. umamiLinkUrl function @spy4x/integrations The public address of a link: `/q/`, which counts the visit and redirects. uploadBlueskyBlob function @spy4x/integrations Uploads an image for a link card. verifyWebhookRequest function @spy4x/integrations Verifies one inbound delivery. withFallback function @spy4x/integrations One source made of several: each is asked in turn for the quotes still missing, and the rates are joined. BLUESKY_DEFAULT_SERVICE constant @spy4x/integrations/bluesky Where an account signs in when no `service` is given. BLUESKY_FEED_PAGES constant @spy4x/integrations/bluesky Feed pages findBlueskyPostByLink reads by default: the latest 1,000 posts. BLUESKY_MAX_GRAPHEMES constant @spy4x/integrations/bluesky The post lexicon's limit on `text`, in graphemes. BLUESKY_MAX_TEXT_BYTES constant @spy4x/integrations/bluesky The post lexicon's limit on `text`, in UTF-8 bytes. BLUESKY_MAX_THUMB_BYTES constant @spy4x/integrations/bluesky The largest image an external card's `thumb` takes. BLUESKY_PUBLIC_APPVIEW constant @spy4x/integrations/bluesky The public AppView, which answers reads without a token. BlueskyBlob interface @spy4x/integrations/bluesky An uploaded blob, as the protocol references it from a record. BlueskyBlobResult type @spy4x/integrations/bluesky Outcome of uploadBlueskyBlob. BlueskyFindResult type @spy4x/integrations/bluesky Outcome of findBlueskyPostByLink: `null` when none of the pages read has the link. BlueskyHandleResult type @spy4x/integrations/bluesky Outcome of resolveBlueskyHandle: the account's DID. BlueskyLinkCard interface @spy4x/integrations/bluesky The link card. BlueskyPostRef interface @spy4x/integrations/bluesky A post: its `at://` address, content id and public page. BlueskyPostResult type @spy4x/integrations/bluesky Outcome of postBlueskyLink. BlueskyPostResults interface @spy4x/integrations/bluesky ShareResults with Bluesky's own counts: likes are `reactions`, replies `comments`. BlueskyResultsResult type @spy4x/integrations/bluesky Outcome of readBlueskyPostResults. BlueskySession interface @spy4x/integrations/bluesky A signed-in account. BlueskySessionResult type @spy4x/integrations/bluesky Outcome of createBlueskySession. createBlueskySession function @spy4x/integrations/bluesky Signs in with an app password. findBlueskyPostByLink function @spy4x/integrations/bluesky Finds the author's own post that links to `uri`, among the latest `maxPages` pages of their feed. postBlueskyLink function @spy4x/integrations/bluesky Posts `text` with a link card. readBlueskyPostResults function @spy4x/integrations/bluesky Reads a post's likes, replies, reposts and quotes from the public AppView. resolveBlueskyHandle function @spy4x/integrations/bluesky Resolves a handle, such as `name.bsky.social`, to the account's DID. uploadBlueskyBlob function @spy4x/integrations/bluesky Uploads an image for a link card. CloudflarePurgeOptions interface @spy4x/integrations/cloudflare Options for purgeUrls. CloudflarePurgeResult interface @spy4x/integrations/cloudflare Outcome of a purge: `output` describes what happened on success, `error` on failure. PURGE_BATCH_SIZE constant @spy4x/integrations/cloudflare Cloudflare's purge-by-URL endpoint accepts at most this many files per call. purgeUrls function @spy4x/integrations/cloudflare Purges `urls` from a Cloudflare zone, 30 per call, and reports the outcome. DEVTO_MAX_PAGES constant @spy4x/integrations/devto Pages the lookup reads at most before it gives up, so a looping answer cannot run forever. DEVTO_MAX_TAGS constant @spy4x/integrations/devto The most tags Dev.to accepts on one article. DEVTO_PAGE_SIZE constant @spy4x/integrations/devto Articles asked for per page of the lookup: the API's documented maximum. DevtoArticleRef interface @spy4x/integrations/devto A Dev.to article: its numeric id and public address. DevtoClientOptions interface @spy4x/integrations/devto Settings both calls share. DevtoCreateResult type @spy4x/integrations/devto Outcome of createDevtoArticle: the new article on success, `error` on failure. DevtoFindResult type @spy4x/integrations/devto Outcome of findDevtoArticleByCanonical: the article, or `null` when none of the key's articles has that canonical address. DevtoResultsResult type @spy4x/integrations/devto Outcome of readDevtoArticleResults: the article's ShareResults (`score` is always `null`), or `null` when none of the key's articles has that id. createDevtoArticle function @spy4x/integrations/devto Posts `article` to Dev.to and returns its id and address. findDevtoArticleByCanonical function @spy4x/integrations/devto Finds the key owner's article whose `canonical_url` is `canonicalUrl`, published or not. readDevtoArticleResults function @spy4x/integrations/devto Reads how one of the key owner's articles did: views, reactions and comments. COINGECKO_COINS constant @spy4x/integrations/exchange-rates CoinGecko's ids of common coins, by code. CoinGeckoPlan type @spy4x/integrations/exchange-rates CoinGecko's plans differ in host and key header: the free Demo plan, or a paid one. ExchangeRateClientOptions interface @spy4x/integrations/exchange-rates Options every client takes. ExchangeRateSource interface @spy4x/integrations/exchange-rates A provider of daily exchange rates. FRANKFURTER_URL constant @spy4x/integrations/exchange-rates Frankfurter's public instance. FrankfurterSource interface @spy4x/integrations/exchange-rates Frankfurter's rates: a day, or every day of a range. Rates interface @spy4x/integrations/exchange-rates What a source found for one day. RatesError interface @spy4x/integrations/exchange-rates A failed call: which source, and why. RatesErrorCode type @spy4x/integrations/exchange-rates Why a call failed. RatesResult type @spy4x/integrations/exchange-rates Outcome of ExchangeRateSource.daily. createCoinGeckoRates function @spy4x/integrations/exchange-rates Coin prices from CoinGecko's `GET /coins/{id}/history`, a snapshot at 00:00 UTC of the date asked. createExchangeRateApiRates function @spy4x/integrations/exchange-rates Rates from exchangerate-api.com's history endpoint (`GET /v6/{key}/history/{base}/{year}/{month}/{day}`, Pro plan and above). createFrankfurterRates function @spy4x/integrations/exchange-rates Rates from Frankfurter v2 (`GET /v2/rates?date=&base="es=`), which needs no key. withFallback function @spy4x/integrations/exchange-rates One source made of several: each is asked in turn for the quotes still missing, and the rates are joined. HACKERNEWS_SEARCH_LIMIT constant @spy4x/integrations/hackernews Stories asked for per address search: plenty for one address, cheap to read. HackerNewsFindResult type @spy4x/integrations/hackernews Outcome of findHackerNewsStoriesByUrl; an empty list when nobody submitted it. HackerNewsResultsResult type @spy4x/integrations/hackernews Outcome of readHackerNewsItemResults; `output: null` when no such story is indexed. HackerNewsStoryRef interface @spy4x/integrations/hackernews A story that links to the address asked for. findHackerNewsStoriesByUrl function @spy4x/integrations/hackernews Lists the Hacker News stories whose address is `url`, ignoring the scheme, a trailing slash, the fragment and `utm_*` parameters, at most HACKERNEWS_SEARCH_LIMIT. readHackerNewsItemResults function @spy4x/integrations/hackernews Reads a Hacker News story's points and comment count. HASHNODE_API constant @spy4x/integrations/hashnode Hashnode's GraphQL endpoint. HASHNODE_MAX_TAGS constant @spy4x/integrations/hashnode The most tags Hashnode accepts on one post. HashnodeClientOptions interface @spy4x/integrations/hashnode Settings every call shares. HashnodeFindResult type @spy4x/integrations/hashnode Outcome of findHashnodePostBySlug; a failure never means "not found". HashnodePostRef interface @spy4x/integrations/hashnode A Hashnode post: its id and public address. HashnodePublicationRef type @spy4x/integrations/hashnode Which publication to look in: its host (`blog.example.com`) or its id. HashnodePublishResult type @spy4x/integrations/hashnode Outcome of publishHashnodePost. HashnodeResultsResult type @spy4x/integrations/hashnode Outcome of readHashnodePostResults: the post's ShareResults; `null` is a number Hashnode does not report. findHashnodePostBySlug function @spy4x/integrations/hashnode Finds the post with `slug` in a publication, given its host or id. publishHashnodePost function @spy4x/integrations/hashnode Publishes a post to a Hashnode publication and returns its id and address. readHashnodePostResults function @spy4x/integrations/hashnode Reads a post's views, reactions and comments, by its id or by its publication host and slug. HealthchecksClient class @spy4x/integrations/healthchecks healthchecks.io client. HealthchecksErrorCode type @spy4x/integrations/healthchecks Failure reasons `ping` can report. HealthchecksFailure interface @spy4x/integrations/healthchecks A ping that could not be delivered after retrying. HealthchecksOutcome enum @spy4x/integrations/healthchecks Which endpoint a ping targets. HealthchecksPing interface @spy4x/integrations/healthchecks One ping to send through HealthchecksClient.ping. HealthchecksResult type @spy4x/integrations/healthchecks Outcome of HealthchecksClient.ping. HealthchecksRetryOptions interface @spy4x/integrations/healthchecks Overrides for the client's default retry policy. HealthchecksSuccess interface @spy4x/integrations/healthchecks A ping that reached healthchecks.io and was accepted. healthchecksConfigFromEnv function @spy4x/integrations/healthchecks Reads a ping URL from an environment reader. INDEXNOW_MAX_URLS constant @spy4x/integrations/indexnow The most addresses IndexNow accepts in one submission. IndexNowOptions interface @spy4x/integrations/indexnow Options for submitIndexNow. IndexNowResult interface @spy4x/integrations/indexnow Outcome of a submission: `output` describes what happened on success, `error` on failure. submitIndexNow function @spy4x/integrations/indexnow Submits `urls` to IndexNow and reports the outcome. LINKEDIN_DEFAULT_SCOPES constant @spy4x/integrations/linkedin The scopes that sign a member in and let the app post as them. LINKEDIN_MAX_COMMENTARY constant @spy4x/integrations/linkedin The longest `commentary` LinkedIn accepts, in characters. LINKEDIN_VERSION constant @spy4x/integrations/linkedin The Posts API version sent by default, `YYYYMM`: the newest LinkedIn listed in 2026-10. LinkedinMember interface @spy4x/integrations/linkedin The signed-in member. LinkedinMemberOptions interface @spy4x/integrations/linkedin Settings the member's calls share. LinkedinMemberResult type @spy4x/integrations/linkedin Outcome of readLinkedinMember. LinkedinPostRef interface @spy4x/integrations/linkedin A LinkedIn post: its URN and public address. LinkedinShareLink interface @spy4x/integrations/linkedin The article a share links to. LinkedinShareResult type @spy4x/integrations/linkedin Outcome of postLinkedinShare. LinkedinTokens interface @spy4x/integrations/linkedin A member's tokens. LinkedinTokensResult type @spy4x/integrations/linkedin Outcome of exchangeLinkedinCode. exchangeLinkedinCode function @spy4x/integrations/linkedin Trades the callback's `code` for the member's tokens. linkedinAuthorizeUrl function @spy4x/integrations/linkedin Builds the address that asks the member to sign in and grant `scopes`. postLinkedinShare function @spy4x/integrations/linkedin Shares `link` with `commentary` on the member's own profile, visible to everyone. readLinkedinMember function @spy4x/integrations/linkedin Reads the signed-in member's id and author URN. ChatClient interface @spy4x/integrations/llm A configured client. ChatJsonRequest interface @spy4x/integrations/llm Options for chatJson. ChatJsonResult type @spy4x/integrations/llm Outcome of chatJson. ChatMessage interface @spy4x/integrations/llm One message of a conversation. LLM_DEFAULT_TIMEOUT_MS constant @spy4x/integrations/llm How long one call may take by default: a model can think for a while before it answers. LLM_PRESETS constant @spy4x/integrations/llm The OpenAI-compatible endpoints of OpenAI, DeepSeek, Google Gemini and a local Ollama. LlmEndpoint interface @spy4x/integrations/llm Where a provider's OpenAI-compatible API lives and how it differs from OpenAI's. LlmError interface @spy4x/integrations/llm A failed call. LlmErrorCode type @spy4x/integrations/llm Why a call failed. LlmUsage interface @spy4x/integrations/llm Token counts of one reply, as the provider billed them. SpendGuard interface @spy4x/integrations/llm The port an app implements to cap what it spends, for example over `@spy4x/server/quota`'s `QuotaMeter`. SpendRequest interface @spy4x/integrations/llm What a SpendGuard is asked to allow before a request is sent. chatJson function @spy4x/integrations/llm Asks the model for JSON and checks it with `schema`. createChatClient function @spy4x/integrations/llm Builds a client. MastodonClientOptions interface @spy4x/integrations/mastodon Settings both calls share. MastodonPostResult type @spy4x/integrations/mastodon Outcome of postMastodonStatus. MastodonResultsResult type @spy4x/integrations/mastodon Outcome of readMastodonStatusResults. MastodonStatusRef interface @spy4x/integrations/mastodon A posted status: its id on the instance and its public address. MastodonStatusResults interface @spy4x/integrations/mastodon ShareResults with Mastodon's own counts. MastodonVisibility type @spy4x/integrations/mastodon Who sees a status; Mastodon's four values. postMastodonStatus function @spy4x/integrations/mastodon Posts a status and returns its id and address. readMastodonStatusResults function @spy4x/integrations/mastodon Reads a status's favourites, reblogs and replies. NotificationSeverity enum @spy4x/integrations/ntfy Severity gate. NtfyClient class @spy4x/integrations/ntfy ntfy client. NtfyErrorCode type @spy4x/integrations/ntfy Failure reasons `push` can report. NtfyFailure interface @spy4x/integrations/ntfy A push that could not be delivered after retrying. NtfyPriority enum @spy4x/integrations/ntfy ntfy priority, 1 (min) to 5 (max). NtfyPush interface @spy4x/integrations/ntfy One notification to send through NtfyClient.push. NtfyPushed interface @spy4x/integrations/ntfy A push that reached ntfy and was accepted. NtfyResult type @spy4x/integrations/ntfy Outcome of NtfyClient.push. NtfyRetryOptions interface @spy4x/integrations/ntfy Overrides for the client's default retry policy. NtfySkipped interface @spy4x/integrations/ntfy A push that was never sent because its severity did not meet the gate. ntfyConfigFromEnv function @spy4x/integrations/ntfy Reads ntfy settings from an environment reader. MAX_PUSH_PAYLOAD_BYTES constant @spy4x/integrations/push The most bytes a message may take as JSON text in UTF-8; `send` refuses a longer one. PushDelivery interface @spy4x/integrations/push Outcome for one subscription. PushOptions interface @spy4x/integrations/push Delivery options of one send. PushSendResult interface @spy4x/integrations/push Outcome of WebPushSender.send; `success` is false when any delivery `failed`. PushSubscriptionStore interface @spy4x/integrations/push What the app implements over its own database. PushUrgency type @spy4x/integrations/push How urgently the push service should deliver (RFC 8030). VapidKeyPair interface @spy4x/integrations/push A VAPID key pair ready to store and to hand to a browser. VapidKeys interface @spy4x/integrations/push A VAPID key pair as two JWKs (ECDSA P-256). WebPushSender interface @spy4x/integrations/push Sends to every stored subscription of a user, or to one given subscription. createWebPushSender function @spy4x/integrations/push Builds a sender. generateVapidKeyPair function @spy4x/integrations/push Generates a VAPID key pair with WebCrypto (ECDSA P-256). vapidPublicKey function @spy4x/integrations/push The public key of stored VAPID keys, base64url, for the endpoint that serves it to browsers. DEFAULT_MAX_PUSH_SUBSCRIPTIONS_PER_USER constant @spy4x/integrations/push-file-store How many subscriptions one user keeps unless `maxPerUser` says otherwise. FilePushSubscriptionStore interface @spy4x/integrations/push-file-store A PushSubscriptionStore kept in one JSON file. FileStateSlot interface @spy4x/integrations/push-file-store One named value kept in the store's file; see FilePushSubscriptionStore.state. PushFileStoreError class @spy4x/integrations/push-file-store A failure of FilePushSubscriptionStore, safe to log: it carries no endpoint or key. PushFileStoreErrorCode type @spy4x/integrations/push-file-store Why a call on the store failed: the file cannot be read as this module's document (`corrupt`), or an argument was refused (`invalid-subscription`, `invalid-user`, `invalid-name`). createFilePushSubscriptionStore function @spy4x/integrations/push-file-store Builds the store. ReminderForPush interface @spy4x/integrations/push-reminders The parts of a `DueReminder` (`@spy4x/time/ical-tasks-reminders`) a push message is made of. createReminderNotify function @spy4x/integrations/push-reminders Builds the `notify` of a reminder runner: it pushes each reminder to every device of `userId`. reminderDeliveryOutcome function @spy4x/integrations/push-reminders What a sender's result means for a reminder runner: `"delivered"` when a device got the push, when there was no device, or when every device was gone and removed; `"retry"` when no device got it and a failure may pass later; `"drop"` when no device got it and every failure is for good. reminderPushMessage function @spy4x/integrations/push-reminders The push message of one reminder. REDDIT_INFO_LIMIT constant @spy4x/integrations/reddit Submissions asked for at most: the most one `info.json` page holds. RedditClientOptions interface @spy4x/integrations/reddit Settings both calls share. RedditFindResult type @spy4x/integrations/reddit Outcome of findRedditPostsByUrl; an empty list when nobody submitted the address. RedditPostRef interface @spy4x/integrations/reddit A submission that links to the address asked for. RedditPostResults interface @spy4x/integrations/reddit A post's ShareResults, plus the share of its votes that are upvotes (0 to 1). RedditResultsResult type @spy4x/integrations/reddit Outcome of readRedditPostResults; `output: null` when Reddit lists no such post. findRedditPostsByUrl function @spy4x/integrations/reddit Lists the Reddit submissions of `url`, newest data Reddit has, at most REDDIT_INFO_LIMIT. readRedditPostResults function @spy4x/integrations/reddit Reads a Reddit post's comments, score and upvote ratio. ShareResults interface @spy4x/integrations/share-results How one shared copy did. TELEGRAM_API_BASE_URL constant @spy4x/integrations/telegram Where the Bot API lives unless a config names a local Bot API server. TELEGRAM_RETRY_POLICY constant @spy4x/integrations/telegram Default retry policy: 3 attempts, 1s doubling, at most 30s per wait (Telegram's `retry_after` on a 429 is honoured up to that), 60s for the whole call, +/-20% jitter. TelegramAnswerCallbackQuery interface @spy4x/integrations/telegram Parameters of `answerCallbackQuery`, named as in the Bot API. TelegramBot class @spy4x/integrations/telegram Routes updates to handlers. TelegramBotCommand interface @spy4x/integrations/telegram One entry of the command menu. TelegramCallOptions interface @spy4x/integrations/telegram Per-call overrides for TelegramClient.call. TelegramCallbackQuery interface @spy4x/integrations/telegram A press on an inline keyboard button. TelegramChat interface @spy4x/integrations/telegram The chat a message belongs to. TelegramClient class @spy4x/integrations/telegram Calls the Telegram Bot API as one bot. TelegramContext interface @spy4x/integrations/telegram What a handler gets for one update. TelegramConversationControl interface @spy4x/integrations/telegram Starts and ends a conversation from inside a handler. TelegramConversationData type @spy4x/integrations/telegram A conversation's saved answers. TelegramConversationStore type @spy4x/integrations/telegram Where conversation state lives: the get, set-with-expiry and delete of an `ICacheStorage`. TelegramEditMessageText interface @spy4x/integrations/telegram Parameters of `editMessageText`, named as in the Bot API. TelegramErrorCode type @spy4x/integrations/telegram Why a call failed. TelegramFailure interface @spy4x/integrations/telegram The call failed; `message` is Telegram's `description` when it sent one. TelegramHandler type @spy4x/integrations/telegram Handles one update. TelegramInlineButton interface @spy4x/integrations/telegram One inline keyboard button: it sends `callback_data` back to the bot, or opens `url`. TelegramInlineKeyboard interface @spy4x/integrations/telegram Buttons under a message, as rows. TelegramMessage interface @spy4x/integrations/telegram A message, with the fields a bot routes on. TelegramPollingOptions interface @spy4x/integrations/telegram Options of pollTelegramUpdates. TelegramResult type @spy4x/integrations/telegram What a TelegramClient call resolves with. TelegramSendMessage interface @spy4x/integrations/telegram Parameters of `sendMessage`, named as in the Bot API. TelegramSetWebhook interface @spy4x/integrations/telegram Parameters of `setWebhook`, named as in the Bot API. TelegramStepHandler type @spy4x/integrations/telegram Handles one answer inside a conversation step. TelegramStepResult type @spy4x/integrations/telegram What a step returns: the next step and the data so far, `{ done: true }`, or nothing to stay. TelegramSuccess interface @spy4x/integrations/telegram Telegram accepted the call. TelegramUpdate interface @spy4x/integrations/telegram One update. TelegramUser interface @spy4x/integrations/telegram A Telegram user or bot. TelegramWebhookOptions interface @spy4x/integrations/telegram Options of createTelegramWebhookHandler. createTelegramWebhookHandler function @spy4x/integrations/telegram Builds a webhook endpoint: `(request) => response`, for any server that speaks `Request`. parseTelegramUpdate function @spy4x/integrations/telegram Checks an untrusted value against TelegramUpdate. pollTelegramUpdates function @spy4x/integrations/telegram Long polling for development, where Telegram cannot reach a webhook. UMAMI_FILTER_NAMES constant @spy4x/integrations/umami The filters Umami's website reports take. UMAMI_LINK_NAME_MAX constant @spy4x/integrations/umami Umami's limits for a link: a name of 100 characters, a url of 500, a slug of 8 to 100. UMAMI_LINK_URL_MAX constant @spy4x/integrations/umami UMAMI_METRIC_TYPES constant @spy4x/integrations/umami What a breakdown can count by, in Umami's names. UMAMI_SERIES_UNITS constant @spy4x/integrations/umami The units a series can step by. UMAMI_SLUG_PATTERN constant @spy4x/integrations/umami A slug this client sends: 8 to 100 letters, digits, `-` and `_`, so it is safe in a path. UmamiCheckResult interface @spy4x/integrations/umami Outcome of checkUmami: `output` says what was seen on success, `error` on failure. UmamiConnection interface @spy4x/integrations/umami Where an Umami instance is, and how to reach it. UmamiFilterName type @spy4x/integrations/umami One of UMAMI_FILTER_NAMES. UmamiLink interface @spy4x/integrations/umami A link as Umami stores it. UmamiLinkCreateOptions interface @spy4x/integrations/umami Options for createUmamiLink. UmamiLinkResult type @spy4x/integrations/umami Outcome of createUmamiLink: the link on success, why not on failure. UmamiMetric interface @spy4x/integrations/umami One row of a breakdown: a value (`x`, such as a path or an event name) and its count (`y`). UmamiMetricType type @spy4x/integrations/umami One of UMAMI_METRIC_TYPES: page views and visits by these, events by `event`. UmamiPageviews interface @spy4x/integrations/umami UmamiSeries, with the previous period's when `compare` was asked for. UmamiPoint interface @spy4x/integrations/umami One point of a series: the start of its unit as Umami prints it (`x`), and a count (`y`). UmamiPropertyValue interface @spy4x/integrations/umami How many events carried one value of a property. UmamiReadResult type @spy4x/integrations/umami Outcome of a read. UmamiSeries interface @spy4x/integrations/umami Page views and visitors per unit of time. UmamiStats interface @spy4x/integrations/umami UmamiTotals of the period and of the period of the same length just before it. UmamiTotals interface @spy4x/integrations/umami A website's totals over a period: Umami's `/stats`. UmamiWebsiteCheck type @spy4x/integrations/umami Outcome of checkUmamiWebsite. UmamiWebsiteProblem type @spy4x/integrations/umami Why checkUmamiWebsite failed: `settings` for options that cannot work (no `http`/`https` base address, an empty token, a bad timeout), `website` for a website id that is no UUID or that the token cannot see, `token` for a token Umami refuses, `unreachable` for anything else. UmamiWebsiteRead interface @spy4x/integrations/umami What every read of a website's numbers needs. checkUmami function @spy4x/integrations/umami Asks Umami's `GET /api/heartbeat` whether the instance answers. checkUmamiWebsite function @spy4x/integrations/umami Checks that the token is accepted and can view the website, and says which of the two failed: `token` when Umami refuses the token, `website` when the token works but no website with that id is visible to it, `unreachable` for anything else. createUmamiLink function @spy4x/integrations/umami Creates an Umami link and returns it. readUmamiEventValues function @spy4x/integrations/umami Reads how many custom events carried each value of one property, most first, such as the item of an `order-telegram` event (Umami's `GET /api/websites//event-data/values`). readUmamiMetrics function @spy4x/integrations/umami Reads a breakdown of a website's period by `type`, largest first (Umami's `GET /api/websites//metrics`). readUmamiPageviews function @spy4x/integrations/umami Reads page views and visitors per `unit` of a period, in `timezone` (Umami's `GET /api/websites//pageviews`). readUmamiStats function @spy4x/integrations/umami Reads a website's totals over a period, and the same totals over the period of the same length just before it (Umami's `GET /api/websites//stats`). umamiLinkUrl function @spy4x/integrations/umami The public address of a link: `/q/`, which counts the visit and redirects. CombinedSignatureHeader interface @spy4x/integrations/webhooks One header that carries the timestamp and the signatures together, as a list of `key=value` pairs: Stripe's `Stripe-Signature: t=1492774577,v1=5257…,v0=6ffb…` is `{ name: "Stripe-Signature", pairSeparator: ",", timestampKey: "t", signatureKey: "v1" }`. WebhookRejectReason type @spy4x/integrations/webhooks Why a delivery was rejected. WebhookVerifierConfig interface @spy4x/integrations/webhooks Shared secret and header names verifyWebhookRequest needs to check a delivery. WebhookVerifyResult type @spy4x/integrations/webhooks Result of verifyWebhookRequest: the verified body, or why it was rejected. verifyWebhookRequest function @spy4x/integrations/webhooks Verifies one inbound delivery. ALLOWED_PROTOCOLS constant @spy4x/net Protocols `normalizeUrlShape` accepts; anything else is rejected. AddressRecordType type @spy4x/net The address record types a lookup asks for. BodyReadErrorCode enum @spy4x/net Finite failure kinds a bounded read can raise. BodyReadOptions interface @spy4x/net Per-call overrides for a bounded body read. BodyReadTimeoutError class @spy4x/net No chunk arrived within the stall budget. BodySource interface @spy4x/net The read surface shared by `Request` and `Response`. CLOUDFLARE_IP_RANGES constant @spy4x/net Cloudflare's published edge ranges, IPv4 then IPv6, from https://www.cloudflare.com/ips-v4 and https://www.cloudflare.com/ips-v6 as of 2026-09-26. CREDENTIAL_HEADERS constant @spy4x/net Request headers that must not follow a redirect to another origin. DEFAULT_BODY_TIMEOUT_MS constant @spy4x/net Default stall budget: 10s without a chunk. DEFAULT_MAX_BYTES constant @spy4x/net Default ceiling for a body read: 5 MiB. DEFAULT_MAX_REDIRECTS constant @spy4x/net Redirects followed before the chain is refused. DEFAULT_TIMEOUT_MS constant @spy4x/net Total budget for the whole redirect chain. DENY_NET_ADDRESSES constant @spy4x/net Addresses to refuse at connection time, in the spelling `--deny-net` takes. DnsLookupOptions interface @spy4x/net Options of one DNS lookup. DnsResolutionError class @spy4x/net DNS lookup failure — either the resolver threw or it returned no records. DnsResolver interface @spy4x/net Resolves a hostname to all A/AAAA addresses. EXPLICIT_SCHEME constant @spy4x/net Any `scheme:` prefix, with or without `//`, so `javascript:` is caught too. Fetcher interface @spy4x/net The seam that keeps this module off the network in tests. INVALID_CHARACTERS constant @spy4x/net Whitespace and control characters that make a URL input invalid. NormalizeUrlShapeResult type @spy4x/net Outcome of normalizeUrlShape. PLAIN_HOSTNAME constant @spy4x/net Deprecated: Nothing in this library uses it; write the pattern where it is needed. A hostname that is a plain DNS label run: no `:`, no brackets, no dots. ParsedIp interface @spy4x/net An address that parseIp accepted. PayloadTooLargeError class @spy4x/net Body exceeded the byte cap. SafeFetchMethod enum @spy4x/net Request methods a redirect is allowed to carry unchanged. SafeFetchResult interface @spy4x/net Successful outcome of safeFetch. UNKNOWN_DEVICE constant @spy4x/net The name of a device whose user agent says nothing this module recognises. UrlPolicyErrorCode type @spy4x/net Machine-readable rejection reason. UrlShapeError interface @spy4x/net Rejected input, with the reason a caller can branch on. UrlShapeErrorCode type @spy4x/net Machine-readable rejection reason. UrlShapeOk interface @spy4x/net Accepted input, normalised. UrlValidationError class @spy4x/net A URL rejected by the policy, with a stable code a caller can branch on. defaultFetcher constant @spy4x/net Fetcher backed by the platform `fetch`. defaultResolver constant @spy4x/net The production resolver: system A **and** AAAA lookups, both required. denyNetFlag function @spy4x/net `DENY_NET_ADDRESSES` as the command-line flag that applies them. detectScheme function @spy4x/net Split an explicit `scheme:` prefix off the raw input. deviceName function @spy4x/net A short name a person recognises their device by, such as "Firefox on Linux" or "Safari on iPhone". ipHint function @spy4x/net The address with only its network part shown, for display in a list of signed-in devices: the first three parts of an IPv4 address (`203.0.113.*`) or the first two groups of an IPv6 one (`2001:db8:*`). ipInRanges function @spy4x/net True when `ip` lies inside at least one of `cidrs`. isLocalHostname function @spy4x/net True if the hostname is a special-use name that resolves locally. isLoopbackHost function @spy4x/net True when `host` names the machine itself the way a browser decides it: `localhost`, any name under `.localhost`, an address in `127.0.0.0/8`, or `::1`. isPublicAddress function @spy4x/net True if `addr` is a globally routable IPv4 or IPv6 address. isPublicIpv4 function @spy4x/net True if `addr` is a globally routable IPv4 address. isPublicIpv6 function @spy4x/net True if the IPv6 address (with optional embedded IPv4) is globally routable. isUrlShapeOk function @spy4x/net Deprecated: Read `result.ok` instead: it narrows the result the same way. Narrow a `normalizeUrlShape` result to its success branch. normalizeIp function @spy4x/net The canonical spelling of `input` (parseIp), or `null` when it is not an address. normalizeUrlShape function @spy4x/net Normalise the shape of a user-entered URL. parseBoundedFormData function @spy4x/net Parse a `multipart/form-data` (or url-encoded) request body under the same cap and stall budget as `readBoundedBody`. parseIp function @spy4x/net Parse one IPv4 or IPv6 address. parseIpv6Groups function @spy4x/net Parse an IPv6 address into 8 groups of 16-bit unsigned ints. readBoundedBody function @spy4x/net Read a body into bytes under the hard cap and stall budget. readBoundedJson function @spy4x/net Read a body as JSON under the same cap and stall budget as `readBoundedText`. readBoundedText function @spy4x/net Read a body as text, decoding incrementally so the cap is enforced before the whole payload is materialised as one string. readContentLength function @spy4x/net Read the declared `Content-Length`, if the sender provided a usable one. resolveDns function @spy4x/net The addresses of `hostname`'s `A` or `AAAA` records: `Deno.resolveDns` on Deno, `node:dns/promises` on Node and Bun. resolveTxt function @spy4x/net `hostname`'s `TXT` records, one array per record holding its strings as they came, unjoined: `Deno.resolveDns(hostname, "TXT")` on Deno, `node:dns/promises` on Node and Bun, which answer in that same shape. safeFetch function @spy4x/net Fetch a URL following redirects manually, validating each `Location` through the public-URL policy. safeRedirectPath function @spy4x/net The path to send a person to next: `value` when it is a path on this origin, `fallback` otherwise. validatePublicUrl function @spy4x/net Validate a URL and return the canonical form. BodyReadErrorCode enum @spy4x/net/bounded-body Finite failure kinds a bounded read can raise. BodyReadOptions interface @spy4x/net/bounded-body Per-call overrides for a bounded body read. BodyReadTimeoutError class @spy4x/net/bounded-body No chunk arrived within the stall budget. BodySource interface @spy4x/net/bounded-body The read surface shared by `Request` and `Response`. DEFAULT_BODY_TIMEOUT_MS constant @spy4x/net/bounded-body Default stall budget: 10s without a chunk. DEFAULT_MAX_BYTES constant @spy4x/net/bounded-body Default ceiling for a body read: 5 MiB. PayloadTooLargeError class @spy4x/net/bounded-body Body exceeded the byte cap. parseBoundedFormData function @spy4x/net/bounded-body Parse a `multipart/form-data` (or url-encoded) request body under the same cap and stall budget as `readBoundedBody`. readBoundedBody function @spy4x/net/bounded-body Read a body into bytes under the hard cap and stall budget. readBoundedJson function @spy4x/net/bounded-body Read a body as JSON under the same cap and stall budget as `readBoundedText`. readBoundedText function @spy4x/net/bounded-body Read a body as text, decoding incrementally so the cap is enforced before the whole payload is materialised as one string. readContentLength function @spy4x/net/bounded-body Read the declared `Content-Length`, if the sender provided a usable one. AddressRecordType type @spy4x/net/dns The address record types a lookup asks for. DnsLookupOptions interface @spy4x/net/dns Options of one DNS lookup. resolveDns function @spy4x/net/dns The addresses of `hostname`'s `A` or `AAAA` records: `Deno.resolveDns` on Deno, `node:dns/promises` on Node and Bun. resolveTxt function @spy4x/net/dns `hostname`'s `TXT` records, one array per record holding its strings as they came, unjoined: `Deno.resolveDns(hostname, "TXT")` on Deno, `node:dns/promises` on Node and Bun, which answer in that same shape. CLOUDFLARE_IP_RANGES constant @spy4x/net/ip Cloudflare's published edge ranges, IPv4 then IPv6, from https://www.cloudflare.com/ips-v4 and https://www.cloudflare.com/ips-v6 as of 2026-09-26. ParsedIp interface @spy4x/net/ip An address that parseIp accepted. ipHint function @spy4x/net/ip The address with only its network part shown, for display in a list of signed-in devices: the first three parts of an IPv4 address (`203.0.113.*`) or the first two groups of an IPv6 one (`2001:db8:*`). ipInRanges function @spy4x/net/ip True when `ip` lies inside at least one of `cidrs`. isLoopbackHost function @spy4x/net/ip True when `host` names the machine itself the way a browser decides it: `localhost`, any name under `.localhost`, an address in `127.0.0.0/8`, or `::1`. normalizeIp function @spy4x/net/ip The canonical spelling of `input` (parseIp), or `null` when it is not an address. parseIp function @spy4x/net/ip Parse one IPv4 or IPv6 address. safeRedirectPath function @spy4x/net/redirect-path The path to send a person to next: `value` when it is a path on this origin, `fallback` otherwise. CREDENTIAL_HEADERS constant @spy4x/net/safe-fetch Request headers that must not follow a redirect to another origin. DEFAULT_MAX_REDIRECTS constant @spy4x/net/safe-fetch Redirects followed before the chain is refused. DEFAULT_TIMEOUT_MS constant @spy4x/net/safe-fetch Total budget for the whole redirect chain. Fetcher interface @spy4x/net/safe-fetch The seam that keeps this module off the network in tests. SafeFetchMethod enum @spy4x/net/safe-fetch Request methods a redirect is allowed to carry unchanged. SafeFetchResult interface @spy4x/net/safe-fetch Successful outcome of safeFetch. defaultFetcher constant @spy4x/net/safe-fetch Fetcher backed by the platform `fetch`. safeFetch function @spy4x/net/safe-fetch Fetch a URL following redirects manually, validating each `Location` through the public-URL policy. DENY_NET_ADDRESSES constant @spy4x/net/url-policy Addresses to refuse at connection time, in the spelling `--deny-net` takes. DnsResolutionError class @spy4x/net/url-policy DNS lookup failure — either the resolver threw or it returned no records. DnsResolver interface @spy4x/net/url-policy Resolves a hostname to all A/AAAA addresses. HTTP_OPTION_MESSAGE constant @spy4x/net/url-policy Message used when `allowHttp: false` rejects an `http:` URL. NormalizeUrlShapeResult type @spy4x/net/url-policy Outcome of normalizeUrlShape. UrlPolicyErrorCode type @spy4x/net/url-policy Machine-readable rejection reason. UrlShapeError interface @spy4x/net/url-policy Rejected input, with the reason a caller can branch on. UrlShapeOk interface @spy4x/net/url-policy Accepted input, normalised. UrlValidationError class @spy4x/net/url-policy A URL rejected by the policy, with a stable code a caller can branch on. defaultResolver constant @spy4x/net/url-policy The production resolver: system A **and** AAAA lookups, both required. denyNetFlag function @spy4x/net/url-policy `DENY_NET_ADDRESSES` as the command-line flag that applies them. isLocalHostname function @spy4x/net/url-policy True if the hostname is a special-use name that resolves locally. isPublicAddress function @spy4x/net/url-policy True if `addr` is a globally routable IPv4 or IPv6 address. isPublicIpv4 function @spy4x/net/url-policy True if `addr` is a globally routable IPv4 address. isPublicIpv6 function @spy4x/net/url-policy True if the IPv6 address (with optional embedded IPv4) is globally routable. normalizeUrlShape function @spy4x/net/url-policy Normalise the shape of a user-entered URL. parseIpv6Groups function @spy4x/net/url-policy Parse an IPv6 address into 8 groups of 16-bit unsigned ints. validatePublicUrl function @spy4x/net/url-policy Validate a URL and return the canonical form. ALLOWED_PROTOCOLS constant @spy4x/net/url-shape Protocols `normalizeUrlShape` accepts; anything else is rejected. EMPTY_MESSAGE constant @spy4x/net/url-shape Message for UrlShapeErrorCode `"empty"`. EXPLICIT_SCHEME constant @spy4x/net/url-shape Any `scheme:` prefix, with or without `//`, so `javascript:` is caught too. INVALID_CHARACTERS constant @spy4x/net/url-shape Whitespace and control characters that make a URL input invalid. INVALID_CHARACTERS_MESSAGE constant @spy4x/net/url-shape Message for the control-character case of UrlShapeErrorCode `"invalid_format"`. INVALID_FORMAT_MESSAGE constant @spy4x/net/url-shape Message for UrlShapeErrorCode `"invalid_format"`. NormalizeUrlShapeResult type @spy4x/net/url-shape Outcome of normalizeUrlShape. PLAIN_HOSTNAME constant @spy4x/net/url-shape Deprecated: Nothing in this library uses it; write the pattern where it is needed. A hostname that is a plain DNS label run: no `:`, no brackets, no dots. UNSUPPORTED_PROTOCOL_MESSAGE constant @spy4x/net/url-shape Message for UrlShapeErrorCode `"unsupported_protocol"`. UrlShapeError interface @spy4x/net/url-shape Rejected input, with the reason a caller can branch on. UrlShapeErrorCode type @spy4x/net/url-shape Machine-readable rejection reason. UrlShapeOk interface @spy4x/net/url-shape Accepted input, normalised. detectScheme function @spy4x/net/url-shape Split an explicit `scheme:` prefix off the raw input. isUrlShapeOk function @spy4x/net/url-shape Deprecated: Read `result.ok` instead: it narrows the result the same way. Narrow a `normalizeUrlShape` result to its success branch. normalizeUrlShape function @spy4x/net/url-shape Normalise the shape of a user-entered URL. UNKNOWN_DEVICE constant @spy4x/net/user-agent The name of a device whose user agent says nothing this module recognises. deviceName function @spy4x/net/user-agent A short name a person recognises their device by, such as "Firefox on Linux" or "Safari on iPhone". AnyError type @spy4x/platform Every error Result can carry. AsyncMutex class @spy4x/platform A fair mutual-exclusion lock for async critical sections. BackoffJitterMode type @spy4x/platform How backoffDelay spreads a capped delay. BlogPost interface @spy4x/platform What blogPostingJsonLd describes. BlogPostingJsonLd interface @spy4x/platform A schema.org `BlogPosting` node. BoundedIntegerOptions interface @spy4x/platform Options of parseBoundedInteger. BreadcrumbListItem interface @spy4x/platform A schema.org `ListItem` as it appears inside a `BreadcrumbList`. BreadcrumbListJsonLd interface @spy4x/platform A schema.org `BreadcrumbList` node. Clock interface @spy4x/platform Injectable time source, so formatting and relative times are testable without a frozen host. CommandEnvelope interface @spy4x/platform Outcome of a command: what it produced, or why it failed. ConnectionError interface @spy4x/platform The request never reached the server. Crumb interface @spy4x/platform One entry in the breadcrumb trail a page declares. DAYS_IN_MONTH constant @spy4x/platform Days in one nominal month. DAYS_IN_WEEK constant @spy4x/platform Days in one week. DAYS_OF_WEEK constant @spy4x/platform Weekday names indexed Monday-first, matching getDaysOfWeek's bitmask order. DEFAULT_DEBOUNCE_DELAY constant @spy4x/platform Default trailing-edge debounce delay, in milliseconds. DEFAULT_FLUSH_INTERVAL_MS constant @spy4x/platform Default window for the throttled JSON saver, in milliseconds. DayOfWeek type @spy4x/platform Weekday identifier, Monday-first. Debounced interface @spy4x/platform Trailing-edge debounce. ERR_MESSAGE constant @spy4x/platform Canonical copy for each category, so the same failure reads the same in every product. EntryMatch interface @spy4x/platform How well a query matched one entry. Err interface @spy4x/platform Base shape every error shares: a category and human-readable copy. ErrType enum @spy4x/platform Kind of a failed operation. ErrorEventTarget interface @spy4x/platform The target of `install`: `window`, or anything with `addEventListener`. ErrorReporter interface @spy4x/platform What `createErrorReporter` returns. FaqItem interface @spy4x/platform One question and its answer, as a page shows them. FaqPageJsonLd interface @spy4x/platform A schema.org `FAQPage` node. FaqQuestionJsonLd interface @spy4x/platform A schema.org `Question` inside an `FAQPage`. HONEYPOT_FIELD_NAME constant @spy4x/platform Default `name` of the honeypot field. HOURS_IN_DAY constant @spy4x/platform Hours in one day. InferSchema type @spy4x/platform Value a schema accepts and produces. ItemListJsonLd interface @spy4x/platform A schema.org `ItemList` of the items a category or catalog page links to. JsonLdBlog interface @spy4x/platform The blog a post belongs to, described in full so the post's page stands alone. JsonLdPerson interface @spy4x/platform A person named as a post's author, or as its publisher. JsonLdPersonNode interface @spy4x/platform A schema.org `Person` or `Organization` node, or a reference to one by `@id`. KeyValueStore interface @spy4x/platform Minimal synchronous key/value port: the subset of the DOM `Storage` interface a caller needs to persist a small value, and the one shape `@spy4x/platform/browser/storage`'s `StorageLike` and `@spy4x/realtime`'s `KeyValueStore` both alias. LlmsTxtDocument interface @spy4x/platform What an `llms.txt` says: the site's name, a one-paragraph summary and its sections. LlmsTxtLink interface @spy4x/platform One link in an `llms.txt` section. LlmsTxtSection interface @spy4x/platform One `## Section` of an `llms.txt` and its links. MAX_MASKED_EMAIL_LENGTH constant @spy4x/platform Longest text maskEmail returns, in UTF-16 code units: one code point (at most two units), the three stars, `@`, and a domain of at most 253. MAX_TICKS constant @spy4x/platform Hard ceiling on generated ticks, and on the iterations the tick loop may spend producing them — see the doc of `ticksForStep` (the private loop behind ticks and stepAxis) for why the loop needs its own bound, not just the output's. MILLISECONDS_IN_SECOND constant @spy4x/platform Milliseconds in one second. MINUTES_IN_HOUR constant @spy4x/platform Minutes in one hour. MIN_PASSWORD_LENGTH constant @spy4x/platform Minimum accepted password length. MONTHS_IN_YEAR constant @spy4x/platform Months in one year. NowFn type @spy4x/platform Monotonic millisecond clock, function-shaped rather than object-shaped — the home for the `() => number` clock shape, which cannot be merged into Clock without breaking a 1.x caller of one shape or the other. ONE_DAY_IN_MILLISECONDS constant @spy4x/platform One day, in milliseconds. ONE_DAY_IN_SECONDS constant @spy4x/platform One day, in seconds. ONE_HOUR_IN_MILLISECONDS constant @spy4x/platform One hour, in milliseconds. ONE_HOUR_IN_SECONDS constant @spy4x/platform One hour, in seconds. ONE_MINUTE_IN_MILLISECONDS constant @spy4x/platform One minute, in milliseconds. ONE_MONTH_IN_MILLISECONDS constant @spy4x/platform One month (30 days), in milliseconds. ONE_MONTH_IN_SECONDS constant @spy4x/platform One month (30 days), in seconds. ONE_WEEK_IN_MILLISECONDS constant @spy4x/platform One week, in milliseconds. ONE_WEEK_IN_SECONDS constant @spy4x/platform One week, in seconds. ONE_YEAR_IN_MILLISECONDS constant @spy4x/platform One year (12 nominal months), in milliseconds. ONE_YEAR_IN_SECONDS constant @spy4x/platform One year (12 nominal months), in seconds. OfferJsonLd interface @spy4x/platform A schema.org `Offer` for one item, new, sold by the page's shop. OperationResult type @spy4x/platform Result of an operation that can fail: exactly one of `result` / `error` is non-null. OperationState interface @spy4x/platform In-flight state of an operation, for a store or a form to render. OtherError interface @spy4x/platform An error this package has no category for. ParsedDsn interface @spy4x/platform Where a report goes: the envelope URL and the public key a DSN carries. PayloadError interface @spy4x/platform A payload a schema rejected: a response body, or a remote feed item. ProductGroupJsonLd interface @spy4x/platform A schema.org `ProductGroup` node: an item whose page offers several variants. ProductJsonLd interface @spy4x/platform A schema.org `Product` node: an item with no variants, or one variant of a group. ProductPage interface @spy4x/platform What productJsonLd describes: one item page, with or without variants. ProductVariant interface @spy4x/platform One variant of a product, such as one colour in one size, selectable on the product's page. QuickAddDue interface @spy4x/platform When the task is due: a calendar date in the given time zone, and a wall-clock time if typed. QuickAddOptions interface @spy4x/platform Options of parseQuickAdd. QuickAddPriority enum @spy4x/platform Task priority. QuickAddResult interface @spy4x/platform The result of parseQuickAdd. QuickAddSpan interface @spy4x/platform One recognised token, as a half-open range of UTF-16 offsets into the original line. QuickAddSpanKind enum @spy4x/platform What a recognised token is. RandomSource type @spy4x/platform A source of numbers in `[0, 1)`, the shape `Math.random` has. ReportContext interface @spy4x/platform Extra facts one report may carry. RequestError type @spy4x/platform Errors a request itself can produce. ResponseError type @spy4x/platform Errors from a response that never reached a usable body. Result type @spy4x/platform A value or an error, as a discriminated union on `ok`. RssChannel interface @spy4x/platform The feed itself: what an RSS reader shows as the source of the items. RssItem interface @spy4x/platform One post in an RSS feed. SECONDS_IN_MINUTE constant @spy4x/platform Seconds in one minute. SearchEntry interface @spy4x/platform Something searchEntries can find: a label and, optionally, other names for it. SearchMatch interface @spy4x/platform One result of searchEntries. SearchMatchKind type @spy4x/platform How a query matched an entry, from the strongest to the weakest: ServerError interface @spy4x/platform The server answered with a failure status. SitemapAlternate interface @spy4x/platform One language version of a page in a `sitemap.xml`. SitemapEntry interface @spy4x/platform One page in a `sitemap.xml`. SortDirection type @spy4x/platform Sort direction of one rule. SortRule interface @spy4x/platform One column in the sort order. StepAxis interface @spy4x/platform Bounds rounded outward to multiples of a step, and the ticks between them. StoreError type @spy4x/platform Every error a store operation can settle with. TimeFormatOptions interface @spy4x/platform Locale and zone applied by formatTime and timeAgo. TimeFormatter class @spy4x/platform Format an instant for display. UUID_PATTERN constant @spy4x/platform A lower-case UUID of any version, the form Postgres and the browser's own generator print. UUID_V7_PATTERN constant @spy4x/platform A lower-case UUID of version 7, as uuidV7 makes it: version digit `7` and the standard variant (`8`, `9`, `a` or `b`). UnsafeTextOptions interface @spy4x/platform Options of hasUnsafeTextCharacters. UuidVersion type @spy4x/platform The version digit of a UUID: `4` is the random one, `7` the time-ordered one. ValidationError type @spy4x/platform A rejected input: its kind, one sentence for the user, the issues per field path, and arktype's own errors. asciiSlug function @spy4x/platform A slug of only `a-z`, digits and single dashes, for an address that refuses other scripts. backoffDelay function @spy4x/platform Caps a raw delay and jitters it: the exponential-backoff arithmetic shared by `integrations/retry.ts`'s `createExponentialBackoff` (symmetric jitter around the capped delay) and `realtime/backoff.ts`'s `nextBackoffDelay` (jitter that only ever shortens the wait). blogPostingJsonLd function @spy4x/platform The schema.org `BlogPosting` node for one post, with the fields Google reads for an article: `headline`, `image`, `datePublished`, `dateModified`, `author` and `publisher`, plus `mainEntityOfPage`, `articleSection`, `inLanguage`, `timeRequired` and `isPartOf`. breadcrumbItems function @spy4x/platform `itemListElement` for a schema.org `BreadcrumbList`, built from the crumbs the caller stated. breadcrumbListJsonLd function @spy4x/platform The complete `BreadcrumbList` node, `@id`-anchored to the page it describes. canonicalUrl function @spy4x/platform Parse a canonical address into the normalised `URL` that will be published. commandErr function @spy4x/platform Build the failure arm of a CommandEnvelope. commandFromError function @spy4x/platform Build a CommandEnvelope from a thrown error, keeping the stack out of the payload. commandOk function @spy4x/platform Build the success arm of a CommandEnvelope. connectionError function @spy4x/platform Wrap a message the caller already has into a ConnectionError. convertToKebabCase function @spy4x/platform Convert a free-form identifier to kebab-case. createErrorReporter function @spy4x/platform Creates the reporter. cyrillicToLatin function @spy4x/platform Folded text with each Cyrillic letter spelled in Latin letters: `ж` becomes `zh`, `щ` becomes `shch`, and `ь` and `ъ` disappear. debounce function @spy4x/platform Wrap `fn` in a trailing-edge debounce. err function @spy4x/platform Wrap a failure. faqPageJsonLd function @spy4x/platform The `FAQPage` node for the questions a page shows, in the order it shows them. filterRows function @spy4x/platform Keep the rows that every word of the query matches. fold function @spy4x/platform Fold text for matching: accents removed and lower-cased. formatBytes function @spy4x/platform A byte count for display, in binary (1024) steps: `"512 B"`, `"1.5 KB"`, `"2 MB"`. formatDecimal function @spy4x/platform Format a decimal number to exactly two decimal places. formatPct function @spy4x/platform Format a fraction in `0..1` as a percentage string with two decimals. formatTime function @spy4x/platform One-off TimeFormatter#format on the host clock. getDaysOfWeek function @spy4x/platform Read a weekday bitmask into day names. hasUnsafeTextCharacters function @spy4x/platform Whether text a person typed holds one of a fixed list of characters that a display name must not: control characters, which a database may refuse, and the common invisible and text-direction characters. hasUnstorableTextCharacters function @spy4x/platform Whether text holds a character that no database text column can store and give back unchanged: NUL (U+0000) or a lone surrogate, which is half of a surrogate pair without its other half. honeypotFilled function @spy4x/platform Whether a submitted honeypot field carries a value — a person never types into a field they cannot see, so any value here means whatever posted the form was not one. idleOperationState function @spy4x/platform Idle state of an operation. initials function @spy4x/platform Reduce a name to one or two initials, e.g. for an avatar's fallback face. isRecord function @spy4x/platform True for a plain keyed object: not `null`, not an array. isSilentError function @spy4x/platform Whether an error should stay quiet. isUuid function @spy4x/platform True for a lower-case UUID string. isValidDate function @spy4x/platform Whether the input is a usable date: a `Date` or an ISO `YYYY-MM-DD`-prefixed string that `Date` can parse. itemListJsonLd function @spy4x/platform The `ItemList` node for a category or catalog page: one `ListItem` per item, with its 1-based `position` and the absolute `url` of the item's own page, in the order the page shows them. jsonLdText function @spy4x/platform Serialise JSON-LD for a `