ordinary_owned_event_family_reader_query.bend
bendvy-ecs-core@0.1.0.1 · 99 lines · 0 definitions
1import Base
2import bendvy-ecs-core@0.1.0.1/change_tick.bend as Tick
3import bendvy-ecs-core@0.1.0.1/ordinary_event_declaration.bend as Event
4import bendvy-ecs-core@0.1.0.1/ordinary_schema.bend as Schema
5import bendvy-ecs-core@0.1.0.1/ordinary_app_event_family_runtime.bend as App
6import bendvy-ecs-core@0.1.0.1/ordinary_app_event_family_reader.bend as AppReader
7import bendvy-ecs-core@0.1.0.1/ordinary_app_registration_fields.bend as Records
8import bendvy-ecs-core@0.1.0.1/ordinary_app_observation_data.bend as DTO
9import bendvy-ecs-core@0.1.0.1/ordinary_app_recipe.bend as Tree
10import bendvy-ecs-core@0.1.0.1/ordinary_app_records.bend as Leaf
11
12import bendvy-ecs-core@0.1.0.1/execution_context.bend as Ctx
13import bendvy-ecs-core@0.1.0.1/trace_facts.bend as TraceFacts
14import bendvy-ecs-core@0.1.0.1/owned_event_family_maintenance.bend as Maintenance
15import bendvy-ecs-core@0.1.0.1/owned_event_family_catalog.bend as Catalog
16import bendvy-ecs-core@0.1.0.1/owned_event_family_lifecycle.bend as Life
17import bendvy-ecs-core@0.1.0.1/world.bend as W
18import bendvy-ecs-core@0.1.0.1/system.bend as Sys
19import bendvy-ecs-core@0.1.0.1/transaction.bend as T
20import bendvy-ecs-core@0.1.0.1/capabilities.bend as Cap
21import bendvy-ecs-core@0.1.0.1/owner_product.bend as Product
22import bendvy-ecs-core@0.1.0.1/owned_event_log.bend as Log
23import bendvy-ecs-core@0.1.0.1/ordinary_owned_event.bend as Pub
24import bendvy-ecs-core@0.1.0.1/ordinary_owned_event_family_reader_binding.bend as Setup
25import bendvy-ecs-core@0.1.0.1/owned_event_family_reader_query.bend as Core
26import bendvy-ecs-core@0.1.0.1/event_runtime.bend as Ev
27import bendvy-ecs-core@0.1.0.1/event_stream.bend as Stream
28import bendvy-ecs-core@0.1.0.1/event_family_runtime.bend as FR
29import bendvy-ecs-core@0.1.0.1/event_family_routing.bend as Route
30# Public setup carries the coupled log route and operational stream selection.
31# All callbacks below are erased indices derived by its canonical constructors.
32import bendvy-ecs-core@0.1.0.1/ordinary_query_declaration.bend as Decl
33import bendvy-ecs-core@0.1.0.1/compose.bend as Q
34# Register an owned-event reader joined to a retained ordinary query declaration.
35# Access metadata includes event read and query clauses; registration does not run
36# projection/body. Failure returns actual runtime. Payload lookup remains scoped
37# through at:P -> Request -> P & Projection, not a grant to extract P from its log.
38def register(~S:Data,~C:Type,~R:Type,~P:Type,~Rest:Type,~E:Data,~Domains:Data,~F:Type,~path:Product.Lens<R,Log.Log<P>,Rest>,~inject:Nat -> E,~select:List<&2,E> -> List<&2,Nat>,~identity:Pub.Domain<S,P>,~make:Domains -> Nat -> F,~sync:F -> Nat -> List<&2,E> -> F,~frame:F -> Nat -> F,~retain:F -> Nat -> List<&2,E> -> F & List<&2,E>,~inventory:F -> F & List<&2,String>,~take:F -> F & Stream.Stream<S,Nat>,~put:F -> Stream.Stream<S,Nat> -> F,~descriptor:Setup.Setup<S,R,P,Rest,E,Domains,F,path,inject,select,identity,make,sync,frame,retain,inventory,take,put>,~Owners:Type,~Request:Type,~Projection:Data,~Args:Type,~Observation:Type,~U:Data,~Out:Data,~Ops:Type -> Type,~at:P -> Request -> P & Projection,~project:@-H:Type -> @-read:Cap.Request<H,Request,Projection> -> H -> Args -> H & Core.Projected<Args,Observation,U>,~query:Decl.Declaration<S,Q.Frame<S,C,R,E>,Ops(Q.Frame<S,C,R,E>)>,~body:@-H:Type -> @-caps:Ops(H) -> Observation -> Args -> H -> H & (Observation & (Args & (T.Outcome<U> & Out))),runtime:Route.Runtime<S,C,R,E,FR.State<E,F,Owners>>,name:String) -> Route.Registration<S,C,R,E,Nat,FR.State<E,F,Owners>,Args & Maybe<&2,Tick.Tick>,Unit,Core.Reply<Args,Observation,U,Out>,FR.take(~S,~Nat,~E,~F,~Owners,~take),FR.put(~S,~Nat,~E,~F,~Owners,~put),Core.runner(~S,~C,~R,~P,~Rest,~E,~path,~Request,~Projection,~Args,~Observation,~U,~Out,~Ops,~at,~project,~query,~body)>:
39 Core.register(~S,~C,~R,~P,~Rest,~E,~path,~Request,~Projection,~Args,~Observation,~U,~Out,~Ops,~at,~project,~query,~body,~FR.State<E,F,Owners>,~FR.take(~S,~Nat,~E,~F,~Owners,~take),~FR.put(~S,~Nat,~E,~F,~Owners,~put),runtime,name)
40# Advanced run using an already observed registry/cursor pair. Pass that cursor
41# into query lifecycle filtering and retain the run owner/completion contract below;
42# the supplied pair is trusted to come from the matching actual registration.
43def run_observed(~S:Data,~C:Type,~R:Type,~P:Type,~Rest:Type,~E:Data,~Domains:Data,~F:Type,~path:Product.Lens<R,Log.Log<P>,Rest>,~inject:Nat -> E,~select:List<&2,E> -> List<&2,Nat>,~identity:Pub.Domain<S,P>,~make:Domains -> Nat -> F,~sync:F -> Nat -> List<&2,E> -> F,~frame:F -> Nat -> F,~retain:F -> Nat -> List<&2,E> -> F & List<&2,E>,~inventory:F -> F & List<&2,String>,~take:F -> F & Stream.Stream<S,Nat>,~put:F -> Stream.Stream<S,Nat> -> F,~descriptor:Setup.Setup<S,R,P,Rest,E,Domains,F,path,inject,select,identity,make,sync,frame,retain,inventory,take,put>,~Owners:Type,~Request:Type,~Projection:Data,~Args:Type,~Observation:Type,~U:Data,~Out:Data,~Ops:Type -> Type,~at:P -> Request -> P & Projection,~project:@-H:Type -> @-read:Cap.Request<H,Request,Projection> -> H -> Args -> H & Core.Projected<Args,Observation,U>,~query:Decl.Declaration<S,Q.Frame<S,C,R,E>,Ops(Q.Frame<S,C,R,E>)>,~body:@-H:Type -> @-caps:Ops(H) -> Observation -> Args -> H -> H & (Observation & (Args & (T.Outcome<U> & Out))),runtime:Route.Runtime<S,C,R,E,FR.State<E,F,Owners>>,reader:Route.Reader<S,Nat,FR.State<E,F,Owners>,FR.take(~S,~Nat,~E,~F,~Owners,~take),FR.put(~S,~Nat,~E,~F,~Owners,~put)>,args:Args,observed:Sys.Registry<S,C,R,E,Ev.Input<Nat,Args & Maybe<&2,Tick.Tick>>,Unit,Core.Reply<Args,Observation,U,Out>,Core.runner(~S,~C,~R,~P,~Rest,~E,~path,~Request,~Projection,~Args,~Observation,~U,~Out,~Ops,~at,~project,~query,~body)> & Maybe<&2,Tick.Tick>) -> Route.RunResult<S,C,R,E,Nat,FR.State<E,F,Owners>,Args & Maybe<&2,Tick.Tick>,Unit,Core.Reply<Args,Observation,U,Out>,FR.take(~S,~Nat,~E,~F,~Owners,~take),FR.put(~S,~Nat,~E,~F,~Owners,~put),Core.runner(~S,~C,~R,~P,~Rest,~E,~path,~Request,~Projection,~Args,~Observation,~U,~Out,~Ops,~at,~project,~query,~body)>:
44 match observed:
45 case (registry,cursor):Core.run(~S,~C,~R,~P,~Rest,~E,~path,~Request,~Projection,~Args,~Observation,~U,~Out,~Ops,~at,~project,~query,~body,~FR.State<E,F,Owners>,~FR.take(~S,~Nat,~E,~F,~Owners,~take),~FR.put(~S,~Nat,~E,~F,~Owners,~put),~FR.synchronize(~S,~C,~R,~E,~F,~Owners,~sync),runtime,reader,registry,(args,cursor))
46# Resolve unread payload keys in order, project each through the confined request,
47# restore its log owner, then traverse current live query handles with declared
48# query caps. All event/row ECS writes share one transaction. Args and returned
49# Observation owners remain in Reply; failure clears Data outputs and rolls back
50# recorded ECS edits, not arbitrary mutations made by trusted projectors.
51# Uses registry cursor for lifecycle selection; success advances it to World tick.
52# Semantic Reply failure preserves unread stream position under failed-reader rules;
53# transport Succeeded alone is not semantic success. lagged records retention loss.
54def run(~S:Data,~C:Type,~R:Type,~P:Type,~Rest:Type,~E:Data,~Domains:Data,~F:Type,~path:Product.Lens<R,Log.Log<P>,Rest>,~inject:Nat -> E,~select:List<&2,E> -> List<&2,Nat>,~identity:Pub.Domain<S,P>,~make:Domains -> Nat -> F,~sync:F -> Nat -> List<&2,E> -> F,~frame:F -> Nat -> F,~retain:F -> Nat -> List<&2,E> -> F & List<&2,E>,~inventory:F -> F & List<&2,String>,~take:F -> F & Stream.Stream<S,Nat>,~put:F -> Stream.Stream<S,Nat> -> F,~descriptor:Setup.Setup<S,R,P,Rest,E,Domains,F,path,inject,select,identity,make,sync,frame,retain,inventory,take,put>,~Owners:Type,~Request:Type,~Projection:Data,~Args:Type,~Observation:Type,~U:Data,~Out:Data,~Ops:Type -> Type,~at:P -> Request -> P & Projection,~project:@-H:Type -> @-read:Cap.Request<H,Request,Projection> -> H -> Args -> H & Core.Projected<Args,Observation,U>,~query:Decl.Declaration<S,Q.Frame<S,C,R,E>,Ops(Q.Frame<S,C,R,E>)>,~body:@-H:Type -> @-caps:Ops(H) -> Observation -> Args -> H -> H & (Observation & (Args & (T.Outcome<U> & Out))),runtime:Route.Runtime<S,C,R,E,FR.State<E,F,Owners>>,reader:Route.Reader<S,Nat,FR.State<E,F,Owners>,FR.take(~S,~Nat,~E,~F,~Owners,~take),FR.put(~S,~Nat,~E,~F,~Owners,~put)>,registry:Sys.Registry<S,C,R,E,Ev.Input<Nat,Args & Maybe<&2,Tick.Tick>>,Unit,Core.Reply<Args,Observation,U,Out>,Core.runner(~S,~C,~R,~P,~Rest,~E,~path,~Request,~Projection,~Args,~Observation,~U,~Out,~Ops,~at,~project,~query,~body)>,args:Args) -> Route.RunResult<S,C,R,E,Nat,FR.State<E,F,Owners>,Args & Maybe<&2,Tick.Tick>,Unit,Core.Reply<Args,Observation,U,Out>,FR.take(~S,~Nat,~E,~F,~Owners,~take),FR.put(~S,~Nat,~E,~F,~Owners,~put),Core.runner(~S,~C,~R,~P,~Rest,~E,~path,~Request,~Projection,~Args,~Observation,~U,~Out,~Ops,~at,~project,~query,~body)>:
55 run_observed(~S,~C,~R,~P,~Rest,~E,~Domains,~F,~path,~inject,~select,~identity,~make,~sync,~frame,~retain,~inventory,~take,~put,~descriptor,~Owners,~Request,~Projection,~Args,~Observation,~U,~Out,~Ops,~at,~project,~query,~body,runtime,reader,args,Sys.cursor(~S,~C,~R,~E,~Ev.Input<Nat,Args & Maybe<&2,Tick.Tick>>,~Unit,~Core.Reply<Args,Observation,U,Out>,~Core.runner(~S,~C,~R,~P,~Rest,~E,~path,~Request,~Projection,~Args,~Observation,~U,~Out,~Ops,~at,~project,~query,~body),registry))
56
57# Advanced trace-aware counterpart of run_observed using its supplied registry
58# cursor. Return actual runtime/reader/registry, semantic completion and fact state;
59# trace collection does not replace semantic success or acknowledge failed work.
60def run_trace_cursor(~S:Data,~C:Type,~R:Type,~P:Type,~Rest:Type,~E:Data,~Domains:Data,~F:Type,~path:Product.Lens<R,Log.Log<P>,Rest>,~inject:Nat -> E,~select:List<&2,E> -> List<&2,Nat>,~identity:Pub.Domain<S,P>,~make:Domains -> Nat -> F,~sync:F -> Nat -> List<&2,E> -> F,~frame:F -> Nat -> F,~retain:F -> Nat -> List<&2,E> -> F & List<&2,E>,~inventory:F -> F & List<&2,String>,~take:F -> F & Stream.Stream<S,Nat>,~put:F -> Stream.Stream<S,Nat> -> F,~descriptor:Setup.Setup<S,R,P,Rest,E,Domains,F,path,inject,select,identity,make,sync,frame,retain,inventory,take,put>,~Owners:Type,~Request:Type,~Projection:Data,~Args:Type,~Observation:Type,~U:Data,~Out:Data,~Ops:Type -> Type,~at:P -> Request -> P & Projection,~project:@-H:Type -> @-read:Cap.Request<H,Request,Projection> -> H -> Args -> H & Core.Projected<Args,Observation,U>,~query:Decl.Declaration<S,Q.Frame<S,C,R,E>,Ops(Q.Frame<S,C,R,E>)>,~body:@-H:Type -> @-caps:Ops(H) -> Observation -> Args -> H -> H & (Observation & (Args & (T.Outcome<U> & Out))),runtime:Route.Runtime<S,C,R,E,FR.State<E,F,Owners>>,reader:Route.Reader<S,Nat,FR.State<E,F,Owners>,FR.take(~S,~Nat,~E,~F,~Owners,~take),FR.put(~S,~Nat,~E,~F,~Owners,~put)>,args:Args,trace:TraceFacts.State,observed:Sys.Registry<S,C,R,E,Ev.Input<Nat,Args & Maybe<&2,Tick.Tick>>,Unit,Core.Reply<Args,Observation,U,Out>,Core.runner(~S,~C,~R,~P,~Rest,~E,~path,~Request,~Projection,~Args,~Observation,~U,~Out,~Ops,~at,~project,~query,~body)> & Maybe<&2,Tick.Tick>) -> Route.RunResult<S,C,R,E,Nat,FR.State<E,F,Owners>,Args & Maybe<&2,Tick.Tick>,Unit,Core.Reply<Args,Observation,U,Out>,FR.take(~S,~Nat,~E,~F,~Owners,~take),FR.put(~S,~Nat,~E,~F,~Owners,~put),Core.runner(~S,~C,~R,~P,~Rest,~E,~path,~Request,~Projection,~Args,~Observation,~U,~Out,~Ops,~at,~project,~query,~body)> & TraceFacts.State:
61 match observed:
62 case (registry,cursor):Core.run_traced(~S,~C,~R,~P,~Rest,~E,~path,~Request,~Projection,~Args,~Observation,~U,~Out,~Ops,~at,~project,~query,~body,~FR.State<E,F,Owners>,~FR.take(~S,~Nat,~E,~F,~Owners,~take),~FR.put(~S,~Nat,~E,~F,~Owners,~put),~FR.synchronize(~S,~C,~R,~E,~F,~Owners,~sync),runtime,reader,registry,(args,cursor),trace)
63# Trace-aware run with actual operation facts returned separately. Same query
64# transaction, owner returns and semantic reader advancement; facts may describe
65# attempts that rolled back. Does not perform log retirement or an implicit barrier.
66def run_traced(~S:Data,~C:Type,~R:Type,~P:Type,~Rest:Type,~E:Data,~Domains:Data,~F:Type,~path:Product.Lens<R,Log.Log<P>,Rest>,~inject:Nat -> E,~select:List<&2,E> -> List<&2,Nat>,~identity:Pub.Domain<S,P>,~make:Domains -> Nat -> F,~sync:F -> Nat -> List<&2,E> -> F,~frame:F -> Nat -> F,~retain:F -> Nat -> List<&2,E> -> F & List<&2,E>,~inventory:F -> F & List<&2,String>,~take:F -> F & Stream.Stream<S,Nat>,~put:F -> Stream.Stream<S,Nat> -> F,~descriptor:Setup.Setup<S,R,P,Rest,E,Domains,F,path,inject,select,identity,make,sync,frame,retain,inventory,take,put>,~Owners:Type,~Request:Type,~Projection:Data,~Args:Type,~Observation:Type,~U:Data,~Out:Data,~Ops:Type -> Type,~at:P -> Request -> P & Projection,~project:@-H:Type -> @-read:Cap.Request<H,Request,Projection> -> H -> Args -> H & Core.Projected<Args,Observation,U>,~query:Decl.Declaration<S,Q.Frame<S,C,R,E>,Ops(Q.Frame<S,C,R,E>)>,~body:@-H:Type -> @-caps:Ops(H) -> Observation -> Args -> H -> H & (Observation & (Args & (T.Outcome<U> & Out))),runtime:Route.Runtime<S,C,R,E,FR.State<E,F,Owners>>,reader:Route.Reader<S,Nat,FR.State<E,F,Owners>,FR.take(~S,~Nat,~E,~F,~Owners,~take),FR.put(~S,~Nat,~E,~F,~Owners,~put)>,registry:Sys.Registry<S,C,R,E,Ev.Input<Nat,Args & Maybe<&2,Tick.Tick>>,Unit,Core.Reply<Args,Observation,U,Out>,Core.runner(~S,~C,~R,~P,~Rest,~E,~path,~Request,~Projection,~Args,~Observation,~U,~Out,~Ops,~at,~project,~query,~body)>,args:Args,trace:TraceFacts.State) -> Route.RunResult<S,C,R,E,Nat,FR.State<E,F,Owners>,Args & Maybe<&2,Tick.Tick>,Unit,Core.Reply<Args,Observation,U,Out>,FR.take(~S,~Nat,~E,~F,~Owners,~take),FR.put(~S,~Nat,~E,~F,~Owners,~put),Core.runner(~S,~C,~R,~P,~Rest,~E,~path,~Request,~Projection,~Args,~Observation,~U,~Out,~Ops,~at,~project,~query,~body)> & TraceFacts.State:
67 run_trace_cursor(~S,~C,~R,~P,~Rest,~E,~Domains,~F,~path,~inject,~select,~identity,~make,~sync,~frame,~retain,~inventory,~take,~put,~descriptor,~Owners,~Request,~Projection,~Args,~Observation,~U,~Out,~Ops,~at,~project,~query,~body,runtime,reader,args,trace,Sys.cursor(~S,~C,~R,~E,~Ev.Input<Nat,Args & Maybe<&2,Tick.Tick>>,~Unit,~Core.Reply<Args,Observation,U,Out>,~Core.runner(~S,~C,~R,~P,~Rest,~E,~path,~Request,~Projection,~Args,~Observation,~U,~Out,~Ops,~at,~project,~query,~body),registry))
68
69# Advanced execution-context bridge carrying the existing trace, family state and
70# tick through run_traced. Returned routing result retains actual owners; no new
71# query or payload capability is inferred from the context.
72def run_context(~S:Data,~C:Type,~R:Type,~P:Type,~Rest:Type,~E:Data,~Domains:Data,~F:Type,~path:Product.Lens<R,Log.Log<P>,Rest>,~inject:Nat -> E,~select:List<&2,E> -> List<&2,Nat>,~identity:Pub.Domain<S,P>,~make:Domains -> Nat -> F,~sync:F -> Nat -> List<&2,E> -> F,~frame:F -> Nat -> F,~retain:F -> Nat -> List<&2,E> -> F & List<&2,E>,~inventory:F -> F & List<&2,String>,~take:F -> F & Stream.Stream<S,Nat>,~put:F -> Stream.Stream<S,Nat> -> F,~descriptor:Setup.Setup<S,R,P,Rest,E,Domains,F,path,inject,select,identity,make,sync,frame,retain,inventory,take,put>,~Owners:Type,~Request:Type,~Projection:Data,~Args:Type,~Observation:Type,~U:Data,~Out:Data,~Ops:Type -> Type,~at:P -> Request -> P & Projection,~project:@-H:Type -> @-read:Cap.Request<H,Request,Projection> -> H -> Args -> H & Core.Projected<Args,Observation,U>,~query:Decl.Declaration<S,Q.Frame<S,C,R,E>,Ops(Q.Frame<S,C,R,E>)>,~body:@-H:Type -> @-caps:Ops(H) -> Observation -> Args -> H -> H & (Observation & (Args & (T.Outcome<U> & Out))),context:Ctx.Context<W.World<S,C,R,E>>,family:FR.State<E,F,Owners>,tick:Nat,reader:Route.Reader<S,Nat,FR.State<E,F,Owners>,FR.take(~S,~Nat,~E,~F,~Owners,~take),FR.put(~S,~Nat,~E,~F,~Owners,~put)>,registry:Sys.Registry<S,C,R,E,Ev.Input<Nat,Args & Maybe<&2,Tick.Tick>>,Unit,Core.Reply<Args,Observation,U,Out>,Core.runner(~S,~C,~R,~P,~Rest,~E,~path,~Request,~Projection,~Args,~Observation,~U,~Out,~Ops,~at,~project,~query,~body)>,args:Args) -> Route.ContextRunResult<S,C,R,E,Nat,FR.State<E,F,Owners>,Args & Maybe<&2,Tick.Tick>,Unit,Core.Reply<Args,Observation,U,Out>,FR.take(~S,~Nat,~E,~F,~Owners,~take),FR.put(~S,~Nat,~E,~F,~Owners,~put),Core.runner(~S,~C,~R,~P,~Rest,~E,~path,~Request,~Projection,~Args,~Observation,~U,~Out,~Ops,~at,~project,~query,~body)>:
73 match context:
74 case Ctx.Context{world,trace}:Route.context_returned(~S,~C,~R,~E,~Nat,~FR.State<E,F,Owners>,~(Args & Maybe<&2,Tick.Tick>),~Unit,~Core.Reply<Args,Observation,U,Out>,~FR.take(~S,~Nat,~E,~F,~Owners,~take),~FR.put(~S,~Nat,~E,~F,~Owners,~put),~Core.runner(~S,~C,~R,~P,~Rest,~E,~path,~Request,~Projection,~Args,~Observation,~U,~Out,~Ops,~at,~project,~query,~body),run_trace_cursor(~S,~C,~R,~P,~Rest,~E,~Domains,~F,~path,~inject,~select,~identity,~make,~sync,~frame,~retain,~inventory,~take,~put,~descriptor,~Owners,~Request,~Projection,~Args,~Observation,~U,~Out,~Ops,~at,~project,~query,~body,Route.Runtime{world,family,tick},reader,args,trace,Sys.cursor(~S,~C,~R,~E,~Ev.Input<Nat,Args & Maybe<&2,Tick.Tick>>,~Unit,~Core.Reply<Args,Observation,U,Out>,~Core.runner(~S,~C,~R,~P,~Rest,~E,~path,~Request,~Projection,~Args,~Observation,~U,~Out,~Ops,~at,~project,~query,~body),registry)))
75
76# Advanced metadata projection labeling retained query clauses as component uses
77# for the message source. This formatter does not validate or widen query grants.
78def component_uses(~S:Data,clauses:List<&2,Decl.Clause<S>>) -> List<&2,Records.DeclaredUse>:
79 match clauses:
80 case []:[]
81 case Decl.Clause{key,mode} <> rest:Records.DeclaredUse{Records.ComponentUse{},Records.MessageSource{},key,mode} <> component_uses(~S,rest)
82# Advanced owner-returning App fold combining event-read identity, actual registry
83# metadata and retained query clauses. Declared-use metadata is descriptive; the
84# operational query declaration and scoped request still determine authority.
85def owner_fields(~S:Data,~C:Type,~R:Type,~P:Type,~Rest:Type,~E:Data,~Domains:Data,~F:Type,~path:Product.Lens<R,Log.Log<P>,Rest>,~inject:Nat -> E,~select:List<&2,E> -> List<&2,Nat>,~identity:Pub.Domain<S,P>,~make:Domains -> Nat -> F,~sync:F -> Nat -> List<&2,E> -> F,~frame:F -> Nat -> F,~retain:F -> Nat -> List<&2,E> -> F & List<&2,E>,~inventory:F -> F & List<&2,String>,~take:F -> F & Stream.Stream<S,Nat>,~put:F -> Stream.Stream<S,Nat> -> F,~descriptor:Setup.Setup<S,R,P,Rest,E,Domains,F,path,inject,select,identity,make,sync,frame,retain,inventory,take,put>,~Owners:Type,~Request:Type,~Projection:Data,~Args:Type,~Observation:Type,~U:Data,~Out:Data,~Ops:Type -> Type,~at:P -> Request -> P & Projection,~project:@-H:Type -> @-read:Cap.Request<H,Request,Projection> -> H -> Args -> H & Core.Projected<Args,Observation,U>,~query:Decl.Declaration<S,Q.Frame<S,C,R,E>,Ops(Q.Frame<S,C,R,E>)>,~body:@-H:Type -> @-caps:Ops(H) -> Observation -> Args -> H -> H & (Observation & (Args & (T.Outcome<U> & Out))),owner:AppReader.Owner<S,Nat,Route.Reader<S,Nat,FR.State<E,F,Owners>,FR.take(~S,~Nat,~E,~F,~Owners,~take),FR.put(~S,~Nat,~E,~F,~Owners,~put)>,Sys.Registry<S,C,R,E,Ev.Input<Nat,Args & Maybe<&2,Tick.Tick>>,Unit,Core.Reply<Args,Observation,U,Out>,Core.runner(~S,~C,~R,~P,~Rest,~E,~path,~Request,~Projection,~Args,~Observation,~U,~Out,~Ops,~at,~project,~query,~body)>>) -> AppReader.Owner<S,Nat,Route.Reader<S,Nat,FR.State<E,F,Owners>,FR.take(~S,~Nat,~E,~F,~Owners,~take),FR.put(~S,~Nat,~E,~F,~Owners,~put)>,Sys.Registry<S,C,R,E,Ev.Input<Nat,Args & Maybe<&2,Tick.Tick>>,Unit,Core.Reply<Args,Observation,U,Out>,Core.runner(~S,~C,~R,~P,~Rest,~E,~path,~Request,~Projection,~Args,~Observation,~U,~Out,~Ops,~at,~project,~query,~body)>> & List<&2,Records.Fields<S>>:
86 match owner:
87 case AppReader.Owner{Event.Declaration{Event.Domain{+key},mode},reader,Sys.Registry{+namespace,+id,+name,+access,+cursor}}:(AppReader.Owner{Event.Declaration{Event.Domain{key},mode},reader,Sys.Registry{namespace,id,name,access,cursor}},[Records.Fields{namespace,id,name,access,cursor,key,List.append(&2,Decl.Clause<S>,[Decl.Clause{key,Decl.Read{}}],Decl.clauses(~S,~Q.Frame<S,C,R,E>,~Ops(Q.Frame<S,C,R,E>),query)),Records.MixedKind{Records.DeclaredUse{Records.EventUse{},Records.MessageSource{},key,Decl.Read{}} <> component_uses(~S,Decl.clauses(~S,~Q.Frame<S,C,R,E>,~Ops(Q.Frame<S,C,R,E>),query))}}])
88def app_registered(~S:Data,~C:Type,~R:Type,~P:Type,~Rest:Type,~E:Data,~Domains:Data,~F:Type,~path:Product.Lens<R,Log.Log<P>,Rest>,~inject:Nat -> E,~select:List<&2,E> -> List<&2,Nat>,~identity:Pub.Domain<S,P>,~make:Domains -> Nat -> F,~sync:F -> Nat -> List<&2,E> -> F,~frame:F -> Nat -> F,~retain:F -> Nat -> List<&2,E> -> F & List<&2,E>,~inventory:F -> F & List<&2,String>,~take:F -> F & Stream.Stream<S,Nat>,~put:F -> Stream.Stream<S,Nat> -> F,~descriptor:Setup.Setup<S,R,P,Rest,E,Domains,F,path,inject,select,identity,make,sync,frame,retain,inventory,take,put>,~Owners:Type,~Request:Type,~Projection:Data,~Args:Type,~Observation:Type,~U:Data,~Out:Data,~Ops:Type -> Type,~at:P -> Request -> P & Projection,~project:@-H:Type -> @-read:Cap.Request<H,Request,Projection> -> H -> Args -> H & Core.Projected<Args,Observation,U>,~query:Decl.Declaration<S,Q.Frame<S,C,R,E>,Ops(Q.Frame<S,C,R,E>)>,~body:@-H:Type -> @-caps:Ops(H) -> Observation -> Args -> H -> H & (Observation & (Args & (T.Outcome<U> & Out))),~Previous:Type,~Rows:Data,~prior:W.World<S,C,R,E> -> W.World<S,C,R,E> & DTO.Observation<Rows>,~previousFold:Previous -> Previous & List<&2,Records.Fields<S>>,~Output:Type,done:App.Application<S,C,R,E,FR.State<E,F,Owners>,Previous & AppReader.Owner<S,Nat,Route.Reader<S,Nat,FR.State<E,F,Owners>,FR.take(~S,~Nat,~E,~F,~Owners,~take),FR.put(~S,~Nat,~E,~F,~Owners,~put)>,Sys.Registry<S,C,R,E,Ev.Input<Nat,Args & Maybe<&2,Tick.Tick>>,Unit,Core.Reply<Args,Observation,U,Out>,Core.runner(~S,~C,~R,~P,~Rest,~E,~path,~Request,~Projection,~Args,~Observation,~U,~Out,~Ops,~at,~project,~query,~body)>>,DTO.Product<Rows,Unit>,Tree.observe_pair(~W.World<S,C,R,E>,~Rows,~Unit,~prior,~AppReader.observe(~S,~C,~R,~E)),Leaf.fold_pair(~S,~Previous,~AppReader.Owner<S,Nat,Route.Reader<S,Nat,FR.State<E,F,Owners>,FR.take(~S,~Nat,~E,~F,~Owners,~take),FR.put(~S,~Nat,~E,~F,~Owners,~put)>,Sys.Registry<S,C,R,E,Ev.Input<Nat,Args & Maybe<&2,Tick.Tick>>,Unit,Core.Reply<Args,Observation,U,Out>,Core.runner(~S,~C,~R,~P,~Rest,~E,~path,~Request,~Projection,~Args,~Observation,~U,~Out,~Ops,~at,~project,~query,~body)>>,~previousFold,~owner_fields(~S,~C,~R,~P,~Rest,~E,~Domains,~F,~path,~inject,~select,~identity,~make,~sync,~frame,~retain,~inventory,~take,~put,~descriptor,~Owners,~Request,~Projection,~Args,~Observation,~U,~Out,~Ops,~at,~project,~query,~body))> -> Output,failed:App.Application<S,C,R,E,FR.State<E,F,Owners>,Previous,Rows,prior,previousFold> -> Output,schema:Schema.Schema<S,C,R>,previous:Previous,recipe:Tree.Recipe<W.World<S,C,R,E>,Rows,prior>,debug:Bool,result:Route.Registration<S,C,R,E,Nat,FR.State<E,F,Owners>,Args & Maybe<&2,Tick.Tick>,Unit,Core.Reply<Args,Observation,U,Out>,FR.take(~S,~Nat,~E,~F,~Owners,~take),FR.put(~S,~Nat,~E,~F,~Owners,~put),Core.runner(~S,~C,~R,~P,~Rest,~E,~path,~Request,~Projection,~Args,~Observation,~U,~Out,~Ops,~at,~project,~query,~body)>) -> Output:
89 match result:
90 case Route.RegistrationFailed{runtime}:failed(App.Application{schema,runtime,previous,recipe,debug})
91 case Route.Registered{runtime,reader,registry}:done(App.Application{schema,runtime,(previous,AppReader.Owner{Event.read(~S,~Nat,Setup.domain(~S,~P,identity)),reader,registry}),Tree.Recipe{},debug})
92# Register and append this reader/query owner to the family App. done receives
93# extended owners and combined metadata; failed receives the prior App with actual
94# runtime returned on admission refusal. Observation adds Unit beside prior rows,
95# not automatic payload presentation. Use owned-family maintenance for retirement
96# and owned-event-family-lifecycle.bend for explicit reader lifecycle operations.
97def install(~S:Data,~C:Type,~R:Type,~P:Type,~Rest:Type,~E:Data,~Domains:Data,~F:Type,~path:Product.Lens<R,Log.Log<P>,Rest>,~inject:Nat -> E,~select:List<&2,E> -> List<&2,Nat>,~identity:Pub.Domain<S,P>,~make:Domains -> Nat -> F,~sync:F -> Nat -> List<&2,E> -> F,~frame:F -> Nat -> F,~retain:F -> Nat -> List<&2,E> -> F & List<&2,E>,~inventory:F -> F & List<&2,String>,~take:F -> F & Stream.Stream<S,Nat>,~put:F -> Stream.Stream<S,Nat> -> F,~descriptor:Setup.Setup<S,R,P,Rest,E,Domains,F,path,inject,select,identity,make,sync,frame,retain,inventory,take,put>,~Owners:Type,~Request:Type,~Projection:Data,~Args:Type,~Observation:Type,~U:Data,~Out:Data,~Ops:Type -> Type,~at:P -> Request -> P & Projection,~project:@-H:Type -> @-read:Cap.Request<H,Request,Projection> -> H -> Args -> H & Core.Projected<Args,Observation,U>,~query:Decl.Declaration<S,Q.Frame<S,C,R,E>,Ops(Q.Frame<S,C,R,E>)>,~body:@-H:Type -> @-caps:Ops(H) -> Observation -> Args -> H -> H & (Observation & (Args & (T.Outcome<U> & Out))),~Previous:Type,~Rows:Data,~prior:W.World<S,C,R,E> -> W.World<S,C,R,E> & DTO.Observation<Rows>,~previousFold:Previous -> Previous & List<&2,Records.Fields<S>>,~Output:Type,done:App.Application<S,C,R,E,FR.State<E,F,Owners>,Previous & AppReader.Owner<S,Nat,Route.Reader<S,Nat,FR.State<E,F,Owners>,FR.take(~S,~Nat,~E,~F,~Owners,~take),FR.put(~S,~Nat,~E,~F,~Owners,~put)>,Sys.Registry<S,C,R,E,Ev.Input<Nat,Args & Maybe<&2,Tick.Tick>>,Unit,Core.Reply<Args,Observation,U,Out>,Core.runner(~S,~C,~R,~P,~Rest,~E,~path,~Request,~Projection,~Args,~Observation,~U,~Out,~Ops,~at,~project,~query,~body)>>,DTO.Product<Rows,Unit>,Tree.observe_pair(~W.World<S,C,R,E>,~Rows,~Unit,~prior,~AppReader.observe(~S,~C,~R,~E)),Leaf.fold_pair(~S,~Previous,~AppReader.Owner<S,Nat,Route.Reader<S,Nat,FR.State<E,F,Owners>,FR.take(~S,~Nat,~E,~F,~Owners,~take),FR.put(~S,~Nat,~E,~F,~Owners,~put)>,Sys.Registry<S,C,R,E,Ev.Input<Nat,Args & Maybe<&2,Tick.Tick>>,Unit,Core.Reply<Args,Observation,U,Out>,Core.runner(~S,~C,~R,~P,~Rest,~E,~path,~Request,~Projection,~Args,~Observation,~U,~Out,~Ops,~at,~project,~query,~body)>>,~previousFold,~owner_fields(~S,~C,~R,~P,~Rest,~E,~Domains,~F,~path,~inject,~select,~identity,~make,~sync,~frame,~retain,~inventory,~take,~put,~descriptor,~Owners,~Request,~Projection,~Args,~Observation,~U,~Out,~Ops,~at,~project,~query,~body))> -> Output,failed:App.Application<S,C,R,E,FR.State<E,F,Owners>,Previous,Rows,prior,previousFold> -> Output,value:App.Application<S,C,R,E,FR.State<E,F,Owners>,Previous,Rows,prior,previousFold>,name:String) -> Output:
98 match value:
99 case App.Application{schema,runtime,previous,recipe,debug}:app_registered(~S,~C,~R,~P,~Rest,~E,~Domains,~F,~path,~inject,~select,~identity,~make,~sync,~frame,~retain,~inventory,~take,~put,~descriptor,~Owners,~Request,~Projection,~Args,~Observation,~U,~Out,~Ops,~at,~project,~query,~body,~Previous,~Rows,~prior,~previousFold,~Output,done,failed,schema,previous,recipe,debug,register(~S,~C,~R,~P,~Rest,~E,~Domains,~F,~path,~inject,~select,~identity,~make,~sync,~frame,~retain,~inventory,~take,~put,~descriptor,~Owners,~Request,~Projection,~Args,~Observation,~U,~Out,~Ops,~at,~project,~query,~body,runtime,name))