diff --git a/zod/seax/app/seax.hoon b/zod/seax/app/seax.hoon index 707802f..71acb0f 100644 --- a/zod/seax/app/seax.hoon +++ b/zod/seax/app/seax.hoon @@ -1,6 +1,6 @@ /- *seax -/+ dbug, engines, rank, sink - +/- diary +/+ dbug, engines, rank, sink, strandio |% +$ query cord +$ search-state @@ -10,6 +10,7 @@ $: == +$ state-0 $: + notes=shelf:diary search-subscriptions=(map query search-state) peers=_(silt ~[~zod ~racfer-hattes]) alive-peers=(set @p) @@ -17,6 +18,7 @@ $: +$ poke $% [%add-peers (set @p)] + [%get-notes ~] == ++ rank-results |= search-results=(map term (unit (list search-result))) @@ -88,15 +90,16 @@ $: state state == ++ on-poke - |= [* * pk=*] + |= [=mark =vase] ^- (quip card:agent:gall _this) - =/ poke (poke pk) + =/ poke !<(poke vase) ~& poke ?- -.poke - %add-peers - [~ this(peers.state (~(put in (~(uni in peers.state) +.poke)) src.bowl))] + %add-peers + [~ this(peers.state (~(put in (~(uni in peers.state) +.poke)) src.bowl))] + %get-notes + `this(notes.state .^(shelf:diary %gx /(scot %p our.bowl)/diary/(scot %da now.bowl)/shelf/noun)) == - ++ on-watch |= =path ?+ path !! diff --git a/zod/seax/lib/graph-store.hoon b/zod/seax/lib/graph-store.hoon new file mode 100644 index 0000000..df11d03 --- /dev/null +++ b/zod/seax/lib/graph-store.hoon @@ -0,0 +1,919 @@ +/- sur=graph-store, pos=post, pull-hook, hark=hark-store +/+ res=resource, migrate +=< [sur .] +=< [pos .] +=, sur +=, pos +|% +++ hark-content + |= =content + ^- content:hark + ?- -.content + %text content + %mention ship+ship.content + %url text+url.content + %code text+'A code excerpt' + %reference text+'A reference' + == +:: +++ hark-contents + |= cs=(list content) + (turn cs hark-content) +:: NOTE: move these functions to zuse +++ nu :: parse number as hex + |= jon=json + ?> ?=([%s *] jon) + (rash p.jon hex) +:: +++ re :: recursive reparsers + |* [gar=* sef=_|.(fist:dejs-soft:format)] + |= jon=json + ^- (unit _gar) + =- ~! gar ~! (need -) - + ((sef) jon) +:: +++ dank :: tank + ^- $-(json (unit tank)) + =, ^? dejs-soft:format + %+ re *tank |. ~+ + %- of :~ + leaf+sa + palm+(ot style+(ot mid+sa cap+sa open+sa close+sa ~) lines+(ar dank) ~) + rose+(ot style+(ot mid+sa open+sa close+sa ~) lines+(ar dank) ~) + == +:: +++ orm ((on atom node) gth) +++ orm-log ((on time logged-update) gth) +:: +++ enjs + =, enjs:format + |% + :: + ++ signatures + |= s=^signatures + ^- json + [%a (turn ~(tap in s) signature)] + :: + ++ signature + |= s=^signature + ^- json + %- pairs + :~ [%signature s+(scot %ux p.s)] + [%ship (ship q.s)] + [%life (numb r.s)] + == + :: + ++ index + |= ind=^index + ^- json + :- %s + ?: =(~ ind) + '/' + %+ roll ind + |= [cur=@ acc=@t] + ^- @t + =/ num (numb cur) + ?> ?=(%n -.num) + (rap 3 acc '/' p.num ~) + :: + ++ uid + |= u=^uid + ^- json + %- pairs + :~ [%resource (enjs:res resource.u)] + [%index (index index.u)] + == + :: + ++ content + |= c=^content + ^- json + ?- -.c + %mention (frond %mention (ship ship.c)) + %text (frond %text s+text.c) + %url (frond %url s+url.c) + %reference (frond %reference (reference +.c)) + %code + %+ frond %code + %- pairs + :- [%expression s+expression.c] + :_ ~ + :- %output + :: virtualize output rendering, +tank:enjs:format might crash + :: + =/ result=(each (list json) tang) + (mule |.((turn output.c tank))) + ?- -.result + %& a+p.result + %| a+[a+[%s '[[output rendering error]]']~]~ + == + == + :: + ++ reference + |= ref=^reference + |^ + %+ frond -.ref + ?- -.ref + %graph (graph +.ref) + %group (group +.ref) + %app (app +.ref) + == + :: + ++ graph + |= [grp=res gra=res idx=^index] + %- pairs + :~ graph+s+(enjs-path:res gra) + group+s+(enjs-path:res grp) + index+(index idx) + == + :: + ++ group + |= grp=res + s+(enjs-path:res grp) + :: + ++ app + |= [=^ship =desk p=^path] + %- pairs + :~ ship+s+(scot %p ship) + desk+s+desk + path+(path p) + == + -- + :: + ++ maybe-post + |= mp=^maybe-post + ^- json + ?- -.mp + %| s+(scot %ux p.mp) + %& (post p.mp) + == + :: + ++ post + |= p=^post + ^- json + %- pairs + :~ [%author (ship author.p)] + [%index (index index.p)] + [%time-sent (time time-sent.p)] + [%contents [%a (turn contents.p content)]] + [%hash ?~(hash.p ~ s+(scot %ux u.hash.p))] + [%signatures (signatures signatures.p)] + == + :: + ++ update + |= upd=^update + ^- json + |^ (frond %graph-update (pairs ~[(encode q.upd)])) + :: + ++ encode + |= upd=action + ^- [cord json] + ?- -.upd + %add-graph + :- %add-graph + %- pairs + :~ [%resource (enjs:res resource.upd)] + [%graph (graph graph.upd)] + [%mark ?~(mark.upd ~ s+u.mark.upd)] + [%overwrite b+overwrite.upd] + == + :: + %remove-graph + [%remove-graph (enjs:res resource.upd)] + :: + %add-nodes + :- %add-nodes + %- pairs + :~ [%resource (enjs:res resource.upd)] + [%nodes (nodes nodes.upd)] + == + :: + %remove-posts + :- %remove-posts + %- pairs + :~ [%resource (enjs:res resource.upd)] + [%indices (indices indices.upd)] + == + :: + %add-signatures + :- %add-signatures + %- pairs + :~ [%uid (uid uid.upd)] + [%signatures (signatures signatures.upd)] + == + :: + %remove-signatures + :- %remove-signatures + %- pairs + :~ [%uid (uid uid.upd)] + [%signatures (signatures signatures.upd)] + == + :: + %add-tag + :- %add-tag + %- pairs + :~ [%term s+term.upd] + [%uid (uid uid.upd)] + == + :: + %remove-tag + :- %remove-tag + %- pairs + :~ [%term s+term.upd] + [%uid (uid uid.upd)] + == + :: + %archive-graph + [%archive-graph (enjs:res resource.upd)] + :: + %unarchive-graph + [%unarchive-graph (enjs:res resource.upd)] + :: + %keys + [%keys [%a (turn ~(tap in resources.upd) enjs:res)]] + :: + %tags + [%tags [%a (turn ~(tap in tags.upd) |=(=term s+term))]] + :: + %run-updates + [%run-updates ~] + :: + %tag-queries + :- %tag-queries + %- pairs + %+ turn ~(tap by tag-queries.upd) + |= [=term uids=(set ^uid)] + ^- [cord json] + [term [%a (turn ~(tap in uids) uid)]] + == + :: + ++ graph + |= g=^graph + ^- json + %- pairs + %+ turn + (tap:orm g) + |= [a=atom n=^node] + ^- [@t json] + :_ (node n) + =/ idx (numb a) + ?> ?=(%n -.idx) + p.idx + :: + ++ node + |= n=^node + ^- json + %- pairs + :~ [%post (maybe-post post.n)] + :- %children + ?- -.children.n + %empty ~ + %graph (graph +.children.n) + == + == + :: + ++ nodes + |= m=(map ^index ^node) + ^- json + %- pairs + %+ turn ~(tap by m) + |= [n=^index o=^node] + ^- [@t json] + :_ (node o) + =/ idx (index n) + ?> ?=(%s -.idx) + p.idx + :: + ++ indices + |= i=(set ^index) + ^- json + [%a (turn ~(tap in i) index)] + :: + -- + -- +:: +++ dejs + =, dejs:format + |% + ++ update + |= jon=json + ^- ^update + :- *time + ^- action + =< (decode jon) + |% + ++ decode + %- of + :~ [%add-nodes add-nodes] + [%remove-posts remove-posts] + [%add-signatures add-signatures] + [%remove-signatures remove-signatures] + :: + [%add-graph add-graph] + [%remove-graph remove-graph] + :: + [%add-tag add-tag] + [%remove-tag remove-tag] + :: + [%archive-graph archive-graph] + [%unarchive-graph unarchive-graph] + [%run-updates run-updates] + :: + [%keys keys] + [%tags tags] + [%tag-queries tag-queries] + == + :: + ++ add-graph + %- ot + :~ [%resource dejs:res] + [%graph graph] + [%mark (mu so)] + [%overwrite bo] + == + :: + ++ graph + |= a=json + ^- ^graph + =/ or-mp ((on atom ^node) gth) + %+ gas:or-mp ~ + %+ turn ~(tap by ((om node) a)) + |* [b=cord c=*] + ^- [atom ^node] + => .(+< [b c]=+<) + [(rash b dem) c] + :: + ++ remove-graph (ot [%resource dejs:res]~) + ++ archive-graph (ot [%resource dejs:res]~) + ++ unarchive-graph (ot [%resource dejs:res]~) + :: + ++ add-nodes + %- ot + :~ [%resource dejs:res] + [%nodes nodes] + == + :: + ++ nodes (op ;~(pfix fas (more fas dem)) node) + :: + ++ node + %- ot + :~ [%post maybe-post] + [%children internal-graph] + == + :: + ++ internal-graph + |= jon=json + ^- ^internal-graph + ?~ jon + [%empty ~] + [%graph (graph jon)] + :: + ++ maybe-post + |= jon=json + ^- ^maybe-post + ?~ jon !! + ?+ -.jon !! + %s [%| (nu jon)] + %o [%& (post jon)] + == + :: + ++ post + %- ot + :~ [%author (su ;~(pfix sig fed:ag))] + [%index index] + [%time-sent di] + [%contents (ar content)] + [%hash (mu nu)] + [%signatures (as signature)] + == + :: + ++ content + %- of + :~ [%mention (su ;~(pfix sig fed:ag))] + [%text so] + [%url so] + [%reference reference] + [%code eval] + == + :: + ++ reference + |^ + %- of + :~ graph+graph + group+dejs-path:res + app+app + == + :: + ++ graph + %- ot + :~ group+dejs-path:res + graph+dejs-path:res + index+index + == + :: + ++ app + %- ot + :~ ship+(su ;~(pfix sig fed:ag)) + desk+so + path+pa + == + -- + :: + ++ tang + |= jon=^json + ^- ^tang + ?> ?=(%a -.jon) + %- zing + %+ turn + p.jon + |= jo=^json + ^- (list tank) + ?> ?=(%a -.jo) + %+ turn + p.jo + |= j=^json + ?> ?=(%s -.j) + ^- tank + leaf+(trip p.j) + :: + ++ eval + %- ot + :~ expression+so + output+tang + == + :: + ++ remove-posts + %- ot + :~ [%resource dejs:res] + [%indices (as index)] + == + :: + ++ add-signatures + %- ot + :~ [%uid uid] + [%signatures (as signature)] + == + :: + ++ remove-signatures + %- ot + :~ [%uid uid] + [%signatures (as signature)] + == + :: + ++ signature + %- ot + :~ [%hash nu] + [%ship (su ;~(pfix sig fed:ag))] + [%life ni] + == + :: + ++ uid + %- ot + :~ [%resource dejs:res] + [%index index] + == + :: + ++ index (su ;~(pfix fas (more fas dem))) + :: + ++ add-tag + %- ot + :~ [%term so] + [%uid uid] + == + :: + ++ remove-tag + %- ot + :~ [%term so] + [%uid uid] + == + :: + ++ keys + |= =json + *resources + :: + ++ tags + |= =json + *(set term) + :: + ++ tag-queries + |= =json + *^tag-queries + :: + ++ run-updates + |= a=json + ^- [resource update-log] + [*resource *update-log] + -- + ++ pa + |= j=json + ^- path + ?> ?=(%s -.j) + ?: =('/' p.j) / + (stab p.j) + :: + -- +:: +++ create + |_ [our=ship now=time] + ++ post + |= [=index contents=(list content)] + ^- ^post + :* our + index + now + contents + ~ + *signatures + == + -- +:: +++ upgrade + |% + :: + :: +two + :: + ++ marked-graph-to-two + |= [=graph:one m=(unit mark)] + [(graph-to-two graph) m] + :: + ++ graph-to-two + |= =graph:one + (graph:(upgrade ,post:one ,maybe-post:two) graph post-to-two) + :: + ++ post-to-two + |= p=post:one + ^- maybe-post:two + [%& p] + :: + :: + :: +one + :: + ++ update-log-to-one + |= =update-log:zero + ^- update-log:one + %+ gas:orm-log:one *update-log:one + %+ turn (tap:orm-log:zero update-log) + |= [=time =logged-update:zero] + ^- [^time logged-update:one] + :- time + :- p.logged-update + (logged-update-to-one q.logged-update) + :: + ++ logged-update-to-one + |= upd=logged-update-0:zero + ^- logged-action:one + ?+ -.upd upd + %add-graph upd(graph (graph-to-one graph.upd)) + %add-nodes upd(nodes (~(run by nodes.upd) node-to-one)) + == + :: + ++ node-to-one + |= =node:zero + (node:(upgrade ,post:zero ,post:one) node post-to-one) + :: + ++ graph-to-one + |= =graph:zero + (graph:(upgrade ,post:zero ,post:one) graph post-to-one) + :: + ++ marked-graph-to-one + |= [=graph:zero m=(unit mark)] + [(graph-to-one graph) m] + :: + ++ post-to-one + |= p=post:zero + ^- post:one + p(contents (contents-to-one contents.p)) + :: + ++ contents-to-one + |= cs=(list content:zero) + ^- (list content:one) + %+ murn cs + |= =content:zero + ^- (unit content:one) + ?: ?=(%reference -.content) ~ + `content + :: + ++ upgrade + |* [in-pst=mold out-pst=mold] + => + |% + ++ in-orm + ((on atom in-node) gth) + +$ in-node + [post=in-pst children=in-internal-graph] + +$ in-graph + ((mop atom in-node) gth) + +$ in-internal-graph + $~ [%empty ~] + $% [%graph p=in-graph] + [%empty ~] + == + :: + ++ out-orm + ((on atom out-node) gth) + +$ out-node + [post=out-pst children=out-internal-graph] + +$ out-graph + ((mop atom out-node) gth) + +$ out-internal-graph + $~ [%empty ~] + $% [%graph p=out-graph] + [%empty ~] + == + -- + |% + :: + ++ graph + |= $: gra=in-graph + fn=$-(in-pst out-pst) + == + ^- out-graph + %+ gas:out-orm *out-graph + ^- (list [atom out-node]) + %+ turn (tap:in-orm gra) + |= [a=atom n=in-node] + ^- [atom out-node] + [a (node n fn)] + :: + ++ node + |= [nod=in-node fn=$-(in-pst out-pst)] + ^- out-node + :- (fn post.nod) + ^- out-internal-graph + ?: ?=(%empty -.children.nod) + [%empty ~] + [%graph (graph p.children.nod fn)] + -- + :: + ++ zero-load + :: =* infinitely recurses + =, store=zero + =, orm=orm:zero + =, orm-log=orm-log:zero + |% + ++ change-revision-graph + |= [=graph:store q=(unit mark)] + ^- [graph:store (unit mark)] + |^ + :_ q + ?+ q graph + [~ %graph-validator-link] convert-links + [~ %graph-validator-publish] convert-publish + == + :: + ++ convert-links + %+ gas:orm *graph:store + %+ turn (tap:orm graph) + |= [=atom =node:store] + ^- [^atom node:store] + :: top-level + :: + :+ atom post.node + ?: ?=(%empty -.children.node) + [%empty ~] + :- %graph + %+ gas:orm *graph:store + %+ turn (tap:orm p.children.node) + |= [=^atom =node:store] + ^- [^^atom node:store] + :: existing comments get turned into containers for revisions + :: + :^ atom + post.node(contents ~, hash ~) + %graph + %+ gas:orm *graph:store + :_ ~ :- %0 + :_ [%empty ~] + post.node(index (snoc index.post.node atom), hash ~) + :: + ++ convert-publish + %+ gas:orm *graph:store + %+ turn (tap:orm graph) + |= [=atom =node:store] + ^- [^atom node:store] + :: top-level + :: + :+ atom post.node + ?: ?=(%empty -.children.node) + [%empty ~] + :- %graph + %+ gas:orm *graph:store + %+ turn (tap:orm p.children.node) + |= [=^atom =node:store] + ^- [^^atom node:store] + :: existing container for publish note revisions + :: + ?+ atom !! + %1 [atom node] + %2 + :+ atom post.node + ?: ?=(%empty -.children.node) + [%empty ~] + :- %graph + %+ gas:orm *graph:store + %+ turn (tap:orm p.children.node) + |= [=^^atom =node:store] + ^- [^^^atom node:store] + :+ atom post.node(contents ~, hash ~) + :- %graph + %+ gas:orm *graph:store + :_ ~ :- %1 + :_ [%empty ~] + post.node(index (snoc index.post.node atom), hash ~) + == + -- + :: + ++ maybe-unix-to-da + |= =atom + ^- @ + :: (bex 127) is roughly 226AD + ?. (lte atom (bex 127)) + atom + (add ~1970.1.1 (div (mul ~s1 atom) 1.000)) + :: + ++ convert-unix-timestamped-node + |= =node:store + ^- node:store + =. index.post.node + (convert-unix-timestamped-index index.post.node) + ?. ?=(%graph -.children.node) + node + :+ post.node + %graph + (convert-unix-timestamped-graph p.children.node) + :: + ++ convert-unix-timestamped-index + |= =index:store + (turn index maybe-unix-to-da) + :: + ++ convert-unix-timestamped-graph + |= =graph:store + %+ gas:orm *graph:store + %+ turn + (tap:orm graph) + |= [=atom =node:store] + ^- [^atom node:store] + :- (maybe-unix-to-da atom) + (convert-unix-timestamped-node node) + -- + -- +++ import + |= [arc=* our=ship] + ^- (quip card:agent:gall [%6 network]) + |^ + =/ sty [%6 (remake-network ;;(tree-network +.arc))] + :_ sty + %+ turn ~(tap by graphs.sty) + |= [rid=resource =marked-graph] + ^- card:agent:gall + ?: =(our entity.rid) + =/ =cage [%push-hook-action !>([%add rid])] + [%pass / %agent [our %graph-push-hook] %poke cage] + (try-rejoin rid 0) + :: + +$ tree-network + $: graphs=tree-graphs + tag-queries=(tree [term (tree uid)]) + update-logs=tree-update-logs + archive=tree-graphs + ~ + == + +$ tree-graphs (tree [resource tree-marked-graph]) + +$ tree-marked-graph [p=tree-graph q=(unit ^mark)] + +$ tree-graph (tree [atom tree-node]) + +$ tree-node [post=tree-maybe-post children=tree-internal-graph] + +$ tree-internal-graph + $~ [%empty ~] + $% [%graph p=tree-graph] + [%empty ~] + == + +$ tree-update-logs (tree [resource tree-update-log]) + +$ tree-update-log (tree [time tree-logged-update]) + +$ tree-logged-update + $: p=time + $= q + $% [%add-graph =resource =tree-graph mark=(unit ^mark) ow=?] + [%add-nodes =resource nodes=(tree [index tree-node])] + [%remove-posts =resource indices=(tree index)] + [%add-signatures =uid signatures=tree-signatures] + [%remove-signatures =uid signatures=tree-signatures] + == + == + +$ tree-signatures (tree signature) + +$ tree-maybe-post (each tree-post hash) + +$ tree-post + $: author=ship + =index + time-sent=time + contents=(list content) + hash=(unit hash) + signatures=tree-signatures + == + :: + ++ remake-network + |= t=tree-network + ^- network + :* (remake-graphs graphs.t) + (remake-jug:migrate tag-queries.t) + (remake-update-logs update-logs.t) + (remake-graphs archive.t) + ~ + == + :: + ++ remake-graphs + |= t=tree-graphs + ^- graphs + %- remake-map:migrate + (~(run by t) remake-marked-graph) + :: + ++ remake-marked-graph + |= t=tree-marked-graph + ^- marked-graph + [(remake-graph p.t) q.t] + :: + ++ remake-graph + |= t=tree-graph + ^- graph + %+ gas:orm *graph + %+ turn ~(tap by t) + |= [a=atom tn=tree-node] + ^- [atom node] + [a (remake-node tn)] + :: + ++ remake-internal-graph + |= t=tree-internal-graph + ^- internal-graph + ?: ?=(%empty -.t) + [%empty ~] + [%graph (remake-graph p.t)] + :: + ++ remake-node + |= t=tree-node + ^- node + :- (remake-post post.t) + (remake-internal-graph children.t) + :: + ++ remake-update-logs + |= t=tree-update-logs + ^- update-logs + %- remake-map:migrate + (~(run by t) remake-update-log) + :: + ++ remake-update-log + |= t=tree-update-log + ^- update-log + =/ ulm ((on time logged-update) gth) + %+ gas:ulm *update-log + %+ turn ~(tap by t) + |= [=time tlu=tree-logged-update] + ^- [^time logged-update] + [time (remake-logged-update tlu)] + :: + ++ remake-logged-update + |= t=tree-logged-update + ^- logged-update + :- p.t + ?- -.q.t + %add-graph + :* %add-graph + resource.q.t + (remake-graph tree-graph.q.t) + mark.q.t + ow.q.t + == + :: + %add-nodes + :- %add-nodes + :- resource.q.t + %- remake-map:migrate + (~(run by nodes.q.t) remake-node) + :: + %remove-posts + [%remove-posts resource.q.t (remake-set:migrate indices.q.t)] + :: + %add-signatures + [%add-signatures uid.q.t (remake-set:migrate signatures.q.t)] + :: + %remove-signatures + [%remove-signatures uid.q.t (remake-set:migrate signatures.q.t)] + == + :: + ++ remake-post + |= t=tree-maybe-post + ^- maybe-post + ?- -.t + %| t + %& t(signatures.p (remake-set:migrate signatures.p.t)) + == + :: + ++ try-rejoin + |= [rid=resource nack-count=@] + ^- card:agent:gall + =/ res-path (en-path:res rid) + =/ wire [%try-rejoin (scot %ud nack-count) res-path] + =/ =cage + :- %pull-hook-action + !> ^- action:pull-hook + [%add [entity .]:rid] + [%pass wire %agent [our %graph-pull-hook] %poke cage] + -- +-- diff --git a/zod/seax/lib/resource.hoon b/zod/seax/lib/resource.hoon new file mode 100644 index 0000000..f84acb0 --- /dev/null +++ b/zod/seax/lib/resource.hoon @@ -0,0 +1,57 @@ +/- sur=resource +=< resource +|% ++$ resource resource:sur +++ en-path + |= =resource + ^- path + ~[%ship (scot %p entity.resource) name.resource] +:: +++ de-path + |= =path + ^- resource + (need (de-path-soft path)) +:: +++ de-path-soft + |= =path + ^- (unit resource) + ?. ?=([%ship @ @ *] path) + ~ + =/ ship + (slaw %p i.t.path) + ?~ ship + ~ + `[u.ship i.t.t.path] +:: +++ enjs + |= =resource + ^- json + =, enjs:format + %- pairs + :~ ship+(ship entity.resource) + name+s+name.resource + == +:: +++ enjs-path + |= =resource + %- spat + (en-path resource) +:: +++ dejs-path + %- su:dejs:format + ;~ pfix + (jest '/ship/') + ;~((glue fas) ;~(pfix sig fed:ag) urs:ab) + == +:: +++ dejs + =, dejs:format + ^- $-(json resource) + |= jon=json + ~| dejs+%resource + %. jon + %- ot + :~ ship+(su ;~(pfix sig fed:ag)) + name+so + == +-- diff --git a/zod/seax/sur/diary-0.hoon b/zod/seax/sur/diary-0.hoon new file mode 100644 index 0000000..da0d5c0 --- /dev/null +++ b/zod/seax/sur/diary-0.hoon @@ -0,0 +1,323 @@ +/- g=groups, c=cite, graph-store, e=epic +/- metadata-store +/+ lib-graph=graph-store +|% +++ okay `epic:e`0 +++ mar + |% + ++ act `mark`(rap 3 %diary-action '-' (scot %ud okay) ~) + ++ upd `mark`(rap 3 %diary-update '-' (scot %ud okay) ~) + ++ log `mark`(rap 3 %diary-logs '-' (scot %ud okay) ~) + -- +:: $flag: identifier for a diary channel ++$ flag (pair ship term) +:: $feel: either an emoji identifier like :diff or a URL for custom ++$ feel @ta +:: $view: the persisted display format for a diary ++$ view ?(%grid %list) +:: $sort: the persisted sort type for a diary ++$ sort ?(%alpha %time %arranged) +:: $shelf: my ship's diaries ++$ shelf (map flag diary) +:: $said: used for references ++$ said (pair flag outline) +:: $plan: index into diary state +:: p: Note being referred to +:: q: Quip being referred to, if any +:: ++$ plan + (pair time (unit time)) +:: +:: $diary: written longform communication +:: +:: net: an indicator of whether I'm a host or subscriber +:: log: the history of all modifications +:: perm: holds the diary's permissions +:: view: what format to display +:: sort: how to order posts +:: notes: the actual contents of the diary +:: remark: what is the last thing we've read +:: banter: comments organized by post +:: ++$ diary + $: =net + =log + =perm + =view + =sort + =notes + =remark + == +:: +:: $notes: a set of time ordered diary posts +:: +++ notes + =< rock + |% + +$ rock + ((mop time note) lte) + ++ on + ((^on time note) lte) + +$ diff + (pair time delta) + +$ delta + $% [%add p=essay] + [%edit p=essay] + [%del ~] + [%quips p=diff:quips] + [%add-feel p=ship q=feel] + [%del-feel p=ship] + == + -- +:: +:: $quips: a set of time ordered note comments +:: +++ quips + =< rock + |% + +$ rock + ((mop time quip) lte) + ++ on + ((^on time quip) lte) + +$ diff + (pair time delta) + +$ delta + $% [%add p=memo] + [%del ~] + [%add-feel p=ship q=feel] + [%del-feel p=ship] + == + -- +:: +:: $outline: abridged $note +:: .quips: number of comments +:: ++$ outline + [quips=@ud quippers=(set ship) essay] +:: +++ outlines + =< outlines + |% + +$ outlines ((mop time outline) lte) + ++ on ((^on time outline) lte) + -- +:: +:: $note: a diary post +:: ++$ note [seal essay] +:: $quip: a post comment +:: ++$ quip [cork memo] +:: +:: $seal: host-side data for a note +:: ++$ seal + $: =time + =quips + feels=(map ship feel) + == +:: +:: $cork: host-side data for a quip +:: ++$ cork + $: =time + feels=(map ship feel) + == +:: $essay: the post data itself +:: +:: title: the name of the post +:: image: a visual displayed as a header +:: content: the body of the post +:: author: the ship that wrote the post +:: sent: the client-side time the post was made +:: ++$ essay + $: title=@t + image=@t + content=(list verse) + author=ship + sent=time + == ++$ story (pair (list block) (list inline)) +:: $memo: the comment data itself +:: +:: content: the body of the comment +:: author: the ship that wrote the comment +:: sent: the client-side time the comment was made +:: ++$ memo + $: content=story + author=ship + sent=time + == +:: $verse: a chunk of post content +:: +:: blocks stand on their own. inlines come in groups and get wrapped +:: into a paragraph +:: ++$ verse + $% [%block p=block] + [%inline p=(list inline)] + == +:: $listing: recursive type for infinitely nested