diff --git a/desk/lib/dbug.hoon b/desk/lib/dbug.hoon new file mode 100644 index 0000000..ce98619 --- /dev/null +++ b/desk/lib/dbug.hoon @@ -0,0 +1,155 @@ +:: dbug: agent wrapper for generic debugging tools +:: +:: usage: %-(agent:dbug your-agent) +:: +|% ++$ poke + $% [%bowl ~] + [%state grab=cord] + [%incoming =about] + [%outgoing =about] + == +:: ++$ about + $@ ~ + $% [%ship =ship] + [%path =path] + [%wire =wire] + [%term =term] + == +:: +++ agent + |= =agent:gall + ^- agent:gall + !. + |_ =bowl:gall + +* this . + ag ~(. agent bowl) + :: + ++ on-poke + |= [=mark =vase] + ^- (quip card:agent:gall agent:gall) + ?. ?=(%dbug mark) + =^ cards agent (on-poke:ag mark vase) + [cards this] + =/ dbug + !<(poke vase) + =; =tang + ((%*(. slog pri 1) tang) [~ this]) + ?- -.dbug + %bowl [(sell !>(bowl))]~ + :: + %state + =? grab.dbug =('' grab.dbug) '-' + =; product=^vase + [(sell product)]~ + =/ state=^vase + :: if the underlying app has implemented a /dbug/state scry endpoint, + :: use that vase in place of +on-save's. + :: + =/ result=(each ^vase tang) + (mule |.(q:(need (need (on-peek:ag /x/dbug/state))))) + ?:(?=(%& -.result) p.result on-save:ag) + %+ slap + (slop state !>([bowl=bowl ..zuse])) + (ream grab.dbug) + :: + %incoming + =; =tang + ?^ tang tang + [%leaf "no matching subscriptions"]~ + %+ murn + %+ sort ~(tap by sup.bowl) + |= [[* a=[=ship =path]] [* b=[=ship =path]]] + (aor [path ship]:a [path ship]:b) + |= [=duct [=ship =path]] + ^- (unit tank) + =; relevant=? + ?. relevant ~ + `>[path=path from=ship duct=duct]< + ?: ?=(~ about.dbug) & + ?- -.about.dbug + %ship =(ship ship.about.dbug) + %path ?=(^ (find path.about.dbug path)) + %wire %+ lien duct + |=(=wire ?=(^ (find wire.about.dbug wire))) + %term !! + == + :: + %outgoing + =; =tang + ?^ tang tang + [%leaf "no matching subscriptions"]~ + %+ murn + %+ sort ~(tap by wex.bowl) + |= [[[a=wire *] *] [[b=wire *] *]] + (aor a b) + |= [[=wire =ship =term] [acked=? =path]] + ^- (unit tank) + =; relevant=? + ?. relevant ~ + `>[wire=wire agnt=[ship term] path=path ackd=acked]< + ?: ?=(~ about.dbug) & + ?- -.about.dbug + %ship =(ship ship.about.dbug) + %path ?=(^ (find path.about.dbug path)) + %wire ?=(^ (find wire.about.dbug wire)) + %term =(term term.about.dbug) + == + == + :: + ++ on-peek + |= =path + ^- (unit (unit cage)) + ?. ?=([@ %dbug *] path) + (on-peek:ag path) + ?+ path [~ ~] + [%u %dbug ~] ``noun+!>(&) + [%x %dbug %state ~] ``noun+!>(on-save:ag) + [%x %dbug %subscriptions ~] ``noun+!>([wex sup]:bowl) + == + :: + ++ on-init + ^- (quip card:agent:gall agent:gall) + =^ cards agent on-init:ag + [cards this] + :: + ++ on-save on-save:ag + :: + ++ on-load + |= old-state=vase + ^- (quip card:agent:gall agent:gall) + =^ cards agent (on-load:ag old-state) + [cards this] + :: + ++ on-watch + |= =path + ^- (quip card:agent:gall agent:gall) + =^ cards agent (on-watch:ag path) + [cards this] + :: + ++ on-leave + |= =path + ^- (quip card:agent:gall agent:gall) + =^ cards agent (on-leave:ag path) + [cards this] + :: + ++ on-agent + |= [=wire =sign:agent:gall] + ^- (quip card:agent:gall agent:gall) + =^ cards agent (on-agent:ag wire sign) + [cards this] + :: + ++ on-arvo + |= [=wire =sign-arvo] + ^- (quip card:agent:gall agent:gall) + =^ cards agent (on-arvo:ag wire sign-arvo) + [cards this] + :: + ++ on-fail + |= [=term =tang] + ^- (quip card:agent:gall agent:gall) + =^ cards agent (on-fail:ag term tang) + [cards this] + -- +-- diff --git a/desk/lib/default-agent.hoon b/desk/lib/default-agent.hoon new file mode 100644 index 0000000..319bf95 --- /dev/null +++ b/desk/lib/default-agent.hoon @@ -0,0 +1,69 @@ +/+ skeleton +|* [agent=* help=*] +?: ?=(%& help) + ~| %default-agent-helpfully-crashing + skeleton +|_ =bowl:gall +++ on-init + `agent +:: +++ on-save + !>(~) +:: +++ on-load + |= old-state=vase + `agent +:: +++ on-poke + |= =cage + ~| "unexpected poke to {} with mark {}" + !! +:: +++ on-watch + |= =path + ~| "unexpected subscription to {} on path {}" + !! +:: +++ on-leave + |= path + `agent +:: +++ on-peek + |= =path + ~| "unexpected scry into {} on path {}" + !! +:: +++ on-agent + |= [=wire =sign:agent:gall] + ^- (quip card:agent:gall _agent) + ?- -.sign + %poke-ack + ?~ p.sign + `agent + %- (slog leaf+"poke failed from {} on wire {}" u.p.sign) + `agent + :: + %watch-ack + ?~ p.sign + `agent + =/ =tank leaf+"subscribe failed from {} on wire {}" + %- (slog tank u.p.sign) + `agent + :: + %kick `agent + %fact + ~| "unexpected subscription update to {} on wire {}" + ~| "with mark {}" + !! + == +:: +++ on-arvo + |= [=wire =sign-arvo] + ~| "unexpected system response {<-.sign-arvo>} to {} on wire {}" + !! +:: +++ on-fail + |= [=term =tang] + %- (slog leaf+"error in {}" >term< tang) + `agent +-- diff --git a/desk/lib/skeleton.hoon b/desk/lib/skeleton.hoon new file mode 100644 index 0000000..982c371 --- /dev/null +++ b/desk/lib/skeleton.hoon @@ -0,0 +1,51 @@ +:: Similar to default-agent except crashes everywhere +^- agent:gall +|_ bowl:gall +++ on-init + ^- (quip card:agent:gall agent:gall) + !! +:: +++ on-save + ^- vase + !! +:: +++ on-load + |~ old-state=vase + ^- (quip card:agent:gall agent:gall) + !! +:: +++ on-poke + |~ in-poke-data=cage + ^- (quip card:agent:gall agent:gall) + !! +:: +++ on-watch + |~ path + ^- (quip card:agent:gall agent:gall) + !! +:: +++ on-leave + |~ path + ^- (quip card:agent:gall agent:gall) + !! +:: +++ on-peek + |~ path + ^- (unit (unit cage)) + !! +:: +++ on-agent + |~ [wire sign:agent:gall] + ^- (quip card:agent:gall agent:gall) + !! +:: +++ on-arvo + |~ [wire =sign-arvo] + ^- (quip card:agent:gall agent:gall) + !! +:: +++ on-fail + |~ [term tang] + ^- (quip card:agent:gall agent:gall) + !! +-- diff --git a/desk/lib/test-tq.hoon b/desk/lib/test-tq.hoon new file mode 100644 index 0000000..d956202 --- /dev/null +++ b/desk/lib/test-tq.hoon @@ -0,0 +1 @@ +:: test\n|%\n++ foo\n '''\n hello world\n '''\n--\n \ No newline at end of file diff --git a/desk/lib/test.hoon b/desk/lib/test.hoon new file mode 100644 index 0000000..01f74bc --- /dev/null +++ b/desk/lib/test.hoon @@ -0,0 +1,4 @@ +:: test +|% +++ foo 42 +-- diff --git a/desk/lib/verb.hoon b/desk/lib/verb.hoon new file mode 100644 index 0000000..06f06e0 --- /dev/null +++ b/desk/lib/verb.hoon @@ -0,0 +1,182 @@ +:: Print what your agent is doing. +:: +/- *verb +:: +|= [loud=? =agent:gall] +=| bowl-print=_| +^- agent:gall +|^ !. +|_ =bowl:gall ++* this . + ag ~(. agent bowl) +:: +++ on-init + ^- (quip card:agent:gall agent:gall) + %- (print bowl |.("{}: on-init")) + =^ cards agent on-init:ag + :_ this + :_ :_ cards + (emit-event %on-init ~) + (emit-event-plus bowl [%on-init ~] cards) +:: +++ on-save + ^- vase + %- (print bowl |.("{}: on-save")) + on-save:ag +:: +++ on-load + |= old-state=vase + ^- (quip card:agent:gall agent:gall) + %- (print bowl |.("{}: on-load")) + =^ cards agent (on-load:ag old-state) + :_ this + :_ :_ cards + (emit-event %on-load ~) + (emit-event-plus bowl [%on-load ~] cards) +:: +++ on-poke + |= [=mark =vase] + ^- (quip card:agent:gall agent:gall) + %- (print bowl |.("{}: on-poke with mark {}")) + ?: ?=(%verb mark) + ?- !<(?(%loud %bowl) vase) + %loud `this(loud !loud) + %bowl `this(bowl-print !bowl-print) + == + =^ cards agent (on-poke:ag mark vase) + :_ this + :_ :_ cards + (emit-event %on-poke mark) + (emit-event-plus bowl [%on-poke mark (mug q.vase)] cards) +:: +++ on-watch + |= =path + ^- (quip card:agent:gall agent:gall) + %- (print bowl |.("{}: on-watch on path {}")) + =^ cards agent + ?: ?=([%verb ?(%events %events-plus) ~] path) + [~ agent] + (on-watch:ag path) + :_ this + :_ :_ cards + (emit-event %on-watch path) + (emit-event-plus bowl [%on-watch path] cards) +:: +++ on-leave + |= =path + ^- (quip card:agent:gall agent:gall) + %- (print bowl |.("{}: on-leave on path {}")) + ?: ?=([%verb %event ~] path) + [~ this] + =^ cards agent (on-leave:ag path) + :_ this + :_ :_ cards + (emit-event %on-leave path) + (emit-event-plus bowl [%on-leave path] cards) +:: +++ on-peek + |= =path + ^- (unit (unit cage)) + %- (print bowl |.("{}: on-peek on path {}")) + (on-peek:ag path) +:: +++ on-agent + |= [=wire =sign:agent:gall] + ^- (quip card:agent:gall agent:gall) + %- (print bowl |.("{}: on-agent on wire {}, {<-.sign>}")) + =^ cards agent (on-agent:ag wire sign) + :_ this + :_ :_ cards + (emit-event %on-agent wire -.sign) + =; =^sign + (emit-event-plus bowl [%on-agent wire sign] cards) + ?- -.sign + %poke-ack [%poke-ack ?=(~ p.sign)] + %watch-ack [%watch-ack ?=(~ p.sign)] + %kick [%kick ~] + %fact [%fact p.cage.sign (mug q.q.cage.sign)] + == +:: +++ on-arvo + |= [=wire =sign-arvo] + ^- (quip card:agent:gall agent:gall) + %- %+ print bowl |. + "{}: on-arvo on wire {}, {<[- +<]:sign-arvo>}" + =^ cards agent (on-arvo:ag wire sign-arvo) + :_ this + :_ :_ cards + (emit-event %on-arvo wire [- +<]:sign-arvo) + (emit-event-plus bowl [%on-arvo wire [- +<]:sign-arvo] cards) +:: +++ on-fail + |= [=term =tang] + ^- (quip card:agent:gall agent:gall) + %- (print bowl |.("{}: on-fail with term {}")) + =^ cards agent (on-fail:ag term tang) + :_ this + :_ :_ cards + (emit-event %on-fail term) + (emit-event-plus bowl [%on-fail term] cards) +-- +:: +++ print + |= [=bowl:gall render=(trap tape)] + ^+ same + =? . bowl-print + %- (slog >bowl< ~) + . + ?. loud same + %- (slog [%leaf $:render] ~) + same +:: +++ emit-event + |= =event + ^- card:agent:gall + [%give %fact ~[/verb/events] %verb-event !>(event)] +:: +++ emit-event-plus + |= [=bowl:gall =cause cards=(list card:agent:gall)] + ^- card:agent:gall + =; event=event-plus + [%give %fact ~[/verb/events-plus] %verb-event-plus !>(event)] + =- [act.bowl now.bowl src.bowl sap.bowl cause -] + %+ turn cards + |= =card:agent:gall + ^- effect + ::TODO for %fact, %kick, could calculate how many ships affected + ?- card + [%pass * %agent * ?(%poke %poke-as) *] + =, q.card + =/ =cage ?-(-.task.q.card %poke cage.task, %poke-as [mark.task q.cage.task]) + [%poke p.card [ship name] p.cage `@`(mug q.q.cage)] + :: + [%pass * %agent * ?(%watch %watch-as) *] + =, q.card + =/ =path ?-(-.task.q.card %watch path.task, %watch-as path.task) + [%watch p.card [ship name] path] + :: + [%pass * %agent * %leave *] + =, q.card + [%leave p.card [ship name]] + :: + [%give %fact *] + =, p.card + [%fact paths p.cage (mug q.q.cage)] + :: + [%give %kick *] + [%kick paths.p.card] + :: + [%give ?(%poke-ack %watch-ack) *] + ~| %explicit-ack + !! :: shouldn't be given explicitly + :: + [%pass * %arvo *] + [%arvo p.card -.q.card +<.q.card] + :: + [%pass *] + [%arvo p.card %$ -.q.card] + :: + [%slip *] + $(card [%pass //slip p.card]) + == +-- diff --git a/desk/mar/bill.hoon b/desk/mar/bill.hoon new file mode 100644 index 0000000..76cef34 --- /dev/null +++ b/desk/mar/bill.hoon @@ -0,0 +1,34 @@ +|_ bil=(list dude:gall) +++ grow + |% + ++ mime `^mime`[/text/x-bill (as-octs:mimes:html hoon)] + ++ noun bil + ++ hoon + ^- @t + |^ (crip (of-wall:format (wrap-lines (spit-duz bil)))) + :: + ++ wrap-lines + |= taz=wall + ^- wall + ?~ taz ["~"]~ + :- (weld ":~ " i.taz) + %- snoc :_ "==" + (turn t.taz |=(t=tape (weld " " t))) + :: + ++ spit-duz + |= duz=(list dude:gall) + ^- wall + (turn duz |=(=dude:gall ['%' (trip dude)])) + -- + ++ txt (to-wain:format hoon) + -- +++ grab + |% + ++ noun (list dude:gall) + ++ mime + |= [=mite len=@ud tex=@] + ~_ tex + !<((list dude:gall) (slap !>(~) (ream tex))) + -- +++ grad %noun +-- diff --git a/desk/mar/hoon.hoon b/desk/mar/hoon.hoon new file mode 100644 index 0000000..428e105 --- /dev/null +++ b/desk/mar/hoon.hoon @@ -0,0 +1,36 @@ +:::: /hoon/hoon/mar + :: +/? 310 +:: +=, eyre +|_ own=@t +:: +++ grow :: convert to + |% + ++ mime `^mime`[/text/x-hoon (as-octs:mimes:html own)] :: convert to %mime + ++ hymn + ;html + ;head + ;title:"Source" + ;script@"//cdnjs.cloudflare.com/ajax/libs/codemirror/4.3.0/codemirror.js"; + ;script@"/lib/syntax/hoon.js"; + ;link(rel "stylesheet", href "//cdnjs.cloudflare.com/ajax/libs/". + "codemirror/4.3.0/codemirror.min.css"); + ;link/"/lib/syntax/codemirror.css"(rel "stylesheet"); + == + ;body + ;textarea#src:"{(trip own)}" + ;script:'CodeMirror.fromTextArea(src, {lineNumbers:true, readOnly:true})' + == + == + ++ txt + (to-wain:format own) + -- +++ grab + |% :: convert from + ++ mime |=([p=mite q=octs] q.q) + ++ noun @t :: clam from %noun + ++ txt of-wain:format + -- +++ grad %txt +-- diff --git a/desk/mar/kelvin.hoon b/desk/mar/kelvin.hoon new file mode 100644 index 0000000..7f1b409 --- /dev/null +++ b/desk/mar/kelvin.hoon @@ -0,0 +1,28 @@ +|_ kal=waft:clay +++ grow + |% + ++ mime `^mime`[/text/x-kelvin (as-octs:mimes:html hoon)] + ++ noun kal + ++ hoon + %+ rap 3 + %+ turn + %+ sort + ~(tap in (waft-to-wefts:clay kal)) + |= [a=weft b=weft] + ?: =(lal.a lal.b) + (gte num.a num.b) + (gte lal.a lal.b) + |= =weft + (rap 3 '[%' (scot %tas lal.weft) ' ' (scot %ud num.weft) ']\0a' ~) + :: + ++ txt (to-wain:format hoon) + -- +++ grab + |% + ++ noun waft:clay + ++ mime + |= [=mite len=@ud tex=@] + (cord-to-waft:clay tex) + -- +++ grad %noun +-- diff --git a/desk/mar/mime.hoon b/desk/mar/mime.hoon new file mode 100644 index 0000000..83b4dae --- /dev/null +++ b/desk/mar/mime.hoon @@ -0,0 +1,32 @@ +:: +:::: /hoon/mime/mar + :: +/? 310 +:: +|_ own=mime +++ grow + ^? + |% + ++ jam `@`q.q.own + -- +:: +++ grab :: convert from + ^? + |% + ++ noun mime :: clam from %noun + ++ tape + |=(a=_"" [/application/x-urb-unknown (as-octt:mimes:html a)]) + -- +++ grad + ^? + |% + ++ form %mime + ++ diff |=(mime +<) + ++ pact |=(mime +<) + ++ join |=([mime mime] `(unit mime)`~) + ++ mash + |= [[ship desk mime] [ship desk mime]] + ^- mime + ~|(%mime-mash !!) + -- +-- diff --git a/desk/mar/noun.hoon b/desk/mar/noun.hoon new file mode 100644 index 0000000..ff5443e --- /dev/null +++ b/desk/mar/noun.hoon @@ -0,0 +1,22 @@ +:: +:::: /hoon/noun/mar + :: +/? 310 +!: +:::: A minimal noun mark +|_ non=* +++ grab |% + ++ noun * + -- +++ grow |% + ++ mime [/application/x-urb-jam (as-octs:mimes:html (jam non))] + -- +++ grad + |% + ++ form %noun + ++ diff |=(* +<) + ++ pact |=(* +<) + ++ join |=([* *] *(unit *)) + ++ mash |=([[ship desk *] [ship desk *]] `*`~|(%noun-mash !!)) + -- +-- diff --git a/desk/sur/verb.hoon b/desk/sur/verb.hoon new file mode 100644 index 0000000..5363674 --- /dev/null +++ b/desk/sur/verb.hoon @@ -0,0 +1,48 @@ +|% ++$ event + $% [%on-init ~] + [%on-load ~] + [%on-poke =mark] + [%on-watch =path] + [%on-leave =path] + [%on-agent =wire sign=term] + [%on-arvo =wire vane=term sign=term] + [%on-fail =term] + == +:: ++$ event-plus + $: act=@ud + now=@da + src=@p + sap=path + =cause + effects=(list effect) + == +:: ++$ cause + $% [%on-init ~] + [%on-load ~] + [%on-poke =mark mug=@ux] + [%on-watch =path] + [%on-leave =path] + [%on-agent =wire =sign] + [%on-arvo =wire vane=term sign=term] + [%on-fail =term] + == +:: ++$ sign + $% [%poke-ack ack=?] + [%watch-ack ack=?] + [%kick ~] + [%fact =mark mug=@ux] + == +:: ++$ effect + $% [%poke =wire =gill:gall =mark mug=@ux] + [%watch =wire =gill:gall =path] + [%leave =wire =gill:gall] + [%fact paths=(list path) =mark mug=@ux] + [%kick paths=(list path)] + [%arvo =wire vane=term task=term] + == +--