{"schema":"singularity.world.v1","version":"1","components":{"schema":"singularity.component-runtime.v1","version":"1","id":"798bd1da6ffad92c","packs":[{"schema":"singularity.component-pack.v1","namespace":"lucide","version":"1.24.0","runtime":"1","exposure":"qualified","contentAddress":"1057765fb41ac2f9","components":[{"name":"lucide__Activity","id":"lucide@1.24.0:Activity"},{"name":"lucide__Archive","id":"lucide@1.24.0:Archive"},{"name":"lucide__ArrowDown","id":"lucide@1.24.0:ArrowDown"},{"name":"lucide__ArrowLeft","id":"lucide@1.24.0:ArrowLeft"},{"name":"lucide__ArrowRight","id":"lucide@1.24.0:ArrowRight"},{"name":"lucide__ArrowRightLeft","id":"lucide@1.24.0:ArrowRightLeft"},{"name":"lucide__ArrowUp","id":"lucide@1.24.0:ArrowUp"},{"name":"lucide__ArrowUpRight","id":"lucide@1.24.0:ArrowUpRight"},{"name":"lucide__AtSign","id":"lucide@1.24.0:AtSign"},{"name":"lucide__BadgeCheck","id":"lucide@1.24.0:BadgeCheck"},{"name":"lucide__Banknote","id":"lucide@1.24.0:Banknote"},{"name":"lucide__Battery","id":"lucide@1.24.0:Battery"},{"name":"lucide__Bell","id":"lucide@1.24.0:Bell"},{"name":"lucide__BellOff","id":"lucide@1.24.0:BellOff"},{"name":"lucide__BellRing","id":"lucide@1.24.0:BellRing"},{"name":"lucide__Bold","id":"lucide@1.24.0:Bold"},{"name":"lucide__Book","id":"lucide@1.24.0:Book"},{"name":"lucide__Bookmark","id":"lucide@1.24.0:Bookmark"},{"name":"lucide__BookOpen","id":"lucide@1.24.0:BookOpen"},{"name":"lucide__Bot","id":"lucide@1.24.0:Bot"},{"name":"lucide__Bug","id":"lucide@1.24.0:Bug"},{"name":"lucide__Calendar","id":"lucide@1.24.0:Calendar"},{"name":"lucide__CalendarDays","id":"lucide@1.24.0:CalendarDays"},{"name":"lucide__Camera","id":"lucide@1.24.0:Camera"},{"name":"lucide__ChartArea","id":"lucide@1.24.0:ChartArea"},{"name":"lucide__ChartBar","id":"lucide@1.24.0:ChartBar"},{"name":"lucide__ChartColumn","id":"lucide@1.24.0:ChartColumn"},{"name":"lucide__ChartLine","id":"lucide@1.24.0:ChartLine"},{"name":"lucide__ChartPie","id":"lucide@1.24.0:ChartPie"},{"name":"lucide__Check","id":"lucide@1.24.0:Check"},{"name":"lucide__CheckCheck","id":"lucide@1.24.0:CheckCheck"},{"name":"lucide__ChevronDown","id":"lucide@1.24.0:ChevronDown"},{"name":"lucide__ChevronLeft","id":"lucide@1.24.0:ChevronLeft"},{"name":"lucide__ChevronRight","id":"lucide@1.24.0:ChevronRight"},{"name":"lucide__ChevronsLeftRight","id":"lucide@1.24.0:ChevronsLeftRight"},{"name":"lucide__ChevronUp","id":"lucide@1.24.0:ChevronUp"},{"name":"lucide__Circle","id":"lucide@1.24.0:Circle"},{"name":"lucide__CircleAlert","id":"lucide@1.24.0:CircleAlert"},{"name":"lucide__CircleCheck","id":"lucide@1.24.0:CircleCheck"},{"name":"lucide__CircleDashed","id":"lucide@1.24.0:CircleDashed"},{"name":"lucide__CirclePlay","id":"lucide@1.24.0:CirclePlay"},{"name":"lucide__CircleQuestionMark","id":"lucide@1.24.0:CircleQuestionMark"},{"name":"lucide__CircleUser","id":"lucide@1.24.0:CircleUser"},{"name":"lucide__CircleX","id":"lucide@1.24.0:CircleX"},{"name":"lucide__Clipboard","id":"lucide@1.24.0:Clipboard"},{"name":"lucide__ClipboardCheck","id":"lucide@1.24.0:ClipboardCheck"},{"name":"lucide__Clock","id":"lucide@1.24.0:Clock"},{"name":"lucide__Cloud","id":"lucide@1.24.0:Cloud"},{"name":"lucide__CloudDownload","id":"lucide@1.24.0:CloudDownload"},{"name":"lucide__CloudUpload","id":"lucide@1.24.0:CloudUpload"},{"name":"lucide__Code","id":"lucide@1.24.0:Code"},{"name":"lucide__CodeXml","id":"lucide@1.24.0:CodeXml"},{"name":"lucide__Cog","id":"lucide@1.24.0:Cog"},{"name":"lucide__Columns3","id":"lucide@1.24.0:Columns3"},{"name":"lucide__Compass","id":"lucide@1.24.0:Compass"},{"name":"lucide__Copy","id":"lucide@1.24.0:Copy"},{"name":"lucide__Cpu","id":"lucide@1.24.0:Cpu"},{"name":"lucide__CreditCard","id":"lucide@1.24.0:CreditCard"},{"name":"lucide__Database","id":"lucide@1.24.0:Database"},{"name":"lucide__Disc","id":"lucide@1.24.0:Disc"},{"name":"lucide__DollarSign","id":"lucide@1.24.0:DollarSign"},{"name":"lucide__Dot","id":"lucide@1.24.0:Dot"},{"name":"lucide__Download","id":"lucide@1.24.0:Download"},{"name":"lucide__Ellipsis","id":"lucide@1.24.0:Ellipsis"},{"name":"lucide__EllipsisVertical","id":"lucide@1.24.0:EllipsisVertical"},{"name":"lucide__Expand","id":"lucide@1.24.0:Expand"},{"name":"lucide__ExternalLink","id":"lucide@1.24.0:ExternalLink"},{"name":"lucide__Eye","id":"lucide@1.24.0:Eye"},{"name":"lucide__EyeOff","id":"lucide@1.24.0:EyeOff"},{"name":"lucide__FastForward","id":"lucide@1.24.0:FastForward"},{"name":"lucide__File","id":"lucide@1.24.0:File"},{"name":"lucide__FilePlus","id":"lucide@1.24.0:FilePlus"},{"name":"lucide__Files","id":"lucide@1.24.0:Files"},{"name":"lucide__FileText","id":"lucide@1.24.0:FileText"},{"name":"lucide__Film","id":"lucide@1.24.0:Film"},{"name":"lucide__Flag","id":"lucide@1.24.0:Flag"},{"name":"lucide__Folder","id":"lucide@1.24.0:Folder"},{"name":"lucide__FolderOpen","id":"lucide@1.24.0:FolderOpen"},{"name":"lucide__FolderPlus","id":"lucide@1.24.0:FolderPlus"},{"name":"lucide__Funnel","id":"lucide@1.24.0:Funnel"},{"name":"lucide__Gauge","id":"lucide@1.24.0:Gauge"},{"name":"lucide__Gift","id":"lucide@1.24.0:Gift"},{"name":"lucide__Globe","id":"lucide@1.24.0:Globe"},{"name":"lucide__Grid3x3","id":"lucide@1.24.0:Grid3x3"},{"name":"lucide__GripHorizontal","id":"lucide@1.24.0:GripHorizontal"},{"name":"lucide__GripVertical","id":"lucide@1.24.0:GripVertical"},{"name":"lucide__HardDrive","id":"lucide@1.24.0:HardDrive"},{"name":"lucide__Hash","id":"lucide@1.24.0:Hash"},{"name":"lucide__Headphones","id":"lucide@1.24.0:Headphones"},{"name":"lucide__Heart","id":"lucide@1.24.0:Heart"},{"name":"lucide__House","id":"lucide@1.24.0:House"},{"name":"lucide__IdCard","id":"lucide@1.24.0:IdCard"},{"name":"lucide__Image","id":"lucide@1.24.0:Image"},{"name":"lucide__Images","id":"lucide@1.24.0:Images"},{"name":"lucide__Inbox","id":"lucide@1.24.0:Inbox"},{"name":"lucide__Info","id":"lucide@1.24.0:Info"},{"name":"lucide__Italic","id":"lucide@1.24.0:Italic"},{"name":"lucide__Kanban","id":"lucide@1.24.0:Kanban"},{"name":"lucide__Key","id":"lucide@1.24.0:Key"},{"name":"lucide__KeyRound","id":"lucide@1.24.0:KeyRound"},{"name":"lucide__LayoutDashboard","id":"lucide@1.24.0:LayoutDashboard"},{"name":"lucide__LayoutGrid","id":"lucide@1.24.0:LayoutGrid"},{"name":"lucide__LifeBuoy","id":"lucide@1.24.0:LifeBuoy"},{"name":"lucide__Link","id":"lucide@1.24.0:Link"},{"name":"lucide__List","id":"lucide@1.24.0:List"},{"name":"lucide__ListChecks","id":"lucide@1.24.0:ListChecks"},{"name":"lucide__ListFilter","id":"lucide@1.24.0:ListFilter"},{"name":"lucide__LoaderCircle","id":"lucide@1.24.0:LoaderCircle"},{"name":"lucide__Lock","id":"lucide@1.24.0:Lock"},{"name":"lucide__LockOpen","id":"lucide@1.24.0:LockOpen"},{"name":"lucide__LogIn","id":"lucide@1.24.0:LogIn"},{"name":"lucide__LogOut","id":"lucide@1.24.0:LogOut"},{"name":"lucide__Mail","id":"lucide@1.24.0:Mail"},{"name":"lucide__MailOpen","id":"lucide@1.24.0:MailOpen"},{"name":"lucide__Map","id":"lucide@1.24.0:Map"},{"name":"lucide__MapPin","id":"lucide@1.24.0:MapPin"},{"name":"lucide__Maximize","id":"lucide@1.24.0:Maximize"},{"name":"lucide__Maximize2","id":"lucide@1.24.0:Maximize2"},{"name":"lucide__Megaphone","id":"lucide@1.24.0:Megaphone"},{"name":"lucide__Menu","id":"lucide@1.24.0:Menu"},{"name":"lucide__MessageCircle","id":"lucide@1.24.0:MessageCircle"},{"name":"lucide__MessageSquare","id":"lucide@1.24.0:MessageSquare"},{"name":"lucide__MessagesSquare","id":"lucide@1.24.0:MessagesSquare"},{"name":"lucide__Mic","id":"lucide@1.24.0:Mic"},{"name":"lucide__MicOff","id":"lucide@1.24.0:MicOff"},{"name":"lucide__Minimize","id":"lucide@1.24.0:Minimize"},{"name":"lucide__Minimize2","id":"lucide@1.24.0:Minimize2"},{"name":"lucide__Minus","id":"lucide@1.24.0:Minus"},{"name":"lucide__Monitor","id":"lucide@1.24.0:Monitor"},{"name":"lucide__Moon","id":"lucide@1.24.0:Moon"},{"name":"lucide__Move","id":"lucide@1.24.0:Move"},{"name":"lucide__Music","id":"lucide@1.24.0:Music"},{"name":"lucide__Navigation","id":"lucide@1.24.0:Navigation"},{"name":"lucide__OctagonAlert","id":"lucide@1.24.0:OctagonAlert"},{"name":"lucide__Package","id":"lucide@1.24.0:Package"},{"name":"lucide__PackageOpen","id":"lucide@1.24.0:PackageOpen"},{"name":"lucide__Palette","id":"lucide@1.24.0:Palette"},{"name":"lucide__PanelLeft","id":"lucide@1.24.0:PanelLeft"},{"name":"lucide__Paperclip","id":"lucide@1.24.0:Paperclip"},{"name":"lucide__Pause","id":"lucide@1.24.0:Pause"},{"name":"lucide__Pencil","id":"lucide@1.24.0:Pencil"},{"name":"lucide__Percent","id":"lucide@1.24.0:Percent"},{"name":"lucide__Phone","id":"lucide@1.24.0:Phone"},{"name":"lucide__PhoneCall","id":"lucide@1.24.0:PhoneCall"},{"name":"lucide__Play","id":"lucide@1.24.0:Play"},{"name":"lucide__Plug","id":"lucide@1.24.0:Plug"},{"name":"lucide__Plus","id":"lucide@1.24.0:Plus"},{"name":"lucide__Power","id":"lucide@1.24.0:Power"},{"name":"lucide__Printer","id":"lucide@1.24.0:Printer"},{"name":"lucide__QrCode","id":"lucide@1.24.0:QrCode"},{"name":"lucide__Quote","id":"lucide@1.24.0:Quote"},{"name":"lucide__Radio","id":"lucide@1.24.0:Radio"},{"name":"lucide__Receipt","id":"lucide@1.24.0:Receipt"},{"name":"lucide__Redo","id":"lucide@1.24.0:Redo"},{"name":"lucide__RefreshCw","id":"lucide@1.24.0:RefreshCw"},{"name":"lucide__Rewind","id":"lucide@1.24.0:Rewind"},{"name":"lucide__RotateCcw","id":"lucide@1.24.0:RotateCcw"},{"name":"lucide__RotateCw","id":"lucide@1.24.0:RotateCw"},{"name":"lucide__Rows3","id":"lucide@1.24.0:Rows3"},{"name":"lucide__Rss","id":"lucide@1.24.0:Rss"},{"name":"lucide__Save","id":"lucide@1.24.0:Save"},{"name":"lucide__Scan","id":"lucide@1.24.0:Scan"},{"name":"lucide__Search","id":"lucide@1.24.0:Search"},{"name":"lucide__Send","id":"lucide@1.24.0:Send"},{"name":"lucide__Server","id":"lucide@1.24.0:Server"},{"name":"lucide__Settings","id":"lucide@1.24.0:Settings"},{"name":"lucide__Share2","id":"lucide@1.24.0:Share2"},{"name":"lucide__Shield","id":"lucide@1.24.0:Shield"},{"name":"lucide__ShieldCheck","id":"lucide@1.24.0:ShieldCheck"},{"name":"lucide__ShoppingBag","id":"lucide@1.24.0:ShoppingBag"},{"name":"lucide__ShoppingCart","id":"lucide@1.24.0:ShoppingCart"},{"name":"lucide__Shrink","id":"lucide@1.24.0:Shrink"},{"name":"lucide__SkipBack","id":"lucide@1.24.0:SkipBack"},{"name":"lucide__SkipForward","id":"lucide@1.24.0:SkipForward"},{"name":"lucide__SlidersHorizontal","id":"lucide@1.24.0:SlidersHorizontal"},{"name":"lucide__Smartphone","id":"lucide@1.24.0:Smartphone"},{"name":"lucide__Sparkles","id":"lucide@1.24.0:Sparkles"},{"name":"lucide__Square","id":"lucide@1.24.0:Square"},{"name":"lucide__SquarePen","id":"lucide@1.24.0:SquarePen"},{"name":"lucide__Star","id":"lucide@1.24.0:Star"},{"name":"lucide__Store","id":"lucide@1.24.0:Store"},{"name":"lucide__Sun","id":"lucide@1.24.0:Sun"},{"name":"lucide__Table","id":"lucide@1.24.0:Table"},{"name":"lucide__Tablet","id":"lucide@1.24.0:Tablet"},{"name":"lucide__Tag","id":"lucide@1.24.0:Tag"},{"name":"lucide__Tags","id":"lucide@1.24.0:Tags"},{"name":"lucide__Target","id":"lucide@1.24.0:Target"},{"name":"lucide__Terminal","id":"lucide@1.24.0:Terminal"},{"name":"lucide__ThumbsDown","id":"lucide@1.24.0:ThumbsDown"},{"name":"lucide__ThumbsUp","id":"lucide@1.24.0:ThumbsUp"},{"name":"lucide__Timer","id":"lucide@1.24.0:Timer"},{"name":"lucide__Trash","id":"lucide@1.24.0:Trash"},{"name":"lucide__TrendingDown","id":"lucide@1.24.0:TrendingDown"},{"name":"lucide__TrendingUp","id":"lucide@1.24.0:TrendingUp"},{"name":"lucide__TriangleAlert","id":"lucide@1.24.0:TriangleAlert"},{"name":"lucide__Truck","id":"lucide@1.24.0:Truck"},{"name":"lucide__Type","id":"lucide@1.24.0:Type"},{"name":"lucide__Undo","id":"lucide@1.24.0:Undo"},{"name":"lucide__Upload","id":"lucide@1.24.0:Upload"},{"name":"lucide__User","id":"lucide@1.24.0:User"},{"name":"lucide__UserCheck","id":"lucide@1.24.0:UserCheck"},{"name":"lucide__UserPlus","id":"lucide@1.24.0:UserPlus"},{"name":"lucide__Users","id":"lucide@1.24.0:Users"},{"name":"lucide__UserX","id":"lucide@1.24.0:UserX"},{"name":"lucide__Video","id":"lucide@1.24.0:Video"},{"name":"lucide__VideoOff","id":"lucide@1.24.0:VideoOff"},{"name":"lucide__Volume1","id":"lucide@1.24.0:Volume1"},{"name":"lucide__Volume2","id":"lucide@1.24.0:Volume2"},{"name":"lucide__VolumeX","id":"lucide@1.24.0:VolumeX"},{"name":"lucide__Wallet","id":"lucide@1.24.0:Wallet"},{"name":"lucide__Wifi","id":"lucide@1.24.0:Wifi"},{"name":"lucide__WifiOff","id":"lucide@1.24.0:WifiOff"},{"name":"lucide__Wrench","id":"lucide@1.24.0:Wrench"},{"name":"lucide__X","id":"lucide@1.24.0:X"},{"name":"lucide__Zap","id":"lucide@1.24.0:Zap"}],"accessibility":{"standard":"WCAG-2.2-AA","evidence":["decorative SVG roots are aria-hidden and non-focusable","icons inherit currentColor and use the ordinary SSR/hydration component path"]},"provenance":{"source":"lucide-static generated frozen geometry","review":"generated ledger plus Singularity component-pack validation"}}]},"behaviors":{"schema":"singularity.behavior-runtime.v1","version":"1","id":"b8f3c579eab7ef67","packs":[{"schema":"singularity.behavior-pack.v1","namespace":"singularity.behaviors","version":"1.0.0","runtime":"1","exposure":"builtin-bare","contractAddress":"21122b718944c21b","behaviors":[{"name":"autoFocus","id":"singularity.behaviors@1.0.0:autoFocus"},{"name":"clickOutside","id":"singularity.behaviors@1.0.0:clickOutside"},{"name":"delay","id":"singularity.behaviors@1.0.0:delay"},{"name":"draggable","id":"singularity.behaviors@1.0.0:draggable"},{"name":"dropTarget","id":"singularity.behaviors@1.0.0:dropTarget"},{"name":"escapeToClose","id":"singularity.behaviors@1.0.0:escapeToClose"},{"name":"fileDrop","id":"singularity.behaviors@1.0.0:fileDrop"},{"name":"focusTrap","id":"singularity.behaviors@1.0.0:focusTrap"},{"name":"inView","id":"singularity.behaviors@1.0.0:inView"},{"name":"keyNav","id":"singularity.behaviors@1.0.0:keyNav"},{"name":"listTypeahead","id":"singularity.behaviors@1.0.0:listTypeahead"},{"name":"menuSurface","id":"singularity.behaviors@1.0.0:menuSurface"},{"name":"modalSurface","id":"singularity.behaviors@1.0.0:modalSurface"},{"name":"multilineSubmit","id":"singularity.behaviors@1.0.0:multilineSubmit"},{"name":"pinToBottom","id":"singularity.behaviors@1.0.0:pinToBottom"}],"contracts":{"autoFocus":{"desc":"focus the host element on mount (or the first descendant matching `target`) — the canonical opened-modal / revealed-input focus","params":{"target":{"type":"string","desc":"a CSS selector for the descendant to focus; omit to focus the host","required":false}}},"clickOutside":{"desc":"dispatch `action` when a pointerdown lands OUTSIDE the host — the canonical close-on-click-away for modals/popovers","params":{"action":{"type":"actions","desc":"the declarative action to dispatch (e.g. { op: 'set', path: 'open', value: false })"}}},"delay":{"desc":"dispatch required `action` once after the host element has remained mounted for `ms` milliseconds (a number or a {{ }} read resolved at mount); use for declarative auto-dismiss/timeout UI, and key or conditionally remount the region when the timer should restart","params":{"ms":{"type":"number","desc":"delay in milliseconds before dispatching the action; omitted/invalid/negative values normalize to 0","default":0},"action":{"type":"actions","desc":"required declarative action dispatched through the normal action path after the delay"}}},"draggable":{"desc":"make the host an HTML5 drag source: on dragstart its resolved `payload` becomes the live drag, readable by every dropTarget's onDrop as {{ drag.<field> }} — pair with dropTarget for move/reorder UIs","params":{"payload":{"type":"object","desc":"the drag identity — fields may interpolate against the node's scope (e.g. { id: \"{{ ev.id }}\" })","default":{}},"onDragStart":{"type":"actions","desc":"an optional action dispatched when the drag begins ({ drag } in scope)","required":false}}},"dropTarget":{"desc":"accept live drags (HTML5 drop): permits dragover while a drag is live and dispatches `onDrop` with the dragged payload in scope — read it via {{ drag.<field> }}; `onDragEnter`/`onDragLeave` are the hover affordance (highlight the cell under the drag), dispatched transiently (never an undo step) with the same { drag } scope","params":{"onDrop":{"type":"actions","desc":"the action dispatched on drop (e.g. { op: \"updateWhere\", path: \"events\", id: \"{{ drag.id }}\", field: \"date\", value: \"{{ cell.iso }}\" })"},"onDragEnter":{"type":"actions","desc":"an optional TRANSIENT action when a live drag first crosses into the host (e.g. { op: \"set\", path: \"dragOver\", value: \"{{ cell.iso }}\" }) — pair with a conditional style entry for the highlight","required":false},"onDragLeave":{"type":"actions","desc":"an optional TRANSIENT action when the drag leaves, drops, or ends (e.g. { op: \"set\", path: \"dragOver\", value: \"\" }) — clears the highlight; never an undo step","required":false}}},"escapeToClose":{"desc":"dispatch `action` on an Escape keydown on the host — the canonical modal/popover dismissal","params":{"action":{"type":"actions","desc":"the declarative action to dispatch on Escape"}}},"fileDrop":{"desc":"accept files dragged from the OS onto the host and dispatch `onDrop` with the files riding the host file channel — map it to an asset binding's upload intent (e.g. { call: \"photos.upload\", path: \"draft.photo\" }), exactly like a file input's change; `onDragEnter`/`onDragLeave` are the transient dropzone highlight","params":{"onDrop":{"type":"actions","desc":"the action dispatched on a file drop — the dropped files reach the intent, never manifest state"},"onDragEnter":{"type":"actions","desc":"an optional TRANSIENT action when a file drag first crosses into the host (light the dropzone)","required":false},"onDragLeave":{"type":"actions","desc":"an optional TRANSIENT action when the drag leaves, drops, or ends (clear the highlight)","required":false}}},"focusTrap":{"desc":"keep Tab/Shift+Tab cycling within the host's focusable descendants (wraps at the ends) — the open-modal keyboard contract; compose with autoFocus and escapeToClose on the same panel","params":{}},"inView":{"desc":"dispatch `action` each time the host scrolls into view (leaving re-arms it) — the infinite-scroll sentinel / lazy-section primitive; `margin` (e.g. '300px') triggers before it is visible, `once: true` fires a single time","params":{"action":{"type":"actions","desc":"the declarative action dispatched on entering view (e.g. a paged binding's { call: \"<binding>.more\" })"},"once":{"type":"boolean","desc":"disconnect after the first fire","default":false},"margin":{"type":"string","desc":"widen the trigger box (IntersectionObserver rootMargin)","default":"0px"},"threshold":{"type":"number","desc":"visible fraction (0..1) that counts as in view","default":0}}},"keyNav":{"desc":"orientation-aware arrow/home/end/page roving focus across the host's descendants matching `itemSelector`; indices clamp at the ends","params":{"itemSelector":{"type":"string","desc":"the CSS selector for navigable items","default":"[role='option']"},"onMove":{"type":"actions","desc":"an optional action dispatched per move with { nav: { index } } in scope","required":false},"pageSize":{"type":"number","desc":"rows jumped by PageUp/PageDown","default":10},"orientation":{"type":"string","desc":"arrow-key axis: vertical (default), horizontal, or both","default":"vertical"}}},"listTypeahead":{"desc":"type-to-jump across the host's descendants matching `itemSelector`: printable keys build a prefix query (reset after `resetMs` of quiet) and focus the first item whose text starts with it — the long-listbox companion of keyNav","params":{"itemSelector":{"type":"string","desc":"the CSS selector for jumpable items","default":"[role='option']"},"onMove":{"type":"actions","desc":"an optional action dispatched per jump with { nav: { index } } in scope","required":false},"resetMs":{"type":"number","desc":"quiet milliseconds before the typed query resets","default":500}}},"menuSurface":{"desc":"own an always-mounted, root-scoped non-modal action menu: open from its trigger, focus/rove/typeahead items, activate once on Enter/Space, close on selection/Escape/Tab/outside/focus-leave, and return focus only when dismissal still belongs to the menu","params":{"open":{"type":"boolean","desc":"whether the conditionally authored surface is currently mounted","default":false},"openAction":{"type":"actions","desc":"required action that opens the surface; receives {{ menu.reason }} and {{ menu.focus }}"},"closeAction":{"type":"actions","desc":"required action that closes the surface; receives {{ menu.reason }}"},"trigger":{"type":"string","desc":"selector for the menu button within the anchor or its Document/ShadowRoot"},"surface":{"type":"string","desc":"selector for the conditionally mounted menu surface within the anchor or its Document/ShadowRoot"},"itemSelector":{"type":"string","desc":"selector for focusable action items inside the surface","default":"[role='menuitem']:not([aria-disabled='true'])"},"initialFocus":{"type":"string","desc":"optional selector within the surface to focus on open; defaults to the first item, then the surface","required":false}}},"modalSurface":{"desc":"own a complete, root-scoped modal surface: only the topmost nested modal is aria-modal and owns keyboard/programmatic focus plus Escape/outside dismissal; capture/restore the invoker, isolate siblings, and clean up page scroll","params":{"action":{"type":"actions","desc":"required declarative close action; may read {{ modal.reason }} as escape or outside"},"surface":{"type":"string","desc":"selector for the dialog panel inside the host; omit when the host is the panel","required":false},"initialFocus":{"type":"string","desc":"selector, within the surface, for the element focused on open; omit to focus the surface","required":false},"dismissOutside":{"type":"boolean","desc":"whether a pointer press outside the surface dispatches action","default":true},"restoreFocus":{"type":"boolean","desc":"whether cleanup restores the still-connected invoker when focus remained in the modal","default":true},"inertBackground":{"type":"boolean","desc":"whether sibling regions of the modal host become inert for the mount lifetime","default":true},"lockScroll":{"type":"boolean","desc":"whether document scrolling is locked for the mount lifetime","default":true}}},"multilineSubmit":{"desc":"submit a multiline composer through the ordinary action lane: plain Enter when enabled by the author, Cmd/Ctrl+Enter on every surface, Shift+Enter/newline and IME composition untouched","params":{"action":{"type":"actions","desc":"required declarative submit action; may read {{ submit.shortcut }} as enter or modifier-enter"},"enabled":{"type":"boolean","desc":"whether a qualifying key may submit and be consumed","default":true},"submitOnEnter":{"type":"boolean","desc":"whether plain Enter submits; Cmd/Ctrl+Enter is always available while enabled","default":true}}},"pinToBottom":{"desc":"own chronological conversation scrolling: start at the latest content; follow growth only while near the bottom; preserve the viewport when stable `itemSelector` entries are prepended; and reveal the author-supplied `newUpdatesSelector` return control for live growth while the reader is away","params":{"enabled":{"type":"boolean","desc":"whether this scroll region currently has chronological conversation semantics","default":true},"streamKey":{"type":"string","desc":"optional stable conversation/live-stream identity; changing it rotates the behavior mount so the new stream starts at its own latest content","required":false},"threshold":{"type":"number","desc":"how close (px) to the bottom still counts as following — growth re-pins only within it","default":80},"itemSelector":{"type":"string","desc":"optional selector for stable chronological entries; earlier entries inserted before the first known match preserve scroll position","required":false},"newUpdatesSelector":{"type":"string","desc":"optional selector for an initially hidden, accessible control inside the scroll region; live growth reveals it and activation returns to the latest content","required":false}}}},"provenance":{"source":"@manifest-ui/singularity-standard","review":"package source and canonical behavior conformance"}}]},"vocabulary":{"schema":"singularity.vocabulary-runtime.v1","version":"1","id":"b57015e16d61c6db","packs":[{"schema":"singularity.vocabulary-pack.v1","namespace":"singularity.core","version":"1.0.0","runtime":"1","exposure":"builtin-bare","contractAddress":"680f7d0750bfdd19","helpers":[],"operations":[{"name":"choose","id":"singularity.core@1.0.0:choose","core":true},{"name":"clear","id":"singularity.core@1.0.0:clear","core":true},{"name":"incr","id":"singularity.core@1.0.0:incr","core":true},{"name":"removeFromList","id":"singularity.core@1.0.0:removeFromList","core":true},{"name":"selectAll","id":"singularity.core@1.0.0:selectAll","core":true},{"name":"set","id":"singularity.core@1.0.0:set","core":true},{"name":"setList","id":"singularity.core@1.0.0:setList","core":true},{"name":"setMinMax","id":"singularity.core@1.0.0:setMinMax","core":true},{"name":"toggle","id":"singularity.core@1.0.0:toggle","core":true},{"name":"toggleInList","id":"singularity.core@1.0.0:toggleInList","core":true},{"name":"updateWhere","id":"singularity.core@1.0.0:updateWhere","core":true}],"helperContracts":{},"operationContracts":{"choose":{"args":{"cond":{"type":"expr","desc":"a {{ }} condition: runs `then` if truthy, else `else`"},"then":{"type":"action","desc":"the action run when cond is truthy","default":null},"else":{"type":"action","desc":"the action run when cond is falsy","default":null}},"argNames":["cond","then","else"],"desc":"branch: run `then` when cond is truthy, else `else` (lazy — only the taken branch runs)","effects":{"writes":[],"reads":[],"deterministic":true},"core":true},"clear":{"args":{"path":{"type":"path","desc":"the list path to reset"},"value":{"type":"array","desc":"the list to reset to","default":[]}},"argNames":["path","value"],"desc":"reset a list path to [] (a provided `value` list replaces instead — but prefer setList for that; clear is the empty case)","effects":{"writes":[{"kind":"field","value":"path"}],"reads":[],"deterministic":true},"core":true},"incr":{"args":{"path":{"type":"path","desc":"the numeric state path to add to"},"by":{"type":"number","desc":"amount to add","default":1}},"argNames":["path","by"],"desc":"add an amount (default 1) to a number at a state path","effects":{"writes":[{"kind":"field","value":"path"}],"reads":[{"kind":"field","value":"path"}],"deterministic":true},"core":true},"removeFromList":{"args":{"path":{"type":"path","desc":"the list path to update"},"value":{"type":"any","desc":"the item to remove"}},"argNames":["path","value"],"desc":"remove every occurrence of the item from the list","effects":{"writes":[{"kind":"field","value":"path"}],"reads":[{"kind":"field","value":"path"}],"deterministic":true},"core":true},"selectAll":{"args":{"path":{"type":"path","desc":"the path to write the selection to"},"from":{"type":"array","desc":"the source list to select from"},"key":{"type":"string","desc":"the field read from each item","default":"value"}},"argNames":["path","from","key"],"desc":"write the key of every non-disabled option object from `from` into the list at path","effects":{"writes":[{"kind":"field","value":"path"}],"reads":[],"deterministic":true},"core":true},"set":{"args":{"path":{"type":"path","desc":"the state path to write"},"value":{"type":"any","desc":"the value to write"}},"argNames":["path","value"],"desc":"write a value to a state path","effects":{"writes":[{"kind":"field","value":"path"}],"reads":[],"deterministic":true},"core":true},"setList":{"args":{"path":{"type":"path","desc":"the list path to write"},"value":{"type":"array","desc":"the list value to set"}},"argNames":["path","value"],"desc":"write a whole list to a state path (a non-array value becomes [])","effects":{"writes":[{"kind":"field","value":"path"}],"reads":[],"deterministic":true},"core":true},"setMinMax":{"args":{"a":{"type":"any","desc":"first value to compare"},"b":{"type":"any","desc":"second value to compare"},"minPath":{"type":"path","desc":"path to write the lesser of a and b"},"maxPath":{"type":"path","desc":"path to write the greater of a and b"}},"argNames":["a","b","minPath","maxPath"],"desc":"sort the pair: write the lesser of a/b to minPath and the greater to maxPath","effects":{"writes":[{"kind":"field","value":"minPath"},{"kind":"field","value":"maxPath"}],"reads":[],"deterministic":true},"core":true},"toggle":{"args":{"path":{"type":"path","desc":"the boolean state path to flip"}},"argNames":["path"],"desc":"flip a boolean at a state path","effects":{"writes":[{"kind":"field","value":"path"}],"reads":[{"kind":"field","value":"path"}],"deterministic":true},"core":true},"toggleInList":{"args":{"path":{"type":"path","desc":"the list path to update"},"value":{"type":"any","desc":"the item to add if absent or remove if present"}},"argNames":["path","value"],"desc":"add the item to the list if absent, remove it if present","effects":{"writes":[{"kind":"field","value":"path"}],"reads":[{"kind":"field","value":"path"}],"deterministic":true},"core":true},"updateWhere":{"args":{"path":{"type":"path","desc":"the list path to update"},"id":{"type":"any","desc":"the id value to match"},"idKey":{"type":"string","desc":"the field matched against id","default":"id"},"field":{"type":"string","desc":"the field written on the matched row"},"value":{"type":"any","desc":"the value written to field"}},"argNames":["path","id","idKey","field","value"],"desc":"in the list at path, set one field on the row whose idKey matches id","effects":{"writes":[{"kind":"field","value":"path"}],"reads":[{"kind":"field","value":"path"}],"deterministic":true},"core":true}},"provenance":{"source":"@manifest-ui/singularity","review":"fixed protocol-neutral transaction operations"}},{"schema":"singularity.vocabulary-pack.v1","namespace":"singularity.vocabulary","version":"1.0.0","runtime":"1","exposure":"builtin-bare","contractAddress":"a069ec10d9bd88da","helpers":[{"name":"abbreviateNumber","id":"singularity.vocabulary@1.0.0:abbreviateNumber"},{"name":"abs","id":"singularity.vocabulary@1.0.0:abs"},{"name":"addTime","id":"singularity.vocabulary@1.0.0:addTime"},{"name":"applyPatches","id":"singularity.vocabulary@1.0.0:applyPatches"},{"name":"assetUrl","id":"singularity.vocabulary@1.0.0:assetUrl"},{"name":"avg","id":"singularity.vocabulary@1.0.0:avg"},{"name":"avgBy","id":"singularity.vocabulary@1.0.0:avgBy"},{"name":"capitalize","id":"singularity.vocabulary@1.0.0:capitalize"},{"name":"ceil","id":"singularity.vocabulary@1.0.0:ceil"},{"name":"chunk","id":"singularity.vocabulary@1.0.0:chunk"},{"name":"clamp","id":"singularity.vocabulary@1.0.0:clamp"},{"name":"coalesce","id":"singularity.vocabulary@1.0.0:coalesce"},{"name":"compact","id":"singularity.vocabulary@1.0.0:compact"},{"name":"concat","id":"singularity.vocabulary@1.0.0:concat"},{"name":"contains","id":"singularity.vocabulary@1.0.0:contains"},{"name":"count","id":"singularity.vocabulary@1.0.0:count"},{"name":"countBy","id":"singularity.vocabulary@1.0.0:countBy"},{"name":"crossJoin","id":"singularity.vocabulary@1.0.0:crossJoin"},{"name":"currency","id":"singularity.vocabulary@1.0.0:currency"},{"name":"datePart","id":"singularity.vocabulary@1.0.0:datePart"},{"name":"dateRange","id":"singularity.vocabulary@1.0.0:dateRange"},{"name":"diffTime","id":"singularity.vocabulary@1.0.0:diffTime"},{"name":"difference","id":"singularity.vocabulary@1.0.0:difference"},{"name":"drop","id":"singularity.vocabulary@1.0.0:drop"},{"name":"duration","id":"singularity.vocabulary@1.0.0:duration"},{"name":"endOf","id":"singularity.vocabulary@1.0.0:endOf"},{"name":"endsWith","id":"singularity.vocabulary@1.0.0:endsWith"},{"name":"ensurePrefix","id":"singularity.vocabulary@1.0.0:ensurePrefix"},{"name":"ensureSuffix","id":"singularity.vocabulary@1.0.0:ensureSuffix"},{"name":"entries","id":"singularity.vocabulary@1.0.0:entries"},{"name":"eq","id":"singularity.vocabulary@1.0.0:eq"},{"name":"escapeHtml","id":"singularity.vocabulary@1.0.0:escapeHtml"},{"name":"filterBy","id":"singularity.vocabulary@1.0.0:filterBy"},{"name":"findBy","id":"singularity.vocabulary@1.0.0:findBy"},{"name":"first","id":"singularity.vocabulary@1.0.0:first"},{"name":"fixed","id":"singularity.vocabulary@1.0.0:fixed"},{"name":"flatten","id":"singularity.vocabulary@1.0.0:flatten"},{"name":"flattenDeep","id":"singularity.vocabulary@1.0.0:flattenDeep"},{"name":"floor","id":"singularity.vocabulary@1.0.0:floor"},{"name":"formatBytes","id":"singularity.vocabulary@1.0.0:formatBytes"},{"name":"formatDate","id":"singularity.vocabulary@1.0.0:formatDate"},{"name":"formatList","id":"singularity.vocabulary@1.0.0:formatList"},{"name":"fromEntries","id":"singularity.vocabulary@1.0.0:fromEntries"},{"name":"fromJson","id":"singularity.vocabulary@1.0.0:fromJson"},{"name":"fromJsonBase64","id":"singularity.vocabulary@1.0.0:fromJsonBase64"},{"name":"fromUnix","id":"singularity.vocabulary@1.0.0:fromUnix"},{"name":"get","id":"singularity.vocabulary@1.0.0:get"},{"name":"groupBy","id":"singularity.vocabulary@1.0.0:groupBy"},{"name":"groupRows","id":"singularity.vocabulary@1.0.0:groupRows"},{"name":"gt","id":"singularity.vocabulary@1.0.0:gt"},{"name":"gte","id":"singularity.vocabulary@1.0.0:gte"},{"name":"has","id":"singularity.vocabulary@1.0.0:has"},{"name":"inRange","id":"singularity.vocabulary@1.0.0:inRange"},{"name":"includes","id":"singularity.vocabulary@1.0.0:includes"},{"name":"indexOf","id":"singularity.vocabulary@1.0.0:indexOf"},{"name":"indexOfItem","id":"singularity.vocabulary@1.0.0:indexOfItem"},{"name":"init","id":"singularity.vocabulary@1.0.0:init"},{"name":"initials","id":"singularity.vocabulary@1.0.0:initials"},{"name":"intersection","id":"singularity.vocabulary@1.0.0:intersection"},{"name":"isAfter","id":"singularity.vocabulary@1.0.0:isAfter"},{"name":"isArray","id":"singularity.vocabulary@1.0.0:isArray"},{"name":"isBefore","id":"singularity.vocabulary@1.0.0:isBefore"},{"name":"isBetween","id":"singularity.vocabulary@1.0.0:isBetween"},{"name":"isBoolean","id":"singularity.vocabulary@1.0.0:isBoolean"},{"name":"isEmpty","id":"singularity.vocabulary@1.0.0:isEmpty"},{"name":"isFuture","id":"singularity.vocabulary@1.0.0:isFuture"},{"name":"isNumber","id":"singularity.vocabulary@1.0.0:isNumber"},{"name":"isObject","id":"singularity.vocabulary@1.0.0:isObject"},{"name":"isPast","id":"singularity.vocabulary@1.0.0:isPast"},{"name":"isSameDay","id":"singularity.vocabulary@1.0.0:isSameDay"},{"name":"isString","id":"singularity.vocabulary@1.0.0:isString"},{"name":"isToday","id":"singularity.vocabulary@1.0.0:isToday"},{"name":"join","id":"singularity.vocabulary@1.0.0:join"},{"name":"keys","id":"singularity.vocabulary@1.0.0:keys"},{"name":"last","id":"singularity.vocabulary@1.0.0:last"},{"name":"lastIndexOf","id":"singularity.vocabulary@1.0.0:lastIndexOf"},{"name":"length","id":"singularity.vocabulary@1.0.0:length"},{"name":"lerp","id":"singularity.vocabulary@1.0.0:lerp"},{"name":"lines","id":"singularity.vocabulary@1.0.0:lines"},{"name":"lookup","id":"singularity.vocabulary@1.0.0:lookup"},{"name":"lower","id":"singularity.vocabulary@1.0.0:lower"},{"name":"lt","id":"singularity.vocabulary@1.0.0:lt"},{"name":"lte","id":"singularity.vocabulary@1.0.0:lte"},{"name":"mask","id":"singularity.vocabulary@1.0.0:mask"},{"name":"max","id":"singularity.vocabulary@1.0.0:max"},{"name":"maxBy","id":"singularity.vocabulary@1.0.0:maxBy"},{"name":"median","id":"singularity.vocabulary@1.0.0:median"},{"name":"min","id":"singularity.vocabulary@1.0.0:min"},{"name":"minBy","id":"singularity.vocabulary@1.0.0:minBy"},{"name":"mod","id":"singularity.vocabulary@1.0.0:mod"},{"name":"monthName","id":"singularity.vocabulary@1.0.0:monthName"},{"name":"neq","id":"singularity.vocabulary@1.0.0:neq"},{"name":"not","id":"singularity.vocabulary@1.0.0:not"},{"name":"now","id":"singularity.vocabulary@1.0.0:now"},{"name":"nth","id":"singularity.vocabulary@1.0.0:nth"},{"name":"omit","id":"singularity.vocabulary@1.0.0:omit"},{"name":"ordinal","id":"singularity.vocabulary@1.0.0:ordinal"},{"name":"padEnd","id":"singularity.vocabulary@1.0.0:padEnd"},{"name":"padStart","id":"singularity.vocabulary@1.0.0:padStart"},{"name":"partition","id":"singularity.vocabulary@1.0.0:partition"},{"name":"percent","id":"singularity.vocabulary@1.0.0:percent"},{"name":"pick","id":"singularity.vocabulary@1.0.0:pick"},{"name":"pluck","id":"singularity.vocabulary@1.0.0:pluck"},{"name":"pluralize","id":"singularity.vocabulary@1.0.0:pluralize"},{"name":"pow","id":"singularity.vocabulary@1.0.0:pow"},{"name":"product","id":"singularity.vocabulary@1.0.0:product"},{"name":"range","id":"singularity.vocabulary@1.0.0:range"},{"name":"relativeTime","id":"singularity.vocabulary@1.0.0:relativeTime"},{"name":"repeat","id":"singularity.vocabulary@1.0.0:repeat"},{"name":"replace","id":"singularity.vocabulary@1.0.0:replace"},{"name":"replaceFirst","id":"singularity.vocabulary@1.0.0:replaceFirst"},{"name":"resolveRoute","id":"singularity.vocabulary@1.0.0:resolveRoute"},{"name":"reverse","id":"singularity.vocabulary@1.0.0:reverse"},{"name":"round","id":"singularity.vocabulary@1.0.0:round"},{"name":"routeActive","id":"singularity.vocabulary@1.0.0:routeActive"},{"name":"searchBy","id":"singularity.vocabulary@1.0.0:searchBy"},{"name":"sign","id":"singularity.vocabulary@1.0.0:sign"},{"name":"size","id":"singularity.vocabulary@1.0.0:size"},{"name":"slice","id":"singularity.vocabulary@1.0.0:slice"},{"name":"sliceList","id":"singularity.vocabulary@1.0.0:sliceList"},{"name":"slugify","id":"singularity.vocabulary@1.0.0:slugify"},{"name":"sortBy","id":"singularity.vocabulary@1.0.0:sortBy"},{"name":"split","id":"singularity.vocabulary@1.0.0:split"},{"name":"sqrt","id":"singularity.vocabulary@1.0.0:sqrt"},{"name":"startOf","id":"singularity.vocabulary@1.0.0:startOf"},{"name":"startsWith","id":"singularity.vocabulary@1.0.0:startsWith"},{"name":"sum","id":"singularity.vocabulary@1.0.0:sum"},{"name":"sumBy","id":"singularity.vocabulary@1.0.0:sumBy"},{"name":"tail","id":"singularity.vocabulary@1.0.0:tail"},{"name":"take","id":"singularity.vocabulary@1.0.0:take"},{"name":"thousands","id":"singularity.vocabulary@1.0.0:thousands"},{"name":"titleCase","id":"singularity.vocabulary@1.0.0:titleCase"},{"name":"toBoolean","id":"singularity.vocabulary@1.0.0:toBoolean"},{"name":"toInt","id":"singularity.vocabulary@1.0.0:toInt"},{"name":"toJson","id":"singularity.vocabulary@1.0.0:toJson"},{"name":"toJsonBase64","id":"singularity.vocabulary@1.0.0:toJsonBase64"},{"name":"toNumber","id":"singularity.vocabulary@1.0.0:toNumber"},{"name":"today","id":"singularity.vocabulary@1.0.0:today"},{"name":"trim","id":"singularity.vocabulary@1.0.0:trim"},{"name":"trimEnd","id":"singularity.vocabulary@1.0.0:trimEnd"},{"name":"trimStart","id":"singularity.vocabulary@1.0.0:trimStart"},{"name":"truncate","id":"singularity.vocabulary@1.0.0:truncate"},{"name":"typeOf","id":"singularity.vocabulary@1.0.0:typeOf"},{"name":"union","id":"singularity.vocabulary@1.0.0:union"},{"name":"unique","id":"singularity.vocabulary@1.0.0:unique"},{"name":"uniqueBy","id":"singularity.vocabulary@1.0.0:uniqueBy"},{"name":"unix","id":"singularity.vocabulary@1.0.0:unix"},{"name":"upper","id":"singularity.vocabulary@1.0.0:upper"},{"name":"values","id":"singularity.vocabulary@1.0.0:values"},{"name":"weekday","id":"singularity.vocabulary@1.0.0:weekday"},{"name":"without","id":"singularity.vocabulary@1.0.0:without"},{"name":"words","id":"singularity.vocabulary@1.0.0:words"},{"name":"zip","id":"singularity.vocabulary@1.0.0:zip"}],"operations":[{"name":"append","id":"singularity.vocabulary@1.0.0:append","core":false},{"name":"decr","id":"singularity.vocabulary@1.0.0:decr","core":false},{"name":"dedupe","id":"singularity.vocabulary@1.0.0:dedupe","core":false},{"name":"deepMerge","id":"singularity.vocabulary@1.0.0:deepMerge","core":false},{"name":"delete","id":"singularity.vocabulary@1.0.0:delete","core":false},{"name":"insertAt","id":"singularity.vocabulary@1.0.0:insertAt","core":false},{"name":"merge","id":"singularity.vocabulary@1.0.0:merge","core":false},{"name":"move","id":"singularity.vocabulary@1.0.0:move","core":false},{"name":"patchWhere","id":"singularity.vocabulary@1.0.0:patchWhere","core":false},{"name":"prepend","id":"singularity.vocabulary@1.0.0:prepend","core":false},{"name":"pushUnique","id":"singularity.vocabulary@1.0.0:pushUnique","core":false},{"name":"removeAt","id":"singularity.vocabulary@1.0.0:removeAt","core":false},{"name":"removeWhere","id":"singularity.vocabulary@1.0.0:removeWhere","core":false},{"name":"setIfEmpty","id":"singularity.vocabulary@1.0.0:setIfEmpty","core":false},{"name":"sortList","id":"singularity.vocabulary@1.0.0:sortList","core":false},{"name":"swap","id":"singularity.vocabulary@1.0.0:swap","core":false},{"name":"unsetPath","id":"singularity.vocabulary@1.0.0:unsetPath","core":false},{"name":"upsert","id":"singularity.vocabulary@1.0.0:upsert","core":false}],"helperContracts":{"abbreviateNumber":{"args":{"n":{"type":"number","desc":"the number to abbreviate (1.2k, 3.4M, …)"}},"argNames":["n"],"desc":"compact a number (15300 → 15k)","implementation":{"kind":"code"}},"abs":{"args":{"n":{"type":"number","desc":"the value"}},"argNames":["n"],"desc":"absolute value","implementation":{"kind":"code"}},"addTime":{"args":{"d":{"type":"any","desc":"the date"},"amount":{"type":"number","desc":"the amount to add (may be negative)"},"unit":{"type":"string","desc":"the unit (ms/second/minute/hour/day/week/month/year)"}},"argNames":["d","amount","unit"],"desc":"a date shifted by an amount of a unit (day/hour/…)","implementation":{"kind":"code"}},"applyPatches":{"args":{"base":{"type":"any","desc":"the base value to fold the patches onto (never mutated)"},"patches":{"type":"array","desc":"the receipt patches to apply in order (non-array or malformed → base unchanged)"}},"argNames":["base","patches"],"desc":"fold receipt patches onto a base value (the inverse of diff) — e.g. an origin + a version log's state patches to the current head","implementation":{"kind":"code"}},"assetUrl":{"args":{"v":{"type":"any","desc":"an asset cell { ref, url }, a logical reference string, or an existing URL"}},"argNames":["v"],"desc":"render an asset value: local preview URLs pass through, durable asset:// refs resolve through the host binding, and provider helpers own image derivatives","implementation":{"kind":"code"}},"avg":{"args":{"list":{"type":"array","desc":"the numbers to average"}},"argNames":["list"],"desc":"the mean of a list of numbers","implementation":{"kind":"code"}},"avgBy":{"args":{"list":{"type":"array","desc":"the rows"},"key":{"type":"string","desc":"the numeric field to average"}},"argNames":["list","key"],"desc":"the mean of one numeric field across rows","implementation":{"kind":"code"}},"capitalize":{"args":{"s":{"type":"string","desc":"the string to capitalize (first letter)"}},"argNames":["s"],"desc":"uppercase the first character","implementation":{"kind":"code"}},"ceil":{"args":{"n":{"type":"number","desc":"the value"}},"argNames":["n"],"desc":"round up to an integer","implementation":{"kind":"code"}},"chunk":{"args":{"list":{"type":"array","desc":"the list to chunk"},"size":{"type":"number","desc":"the chunk size"}},"argNames":["list","size"],"desc":"split a list into runs of a given size","implementation":{"kind":"code"}},"clamp":{"args":{"n":{"type":"number","desc":"the value"},"lo":{"type":"number","desc":"the minimum"},"hi":{"type":"number","desc":"the maximum"}},"argNames":["n","lo","hi"],"desc":"constrain a number between lo and hi","implementation":{"kind":"code"}},"coalesce":{"args":{"vals":{"type":"any","desc":"values; returns the first non-null","rest":true}},"argNames":["vals"],"desc":"the first value that is neither null nor undefined","implementation":{"kind":"code"}},"compact":{"args":{"list":{"type":"array","desc":"the list (drop falsy)"}},"argNames":["list"],"desc":"a list without its null/undefined/false/''/0 items","implementation":{"kind":"code"}},"concat":{"args":{"a":{"type":"array","desc":"the first list"},"b":{"type":"array","desc":"the second list"}},"argNames":["a","b"],"desc":"join two lists into one (every item of a, then every item of b)","implementation":{"kind":"code"}},"contains":{"args":{"s":{"type":"string","desc":"the string to test"},"p":{"type":"string","desc":"the substring"}},"argNames":["s","p"],"desc":"whether a STRING contains a substring (for a list, use includes)","implementation":{"kind":"code"}},"count":{"args":{"v":{"type":"array","desc":"the list to count (a non-array counts as 0)"}},"argNames":["v"],"desc":"how many items a LIST has (non-array → 0)","implementation":{"kind":"code"}},"countBy":{"args":{"list":{"type":"array","desc":"the rows"},"key":{"type":"string","desc":"the field to tally by"}},"argNames":["list","key"],"desc":"how many rows share each value of a field","implementation":{"kind":"code"}},"crossJoin":{"args":{"a":{"type":"array","desc":"the outer rows"},"b":{"type":"array","desc":"the inner rows"},"asA":{"type":"string","desc":"the field each pairing carries the outer row under","default":"a"},"asB":{"type":"string","desc":"the field each pairing carries the inner row under","default":"b"}},"argNames":["a","b","asA","asB"],"desc":"every pairing of two row lists as repeatable rows ({ id, <asA>: rowA, <asB>: rowB }) — feed a mapped computed cell to derive a value per pairing (a price per item per plan), then groupRows to nest the repeat","implementation":{"kind":"code"}},"currency":{"args":{"n":{"type":"number","desc":"the amount"},"code":{"type":"string","desc":"the ISO currency code"},"display":{"type":"string","desc":"optional symbol for a stable currency symbol; default keeps the code"}},"argNames":["n","code","display"],"desc":"format an amount as money (optional currency code; display symbol uses a stable symbol)","implementation":{"kind":"code"}},"datePart":{"args":{"d":{"type":"any","desc":"the date"},"unit":{"type":"string","desc":"the part (year/month/day/hour/minute/second)"}},"argNames":["d","unit"],"desc":"one numeric part of a date (year/month/day/hour/minute/second/weekday)","implementation":{"kind":"code"}},"dateRange":{"args":{"start":{"type":"any","desc":"the first date (inclusive)"},"end":{"type":"any","desc":"the last date (inclusive)"},"unit":{"type":"string","desc":"the step unit (day/week/month/hour/…)","default":"day"},"step":{"type":"number","desc":"how many units per step","default":1}},"argNames":["start","end","unit","step"],"desc":"every step from start to end inclusive, as structured date objects { iso, year, month, day, weekday, hour, minute } — the list a calendar grid, hour gutter, or schedule repeats over","implementation":{"kind":"code"}},"diffTime":{"args":{"a":{"type":"any","desc":"the later date"},"b":{"type":"any","desc":"the earlier date"},"unit":{"type":"string","desc":"the unit"}},"argNames":["a","b","unit"],"desc":"the difference between two dates in a unit","implementation":{"kind":"code"}},"difference":{"args":{"a":{"type":"array","desc":"the list to keep from"},"b":{"type":"array","desc":"the values to remove"}},"argNames":["a","b"],"desc":"values of the first list not in the second","implementation":{"kind":"code"}},"drop":{"args":{"list":{"type":"array","desc":"the list"},"n":{"type":"number","desc":"how many to drop from the front"}},"argNames":["list","n"],"desc":"all items after the first n","implementation":{"kind":"code"}},"duration":{"args":{"ms":{"type":"number","desc":"a duration in milliseconds"}},"argNames":["ms"],"desc":"milliseconds as a human duration (1m 1s)","implementation":{"kind":"code"}},"endOf":{"args":{"d":{"type":"any","desc":"the date"},"unit":{"type":"string","desc":"the unit (day/week/month/year)"}},"argNames":["d","unit"],"desc":"a date ceiled to the end of a unit","implementation":{"kind":"code"}},"endsWith":{"args":{"s":{"type":"string","desc":"the string to test"},"p":{"type":"string","desc":"the suffix"}},"argNames":["s","p"],"desc":"whether a string ends with a suffix","implementation":{"kind":"code"}},"ensurePrefix":{"args":{"s":{"type":"string","desc":"the string"},"p":{"type":"string","desc":"the prefix to ensure"}},"argNames":["s","p"],"desc":"prepend a prefix unless already present","implementation":{"kind":"code"}},"ensureSuffix":{"args":{"s":{"type":"string","desc":"the string"},"p":{"type":"string","desc":"the suffix to ensure"}},"argNames":["s","p"],"desc":"append a suffix unless already present","implementation":{"kind":"code"}},"entries":{"args":{"obj":{"type":"object","desc":"the object"}},"argNames":["obj"],"desc":"an object's own [key, value] pairs","implementation":{"kind":"code"}},"eq":{"args":{"a":{"type":"any","desc":"the first value"},"b":{"type":"any","desc":"the second value"}},"argNames":["a","b"],"desc":"strict equality (the atom form of == — inline, just use the operator)","implementation":{"kind":"code"}},"escapeHtml":{"args":{"s":{"type":"string","desc":"the string to HTML-escape"}},"argNames":["s"],"desc":"escape &<>\"' for safe HTML text","implementation":{"kind":"code"}},"filterBy":{"args":{"list":{"type":"array","desc":"the rows to filter"},"key":{"type":"string","desc":"the field to test on each row"},"value":{"type":"any","desc":"keep a row whose field strictly equals this"}},"argNames":["list","key","value"],"desc":"rows whose field equals a value","implementation":{"kind":"code"}},"findBy":{"args":{"list":{"type":"array","desc":"the rows to search"},"key":{"type":"string","desc":"the field to test on each row"},"value":{"type":"any","desc":"return the first row whose field strictly equals this"}},"argNames":["list","key","value"],"desc":"the first row whose field equals a value","implementation":{"kind":"code"}},"first":{"args":{"list":{"type":"array","desc":"the list"}},"argNames":["list"],"desc":"the first item","implementation":{"kind":"code"}},"fixed":{"args":{"n":{"type":"number","desc":"the value"},"places":{"type":"number","desc":"decimal places"}},"argNames":["n","places"],"desc":"format a number with a fixed number of decimals (a string)","implementation":{"kind":"code"}},"flatten":{"args":{"list":{"type":"array","desc":"the list to flatten one level"}},"argNames":["list"],"desc":"flatten one level of nested lists","implementation":{"kind":"code"}},"flattenDeep":{"args":{"list":{"type":"array","desc":"the list to flatten fully"}},"argNames":["list"],"desc":"flatten nested lists all the way down","implementation":{"kind":"code"}},"floor":{"args":{"n":{"type":"number","desc":"the value"}},"argNames":["n"],"desc":"round down to an integer","implementation":{"kind":"code"}},"formatBytes":{"args":{"n":{"type":"number","desc":"a byte count"},"places":{"type":"number","desc":"decimal places"}},"argNames":["n","places"],"desc":"human-readable byte size (kB/MB/…)","implementation":{"kind":"code"}},"formatDate":{"args":{"d":{"type":"any","desc":"the date"},"pattern":{"type":"string","desc":"the format pattern"}},"argNames":["d","pattern"],"desc":"format a date by a pattern (YYYY-MM-DD HH:mm:ss tokens)","implementation":{"kind":"code"}},"formatList":{"args":{"list":{"type":"array","desc":"the items"},"conj":{"type":"string","desc":"the conjunction (and/or)"}},"argNames":["list","conj"],"desc":"join items into prose with a conjunction (a, b, and c)","implementation":{"kind":"code"}},"fromEntries":{"args":{"pairs":{"type":"array","desc":"an array of [key, value] pairs"}},"argNames":["pairs"],"desc":"build an object from [key, value] pairs","implementation":{"kind":"code"}},"fromJson":{"args":{"s":{"type":"string","desc":"the JSON string to parse (invalid → null)"}},"argNames":["s"],"desc":"parse JSON text (invalid → null)","implementation":{"kind":"code"}},"fromJsonBase64":{"args":{"s":{"type":"string","desc":"the base64-encoded JSON document to decode and parse (invalid → null)"}},"argNames":["s"],"desc":"decode and parse a base64-encoded JSON document","implementation":{"kind":"code"}},"fromUnix":{"args":{"secs":{"type":"number","desc":"epoch seconds"}},"argNames":["secs"],"desc":"a date from unix seconds","implementation":{"kind":"code"}},"get":{"args":{"obj":{"type":"any","desc":"the source"},"path":{"type":"string","desc":"the dotted/bracketed path"},"dflt":{"type":"any","desc":"the default if absent"}},"argNames":["obj","path","dflt"],"desc":"read a nested path off an object, with a default","implementation":{"kind":"code"}},"groupBy":{"args":{"list":{"type":"array","desc":"the rows to group"},"key":{"type":"string","desc":"the field to group by"}},"argNames":["list","key"],"desc":"rows grouped into an object keyed by a field's values","implementation":{"kind":"code"}},"groupRows":{"args":{"list":{"type":"array","desc":"the rows to group"},"key":{"type":"string","desc":"the field (dotted path ok) to group by"}},"argNames":["list","key"],"desc":"rows grouped into a repeatable ARRAY of { id, key, rows } (dotted key path ok) — the nested-repeat form of groupBy","implementation":{"kind":"code"}},"gt":{"args":{"a":{"type":"any","desc":"the first value"},"b":{"type":"any","desc":"the second value"}},"argNames":["a","b"],"desc":"greater than (atom form of >)","implementation":{"kind":"code"}},"gte":{"args":{"a":{"type":"any","desc":"the first value"},"b":{"type":"any","desc":"the second value"}},"argNames":["a","b"],"desc":"greater than or equal (atom form of >=)","implementation":{"kind":"code"}},"has":{"args":{"obj":{"type":"any","desc":"the source"},"path":{"type":"string","desc":"the path to test for"}},"argNames":["obj","path"],"desc":"whether a nested path exists on an object","implementation":{"kind":"code"}},"inRange":{"args":{"n":{"type":"number","desc":"the value"},"lo":{"type":"number","desc":"the inclusive lower bound"},"hi":{"type":"number","desc":"the inclusive upper bound"}},"argNames":["n","lo","hi"],"desc":"whether a number lies between lo and hi (inclusive)","implementation":{"kind":"code"}},"includes":{"args":{"arr":{"type":"array","desc":"the list to search"},"v":{"type":"any","desc":"the value to look for"}},"argNames":["arr","v"],"desc":"whether a LIST contains a value (for a substring, use contains)","implementation":{"kind":"code"}},"indexOf":{"args":{"s":{"type":"string","desc":"the string to search"},"sub":{"type":"string","desc":"the substring to find"}},"argNames":["s","sub"],"desc":"first index of a substring in a STRING (-1 when absent; for a list, indexOfItem)","implementation":{"kind":"code"}},"indexOfItem":{"args":{"list":{"type":"array","desc":"the list"},"v":{"type":"any","desc":"the value to find"}},"argNames":["list","v"],"desc":"the index of a value in a LIST (-1 when absent)","implementation":{"kind":"code"}},"init":{"args":{"list":{"type":"array","desc":"the list (all but the last)"}},"argNames":["list"],"desc":"all items but the last","implementation":{"kind":"code"}},"initials":{"args":{"s":{"type":"string","desc":"the string to reduce to initials"}},"argNames":["s"],"desc":"the first letter of each word, uppercased","implementation":{"kind":"code"}},"intersection":{"args":{"a":{"type":"array","desc":"the first list"},"b":{"type":"array","desc":"the second list"}},"argNames":["a","b"],"desc":"values present in both lists","implementation":{"kind":"code"}},"isAfter":{"args":{"a":{"type":"any","desc":"the first date"},"b":{"type":"any","desc":"the second date"}},"argNames":["a","b"],"desc":"whether date a is after b","implementation":{"kind":"code"}},"isArray":{"args":{"v":{"type":"any","desc":"the value"}},"argNames":["v"],"desc":"whether a value is an array","implementation":{"kind":"code"}},"isBefore":{"args":{"a":{"type":"any","desc":"the first date"},"b":{"type":"any","desc":"the second date"}},"argNames":["a","b"],"desc":"whether date a is before b","implementation":{"kind":"code"}},"isBetween":{"args":{"d":{"type":"any","desc":"the date"},"lo":{"type":"any","desc":"the inclusive start"},"hi":{"type":"any","desc":"the inclusive end"}},"argNames":["d","lo","hi"],"desc":"whether a date lies between two others","implementation":{"kind":"code"}},"isBoolean":{"args":{"v":{"type":"any","desc":"the value"}},"argNames":["v"],"desc":"whether a value is a boolean","implementation":{"kind":"code"}},"isEmpty":{"args":{"v":{"type":"any","desc":"the value to test for emptiness"}},"argNames":["v"],"desc":"whether a value is empty (no items/keys/characters, or null/undefined)","implementation":{"kind":"code"}},"isFuture":{"args":{"d":{"type":"any","desc":"the date"},"at":{"type":"any","desc":"the explicitly captured comparison instant"}},"argNames":["d","at"],"desc":"whether a date is after an explicitly captured instant","implementation":{"kind":"code"}},"isNumber":{"args":{"v":{"type":"any","desc":"the value"}},"argNames":["v"],"desc":"whether a value is a finite number","implementation":{"kind":"code"}},"isObject":{"args":{"v":{"type":"any","desc":"the value"}},"argNames":["v"],"desc":"whether a value is a plain object","implementation":{"kind":"code"}},"isPast":{"args":{"d":{"type":"any","desc":"the date"},"at":{"type":"any","desc":"the explicitly captured comparison instant"}},"argNames":["d","at"],"desc":"whether a date is before an explicitly captured instant","implementation":{"kind":"code"}},"isSameDay":{"args":{"a":{"type":"any","desc":"the first date"},"b":{"type":"any","desc":"the second date"}},"argNames":["a","b"],"desc":"whether two dates fall on the same day","implementation":{"kind":"code"}},"isString":{"args":{"v":{"type":"any","desc":"the value"}},"argNames":["v"],"desc":"whether a value is a string","implementation":{"kind":"code"}},"isToday":{"args":{"d":{"type":"any","desc":"the date"},"at":{"type":"any","desc":"the explicitly captured comparison instant"}},"argNames":["d","at"],"desc":"whether a date shares the UTC day of an explicitly captured instant","implementation":{"kind":"code"}},"join":{"args":{"arr":{"type":"array","desc":"the list to join"},"sep":{"type":"string","desc":"the separator","default":", "}},"argNames":["arr","sep"],"desc":"join a list into a string with a separator","implementation":{"kind":"code"}},"keys":{"args":{"obj":{"type":"object","desc":"the object"}},"argNames":["obj"],"desc":"an object's own keys","implementation":{"kind":"code"}},"last":{"args":{"list":{"type":"array","desc":"the list"}},"argNames":["list"],"desc":"the last item","implementation":{"kind":"code"}},"lastIndexOf":{"args":{"s":{"type":"string","desc":"the string to search"},"sub":{"type":"string","desc":"the substring to find (last)"}},"argNames":["s","sub"],"desc":"last index of a substring (-1 when absent)","implementation":{"kind":"code"}},"length":{"args":{"v":{"type":"any","desc":"a value with a length (string or array)"}},"argNames":["v"],"desc":"a STRING's length in characters (for a list, prefer count)","implementation":{"kind":"code"}},"lerp":{"args":{"a":{"type":"number","desc":"the start value"},"b":{"type":"number","desc":"the end value"},"t":{"type":"number","desc":"the interpolation fraction 0..1"}},"argNames":["a","b","t"],"desc":"interpolate between a and b by t (0..1)","implementation":{"kind":"code"}},"lines":{"args":{"s":{"type":"string","desc":"the string to split into lines"}},"argNames":["s"],"desc":"split a string into its lines","implementation":{"kind":"code"}},"lookup":{"args":{"v":{"type":"any","desc":"the key to look up"},"map":{"type":"object","desc":"the value→value table"},"dflt":{"type":"any","desc":"the default if absent"}},"argNames":["v","map","dflt"],"desc":"map a value through a lookup table, with a default","implementation":{"kind":"code"}},"lower":{"args":{"s":{"type":"string","desc":"the string to lower-case"}},"argNames":["s"],"desc":"lowercase a string","implementation":{"kind":"code"}},"lt":{"args":{"a":{"type":"any","desc":"the first value"},"b":{"type":"any","desc":"the second value"}},"argNames":["a","b"],"desc":"less than (atom form of <)","implementation":{"kind":"code"}},"lte":{"args":{"a":{"type":"any","desc":"the first value"},"b":{"type":"any","desc":"the second value"}},"argNames":["a","b"],"desc":"less than or equal (atom form of <=)","implementation":{"kind":"code"}},"mask":{"args":{"s":{"type":"string","desc":"the string to mask"},"keep":{"type":"number","desc":"how many trailing chars to reveal"},"ch":{"type":"string","desc":"the mask character","default":"•"}},"argNames":["s","keep","ch"],"desc":"hide all but the last `keep` characters behind a mask character","implementation":{"kind":"code"}},"max":{"args":{"values":{"type":"number[]","desc":"the numbers to take the maximum of","rest":true}},"argNames":["values"],"desc":"the largest of the values","implementation":{"kind":"code"}},"maxBy":{"args":{"list":{"type":"array","desc":"the rows"},"key":{"type":"string","desc":"the numeric field"}},"argNames":["list","key"],"desc":"the row with the largest value of a field","implementation":{"kind":"code"}},"median":{"args":{"list":{"type":"array","desc":"the numbers to take the median of"}},"argNames":["list"],"desc":"the median of a list of numbers","implementation":{"kind":"code"}},"min":{"args":{"values":{"type":"number[]","desc":"the numbers to take the minimum of","rest":true}},"argNames":["values"],"desc":"the smallest of the values","implementation":{"kind":"code"}},"minBy":{"args":{"list":{"type":"array","desc":"the rows"},"key":{"type":"string","desc":"the numeric field"}},"argNames":["list","key"],"desc":"the row with the smallest value of a field","implementation":{"kind":"code"}},"mod":{"args":{"a":{"type":"number","desc":"the dividend"},"b":{"type":"number","desc":"the divisor"}},"argNames":["a","b"],"desc":"remainder of a divided by b","implementation":{"kind":"code"}},"monthName":{"args":{"d":{"type":"any","desc":"the date"}},"argNames":["d"],"desc":"a date's month name","implementation":{"kind":"code"}},"neq":{"args":{"a":{"type":"any","desc":"the first value"},"b":{"type":"any","desc":"the second value"}},"argNames":["a","b"],"desc":"strict inequality (atom form of !=)","implementation":{"kind":"code"}},"not":{"args":{"v":{"type":"any","desc":"the value to negate"}},"argNames":["v"],"desc":"boolean negation (the atom form of ! — inline, just use !)","implementation":{"kind":"code"}},"now":{"args":{"at":{"type":"any","desc":"an explicitly captured instant (ISO string, epoch milliseconds, or Date)"}},"argNames":["at"],"desc":"normalize an explicitly captured instant to an ISO-8601 string (UTC); it never reads the wall clock","implementation":{"kind":"code"}},"nth":{"args":{"list":{"type":"array","desc":"the list"},"i":{"type":"number","desc":"the index"}},"argNames":["list","i"],"desc":"the item at an index","implementation":{"kind":"code"}},"omit":{"args":{"obj":{"type":"object","desc":"the object"},"ks":{"type":"string","desc":"the keys to drop","rest":true}},"argNames":["obj","ks"],"desc":"an object without the listed keys","implementation":{"kind":"code"}},"ordinal":{"args":{"n":{"type":"number","desc":"the number (→ 1st, 2nd, …)"}},"argNames":["n"],"desc":"the ordinal form of an integer (3 → 3rd)","implementation":{"kind":"code"}},"padEnd":{"args":{"s":{"type":"string","desc":"the string to pad"},"len":{"type":"number","desc":"the target length"},"ch":{"type":"string","desc":"the pad character","default":" "}},"argNames":["s","len","ch"],"desc":"right-pad a string to a length","implementation":{"kind":"code"}},"padStart":{"args":{"s":{"type":"string","desc":"the string to pad"},"len":{"type":"number","desc":"the target length"},"ch":{"type":"string","desc":"the pad character","default":" "}},"argNames":["s","len","ch"],"desc":"left-pad a string to a length","implementation":{"kind":"code"}},"partition":{"args":{"list":{"type":"array","desc":"the rows"},"key":{"type":"string","desc":"the field to test"},"value":{"type":"any","desc":"the value that splits matches from the rest"}},"argNames":["list","key","value"],"desc":"two lists: rows matching a field value, and the rest","implementation":{"kind":"code"}},"percent":{"args":{"n":{"type":"number","desc":"the fraction (0..1)"},"places":{"type":"number","desc":"decimal places"}},"argNames":["n","places"],"desc":"format a 0..1 ratio as a percentage string","implementation":{"kind":"code"}},"pick":{"args":{"obj":{"type":"object","desc":"the object"},"ks":{"type":"string","desc":"the keys to keep","rest":true}},"argNames":["obj","ks"],"desc":"an object with only the listed keys","implementation":{"kind":"code"}},"pluck":{"args":{"list":{"type":"array","desc":"the rows"},"key":{"type":"string","desc":"the field to pluck from each row"}},"argNames":["list","key"],"desc":"one field's value from every row","implementation":{"kind":"code"}},"pluralize":{"args":{"n":{"type":"number","desc":"the count"},"singular":{"type":"string","desc":"the singular form"},"plural":{"type":"string","desc":"the plural form"}},"argNames":["n","singular","plural"],"desc":"choose singular or plural by a count (default plural: singular + s)","implementation":{"kind":"code"}},"pow":{"args":{"base":{"type":"number","desc":"the base"},"exp":{"type":"number","desc":"the exponent"}},"argNames":["base","exp"],"desc":"base raised to an exponent","implementation":{"kind":"code"}},"product":{"args":{"list":{"type":"array","desc":"the numbers to multiply"}},"argNames":["list"],"desc":"multiply a list of numbers","implementation":{"kind":"code"}},"range":{"args":{"start":{"type":"number","desc":"the start (inclusive)"},"end":{"type":"number","desc":"the end (exclusive)"},"step":{"type":"number","desc":"the step","default":1}},"argNames":["start","end","step"],"desc":"a list of numbers from start to end (exclusive) by step","implementation":{"kind":"code"}},"relativeTime":{"args":{"d":{"type":"any","desc":"the date"},"at":{"type":"any","desc":"the explicitly captured comparison instant"}},"argNames":["d","at"],"desc":"a human 'ago / in …' phrase relative to an explicitly captured instant","implementation":{"kind":"code"}},"repeat":{"args":{"s":{"type":"string","desc":"the string to repeat"},"n":{"type":"number","desc":"the repeat count"}},"argNames":["s","n"],"desc":"repeat a string n times","implementation":{"kind":"code"}},"replace":{"args":{"s":{"type":"string","desc":"the source string"},"find":{"type":"string","desc":"the substring to find (every occurrence)"},"repl":{"type":"string","desc":"the replacement"}},"argNames":["s","find","repl"],"desc":"replace every occurrence of a substring","implementation":{"kind":"code"}},"replaceFirst":{"args":{"s":{"type":"string","desc":"the source string"},"find":{"type":"string","desc":"the substring to find (first occurrence)"},"repl":{"type":"string","desc":"the replacement"}},"argNames":["s","find","repl"],"desc":"replace only the first occurrence of a substring","implementation":{"kind":"code"}},"resolveRoute":{"args":{"path":{"type":"string","desc":"the current route path (state.path)"},"routes":{"type":"any","desc":"the normalized route table (state.$routes) or a raw `routes` declaration"},"hash":{"type":"string","desc":"the current URL fragment (state.hash) — the client-only `#…` tail","default":""},"origin":{"type":"string","desc":"the address this page was served from (state.origin) — `scheme://host`, empty where nothing served it","default":""}},"argNames":["path","routes","hash","origin"],"desc":"resolve the current path against a normalized route table","implementation":{"kind":"code"}},"reverse":{"args":{"list":{"type":"array","desc":"the list to reverse"}},"argNames":["list"],"desc":"a reversed copy of a list","implementation":{"kind":"code"}},"round":{"args":{"n":{"type":"number","desc":"the value to round"},"places":{"type":"number","desc":"decimal places","default":0}},"argNames":["n","places"],"desc":"round to a number of decimal places","implementation":{"kind":"code"}},"routeActive":{"args":{"target":{"type":"string","desc":"the link target path (a route prefix, e.g. '/todos')"},"path":{"type":"string","desc":"the current route path (state.path)"},"exact":{"type":"boolean","desc":"require an exact match rather than a prefix match","default":false}},"argNames":["target","path","exact"],"desc":"test whether a link target is active for the current path","implementation":{"kind":"code"}},"searchBy":{"args":{"arr":{"type":"array","desc":"the rows to search"},"field":{"type":"string","desc":"the field to match on each row"},"q":{"type":"string","desc":"a case-insensitive substring to find"}},"argNames":["arr","field","q"],"desc":"rows whose field contains a case-insensitive substring","implementation":{"kind":"code"}},"sign":{"args":{"n":{"type":"number","desc":"the value"}},"argNames":["n"],"desc":"-1, 0, or 1 by the number's sign","implementation":{"kind":"code"}},"size":{"args":{"obj":{"type":"any","desc":"an object, array, or string"}},"argNames":["obj"],"desc":"how many own keys an object has","implementation":{"kind":"code"}},"slice":{"args":{"s":{"type":"string","desc":"the source string"},"start":{"type":"number","desc":"start index (negative counts from the end)"},"end":{"type":"number","desc":"end index, exclusive"}},"argNames":["s","start","end"],"desc":"take a substring by start/end indexes","implementation":{"kind":"code"}},"sliceList":{"args":{"list":{"type":"array","desc":"the list"},"start":{"type":"number","desc":"start index"},"end":{"type":"number","desc":"end index, exclusive"}},"argNames":["list","start","end"],"desc":"a sub-list by start/end indexes","implementation":{"kind":"code"}},"slugify":{"args":{"s":{"type":"string","desc":"the string to slugify"}},"argNames":["s"],"desc":"lowercase, hyphen-separated url slug of a string","implementation":{"kind":"code"}},"sortBy":{"args":{"arr":{"type":"array","desc":"the rows to sort"},"field":{"type":"string","desc":"the field to sort by (omit to sort raw values)"},"dir":{"type":"string","desc":"asc or desc","default":"asc"}},"argNames":["arr","field","dir"],"desc":"rows ordered by a field (numbers numerically, nulls last; 'desc' reverses)","implementation":{"kind":"code"}},"split":{"args":{"s":{"type":"string","desc":"the string to split"},"sep":{"type":"string","desc":"the separator"}},"argNames":["s","sep"],"desc":"split a string into a list by a separator","implementation":{"kind":"code"}},"sqrt":{"args":{"n":{"type":"number","desc":"the value"}},"argNames":["n"],"desc":"square root","implementation":{"kind":"code"}},"startOf":{"args":{"d":{"type":"any","desc":"the date"},"unit":{"type":"string","desc":"the unit (day/week/month/year — weeks start Sunday)"}},"argNames":["d","unit"],"desc":"a date floored to the start of a unit","implementation":{"kind":"code"}},"startsWith":{"args":{"s":{"type":"string","desc":"the string to test"},"p":{"type":"string","desc":"the prefix"}},"argNames":["s","p"],"desc":"whether a string starts with a prefix","implementation":{"kind":"code"}},"sum":{"args":{"list":{"type":"array","desc":"the numbers to sum"}},"argNames":["list"],"desc":"add up a list of numbers","implementation":{"kind":"code"}},"sumBy":{"args":{"list":{"type":"array","desc":"the rows"},"key":{"type":"string","desc":"the numeric field to sum"}},"argNames":["list","key"],"desc":"add up one numeric field across rows","implementation":{"kind":"code"}},"tail":{"args":{"list":{"type":"array","desc":"the list (all but the first)"}},"argNames":["list"],"desc":"all items but the first","implementation":{"kind":"code"}},"take":{"args":{"list":{"type":"array","desc":"the list"},"n":{"type":"number","desc":"how many from the front"}},"argNames":["list","n"],"desc":"the first n items","implementation":{"kind":"code"}},"thousands":{"args":{"n":{"type":"number","desc":"the number to group with thousands separators"}},"argNames":["n"],"desc":"group a number's digits with commas","implementation":{"kind":"code"}},"titleCase":{"args":{"s":{"type":"string","desc":"the string to title-case"}},"argNames":["s"],"desc":"capitalize the first letter of every word","implementation":{"kind":"code"}},"toBoolean":{"args":{"v":{"type":"any","desc":"the value to coerce to a boolean"}},"argNames":["v"],"desc":"coerce a value to a boolean","implementation":{"kind":"code"}},"toInt":{"args":{"v":{"type":"any","desc":"the value to coerce to a truncated integer"}},"argNames":["v"],"desc":"coerce a value to an integer","implementation":{"kind":"code"}},"toJson":{"args":{"v":{"type":"any","desc":"the value to serialize"},"indent":{"type":"number","desc":"indent spaces"}},"argNames":["v","indent"],"desc":"serialize a value to JSON text (optional indent)","implementation":{"kind":"code"}},"toJsonBase64":{"args":{"v":{"type":"any","desc":"a JSON value or JSON document string to compact and encode as base64"}},"argNames":["v"],"desc":"compact a JSON value or JSON document string and encode it as base64","implementation":{"kind":"code"}},"toNumber":{"args":{"v":{"type":"any","desc":"the value to coerce to a number (non-numeric → 0)"}},"argNames":["v"],"desc":"coerce a value to a number (NaN-safe input parsing)","implementation":{"kind":"code"}},"today":{"args":{"at":{"type":"any","desc":"an explicitly captured instant"}},"argNames":["at"],"desc":"UTC midnight containing an explicitly captured instant","implementation":{"kind":"code"}},"trim":{"args":{"s":{"type":"string","desc":"the string to trim"}},"argNames":["s"],"desc":"strip surrounding whitespace","implementation":{"kind":"code"}},"trimEnd":{"args":{"s":{"type":"string","desc":"the string to right-trim"}},"argNames":["s"],"desc":"strip trailing whitespace","implementation":{"kind":"code"}},"trimStart":{"args":{"s":{"type":"string","desc":"the string to left-trim"}},"argNames":["s"],"desc":"strip leading whitespace","implementation":{"kind":"code"}},"truncate":{"args":{"s":{"type":"string","desc":"the string to truncate"},"len":{"type":"number","desc":"the maximum length"},"ellipsis":{"type":"string","desc":"the trailing ellipsis"}},"argNames":["s","len","ellipsis"],"desc":"cut a string to a length, appending an ellipsis when cut","implementation":{"kind":"code"}},"typeOf":{"args":{"v":{"type":"any","desc":"the value"}},"argNames":["v"],"desc":"the value's type name","implementation":{"kind":"code"}},"union":{"args":{"a":{"type":"array","desc":"the first list"},"b":{"type":"array","desc":"the second list"}},"argNames":["a","b"],"desc":"values in either list, deduplicated","implementation":{"kind":"code"}},"unique":{"args":{"list":{"type":"array","desc":"the list to dedupe (by value)"}},"argNames":["list"],"desc":"a list with duplicate values removed","implementation":{"kind":"code"}},"uniqueBy":{"args":{"list":{"type":"array","desc":"the rows to dedupe"},"key":{"type":"string","desc":"the field to dedupe by"}},"argNames":["list","key"],"desc":"a list with duplicate rows removed by a key field","implementation":{"kind":"code"}},"unix":{"args":{"d":{"type":"any","desc":"the date"}},"argNames":["d"],"desc":"a date as unix seconds","implementation":{"kind":"code"}},"upper":{"args":{"s":{"type":"string","desc":"the string to upper-case"}},"argNames":["s"],"desc":"uppercase a string","implementation":{"kind":"code"}},"values":{"args":{"obj":{"type":"object","desc":"the object"}},"argNames":["obj"],"desc":"an object's own values","implementation":{"kind":"code"}},"weekday":{"args":{"d":{"type":"any","desc":"the date"}},"argNames":["d"],"desc":"a date's weekday name","implementation":{"kind":"code"}},"without":{"args":{"list":{"type":"array","desc":"the list"},"vals":{"type":"any","desc":"the values to remove","rest":true}},"argNames":["list","vals"],"desc":"a list excluding the given values","implementation":{"kind":"code"}},"words":{"args":{"s":{"type":"string","desc":"the string to split into words"}},"argNames":["s"],"desc":"split a string into its words","implementation":{"kind":"code"}},"zip":{"args":{"a":{"type":"array","desc":"the first list"},"b":{"type":"array","desc":"the second list"}},"argNames":["a","b"],"desc":"pair the items of two lists positionally","implementation":{"kind":"code"}}},"operationContracts":{"append":{"args":{"path":{"type":"path","desc":"the list path to append to"},"value":{"type":"any","desc":"the item to append"}},"argNames":["path","value"],"desc":"append the item to the end of the list at path","effects":{"writes":[{"kind":"field","value":"path"}],"reads":[{"kind":"field","value":"path"}],"deterministic":true},"core":false},"decr":{"args":{"path":{"type":"path","desc":"the numeric state path to subtract from"},"by":{"type":"number","desc":"amount to subtract","default":1}},"argNames":["path","by"],"desc":"subtract an amount (default 1) from a number at a state path","effects":{"writes":[{"kind":"field","value":"path"}],"reads":[{"kind":"field","value":"path"}],"deterministic":true},"core":false},"dedupe":{"args":{"path":{"type":"path","desc":"the list path to dedupe"},"key":{"type":"string","desc":"the field to dedupe by; omit to dedupe by whole value","default":null}},"argNames":["path","key"],"desc":"remove duplicate items from the list at path (by a key field when given, else by value)","effects":{"writes":[{"kind":"field","value":"path"}],"reads":[{"kind":"field","value":"path"}],"deterministic":true},"core":false},"deepMerge":{"args":{"path":{"type":"path","desc":"the object path to deep-merge into"},"value":{"type":"object","desc":"the object recursively merged in (nested objects merge; arrays/scalars replace)"}},"argNames":["path","value"],"desc":"recursively merge an object into the object at path (nested plain objects merge; arrays and scalars replace)","effects":{"writes":[{"kind":"field","value":"path"}],"reads":[{"kind":"field","value":"path"}],"deterministic":true},"core":false},"delete":{"args":{"path":{"type":"path","desc":"the object path to remove a key from"},"key":{"type":"string","desc":"the own key to remove"}},"argNames":["path","key"],"desc":"remove one own key from the object at path","effects":{"writes":[{"kind":"field","value":"path"}],"reads":[{"kind":"field","value":"path"}],"deterministic":true},"core":false},"insertAt":{"args":{"path":{"type":"path","desc":"the list path to insert into"},"index":{"type":"number","desc":"position to insert at (number or {{ }} expression; clamped to [0, length])"},"value":{"type":"any","desc":"the item to insert"}},"argNames":["path","index","value"],"desc":"insert the item at a position in the list at path (index clamps to the ends)","effects":{"writes":[{"kind":"field","value":"path"}],"reads":[{"kind":"field","value":"path"}],"deterministic":true},"core":false},"merge":{"args":{"path":{"type":"path","desc":"the object path to merge into"},"value":{"type":"object","desc":"the object whose keys are shallow-merged in"}},"argNames":["path","value"],"desc":"shallow-merge an object into the object at path (top-level keys overwrite)","effects":{"writes":[{"kind":"field","value":"path"}],"reads":[{"kind":"field","value":"path"}],"deterministic":true},"core":false},"move":{"args":{"path":{"type":"path","desc":"the list path to reorder"},"from":{"type":"number","desc":"index to move from (number or {{ }} expression)"},"to":{"type":"number","desc":"index to move to (number or {{ }} expression)"}},"argNames":["path","from","to"],"desc":"move a list item from one position to another (positions clamp; same-position is a no-op)","effects":{"writes":[{"kind":"field","value":"path"}],"reads":[{"kind":"field","value":"path"}],"deterministic":true},"core":false},"patchWhere":{"args":{"path":{"type":"path","desc":"the list path"},"id":{"type":"any","desc":"the id value to match"},"idKey":{"type":"string","desc":"the field matched against id (read own-only)","default":"id"},"value":{"type":"object","desc":"the object shallow-merged into the matched row (top-level keys overwrite)"}},"argNames":["path","id","idKey","value"],"desc":"in the list at path, shallow-merge an object into the row whose idKey matches id (untouched fields survive)","effects":{"writes":[{"kind":"field","value":"path"}],"reads":[{"kind":"field","value":"path"}],"deterministic":true},"core":false},"prepend":{"args":{"path":{"type":"path","desc":"the list path to prepend to"},"value":{"type":"any","desc":"the item to prepend"}},"argNames":["path","value"],"desc":"insert the item at the start of the list at path","effects":{"writes":[{"kind":"field","value":"path"}],"reads":[{"kind":"field","value":"path"}],"deterministic":true},"core":false},"pushUnique":{"args":{"path":{"type":"path","desc":"the list path to append to"},"value":{"type":"any","desc":"the item to append if absent"}},"argNames":["path","value"],"desc":"append the item to the list only if it is not already present","effects":{"writes":[{"kind":"field","value":"path"}],"reads":[{"kind":"field","value":"path"}],"deterministic":true},"core":false},"removeAt":{"args":{"path":{"type":"path","desc":"the list path to remove from"},"index":{"type":"number","desc":"position to remove (number or {{ }} expression)"}},"argNames":["path","index"],"desc":"remove the item at a position from the list at path","effects":{"writes":[{"kind":"field","value":"path"}],"reads":[{"kind":"field","value":"path"}],"deterministic":true},"core":false},"removeWhere":{"args":{"path":{"type":"path","desc":"the list path to filter"},"key":{"type":"string","desc":"the field compared on each item (read own-only)"},"value":{"type":"any","desc":"items whose key equals this are dropped"}},"argNames":["path","key","value"],"desc":"remove every row whose key field equals the value from the list at path","effects":{"writes":[{"kind":"field","value":"path"}],"reads":[{"kind":"field","value":"path"}],"deterministic":true},"core":false},"setIfEmpty":{"args":{"path":{"type":"path","desc":"the path to default"},"value":{"type":"any","desc":"the value to set when the path is null/absent"}},"argNames":["path","value"],"desc":"write the value only when the path is empty (null/undefined/empty string)","effects":{"writes":[{"kind":"field","value":"path"}],"reads":[{"kind":"field","value":"path"}],"deterministic":true},"core":false},"sortList":{"args":{"path":{"type":"path","desc":"the list path to sort"},"key":{"type":"string","desc":"the field to sort by"},"dir":{"type":"string","desc":"'desc' reverses; otherwise ascending","default":"asc"}},"argNames":["path","key","dir"],"desc":"reorder the list at path by a field (through the sortBy helper), ascending or descending","effects":{"writes":[{"kind":"field","value":"path"}],"reads":[{"kind":"field","value":"path"}],"deterministic":true},"core":false},"swap":{"args":{"pathA":{"type":"path","desc":"one state path"},"pathB":{"type":"path","desc":"the other state path"}},"argNames":["pathA","pathB"],"desc":"exchange the values at two state paths","effects":{"writes":[{"kind":"field","value":"pathA"},{"kind":"field","value":"pathB"}],"reads":[{"kind":"field","value":"pathA"},{"kind":"field","value":"pathB"}],"deterministic":true},"core":false},"unsetPath":{"args":{"path":{"type":"path","desc":"the property path to remove; dynamic-keyed brackets are resolved against scope at dispatch"}},"argNames":["path"],"desc":"remove the state slot at path entirely (the key is deleted, not set to undefined)","effects":{"writes":[{"kind":"field","value":"path"}],"reads":[{"kind":"field","value":"path"}],"deterministic":true},"core":false},"upsert":{"args":{"path":{"type":"path","desc":"the list path"},"value":{"type":"object","desc":"the row to insert or replace"},"key":{"type":"string","desc":"the field matched to find an existing row (own-only)"}},"argNames":["path","value","key"],"desc":"in the list at path, replace the row with a matching id or append it when absent","effects":{"writes":[{"kind":"field","value":"path"}],"reads":[{"kind":"field","value":"path"}],"deterministic":true},"core":false}},"provenance":{"source":"@manifest-ui/singularity-standard","review":"package source and canonical vocabulary conformance"}},{"schema":"singularity.vocabulary-pack.v1","namespace":"tenant-media","version":"1.0.0","runtime":"1","exposure":"qualified","contractAddress":"1fd360faf8ff3e20","helpers":[{"name":"tenant_media__imageUrl","id":"tenant-media@1.0.0:imageUrl"}],"operations":[],"helperContracts":{"tenant_media__imageUrl":{"args":{"asset":{"type":"any","desc":"a ready asset cell carrying its canonical url, or an existing First Light media URL. ABSENT OR BLANK ANSWERS BLANK — a missing asset yields an empty string rather than a broken address, so a caller's own no-image branch still takes and NO GUARD IS NEEDED around this call"},"width":{"type":"number","desc":"required positive delivery width; SNAPS UP to the next supported preset (64, 128, 256, 320, 512, 768, 1024, 1600, 2048, 4096), so 640 is served as 768"},"height":{"type":"number","desc":"optional positive delivery height; snaps up to the same preset ladder as width"}},"argNames":["asset","width","height"],"desc":"First Light media image derivative — request a width and optional height from the canonical asset URL without exposing storage or host resolver state. A missing or blank asset answers with an empty string, so callers need no guard of their own; widths snap UP to the nearest supported preset.","implementation":{"kind":"code"}}},"operationContracts":{},"provenance":{"source":"@manifest-ui/singularity-data-cloudflare/tenant-media/delivery","review":"package source and isolated First Light media delivery-vocabulary conformance"}}]},"lifecycle":{"schema":"singularity.lifecycle-runtime.v1","version":"1","id":"7a1a19228cf82a40","packs":[{"schema":"singularity.lifecycle-pack.v1","namespace":"singularity.lifecycle","version":"1.1.0","runtime":"1","exposure":"builtin-bare","contractAddress":"26e812930c8fb315","triggers":[{"name":"inbox","id":"singularity.lifecycle@1.1.0:inbox"},{"name":"observe","id":"singularity.lifecycle@1.1.0:observe"},{"name":"schedule","id":"singularity.lifecycle@1.1.0:schedule"}],"agents":[],"triggerContracts":{"inbox":{"desc":"fire when the host delivers a message on a named channel","config":"name","payload":{"type":"any","desc":"the open message value delivered by the host"}},"observe":{"desc":"fire on a false-to-true state/computed expression transition","config":"expression"},"schedule":{"desc":"fire authored actions on a timezone-exact calendar slot, or on a sub-minute in-process cadence","config":"schedule","payload":{"type":"object","desc":"captured facts about this schedule fire","fields":{"at":{"type":"number","desc":"epoch milliseconds captured at the actual fire or wake","required":true}}}}},"agentContracts":{},"provenance":{"source":"@manifest-ui/singularity-standard","review":"package source and canonical lifecycle conformance"}}]},"policy":{"schema":"singularity.policy-runtime.v1","version":"1","id":"5ef6cbd2063aaebc","packs":[{"schema":"singularity.policy-pack.v1","namespace":"first-light-actor","version":"1.0.0","runtime":"1","exposure":"qualified","contractAddress":"fcd3c88b0b2fdac9","manifestBlocks":[],"capabilityContributors":[],"capabilityContracts":{},"actorMatchers":[{"name":"first-light-actor.has","id":"first-light-actor@1.0.0:has"}],"actorMatcherContracts":{"first-light-actor.has":{"desc":"Match one application-local actor to a trusted First Light authority fact.","config":{"actor":{"type":"string","optional":false,"desc":"The First Light authority fact this local label wears; `teaching:first-light-actor/facts` states which caller each fact admits.","enum":["first-light.app-visitor","first-light.app-subject","first-light.app-builder","first-light.app-administrator","first-light.app-transferor","first-light.app-support","first-light.app-automation"]}}}},"provenance":{"source":"first-light/session-authority","review":"actor-authority-cutover"}}]},"ports":{"schema":"singularity.port-runtime.v1","version":"1","id":"4f20ffe4e3020cf6","packs":[{"schema":"singularity.port-pack.v1","namespace":"first-light-reads","version":"1.0.0","runtime":"1","contractAddress":"9c90f50d1367a78f","capabilities":[],"contracts":{},"sources":{"publicCatalog":{"owner":"first-light-reads","definition":{"schema":"singularity.source-definition.v1","namespace":"first-light.data","version":"1.0.0","name":"publicCatalog","contract":{"desc":"First Light's public commercial offer and template catalog, projected as one coherent read model.","live":true,"collections":{"publicCatalog":{"desc":"One public catalog row containing the current commercial offer and public templates.","read":"anonymous","ops":["query"],"queryFields":[],"fields":{"id":{"type":"string","desc":"Stable catalog row identity."},"commercialOffer":{"type":"object","members":{"schema":{"type":"string","enum":["first-light.public-commercial-offer/v1"]},"id":"string","headline":"string","summary":"string","items":{"type":"array","items":{"type":"object","members":{"id":{"type":"string","enum":["start","builder","images","publishing"]},"eyebrow":"string","price":"string","title":"string","summary":"string"}}},"controls":{"type":"array","items":"string"}},"desc":"What First Light sells, as a customer is shown it."},"templates":{"type":"array","items":{"type":"object","members":{"id":"string","sourceAppId":"string","name":"string","summary":"string","authorName":"string","licenseSpdx":{"type":"string","enum":["CC0-1.0","CC-BY-4.0"]},"manifestSha256":"string","capabilities":{"type":"array","items":{"type":"object","members":{"kind":"string","label":"string","summary":"string"}}},"screenshots":{"type":"array","items":{"type":"object","members":{"id":{"type":"string","enum":["desktop-light","desktop-dark","mobile-light","mobile-dark"]},"viewport":{"type":"string","enum":["desktop","mobile"]},"theme":{"type":"string","enum":["light","dark"]},"width":"number","height":"number","url":"string"}}},"mediaCount":"number","mediaBytes":"number","reviewedAtMs":"number","useCount":"number","listedAtMs":"number"}},"desc":"Newest listing first."}},"live":true}}},"result":{"kind":"rows","maxRows":1,"maxBytes":524288,"classification":"public"},"stream":{"semantics":"snapshot","recovery":"snapshot"},"authority":{"mode":"public"},"id":"source:9cfe36d29e4c3394"}},"accountSummary":{"owner":"first-light-reads","definition":{"schema":"singularity.source-definition.v1","namespace":"first-light.data","version":"1.0.0","name":"accountSummary","contract":{"desc":"The signed-in First Light account's profile, commercial state, and entitlements.","live":true,"collections":{"accountSummary":{"desc":"One account row joining profile, billing, payment recovery, and entitlement state.","read":"principal","ops":["query"],"queryFields":[],"fields":{"id":{"type":"string","desc":"The verified First Light account identity."},"profile":{"type":"object","members":{"email":"string","displayName":"string","avatarUrl":"string?","handle":"string?"},"desc":"Who the customer is, as this account states it."},"billing":{"type":"union","variants":[{"type":"object","members":{"enabled":{"type":"boolean","enum":[false]}}},{"type":"object","members":{"enabled":{"type":"boolean","enum":[true]},"availableMicrocents":"number","availableUsd":"string","heldMicrocents":"number","heldUsd":"string","availableEmpty":"boolean","freeTierCents":"number","payments":"boolean","card":{"type":"object","members":{"brand":"string?","last4":"string","expMonth":"number?","expYear":"number?","updatedAtMs":"number?"},"optional":true},"topOff":{"type":"object","members":{"enabled":"boolean","amountCents":"number","amountUsd":"string","updatedAtMs":"number?","inFlight":"boolean?","lastError":"string?"}},"paymentOutcome":{"type":"object","members":{"status":{"type":"string","enum":["succeeded","canceled"]},"paymentIntentId":"string","amountCents":"number","amountUsd":"string","atMs":"number"},"optional":true},"paymentPending":{"type":"object","members":{"pending":{"type":"boolean","enum":[true]},"checkable":"boolean","kind":{"type":"string","enum":["manual","automatic"]},"amountCents":"number","amountUsd":"string"},"optional":true},"paymentRecovery":{"type":"object","members":{"pending":{"type":"boolean","enum":[true]},"kind":{"type":"string","enum":["manual","automatic"]},"amountCents":"number","amountUsd":"string"},"optional":true}}}],"desc":"Commercial state; `enabled` says which of the two rows arrived."},"entitlements":{"type":"object","members":{"grants":{"type":"array","items":"string"}},"desc":"Entitlement names this account holds; the roster is open by design."}},"live":true}}},"result":{"kind":"rows","maxRows":1,"maxBytes":524288,"classification":"private"},"stream":{"semantics":"snapshot","recovery":"snapshot"},"authority":{"mode":"lease"},"id":"source:615ba4e7d1f2b9f9"}},"accountPortfolio":{"owner":"first-light-reads","definition":{"schema":"singularity.source-definition.v1","namespace":"first-light.data","version":"1.0.0","name":"accountPortfolio","contract":{"desc":"The signed-in account's lightweight app portfolio and reusable domain inventory.","live":true,"collections":{"accountPortfolio":{"desc":"One portfolio row joining app summaries, deployment facets, and account-owned domains.","read":"principal","ops":["query"],"queryFields":[],"fields":{"id":{"type":"string","desc":"The verified First Light account identity."},"apps":{"type":"array","items":{"type":"object","members":{"id":"string","role":{"type":"string","enum":["owner","admin","editor"]},"name":"string?","summary":"string?","thumbnailUrl":"string?","deployment":{"type":"object","members":{"published":"boolean","slug":{"type":"string","optional":true,"desc":"The app's DNS label alone — no dots, no scheme. Its origin is `https://<slug>.<the deployment's apps domain>/`; this source carries no apps domain."}}}}},"desc":"Ordered by id; no source manifests."},"domains":{"type":"array","items":{"type":"object","members":{"id":"string","source":{"type":"string","enum":["external","registered"]},"status":{"type":"string","enum":["pending_verification","pending_dns","provisioning_cert","registering","active","failed","releasing","expiring"]},"appId":"string?","serving":"boolean","verification":{"type":"array","items":{"type":"object","members":{"type":"string","name":"string","value":"string","purpose":"string"}}},"renewal":{"type":"object","members":{"expiresAtMs":"number?","delinquent":"boolean","price":{"type":"object","members":{"microcents":"number","currency":"string","estimated":"boolean"},"optional":true}},"optional":true,"desc":"registered domains only"},"custody":{"type":"object","members":{"disclosureRevision":"string","transferStatus":{"type":"string","enum":["operator-action"],"optional":true}},"optional":true,"desc":"present while First Light holds the registration"}}},"desc":"Ordered by id."},"custody":{"type":"object","members":{"purchaseDisclosureRevision":"string","transferDisclosureRevision":"string"},"desc":"The exact revisions `purchase.domain` and `domain.request-transfer` accept right now; either write is refused with any other value."}},"live":true}}},"result":{"kind":"rows","maxRows":1,"maxBytes":524288,"classification":"private"},"stream":{"semantics":"snapshot","recovery":"snapshot"},"authority":{"mode":"lease"},"id":"source:4ba1ddf019819b9a"}},"accountSecurity":{"owner":"first-light-reads","definition":{"schema":"singularity.source-definition.v1","namespace":"first-light.data","version":"1.0.0","name":"accountSecurity","contract":{"desc":"The signed-in account's authentication methods, passkeys, and active sessions.","live":true,"collections":{"accountSecurity":{"desc":"One private security row refreshed from the account mutation outbox.","read":"principal","ops":["query"],"queryFields":[],"fields":{"id":{"type":"string","desc":"The verified First Light account identity."},"currentSessionId":{"type":"string","desc":"The verified session family serving this read; it matches one `sessions[].id`."},"credentials":{"type":"object","members":{"methods":{"type":"object","members":{"email":"boolean","google":"boolean","passkey":"boolean"}},"passkeys":{"type":"array","items":{"type":"object","members":{"id":"string","label":"string","createdAtMs":"number","lastUsedAtMs":"number"}}}},"desc":"Which ways in this account has, and its registered passkeys."},"sessions":{"type":"array","items":{"type":"object","members":{"id":"string","deviceLabel":"string","authenticationMethod":{"type":"string","enum":["unknown","email","google","passkey"]},"createdAtMs":"number","lastSeenAtMs":"number","expiresAtMs":"number","absoluteExpiresAtMs":"number"}},"desc":"`account.revoke-session` takes one of these `id`s."}},"live":true}}},"result":{"kind":"rows","maxRows":1,"maxBytes":524288,"classification":"private"},"stream":{"semantics":"snapshot","recovery":"snapshot"},"authority":{"mode":"lease"},"id":"source:84cf318fdc65a325"}},"appWorkspace":{"owner":"first-light-reads","definition":{"schema":"singularity.source-definition.v1","namespace":"first-light.data","version":"1.0.0","name":"appWorkspace","contract":{"desc":"One authorized First Light app's source, deployment, builder, and preview projection.","live":true,"collections":{"appWorkspace":{"desc":"One app workspace row selected by appId and projected for the verified app member.","read":"principal","ops":["query"],"queryFields":[],"params":["appId"],"fields":{"id":{"type":"string","desc":"The authorized app identity."},"access":{"type":"object","members":{"permissions":{"type":"object","members":{"publish":{"type":"boolean","desc":"Whether the verified caller may publish this app's current authored head."}}}},"desc":"Action permissions derived from the verified caller's live app grant; role names do not cross this seam."},"app":{"type":"object","members":{"name":"string","summary":"string","thumbnailUrl":"string?","source":{"type":"object","members":{"revision":"string","head":{"type":"string","optional":true,"desc":"Content token for the exact current manifest head; absent before the first build."},"sequence":"number","manifestSrc64":"string"}}},"desc":"The app's own identity and its current authored source."},"deployment":{"type":"object","members":{"head":{"type":"string","optional":true,"desc":"Content token for the exact manifest head currently served by every deployment address; absent only on a legacy publication until it is published again."},"primaryAddress":{"type":"object","members":{"kind":{"type":"string","enum":["slug"]},"value":"string","url":"string"},"optional":true,"desc":"The included First Light subdomain; absent only when this host has no apps domain. Open url as-is."},"addresses":{"type":"array","items":{"type":"union","variants":[{"type":"object","members":{"kind":{"type":"string","enum":["slug"]},"value":{"type":"string","desc":"The app's DNS LABEL alone — no dots, no scheme, not a hostname. It is the name the customer chose, for display and for comparison; it is never a link on its own."},"url":{"type":"string","desc":"Where this app opens: the label joined to the deployment's apps domain, on the scheme and port this deployment serves. No trailing slash. Use it as-is."}}},{"type":"object","members":{"kind":{"type":"string","enum":["host"]},"value":{"type":"string","desc":"A complete lowercase hostname — an attached custom domain, exactly as the customer holds it at their registrar."},"url":{"type":"string","desc":"Where this app opens on that hostname, on the scheme and port this deployment serves. No trailing slash. Use it as-is."}}}]},"maxItems":32}},"optional":true,"desc":"Absent until a published head exists."},"builder":{"type":"object","members":{"posture":{"type":"union","variants":[{"type":"object","members":{"type":{"type":"string","enum":["idle"]},"actions":{"type":"array","items":{"type":"object","members":{"type":{"type":"string","enum":["sendMessage","cancel","retry","continue","addFunds","backToApps","openAccess","contactSupport"]},"label":"string"}},"maxItems":8}}},{"type":"object","members":{"type":{"type":"string","enum":["working"]},"activity":{"type":"object","members":{"code":{"type":"string","enum":["planning","navigation","interface","styling","features","review","imagery"]},"label":"string"}},"actions":{"type":"array","items":{"type":"object","members":{"type":{"type":"string","enum":["sendMessage","cancel","retry","continue","addFunds","backToApps","openAccess","contactSupport"]},"label":"string"}},"maxItems":8}}},{"type":"object","members":{"type":{"type":"string","enum":["waitingForUser"]},"question":{"type":"object","members":{"messageId":"string","text":"string"}},"actions":{"type":"array","items":{"type":"object","members":{"type":{"type":"string","enum":["sendMessage","cancel","retry","continue","addFunds","backToApps","openAccess","contactSupport"]},"label":"string"}},"maxItems":8}}},{"type":"object","members":{"type":{"type":"string","enum":["paused"]},"cause":{"type":"string","enum":["funds"]},"title":"string","message":"string","funding":{"type":"object","members":{"requiredMicrocents":"number","topUpCents":"number","coversRequirement":"boolean"}},"actions":{"type":"array","items":{"type":"object","members":{"type":{"type":"string","enum":["sendMessage","cancel","retry","continue","addFunds","backToApps","openAccess","contactSupport"]},"label":"string"}},"maxItems":8}}},{"type":"object","members":{"type":{"type":"string","enum":["paused"]},"cause":{"type":"string","enum":["spendingLimit","interrupted"]},"title":"string","message":"string","actions":{"type":"array","items":{"type":"object","members":{"type":{"type":"string","enum":["sendMessage","cancel","retry","continue","addFunds","backToApps","openAccess","contactSupport"]},"label":"string"}},"maxItems":8}}},{"type":"object","members":{"type":{"type":"string","enum":["readyToContinue"]},"title":"string","message":"string","actions":{"type":"array","items":{"type":"object","members":{"type":{"type":"string","enum":["sendMessage","cancel","retry","continue","addFunds","backToApps","openAccess","contactSupport"]},"label":"string"}},"maxItems":8}}},{"type":"object","members":{"type":{"type":"string","enum":["complete"]},"actions":{"type":"array","items":{"type":"object","members":{"type":{"type":"string","enum":["sendMessage","cancel","retry","continue","addFunds","backToApps","openAccess","contactSupport"]},"label":"string"}},"maxItems":8}}},{"type":"object","members":{"type":{"type":"string","enum":["failed"]},"title":"string","message":"string","recoverable":"boolean","actions":{"type":"array","items":{"type":"object","members":{"type":{"type":"string","enum":["sendMessage","cancel","retry","continue","addFunds","backToApps","openAccess","contactSupport"]},"label":"string"}},"maxItems":8}}},{"type":"object","members":{"type":{"type":"string","enum":["cancelled"]},"title":"string","message":"string","actions":{"type":"array","items":{"type":"object","members":{"type":{"type":"string","enum":["sendMessage","cancel","retry","continue","addFunds","backToApps","openAccess","contactSupport"]},"label":"string"}},"maxItems":8}}}]},"messages":{"type":"array","items":{"type":"union","variants":[{"type":"object","members":{"id":"string","sequence":"number","workId":"string","role":{"type":"string","enum":["user"]},"kind":{"type":"string","enum":["message"]},"text":"string","media":{"type":"array","items":{"type":"object","members":{"id":"string","ref":"string","url":"string","source":{"type":"string","enum":["attached","generated"]},"name":"string?","type":"string?","size":"number?","width":"number","height":"number","alt":"string?","description":"string?"}},"maxItems":1000},"createdAt":"string"}},{"type":"object","members":{"id":"string","sequence":"number","workId":"string","role":{"type":"string","enum":["builder"]},"kind":{"type":"string","enum":["question","outcome","problem"]},"text":"string","media":{"type":"array","items":{"type":"object","members":{"id":"string","ref":"string","url":"string","source":{"type":"string","enum":["attached","generated"]},"name":"string?","type":"string?","size":"number?","width":"number","height":"number","alt":"string?","description":"string?"}},"maxItems":1000},"createdAt":"string"}}]},"maxItems":50},"beforeCursor":{"type":"object","members":{"sequence":"number","messageId":"string"},"optional":true},"spendMicrocents":"number"},"desc":"One authoritative posture and the latest immutable chronological message page."}},"live":true}}},"result":{"kind":"rows","maxRows":1,"maxBytes":3000000,"classification":"private"},"stream":{"semantics":"snapshot","recovery":"snapshot"},"authority":{"mode":"lease"},"id":"source:7fdb601f5c3c7f25"}},"appBuilderMessages":{"owner":"first-light-reads","definition":{"schema":"singularity.source-definition.v1","namespace":"first-light.data","version":"1.0.0","name":"appBuilderMessages","contract":{"desc":"Earlier immutable builder conversation messages for one authorized First Light app.","collections":{"appBuilderMessages":{"desc":"A keyset-paged builder message history selected by appId, ordered by sequence descending then id descending so the cursor is the exact reverse of chronological order.","read":"principal","ops":["query"],"queryFields":["orderBy","limit","after"],"params":["appId"],"maxLimit":100,"fields":{"id":{"type":"string","desc":"Immutable message identity."},"sequence":{"type":"number","desc":"Immutable journal ordinal used with id as the stable history cursor."},"workId":{"type":"string","desc":"Durable builder work identity."},"kind":{"type":"string","enum":["message","question","outcome","problem"],"desc":"The message's purpose and author: message is the user; question, outcome, and problem are First Light."},"text":{"type":"string","desc":"Exact immutable conversational text."},"media":{"type":"array","items":{"type":"object","members":{"id":"string","ref":"string","url":"string","source":{"type":"string","enum":["attached","generated"]},"name":"string?","type":"string?","size":"number?","width":"number","height":"number","alt":"string?","description":"string?"}},"maxItems":1000,"desc":"Media attached to this message."},"createdAt":{"type":"string","desc":"Durable creation time."}}}}},"result":{"kind":"rows","maxRows":100,"maxBytes":4000000,"classification":"private"},"stream":{"semantics":"none","recovery":"none"},"authority":{"mode":"lease"},"id":"source:6bc9e859147d3fb3"}},"appAdministration":{"owner":"first-light-reads","definition":{"schema":"singularity.source-definition.v1","namespace":"first-light.data","version":"1.0.0","name":"appAdministration","contract":{"desc":"Role-projected access, ownership transfer, capability configuration, and capability readiness for one app.","live":true,"collections":{"appAdministration":{"desc":"One administration row selected by appId; privileged fields are omitted unless the verified role permits them.","read":"principal","ops":["query"],"queryFields":[],"params":["appId"],"fields":{"id":{"type":"string","desc":"The authorized app identity."},"access":{"type":"object","members":{"role":{"type":"string","enum":["owner","admin","editor"]},"permissions":{"type":"object","members":{"manageTeam":"boolean","transferOwnership":"boolean","manageCapabilities":"boolean","leaveApp":"boolean"}},"members":{"type":"array","items":{"type":"object","members":{"id":"string","role":{"type":"string","enum":["owner","admin","editor"]},"current":"boolean","name":"string?","email":"string?","avatarUrl":"string?"}}},"invitations":{"type":"array","items":{"type":"object","members":{"email":"string","role":{"type":"string","enum":["editor","admin"]},"delivery":{"type":"string","enum":["sending","sent"]},"expiresAtMs":"number"}},"optional":true,"desc":"manageTeam only"},"assignableRoles":{"type":"array","items":{"type":"object","members":{"value":{"type":"string","enum":["editor","admin"]},"label":"string","summary":"string"}},"optional":true,"desc":"manageTeam only"},"support":{"type":"array","items":{"type":"object","members":{"accountId":"string","reason":"string","createdAtMs":"number","expiresAtMs":"number"}},"optional":true,"desc":"transferOwnership only"},"supportEvidence":{"type":"array","items":{"type":"object","members":{"id":"string","kind":{"type":"string","enum":["observe","enforce","recover"]},"reason":"string","occurredAtMs":"number","accessExpiresAtMs":"number","ticket":"string?"}},"optional":true,"desc":"transferOwnership only"}},"desc":"`permissions` decides which optional members arrive; an absent one means the caller may not see it, never that it is empty."},"transfer":{"type":"object","members":{"pending":"boolean","offer":{"type":"object","members":{"requestId":"string","delivery":{"type":"string","enum":["sending","sent"]},"recipientEmail":"string","keepPreviousOwnerAsManager":"boolean","createdAtMs":"number","expiresAtMs":"number"},"optional":true}},"optional":true,"desc":"Present only for a caller holding transferOwnership."},"template":{"type":"object","members":{"id":"string","status":{"type":"string","enum":["pending","approved","rejected"]},"authorName":"string","licenseSpdx":"string","submissionNote":"string","submittedAtMs":"number","manifestSha256":"string","capabilityKinds":{"type":"array","items":"string","maxItems":100},"mediaCount":"number","mediaBytes":"number","live":"boolean","notificationStatus":{"type":"string","enum":["none","pending","sending","sent","refused","uncertain"]},"decidedAtMs":"number?","decisionNote":"string?","releaseId":"string?"},"optional":true,"desc":"The latest immutable template submission; present only for an app manager."},"capabilities":{"type":"array","items":{"type":"object","members":{"id":"string","kind":"string","label":"string","summary":"string","category":{"type":"string","enum":["people","content","business","automation","platform"]},"setup":{"type":"string","enum":["included","connect"]},"useCases":{"type":"array","items":{"type":"object","members":{"id":"string","label":"string"}}},"status":{"type":"string","enum":["included","available","paused","off","setup-required","check-required"]},"available":"boolean","manageable":"boolean","verification":{"type":"object","members":{"status":{"type":"string","enum":["not-required","not-checked","verified","rejected"]},"scope":"string?","code":{"type":"string","enum":["credentials-rejected","permission-denied"],"optional":true},"facts":{"type":"array","items":{"type":"object","members":{"id":"string","label":"string","value":"string","valueLabel":"string","message":"string","readiness":{"type":"string","enum":["ready","attention"]}}}},"complete":"boolean","checkedAtMs":"number?","field":{"type":"object","members":{"kind":{"type":"string","enum":["field","secret"]},"id":"string"},"optional":true}}},"configuration":{"type":"object","members":{"revision":"number","enabled":"boolean","fields":{"type":"array","items":{"type":"object","members":{"id":"string","label":"string","description":"string","type":{"type":"string","enum":["string","number","boolean","string[]","number[]","boolean[]"]},"required":"boolean","value":{"type":"union","variants":["string","number","boolean",{"type":"array","items":{"type":"union","variants":["string","number","boolean"]}}],"optional":true}}}},"secrets":{"type":"array","items":{"type":"object","members":{"id":"string","label":"string","description":"string","type":{"type":"string","enum":["string","number","boolean","string[]","number[]","boolean[]"]},"required":"boolean","set":"boolean"}}},"replacement":{"type":"object","members":{"fields":{"type":"array","items":{"type":"object","members":{"id":"string","label":"string","description":"string","type":{"type":"string","enum":["string","number","boolean","string[]","number[]","boolean[]"]},"required":"boolean","value":{"type":"union","variants":["string","number","boolean",{"type":"array","items":{"type":"union","variants":["string","number","boolean"]}}],"optional":true}}}},"secrets":{"type":"array","items":{"type":"object","members":{"id":"string","label":"string","description":"string","type":{"type":"string","enum":["string","number","boolean","string[]","number[]","boolean[]"]},"required":"boolean","set":"boolean"}}},"verification":{"type":"object","members":{"status":{"type":"string","enum":["not-required","not-checked","verified","rejected"]},"scope":"string?","code":{"type":"string","enum":["credentials-rejected","permission-denied"],"optional":true},"facts":{"type":"array","items":{"type":"object","members":{"id":"string","label":"string","value":"string","valueLabel":"string","message":"string","readiness":{"type":"string","enum":["ready","attention"]}}}},"complete":"boolean","checkedAtMs":"number?","field":{"type":"object","members":{"kind":{"type":"string","enum":["field","secret"]},"id":"string"},"optional":true}}},"stagedAtMs":"number?"},"optional":true},"lastOperation":{"type":"object","members":{"id":"string","action":{"type":"string","enum":["stage","pause","resume","discard","remove","verify"]},"outcome":{"type":"string","enum":["applied","verified","rejected"]},"atMs":"number"},"optional":true}},"optional":true}}},"desc":"This app's capabilities only."},"readiness":{"type":"object","members":{"totalCapabilities":"number","readyCapabilities":"number","needsSetupCapabilities":"number","needsReviewCapabilities":"number"},"desc":"Counted over `capabilities` above; workspace and deployment readiness remain in appWorkspace."}},"live":true}}},"result":{"kind":"rows","maxRows":1,"maxBytes":524288,"classification":"private"},"stream":{"semantics":"snapshot","recovery":"snapshot"},"authority":{"mode":"lease"},"id":"source:afec13e256a8d8c0"}},"domainSearch":{"owner":"first-light-reads","definition":{"schema":"singularity.source-definition.v1","namespace":"first-light.data","version":"1.0.0","name":"domainSearch","contract":{"desc":"Bounded, non-authoritative domain availability candidates for a signed-in First Light account.","collections":{"domainSearch":{"desc":"A short-lived customer quote projection for one normalized search phrase.","read":"principal","ops":["query"],"queryFields":[],"params":["q"],"fields":{"name":{"type":"string","desc":"The candidate domain name."},"available":{"type":"boolean","desc":"Whether the candidate was available at lookup time."},"premium":{"type":"boolean","desc":"Whether the provider classifies the candidate as premium."},"reason":{"type":"string","optional":true,"desc":"A bounded public reason when the candidate cannot be offered."},"priceDollars":{"type":"number","optional":true,"desc":"The displayed first-year price in major currency units."},"totalMicrocents":{"type":"number","optional":true,"desc":"The exact displayed first-year price in microcents."},"currency":{"type":"string","optional":true,"desc":"The ISO currency code for the displayed price."}}}}},"result":{"kind":"rows","maxRows":12,"maxBytes":32768,"classification":"public"},"stream":{"semantics":"none","recovery":"none"},"authority":{"mode":"lease"},"id":"source:bff5399bcc58a0f1"}}},"provenance":{"source":"@manifest-ui/first-light-data","review":"product-owned source definitions and canonical ResourceCoordinator conformance"}},{"schema":"singularity.port-pack.v1","namespace":"first-light","version":"1.0.0","runtime":"1","contractAddress":"6b72f5e6b39711b8","capabilities":[{"kind":"first-light.access","id":"first-light@1.0.0:access"},{"kind":"first-light.account","id":"first-light@1.0.0:account"},{"kind":"first-light.apps","id":"first-light@1.0.0:apps"},{"kind":"first-light.billing","id":"first-light@1.0.0:billing"},{"kind":"first-light.domains","id":"first-light@1.0.0:domains"},{"kind":"first-light.email","id":"first-light@1.0.0:email"},{"kind":"first-light.features","id":"first-light@1.0.0:features"},{"kind":"first-light.templates","id":"first-light@1.0.0:templates"},{"kind":"first-light.transfer","id":"first-light@1.0.0:transfer"},{"kind":"first-light.workspace","id":"first-light@1.0.0:workspace"}],"contracts":{"first-light.access":{"desc":"Runs the app team lifecycle. Reads arrive through First Light's appAdministration source; this capability owns only the declared write authority.","target":"browser","actions":{"access.invite":{"desc":"Invite one email address onto this app. `appAdministration.access.assignableRoles` carries the same roster with its customer labels.","input":{"appId":"string","email":"string","role":{"type":"string","enum":["editor","admin"]}},"policy":{"authorization":"app.manager","audit":"security","cost":"none","recovery":"reconcile","reversibility":"compensating"},"problems":{"AUTHENTICATION_REQUIRED":"after-sign-in","ACCESS_DENIED":"never","BAD_REQUEST":"after-correction","NOT_FOUND":"after-refresh","CONFLICT":"after-refresh","RATE_LIMITED":"after-delay","UPSTREAM_UNAVAILABLE":"after-delay","SERVICE_UNAVAILABLE":"after-delay","INTERNAL_ERROR":"safe","FIRST_LIGHT_COMMAND_NOT_RECEIVED":"safe","FIRST_LIGHT_COMMAND_STATUS_UNRESOLVED":"never","FIRST_LIGHT_PREVIOUS_COMMAND_UNRESOLVED":"never"}},"access.revoke-invite":{"input":{"appId":"string","email":"string"},"policy":{"authorization":"app.manager","audit":"security","cost":"none","recovery":"reconcile","reversibility":"compensating"},"problems":{"AUTHENTICATION_REQUIRED":"after-sign-in","ACCESS_DENIED":"never","BAD_REQUEST":"after-correction","NOT_FOUND":"after-refresh","CONFLICT":"after-refresh","RATE_LIMITED":"after-delay","UPSTREAM_UNAVAILABLE":"after-delay","SERVICE_UNAVAILABLE":"after-delay","INTERNAL_ERROR":"safe","FIRST_LIGHT_COMMAND_NOT_RECEIVED":"safe","FIRST_LIGHT_COMMAND_STATUS_UNRESOLVED":"never","FIRST_LIGHT_PREVIOUS_COMMAND_UNRESOLVED":"never"}},"access.set-role":{"desc":"Change one member's seat, or remove them from the app entirely with the empty role.","input":{"appId":"string","accountId":"string","role":{"type":"string","enum":["editor","admin",""]}},"policy":{"authorization":"app.manager","audit":"security","cost":"none","recovery":"reconcile","reversibility":"compensating"},"problems":{"AUTHENTICATION_REQUIRED":"after-sign-in","ACCESS_DENIED":"never","BAD_REQUEST":"after-correction","NOT_FOUND":"after-refresh","CONFLICT":"after-refresh","RATE_LIMITED":"after-delay","UPSTREAM_UNAVAILABLE":"after-delay","SERVICE_UNAVAILABLE":"after-delay","INTERNAL_ERROR":"safe","FIRST_LIGHT_COMMAND_NOT_RECEIVED":"safe","FIRST_LIGHT_COMMAND_STATUS_UNRESOLVED":"never","FIRST_LIGHT_PREVIOUS_COMMAND_UNRESOLVED":"never"}},"access.leave":{"input":{"appId":"string"},"policy":{"authorization":"app.member","audit":"security","cost":"none","recovery":"reconcile","reversibility":"compensating"},"problems":{"AUTHENTICATION_REQUIRED":"after-sign-in","ACCESS_DENIED":"never","BAD_REQUEST":"after-correction","NOT_FOUND":"after-refresh","CONFLICT":"after-refresh","RATE_LIMITED":"after-delay","UPSTREAM_UNAVAILABLE":"after-delay","SERVICE_UNAVAILABLE":"after-delay","INTERNAL_ERROR":"safe","FIRST_LIGHT_COMMAND_NOT_RECEIVED":"safe","FIRST_LIGHT_COMMAND_STATUS_UNRESOLVED":"never","FIRST_LIGHT_PREVIOUS_COMMAND_UNRESOLVED":"never"}},"access.end-support":{"input":{"appId":"string","accountId":"string"},"policy":{"authorization":"app.owner-or-support-self","audit":"security","cost":"none","recovery":"reconcile","reversibility":"compensating"},"problems":{"AUTHENTICATION_REQUIRED":"after-sign-in","ACCESS_DENIED":"never","BAD_REQUEST":"after-correction","NOT_FOUND":"after-refresh","CONFLICT":"after-refresh","RATE_LIMITED":"after-delay","UPSTREAM_UNAVAILABLE":"after-delay","SERVICE_UNAVAILABLE":"after-delay","INTERNAL_ERROR":"safe","FIRST_LIGHT_COMMAND_NOT_RECEIVED":"safe","FIRST_LIGHT_COMMAND_STATUS_UNRESOLVED":"never","FIRST_LIGHT_PREVIOUS_COMMAND_UNRESOLVED":"never"}},"invite.accept":{"input":{"appId":"string","code":"string"},"policy":{"authorization":"account.self","audit":"app","cost":"none","recovery":"reconcile","reversibility":"compensating"},"problems":{"AUTHENTICATION_REQUIRED":"after-sign-in","ACCESS_DENIED":"never","BAD_REQUEST":"after-correction","NOT_FOUND":"after-refresh","CONFLICT":"after-refresh","RATE_LIMITED":"after-delay","UPSTREAM_UNAVAILABLE":"after-delay","SERVICE_UNAVAILABLE":"after-delay","INTERNAL_ERROR":"safe","FIRST_LIGHT_COMMAND_NOT_RECEIVED":"safe","FIRST_LIGHT_COMMAND_STATUS_UNRESOLVED":"never","FIRST_LIGHT_PREVIOUS_COMMAND_UNRESOLVED":"never"}}}},"first-light.account":{"desc":"Runs signed-in account writes. Reads arrive through accountSummary/accountSecurity; credential and account removal still retire the browser identity through the declared auth dependency.","target":"browser","using":{"identity":{"desc":"The platform identity whose cookie authorizes account actions and whose projection must settle signed-out after credential or account removal.","kind":"platform.auth.web","required":true}},"actions":{"account.save-profile":{"desc":"Update the signed-in account's profile. Omit a field to leave it unchanged; send an empty string to clear it. Both are read back as `accountSummary.profile`.","input":{"name":{"type":"string","optional":true,"desc":"Display name. Control characters become spaces, runs of whitespace collapse, and the result is trimmed to 80 characters — never refused for length. Read back as `accountSummary.profile.displayName`."},"avatar":{"type":"string","optional":true,"desc":"An ABSOLUTE http/https URL to an image, at most 2048 characters; stored normalized. Not an `asset://` ref, not a path, not an upload — anything else is BAD_REQUEST. Read back as `accountSummary.profile.avatarUrl`."}},"policy":{"authorization":"account.self","audit":"security","cost":"none","recovery":"reconcile","reversibility":"compensating"},"problems":{"AUTHENTICATION_REQUIRED":"after-sign-in","BAD_REQUEST":"after-correction","CONFLICT":"after-refresh","INTERNAL_ERROR":"safe","FIRST_LIGHT_COMMAND_NOT_RECEIVED":"safe","FIRST_LIGHT_COMMAND_STATUS_UNRESOLVED":"never","FIRST_LIGHT_PREVIOUS_COMMAND_UNRESOLVED":"never"}},"account.remove-passkey":{"input":{"credentialId":"string"},"policy":{"authorization":"account.self.recent","audit":"security","cost":"none","recovery":"reconcile","reversibility":"compensating"},"problems":{"AUTHENTICATION_REQUIRED":"after-sign-in","BAD_REQUEST":"after-correction","NOT_FOUND":"after-refresh","CONFLICT":"after-refresh","REQUEST_FAILED":"after-refresh","SERVICE_UNAVAILABLE":"after-delay","INTERNAL_ERROR":"safe","FIRST_LIGHT_COMMAND_NOT_RECEIVED":"safe","FIRST_LIGHT_COMMAND_STATUS_UNRESOLVED":"never","FIRST_LIGHT_PREVIOUS_COMMAND_UNRESOLVED":"never"}},"account.revoke-session":{"input":{"sessionId":"string"},"policy":{"authorization":"account.self","audit":"security","cost":"none","recovery":"reconcile","reversibility":"compensating"},"problems":{"AUTHENTICATION_REQUIRED":"after-sign-in","BAD_REQUEST":"after-correction","NOT_FOUND":"after-refresh","INTERNAL_ERROR":"safe","FIRST_LIGHT_COMMAND_NOT_RECEIVED":"safe","FIRST_LIGHT_COMMAND_STATUS_UNRESOLVED":"never","FIRST_LIGHT_PREVIOUS_COMMAND_UNRESOLVED":"never"}},"account.revoke-other-sessions":{"input":{},"policy":{"authorization":"account.self","audit":"security","cost":"none","recovery":"reconcile","reversibility":"compensating"},"problems":{"AUTHENTICATION_REQUIRED":"after-sign-in","INTERNAL_ERROR":"safe","FIRST_LIGHT_COMMAND_NOT_RECEIVED":"safe","FIRST_LIGHT_COMMAND_STATUS_UNRESOLVED":"never","FIRST_LIGHT_PREVIOUS_COMMAND_UNRESOLVED":"never"}},"account.delete":{"desc":"Erase the signed-in account. `confirm` is compared trimmed and case-insensitively; it is not the account email and not a display name. Irreversible.","input":{"confirm":{"type":"string","enum":["delete my account"]}},"policy":{"authorization":"account.self.recent","audit":"security","cost":"none","recovery":"reconcile","reversibility":"irreversible"},"problems":{"AUTHENTICATION_REQUIRED":"after-sign-in","BAD_REQUEST":"after-correction","CONFLICT":"after-refresh","RATE_LIMITED":"after-delay","INTERNAL_ERROR":"safe","FIRST_LIGHT_COMMAND_NOT_RECEIVED":"safe","FIRST_LIGHT_COMMAND_STATUS_UNRESOLVED":"never","FIRST_LIGHT_PREVIOUS_COMMAND_UNRESOLVED":"never"}}}},"first-light.apps":{"desc":"Runs the app catalog lifecycle through the engine action ingress: create, annotate, build, rename, publish, unpublish, and delete. Durable effects own replay and reconciliation; catalog and workspace state arrive through read/live projections.","target":"browser","host":{"mounts":{"builderPreview":{"desc":"The signed-in platform host's reviewed handoff to one authorized app's isolated draft origin."}}},"outputs":{"element":{"desc":"Mounts one authorized draft app in an isolated sibling-origin frame. The trusted binder owns the handoff URL, frame lifecycle, and sizing; the manifest supplies only the app identity and immutable source revision that reconciles the mount.","default":"builder_app_preview","params":{"appId":{"type":"string","desc":"The confirmed app workspace identity."},"revision":{"type":"string","desc":"The confirmed immutable source revision; a new revision remounts the draft frame."}}}},"actions":{"app.create":{"input":{"name":"string","summary":"string?","slug":"string?","templateId":"string?"},"result":{"schema":{"appId":"string"},"maxBytes":256,"classification":"private"},"policy":{"authorization":"account.self","audit":"app","cost":"none","recovery":"reconcile","reversibility":"compensating"},"problems":{"AUTHENTICATION_REQUIRED":"after-sign-in","ACCESS_DENIED":"never","BAD_REQUEST":"after-correction","NOT_FOUND":"after-refresh","CONFLICT":"after-refresh","RATE_LIMITED":"after-delay","UPSTREAM_UNAVAILABLE":"after-delay","SERVICE_UNAVAILABLE":"after-delay","INTERNAL_ERROR":"safe","FIRST_LIGHT_COMMAND_NOT_RECEIVED":"safe","FIRST_LIGHT_COMMAND_STATUS_UNRESOLVED":"never","FIRST_LIGHT_PREVIOUS_COMMAND_UNRESOLVED":"never"}},"app.rename":{"input":{"appId":"string","name":"string"},"policy":{"authorization":"app.member","audit":"app","cost":"none","recovery":"reconcile","reversibility":"compensating"},"problems":{"AUTHENTICATION_REQUIRED":"after-sign-in","ACCESS_DENIED":"never","BAD_REQUEST":"after-correction","NOT_FOUND":"after-refresh","CONFLICT":"after-refresh","SERVICE_UNAVAILABLE":"after-delay","INTERNAL_ERROR":"safe","FIRST_LIGHT_COMMAND_NOT_RECEIVED":"safe","FIRST_LIGHT_COMMAND_STATUS_UNRESOLVED":"never","FIRST_LIGHT_PREVIOUS_COMMAND_UNRESOLVED":"never"}},"app.annotation.put":{"input":{"appId":"string","annotationKey":"string","value":"any","forHead":"string"},"policy":{"authorization":"app.owner","audit":"app","cost":"none","recovery":"retry-idempotent","reversibility":"compensating"},"problems":{"AUTHENTICATION_REQUIRED":"after-sign-in","ACCESS_DENIED":"never","BAD_REQUEST":"after-correction","NOT_FOUND":"after-refresh","CONFLICT":"after-refresh","RATE_LIMITED":"after-delay","SERVICE_UNAVAILABLE":"after-delay","INTERNAL_ERROR":"safe","FIRST_LIGHT_COMMAND_NOT_RECEIVED":"safe","FIRST_LIGHT_COMMAND_STATUS_UNRESOLVED":"never","FIRST_LIGHT_PREVIOUS_COMMAND_UNRESOLVED":"never"}},"app.publish":{"input":{"appId":"string"},"policy":{"authorization":"app.manager","audit":"app","cost":"none","recovery":"reconcile","reversibility":"compensating"},"problems":{"AUTHENTICATION_REQUIRED":"after-sign-in","ACCESS_DENIED":"never","BAD_REQUEST":"after-correction","UNPROCESSABLE_CONTENT":"after-correction","NOT_FOUND":"after-refresh","CONFLICT":"after-refresh","SERVICE_UNAVAILABLE":"after-delay","INTERNAL_ERROR":"safe","FIRST_LIGHT_COMMAND_NOT_RECEIVED":"safe","FIRST_LIGHT_COMMAND_STATUS_UNRESOLVED":"never","FIRST_LIGHT_PREVIOUS_COMMAND_UNRESOLVED":"never"}},"app.unpublish":{"input":{"appId":"string"},"policy":{"authorization":"app.manager","audit":"app","cost":"none","recovery":"reconcile","reversibility":"compensating"},"problems":{"AUTHENTICATION_REQUIRED":"after-sign-in","ACCESS_DENIED":"never","BAD_REQUEST":"after-correction","NOT_FOUND":"after-refresh","CONFLICT":"after-refresh","SERVICE_UNAVAILABLE":"after-delay","INTERNAL_ERROR":"safe","FIRST_LIGHT_COMMAND_NOT_RECEIVED":"safe","FIRST_LIGHT_COMMAND_STATUS_UNRESOLVED":"never","FIRST_LIGHT_PREVIOUS_COMMAND_UNRESOLVED":"never"}},"app.delete":{"input":{"appId":"string","confirmName":"string"},"policy":{"authorization":"app.owner","audit":"app","cost":"none","recovery":"reconcile","reversibility":"irreversible"},"problems":{"AUTHENTICATION_REQUIRED":"after-sign-in","ACCESS_DENIED":"never","BAD_REQUEST":"after-correction","NOT_FOUND":"after-refresh","CONFLICT":"after-refresh","SERVICE_UNAVAILABLE":"after-delay","INTERNAL_ERROR":"safe","FIRST_LIGHT_COMMAND_NOT_RECEIVED":"safe","FIRST_LIGHT_COMMAND_STATUS_UNRESOLVED":"never","FIRST_LIGHT_PREVIOUS_COMMAND_UNRESOLVED":"never"}},"app.builder.message":{"desc":"Send one immutable message to the app's durable builder conversation. The server decides whether it starts new work or answers the current question. Each attachment's `id` and `ref` are taken verbatim from an `appMedia` row and ids must be unique; `url` is NOT sent. `message` is 1..4000 characters after trimming.","input":{"appId":"string","message":"string","quality":{"type":"string","enum":["low","medium","high"]},"attachments":{"type":"array","items":{"type":"object","members":{"id":"string","ref":"string"}},"maxItems":8,"optional":true}},"policy":{"authorization":"app.member","audit":"app","cost":"none","recovery":"reconcile","reversibility":"compensating"},"problems":{"AUTHENTICATION_REQUIRED":"after-sign-in","ACCESS_DENIED":"never","BAD_REQUEST":"after-correction","CONFLICT":"after-refresh","RATE_LIMITED":"after-delay","BUILDER_COMMAND_NOT_RECEIVED":"safe","BUILDER_MESSAGE_STATUS_UNAVAILABLE":"never","SERVICE_UNAVAILABLE":"after-delay","INTERNAL_ERROR":"safe","FIRST_LIGHT_COMMAND_NOT_RECEIVED":"safe","FIRST_LIGHT_COMMAND_STATUS_UNRESOLVED":"never","FIRST_LIGHT_PREVIOUS_COMMAND_UNRESOLVED":"never"}},"app.builder.control":{"desc":"Apply one server-rostered control to the current durable builder work. `continue` is accepted only after an authoritative financial recheck lands the distinct ready-to-continue posture; account credits and reconciliation never restart authoring by themselves.","input":{"appId":"string","control":{"type":"string","enum":["cancel","retry","continue"]}},"policy":{"authorization":"app.member","audit":"app","cost":"none","recovery":"reconcile","reversibility":"compensating"},"problems":{"AUTHENTICATION_REQUIRED":"after-sign-in","ACCESS_DENIED":"never","BAD_REQUEST":"after-correction","NOT_FOUND":"after-refresh","CONFLICT":"after-refresh","BUILDER_COMMAND_NOT_RECEIVED":"safe","BUILDER_CONTROL_STATUS_UNAVAILABLE":"never","SERVICE_UNAVAILABLE":"after-delay","INTERNAL_ERROR":"safe","FIRST_LIGHT_COMMAND_NOT_RECEIVED":"safe","FIRST_LIGHT_COMMAND_STATUS_UNRESOLVED":"never","FIRST_LIGHT_PREVIOUS_COMMAND_UNRESOLVED":"never"}}}},"first-light.billing":{"desc":"Owns First Light's account wallet: the browser-mounted payment element collects a card or confirms bank-requested authentication without card data reaching the app, while declared purchase, saved-card, auto-top-off, and recovery writes use the engine action ingress. Only the two short-lived secret ceremonies bypass durable effects; provider secrets remain transient and reads refresh from account projections.","target":"browser","outputs":{"element":{"desc":"The payment form widget: in `setup` mode it mounts the provider Payment Element and confirms one saved-card setup; in `authentication` mode it confirms an already-created payment that the bank requires the account owner to approve. MOUNT IT ON A `form` NODE. Confirmation has no action and no imperative handle: it begins when that form raises its own native submit event, so the manifest must render a submit control (`button` with `type: \"submit\"`) inside the mounted node — without one the widget mounts, reports `card.ready`, and can never be confirmed. In `setup` mode the form must also contain the `mountSelector` node the provider's card fields render into. The lifecycle is: onReady (card.ready) → onChange (card.complete, card.message) → submit → onSubmit → onSuccess (card.setupIntentId / payment.paymentIntentId) or onError (card.message); a second submit while one is in flight is ignored.","default":"card_setup_form","params":{"publishableKey":{"type":"string","desc":"The server-issued publishable key for this setup session."},"clientSecret":{"type":"string","desc":"The short-lived server-issued setup client secret; it remains browser-only."},"paymentMethodId":{"type":"string","desc":"The account's already-saved provider PaymentMethod id, returned transiently only when a failed off-session confirmation cleared it from the pending intent.","default":""},"mode":{"type":"string","enum":["setup","authentication"],"desc":"`setup` collects a card; `authentication` confirms the pending payment without mounting card fields.","default":"setup"},"returnUrl":{"type":"string","desc":"The absolute URL the provider returns the account owner to when their bank requires a redirect. REQUIRED: only the app knows where someone interrupted mid-payment should land, and once the browser is on the bank's site there is nothing for a root-relative address to resolve against. `{{ route.origin }}{{ state.path }}` is this page; a screen that reads the settled payment is often the better destination."},"mountSelector":{"type":"string","desc":"A descendant selector naming the provider-owned card mount region.","default":"[data-card-setup-element]"},"appearance":{"type":"object","desc":"{ theme: string, variables: { <appearance variable>: string }?, rules: { <provider selector>: { <css property>: string } }? } — handed verbatim to the provider's Elements appearance option, so this is the ONLY way the card fields take the app's colours. `{}` is structurally valid and yields the provider's own default palette, which is a decision and rarely the right one. The reviewed First Light value sets `theme` and the `variables` keys colorPrimary, colorBackground, colorText, colorTextSecondary, colorTextPlaceholder, colorDanger and borderRadius."},"appearanceDark":{"type":"object","desc":"{ theme: string, variables: { <appearance variable>: string }?, rules: { <provider selector>: { <css property>: string } }? } — the same contract, applied when the browser reports `prefers-color-scheme: dark`, and re-applied live when the scheme changes while the form is mounted. Omit it ONLY if the light value is correct in dark: the widget falls back to `appearance`, it does not derive a dark palette."},"onReady":{"type":"actions","desc":"The declarative actions dispatched when the card form is ready."},"onChange":{"type":"actions","desc":"The declarative actions dispatched with card.complete and card.message after field changes."},"onSubmit":{"type":"actions","desc":"The declarative actions dispatched immediately before confirmation begins."},"onSuccess":{"type":"actions","desc":"The declarative actions dispatched with card.setupIntentId after successful confirmation."},"onError":{"type":"actions","desc":"The declarative actions dispatched with a safe card.message after initialization or confirmation fails."}}}},"actions":{"card.begin":{"desc":"Start one short-lived provider card setup session.","policy":{"authorization":"account.self","audit":"financial","cost":"none","recovery":"reconcile","reversibility":"compensating"},"result":{"schema":{"publishable_key":"string","client_secret":"string","setup_intent_id":"string"},"maxBytes":16384,"classification":"sensitive"},"problems":{"AUTHENTICATION_REQUIRED":"after-sign-in","ACCESS_DENIED":"never","PAYMENT_METHOD_REQUIRED":"after-correction","PAYMENT_AUTHENTICATION_REQUIRED":"after-correction","PAYMENT_PENDING":"after-refresh","PAYMENT_DECLINED":"after-correction","BAD_REQUEST":"after-correction","CONFLICT":"after-refresh","RATE_LIMITED":"after-delay","PAYMENTS_UNAVAILABLE":"never","UPSTREAM_UNAVAILABLE":"after-delay","UPSTREAM_TIMEOUT":"after-delay","SERVICE_UNAVAILABLE":"after-delay","INTERNAL_ERROR":"safe","NETWORK_UNAVAILABLE":"safe"}},"payment.authentication.begin":{"desc":"Open the exact pending payment for browser authentication.","policy":{"authorization":"account.self","audit":"financial","cost":"none","recovery":"reconcile","reversibility":"compensating"},"result":{"schema":{"complete":"boolean?","recovery_id":"string","amount_cents":"number","publishable_key":"string?","client_secret":"string?","payment_method_id":"string?"},"maxBytes":16384,"classification":"sensitive"},"problems":{"AUTHENTICATION_REQUIRED":"after-sign-in","ACCESS_DENIED":"never","PAYMENT_METHOD_REQUIRED":"after-correction","PAYMENT_AUTHENTICATION_REQUIRED":"after-correction","PAYMENT_PENDING":"after-refresh","PAYMENT_DECLINED":"after-correction","BAD_REQUEST":"after-correction","CONFLICT":"after-refresh","RATE_LIMITED":"after-delay","PAYMENTS_UNAVAILABLE":"never","UPSTREAM_UNAVAILABLE":"after-delay","UPSTREAM_TIMEOUT":"after-delay","SERVICE_UNAVAILABLE":"after-delay","INTERNAL_ERROR":"safe","NETWORK_UNAVAILABLE":"safe"}},"purchase.credits":{"desc":"Add credits with the saved payment method and persist the accompanying automatic top-off preference before charging.","input":{"amountCents":"number","autoTopOffEnabled":"boolean"},"policy":{"authorization":"account.self","audit":"financial","cost":"reserved","recovery":"reconcile","reversibility":"compensating"},"problems":{"AUTHENTICATION_REQUIRED":"after-sign-in","ACCESS_DENIED":"never","PAYMENT_METHOD_REQUIRED":"after-correction","PAYMENT_AUTHENTICATION_REQUIRED":"after-correction","PAYMENT_PENDING":"after-refresh","PAYMENT_DECLINED":"after-correction","BAD_REQUEST":"after-correction","CONFLICT":"after-refresh","RATE_LIMITED":"after-delay","PAYMENTS_UNAVAILABLE":"never","UPSTREAM_UNAVAILABLE":"after-delay","UPSTREAM_TIMEOUT":"after-delay","SERVICE_UNAVAILABLE":"after-delay","INTERNAL_ERROR":"safe","NETWORK_UNAVAILABLE":"safe","FIRST_LIGHT_COMMAND_NOT_RECEIVED":"safe","FIRST_LIGHT_COMMAND_STATUS_UNRESOLVED":"never","FIRST_LIGHT_PREVIOUS_COMMAND_UNRESOLVED":"never"}},"purchase.domain":{"desc":"Buy one domain against the account balance. `fqdn` is a `domainSearch` candidate's `name`. Availability is re-checked authoritatively here; the search quote is advisory.","input":{"fqdn":"string","disclosureRevision":{"type":"string","enum":["first-light-platform-custody-v1"]}},"policy":{"authorization":"account.self","audit":"financial","cost":"reserved","recovery":"reconcile","reversibility":"compensating"},"problems":{"AUTHENTICATION_REQUIRED":"after-sign-in","ACCESS_DENIED":"never","PAYMENT_METHOD_REQUIRED":"after-correction","PAYMENT_AUTHENTICATION_REQUIRED":"after-correction","PAYMENT_PENDING":"after-refresh","PAYMENT_DECLINED":"after-correction","BAD_REQUEST":"after-correction","CONFLICT":"after-refresh","RATE_LIMITED":"after-delay","PAYMENTS_UNAVAILABLE":"never","UPSTREAM_UNAVAILABLE":"after-delay","UPSTREAM_TIMEOUT":"after-delay","SERVICE_UNAVAILABLE":"after-delay","INTERNAL_ERROR":"safe","NETWORK_UNAVAILABLE":"safe","FIRST_LIGHT_COMMAND_NOT_RECEIVED":"safe","FIRST_LIGHT_COMMAND_STATUS_UNRESOLVED":"never","FIRST_LIGHT_PREVIOUS_COMMAND_UNRESOLVED":"never"}},"card.save":{"input":{"setup_intent_id":"string"},"policy":{"authorization":"account.self","audit":"financial","cost":"none","recovery":"reconcile","reversibility":"compensating"},"problems":{"AUTHENTICATION_REQUIRED":"after-sign-in","ACCESS_DENIED":"never","PAYMENT_METHOD_REQUIRED":"after-correction","PAYMENT_AUTHENTICATION_REQUIRED":"after-correction","PAYMENT_PENDING":"after-refresh","PAYMENT_DECLINED":"after-correction","BAD_REQUEST":"after-correction","CONFLICT":"after-refresh","RATE_LIMITED":"after-delay","PAYMENTS_UNAVAILABLE":"never","UPSTREAM_UNAVAILABLE":"after-delay","UPSTREAM_TIMEOUT":"after-delay","SERVICE_UNAVAILABLE":"after-delay","INTERNAL_ERROR":"safe","NETWORK_UNAVAILABLE":"safe","FIRST_LIGHT_COMMAND_NOT_RECEIVED":"safe","FIRST_LIGHT_COMMAND_STATUS_UNRESOLVED":"never","FIRST_LIGHT_PREVIOUS_COMMAND_UNRESOLVED":"never"}},"card.remove":{"desc":"Remove the saved payment method: the card detaches at the provider, the stored card facts clear, and automatic top-off turns off with them. Refused while a payment is pending.","input":{},"policy":{"authorization":"account.self","audit":"financial","cost":"none","recovery":"reconcile","reversibility":"compensating"},"problems":{"AUTHENTICATION_REQUIRED":"after-sign-in","ACCESS_DENIED":"never","PAYMENT_METHOD_REQUIRED":"after-correction","PAYMENT_AUTHENTICATION_REQUIRED":"after-correction","PAYMENT_PENDING":"after-refresh","PAYMENT_DECLINED":"after-correction","BAD_REQUEST":"after-correction","CONFLICT":"after-refresh","RATE_LIMITED":"after-delay","PAYMENTS_UNAVAILABLE":"never","UPSTREAM_UNAVAILABLE":"after-delay","UPSTREAM_TIMEOUT":"after-delay","SERVICE_UNAVAILABLE":"after-delay","INTERNAL_ERROR":"safe","NETWORK_UNAVAILABLE":"safe","FIRST_LIGHT_COMMAND_NOT_RECEIVED":"safe","FIRST_LIGHT_COMMAND_STATUS_UNRESOLVED":"never","FIRST_LIGHT_PREVIOUS_COMMAND_UNRESOLVED":"never"}},"topoff.save":{"input":{"enabled":"boolean","amountCents":"number"},"policy":{"authorization":"account.self","audit":"financial","cost":"none","recovery":"reconcile","reversibility":"compensating"},"problems":{"AUTHENTICATION_REQUIRED":"after-sign-in","ACCESS_DENIED":"never","PAYMENT_METHOD_REQUIRED":"after-correction","PAYMENT_AUTHENTICATION_REQUIRED":"after-correction","PAYMENT_PENDING":"after-refresh","PAYMENT_DECLINED":"after-correction","BAD_REQUEST":"after-correction","CONFLICT":"after-refresh","RATE_LIMITED":"after-delay","PAYMENTS_UNAVAILABLE":"never","UPSTREAM_UNAVAILABLE":"after-delay","UPSTREAM_TIMEOUT":"after-delay","SERVICE_UNAVAILABLE":"after-delay","INTERNAL_ERROR":"safe","NETWORK_UNAVAILABLE":"safe","FIRST_LIGHT_COMMAND_NOT_RECEIVED":"safe","FIRST_LIGHT_COMMAND_STATUS_UNRESOLVED":"never","FIRST_LIGHT_PREVIOUS_COMMAND_UNRESOLVED":"never"}},"payment.authentication.complete":{"desc":"Complete the exact pending payment returned by payment.authentication.begin. `recoveryId` is opaque and `amountCents` must match that same recovery.","input":{"recoveryId":"string","amountCents":"number"},"policy":{"authorization":"account.self","audit":"financial","cost":"none","recovery":"reconcile","reversibility":"compensating"},"problems":{"AUTHENTICATION_REQUIRED":"after-sign-in","ACCESS_DENIED":"never","PAYMENT_METHOD_REQUIRED":"after-correction","PAYMENT_AUTHENTICATION_REQUIRED":"after-correction","PAYMENT_PENDING":"after-refresh","PAYMENT_DECLINED":"after-correction","BAD_REQUEST":"after-correction","CONFLICT":"after-refresh","RATE_LIMITED":"after-delay","PAYMENTS_UNAVAILABLE":"never","UPSTREAM_UNAVAILABLE":"after-delay","UPSTREAM_TIMEOUT":"after-delay","SERVICE_UNAVAILABLE":"after-delay","INTERNAL_ERROR":"safe","NETWORK_UNAVAILABLE":"safe","FIRST_LIGHT_COMMAND_NOT_RECEIVED":"safe","FIRST_LIGHT_COMMAND_STATUS_UNRESOLVED":"never","FIRST_LIGHT_PREVIOUS_COMMAND_UNRESOLVED":"never"}}}},"first-light.domains":{"desc":"Manages account-owned custom domains: search registrar availability, connect and verify external domains, attach or detach an app, remove a connection, and request assisted custody transfer. Durable mutations use the engine action ingress and live domain projections carry server truth; search remains a bounded browser ceremony. Domain purchase is the billing action purchase.domain so wallet and registration settle together.","target":"browser","actions":{"domain.add-external":{"input":{"fqdn":"string"},"policy":{"authorization":"account.self","audit":"app","cost":"none","recovery":"reconcile","reversibility":"compensating"},"problems":{"AUTHENTICATION_REQUIRED":"after-sign-in","ACCESS_DENIED":"never","BAD_REQUEST":"after-correction","NOT_FOUND":"after-refresh","CONFLICT":"after-refresh","RATE_LIMITED":"after-delay","UPSTREAM_UNAVAILABLE":"after-delay","SERVICE_UNAVAILABLE":"after-delay","INTERNAL_ERROR":"safe","FIRST_LIGHT_COMMAND_NOT_RECEIVED":"safe","FIRST_LIGHT_COMMAND_STATUS_UNRESOLVED":"never","FIRST_LIGHT_PREVIOUS_COMMAND_UNRESOLVED":"never"}},"domain.refresh":{"input":{"fqdn":"string"},"policy":{"authorization":"account.self","audit":"app","cost":"none","recovery":"reconcile","reversibility":"compensating"},"problems":{"AUTHENTICATION_REQUIRED":"after-sign-in","ACCESS_DENIED":"never","BAD_REQUEST":"after-correction","NOT_FOUND":"after-refresh","CONFLICT":"after-refresh","RATE_LIMITED":"after-delay","UPSTREAM_UNAVAILABLE":"after-delay","SERVICE_UNAVAILABLE":"after-delay","INTERNAL_ERROR":"safe","FIRST_LIGHT_COMMAND_NOT_RECEIVED":"safe","FIRST_LIGHT_COMMAND_STATUS_UNRESOLVED":"never","FIRST_LIGHT_PREVIOUS_COMMAND_UNRESOLVED":"never"}},"domain.attach":{"input":{"fqdn":"string","appId":"string"},"policy":{"authorization":"account.app-manager","audit":"app","cost":"none","recovery":"reconcile","reversibility":"compensating"},"problems":{"AUTHENTICATION_REQUIRED":"after-sign-in","ACCESS_DENIED":"never","BAD_REQUEST":"after-correction","NOT_FOUND":"after-refresh","CONFLICT":"after-refresh","RATE_LIMITED":"after-delay","UPSTREAM_UNAVAILABLE":"after-delay","SERVICE_UNAVAILABLE":"after-delay","INTERNAL_ERROR":"safe","FIRST_LIGHT_COMMAND_NOT_RECEIVED":"safe","FIRST_LIGHT_COMMAND_STATUS_UNRESOLVED":"never","FIRST_LIGHT_PREVIOUS_COMMAND_UNRESOLVED":"never"}},"domain.detach":{"input":{"fqdn":"string"},"policy":{"authorization":"account.self","audit":"app","cost":"none","recovery":"reconcile","reversibility":"compensating"},"problems":{"AUTHENTICATION_REQUIRED":"after-sign-in","ACCESS_DENIED":"never","BAD_REQUEST":"after-correction","NOT_FOUND":"after-refresh","CONFLICT":"after-refresh","RATE_LIMITED":"after-delay","UPSTREAM_UNAVAILABLE":"after-delay","SERVICE_UNAVAILABLE":"after-delay","INTERNAL_ERROR":"safe","FIRST_LIGHT_COMMAND_NOT_RECEIVED":"safe","FIRST_LIGHT_COMMAND_STATUS_UNRESOLVED":"never","FIRST_LIGHT_PREVIOUS_COMMAND_UNRESOLVED":"never"}},"domain.remove":{"desc":"Remove a domain from the account. `confirmFqdn` echoes `fqdn` exactly.","input":{"fqdn":"string","confirmFqdn":"string"},"policy":{"authorization":"account.self.recent","audit":"app","cost":"none","recovery":"reconcile","reversibility":"compensating"},"problems":{"AUTHENTICATION_REQUIRED":"after-sign-in","ACCESS_DENIED":"never","BAD_REQUEST":"after-correction","NOT_FOUND":"after-refresh","CONFLICT":"after-refresh","RATE_LIMITED":"after-delay","UPSTREAM_UNAVAILABLE":"after-delay","SERVICE_UNAVAILABLE":"after-delay","INTERNAL_ERROR":"safe","FIRST_LIGHT_COMMAND_NOT_RECEIVED":"safe","FIRST_LIGHT_COMMAND_STATUS_UNRESOLVED":"never","FIRST_LIGHT_PREVIOUS_COMMAND_UNRESOLVED":"never"}},"domain.request-transfer":{"desc":"Ask for a First Light-held registration back. `confirmFqdn` echoes `fqdn` exactly.","input":{"fqdn":"string","confirmFqdn":"string","disclosureRevision":{"type":"string","enum":["first-light-manual-domain-transfer-v1"]}},"policy":{"authorization":"account.self.recent","audit":"app","cost":"none","recovery":"reconcile","reversibility":"compensating"},"problems":{"AUTHENTICATION_REQUIRED":"after-sign-in","ACCESS_DENIED":"never","BAD_REQUEST":"after-correction","NOT_FOUND":"after-refresh","CONFLICT":"after-refresh","RATE_LIMITED":"after-delay","UPSTREAM_UNAVAILABLE":"after-delay","SERVICE_UNAVAILABLE":"after-delay","INTERNAL_ERROR":"safe","FIRST_LIGHT_COMMAND_NOT_RECEIVED":"safe","FIRST_LIGHT_COMMAND_STATUS_UNRESOLVED":"never","FIRST_LIGHT_PREVIOUS_COMMAND_UNRESOLVED":"never"}}}},"first-light.email":{"desc":"Grants this First Light deployment the authority to send platform transactional email, such as ownership-transfer codes. Exercised server-side by First Light control-plane doors and armed by the deployment Cloudflare Email Service binding plus deployment vars; no email credential is bound into a page or saved as an app-owner setting.","target":"server"},"first-light.features":{"desc":"Runs an app's feature-connection lifecycle through the engine action ingress: stage details, verify with the provider, pause or resume, discard a replacement, and remove settings. A saved key is not availability; only verified details become active, secrets stay server-side, and the masked catalog arrives through read/live projections.","target":"browser","actions":{"features.save-and-check":{"input":{"appId":"string","kind":"string","expectedRevision":"number","config":{"type":"object","values":{"type":"union","variants":["string","number","boolean",{"type":"array","items":{"type":"union","variants":["string","number","boolean"]}}]},"optional":true},"secrets":{"type":"object","values":"string","optional":true}},"policy":{"authorization":"app.manager","audit":"security","cost":"none","recovery":"reconcile","reversibility":"compensating"},"problems":{"AUTHENTICATION_REQUIRED":"after-sign-in","ACCESS_DENIED":"never","BAD_REQUEST":"after-correction","NOT_FOUND":"after-refresh","CONFLICT":"after-refresh","RATE_LIMITED":"after-delay","UPSTREAM_UNAVAILABLE":"after-delay","SERVICE_UNAVAILABLE":"after-delay","INTERNAL_ERROR":"safe","FIRST_LIGHT_COMMAND_NOT_RECEIVED":"safe","FIRST_LIGHT_COMMAND_STATUS_UNRESOLVED":"never","FIRST_LIGHT_PREVIOUS_COMMAND_UNRESOLVED":"never"}},"features.check":{"input":{"appId":"string","kind":"string","expectedRevision":"number"},"policy":{"authorization":"app.manager","audit":"app","cost":"none","recovery":"reconcile","reversibility":"compensating"},"problems":{"AUTHENTICATION_REQUIRED":"after-sign-in","ACCESS_DENIED":"never","BAD_REQUEST":"after-correction","NOT_FOUND":"after-refresh","CONFLICT":"after-refresh","RATE_LIMITED":"after-delay","UPSTREAM_UNAVAILABLE":"after-delay","SERVICE_UNAVAILABLE":"after-delay","INTERNAL_ERROR":"safe","FIRST_LIGHT_COMMAND_NOT_RECEIVED":"safe","FIRST_LIGHT_COMMAND_STATUS_UNRESOLVED":"never","FIRST_LIGHT_PREVIOUS_COMMAND_UNRESOLVED":"never"}},"features.pause":{"input":{"appId":"string","kind":"string","expectedRevision":"number"},"policy":{"authorization":"app.manager","audit":"app","cost":"none","recovery":"reconcile","reversibility":"compensating"},"problems":{"AUTHENTICATION_REQUIRED":"after-sign-in","ACCESS_DENIED":"never","BAD_REQUEST":"after-correction","NOT_FOUND":"after-refresh","CONFLICT":"after-refresh","RATE_LIMITED":"after-delay","UPSTREAM_UNAVAILABLE":"after-delay","SERVICE_UNAVAILABLE":"after-delay","INTERNAL_ERROR":"safe","FIRST_LIGHT_COMMAND_NOT_RECEIVED":"safe","FIRST_LIGHT_COMMAND_STATUS_UNRESOLVED":"never","FIRST_LIGHT_PREVIOUS_COMMAND_UNRESOLVED":"never"}},"features.resume":{"input":{"appId":"string","kind":"string","expectedRevision":"number"},"policy":{"authorization":"app.manager","audit":"app","cost":"none","recovery":"reconcile","reversibility":"compensating"},"problems":{"AUTHENTICATION_REQUIRED":"after-sign-in","ACCESS_DENIED":"never","BAD_REQUEST":"after-correction","NOT_FOUND":"after-refresh","CONFLICT":"after-refresh","RATE_LIMITED":"after-delay","UPSTREAM_UNAVAILABLE":"after-delay","SERVICE_UNAVAILABLE":"after-delay","INTERNAL_ERROR":"safe","FIRST_LIGHT_COMMAND_NOT_RECEIVED":"safe","FIRST_LIGHT_COMMAND_STATUS_UNRESOLVED":"never","FIRST_LIGHT_PREVIOUS_COMMAND_UNRESOLVED":"never"}},"features.discard":{"input":{"appId":"string","kind":"string","expectedRevision":"number"},"policy":{"authorization":"app.manager","audit":"app","cost":"none","recovery":"reconcile","reversibility":"compensating"},"problems":{"AUTHENTICATION_REQUIRED":"after-sign-in","ACCESS_DENIED":"never","BAD_REQUEST":"after-correction","NOT_FOUND":"after-refresh","CONFLICT":"after-refresh","RATE_LIMITED":"after-delay","UPSTREAM_UNAVAILABLE":"after-delay","SERVICE_UNAVAILABLE":"after-delay","INTERNAL_ERROR":"safe","FIRST_LIGHT_COMMAND_NOT_RECEIVED":"safe","FIRST_LIGHT_COMMAND_STATUS_UNRESOLVED":"never","FIRST_LIGHT_PREVIOUS_COMMAND_UNRESOLVED":"never"}},"features.remove":{"input":{"appId":"string","kind":"string","expectedRevision":"number"},"policy":{"authorization":"app.manager","audit":"app","cost":"none","recovery":"reconcile","reversibility":"irreversible"},"problems":{"AUTHENTICATION_REQUIRED":"after-sign-in","ACCESS_DENIED":"never","BAD_REQUEST":"after-correction","NOT_FOUND":"after-refresh","CONFLICT":"after-refresh","RATE_LIMITED":"after-delay","UPSTREAM_UNAVAILABLE":"after-delay","SERVICE_UNAVAILABLE":"after-delay","INTERNAL_ERROR":"safe","FIRST_LIGHT_COMMAND_NOT_RECEIVED":"safe","FIRST_LIGHT_COMMAND_STATUS_UNRESOLVED":"never","FIRST_LIGHT_PREVIOUS_COMMAND_UNRESOLVED":"never"}}}},"first-light.templates":{"desc":"Submits one purpose-built template app's exact published version and mock/demo presentation as an immutable candidate, or removes an already-approved listing. Every app manager may submit; only the isolated Admin review capability can publish a candidate, and later edits never mutate the reviewed release.","target":"browser","actions":{"template.submit":{"desc":"Submit this purpose-built template app's exact published version for review. The app must contain only reusable demo/mock content, never live customer data. `authorName` is 2..80 characters and `submissionNote` 20..500, both trimmed.","input":{"appId":"string","authorName":"string","licenseSpdx":{"type":"string","enum":["CC0-1.0","CC-BY-4.0"]},"rightsConfirmed":{"type":"boolean","enum":[true],"desc":"Confirms reuse rights and that the rendered template contains only mock/demo data."},"submissionNote":"string"},"policy":{"authorization":"app.manager","audit":"app","cost":"none","recovery":"reconcile","reversibility":"compensating"},"problems":{"AUTHENTICATION_REQUIRED":"after-sign-in","ACCESS_DENIED":"never","BAD_REQUEST":"after-correction","CONFLICT":"after-refresh","RATE_LIMITED":"after-delay","SERVICE_UNAVAILABLE":"after-delay","INTERNAL_ERROR":"safe","FIRST_LIGHT_COMMAND_NOT_RECEIVED":"safe","FIRST_LIGHT_COMMAND_STATUS_UNRESOLVED":"never","FIRST_LIGHT_PREVIOUS_COMMAND_UNRESOLVED":"never"}},"template.unlist":{"input":{"appId":"string"},"policy":{"authorization":"app.manager","audit":"app","cost":"none","recovery":"reconcile","reversibility":"compensating"},"problems":{"AUTHENTICATION_REQUIRED":"after-sign-in","ACCESS_DENIED":"never","NOT_FOUND":"after-refresh","RATE_LIMITED":"after-delay","SERVICE_UNAVAILABLE":"after-delay","INTERNAL_ERROR":"safe","FIRST_LIGHT_COMMAND_NOT_RECEIVED":"safe","FIRST_LIGHT_COMMAND_STATUS_UNRESOLVED":"never","FIRST_LIGHT_PREVIOUS_COMMAND_UNRESOLVED":"never"}}}},"first-light.transfer":{"desc":"Runs ownership handoff writes. The masked offer arrives through appAdministration; this capability owns only the declared write authority.","target":"browser","actions":{"ownership.stage":{"input":{"appId":"string","email":"string","keepAdmin":"boolean"},"policy":{"authorization":"app.owner.recent","audit":"security","cost":"none","recovery":"reconcile","reversibility":"compensating"},"problems":{"AUTHENTICATION_REQUIRED":"after-sign-in","ACCESS_DENIED":"never","BAD_REQUEST":"after-correction","NOT_FOUND":"after-refresh","CONFLICT":"after-refresh","RATE_LIMITED":"after-delay","UPSTREAM_UNAVAILABLE":"after-delay","SERVICE_UNAVAILABLE":"after-delay","INTERNAL_ERROR":"safe","FIRST_LIGHT_COMMAND_NOT_RECEIVED":"safe","FIRST_LIGHT_COMMAND_STATUS_UNRESOLVED":"never","FIRST_LIGHT_PREVIOUS_COMMAND_UNRESOLVED":"never"}},"ownership.cancel":{"input":{"appId":"string","transferId":"string"},"policy":{"authorization":"app.owner.recent","audit":"security","cost":"none","recovery":"reconcile","reversibility":"compensating"},"problems":{"AUTHENTICATION_REQUIRED":"after-sign-in","ACCESS_DENIED":"never","BAD_REQUEST":"after-correction","NOT_FOUND":"after-refresh","CONFLICT":"after-refresh","RATE_LIMITED":"after-delay","UPSTREAM_UNAVAILABLE":"after-delay","SERVICE_UNAVAILABLE":"after-delay","INTERNAL_ERROR":"safe","FIRST_LIGHT_COMMAND_NOT_RECEIVED":"safe","FIRST_LIGHT_COMMAND_STATUS_UNRESOLVED":"never","FIRST_LIGHT_PREVIOUS_COMMAND_UNRESOLVED":"never"}},"ownership.accept":{"input":{"appId":"string","code":"string"},"policy":{"authorization":"account.self.recent","audit":"app","cost":"none","recovery":"reconcile","reversibility":"irreversible"},"problems":{"AUTHENTICATION_REQUIRED":"after-sign-in","ACCESS_DENIED":"never","BAD_REQUEST":"after-correction","NOT_FOUND":"after-refresh","CONFLICT":"after-refresh","RATE_LIMITED":"after-delay","UPSTREAM_UNAVAILABLE":"after-delay","SERVICE_UNAVAILABLE":"after-delay","INTERNAL_ERROR":"safe","FIRST_LIGHT_COMMAND_NOT_RECEIVED":"safe","FIRST_LIGHT_COMMAND_STATUS_UNRESOLVED":"never","FIRST_LIGHT_PREVIOUS_COMMAND_UNRESOLVED":"never","REQUEST_FAILED":"after-refresh"}}}},"first-light.workspace":{"desc":"First Light builder media workspace. The catalog and byte store are ordinary data and asset outputs selected by appId; that selector grants nothing, and every operation is re-authorized against the caller's build seat and the child app's current builder grant.","target":"browser","outputs":{"assets":{"default":"media","desc":"Public image upload and server-owned URL import for the selected child app.","asset":{"desc":"Content-addressed public builder images; successful operations also register one canonical catalog row.","accept":["image/png","image/jpeg","image/webp","image/gif"],"maxBytes":26214400,"operations":["upload","uploadUrl","remove"],"params":{"appId":{"type":"string","desc":"Child app addressed by this operation; the server independently authorizes it.","required":true}}}},"data":{"desc":"The selected app's aggregate media read joined to workspace-owned metadata writes.","default":"appMedia","source":{"desc":"Reusable media metadata for one authorized First Light app; asset bytes remain behind the asset seam.","live":true,"collections":{"appMedia":{"desc":"Read-only media metadata rows selected by appId and shared by every verified app member.","ops":["query","update","remove"],"queryFields":[],"params":["appId"],"anonymous":[],"read":"principal","fields":{"id":{"type":"string","desc":"Stable media identity."},"ref":{"type":"asset","desc":"Durable logical asset reference."},"url":{"type":"string","desc":"Canonical same-origin delivery URL."},"name":{"type":"string","desc":"Customer-visible media name."},"type":{"type":"string","desc":"Validated media content type."},"size":{"type":"number","desc":"Stored byte size."},"createdAt":{"type":"string","desc":"Creation timestamp."},"updatedAt":{"type":"string","desc":"Last metadata update timestamp."},"origin":{"type":"string","enum":["upload","url","generated","template"],"desc":"How the asset entered the library."},"description":{"type":"string","desc":"Builder-facing description of the media's purpose."},"alt":{"type":"string","optional":true,"desc":"Alternative text when supplied."},"derivedFrom":{"type":"array","items":"string","maxItems":8,"optional":true,"desc":"The `ref` of each media row this one was generated from, never this row's own `ref`. Present only when `origin` is \"generated\"."}},"live":true,"inputs":{"update":["name","description","alt"]},"enforcedBy":{"update":"the verified app-member authority at the tenant media actor","remove":"the verified app-member authority at the tenant media actor"}}}}}}}},"sources":{"appMedia":{"owner":"first-light.workspace","definition":{"schema":"singularity.source-definition.v1","namespace":"first-light.workspace","version":"1.0.0","name":"appMedia","contract":{"desc":"Reusable media metadata for one authorized First Light app; asset bytes remain behind the asset seam.","live":true,"collections":{"appMedia":{"desc":"Read-only media metadata rows selected by appId and shared by every verified app member.","read":"principal","ops":["query"],"queryFields":[],"params":["appId"],"fields":{"id":{"type":"string","desc":"Stable media identity."},"ref":{"type":"asset","desc":"Durable logical asset reference."},"url":{"type":"string","desc":"Canonical same-origin delivery URL."},"name":{"type":"string","desc":"Customer-visible media name."},"type":{"type":"string","desc":"Validated media content type."},"size":{"type":"number","desc":"Stored byte size."},"createdAt":{"type":"string","desc":"Creation timestamp."},"updatedAt":{"type":"string","desc":"Last metadata update timestamp."},"origin":{"type":"string","enum":["upload","url","generated","template"],"desc":"How the asset entered the library."},"description":{"type":"string","desc":"Builder-facing description of the media's purpose."},"alt":{"type":"string","optional":true,"desc":"Alternative text when supplied."},"derivedFrom":{"type":"array","items":"string","maxItems":8,"optional":true,"desc":"The `ref` of each media row this one was generated from, never this row's own `ref`. Present only when `origin` is \"generated\"."}},"live":true}}},"result":{"kind":"rows","maxRows":1000,"maxBytes":4194304,"classification":"private"},"stream":{"semantics":"snapshot","recovery":"snapshot"},"authority":{"mode":"lease"},"id":"source:ea0efb8d464e6c63"}}},"provenance":{"source":"First Light product distribution","review":"product source and canonical port-runtime conformance"},"problems":{"schema":"singularity.problem-catalog-contribution.v1","namespace":"first-light.product","version":"1","problems":{"BUILDER_COMMAND_NOT_RECEIVED":{"error":"That didn’t go through.","messageKey":"builder.command-not-received","retry":"safe","action":"retry","next":"Try again when you’re ready."},"BUILDER_CONTROL_STATUS_UNAVAILABLE":{"error":"We couldn’t confirm that change.","messageKey":"builder.control-status-unavailable","retry":"never","action":"none","next":"Use the status and actions shown in the builder. If this keeps happening, contact support."},"BUILDER_MESSAGE_STATUS_UNAVAILABLE":{"error":"We couldn’t confirm that message.","messageKey":"builder.message-status-unavailable","retry":"never","action":"contact-support","next":"Send a new message when you’re ready. If this keeps happening, contact support."},"FIRST_LIGHT_COMMAND_NOT_RECEIVED":{"error":"That didn’t go through.","messageKey":"command.not-received","retry":"safe","action":"retry","next":"Try again when you’re ready."},"FIRST_LIGHT_COMMAND_STATUS_UNRESOLVED":{"error":"We couldn’t confirm that action.","messageKey":"command.status-unresolved","retry":"never","action":"contact-support","next":"Contact support for help before taking another action here."},"FIRST_LIGHT_PREVIOUS_COMMAND_UNRESOLVED":{"error":"We couldn’t confirm your earlier action.","messageKey":"command.previous-unresolved","retry":"never","action":"contact-support","next":"Contact support for help before taking another action here."},"HANDLE_TAKEN":{"error":"That address is already in use.","messageKey":"profile.handle-taken","retry":"after-correction","action":"correct-input","next":"Choose another address and try again."},"NETWORK_UNAVAILABLE":{"error":"We lost the connection.","messageKey":"network.unavailable","retry":"safe","action":"retry","next":"Check your connection, then try again."},"OPERATOR_REAUTH_REQUIRED":{"error":"Confirm it’s you to continue.","messageKey":"session.identity-confirmation-required","retry":"after-identity-confirmation","action":"confirm-identity","next":"Use your passkey to confirm this account, then choose the action again."},"PASSKEY_FRESH_SIGNIN_REQUIRED":{"error":"Sign in again to continue.","messageKey":"session.reauthentication-required","retry":"after-sign-in","action":"sign-in","next":"Sign out and sign back in, then continue from where you left off."},"PAYMENTS_UNAVAILABLE":{"error":"Payments aren’t available here right now.","messageKey":"payment.unavailable","retry":"never","action":"contact-support","next":"Your work is safe. Contact support if you need to add funds."},"PAYMENT_AUTHENTICATION_REQUIRED":{"error":"Your bank needs you to confirm this payment.","messageKey":"payment.authentication-required","retry":"after-correction","action":"correct-input","next":"Confirm the pending payment in billing, then continue.","preserved":"Your pending payment is preserved for confirmation.","money":"No funds have been added to your balance yet.","pending":true},"PAYMENT_DECLINED":{"error":"That payment didn’t go through.","messageKey":"payment.declined","retry":"after-correction","action":"correct-input","next":"Check the card details or use a different card, then try again."},"PAYMENT_METHOD_REQUIRED":{"error":"Add a card to continue.","messageKey":"payment.method-required","retry":"after-correction","action":"correct-input","next":"Add a card, then try again."},"PAYMENT_PENDING":{"error":"We’re still confirming that payment.","messageKey":"payment.pending","retry":"after-refresh","action":"none","next":"Keep this page open or refresh shortly. Don’t submit another payment while this one is pending.","preserved":"The exact payment is preserved while confirmation finishes.","money":"Funds appear in your balance only after Stripe confirms the payment.","pending":true},"TRANSFER_DOMAIN_ATTACHED":{"error":"This app still has a custom domain attached.","messageKey":"ownership.domain-attached","retry":"after-correction","action":"correct-input","next":"Detach the custom domain, then continue the ownership change."}},"id":"problems:dfd6f9afc51f5349"}},{"schema":"singularity.port-pack.v1","namespace":"platform.auth","version":"1.0.0","runtime":"1","contractAddress":"7882b549c655616b","capabilities":[{"kind":"platform.auth.web","id":"platform.auth@1.0.0:web"}],"contracts":{"platform.auth.web":{"desc":"First Light platform identity over host-verified sessions. Confirmed email is the durable account anchor; Google and attached passkeys converge on that account. `passkey.add` enrolls a signed-in device, `passkey` returns an enrolled member, and sign-out revokes the platform session. Built client apps use `app.auth.client.web` instead.","target":"browser","host":{"mounts":{"platformSession":{"desc":"the builder host's platform session door — `me`, `signout`, the email-code pair and the Google round trip are composed under it"},"platformPasskey":{"desc":"the builder host's platform passkey door — every WebAuthn ceremony for a platform account is composed under it"}}},"config":{},"outputs":{"auth":{"default":"identity","methods":["passkey.add","passkey","google","google.link"],"ceremonies":["signIn","requestCode","confirmCode","signOut"],"desc":"AuthProvider consumed by the manifest auth block through `auth.source` or as the default auth binding."}}}},"sources":{},"provenance":{"source":"@manifest-ui/singularity-browser/auth/platform","review":"package source and canonical port-runtime conformance"},"problems":{"schema":"singularity.problem-catalog-contribution.v1","namespace":"identity.standard","version":"1","problems":{"ACCOUNT_DELETED":{"error":"That account has been deleted.","messageKey":"identity.account-deleted","retry":"never","action":"contact-support","next":"Contact support if you believe this is a mistake."},"AUTH_CEREMONY_UNAVAILABLE":{"error":"That sign-in option isn’t available here.","messageKey":"identity.ceremony-unavailable","retry":"never","action":"contact-support","next":"Use another sign-in option, or contact support if you expected this one."},"AUTH_CODE_NOT_REQUESTED":{"error":"Request a code first.","messageKey":"identity.code-not-requested","retry":"after-correction","action":"correct-input","next":"Request a new code, then enter it here."},"AUTH_CODE_REQUIRED":{"error":"Enter the code you received.","messageKey":"identity.code-required","retry":"after-correction","action":"correct-input","next":"Enter the one-time code and try again."},"AUTH_FAILED":{"error":"Sign-in didn’t complete.","messageKey":"identity.failed","retry":"safe","action":"retry","next":"Try again. If it keeps happening, contact support."},"AUTH_IDENTIFIER_INVALID":{"error":"Enter a valid email address or phone number.","messageKey":"identity.identifier-invalid","retry":"after-correction","action":"correct-input","next":"Correct the sign-in address or number and try again."},"AUTH_METHOD_UNAVAILABLE":{"error":"That sign-in method isn’t available.","messageKey":"identity.method-unavailable","retry":"after-correction","action":"correct-input","next":"Choose one of the available sign-in methods."},"EMAIL_CODE_EXPIRED":{"error":"That code has expired.","messageKey":"identity.code-expired","retry":"after-correction","action":"correct-input","next":"Request a new code and try again."},"EMAIL_CODE_INVALID":{"error":"That code didn’t match.","messageKey":"identity.code-invalid","retry":"after-correction","action":"correct-input","next":"Check the code and try again."},"EMAIL_CODE_TOO_MANY":{"error":"There have been too many code attempts.","messageKey":"identity.code-attempts-exhausted","retry":"after-delay","action":"wait","next":"Wait a moment, then request a fresh code."},"EMAIL_INVALID":{"error":"Enter a valid email address or phone number.","messageKey":"identity.identifier-invalid","retry":"after-correction","action":"correct-input","next":"Correct the sign-in address or number and try again."},"EMAIL_RATE_LIMITED":{"error":"There have been too many sign-in requests.","messageKey":"identity.rate-limited","retry":"after-delay","action":"wait","next":"Wait a moment, then try again."},"EMAIL_SEND_FAILED":{"error":"We couldn’t send your code.","messageKey":"identity.code-send-failed","retry":"after-delay","action":"wait","next":"Wait a moment, then try again."},"EMAIL_TIER_UNARMED":{"error":"Email sign-in isn’t available right now.","messageKey":"identity.email-unavailable","retry":"never","action":"contact-support","next":"Use another sign-in method, or contact support."},"EMAIL_VERIFY_FAILED":{"error":"That code didn’t match.","messageKey":"identity.code-invalid","retry":"after-correction","action":"correct-input","next":"Check the code and try again."},"GOOGLE_ALREADY_LINKED":{"error":"That Google account is already linked to another account.","messageKey":"identity.google-already-linked","retry":"never","action":"contact-support","next":"Use the account it is linked to, or contact support."},"GOOGLE_EMAIL_MISMATCH":{"error":"That Google account uses a different email.","messageKey":"identity.google-email-mismatch","retry":"after-correction","action":"correct-input","next":"Choose the Google account with the same email as this account."},"GOOGLE_EMAIL_REQUIRED":{"error":"Google didn’t provide a verified email.","messageKey":"identity.google-email-required","retry":"after-correction","action":"correct-input","next":"Continue with email instead."},"GOOGLE_LINK_REQUIRED":{"error":"This email already has an account.","messageKey":"identity.google-link-required","retry":"after-sign-in","action":"sign-in","next":"Sign in with email, then connect Google from your account."},"GOOGLE_PROOF_INVALID":{"error":"Google sign-in couldn’t be confirmed.","messageKey":"identity.google-proof-invalid","retry":"safe","action":"retry","next":"Start Google sign-in again."},"GOOGLE_STATE_EXPIRED":{"error":"Google sign-in couldn’t be confirmed.","messageKey":"identity.google-proof-invalid","retry":"safe","action":"retry","next":"Start Google sign-in again."},"GOOGLE_STATE_MISMATCH":{"error":"Google sign-in couldn’t be confirmed.","messageKey":"identity.google-proof-invalid","retry":"safe","action":"retry","next":"Start Google sign-in again."},"GOOGLE_UNCONFIGURED":{"error":"Google sign-in isn’t available right now.","messageKey":"identity.google-unconfigured","retry":"after-correction","action":"correct-input","next":"Continue with email instead."},"INVALID_AUTH_SUBJECT":{"error":"We couldn’t verify this account.","messageKey":"identity.subject-invalid","retry":"never","action":"contact-support","next":"Contact support if you need help signing in."},"LINK_REQUIRES_FRESH_SESSION":{"error":"Sign in again before connecting Google.","messageKey":"identity.fresh-session-required","retry":"after-sign-in","action":"sign-in","next":"Sign out, sign back in, then connect Google."},"PASSKEY_CANCELLED":{"error":"Passkey sign-in was cancelled.","messageKey":"identity.passkey-cancelled","retry":"safe","action":"retry","next":"Try again when you’re ready."},"PASSKEY_ORIGIN_REFUSED":{"error":"Passkeys aren’t available on this address.","messageKey":"identity.passkey-origin-refused","retry":"never","action":"contact-support","next":"Open the app from its published address, or contact support."},"PASSKEY_UNSUPPORTED":{"error":"Passkeys aren’t available in this browser.","messageKey":"identity.passkey-unsupported","retry":"never","action":"contact-support","next":"Use another sign-in method or a browser that supports passkeys."},"SECURITY_NOTIFICATION_FAILED":{"error":"We can’t safely change sign-in methods right now.","messageKey":"identity.security-notification-failed","retry":"after-delay","action":"wait","next":"Nothing was changed. Wait a moment, then try again."},"SECURITY_NOTIFICATION_UNAVAILABLE":{"error":"We can’t safely change sign-in methods right now.","messageKey":"identity.security-notification-failed","retry":"after-delay","action":"wait","next":"Nothing was changed. Wait a moment, then try again."},"SIGN_OUT_FAILED":{"error":"We couldn’t confirm sign-out.","messageKey":"identity.sign-out-failed","retry":"after-delay","action":"wait","next":"Wait a moment, then try signing out again."}},"id":"problems:f4d4434fa18348f5"}}]},"id":"world:dced7dbaa63946f0","rootId":"world:5d2658a87736ed6e","contractId":"world-contract:52e34f08e3099e86","provenanceId":"world-provenance:c4bfb67c3d52c276","corpusId":"world-corpus:5e852990b72705b2","contributions":[{"schema":"singularity.contribution.v1","version":"1","namespace":"first-light.data","contributionVersion":"1.0.0","dependencies":[],"facets":{"vocabulary":[],"components":[],"behaviors":[],"triggers":[],"features":[],"capabilities":[{"schema":"singularity.contribution-pack-ref.v1","namespace":"first-light-reads","version":"1.0.0"}],"models":[],"agents":[],"authoring":[]},"semanticConfig":{},"id":"contribution:0c25c186542ef264"},{"schema":"singularity.contribution.v1","version":"1","namespace":"first-light.platform","contributionVersion":"1.0.0","dependencies":[{"namespace":"first-light.data","version":"1.0.0"}],"facets":{"vocabulary":[{"schema":"singularity.contribution-pack-ref.v1","namespace":"tenant-media","version":"1.0.0"}],"components":[{"schema":"singularity.contribution-pack-ref.v1","namespace":"lucide","version":"1.24.0"}],"behaviors":[],"triggers":[],"features":[{"schema":"singularity.contribution-pack-ref.v1","namespace":"first-light-actor","version":"1.0.0"}],"capabilities":[{"schema":"singularity.contribution-pack-ref.v1","namespace":"platform.auth","version":"1.0.0"},{"schema":"singularity.contribution-pack-ref.v1","namespace":"first-light","version":"1.0.0"}],"models":[],"agents":[],"authoring":[{"schema":"singularity.authoring-pack.v1","namespace":"first-light-actor","version":"1.0.0","owner":{"kind":"runtime-pack","axis":"policy","namespace":"first-light-actor","version":"1.0.0","address":"fcd3c88b0b2fdac9"},"teachings":[{"id":"teaching:first-light-actor/facts","group":"product"}],"examples":[],"contentAddress":"4f82853d47f23667","provenance":{"source":"First Light actor authority authoring contribution","review":"First Light distribution review — provider-owned authoring judgment separated from runtime contracts"}},{"schema":"singularity.authoring-pack.v1","namespace":"platform.auth","version":"1.0.0","owner":{"kind":"runtime-pack","axis":"ports","namespace":"platform.auth","version":"1.0.0","address":"7882b549c655616b"},"teachings":[{"id":"teaching:platform.auth/account-identity","group":"provider"}],"examples":[],"contentAddress":"fa8b9f3d0ded9f2f","provenance":{"source":"First Light provider authoring distribution","review":"First Light distribution review — provider-owned authoring judgment separated from runtime contracts"}},{"schema":"singularity.authoring-pack.v1","namespace":"tenant-media","version":"1.0.0","owner":{"kind":"runtime-pack","axis":"vocabulary","namespace":"tenant-media","version":"1.0.0","address":"1fd360faf8ff3e20"},"teachings":[{"id":"teaching:tenant-media/image-delivery","group":"provider"}],"examples":[{"id":"example:tenant-media/sized-image","kind":"integration"}],"contentAddress":"7f71839c1ccaeafe","provenance":{"source":"First Light tenant-media delivery authoring contribution","review":"First Light distribution review — provider-owned authoring judgment separated from runtime contracts"}},{"schema":"singularity.authoring-pack.v1","namespace":"first-light","version":"1.0.0","owner":{"kind":"runtime-pack","axis":"ports","namespace":"first-light","version":"1.0.0","address":"6b72f5e6b39711b8"},"teachings":[{"id":"teaching:first-light/control-plane","group":"provider"}],"examples":[],"contentAddress":"8fdf820a7f6d2848","provenance":{"source":"First Light provider authoring distribution","review":"First Light distribution review — provider-owned authoring judgment separated from runtime contracts"}}]},"semanticConfig":{},"id":"contribution:96e4a7b72beaf5bd"},{"schema":"singularity.contribution.v1","version":"1","namespace":"singularity.standard","contributionVersion":"1.0.0","dependencies":[],"facets":{"vocabulary":[{"schema":"singularity.contribution-pack-ref.v1","namespace":"singularity.vocabulary","version":"1.0.0"}],"components":[],"behaviors":[{"schema":"singularity.contribution-pack-ref.v1","namespace":"singularity.behaviors","version":"1.0.0"}],"triggers":[{"schema":"singularity.contribution-pack-ref.v1","namespace":"singularity.lifecycle","version":"1.1.0"}],"features":[],"capabilities":[],"models":[],"agents":[],"authoring":[]},"semanticConfig":{},"id":"contribution:aaf2f9ce8b73b39c"}],"contracts":{"worldId":"world:5d2658a87736ed6e","id":"world-contract:52e34f08e3099e86"},"provenance":{"worldId":"world:5d2658a87736ed6e","id":"world-provenance:c4bfb67c3d52c276"},"authoring":{"worldId":"world:5d2658a87736ed6e","id":"world-corpus:5e852990b72705b2"},"browserArtifactRequirements":[{"axis":"behaviors","namespace":"singularity.behaviors","version":"1.0.0","address":"21122b718944c21b","delivery":"embedded"},{"axis":"components","namespace":"lucide","version":"1.24.0","address":"1057765fb41ac2f9","delivery":"module"},{"axis":"lifecycle","namespace":"singularity.lifecycle","version":"1.1.0","address":"26e812930c8fb315","delivery":"embedded"},{"axis":"policy","namespace":"first-light-actor","version":"1.0.0","address":"fcd3c88b0b2fdac9","delivery":"module"},{"axis":"ports","namespace":"first-light-reads","version":"1.0.0","address":"9c90f50d1367a78f","delivery":"module"},{"axis":"ports","namespace":"first-light","version":"1.0.0","address":"6b72f5e6b39711b8","delivery":"module"},{"axis":"ports","namespace":"platform.auth","version":"1.0.0","address":"7882b549c655616b","delivery":"module"},{"axis":"vocabulary","namespace":"singularity.core","version":"1.0.0","address":"680f7d0750bfdd19","delivery":"embedded"},{"axis":"vocabulary","namespace":"singularity.vocabulary","version":"1.0.0","address":"a069ec10d9bd88da","delivery":"embedded"},{"axis":"vocabulary","namespace":"tenant-media","version":"1.0.0","address":"1fd360faf8ff3e20","delivery":"module"}]}