:: :::: /sur/hall/hoon :: |% :: ::TODO use different words for different kinds of burdens ::TODO rename det/delta in most place? they may be (different kinds of) deltas, :: but location in control flow already indicates delta-ness. :: :> # :> # %wrappers :> # :> wrapper molds, for semantic clarity. +| :: ::TODO rename ++ name term :< circle name ++ nick cord :< local nickname :: :> # :> # %query-models :> # :> models relating to queries, their results and updates. +| :: ++ query :> query paths $% {$client $~} :< shared ui state {$circles who/ship} :< readable circles {$public $~} :< public memberships {$burden who/ship} ::TODO eventually, nom/name. :< duties to share {$report $~} :< duty reports {$peers nom/name} :< readers of story $: $circle :> story query nom/name :< circle name wer/(unit circle) :< from source wat/(set circle-data) :< data to get ran/range :< query duration == :: ::TODO in the future, we may want much more :: :: detailed querying abilities. :: == :: ++ circle-data :> kinds of circle data $? $grams :< messages $group-l :< local presence $group-r :< remote presences $config-l :< local config $config-r :< remote configs == :: ++ range :> inclusive msg range %- unit :< ~ means everything $: hed/place :< start of range tal/(unit place) :< opt end of range == :: ++ place :> range indicators $% {$da @da} :< date {$ud @ud} :< message number == :: ++ prize :> query result $% {$client prize-client} :< /client {$circles cis/(set name)} :< /circles {$public cis/(set circle)} :< /public {$burden sos/(map name burden)} :< /burden {$report $~} :< /report {$peers pes/(jar ship query)} :< /peers {$circle package} :< /circle == :: ++ prize-client :> shared ui state $: gys/(jug char audience) :< glyph bindings nis/(map ship nick) :< local nicknames == :: ++ rumor :> query result change $% {$client rum/rumor-client} :< /client {$circles add/? cir/name} :< /circles {$public add/? cir/circle} :< /public {$burden nom/name rum/rumor-story} :< /burden {$peers add/? who/ship qer/query} :< /peers {$circle rum/rumor-story} :< /circle == :: ++ rumor-client :> changed ui state $% {$glyph diff-glyph} :< un/bound glyph {$nick diff-nick} :< changed nickname == :: ++ shipment :> standard payload $: cos/lobby :< loc & rem configs pes/crowd :< loc & rem presences == :: ++ burden :> full story state $: gaz/(list telegram) :< all messages shipment :< metadata == :: ++ package :> story state $: nes/(list envelope) :< messages shipment :< metadata == :: ++ diff-glyph {bin/? gyf/char aud/audience} :< un/bound glyph ++ diff-nick {who/ship nic/nick} :< changed nickname ++ diff-story :> story change $% {$new cof/config} :< new story {$bear bur/burden} :< new inherited story {$peer add/? who/ship qer/query} :< gain/lose subscriber {$config cir/circle dif/diff-config} :< new/changed config {$status cir/circle who/ship dif/diff-status} :< new/changed status {$remove $~} :< removed story == :: ++ rumor-story :> story rumor $% {$gram src/circle nev/envelope} :< new/changed message diff-story :< both in & outward == :: ++ diff-config :> config change $% {$full cof/config} :< set w/o side-effects {$source add/? src/source} :< add/rem sources {$caption cap/cord} :< changed description {$filter fit/filter} :< changed filter {$secure sec/security} :< changed security {$permit add/? sis/(set ship)} :< add/rem to b/w-list {$remove $~} :< removed config == :: ++ diff-status :> status change $% {$full sat/status} :< fully changed status {$presence pec/presence} :< changed presence {$human dif/diff-human} :< changed name {$remove $~} :< removed status == :: ++ diff-human :> name change $% {$full man/human} :< fully changed name {$handle han/(unit cord)} :< changed handle {$true tru/(unit truename)} :< changed true name == :: :: :> # :> # %client-communication :> # :> hall interfaces for clients. +| :: ++ action :> user action $% :: circle configuration :: {$create nom/name des/cord sec/security} :< create circle {$delete nom/name why/(unit cord)} :< delete + announce {$depict nom/name des/cord} :< change description {$filter nom/name fit/filter} :< change message rules {$permit nom/name inv/? sis/(set ship)} :< invite/banish {$source nom/name sub/? srs/(set source)} :< un/sub to/from src :: messaging :: {$convey tos/(list thought)} :< post exact {$phrase aud/audience ses/(list speech)} :< post easy :: personal metadata :: {$notify aud/audience pes/(unit presence)} :< our presence update {$naming aud/audience man/human} :< our name update :: changing shared ui :: {$glyph gyf/char aud/audience bin/?} :< un/bind a glyph {$nick who/ship nic/nick} :< new identity :: misc changes :: {$public add/? cir/circle} :< show/hide membership == :: :: :> # :> # %hall-communication :> # :> structures for communicating between halls. +| :: ++ command :> effect on story $% {$publish tos/(list thought)} :< deliver {$present nos/(set name) dif/diff-status} :< status update {$bearing $~} :< prompt to listen == :: :: :> # :> # %circles :> # :> messaging targets and their metadata. +| :: ++ circle {hos/ship nom/name} :< native target :: circle configurations. :: ++ lobby {loc/config rem/(map circle config)} :< our & srcs configs ++ config :> circle config $: src/(set source) :< active sources cap/cord :< description fit/filter :< message rules con/control :< restrictions == :: ++ source {cir/circle ran/range} :< subscription target ++ filter :> content filters $: cas/? :< dis/allow capitals utf/? :< dis/allow non-ascii ::TODO maybe message length == :: ++ control {sec/security sis/(set ship)} :< access control ++ security :> security mode $? $channel :< blacklist $village :< whitelist $journal :< pub r, whitelist w $mailbox :< our r, blacklist w == :: :: participant metadata. :: ++ crowd {loc/group rem/(map circle group)} :< our & srcs presences ++ group (map ship status) :< presence map ++ status {pec/presence man/human} :< participant ++ presence :> status type $? $gone :< absent $idle :< idle $hear :< present $talk :< typing == :: ++ human :> human identifier $: han/(unit cord) :< handle tru/(unit truename) :< true name == :: ++ truename {fir/cord mid/(unit cord) las/cord} :< real-life name :: :> # :> # %message-data :> # :> structures for containing main message data. +| :: ::TODO some structure for extra message state :: local (to clients): delivery state, read flags :: remote (to halls): sequence nr ++ envelope {num/@ud gam/telegram} :< outward message ++ telegram {aut/ship thought} :< whose message ++ thought :> inner message $: uid/serial :< unique identifier aud/audience :< destinations wen/@da :< timestamp sep/speech :< content == :: ++ speech :> content body $% {$lin pat/? msg/cord} :< no/@ text line {$url url/purf:eyre} :< parsed url {$exp exp/cord res/(list tank)} :< hoon line {$ire top/serial sep/speech} :< in reply to {$fat tac/attache sep/speech} :< attachment {$app app/term sep/speech} :< app message {$inv inv/? cir/circle} :< inv/ban for circle == :: ++ attache :> attachment $% {$name nom/cord tac/attache} :< named attachment {$text (list cord)} :< text lines {$tank (list tank)} :< tank list == :: :: :> # :> # %message-metadata :> # :> structures for containing message metadata. +| :: ++ serial @uvH :< unique identifier ++ audience (set circle) :< destinations ++ tracking (map circle delivery) :> delivery per target ++ delivery :> delivery state $? $pending :< undelivered $accepted :< received $rejected :< denied == :: --