{"schema":"singularity.world.v1","version":"1","components":{"schema":"singularity.component-runtime.v1","version":"1","id":"4627ccf5287e4617","packs":[{"schema":"singularity.component-pack.v1","namespace":"lucide","version":"1.24.0","runtime":"1","exposure":"qualified","contentAddress":"1ac3bc1e4255d578","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__Award","id":"lucide@1.24.0:Award"},{"name":"lucide__Baby","id":"lucide@1.24.0:Baby"},{"name":"lucide__BadgeCheck","id":"lucide@1.24.0:BadgeCheck"},{"name":"lucide__Banknote","id":"lucide@1.24.0:Banknote"},{"name":"lucide__Bath","id":"lucide@1.24.0:Bath"},{"name":"lucide__Battery","id":"lucide@1.24.0:Battery"},{"name":"lucide__BedDouble","id":"lucide@1.24.0:BedDouble"},{"name":"lucide__Beer","id":"lucide@1.24.0:Beer"},{"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__Bike","id":"lucide@1.24.0:Bike"},{"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__Briefcase","id":"lucide@1.24.0:Briefcase"},{"name":"lucide__Bug","id":"lucide@1.24.0:Bug"},{"name":"lucide__Building2","id":"lucide@1.24.0:Building2"},{"name":"lucide__Cake","id":"lucide@1.24.0:Cake"},{"name":"lucide__CakeSlice","id":"lucide@1.24.0:CakeSlice"},{"name":"lucide__Calendar","id":"lucide@1.24.0:Calendar"},{"name":"lucide__CalendarCheck","id":"lucide@1.24.0:CalendarCheck"},{"name":"lucide__CalendarDays","id":"lucide@1.24.0:CalendarDays"},{"name":"lucide__Camera","id":"lucide@1.24.0:Camera"},{"name":"lucide__Car","id":"lucide@1.24.0:Car"},{"name":"lucide__Cat","id":"lucide@1.24.0:Cat"},{"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__ChefHat","id":"lucide@1.24.0:ChefHat"},{"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__ChevronsRight","id":"lucide@1.24.0:ChevronsRight"},{"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__ClipboardList","id":"lucide@1.24.0:ClipboardList"},{"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__CloudSun","id":"lucide@1.24.0:CloudSun"},{"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__Coffee","id":"lucide@1.24.0:Coffee"},{"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__Cookie","id":"lucide@1.24.0:Cookie"},{"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__Croissant","id":"lucide@1.24.0:Croissant"},{"name":"lucide__Database","id":"lucide@1.24.0:Database"},{"name":"lucide__Disc","id":"lucide@1.24.0:Disc"},{"name":"lucide__Dog","id":"lucide@1.24.0:Dog"},{"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__Droplet","id":"lucide@1.24.0:Droplet"},{"name":"lucide__Dumbbell","id":"lucide@1.24.0:Dumbbell"},{"name":"lucide__Egg","id":"lucide@1.24.0:Egg"},{"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__Flame","id":"lucide@1.24.0:Flame"},{"name":"lucide__Flower2","id":"lucide@1.24.0:Flower2"},{"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__Footprints","id":"lucide@1.24.0:Footprints"},{"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__GraduationCap","id":"lucide@1.24.0:GraduationCap"},{"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__Guitar","id":"lucide@1.24.0:Guitar"},{"name":"lucide__Hammer","id":"lucide@1.24.0:Hammer"},{"name":"lucide__HandHeart","id":"lucide@1.24.0:HandHeart"},{"name":"lucide__Handshake","id":"lucide@1.24.0:Handshake"},{"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__HeartPulse","id":"lucide@1.24.0:HeartPulse"},{"name":"lucide__Hotel","id":"lucide@1.24.0:Hotel"},{"name":"lucide__House","id":"lucide@1.24.0:House"},{"name":"lucide__IceCreamCone","id":"lucide@1.24.0:IceCreamCone"},{"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__Leaf","id":"lucide@1.24.0:Leaf"},{"name":"lucide__LifeBuoy","id":"lucide@1.24.0:LifeBuoy"},{"name":"lucide__Lightbulb","id":"lucide@1.24.0:Lightbulb"},{"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__MapPinned","id":"lucide@1.24.0:MapPinned"},{"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__Mountain","id":"lucide@1.24.0:Mountain"},{"name":"lucide__MountainSnow","id":"lucide@1.24.0:MountainSnow"},{"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__Paintbrush","id":"lucide@1.24.0:Paintbrush"},{"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__PartyPopper","id":"lucide@1.24.0:PartyPopper"},{"name":"lucide__Pause","id":"lucide@1.24.0:Pause"},{"name":"lucide__PawPrint","id":"lucide@1.24.0:PawPrint"},{"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__Pill","id":"lucide@1.24.0:Pill"},{"name":"lucide__Pizza","id":"lucide@1.24.0:Pizza"},{"name":"lucide__Plane","id":"lucide@1.24.0:Plane"},{"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__Redo2","id":"lucide@1.24.0:Redo2"},{"name":"lucide__RefreshCw","id":"lucide@1.24.0:RefreshCw"},{"name":"lucide__Rewind","id":"lucide@1.24.0:Rewind"},{"name":"lucide__Rocket","id":"lucide@1.24.0:Rocket"},{"name":"lucide__RotateCcw","id":"lucide@1.24.0:RotateCcw"},{"name":"lucide__RotateCw","id":"lucide@1.24.0:RotateCw"},{"name":"lucide__Route","id":"lucide@1.24.0:Route"},{"name":"lucide__Rows3","id":"lucide@1.24.0:Rows3"},{"name":"lucide__Rss","id":"lucide@1.24.0:Rss"},{"name":"lucide__Salad","id":"lucide@1.24.0:Salad"},{"name":"lucide__Sandwich","id":"lucide@1.24.0:Sandwich"},{"name":"lucide__Save","id":"lucide@1.24.0:Save"},{"name":"lucide__Scan","id":"lucide@1.24.0:Scan"},{"name":"lucide__Scissors","id":"lucide@1.24.0:Scissors"},{"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__Shirt","id":"lucide@1.24.0:Shirt"},{"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__Signpost","id":"lucide@1.24.0:Signpost"},{"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__Smile","id":"lucide@1.24.0:Smile"},{"name":"lucide__Snowflake","id":"lucide@1.24.0:Snowflake"},{"name":"lucide__Sparkles","id":"lucide@1.24.0:Sparkles"},{"name":"lucide__Sprout","id":"lucide@1.24.0:Sprout"},{"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__Stethoscope","id":"lucide@1.24.0:Stethoscope"},{"name":"lucide__Store","id":"lucide@1.24.0:Store"},{"name":"lucide__Sun","id":"lucide@1.24.0:Sun"},{"name":"lucide__Sunrise","id":"lucide@1.24.0:Sunrise"},{"name":"lucide__Sunset","id":"lucide@1.24.0:Sunset"},{"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__Tent","id":"lucide@1.24.0:Tent"},{"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__Ticket","id":"lucide@1.24.0:Ticket"},{"name":"lucide__Timer","id":"lucide@1.24.0:Timer"},{"name":"lucide__Trash","id":"lucide@1.24.0:Trash"},{"name":"lucide__TreePine","id":"lucide@1.24.0:TreePine"},{"name":"lucide__Trees","id":"lucide@1.24.0:Trees"},{"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__Trophy","id":"lucide@1.24.0:Trophy"},{"name":"lucide__Truck","id":"lucide@1.24.0:Truck"},{"name":"lucide__Type","id":"lucide@1.24.0:Type"},{"name":"lucide__Umbrella","id":"lucide@1.24.0:Umbrella"},{"name":"lucide__Undo","id":"lucide@1.24.0:Undo"},{"name":"lucide__Undo2","id":"lucide@1.24.0:Undo2"},{"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__Utensils","id":"lucide@1.24.0:Utensils"},{"name":"lucide__UtensilsCrossed","id":"lucide@1.24.0:UtensilsCrossed"},{"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__WavesHorizontal","id":"lucide@1.24.0:WavesHorizontal"},{"name":"lucide__Wheat","id":"lucide@1.24.0:Wheat"},{"name":"lucide__Wifi","id":"lucide@1.24.0:Wifi"},{"name":"lucide__WifiOff","id":"lucide@1.24.0:WifiOff"},{"name":"lucide__Wind","id":"lucide@1.24.0:Wind"},{"name":"lucide__Wine","id":"lucide@1.24.0:Wine"},{"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":"a61edd35ddc886f7","packs":[{"schema":"singularity.behavior-pack.v1","namespace":"singularity.behaviors","version":"1.0.0","runtime":"1","exposure":"builtin-bare","contractAddress":"01c532872479f7f9","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},"key":{"type":"string","desc":"when given, focus only while it is non-empty and again each time it changes — focus follows a moved card with \"{{ state.movedId == row.id ? 'm' + state.moves : '' }}\"","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","binds":["drag"],"desc":"an optional TRANSIENT action when the drag begins ({ drag } in scope), e.g. dim the source; never an undo step","required":false},"onDragEnd":{"type":"actions","binds":["drag"],"desc":"an optional TRANSIENT action when the drag ends, whether dropped on a target, dropped elsewhere, or cancelled ({ drag } in scope); undo onDragStart's feedback here","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","binds":["drag"],"desc":"the action dispatched on drop (e.g. { op: \"updateWhere\", path: \"events\", id: \"{{ drag.id }}\", field: \"date\", value: \"{{ cell.iso }}\" })"},"onDragEnter":{"type":"actions","binds":["drag"],"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","binds":["drag"],"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","binds":["nav"],"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","binds":["nav"],"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","binds":["menu"],"desc":"required action that opens the surface; receives {{ menu.reason }} and {{ menu.focus }}"},"closeAction":{"type":"actions","binds":["menu"],"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","binds":["modal"],"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},"companion":{"type":"string","desc":"root-scoped selector for one persistent, id-bearing application live region (such as notifications) that remains accessible and participates in focus traversal beside the top modal","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. Without it, Enter in a textarea only adds a newline, inside a form too","params":{"action":{"type":"actions","binds":["submit"],"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":"e3f7b40537a8faab","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":"997e75c131c59707","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":"clockTime","id":"singularity.vocabulary@1.0.0:clockTime"},{"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":"markdown","id":"singularity.vocabulary@1.0.0:markdown"},{"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":"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 (ISO string, epoch milliseconds, or 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":"shift a date by an amount of a unit and return an ISO-8601 string (UTC); invalid input returns an empty string. For a numeric timestamp field, use diffTime(addTime(d, amount, unit), 0, 'ms') to preserve epoch milliseconds","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. Every asset:// reference requires an assets binding for its bucket and a registered source, including existing uploaded or generated images. A display helper does not supply that binding or grant access."}},"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"}},"clockTime":{"args":{"d":{"type":"any","desc":"the date"}},"argNames":["d"],"desc":"a date's time of day on a 12-hour clock (7:05 PM), in UTC like every date helper; shift with addTime(d, state.viewerUtcOffsetMinutes, 'minute') for the reader's clock","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","selects":"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":"'symbol' renders the currency symbol (€1,234.50); omitted keeps the code (EUR 1,234.50)"}},"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 (ISO string, epoch milliseconds, or Date)"},"b":{"type":"any","desc":"the earlier date (ISO string, epoch milliseconds, or Date)"},"unit":{"type":"string","desc":"the fixed-length unit (ms/second/minute/hour/day/week; defaults to ms)"}},"argNames":["a","b","unit"],"desc":"return the numeric difference a - b in a fixed-length unit, truncated toward zero (default: ms); invalid dates return 0. diffTime(d, 0, 'ms') converts a valid date to epoch milliseconds without losing milliseconds","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","selects":"items","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","selects":"items","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","selects":"item","implementation":{"kind":"code"}},"first":{"args":{"list":{"type":"array","desc":"the list"}},"argNames":["list"],"desc":"the first item","selects":"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 (tokens YYYY MMMM MMM MM DD HH mm ss; MMM is Jan)","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","selects":"items","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","selects":"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"}},"markdown":{"args":{"s":{"type":"string","desc":"the Markdown text to parse"}},"argNames":["s"],"desc":"chat Markdown as blocks to repeat: { id, kind: p|ul|ol, start, spans, items: [{ id, spans }] }; a span is { id, kind: text|code|link, text, href, strong, em }; a single newline stays in text (use whiteSpace pre-line); only http(s)/mailto become links","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","selects":"item","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"}},"reverse":{"args":{"list":{"type":"array","desc":"the list to reverse"}},"argNames":["list"],"desc":"a reversed copy of a list","selects":"items","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","selects":"items","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","selects":"items","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)","selects":"items","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":"rows with a numeric value in the selected field on every row"},"key":{"type":"string","desc":"the required numeric field to sum"}},"argNames":["list","key"],"desc":"add up one numeric field present on every row; a missing value makes the result NaN. For optional amounts, use a mapped computed cell with row.amount ?? 0, then sum that numeric list","implementation":{"kind":"code"}},"tail":{"args":{"list":{"type":"array","desc":"the list (all but the first)"}},"argNames":["list"],"desc":"all items but the first","selects":"items","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","selects":"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","selects":"items","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","selects":"items","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","selects":"items","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":"f207d4d3bbed4a41","helpers":[{"name":"tenant_media__imageUrl","id":"tenant-media@1.0.0:imageUrl"}],"operations":[],"helperContracts":{"tenant_media__imageUrl":{"args":{"asset":{"type":"any","desc":"a durable asset:// reference, a ready asset cell, or an existing First Light media URL. Every asset:// reference requires an assets binding for its bucket and a registered source, including existing uploaded or generated images. A display helper does not supply that binding or grant access. 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.","imageReferenceArg":0,"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":"3c2f3590b9202a8e","packs":[]},"policy":{"schema":"singularity.policy-runtime.v1","version":"1","id":"284d9762a1f01a7c","packs":[{"schema":"singularity.policy-pack.v1","namespace":"first-light-actor","version":"1.0.0","runtime":"1","exposure":"qualified","contractAddress":"8842a9e155bfbbcb","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-anonymous","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":"cbcbef05b2bb71eb","packs":[{"schema":"singularity.port-pack.v1","namespace":"first-light-reads","version":"1.0.0","runtime":"1","contractAddress":"8ae2ddeda978f623","capabilities":[],"contracts":{},"executions":[],"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 offer numbers and template catalog, projected as one coherent read model.","live":true,"maximumFreshnessMs":300000,"maxRows":1,"collections":{"publicCatalog":{"desc":"One public catalog row containing the current offer's prices and public templates.","ops":["query"],"queryFields":[],"anonymous":["read"],"read":"anonymous","fields":{"id":{"type":"string","desc":"Stable catalog row identity."},"startingCreditCents":{"type":"number","desc":"Builder credit a new account begins with, in whole cents."},"startingCreditUsd":{"type":"string","desc":"The starting credit formatted as USD."},"defaultPublicationCents":{"type":"number","desc":"Monthly price of a blank app kept published, in whole cents."},"defaultPublicationUsd":{"type":"string","desc":"The blank-app monthly price formatted as USD."},"topUpMinimumCents":{"type":"number","desc":"Smallest credit addition accepted, in whole cents."},"topUpMinimumUsd":{"type":"string","desc":"The smallest credit addition formatted as USD."},"templates":{"type":"array","items":{"type":"object","members":{"id":{"type":"string","desc":"Stable listing identity, equal to its source app identity."},"name":{"type":"string","desc":"Published template name."},"summary":{"type":"string","desc":"Published template summary."},"screenshotUrl":{"type":"string","optional":true,"desc":"Immutable release screenshot URL."},"publicationPriceCents":{"type":"number","desc":"Monthly price in cents."},"publicationPriceUsd":{"type":"string","desc":"Formatted monthly price."},"capabilityKinds":{"type":"array","items":"string","desc":"Required capability kinds."},"useCount":{"type":"number","desc":"Number of uses."},"publishedAtMs":{"type":"number","desc":"Listing publication time."}}},"desc":"Newest listing first."}},"live":true}}},"result":{"kind":"rows","maxRows":1,"maxBytes":524288,"classification":"public","maximumFreshnessMs":300000},"stream":{"semantics":"snapshot","recovery":"snapshot"},"authority":{"mode":"public"},"id":"source:d1cc76f12bd80183"},"binding":{"sharing":"shareable"},"hostInputs":{"firstLightReadModels":{"desc":"SourceRead-owned, exact owner query/get models keyed by this pack's provider name.","target":"server","executionTargets":["source-read"],"required":true}}},"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,"maxRows":50,"collections":{"accountPaymentHistory":{"desc":"Account-owned payment events, newest first. Amounts describe each event, not the running wallet balance.","ops":["query"],"queryFields":["orderBy","limit","after"],"order":[["atMs","desc"],["id","desc"]],"maxLimit":50,"anonymous":[],"read":"principal","fields":{"id":{"type":"string","desc":"Opaque event identity and stable pagination tie-breaker."},"label":{"type":"string","desc":"What this payment was for."},"status":{"type":"string","enum":["succeeded","canceled","refunded","refund-reversed","disputed","dispute-reinstated"],"desc":"The durable outcome of this event; later refunds and corrections have their own rows."},"amountCents":{"type":"number","desc":"Positive event amount in USD cents."},"amountUsd":{"type":"string","desc":"Formatted USD event amount."},"atMs":{"type":"number","desc":"Event time, used with id in descending pagination order."},"targetLabel":{"type":"string","optional":true,"desc":"Site name or domain when available."}}},"accountTopOffs":{"desc":"This account's automatic reload preference. Saving it never charges a payment method.","ops":["query","update"],"queryFields":[],"anonymous":[],"read":"principal","inputs":{"update":["enabled","amountCents"]},"enforcedBy":{"update":"the current account session and financial account guards in the settings transaction"},"fields":{"id":{"type":"string","desc":"The current account id."},"enabled":{"type":"boolean","desc":"Whether automatic reload is enabled."},"amountCents":{"type":"number","desc":"Allowed automatic reload amount in USD cents."},"updatedAtMs":{"type":"number","optional":true,"desc":"When the preference was last saved."}},"live":true},"accountProfiles":{"desc":"The signed-in account's editable profile. Omit a field to leave it unchanged; send an empty string to clear it.","ops":["query","update"],"queryFields":[],"inputs":{"update":["name","avatar"]},"anonymous":[],"read":"principal","enforcedBy":{"update":"the current account session checked in the profile UPDATE"},"fields":{"id":{"type":"string","desc":"The current account id."},"name":{"type":"string","desc":"Display name; whitespace is normalized and the result is trimmed to 80 characters. Empty clears the authored name."},"avatar":{"type":"string","desc":"An ABSOLUTE http/https URL, at most 2048 characters; empty clears the avatar."}},"live":true},"accountSummary":{"desc":"One account row joining profile, billing, payment recovery, and entitlement state.","ops":["query"],"queryFields":[],"anonymous":[],"read":"principal","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":"object","members":{"availableMicrocents":"number","availableUsd":"string","availableEmpty":"boolean","owedUsd":"string?","startingCreditCents":"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?"}},"paymentOutcome":{"type":"object","members":{"status":{"type":"string","enum":["succeeded","canceled"]},"paymentIntentId":"string","amountCents":"number","amountUsd":"string","atMs":"number"},"optional":true},"paymentPending":{"type":"object","members":{"target":"string?","targetLabel":"string?","deadlineAtMs":"number?","nextAttemptAtMs":"number?","action":{"type":"string","enum":["check","wait"]},"pending":{"type":"boolean","enum":[true]},"checkable":"boolean","kind":{"type":"string","enum":["manual","automatic","purchase","renewal"]},"amountCents":"number","amountUsd":"string"},"optional":true},"paymentRecovery":{"type":"union","variants":[{"type":"object","members":{"target":"string?","targetLabel":"string?","deadlineAtMs":"number?","nextAttemptAtMs":"number?","action":{"type":"string","enum":["authenticate","change-card"]},"pending":{"type":"boolean","enum":[true]},"kind":{"type":"string","enum":["manual","automatic","purchase","renewal"]},"amountCents":"number","amountUsd":"string"}},{"type":"object","members":{"target":"string?","targetLabel":"string?","deadlineAtMs":"number?","nextAttemptAtMs":"number?","action":{"type":"string","enum":["add-card"]},"pending":{"type":"boolean","enum":[true]},"kind":{"type":"string","enum":["renewal"]},"amountCents":"number?","amountUsd":"string?"}}],"optional":true}},"desc":"The prepaid balance, saved card, automatic reload and open payments."},"entitlements":{"type":"object","members":{"grants":{"type":"array","items":"string"}},"desc":"Entitlement names this account holds; the roster is open by design."},"commercialApi":{"type":"union","variants":[{"type":"object","members":{"active":{"type":"boolean","enum":[false]}}},{"type":"object","members":{"active":{"type":"boolean","enum":[true]},"credentialId":"string","revision":"number","createdAtMs":"number","rotatedAtMs":"number","lastUsedAtMs":"number?"}}],"desc":"Non-secret metadata for this account's sole active commercial API credential."}},"live":true}}},"result":{"kind":"rows","maxRows":50,"maxBytes":524288,"classification":"private"},"stream":{"semantics":"snapshot","recovery":"snapshot"},"authority":{"mode":"lease"},"id":"source:079c4292195cf2bc"},"binding":{"sharing":"isolated"},"hostInputs":{"firstLightReadModels":{"desc":"SourceRead-owned, exact owner query/get models keyed by this pack's provider name.","target":"server","executionTargets":["source-read"],"required":true}}},"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,"maxRows":10000,"collections":{"templateListings":{"desc":"The public template listings as a signed-in collection. Removing one requires current manager authority on its source app; publishing remains a release workflow.","ops":["query","remove"],"queryFields":[],"anonymous":[],"read":"principal","live":true,"enforcedBy":{"remove":"current app.administer authority and session checked inside the listing deletion transaction"},"fields":{"id":{"type":"string","desc":"Stable listing identity, equal to its source app identity."},"name":{"type":"string","desc":"Published template name."},"summary":{"type":"string","desc":"Published template summary."},"screenshotUrl":{"type":"string","optional":true,"desc":"Immutable release screenshot URL."},"publicationPriceCents":{"type":"number","desc":"Monthly price in cents."},"publicationPriceUsd":{"type":"string","desc":"Formatted monthly price."},"capabilityKinds":{"type":"array","items":"string","desc":"Required capability kinds."},"useCount":{"type":"number","desc":"Number of uses."},"publishedAtMs":{"type":"number","desc":"Listing publication time."}}},"apps":{"desc":"App summaries for the signed-in account: identity, name, thumbnail, role, deployment and subscription. Only name is writable here.","ops":["query","update"],"queryFields":[],"inputs":{"update":["name"]},"anonymous":[],"read":"principal","enforcedBy":{"update":"the owning actor checks current app.build authority and active custody in the name transaction"},"fields":{"id":{"type":"string","desc":"The app identity."},"role":{"type":"string","enum":["owner","admin","editor"],"desc":"This account's app role."},"publicationPriceCents":{"type":"number","desc":"The whole-USD-cent monthly publication price captured when this app was created."},"publicationPriceUsd":{"type":"string","desc":"Monthly publication price formatted in USD."},"name":{"type":"string","optional":true,"desc":"App name; updates require a nonempty trimmed name of at most 120 characters."},"summary":{"type":"string","optional":true,"desc":"The app summary shown in the dashboard."},"thumbnailUrl":{"type":"string","optional":true,"desc":"The app screenshot or thumbnail URL."},"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":"Current publication state and address label."},"subscription":{"type":"object","members":{"status":{"type":"string","enum":["active","delinquent","canceled"],"desc":"`active` is paid through `periodEndMs`. `delinquent` is a period that could not be funded; `graceEndsAtMs` names the accepted renewal deadline when present. `canceled` bills no further."},"priceMicrocents":"number","priceUsd":"string","periodEndMs":{"type":"number","desc":"When the paid period runs out and the renewal is collected."},"graceEndsAtMs":"number?","delinquentSinceMs":{"type":"number","optional":true,"desc":"Present exactly when `status` is `delinquent`: when the site first went unfunded."}},"desc":"What the owner pays to keep this site published. Absent when nothing was ever bought, which is every app that has not been published.","optional":true}},"live":true},"accountPortfolio":{"desc":"One portfolio row joining app summaries, deployment facets, and account-owned domains.","ops":["query"],"queryFields":[],"anonymous":[],"read":"principal","fields":{"id":{"type":"string","desc":"The verified First Light account identity."},"apps":{"type":"array","items":{"type":"object","members":{"id":{"type":"string","desc":"The app identity."},"role":{"type":"string","enum":["owner","admin","editor"],"desc":"This account's app role."},"publicationPriceCents":{"type":"number","desc":"The whole-USD-cent monthly publication price captured when this app was created."},"publicationPriceUsd":{"type":"string","desc":"Monthly publication price formatted in USD."},"name":{"type":"string","optional":true,"desc":"App name; updates require a nonempty trimmed name of at most 120 characters."},"summary":{"type":"string","optional":true,"desc":"The app summary shown in the dashboard."},"thumbnailUrl":{"type":"string","optional":true,"desc":"The app screenshot or thumbnail URL."},"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":"Current publication state and address label."},"subscription":{"type":"object","members":{"status":{"type":"string","enum":["active","delinquent","canceled"],"desc":"`active` is paid through `periodEndMs`. `delinquent` is a period that could not be funded; `graceEndsAtMs` names the accepted renewal deadline when present. `canceled` bills no further."},"priceMicrocents":"number","priceUsd":"string","periodEndMs":{"type":"number","desc":"When the paid period runs out and the renewal is collected."},"graceEndsAtMs":"number?","delinquentSinceMs":{"type":"number","optional":true,"desc":"Present exactly when `status` is `delinquent`: when the site first went unfunded."}},"desc":"What the owner pays to keep this site published. Absent when nothing was ever bought, which is every app that has not been published.","optional":true}}},"desc":"Ordered by id; no source manifests."},"deletingAppIds":{"type":"array","items":"string","maxItems":500,"desc":"App identities whose deletion fence has committed for this member. Leave their builder immediately; physical erasure continues durably. A busy request, refusal or missing app is not a deletion fence."},"domains":{"type":"array","items":{"type":"object","members":{"id":"string","source":{"type":"string","enum":["external","registered"]},"status":{"type":"string","enum":["pending_verification","provisioning_cert","registering","active","sandbox","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"},"failure":{"type":"object","members":{"code":{"type":"string","enum":["DOMAIN_REGISTRANT_EMAIL_APPROVAL_REQUIRED","DOMAIN_HOSTNAME_PROVIDER_REPORTED_ERROR","DOMAIN_DNS_RECORD_AMBIGUOUS","DOMAIN_PROVIDER_AUTHORIZATION_FAILED","DOMAIN_PROVIDER_OUTCOME_UNKNOWN","DOMAIN_REGISTRATION_UNKNOWN_OUTCOME_OPERATOR_REVIEW","DOMAIN_UNAVAILABLE_AT_REGISTER","CLOUDFLARE_REGISTRAR_REGISTER_FAILED","CLOUDFLARE_REGISTRAR_REFUSED","CLOUDFLARE_REQUEST_REFUSED","DOMAIN_REGISTER_WORKFLOW_FAILED","DOMAIN_REGISTRATION_CONFIRMING","DOMAIN_REGISTRATION_BECOMING_VISIBLE","DOMAIN_ZONE_NOT_VISIBLE","DOMAIN_DNS_SETUP_CONFIRMING","DOMAIN_RELEASE_IN_PROGRESS","DOMAIN_PROVIDER_RATE_LIMITED","DOMAIN_PROVIDER_UNAVAILABLE"]},"message":"string","waiting":"boolean"},"optional":true,"desc":"what the pipeline last recorded, in the customer's words; absent on a healthy domain"}}},"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":10000,"maxBytes":524288,"classification":"private"},"stream":{"semantics":"snapshot","recovery":"snapshot"},"authority":{"mode":"lease"},"id":"source:fbbd7eeeee3fddf8"},"binding":{"sharing":"isolated"},"hostInputs":{"firstLightReadModels":{"desc":"SourceRead-owned, exact owner query/get models keyed by this pack's provider name.","target":"server","executionTargets":["source-read"],"required":true}}},"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,"maxRows":200,"collections":{"accountPasskeys":{"desc":"The account's registered passkeys. Removal signs out every platform session.","ops":["query","remove"],"queryFields":[],"anonymous":[],"read":"principal","live":true,"enforcedBy":{"remove":"recent authentication, current session and owned credential checked by the security transaction"},"fields":{"id":{"type":"string","desc":"Passkey id."},"label":{"type":"string","desc":"Passkey label."},"createdAtMs":{"type":"number","desc":"Passkey createdAtMs."},"lastUsedAtMs":{"type":"number","desc":"Passkey lastUsedAtMs."}}},"accountSessions":{"desc":"The current account's active platform session families. Removing one signs out that family.","ops":["query","remove"],"queryFields":[],"anonymous":[],"read":"principal","live":true,"enforcedBy":{"remove":"the current session and caller-owned family checked in the removal transaction"},"fields":{"id":{"type":"string","desc":"Session id."},"deviceLabel":{"type":"string","desc":"Session deviceLabel."},"authenticationMethod":{"type":"string","enum":["unknown","email","google","passkey"],"desc":"Session authenticationMethod."},"createdAtMs":{"type":"number","desc":"Session createdAtMs."},"lastSeenAtMs":{"type":"number","desc":"Session lastSeenAtMs."},"expiresAtMs":{"type":"number","desc":"Session expiresAtMs."},"absoluteExpiresAtMs":{"type":"number","desc":"Session absoluteExpiresAtMs."}}},"accountSecurity":{"desc":"One private security row refreshed from the account mutation outbox.","ops":["query"],"queryFields":[],"anonymous":[],"read":"principal","live":true,"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":"These family ids are also the keys of accountSessions."}}}}},"result":{"kind":"rows","maxRows":200,"maxBytes":524288,"classification":"private"},"stream":{"semantics":"snapshot","recovery":"snapshot"},"authority":{"mode":"lease"},"id":"source:6fdd72064b60a630"},"binding":{"sharing":"isolated"},"hostInputs":{"firstLightReadModels":{"desc":"SourceRead-owned, exact owner query/get models keyed by this pack's provider name.","target":"server","executionTargets":["source-read"],"required":true}}},"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,"maxRows":1,"collections":{"appWorkspace":{"desc":"One app workspace row selected by appId and projected for the verified app member.","ops":["query"],"queryFields":[],"params":["appId"],"requiredParams":["appId"],"anonymous":[],"read":"principal","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","history":{"type":"object","members":{"canBack":{"type":"boolean","desc":"Whether the durable manifest-version lane has an active revision to reverse and no build currently owns the app's authoring slot."},"canForward":{"type":"boolean","desc":"Whether the durable manifest-version lane has a reversed revision to reapply and no build currently owns the app's authoring slot."}}}}}},"desc":"The app's own identity and its current authored source."},"deployment":{"type":"object","members":{"head":{"type":"string","desc":"Content token for the exact manifest head currently served by every deployment address."},"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":["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","occurrence":{"type":"string","optional":true,"desc":"Opaque accepted submit identity; compare to the send command's fx occurrence to reconcile a pending message."},"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:aedd1ecc1f54e7d2"},"binding":{"sharing":"isolated"},"hostInputs":{"firstLightReadModels":{"desc":"SourceRead-owned, exact owner query/get models keyed by this pack's provider name.","target":"server","executionTargets":["source-read"],"required":true}}},"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.","maxRows":100,"collections":{"appBuilderMessages":{"desc":"A keyset-paged builder message history selected by appId, newest first.","ops":["query"],"queryFields":["orderBy","limit","after"],"order":[["sequence","desc"],["id","desc"]],"params":["appId"],"requiredParams":["appId"],"maxLimit":100,"anonymous":[],"read":"principal","fields":{"id":{"type":"string","desc":"Immutable message identity."},"occurrence":{"type":"string","optional":true,"desc":"Opaque accepted submit identity on user messages; compare with the send command's fx occurrence."},"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:df11448ee8ff01ac"},"binding":{"sharing":"isolated"},"hostInputs":{"firstLightReadModels":{"desc":"SourceRead-owned, exact owner query/get models keyed by this pack's provider name.","target":"server","executionTargets":["source-read"],"required":true}}},"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,"maxRows":100,"collections":{"appInvitations":{"desc":"Pending invitations visible to this app's managers. Delete cancels the selected invitation.","ops":["query","remove"],"queryFields":[],"params":["appId"],"requiredParams":["appId"],"anonymous":[],"read":"principal","enforcedBy":{"remove":"the current session and actor-issued app.administer grant in the audit/delete transaction"},"fields":{"id":{"type":"string","desc":"App id and invitation email joined by a slash."},"appId":{"type":"string","desc":"The authorized app."},"email":{"type":"string","desc":"The invited email address."}},"live":true},"appOwnershipOffers":{"desc":"The owner's pending handoff offer. Delete cancels only the exact selected request.","ops":["query","remove"],"queryFields":[],"params":["appId"],"requiredParams":["appId"],"anonymous":[],"read":"principal","enforcedBy":{"remove":"recent authentication and the current session plus actor-issued app.transfer grant"},"fields":{"id":{"type":"string","desc":"App id and exact offer request id joined by a slash."},"appId":{"type":"string","desc":"The authorized app."},"requestId":{"type":"string","desc":"The exact pending offer request."}},"live":true},"appSupportGrants":{"desc":"Support access visible to the owner. The owner or grant holder may delete a grant, including during maintenance.","ops":["query","remove"],"queryFields":[],"params":["appId"],"requiredParams":["appId"],"anonymous":[],"read":"principal","enforcedBy":{"remove":"the current session and either the exact caller-owned grant or actor-issued app.transfer grant"},"fields":{"id":{"type":"string","desc":"App id and support account id joined by a slash."},"appId":{"type":"string","desc":"The authorized app."},"accountId":{"type":"string","desc":"The support account receiving access."}},"live":true},"appFeatures":{"desc":"Feature settings for one app. Update revision plus exactly one of enabled, configuration:null or replacement:null.","ops":["query","update"],"queryFields":[],"params":["appId"],"requiredParams":["appId"],"anonymous":[],"read":"principal","live":true,"inputs":{"update":["revision","enabled","configuration","replacement"]},"enforcedBy":{"update":"current app.administer authority, session, custody, revision and provider-verification rules in the resource owner"},"fields":{"id":{"type":"string","desc":"The app/kind identity."},"kind":{"type":"string","desc":"The registered capability kind."},"label":{"type":"string","desc":"Feature label."},"summary":{"type":"string","desc":"Feature description."},"category":{"type":"string","enum":["people","content","business","automation","platform"],"desc":"Feature category."},"setup":{"type":"string","enum":["included","connect"],"desc":"Configuration posture."},"useCases":{"type":"array","items":{"type":"object","members":{"id":"string","label":"string"}},"desc":"Supported uses."},"status":{"type":"string","enum":["included","available","paused","off","setup-required","check-required"],"desc":"Derived readiness status."},"available":{"type":"boolean","desc":"Whether this feature is available."},"manageable":{"type":"boolean","desc":"Whether the caller can change this feature."},"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}},"desc":"Current provider verification."},"revision":{"type":"number","optional":true,"desc":"Current configuration revision; every update must supply this value as its precondition."},"enabled":{"type":"boolean","optional":true,"desc":"Pause with false; resume with true after required settings and verification pass."},"configuration":{"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"}}}},"optional":true,"desc":"Manager-visible settings and secret presence; an update may supply only null to clear the connection."},"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,"desc":"Staged replacement; an update may supply only null to discard it while preserving active settings."}}},"appAdministration":{"desc":"One administration row selected by appId; privileged fields are omitted unless the verified role permits them.","ops":["query"],"queryFields":[],"params":["appId"],"requiredParams":["appId"],"anonymous":[],"read":"principal","live":true,"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":{"delivery":{"type":"string","enum":["sending","sent","uncertain","failed"]},"email":"string","role":{"type":"string","enum":["editor","admin"]},"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."},"templatePromptMaterial":{"type":"string","optional":true,"desc":"Saved template creator guidance; app managers only."},"transfer":{"type":"object","members":{"pending":"boolean","offer":{"type":"object","members":{"delivery":{"type":"string","enum":["sending","sent","uncertain","failed"]},"requestId":"string","recipientEmail":"string","keepPreviousOwnerAsManager":"boolean","createdAtMs":"number","expiresAtMs":"number"},"optional":true}},"optional":true,"desc":"Present only for a caller holding transferOwnership."},"capabilities":{"type":"array","items":{"type":"object","members":{"id":{"type":"string","desc":"The app/kind identity."},"kind":{"type":"string","desc":"The registered capability kind."},"label":{"type":"string","desc":"Feature label."},"summary":{"type":"string","desc":"Feature description."},"category":{"type":"string","enum":["people","content","business","automation","platform"],"desc":"Feature category."},"setup":{"type":"string","enum":["included","connect"],"desc":"Configuration posture."},"useCases":{"type":"array","items":{"type":"object","members":{"id":"string","label":"string"}},"desc":"Supported uses."},"status":{"type":"string","enum":["included","available","paused","off","setup-required","check-required"],"desc":"Derived readiness status."},"available":{"type":"boolean","desc":"Whether this feature is available."},"manageable":{"type":"boolean","desc":"Whether the caller can change this feature."},"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}},"desc":"Current provider verification."},"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}},"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."}}}}},"result":{"kind":"rows","maxRows":100,"maxBytes":524288,"classification":"private"},"stream":{"semantics":"snapshot","recovery":"snapshot"},"authority":{"mode":"lease"},"id":"source:e6168db1345e1f23"},"binding":{"sharing":"isolated"},"hostInputs":{"firstLightReadModels":{"desc":"SourceRead-owned, exact owner query/get models keyed by this pack's provider name.","target":"server","executionTargets":["source-read"],"required":true}}}},"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":"290ed7f37fabab85","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.builder-draft","id":"first-light@1.0.0:builder-draft"},{"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.referrals","id":"first-light@1.0.0:referrals"},{"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","reversibility":"compensating","recovery":"reconcile"},"problems":{"AUTHENTICATION_REQUIRED":"after-sign-in","ACCESS_DENIED":"never","BAD_REQUEST":"after-correction","NOT_FOUND":"after-refresh","CONFLICT":"after-refresh","RATE_LIMITED":"after-delay","EMAIL_DELIVERY_OUTCOME_UNCERTAIN":"never","UPSTREAM_UNAVAILABLE":"after-delay","SERVICE_UNAVAILABLE":"after-delay","INTERNAL_ERROR":"safe","FIRST_LIGHT_COMMAND_NOT_RECEIVED":"safe","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","reversibility":"compensating","recovery":"reconcile"},"problems":{"AUTHENTICATION_REQUIRED":"after-sign-in","ACCESS_DENIED":"never","BAD_REQUEST":"after-correction","NOT_FOUND":"after-refresh","CONFLICT":"after-refresh","RATE_LIMITED":"after-delay","EMAIL_DELIVERY_OUTCOME_UNCERTAIN":"never","UPSTREAM_UNAVAILABLE":"after-delay","SERVICE_UNAVAILABLE":"after-delay","INTERNAL_ERROR":"safe","FIRST_LIGHT_COMMAND_NOT_RECEIVED":"safe","FIRST_LIGHT_PREVIOUS_COMMAND_UNRESOLVED":"never"}},"access.leave":{"input":{"appId":"string"},"policy":{"authorization":"app.member","audit":"security","cost":"none","reversibility":"compensating","recovery":"reconcile"},"problems":{"AUTHENTICATION_REQUIRED":"after-sign-in","ACCESS_DENIED":"never","BAD_REQUEST":"after-correction","NOT_FOUND":"after-refresh","CONFLICT":"after-refresh","RATE_LIMITED":"after-delay","EMAIL_DELIVERY_OUTCOME_UNCERTAIN":"never","UPSTREAM_UNAVAILABLE":"after-delay","SERVICE_UNAVAILABLE":"after-delay","INTERNAL_ERROR":"safe","FIRST_LIGHT_COMMAND_NOT_RECEIVED":"safe","FIRST_LIGHT_PREVIOUS_COMMAND_UNRESOLVED":"never"}},"invite.accept":{"input":{"appId":"string","code":"string"},"policy":{"authorization":"account.self","audit":"app","cost":"none","reversibility":"compensating","recovery":"reconcile"},"problems":{"AUTHENTICATION_REQUIRED":"after-sign-in","ACCESS_DENIED":"never","BAD_REQUEST":"after-correction","NOT_FOUND":"after-refresh","CONFLICT":"after-refresh","RATE_LIMITED":"after-delay","EMAIL_DELIVERY_OUTCOME_UNCERTAIN":"never","UPSTREAM_UNAVAILABLE":"after-delay","SERVICE_UNAVAILABLE":"after-delay","INTERNAL_ERROR":"safe","FIRST_LIGHT_COMMAND_NOT_RECEIVED":"safe","FIRST_LIGHT_PREVIOUS_COMMAND_UNRESOLVED":"never"}}}},"first-light.account":{"desc":"Runs signed-in account writes and the one-time commercial API credential ceremonies. Reads arrive through accountSummary/accountSecurity; passkey 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":{"commercial-api.create":{"desc":"Create this account's sole active commercial API credential and reveal both secrets once.","policy":{"authorization":"account.self.recent","audit":"security","cost":"none","recovery":"reconcile","reversibility":"irreversible"},"result":{"schema":{"credential_id":"string","revision":"number","api_key":"string","callback_secret":"string","created_at_ms":"number","rotated_at_ms":"number"},"maxBytes":2048,"classification":"sensitive"},"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"}},"commercial-api.rotate":{"desc":"Replace this account's active commercial API bearer and callback verifier revision.","policy":{"authorization":"account.self.recent","audit":"security","cost":"none","recovery":"reconcile","reversibility":"irreversible"},"result":{"schema":{"credential_id":"string","revision":"number","api_key":"string","callback_secret":"string","created_at_ms":"number","rotated_at_ms":"number"},"maxBytes":2048,"classification":"sensitive"},"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"}},"commercial-api.revoke":{"desc":"Revoke this account's active commercial API credential.","policy":{"authorization":"account.self.recent","audit":"security","cost":"none","recovery":"reconcile","reversibility":"irreversible"},"result":{"schema":{"credential_id":"string","revoked":"boolean"},"maxBytes":256,"classification":"private"},"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"}},"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","reversibility":"irreversible","recovery":"reconcile"},"problems":{"AUTHENTICATION_REQUIRED":"after-sign-in","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_PREVIOUS_COMMAND_UNRESOLVED":"never"}}}},"first-light.apps":{"desc":"Runs the app catalog lifecycle through the engine action ingress: create, clone authored content, 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":{"inputs":{"browserAuthorityProvider":{"target":"browser","required":true,"desc":"The one document authority provider whose server projection remounts a withdrawn draft frame."},"browserAuthorityRetirement":{"target":"browser","required":true,"desc":"The one document authority lifecycle that aborts head reads and withdraws the retained draft frame before identity projection."},"browserAuthorityInvalidation":{"target":"browser","required":true,"desc":"The host's one replacement-aware authority invalidation callback; preview only announces a server mismatch."},"browserDocumentOrigin":{"target":"browser","required":false,"desc":"Current document origin supplied by the browser composition root for same-origin owned media delivery."},"browserDraftOrigin":{"target":"browser","required":false,"desc":"The deployment's draft namespace origin the platform response disclosed; each app's draft is served one label beneath it. Absent on a static guest document, where the preview mounts nothing."}}},"outputs":{"element":{"desc":"Mounts one app's current draft in an isolated sibling-origin frame at its final address. The trusted binder owns the draft namespace, the frame lifecycle and sizing; the manifest supplies only the app identity and the 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 relays the compiled head into the running frame."},"preview":{"type":"object","required":false,"desc":"A newly settled history command's validated preview release. Relayed under the current builder authority without a redundant head lookup; absent on receipt-only recovery."},"authoring":{"type":"boolean","required":false,"desc":"Whether the customer is editing words in place. On, a click in the draft selects the rendered thing and typed words commit at its authored address; off (the default), the draft is the app."},"reach":{"type":"string","required":false,"desc":"The ladder key of the reach the customer picked for the current selection, from selection.ladder[].key; empty or a key the ladder does not offer means the actor’s own default. The draft outlines every rendered node that reach moves and, when a string lives there, opens the editor on it."},"property":{"type":"string","required":false,"desc":"At a styling reach, the one declaration of it the customer is changing, named as the styling writes it (a key of selection.ladder[].properties, or a new one); the editor opens on that declaration’s value and typed words are written to it. Empty means the reach’s own words."},"value":{"type":"string","required":false,"desc":"The value the customer is choosing for the reach in force, shown live in the draft before anything lands: on every outlined node for a styling’s named property, on the design value’s own custom property for a value reach. Empty shows nothing."},"edit":{"type":"object","required":false,"desc":"{ id: string | integer, action: 'commit' | 'cancel' }. A fresh nonempty id commits the current value at the selected reach and property through the same writer as typing, or cancels the temporary preview. Repeating an id does nothing. The outcome arrives through onSelection."},"retry":{"type":"object","required":false,"desc":"{ id: string | integer }. A fresh nonempty id re-attempts whatever onDocumentState last reported as unfinished: a document that never answered is mounted again, a working document whose update was refused is pushed again. Repeating an id does nothing."},"onDocumentState":{"type":"actions","required":false,"binds":["documentState"],"desc":"Dispatched with { documentState } whenever what the preview surface has to show changes: \"loading\" while a frame is mounted (or cannot be mounted yet) and has not answered, \"ready\" once the draft is showing, \"stale\" when the shown document is live but refused its update, \"unavailable\" when it never answered. The element draws no message of its own; the surface owns the picture and offers the retry through `retry`. The bind is spelled `documentState` rather than `state` because a bind is merged OVER the scope and would otherwise shadow the state root for every expression in the same action."},"onSelection":{"type":"actions","required":false,"binds":["selection"],"desc":"Dispatched with { selection } whenever the selection changes: { chain, answer, ladder } after a click in the draft — answer is { kind: \"words\", value, reaches, at }, { kind: \"refused\", reason } or, once a commit lands, { kind: \"committed\", at, reaches }; ladder is [{ rung, reaches, key, typeable, value?, properties?, variable?, count? }], narrowest first, reported again with each rung’s count once the draft has counted its reach — or null when there is none (authoring off, the frame replaced). A commit refusal arrives as the same selection with a refused answer and its ladder kept."}}}},"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","reversibility":"compensating","recovery":"reconcile"},"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_PREVIOUS_COMMAND_UNRESOLVED":"never"}},"app.clone":{"input":{"appId":"string","name":"string","summary":"string?","slug":"string?"},"result":{"schema":{"appId":"string"},"maxBytes":256,"classification":"private"},"policy":{"authorization":"app.manager","audit":"app","cost":"none","reversibility":"compensating","recovery":"reconcile"},"problems":{"AUTHENTICATION_REQUIRED":"after-sign-in","ACCESS_DENIED":"never","BAD_REQUEST":"after-correction","UNPROCESSABLE_CONTENT":"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_PREVIOUS_COMMAND_UNRESOLVED":"never"}},"app.publish":{"input":{"appId":"string"},"policy":{"authorization":"app.manager","audit":"app","cost":"none","reversibility":"compensating","recovery":"reconcile"},"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","PUBLICATION_SUBSCRIPTION_REQUIRED":"after-correction","FIRST_LIGHT_COMMAND_NOT_RECEIVED":"safe","FIRST_LIGHT_PREVIOUS_COMMAND_UNRESOLVED":"never"}},"app.unpublish":{"input":{"appId":"string"},"policy":{"authorization":"app.manager","audit":"app","cost":"none","reversibility":"compensating","recovery":"reconcile"},"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_PREVIOUS_COMMAND_UNRESOLVED":"never"}},"app.delete":{"input":{"appId":"string","confirmName":"string"},"policy":{"authorization":"app.owner","audit":"app","cost":"none","reversibility":"irreversible","recovery":"reconcile"},"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_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` must be non-empty after trimming — the length bounds are published on the operands themselves, not restated here.","input":{"appId":"string","message":{"type":"string","maxLength":4000},"context":{"type":"string","optional":true,"maxLength":1200,"desc":"Optional selected-content prompt context; stored separately from visible message text, not a write scope or authority grant."},"attachments":{"type":"array","items":{"type":"object","members":{"id":{"type":"string","maxLength":256},"ref":{"type":"string","maxLength":1024}}},"maxItems":8,"optional":true}},"policy":{"authorization":"app.member","audit":"app","cost":"none","reversibility":"compensating","recovery":"reconcile"},"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","SERVICE_UNAVAILABLE":"after-delay","INTERNAL_ERROR":"safe","FIRST_LIGHT_COMMAND_NOT_RECEIVED":"safe","FIRST_LIGHT_PREVIOUS_COMMAND_UNRESOLVED":"never"}},"app.builder.control":{"desc":"Apply one server-rostered control to the current durable builder work. `continue` resumes a build paused for funds; its next paid step checks the balance again, and account credits never restart authoring by themselves.","input":{"appId":"string","control":{"type":"string","enum":["cancel","retry","continue"]}},"policy":{"authorization":"app.member","audit":"app","cost":"none","reversibility":"compensating","recovery":"reconcile"},"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","SERVICE_UNAVAILABLE":"after-delay","INTERNAL_ERROR":"safe","FIRST_LIGHT_COMMAND_NOT_RECEIVED":"safe","FIRST_LIGHT_PREVIOUS_COMMAND_UNRESOLVED":"never"}},"app.builder.history":{"desc":"Move one step on the app's durable manifest-version lane. The actor derives whether a back or forward step exists from that same journal and treats an empty side as a settled no-op; the browser never supplies a revision or patch.","input":{"appId":"string","direction":{"type":"string","enum":["back","forward"]}},"result":{"schema":{"preview":{"type":"object","values":"any","optional":true}},"maxBytes":32768,"classification":"private"},"policy":{"authorization":"app.member","audit":"app","cost":"none","reversibility":"compensating","recovery":"reconcile"},"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","SERVICE_UNAVAILABLE":"after-delay","INTERNAL_ERROR":"safe","FIRST_LIGHT_COMMAND_NOT_RECEIVED":"safe","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","binds":["card","payment"],"desc":"The declarative actions dispatched when the card form is ready."},"onChange":{"type":"actions","binds":["card","payment"],"desc":"The declarative actions dispatched with card.complete and card.message after field changes."},"onSubmit":{"type":"actions","binds":["card","payment"],"desc":"The declarative actions dispatched immediately before confirmation begins."},"onSuccess":{"type":"actions","binds":["card","payment"],"desc":"The declarative actions dispatched with card.setupIntentId after successful confirmation."},"onError":{"type":"actions","binds":["card","payment"],"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","reversibility":"compensating","recovery":"reconcile"},"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. Optional recoveryId and paymentIntentId bind a recovery link to its original payment attempt; a stale target is refused.","input":{"recoveryId":"string?","paymentIntentId":"string?"},"policy":{"authorization":"account.self","audit":"financial","cost":"none","reversibility":"compensating","recovery":"reconcile"},"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":"provider-funded","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_PREVIOUS_COMMAND_UNRESOLVED":"never"}},"purchase.credits-with-card":{"desc":"Save the setup intent's payment method, automatic top-off preference, and purchased credits as one idempotent operation. Replays never charge twice.","input":{"setup_intent_id":"string","amountCents":"number","autoTopOffEnabled":"boolean"},"policy":{"authorization":"account.self","audit":"financial","cost":"provider-funded","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_PREVIOUS_COMMAND_UNRESOLVED":"never"}},"purchase.domain":{"desc":"Buy one domain with the saved payment card. `fqdn` is a `domainSearch` candidate's `name`. Availability and price are re-checked authoritatively here; the search quote is advisory. The account credit balance is not read or changed.","input":{"fqdn":"string","disclosureRevision":{"type":"string","enum":["first-light-platform-custody-v1"]}},"policy":{"authorization":"account.self","audit":"financial","cost":"provider-funded","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_PREVIOUS_COMMAND_UNRESOLVED":"never"}},"publication.purchase":{"desc":"Buy one monthly subscription and publish `appId`'s current head as one durable operation. Charge the saved card, never account credits. Replays reuse the live subscription and ensure the head is published before settling. Optional `slug` carries a precomputed DNS-safe publication address; standard dashboard publication omits it.","input":{"appId":"string","slug":"string?"},"result":{"schema":{"published":"boolean"},"maxBytes":64,"classification":"private"},"policy":{"authorization":"account.self","audit":"financial","cost":"provider-funded","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","NOT_FOUND":"after-refresh","UNPROCESSABLE_CONTENT":"after-correction","FIRST_LIGHT_COMMAND_NOT_RECEIVED":"safe","FIRST_LIGHT_PREVIOUS_COMMAND_UNRESOLVED":"never"}},"card.save":{"input":{"setup_intent_id":"string","topOffEnabled":"boolean?","topOffAmountCents":"number?"},"policy":{"authorization":"account.self","audit":"financial","cost":"none","reversibility":"compensating","recovery":"reconcile"},"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_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","reversibility":"compensating","recovery":"reconcile"},"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_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","reversibility":"compensating","recovery":"reconcile"},"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_PREVIOUS_COMMAND_UNRESOLVED":"never"}}}},"first-light.builder-draft":{"desc":"This tab’s First Light builder input, scoped to app and signed-in account.","target":"browser","host":{"inputs":{"browserAuthorityProvider":{"target":"browser","required":true,"desc":"The document session owner scopes this tab’s unsent builder draft to its signed-in account."}}},"outputs":{"element":{"default":"builder_draft","desc":"Retains builder input through document replacement in this tab. Restores unchanged empty input; an exact accepted user-message occurrence removes its submitted draft. Missing receipt rows leave input uncertain and editable. Account withdrawal clears saved drafts. Stored image references grant no access.","params":{"appId":{"type":"string","required":true,"desc":"Selected child app; scope the supplied input to this app."},"message":{"type":"string","required":true,"desc":"Current unsent text, at most 4,000 characters."},"attachments":{"type":"array","required":true,"desc":"Up to eight selected images: [{ id, ref }]."},"pendingOccurrence":{"type":"string","required":false,"desc":"This app’s send-command occurrence while busy or reconciling; otherwise empty."},"acceptedMessages":{"type":"array","required":false,"desc":"This app’s durable builder message rows; only exact role:user occurrence matches confirm acceptance."},"onRestore":{"type":"actions","required":true,"binds":["draft"],"desc":"Apply draft.message and draft.attachments as one object, for restoration or clearing confirmed submitted input."}}}}},"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.search":{"desc":"Return bounded, advisory domain availability candidates for one search phrase.","input":{"q":"string"},"result":{"schema":{"name":"string","available":"boolean","premium":"boolean","reason":"string?","priceDollars":"number?","totalMicrocents":"number?","currency":"string?"},"many":true,"maxItems":12,"maxBytes":32768,"classification":"private"},"policy":{"authorization":"account.self","audit":"app","cost":"provider-funded","recovery":"retry-idempotent","reversibility":"irreversible"},"problems":{"AUTHENTICATION_REQUIRED":"after-sign-in","ACCESS_DENIED":"never","BAD_REQUEST":"after-correction","RATE_LIMITED":"after-delay","REQUEST_FAILED":"after-refresh","UPSTREAM_TIMEOUT":"after-delay","UPSTREAM_UNAVAILABLE":"after-delay","SERVICE_UNAVAILABLE":"after-delay","INTERNAL_ERROR":"safe"}},"domain.add-external":{"input":{"fqdn":"string"},"policy":{"authorization":"account.self","audit":"app","cost":"none","reversibility":"compensating","recovery":"reconcile"},"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_PREVIOUS_COMMAND_UNRESOLVED":"never"}},"domain.refresh":{"input":{"fqdn":"string"},"policy":{"authorization":"account.self","audit":"app","cost":"none","reversibility":"compensating","recovery":"reconcile"},"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_PREVIOUS_COMMAND_UNRESOLVED":"never"}},"domain.attach":{"input":{"fqdn":"string","appId":"string"},"policy":{"authorization":"account.app-manager","audit":"app","cost":"none","reversibility":"compensating","recovery":"reconcile"},"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_PREVIOUS_COMMAND_UNRESOLVED":"never"}},"domain.detach":{"input":{"fqdn":"string"},"policy":{"authorization":"account.self","audit":"app","cost":"none","reversibility":"compensating","recovery":"reconcile"},"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_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","audit":"app","cost":"none","reversibility":"compensating","recovery":"reconcile"},"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_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","reversibility":"compensating","recovery":"reconcile"},"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_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":{"desc":"Save settings and verify the provider connection. Success means verified; a rejected key or missing permission is a declared action failure. A rejected replacement preserves the current verified connection.","result":{"schema":{"verified":{"type":"boolean","enum":[true]}},"maxBytes":64,"classification":"private"},"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","reversibility":"compensating","recovery":"reconcile"},"problems":{"AUTHENTICATION_REQUIRED":"after-sign-in","ACCESS_DENIED":"never","BAD_REQUEST":"after-correction","NOT_FOUND":"after-refresh","CONFLICT":"after-refresh","RATE_LIMITED":"after-delay","EMAIL_DELIVERY_OUTCOME_UNCERTAIN":"never","UPSTREAM_UNAVAILABLE":"after-delay","SERVICE_UNAVAILABLE":"after-delay","INTERNAL_ERROR":"safe","FIRST_LIGHT_COMMAND_NOT_RECEIVED":"safe","FIRST_LIGHT_PREVIOUS_COMMAND_UNRESOLVED":"never","FEATURE_CREDENTIALS_REJECTED":"after-correction","FEATURE_PERMISSION_DENIED":"after-correction"}},"features.check":{"desc":"Verify the saved provider connection. Success means verified; rejected credentials and missing permission are declared action failures.","result":{"schema":{"verified":{"type":"boolean","enum":[true]}},"maxBytes":64,"classification":"private"},"input":{"appId":"string","kind":"string","expectedRevision":"number"},"policy":{"authorization":"app.manager","audit":"app","cost":"none","reversibility":"compensating","recovery":"reconcile"},"problems":{"AUTHENTICATION_REQUIRED":"after-sign-in","ACCESS_DENIED":"never","BAD_REQUEST":"after-correction","NOT_FOUND":"after-refresh","CONFLICT":"after-refresh","RATE_LIMITED":"after-delay","EMAIL_DELIVERY_OUTCOME_UNCERTAIN":"never","UPSTREAM_UNAVAILABLE":"after-delay","SERVICE_UNAVAILABLE":"after-delay","INTERNAL_ERROR":"safe","FIRST_LIGHT_COMMAND_NOT_RECEIVED":"safe","FIRST_LIGHT_PREVIOUS_COMMAND_UNRESOLVED":"never","FEATURE_CREDENTIALS_REJECTED":"after-correction","FEATURE_PERMISSION_DENIED":"after-correction"}}}},"first-light.referrals":{"desc":"Lets a signed-out visitor ask First Light to build them a website. The visitor gives an email address and a description of their business and passes a challenge; First Light builds the site at its own expense and emails the address a link, and the site becomes theirs when they open it. Mount the challenge ELEMENT inside the form, then run the `referral.request` action with the email, the description and the token the element reported. The form shows only once the element reports it ready, so a deployment that has not opened referrals shows nothing new.","target":"browser","outputs":{"element":{"desc":"The challenge that proves a visitor is a person. MOUNT IT ON AN EMPTY `div` INSIDE THE FORM: it stays empty unless the visitor must interact, and then shows the challenge there. It needs no params besides its handlers. Keep the form hidden (rendered, but not shown) until onReady: a deployment that has not opened referrals never reports it, so its page stays exactly as it was, and the form never shows a control that cannot work yet. onToken reports `challenge.token`, which the form sends as the action's `turnstile` input; keep the submit control disabled until a token is held. onExpired reports an empty `challenge.token`: the held token is spent or stale, so clear it; a new one follows through onToken on its own, including after every request. onUnavailable means referrals are closed here or the challenge could not load: keep the form hidden and let the page's other way in stand alone.","default":"referral_challenge","params":{"onReady":{"type":"actions","binds":["challenge"],"desc":"The declarative actions dispatched once when the challenge is running and the form can be shown."},"onToken":{"type":"actions","binds":["challenge"],"desc":"The declarative actions dispatched with challenge.token when a token is ready."},"onExpired":{"type":"actions","binds":["challenge"],"desc":"The declarative actions dispatched with an empty challenge.token when the held token can no longer be used."},"onUnavailable":{"type":"actions","binds":["challenge"],"desc":"The declarative actions dispatched once when referrals are closed or the challenge cannot load."}}}},"actions":{"referral.request":{"desc":"Ask First Light to build a website for this email address from this description. It answers `status`: `sent` when a link is on its way to the address (also when one was already sent, or when the address asked not to be emailed), or `sign-in` when the address already has its website and should sign in instead. The description is at most 2,000 characters.","policy":{"authorization":"referral.visitor","audit":"app","cost":"none","recovery":"retry-idempotent","reversibility":"compensating"},"input":{"email":"string","prompt":"string","turnstile":"string"},"result":{"schema":{"status":"string"},"maxBytes":128,"classification":"private"},"problems":{"BAD_REQUEST":"after-correction","CAPTCHA_REFUSED":"after-correction","RATE_LIMITED":"after-delay","SERVICE_UNAVAILABLE":"after-delay"}}}},"first-light.templates":{"desc":"Publishes an entitled creator's app as a reusable template at an explicit monthly site price, or removes its listing. Publication snapshots the exact current authored head into an immutable version and advances the app's stable listing; apps already created from it never change.","target":"browser","actions":{"template.publish":{"desc":"Publish this app's exact current authored head as its reusable template, using the same source snapshot as app publication without requiring the app to be a paid/public site. Publishing advances the stable template to a new immutable version; existing derived apps do not change. `publicationPriceCents` is the positive whole-cent publication price inherited by new apps. Optional `promptMaterial` is freeform creator guidance (up to 16000 characters), including questions to resolve before building. New apps retain this version’s guidance.","input":{"appId":"string","publicationPriceCents":"number","promptMaterial":"string?"},"policy":{"authorization":"app.manager.templates","audit":"app","cost":"none","reversibility":"compensating","recovery":"reconcile"},"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_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","reversibility":"compensating","recovery":"reconcile"},"problems":{"AUTHENTICATION_REQUIRED":"after-sign-in","ACCESS_DENIED":"never","BAD_REQUEST":"after-correction","NOT_FOUND":"after-refresh","CONFLICT":"after-refresh","RATE_LIMITED":"after-delay","EMAIL_DELIVERY_OUTCOME_UNCERTAIN":"never","UPSTREAM_UNAVAILABLE":"after-delay","SERVICE_UNAVAILABLE":"after-delay","INTERNAL_ERROR":"safe","FIRST_LIGHT_COMMAND_NOT_RECEIVED":"safe","FIRST_LIGHT_PREVIOUS_COMMAND_UNRESOLVED":"never"}},"ownership.accept":{"input":{"appId":"string","code":"string"},"policy":{"authorization":"account.self.recent","audit":"app","cost":"none","reversibility":"irreversible","recovery":"reconcile"},"problems":{"AUTHENTICATION_REQUIRED":"after-sign-in","ACCESS_DENIED":"never","BAD_REQUEST":"after-correction","NOT_FOUND":"after-refresh","CONFLICT":"after-refresh","RATE_LIMITED":"after-delay","EMAIL_DELIVERY_OUTCOME_UNCERTAIN":"never","UPSTREAM_UNAVAILABLE":"after-delay","SERVICE_UNAVAILABLE":"after-delay","INTERNAL_ERROR":"safe","FIRST_LIGHT_COMMAND_NOT_RECEIVED":"safe","FIRST_LIGHT_PREVIOUS_COMMAND_UNRESOLVED":"never"}}}},"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":"both","host":{"inputs":{"workspaceMediaBrowserTransport":{"target":"browser","required":true,"desc":"The provider-owned lazy browser media transport loader; Worker SSR retains only this contract and imports no browser WebSocket graph."},"firstLightReadModels":{"desc":"SourceRead-owned, exact owner query/get models keyed by this pack's provider name.","target":"server","executionTargets":["source-read"],"required":true}}},"outputs":{"assets":{"default":"media","desc":"Public asset upload and server-owned URL import for the selected child app.","asset":{"desc":"Content-addressed public builder assets — images, and the web font files an app serves as its own typeface; successful operations also register one canonical catalog row and answer it, so a binding that reconciles the app media catalog shows the upload without a live stream.","maxBytes":26214400,"operations":["upload","uploadUrl","remove"],"resultProjection":{"target":"data","as":"row"},"params":{"appId":{"type":"string","desc":"Child app addressed by this operation; the server independently authorizes it.","required":true}},"accept":["image/png","image/jpeg","image/webp","image/gif","font/woff2","font/woff","font/ttf","font/otf"]}},"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,"maxRows":500,"collections":{"appMedia":{"desc":"Media metadata rows selected by appId and shared by every verified app member.","ops":["query","update","remove"],"queryFields":[],"params":["appId"],"requiredParams":["appId"],"inputs":{"update":["name","description","alt"]},"anonymous":[],"read":"principal","enforcedBy":{"update":"the verified app-member authority at the tenant media actor","remove":"the verified app-member authority at the tenant media actor"},"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."},"kind":{"type":"string","desc":"Media category derived from the validated content type: image or font."},"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","clone"],"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}}},"binding":{"sharing":"shareable","authorityIdentity":true}}},"targetPolicy":"fixed"}},"executions":[],"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,"maxRows":500,"collections":{"appMedia":{"desc":"Media metadata rows selected by appId and shared by every verified app member.","ops":["query","update","remove"],"queryFields":[],"params":["appId"],"requiredParams":["appId"],"inputs":{"update":["name","description","alt"]},"anonymous":[],"read":"principal","enforcedBy":{"update":"the verified app-member authority at the tenant media actor","remove":"the verified app-member authority at the tenant media actor"},"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."},"kind":{"type":"string","desc":"Media category derived from the validated content type: image or font."},"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","clone"],"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":500,"maxBytes":4194304,"classification":"private"},"stream":{"semantics":"snapshot","recovery":"snapshot"},"authority":{"mode":"lease"},"id":"source:afa4b26ca9fe54f2"}}},"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."},"CAPTCHA_REFUSED":{"error":"We couldn’t confirm you’re a person.","messageKey":"referral.challenge-refused","retry":"after-correction","action":"correct-input","next":"Wait a moment for the check to finish, then try again."},"EMAIL_DELIVERY_OUTCOME_UNCERTAIN":{"error":"We couldn’t confirm a security receipt’s delivery.","messageKey":"ownership.receipt-uncertain","retry":"never","action":"contact-support","next":"Contact support to inspect delivery evidence before sending a replacement. The ownership decision is preserved."},"FEATURE_CREDENTIALS_REJECTED":{"error":"The provider did not accept this key.","messageKey":"feature.credentials-rejected","retry":"after-correction","action":"correct-input","next":"Change the saved settings and try again."},"FEATURE_PERMISSION_DENIED":{"error":"This key does not grant the required access.","messageKey":"feature.permission-denied","retry":"after-correction","action":"correct-input","next":"Update the key’s permissions or change the saved settings, then try again."},"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_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},"PUBLICATION_SUBSCRIPTION_REQUIRED":{"error":"This site needs a subscription before it can go live.","messageKey":"publication.subscription-required","retry":"after-correction","action":"correct-input","next":"Buy this site’s monthly subscription, then publish.","money":"Nothing has been charged for this site yet."},"SOURCE_AUTHORITY_DENIED":{"error":"We can’t open that.","messageKey":"source.refused","retry":"never","action":"none","next":"It may not exist, or it isn’t shared with you. Go back and choose another."},"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:973334d68b4071a4"}},{"schema":"singularity.port-pack.v1","namespace":"platform.auth","version":"1.0.0","runtime":"1","contractAddress":"5c292e4a333bb720","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"}},"inputs":{"browserAuthorityProvider":{"target":"browser","required":true,"desc":"The document-scoped First Light session authority provider, shared by protected transport and optional auth UI."}}},"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."}}}},"executions":[],"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:20c3054bb6cd099d","rootId":"world:e6bb9228b851d812","contractId":"world-contract:a4cb3d5d85780f3b","provenanceId":"world-provenance:94b0847baf3eb0f9","corpusId":"world-corpus:153214fd948fc83f","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:bf4398c36d23a999"},{"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":"8842a9e155bfbbcb"},"teachings":[{"id":"teaching:first-light-actor/facts","group":"product"}],"examples":[],"contentAddress":"491a5695f3620ec7","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":"5c292e4a333bb720"},"teachings":[{"id":"teaching:platform.auth/account-identity","group":"provider"}],"examples":[],"contentAddress":"18bfe9fbe1a82945","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":"f207d4d3bbed4a41"},"teachings":[{"id":"teaching:tenant-media/image-delivery","group":"provider"}],"examples":[],"contentAddress":"8bde2e4dbd7d39c3","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":"290ed7f37fabab85"},"teachings":[{"id":"teaching:first-light/control-plane","group":"provider"}],"examples":[],"contentAddress":"70432f715c8259bf","provenance":{"source":"First Light provider authoring distribution","review":"First Light distribution review — provider-owned authoring judgment separated from runtime contracts"}}]},"semanticConfig":{},"id":"contribution:7abeb3e89e2925ee"},{"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":[],"features":[],"capabilities":[],"models":[],"agents":[],"authoring":[]},"semanticConfig":{},"id":"contribution:045a45458782495b"}],"contracts":{"worldId":"world:e6bb9228b851d812","id":"world-contract:a4cb3d5d85780f3b"},"provenance":{"worldId":"world:e6bb9228b851d812","id":"world-provenance:94b0847baf3eb0f9"},"authoring":{"worldId":"world:e6bb9228b851d812","id":"world-corpus:153214fd948fc83f"},"browserArtifactRequirements":[{"axis":"behaviors","namespace":"singularity.behaviors","version":"1.0.0","address":"01c532872479f7f9","delivery":"embedded"},{"axis":"components","namespace":"lucide","version":"1.24.0","address":"1ac3bc1e4255d578","delivery":"module"},{"axis":"policy","namespace":"first-light-actor","version":"1.0.0","address":"8842a9e155bfbbcb","delivery":"module"},{"axis":"ports","namespace":"first-light-reads","version":"1.0.0","address":"8ae2ddeda978f623","delivery":"module"},{"axis":"ports","namespace":"first-light","version":"1.0.0","address":"290ed7f37fabab85","delivery":"module"},{"axis":"ports","namespace":"platform.auth","version":"1.0.0","address":"5c292e4a333bb720","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":"997e75c131c59707","delivery":"embedded"},{"axis":"vocabulary","namespace":"tenant-media","version":"1.0.0","address":"f207d4d3bbed4a41","delivery":"module"}]}