/** * `@estiva-app/interop` — render and act on another app's objects. * * An app publishes a NIP-89 `kind:31990` manifest saying how its objects should * be projected: which slots matter, what its statuses mean, what another app * may do to them. This resolves that manifest and hands a consumer something it * can draw, **without the consumer knowing anything about the owning app**. * * The governing rule, and the reason the package is small: * **the owner defines the projection, the consumer decides how it looks.** * Nothing here returns layout, and nothing here should ever grow a rule about a * particular app. * * ## What is not here, deliberately * * **No fold.** Manifest semantics are normative; an app's interpretation of its * own records is not. `records` tells a consumer how to fold, and folding is the * consumer's business — see the Estiva SPEC §10 on why two apps are *supposed* * to be able to differ there. * * **No rendering.** Not a React dependency, not a component. Slots come back as * values with enough shape to draw, and every consumer draws them in its own * design language. A package that shipped a widget would be specifying the UI * of every app that installed it, which is the objection that rules out * iframes. */ export { resolveManifest, resolveActingManifest, resolveForeignObject, resolveForeignObjects, resolveForeignRoots, projectEvents, resolveParents, resolveForeignEvent, resolveFolderProject, resolveFolderContents, listFolders, topLevelFolders, ARCHIVED_FIELD, SUMMARY_FIELD, isArchived, archivedAncestorOf, isClosedStatus, archiveImpact, type Archive, type ArchiveImpact, type ArchiveReadOptions, KIND_FOLDER_STATE, KIND_CHANNEL_METADATA, KIND_BARE_FILE, KIND_MESSAGE, MOVED_TO_TAG, BARE_FILE_MANIFEST_ADDRESS, FOLDER_ACTIONS_ADDRESS, ASPECTS, type Aspect, commentKindsOf, conversationCountsOf, conversationsOf, type ConversationMessage, threadsOf, type Threads, CONVERSATION_LIMIT, buildActionEvent, buildActionEvents, type ActionEventArgs, pickWidget, widgetChainProblem, actionProblems, folderOf, MIN_ACTION_DESCRIPTION, CLOSED_WIDGETS, contentFormatOf, BODY_SLOT, CONTENT_FORMAT_TAG, BLOCK_DOCUMENT_FORMAT, type ContentFormat, peopleViaRelay, createProjectionCache, createPeopleCache, MANIFEST_TTL_MS, PROFILE_HIT_TTL_MS, PROFILE_MISS_TTL_MS, type PeopleCache, type PeopleCacheOptions, type ProjectionCache, type ResolvedManifest, type QueryFn, type PeopleFn, type People, type ForeignObject, type FolderProject, type FolderContents, type FolderSummary, type ResolvedSlot, type ResolvedAction, type ActionFormField, type ProseFormat, type ManifestAction, type ActionEffect, ACTION_EFFECTS, type UnsignedActionEvent, } from './projection.js' /** * SPEC §6.7's nesting, drawn from one Folder listing: roots, children, * breadcrumbs and move targets, with cycles cut. No requests. */ export { nestingOf, type Nestable, type Nesting } from './nesting.js' /** * The files `[` offers (PEE-21): resolved objects as rows, and typed text as * the search tier, both folded to the current title. conversation ranks them. */ export { fileCandidates, REFERENCE_FILE_TYPES, searchFileReferences, type FileCandidatesOptions, type SearchFileReferencesOptions, } from './references.js' /** * SPEC §3.3's Folder operations as unsigned events in publish order — create, * rename, archive, delete, place, unlist, move. Where a `kind:1852` is sent, * `hasState` comes from the caller, because one against a group with no state * empties it. No signing, no requests. */ export { planCreateFolder, planRenameFolder, planDeleteFolder, planPlaceFile, planUnlistFile, planMoveFile, planMoveFromFolders, planArchiveFolder, listedBeneath, type FolderRef, type MovableFile, type MovePlan, type MoveFromFoldersPlan, type MoveRefusal, } from './folders.js' /** * RFC 0.5 §7's URL grammar — how an object is named in an address bar, and how * a pasted link is matched back to one. * * Separate from the projection surface above because it answers a different * question: those resolve an object you already hold, these turn a string * somebody pasted into one you can hold. */ export { slugify, objectRef, identifierFromRef, eventIdFromRef, urlPatternsOf, matchObjectUrl, blockUrlOf, type UrlPattern, type MatchedObjectUrl, } from './objectUrl.js'