on 2d2698c help sign in
96 files changed+1136−3968
since splitsnapshots
unifiedsplit
README.md−1 base-desk/lib/agentio.hoon+6−4 base-desk/lib/azimuth.hoon+9−9 base-desk/lib/azimuthio.hoon+3−3 base-desk/lib/bitcoin-utils.hoon+1−2 base-desk/lib/dbug.hoon+3−9 base-desk/lib/dill.hoon−94 base-desk/lib/ethereum.hoon+3−9 base-desk/lib/ethio.hoon+3−3 base-desk/lib/jose.hoon+3−11 base-desk/lib/keygen.hoon+1−1 base-desk/lib/language-server/complete.hoon+3−4 base-desk/lib/language-server/easy-print.hoon+3−3 base-desk/lib/language-server/rune-snippet.hoon+2−2 base-desk/lib/noun-diff.hoon−213 base-desk/lib/ph/io.hoon+4−226 base-desk/lib/ph/util.hoon+11−24 base-desk/lib/pill.hoon+17−499 base-desk/lib/ring.hoon+36−36 base-desk/lib/server.hoon+2−2 base-desk/lib/shoe.hoon+36−72 base-desk/lib/sink.hoon−26 base-desk/lib/sole.hoon−24 base-desk/lib/sss.hoon−445 base-desk/lib/story.hoon+35−11 base-desk/lib/strand.hoon+188−1 base-desk/lib/strandio.hoon+13−170 base-desk/lib/test.hoon+1−54 base-desk/lib/verb.hoon+11−88 base-desk/mar/belt.hoon+12−3 base-desk/mar/blit.hoon+44−3 base-desk/mar/css.hoon+5−9 base-desk/mar/hoon.hoon+31−285 base-desk/mar/htm.hoon+11−2 base-desk/mar/httr.hoon+2−1 base-desk/mar/js.hoon+4−7 base-desk/mar/json.hoon+4−4 base-desk/mar/json/rpc/response.hoon+2−1 base-desk/mar/kelvin.hoon−28 base-desk/mar/noun.hoon−3 base-desk/mar/sole/action.hoon+1−3 base-desk/mar/story.hoon+10−5 base-desk/mar/tang.hoon+5−5 base-desk/mar/thread-fail.hoon+1−1 base-desk/mar/txt.hoon+1 base-desk/mar/udon.hoon+4 base-desk/mar/umd.hoon+4 base-desk/mar/urb.hoon+1−1 base-desk/sources.txt+3−2 base-desk/sur/aquarium.hoon+4−8 base-desk/sur/hood.hoon+185−281 base-desk/sur/ring.hoon+1−1 base-desk/sur/sole.hoon+1−2 base-desk/sur/spider.hoon+1−7 base-desk/sur/sss.hoon−39 base-desk/sur/verb.hoon+1−37 bin/make_glob.py−208 desk/app/astrolabe.hoon+67−38 desk/desk.docket-0+3−3 desk/desk.seal−7 desk/doc/usr/astrolabe.udon+3−13 desk/lib/astrolabe.hoon+2−29 desk/lib/state.hoon−21 desk/mar/seal.hoon−12 desk/sur/astrolabe.hoon+1−43 desk/sys.kelvin+1−1 desk/tests/lib/state.hoon−59 flake.lock−27 flake.nix−73 ui/package-lock.json+11−11 ui/package.json+1−1 ui/scraps/scry thoughts+5 ui/src/App.svelte+1−35 ui/src/actions/tooltip.ts+2−2 ui/src/components/CollapsibleContent.svelte+5−4 ui/src/components/ShipListing.svelte+5−3 ui/src/components/StarChart.svelte+12−41 ui/src/components/common/Sigil.svelte+27−27 ui/src/components/docs/Doc.svelte+1−10 ui/src/components/search/SearchBar.svelte+10−37 ui/src/components/search/sigil/ClanSelect.svelte+2−10 ui/src/components/search/sigil/SigilInput.svelte+1−13 ui/src/components/search/sigil/SymbolInputModeSelector.svelte−7 ui/src/components/ship_view/AzimuthDetails.svelte−90 ui/src/components/ship_view/ShipChildrenTabs.svelte+4−35 ui/src/components/ship_view/ShipView.svelte+92−8 ui/src/lib/api.ts−8 ui/src/lib/apps.ts+1−3 ui/src/lib/colors.ts−3 ui/src/lib/graph.ts+105−152 ui/src/lib/link.ts+3−3 ui/src/lib/sigil.ts−4 ui/src/routes/Home.svelte+24−40 ui/src/stores/keys.ts−68 ui/src/styles/tailwind-output.css+14−34 ui/vite.config.ts+1−1
README.md−1
@@ -38,7 +38,6 @@ Regardless of what you run to develop, Vite will hot-reload code changes as you
38384. Bump the `version` in `desk.docket-0`.
39393. Install the desk
4040 1. From the `ui` folder: `npm run install:desk`
41− 2. (first time only, on dev ship): `|install our %astrolabe`
4241 2. From the distribution ship's dojo: `:treaty|unpublish %astrolabe`
4342 2. From middleman or distribution ship's dojo: `|commit %astrolabe`
4443 3. (if using a comet as a middleman) `|public %astrolabe`
base-desk/lib/agentio.hoon+6−4
@@ -66,7 +66,7 @@
6666 ::
6767 ++ rest
6868 |= p=@da
69− (arvo %b %rest p)
69+ (arvo %b %wait p)
7070 ::
7171 ++ warp
7272 |= [wer=ship =riff:clay]
@@ -85,14 +85,16 @@
8585 ?:(?=(%sing genre) [genre mood] [genre mood])
8686 (warp-our q.byk.bowl `rave)
8787 ::
88− ++ tire
89− (arvo %c %tire `~)
90− ::
9188 ++ connect
9289 |= [=binding:eyre app=term]
9390 (arvo %e %connect binding app)
9491 --
9592::
93+++ fact-curry
94+ |* [=mark =mold]
95+ |= [paths=(list path) fac=mold]
96+ (fact mark^!>(fac) paths)
97+::
9698++ fact-kick
9799 |= [=path =cage]
98100 ^- (list card)
base-desk/lib/azimuth.hoon+9−9
@@ -114,29 +114,29 @@
114114 ::
115115 :: Testnet contract addresses
116116 ::
117− ++ goerli-contracts
117+ ++ ropsten-contracts
118118 |%
119119 ++ azimuth
120− 0xbb61.fa68.3e4b.9104.18e2.7b00.a143.8a93.6234.df52
120+ 0x308a.b6a6.024c.f198.b57e.008d.0ac9.ad02.1988.6579
121121 ::
122122 ++ ecliptic
123− 0xe129.0a32.9014.5e63.e6a8.ec1e.f661.6906.856d.0c8f
123+ 0x8b9f.86a2.8921.d9c7.05b3.113a.755f.b979.e1bd.1bce
124124 ::
125125 ++ linear-star-release
126− 0x0
126+ 0x1f8e.dd03.1ee4.1474.0aed.b39b.84fb.8f2f.66ca.422f
127127 ::
128128 ++ conditional-star-release
129129 0x0
130130 ::
131131 ++ delegated-sending
132− 0x0
132+ 0x3e8c.a510.354b.c2fd.bbd6.1502.52d9.3105.c9c2.7bbe
133133 ::
134134 ++ naive
135− 0x56e3.7137.cdaf.c026.a732.e8e8.40cd.621e.d50b.d210
135+ 0xe7cf.4b83.06d3.11ba.ca15.585f.e3f0.7cd0.441c.21d1
136136 ::
137− ++ launch 7.834.742
138− ++ public 7.834.800
139− ++ chain-id 5
137+ ++ launch 4.601.630
138+ ++ public launch
139+ ++ chain-id 3
140140 --
141141 ::
142142 :: Local contract addresses
base-desk/lib/azimuthio.hoon+3−3
@@ -43,8 +43,8 @@
4343 url=url
4444 header-list=['Content-Type'^'application/json' ~]
4545 ^= body
46− %- some %- as-octs:mimes:html
47− %- en:json:html
46+ %- some %- as-octt:mimes:html
47+ %- en-json:html
4848 (request-to-json:rpc:ethereum id req)
4949 ==
5050 ;< ~ bind:m (send-request:strandio request)
@@ -62,7 +62,7 @@
6262 ?~ full-file.client-response
6363 (pure:m ~)
6464 =/ body=@t q.data.u.full-file.client-response
65− =/ jon=(unit json) (de:json:html body)
65+ =/ jon=(unit json) (de-json:html body)
6666 ?~ jon
6767 (pure:m ~)
6868 =, dejs-soft:format
base-desk/lib/bitcoin-utils.hoon+1−2
@@ -143,7 +143,6 @@
143143 |= a=@
144144 ^- hexb
145145 =/ l=@ (met 3 a)
146− ?: =(l 0) 1^a
147146 ?: =(l 1) 1^a
148147 ?: =(l 2) (cat:byt ~[1^0xfd (flip:byt 2^a)])
149148 ?: (lte l 4) (cat:byt ~[1^0xfe (flip:byt 4^a)])
@@ -163,7 +162,7 @@
163162 %0xfe 2
164163 %0xff 3
165164 ==
166− :_ (drop:byt (add 1 (bex len)) h)
165+ :_ (drop:byt (add 1 len) h)
167166 %- flip:byt
168167 (take:byt (bex len) (drop:byt 1 h))
169168 :: +dea: atom instead of hexb for parsed CompactSize
base-desk/lib/dbug.hoon+3−9
@@ -4,8 +4,7 @@
44::
55|%
66+$ poke
7− $% [%skip depth=@ud =poke]
8− [%bowl ~]
7+ $% [%bowl ~]
98 [%state grab=cord]
109 [%incoming =about]
1110 [%outgoing =about]
@@ -33,13 +32,8 @@
3332 ?. ?=(%dbug mark)
3433 =^ cards agent (on-poke:ag mark vase)
3534 [cards this]
36− =/ dbug !<(poke vase)
37− =? dbug ?=([%skip %0 *] dbug) poke.dbug
38− ?: ?=(%skip -.dbug)
39− =^ cards agent
40− %+ on-poke:ag %dbug
41− !>(`poke`dbug(depth (dec depth.dbug)))
42− [cards this]
35+ =/ dbug
36+ !<(poke vase)
4337 =; =tang
4438 ((%*(. slog pri 1) tang) [~ this])
4539 ?- -.dbug
base-desk/lib/dill.hoondeleted−94
@@ -1,94 +0,0 @@
1−:: dill: utilities for dill's data structures
2−::
3−=, dill
4−|%
5−++ enjs
6− |%
7− ++ blit
8− |= =blit:dill
9− ^- json
10− =, enjs:format
11− %+ frond -.blit
12− ?- -.blit
13− %bel b+&
14− %clr b+&
15− %hop ?@ p.blit (numb p.blit)
16− (pairs 'x'^(numb x.p.blit) 'y'^(numb y.p.blit) ~)
17− %put a+(turn p.blit |=(c=@c s+(tuft c)))
18− %nel b+&
19− %url s+p.blit
20− %wyp b+&
21− %mor a+(turn p.blit ^blit)
22− ::
23− %sag
24− %- pairs
25− :~ 'path'^(path p.blit)
26− 'file'^s+(en:base64:mimes:html (as-octs:mimes:html (jam q.blit)))
27− ==
28− ::
29− %sav
30− %- pairs
31− :~ 'path'^(path p.blit)
32− 'file'^s+(en:base64:mimes:html (as-octs:mimes:html q.blit))
33− ==
34− ::
35− %klr
36− :- %a
37− %+ turn p.blit
38− |= [=stye text=(list @c)]
39− %- pairs
40− :~ 'text'^a+(turn text |=(c=@c s+(tuft c)))
41− ::
42− :- 'stye'
43− %- pairs
44− |^ :~ 'back'^(color p.q.stye)
45− 'fore'^(color q.q.stye)
46− 'deco'^a+(turn ~(tap in p.stye) |=(d=deco ?~(d ~ s+d)))
47− ==
48− ++ color
49− |= =tint
50− ?@ tint ?~(tint ~ s+tint)
51− =, tint
52− (pairs r+(numb r) g+(numb g) b+(numb b) ~)
53− --
54− ==
55− ==
56− --
57−::
58−++ dejs
59− |%
60− ++ belt
61− |= jon=json
62− ^- belt:dill
63− ?: ?=([%s *] jon)
64− (taft p.jon)
65− =, dejs:format
66− %. jon
67− %- of
68− |^ :* mod+(ot 'mod'^mod 'key'^bot ~)
69− txt+(ar (cu taft so))
70− bol
71− ==
72− ::
73− ++ bol
74− :~ aro+(su (perk %d %l %r %u ~))
75− bac+ul
76− del+ul
77− hit+(ot 'x'^ni 'y'^ni ~)
78− ret+ul
79− ==
80− ::
81− ++ bot
82− |= j=json
83− ^- bolt:dill
84− ?+ j !!
85− [%s *] (taft p.j)
86− [%o *] ((of bol) j)
87− ==
88− ::
89− ++ mod
90− |= j=json
91− ((su (perk %ctl %met %hyp ~)) j)
92− --
93− --
94−--
base-desk/lib/ethereum.hoon+3−9
@@ -652,7 +652,7 @@
652652 :^ url %post
653653 %- ~(gas in *math)
654654 ~['Content-Type'^['application/json']~]
655− (some (as-octs (en:json:html jon)))
655+ (some (as-octt (en-json:html jon)))
656656 :: +light-json-request: like json-request, but for %l
657657 ::
658658 :: TODO: Exorcising +purl from our system is a much longer term effort;
@@ -665,7 +665,7 @@
665665 :* %'POST'
666666 (crip (en-purl:html url))
667667 ~[['content-type' 'application/json']]
668− (some (as-octs (en:json:html jon)))
668+ (some (as-octt (en-json:html jon)))
669669 ==
670670 ::
671671 ++ batch-read-request
@@ -733,7 +733,7 @@
733733 ::
734734 %eth-get-block-by-number
735735 :- 'eth_getBlockByNumber'
736− :~ (tape (num-to-hex-minimal bon.req))
736+ :~ (tape (num-to-hex bon.req))
737737 b+txs.req
738738 ==
739739 ::
@@ -942,12 +942,6 @@
942942 %- render-hex-bytes
943943 (as-octs:mimes:html n)
944944::
945−++ num-to-hex-minimal
946− |= n=@
947− ^- tape
948− %- prefix-hex
949− ((x-co:co 1) n)
950−::
951945++ address-to-hex
952946 |= a=address
953947 ^- tape
base-desk/lib/ethio.hoon+3−3
@@ -76,8 +76,8 @@
7676 header-list=['Content-Type'^'application/json' ~]
7777 ::
7878 ^= body
79− %- some %- as-octs:mimes:html
80− %- en:json:html
79+ %- some %- as-octt:mimes:html
80+ %- en-json:html
8181 a+(turn reqs request-to-json:rpc:ethereum)
8282 ==
8383 ;< ~ bind:m
@@ -96,7 +96,7 @@
9696 ?~ full-file.client-response
9797 (pure:m ~)
9898 =/ body=@t q.data.u.full-file.client-response
99− =/ jon=(unit json) (de:json:html body)
99+ =/ jon=(unit json) (de-json:html body)
100100 ?~ jon
101101 (pure:m ~)
102102 =/ array=(unit (list response:rpc))
base-desk/lib/jose.hoon+3−11
@@ -33,6 +33,7 @@
3333 |^ |=([sor=$-(^ ?) val=json] (apex val sor ""))
3434 :: :: ++apex:en-json:html
3535 ++ apex
36+ =, en-json:html
3637 |= [val=json sor=$-(^ ?) rez=tape]
3738 ^- tape
3839 ?~ val (weld "null" rez)
@@ -45,7 +46,7 @@
4546 |-
4647 ?~ t.p.val ^$(val i.p.val)
4748 ^$(val i.p.val, rez [',' $(p.val t.p.val)])
48− ::
49+ ::
4950 %b (weld ?:(p.val "true" "false") rez)
5051 %n (weld (trip p.val) rez)
5152 %s
@@ -59,7 +60,7 @@
5960 ?: ?=([@ ~] hed)
6061 [i.hed $(viz t.viz)]
6162 (weld hed $(viz t.viz))
62− ::
63+ ::
6364 %o
6465 :- '{'
6566 =. rez ['}' rez]
@@ -73,15 +74,6 @@
7374 =. rez [',' $(viz t.viz)]
7475 ^$(val [%s p.i.viz], rez [':' ^$(val q.i.viz)])
7576 ==
76− ::
77− ++ jesc
78− =+ utf=|=(a=@ ['\\' 'u' ((x-co 4):co a)])
79− |= a=@ ^- tape
80− ?+ a ?:(&((gth a 0x1f) !=(a 0x7f)) [a ~] (utf a))
81− %10 "\\n"
82− %34 "\\\""
83− %92 "\\\\"
84− ==
8577 --
8678:: %/lib/jose
8779::
base-desk/lib/keygen.hoon+1−1
@@ -94,7 +94,7 @@
9494 |= seed=@
9595 ^- edkeys
9696 =+ =< [pub=pub:ex sec=sec:ex]
97− (pit:nu:cric:crypto 256 seed %b ~)
97+ (pit:nu:crub:crypto 256 seed)
9898 :- ^= auth
9999 :- (rsh 3 (end [3 33] pub))
100100 (rsh 3 (end [3 33] sec))
base-desk/lib/language-server/complete.hoon+3−4
@@ -3,8 +3,7 @@
33::
44=/ debug |
55|%
6−++ option
7− |$ [item]
6++* option [item]
87 [term=cord detail=item]
98::
109:: Like +rose except also produces line number
@@ -43,7 +42,7 @@
4342 %+ turn ~(tap by q.r.q.ty)
4443 |= [term =tome]
4544 %+ turn
46− ~(tap by tome)
45+ ~(tap by q.tome)
4746 |= [name=term =hoon]
4847 ^- (pair term type)
4948 ~| term=term
@@ -227,7 +226,7 @@
227226 =* outer-loop $
228227 ?~ tomes
229228 ~
230− =/ arms ~(tap by q.i.tomes)
229+ =/ arms ~(tap by q.q.i.tomes)
231230 |- ^- (unit [term type])
232231 =* inner-loop $
233232 ?~ arms
base-desk/lib/language-server/easy-print.hoon+3−3
@@ -421,11 +421,11 @@
421421 ?:(?=([%plot *] q.yon) [q.hin p.q.yon] [q.hin q.yon ~])
422422 ::
423423 [%core *]
424− ?: ?=([[%$ [[%$ @ *] ~ ~]] ~ ~] q.r.q.sut)
424+ ?: ?=([[%$ * [[%$ @ *] ~ ~]] ~ ~] q.r.q.sut)
425425 =/ dad $(sut p.sut)
426426 :- p.dad
427427 ~! q.r.q.sut
428− [%gate q.n.q.n.q.r.q.sut sut(r.p.q %gold) q.dad]
428+ [%gate q.n.q.q.n.q.r.q.sut sut(r.p.q %gold) q.dad]
429429 =+ yad=$(sut p.sut)
430430 :- p.yad
431431 =+ ^= doy ^- [p=(list @ta) q=wine]
@@ -438,7 +438,7 @@
438438 %^ cat 3
439439 %~ rent co
440440 :+ %$ %ud
441− %- ~(rep by (~(run by q.r.q.sut) |=(tome ~(wyt by +<))))
441+ %- ~(rep by (~(run by q.r.q.sut) |=(tome ~(wyt by q.+<))))
442442 |=([[@ a=@u] b=@u] (add a b))
443443 %^ cat 3
444444 ?-(r.p.q.sut %gold '.', %iron '|', %lead '?', %zinc '&')
base-desk/lib/language-server/rune-snippet.hoon+2−2
@@ -509,8 +509,8 @@
509509 :- '!@'
510510 """
511511 $\{1:wing}
512− $\{2:if-not-exists}
513− $\{3:if-exists}
512+ $\{2:if-exists}
513+ $\{3:if-not-exists}
514514 """
515515 :- '!?'
516516 """
base-desk/lib/noun-diff.hoondeleted−213
@@ -1,213 +0,0 @@
1−=<
2−|%
3−++ diff
4− |= [old=* new=*]
5− ^- patch
6− =/ del (extract-del (oracle old new) old)
7− =/ ins (extract-ins (oracle old new) new)
8− =/ allowed-holes (~(int in (find-del-holes del)) (find-ins-holes ins))
9− =. del (filter-del-holes allowed-holes del)
10− =/ ins (filter-ins-holes allowed-holes ins)
11− =/ closed-patch (closure (gcp [del ins]))
12− ?> =(& +.closed-patch)
13− -.closed-patch
14−++ apply
15− |= [patch=_id noun=*]
16− ?- -.patch
17− %diff
18− =/ var-map (del del.patch noun)
19− (ins ins.patch var-map)
20− ::
21− %cell
22− ?> ?=(^ noun)
23− [$(patch lhs.patch, noun -.noun) $(patch rhs.patch, noun +.noun)]
24− ==
25−++ id
26− ^- patch
27− [%diff [%hole ~] [%hole ~]]
28−+$ patch
29− $% [%cell lhs=patch rhs=patch]
30− [%diff ^diff]
31− ==
32−--
33−::
34−|%
35−+$ del-diff
36− $% [%hole @]
37− [%cell lhs=del-diff rhs=del-diff]
38− [%ignore ~]
39− ==
40−+$ ins-diff
41− $% [%hole @ original=*]
42− [%cell lhs=ins-diff rhs=ins-diff]
43− [%atom @]
44− ==
45−+$ final-ins-diff
46− $% [%hole @]
47− [%cell lhs=final-ins-diff rhs=final-ins-diff]
48− [%atom @]
49− ==
50−+$ diff [del=del-diff ins=final-ins-diff]
51−+$ patch
52− $% [%cell lhs=patch rhs=patch]
53− [%diff diff]
54− ==
55−++ insify-noun
56− |= noun=*
57− ^- final-ins-diff
58− ?- noun
59− ^ [%cell $(noun -.noun) $(noun +.noun)]
60− @ [%atom noun]
61− ==
62−++ empty-set (silt `(list @)`~)
63−++ find-del-holes
64− |= diff=del-diff
65− ~+
66− ^- (set @)
67− ?- -.diff
68− %hole (silt ~[+.diff])
69− %cell (~(uni in $(diff lhs.diff)) $(diff rhs.diff))
70− %ignore empty-set
71− ==
72−++ find-final-ins-holes
73− |= diff=final-ins-diff
74− ~+
75− ^- (set @)
76− ?- -.diff
77− %hole (silt ~[+.diff])
78− %cell (~(uni in $(diff lhs.diff)) $(diff rhs.diff))
79− %atom empty-set
80− ==
81−++ find-ins-holes
82− |= diff=ins-diff
83− ~+
84− ^- (set @)
85− ?- -.diff
86− %hole (silt ~[+<.diff])
87− %cell (~(uni in $(diff lhs.diff)) $(diff rhs.diff))
88− %atom empty-set
89− ==
90−++ filter-del-holes
91− |= [allowed-holes=(set @) diff=del-diff]
92− ^- del-diff
93− ?: ?=(%ignore -.diff) diff
94− ?- -.diff
95− %hole ?:((~(has in allowed-holes) +.diff) diff [%ignore ~])
96− %cell [%cell $(diff +<.diff) $(diff +>.diff)]
97− ==
98−++ filter-ins-holes
99− |= [allowed-holes=(set @) diff=ins-diff]
100− ^- final-ins-diff
101− ?- -.diff
102− %cell [%cell $(diff +<.diff) $(diff +>.diff)]
103− %atom diff
104− %hole
105− ?: (~(has in allowed-holes) +<.diff) [%hole +<.diff]
106− (insify-noun original:diff)
107− ==
108−++ gcp
109− |= diff=diff
110− ^- patch
111− ?- -.ins.diff
112− %atom [%diff diff]
113− %hole [%diff diff]
114− %cell
115− ?. ?=(%cell -.del.diff)
116− [%diff diff]
117− [%cell $(diff [+<.del.diff +<.ins.diff]) $(diff [+>.del.diff +>.ins.diff])]
118− ==
119−++ closure
120− |= =patch
121− ^- [^patch ?]
122− ?- -.patch
123− %diff
124− =/ del-holes (find-del-holes del:patch)
125− =/ ins-holes (find-final-ins-holes ins:patch)
126− =/ difference (~(dif in ins-holes) del-holes)
127− [patch =(difference empty-set)]
128− ::
129− %cell
130− =/ lhs $(patch lhs:patch)
131− =/ rhs $(patch rhs:patch)
132− ?: ?&(+.lhs +.rhs) [[%cell -.lhs -.rhs] &]
133− $(patch (pull-diff [%cell -.lhs -.rhs]))
134− ==
135−++ pull-diff
136− |= =patch
137− ^- [%diff del=del-diff ins=final-ins-diff]
138− ?- -.patch
139− %diff patch
140− %cell
141− =/ pulled-lhs $(patch lhs:patch)
142− =/ pulled-rhs $(patch rhs:patch)
143− :+ %diff
144− [%cell del:pulled-lhs del:pulled-rhs]
145− [%cell ins:pulled-lhs ins:pulled-rhs]
146− ==
147−++ is-subtree
148− |= [tree=* subtree=*]
149− ~+
150− ^- ?
151− ?: =(tree subtree) &
152− ?@ tree |
153− ?| (is-subtree -.tree subtree)
154− (is-subtree +.tree subtree)
155− ==
156−++ oracle
157− |= [a=* b=*]
158− |= subtree=*
159− ^- (unit @)
160− ?: ?& (is-subtree a subtree)
161− (is-subtree b subtree)
162− ==
163− `(mug subtree)
164− ~
165−++ extract-del
166− |= [oracle=$-(* (unit @)) subtree=*]
167− ~+
168− ^- del-diff
169− =/ hash (oracle subtree)
170− ?^ hash [%hole +.hash]
171− ?@ subtree [%ignore ~]
172− [%cell (extract-del oracle -.subtree) (extract-del oracle +.subtree)]
173−++ extract-ins
174− |= [oracle=$-(* (unit @)) subtree=*]
175− ~+
176− ^- ins-diff
177− =/ hash (oracle subtree)
178− ?^ hash [%hole +.hash subtree]
179− ?@ subtree [%atom subtree]
180− [%cell (extract-ins oracle -.subtree) (extract-ins oracle +.subtree)]
181−++ ins
182− |= [diff=final-ins-diff var-map=(map @ *)]
183− ^- *
184− ?- -.diff
185− %atom +.diff
186− %cell [$(diff +<.diff) $(diff +>.diff)]
187− %hole (~(got by var-map) +.diff)
188− ==
189−++ del
190− |= [diff=del-diff noun=*]
191− ^- (map @ *)
192− |^ (go diff noun ((map @ *) ~))
193− ++ go
194− |= [diff=del-diff noun=* var-map=(map @ *)]
195− ^- (map @ *)
196− ?- -.diff
197− %ignore
198− var-map
199− ::
200− %hole
201− =/ subtree (~(get by var-map) +.diff)
202− ?~ subtree (~(put by var-map) +.diff noun)
203− ?> =(+.subtree noun)
204− var-map
205− ::
206− %cell
207− ?> ?=(^ noun)
208− =/ lhs-var-map $(diff +<.diff, noun -.noun)
209− =/ rhs-var-map $(diff +>.diff, noun +.noun, var-map lhs-var-map)
210− rhs-var-map
211− ==
212− --
213−--
base-desk/lib/ph/io.hoon+4−226
@@ -1,5 +1,5 @@
11/- *aquarium, spider
2−/+ libstrand=strand, *strandio, util=ph-util, aqua-azimuth, vere
2+/+ libstrand=strand, *strandio, util=ph-util, aqua-azimuth
33=, strand=strand:libstrand
44|%
55++ send-events
@@ -88,6 +88,7 @@
8888 ^- form:m
8989 (pure:m ~)
9090::
91+::
9192++ init
9293 =/ m (strand ,~)
9394 ^- form:m
@@ -124,8 +125,6 @@
124125 1
125126 +(+.old-rut)
126127 ;< ~ bind:m (send-azimuth-action %breach who)
127− ;< ~ bind:m ?~ old-rut (sleep ~s20) :: XX don't wait if possible
128− (wait-for-sunk her who) :: wait only if previously talked
129128 |- ^- form:m
130129 =* loop $
131130 ;< ~ bind:m (sleep ~s10)
@@ -143,6 +142,7 @@
143142 ?> ?=(%earl (clan:title moon))
144143 ?: fake (init-ship moon &)
145144 =/ m (strand ,~)
145+ ^- form:m
146146 ;< ~ bind:m
147147 %+ dojo (^sein:title moon)
148148 =/ =pass pub:ex:(get-keys:aqua-azimuth moon 1)
@@ -150,46 +150,13 @@
150150 (init-ship moon |)
151151::
152152++ init-ship
153− =| core=?(%mesa %ames) :: XX make %mesa the default core
154153 |= [=ship fake=?]
155154 =/ m (strand ,~)
156155 ^- form:m
157156 ~& > "starting {<ship>}"
158− ;< ~ bind:m (send-events (init:util ship fake ~ core))
157+ ;< ~ bind:m (send-events (init:util ship fake))
159158 (check-ship-booted ship)
160159::
161−++ init-comet
162− =| core=?(%mesa %ames) :: XX make %mesa the default core
163− |= comet=ship
164− =/ m (strand ,~)
165− ^- form:m
166− :: hardcoded for:
167− :: ~londeg-tirlys-somlyd-poltus--pintyn-tarbyl-bicnux-marbud
168− ::
169− =/ =feed:jael
170− :* [%2 ~]
171− who=comet
172− ryf=0
173− :_ ~
174− :- lyf=1
175− key=0wfm.lBEWM.08gfy.AxYjy.8-tBQ.uq-aa.LZt9c.CVQqd.XBJIs.
176− CoG90.BNNGV.1ZmVi.ZbAhY.LuhwC.idNnU.lCVkt.Z4qug.7iY92
177− ==
178− ::
179− ?> ?=(^ (veri:dawn:vere comet feed *point:azimuth-types ~))
180− ~& > "mining comet under {<(^sein:title comet)>}"
181− ;< ~ bind:m (send-events (init:util comet fake=%.n `feed core))
182− (check-ship-booted comet)
183−::
184−:: Load network core protocol
185−::
186−++ load
187− |= [who=ship ore=?(%mesa %ames)]
188− =/ m (strand ,~)
189− ^- form:m
190− ;< ~ bind:m (send-events [%event who [/a/aqua/load %load ore]]~)
191− (pure:m ~)
192−::
193160++ check-ship-booted
194161 |= =ship
195162 =/ m (strand ,~)
@@ -226,129 +193,6 @@
226193 (pure:m ~)
227194 loop
228195::
229−++ wait-for-flub
230− |= [our=ship her=ship dap=term]
231− =/ m (strand ,~)
232− ^- form:m
233− ;< =bowl:spider bind:m get-bowl
234− |- ^- form:m
235− =* loop $
236− ;< [from=^ship =unix-effect] bind:m take-unix-effect
237− ;< now=@da bind:m get-time
238− ?. =(from our)
239− :: our sends the $boon with the halted flow number, at this point
240− :: gall has updated its state adding the app to gall's .halts map
241− :: XX search deeper in the .unix-effect?
242− ::
243− loop
244− =/ aqua-pax
245− :- %i
246− /(scot %p our)/gg/(scot %p our)//(scot %da now)/[%$]/noun
247− =+ ;; flubs=(unit (jug ship term))
248− (scry-aqua:util noun our.bowl now aqua-pax)
249− ?~ flubs loop
250− ?. (~(has ju u.flubs) her dap)
251− loop
252− (pure:m ~)
253−::
254−++ wait-for-spur
255− |= [our=ship her=ship dap=term]
256− =/ m (strand ,~)
257− ^- form:m
258− ;< =bowl:spider bind:m get-bowl
259− |- ^- form:m
260− =* loop $
261− ;< [from=ship =unix-effect] bind:m take-unix-effect
262− ;< now=@da bind:m get-time
263− ?. =(from our)
264− :: our ack to the %spur $boon is sent, at this point
265− :: gall has updated its state adding the app to gall's .flubs map
266− :: XX search deeper in the .unix-effect?
267− ::
268− loop
269− =/ aqua-pax
270− :- %i
271− /(scot %p our)/gg/(scot %p our)//(scot %da now)/[%$]/noun
272− =+ ;; flubs=(unit (jug ship term))
273− (scry-aqua:util noun our.bowl now aqua-pax)
274− ?~ flubs loop
275− ?: (~(has ju u.flubs) her dap)
276− loop
277− (pure:m ~)
278−::
279−++ wait-for-has-halt
280− |= [our=ship her=ship dap=term]
281− =/ m (strand ,~)
282− ^- form:m
283− ;< =bowl:spider bind:m get-bowl
284− |- ^- form:m
285− =* loop $
286− ;< [from=ship =unix-effect] bind:m take-unix-effect
287− ;< now=@da bind:m get-time
288− :: only %send or %push effects
289− ::
290− ?. ?=(?(%send %push) -.q.unix-effect)
291− loop
292− ~& >> from^unix-effect
293− ?. =(from our)
294− :: wait until our ack for the %flub $boon is sent, at this point
295− :: gall has updated its state adding the app to gall's .flubs map
296− :: XX search deeper in the .unix-effect?
297− ::
298− loop
299− =/ aqua-pax
300− :- %i
301− /(scot %p our)/gh/(scot %p our)//(scot %da now)/[%$]/noun
302− =+ ;; halts=(unit (jug app=term [ship =duct]))
303− (scry-aqua:util noun our.bowl now aqua-pax)
304− ?~ halts loop
305− ?. (~(has by u.halts) dap) :: XX check .her as well
306− loop
307− (pure:m ~)
308−::
309−++ wait-for-del-halt
310− |= [our=ship her=ship dap=term]
311− =/ m (strand ,~)
312− ^- form:m
313− ;< =bowl:spider bind:m get-bowl
314− |- ^- form:m
315− =* loop $
316− ;< [from=ship =unix-effect] bind:m take-unix-effect
317− ;< now=@da bind:m get-time
318− ?. =(from our)
319− :: when the %spur $boon has been sent, gall has updated its state deleting
320− :: the app from gall's .flubs map
321− :: XX search deeper in the .unix-effect?
322− ::
323− loop
324− =/ aqua-pax
325− :- %i
326− /(scot %p our)/gh/(scot %p our)//(scot %da now)/[%$]/noun
327− =+ ;; halts=(unit (jug app=term [ship =duct]))
328− (scry-aqua:util noun our.bowl now aqua-pax)
329− ?~ halts loop
330− ?: (~(has by u.halts) dap) :: XX check .her as well
331− loop
332− (pure:m ~)
333−::
334−++ wait-for-pac
335− |= [our=ship to=ship]
336− =/ m (strand ,~)
337− ^- form:m
338− ~& > "waiting for ack: {<[from=our to=to]>}"
339− |- ^- form:m
340− =* loop $
341− ;< [from=ship =unix-effect] bind:m take-unix-effect
342− ?. =(our from)
343− loop
344− :: only %send or %push effects
345− ::
346− ?. ?=(?(%send %push) -.q.unix-effect)
347− loop
348− :: XX check that this is an %ack?
349− :: XX check that this is for .to?
350− ::
351− (pure:m ~)
352196:: Send "|hi" from one ship to another
353197::
354198++ send-hi
@@ -360,64 +204,6 @@
360204::
361205:: Send "|hi" and wait for "not responding" message
362206::
363−++ wait-for-sunk
364− |= [from=@p to=@p]
365− =/ m (strand ,~)
366− (wait-for-output from "{(scow %p to)} has sunk")
367−::
368−++ wait-for-fact
369− |= [=ship =mark =wire gate=$-([mark noun] ?)]
370− =/ m (strand ,noun)
371− ^- form:m
372− ~& > "waiting for fact: {<mark>}"
373− |- ^- form:m
374− =* loop $
375− ;< [her=^ship =unix-effect] bind:m take-unix-effect
376− ?. =(her ship)
377− loop
378− ?. ?& =(wire p.unix-effect)
379− ?=([%unto %raw-fact *] q.unix-effect)
380− =(mark mark.unto.q.unix-effect)
381− (gate mark noun.unto.q.unix-effect)
382− ==
383− loop
384− (pure:m noun.unto.q.unix-effect)
385−::
386−++ wait-for-cork
387− |= [our=ship her=ship flow=(each bone:ames side:ames)]
388− =/ m (strand ,~)
389− ^- form:m
390− ;< =bowl:spider bind:m get-bowl
391− |- ^- form:m
392− =* loop $
393− ;< [from=ship =unix-effect] bind:m take-unix-effect
394− ;< now=@da bind:m get-time
395− :: only %send or %push effects
396− ::
397− ?. ?=(?(%send %push) -.q.unix-effect)
398− loop
399− :: XX check that this is an %ack?
400− ::
401− ?. =(from our)
402− :: wait until the ack for the %cork $plea is sent, at this point
403− :: the publisher has already corked the flow
404− ::
405− loop
406− =/ aqua-pax
407− %+ weld /i/(scot %p our)/ax/(scot %p our)//(scot %da now)
408− ?: ?=(%& -.flow)
409− /corked/(scot %p her)/(scot %ud +.flow)/noun
410− =/ [=bone:ames =dire:ames] +.flow
411− /corked/(scot %p her)/[dire]/(scot %ud bone)/noun
412− =+ ;; corked=(unit ?) (scry-aqua:util noun our.bowl now aqua-pax)
413− ?~ corked loop
414− ?. u.corked :: XX check .her as well
415− loop
416− ~& >> flow-is-corked/flow
417− (pure:m ~)
418−::
419−:: Send "|hi" and wait for "not responding" message
420−::
421207++ send-hi-not-responding
422208 |= [from=@p to=@p]
423209 ~& > 'sending hi not responding'
@@ -470,14 +256,6 @@
470256 ;< ~ bind:m (send-events (insert-files:util her desk [pax warped] ~))
471257 (pure:m warped)
472258::
473−++ copy-file
474− =/ m (strand ,~)
475− |= [her=ship pax=path file=@t]
476− ^- form:m
477− ;< ~ bind:m
478− (send-events (insert-files:util her %base [pax file] ~))
479− (sleep ~s1)
480−::
481259:: Check /sur/aquarium/hoon on the given has the given contents.
482260::
483261++ check-file-touched
base-desk/lib/ph/util.hoon+11−24
@@ -16,11 +16,9 @@
1616:: Start a ship (low-level; prefer +raw-ship)
1717::
1818++ init
19− |= [who=ship ake=? eed=(unit feed:jael) ore=?(%mesa %ames)]
19+ |= [who=ship fake=?]
2020 ^- (list aqua-event)
21− :~ [%init-ship who ake eed]
22− [%event who [/a/aqua/load %load ore]]
23− ==
21+ [%init-ship who fake]~
2422::
2523:: Send dojo command
2624::
@@ -30,8 +28,8 @@
3028 %+ send-events-to who
3129 ^- (list unix-event)
3230 :~
33− [/d/term/1 %belt %mod %ctl `@c`%e]
34− [/d/term/1 %belt %mod %ctl `@c`%u]
31+ [/d/term/1 %belt %ctl `@c`%e]
32+ [/d/term/1 %belt %ctl `@c`%u]
3533 [/d/term/1 %belt %txt ((list @c) what)]
3634 [/d/term/1 %belt %ret ~]
3735 ==
@@ -42,7 +40,7 @@
4240 |= [who=ship what=term]
4341 ^- (list ph-event)
4442 %+ send-events-to who
45− :~ [/d/term/1 %belt %mod %ctl (,@c what)]
43+ :~ [/d/term/1 %belt %ctl (,@c what)]
4644 ==
4745::
4846:: Inject a file into a ship
@@ -64,26 +62,15 @@
6462::TODO should be rename -dill-output
6563++ is-dojo-output
6664 |= [who=ship her=ship uf=unix-effect what=tape]
67− |^
6865 ?& =(who her)
6966 ?=(%blit -.q.uf)
70− (lien p.q.uf handle-blit)
71− ==
72− ::
73− ++ handle-blit
74− |= =blit:dill
75− ^- ?
76− ?: ?=(%mor -.blit)
77− (lien p.blit handle-blit)
78− ?+ -.blit |
79− %put !=(~ (find what p.blit))
8067 ::
81− %klr
82− %+ lien p.blit
83− |= [* q=(list @c)]
84− !=(~ (find what q))
85− ==
86− --
68+ %+ lien p.q.uf
69+ |= =blit:dill
70+ ?. ?=(%lin -.blit)
71+ |
72+ !=(~ (find what p.blit))
73+ ==
8774::
8875:: Test is successful if +is-dojo-output
8976::
base-desk/lib/pill.hoon+17−499
@@ -2,7 +2,6 @@
22::
33/- dice
44^?
5−=<
65|%
76::
87+$ pill
@@ -12,14 +11,6 @@
1211 boot-ova=(list)
1312 kernel-ova=(list unix-event)
1413 userspace-ova=(list unix-event)
15− ==
16− $: %cash
17− $: nam=term
18− boot-ova=(list)
19− kernel-ova=(list unix-event)
20− userspace-ova=(list unix-event)
21− ==
22− cache=(list)
2314 == ==
2415::
2516+$ unix-event
@@ -41,23 +32,25 @@
4132 [/sys/hoon hoon/hoon]
4233 [/sys/arvo hoon/arvo]
4334 ==
44−:: +dirs: filter for userspace directories to include
45−::
46−++ dirs
47− |= [bas=path exc=(list spur)]
48− ^- (list spur)
49− ?~ exc ~(tap in dir:.^(arch %cy bas))
50− %+ skim
51− ~(tap in dir:.^(arch %cy bas))
52− |=(=spur =(~ (find ~[spur] exc)))
5335:: +file-ovum: userspace filesystem load
5436::
5537:: bas: full path to / directory
5638::
5739++ file-ovum
58− |= [des=desk bas=path exc=(list spur)]
40+ =/ directories=(list path)
41+ :~ /app :: %gall applications
42+ /gen :: :dojo generators
43+ /lib :: libraries
44+ /mar :: mark definitions
45+ /sur :: structures
46+ /sys :: system files
47+ /ted :: :spider strands
48+ /web :: %eyre web content
49+ /desk :: desk manifest
50+ ==
51+ |= [des=desk bas=path]
5952 ^- unix-event
60− %. (dirs bas exc)
53+ %. directories
6154 |= :: sal: all spurs to load from
6255 ::
6356 sal=(list spur)
@@ -71,11 +64,7 @@
7164 %- ~(gas by *(map path (each page lobe:clay)))
7265 (turn hav |=([=path =page] [path &+page]))
7366 [/c/sync [%park des &+yuki *rang:clay]]
74− (file-pages bas sal)
75−::
76−++ file-pages
77− |= [bas=path sal=(list spur)]
78− =| hav=(list [path page:clay])
67+ =| hav=(list [path page])
7968 |- ^+ hav
8069 ?~ sal ~
8170 =. hav $(sal t.sal)
@@ -106,43 +95,13 @@
10695::
10796:: +file-ovum2: electric boogaloo
10897::
109−++ file-ovum2 |=(z=[path (list spur)] `unix-event`[//arvo what/(user-files z)])
110−::
111−++ get-wynn
112− |= [sys=path new-wynn=?]
113− ^- wynn
114− ?. new-wynn
115− :~ zuse+zuse
116− lull+lull
117− arvo+arvo
118− hoon+hoon-version
119− ==
120− ~> %bout.[0 %get-wynn]
121− =+ .^(zus=vase %ca (welp sys /zuse/hoon))
122− =+ .^(lul=vase %ca (welp sys /lull/hoon))
123− =+ .^(arv=vase %ca (welp sys /arvo/hoon))
124− =+ .^(hun=vase %ca (welp sys /hoon/hoon))
125− :~ [%zuse ;;(@ud q:(slap zus limb+%zuse))]
126− [%lull ;;(@ud q:(slap lul limb+%lull))]
127− [%arvo ;;(@ud q:(slap arv limb+%arvo))]
128− [%hoon ;;(@ud q:(slap hun limb+%hoon-version))]
129− ==
130−::
131−++ prep-ovum
132− |= dez=(list path)
133− ^- unix-event
134− =- ~& clay-blobs+~(wyt by -)
135− [/c/inflate [%prep -]]
136− %+ roll dez
137− |= [bas=path out=(map lobe:clay page:clay)]
138− %- ~(uni by out)
139− .^(_out %cs (snoc bas %bloc))
98+++ file-ovum2 |=(p=path `unix-event`[//arvo what/(user-files p)])
14099::
141100:: +user-files: all userspace hoon files
142101::
143102++ user-files
144− |= [bas=path exc=(list spur)]
145− %. (dirs bas exc)
103+ |= bas=path
104+ %. directories:file-ovum
146105 |= sal=(list spur)
147106 ^- (list (pair path (cask)))
148107 ::
@@ -176,445 +135,4 @@
176135 |- ^+ hav
177136 ?~ all hav
178137 $(all t.all, hav ^$(tyl [p.i.all tyl]))
179−::
180−::TODO include %prep task in solid and brass?
181−++ solid
182− :: sys: root path to boot system, `/~me/[desk]/now/sys`
183− :: dez: secondary desks and their root paths
184− :: exc: list of desk folders to exclude
185− ::
186− |= [sys=path dez=(list [desk path]) dub=? now=@da prime=? exc=(list spur)]
187− ^- pill
188− =/ bas=path (scag 3 sys)
189− =/ compiler-path (weld sys /hoon)
190− =/ arvo-path (weld sys /arvo)
191− ~& %solid-start
192− =/ compiler-src .^(@t %cx (weld compiler-path /hoon))
193− =/ arvo-src .^(@t %cx (weld arvo-path /hoon))
194− =/ arvo-formula
195− ~& %solid-loaded
196− =/ compiler-hoon (rain compiler-path compiler-src)
197− ?. dub
198− :: compile arvo against hoon, with our current compiler
199− ::
200− =/ whole-hoon=hoon
201− [%tsgr compiler-hoon [%tsgr [%$ 7] (rain arvo-path arvo-src)]]
202− ~& %solid-parsed
203− =/ whole-formula q:(~(mint ut %noun) %noun whole-hoon)
204− ~& %solid-arvo
205− whole-formula
206− :: compile arvo against hoon, with a freshly compiled hoon (via +ride)
207− ::
208− ~& %solid-parsed
209− =/ compiler-formula q:(~(mint ut %noun) %noun compiler-hoon)
210− ~& %solid-compiled
211− =/ whole-src
212− (rap 3 ['=> ' compiler-src '=> +7 ' arvo-src ~])
213− ~& %solid-double-loaded
214− =/ whole-formula
215− =< +
216− .* [%noun whole-src]
217− [%8 compiler-formula [%9 2 %10 [6 %0 3] [%0 2]]]
218− ~& %solid-double-compiled
219− whole-formula
220− ::
221− ~& [%solid-kernel `@ux`(mug arvo-formula)]
222− ::
223− :: installed: Arvo gate (formal interface) with %zuse and vanes installed
224− ::
225− =/ installed
226− =< q
227− %^ spin
228− ^- (list ovum)
229− :- (boot-ovum:pill compiler-src arvo-src)
230− %+ turn
231− (snoc (turn dez tail) bas)
232− |= =path
233− (file-ovum2 [path exc])
234− .*(0 arvo-formula)
235− |= [ovo=ovum ken=*]
236− [~ (slum ken [now ovo])]
237− ::
238− :: kernel-formula
239− ::
240− :: We evaluate :arvo-formula (for jet registration),
241− :: then ignore the result and produce .installed
242− ::
243− =/ kernel-formula
244− [%7 arvo-formula %1 installed]
245− ::
246− :: boot-two: startup formula
247− ::
248− =/ boot-two
249− => *[kernel-formula=^ tale=*]
250− != [.*(0 kernel-formula) tale]
251− ::
252− :: boot-ova
253− ::
254− =/ boot-ova=(list)
255− [aeon:eden:part boot-two kernel-formula ~]
256− ::
257− :: a pill is a 3-tuple of event-lists: [boot kernel userspace]
258− ::
259− :: Our kernel event-list is ~, as we've already installed them.
260− :: Our userspace event-list is a list containing a full %clay
261− :: filesystem sync event.
262− ::
263− :+ %pill %solid
264− :+ boot-ova ~
265− =. dez (snoc dez [%base bas])
266− ;: weld
267− %+ turn dez
268− |= [dek=desk bas=path]
269− (file-ovum [dek bas exc])
270− ::
271− ?. prime ~
272− [(prep-ovum (turn dez tail))]~
273− ::
274− %+ turn dez
275− |= [dek=desk *]
276− ^- unix-event
277− [/c/essential/[dek] %esse dek %.y]
278− ==
279−::
280−++ brass
281− :: sys: root path to boot system, `/~me/[desk]/now/sys`
282− :: dez: secondary desks and their root paths
283− :: exc: list of desk folders to exclude
284− ::
285− |= [sys=path dez=(list [desk path]) cache=? prime=? new-wynn=? exc=(list spur)]
286− ^- pill
287− =/ bas=path (scag 3 sys)
288− :: compiler-source: hoon source file producing compiler, `sys/hoon`
289− ::
290− =+ compiler-source=.^(@t %cx (welp sys /hoon/hoon))
291− ::
292− :: compiler-twig: compiler as hoon expression
293− ::
294− ~& %brass-parsing
295− =+ compiler-twig=(rain /sys/hoon/hoon compiler-source)
296− ~& %brass-parsed
297− ::
298− :: compiler-formula: compiler as nock formula
299− ::
300− ~& %brass-compiling
301− =+ compiler-formula=q:(~(mint ut %noun) %noun compiler-twig)
302− ~& %brass-compiled
303− ::
304− :: arvo-source: hoon source file producing arvo kernel, `sys/arvo`
305− ::
306− =+ arvo-source=.^(@t %cx (welp sys /arvo/hoon))
307− ::
308− :: boot-ova: startup events
309− ::
310− =/ boot-ova=(list)
311− :~ aeon:eden:part
312− boot:eden:part
313− compiler-formula
314− compiler-source
315− arvo-source
316− ==
317− ::
318− =/ kernel-ova=(list unix-event)
319− :~ (boot-ovum compiler-source arvo-source)
320− (file-ovum2 [bas exc])
321− ==
322− ::
323− =/ userspace-ova
324− =. dez (snoc dez [%base bas])
325− ;: weld
326− %+ turn dez
327− |= [dek=desk bas=path]
328− (file-ovum [dek bas exc])
329− ::
330− ?. prime ~
331− [(prep-ovum (turn dez tail))]~
332− ::
333− %+ turn dez
334− |= [dek=desk *]
335− ^- unix-event
336− [/c/essential/[dek] %esse dek %.y]
337− ==
338− ::
339− =/ =wynn (get-wynn sys new-wynn)
340− ::
341− =/ cache=(list)
342− ?. cache ~
343− %~ tap by
344− =< +
345− %- mice
346− :_ [%2 [%0 3] %0 2]
347− ;: weld
348− boot-ova
349− ^- (list)
350− :~ [*@da //arvo %wack *@uvJ]
351− [*@da //arvo %whom *@p]
352− [*@da //arvo %wyrd [~.nonce /] wynn]
353− ==
354− `(list)`(turn kernel-ova (lead *@da))
355− `(list)`[*@da [/d/term/1 %boot & %fake *@p]]^~
356− `(list)`(turn userspace-ova (lead *@da))
357− `(list)`[*@da [/c/init-zest %zeal (turn dez |=([d=desk *] [d %live]))]]^~
358− ==
359− ::
360− ~> %slog.[0 leaf+"brass: cache entries: {<(lent cache)>}"]
361− ::
362− :- %cash
363− :_ cache
364− [%brass boot-ova kernel-ova userspace-ova]
365−::
366−++ ivory
367− |= sys=path
368− ^- pill
369− =/ lib (snoc (scag 3 sys) %lib)
370− |^ =/ ver
371− =/ sub *(trap vase)
372− =. sub (build-sys sub %hoon)
373− =. sub (build-sys sub %arvo)
374− =. sub (build-sys sub %lull)
375− =. sub (build-sys sub %zuse)
376− =. sub (build-lib sub & %ethereum)
377− =. sub (build-lib sub & %azimuth)
378− (build-lib sub | %vere)
379− =/ nok !.
380− => *[ver=(trap vase) ~]
381− != q:$:ver
382− ivory/[nok ver ~]
383− ::
384− ++ build-sys
385− |= [sub=(trap vase) nam=term] ^- (trap vase)
386− ~> %slog.[0 leaf+"ivory: building /sys/{(trip nam)}"]
387− (swat sub (rain /sys/[nam]/hoon .^(@t cx+(welp sys /[nam]/hoon))))
388− ::
389− ++ build-lib
390− |= [sub=(trap vase) imp=? nam=term] ^- (trap vase)
391− ~> %slog.[0 leaf+"ivory: building /lib/{(trip nam)}"]
392− =/ hun=hoon
393− %+ mist /lib/[nam]/hoon
394− .^(@t cx+(welp lib /[nam]/hoon))
395− ?. imp (swat sub hun)
396− (swel sub [%ktts nam hun])
397− :: +mist: +rain but skipping past ford runes
398− ::
399− ++ mist
400− |= [bon=path txt=@]
401− ^- hoon
402− =+ vas=vast
403− ~| bon
404− %+ scan (trip txt)
405− %- full
406− =; fud
407− (ifix [;~(plug gay fud) gay] tall:vas(wer bon))
408− %- star
409− ;~ pose vul
410− %+ ifix [fas (just `@`10)]
411− (star ;~(less (just `@`10) next))
412− ==
413− :: +swel: +swat but with +slop
414− ::
415− ++ swel
416− |= [tap=(trap vase) gen=hoon]
417− ^- (trap vase)
418− =/ gun (~(mint ut p:$:tap) %noun gen)
419− => [tap=tap gun=gun]
420− |. ~+
421− =/ pro q:$:tap
422− [[%cell p.gun p:$:tap] [.*(pro q.gun) pro]]
423− --
424−::
425−++ events
426− |%
427− +$ prop [%prop meta tier (list ovum)]
428− +$ meta term
429− +$ tier ?(%fore %hind) :: before or after userspace
430− ::
431− ++ install
432− |= [as=desk =beak pri=?]
433− ^- prop
434− :^ %prop (rap 3 %install '-' as ~) %hind
435− ::TODO will exclude non-:directories files, such as /changelog/txt
436− =- (murn - same)
437− ^- (list (unit ovum))
438− :~ `(file-ovum as (en-beam beak /) ~)
439− ::
440− ?. pri ~
441− `(prep-ovum (en-beam beak /) ~)
442− ::
443− `[/d/install/[as] [%seat as]]
444− ==
445− --
446−--
447−::
448−~% %non ..part ~
449−:: +mice: %memo hint caching version of mink
450−::
451−|%
452−++ mice !.
453− ~/ %mice
454− |= [subject=* formula=*]
455− =| trace=(list [@ta *])
456− =| memo=(map)
457− =; [ton=tone mem=_memo]
458− ?. ?=(%0 -.ton)
459− [ton ~]
460− [ton mem]
461− |^ ^- [tone _memo]
462− ?+ formula [[%2 trace] memo]
463− [^ *]
464− =^ head memo $(formula -.formula)
465− ?. ?=(%0 -.head) [head memo]
466− =^ tail memo $(formula +.formula)
467− :_ memo
468− ?. ?=(%0 -.tail) tail
469− [%0 product.head product.tail]
470− ::
471− [%0 axis=@]
472− :_ memo
473− =/ part (frag axis.formula subject)
474− ?~ part [%2 trace]
475− [%0 u.part]
476− ::
477− [%1 constant=*]
478− [[%0 constant.formula] memo]
479− ::
480− [%2 subject=* formula=*]
481− =^ subject memo $(formula subject.formula)
482− ?. ?=(%0 -.subject) [subject memo]
483− =^ formula memo $(formula formula.formula)
484− ?. ?=(%0 -.formula) [formula memo]
485− %= $
486− subject product.subject
487− formula product.formula
488− ==
489− ::
490− [%3 argument=*]
491− =^ argument memo $(formula argument.formula)
492− :_ memo
493− ?. ?=(%0 -.argument) argument
494− [%0 .?(product.argument)]
495− ::
496− [%4 argument=*]
497− =^ argument memo $(formula argument.formula)
498− :_ memo
499− ?. ?=(%0 -.argument) argument
500− ?^ product.argument [%2 trace]
501− [%0 .+(product.argument)]
502− ::
503− [%5 a=* b=*]
504− =^ a memo $(formula a.formula)
505− ?. ?=(%0 -.a) [a memo]
506− =^ b memo $(formula b.formula)
507− :_ memo
508− ?. ?=(%0 -.b) b
509− [%0 =(product.a product.b)]
510− ::
511− [%6 test=* yes=* no=*]
512− =^ result memo $(formula test.formula)
513− ?. ?=(%0 -.result) [result memo]
514− ?+ product.result [[%2 trace] memo]
515− %& $(formula yes.formula)
516− %| $(formula no.formula)
517− ==
518− ::
519− [%7 subject=* next=*]
520− =^ subject memo $(formula subject.formula)
521− ?. ?=(%0 -.subject) [subject memo]
522− %= $
523− subject product.subject
524− formula next.formula
525− ==
526− ::
527− [%8 head=* next=*]
528− =^ head memo $(formula head.formula)
529− ?. ?=(%0 -.head) [head memo]
530− %= $
531− subject [product.head subject]
532− formula next.formula
533− ==
534− ::
535− [%9 axis=@ core=*]
536− =^ core memo
537− $(formula core.formula)
538− ?. ?=(%0 -.core) [core memo]
539− =/ arm (frag axis.formula product.core)
540− ?~ arm [[%2 trace] memo]
541− %= $
542− subject product.core
543− formula u.arm
544− ==
545− ::
546− [%10 [axis=@ value=*] target=*]
547− ?: =(0 axis.formula) [[%2 trace] memo]
548− =^ target memo $(formula target.formula)
549− ?. ?=(%0 -.target) [target memo]
550− =^ value memo $(formula value.formula)
551− :_ memo
552− ?. ?=(%0 -.value) value
553− =/ mutant=(unit *)
554− (edit axis.formula product.target product.value)
555− ?~ mutant [%2 trace]
556− [%0 u.mutant]
557− ::
558− [%11 tag=@ next=*]
559− =^ next memo $(formula next.formula)
560− :_ memo
561− ?. ?=(%0 -.next) next
562− :- %0
563− .* subject
564− [11 tag.formula 1 product.next]
565− ::
566− [%11 [tag=@ clue=*] next=*]
567− =^ clue memo $(formula clue.formula)
568− ?. ?=(%0 -.clue) [clue memo]
569− ?: ?=(%memo tag.formula)
570− ?^ hit=(~(get by memo) subject next.formula)
571− [[%0 u.hit] memo]
572− =^ ton memo $(formula next.formula)
573− ?. ?=(%0 -.ton)
574− [ton memo]
575− ?: ?=(?(@ [%clay %ford *]) product.clue)
576− [ton memo]
577− [ton (~(put by memo) [subject next.formula] product.ton)]
578− =^ next memo
579− =? trace
580− ?=(?(%hunk %hand %lose %mean %spot) tag.formula)
581− [[tag.formula product.clue] trace]
582− $(formula next.formula)
583− :_ memo
584− ?. ?=(%0 -.next) next
585− :- %0
586− .* subject
587− [11 [tag.formula 1 product.clue] 1 product.next]
588− ==
589− ::
590− ++ frag
591− |= [axis=@ noun=*]
592− ^- (unit)
593− ?: =(0 axis) ~
594− |- ^- (unit)
595− ?: =(1 axis) `noun
596− ?@ noun ~
597− =/ pick (cap axis)
598− %= $
599− axis (mas axis)
600− noun ?-(pick %2 -.noun, %3 +.noun)
601− ==
602− ::
603− ++ edit
604− |= [axis=@ target=* value=*]
605− ^- (unit)
606− ?: =(1 axis) `value
607− ?@ target ~
608− =/ pick (cap axis)
609− =/ mutant
610− %= $
611− axis (mas axis)
612− target ?-(pick %2 -.target, %3 +.target)
613− ==
614− ?~ mutant ~
615− ?- pick
616− %2 `[u.mutant +.target]
617− %3 `[-.target u.mutant]
618− ==
619− --
620138--
base-desk/lib/ring.hoon+36−36
@@ -18,10 +18,10 @@
1818 ::
1919 ++ generate-public-linkage
2020 |= link-scope=@
21− ^- [data=@ h=@uxpoint]
21+ ^- [data=@ h=@udpoint]
2222 ::
2323 =/ data=@ (mod link-scope l:ed:crypto)
24− =/ h=@uxpoint (scalarmult-base:ed:crypto data)
24+ =/ h=@udpoint (scalarmult-base:ed:crypto data)
2525 [data h]
2626 :: +generate-linkage: linkage information from scope and private key
2727 ::
@@ -30,13 +30,13 @@
3030 :: y: y = [x] * h
3131 ++ generate-linkage
3232 |= [link-scope=(unit @) my-private-key=@]
33− ^- (unit [data=@ h=@uxpoint y=@uxpoint])
33+ ^- (unit [data=@ h=@udpoint y=@udpoint])
3434 ::
3535 ?~ link-scope
3636 ~
3737 ::
38− =+ [data=@ h=@uxpoint]=(generate-public-linkage u.link-scope)
39− =/ y=@uxpoint (scalarmult:ed:crypto my-private-key h)
38+ =+ [data=@ h=@udpoint]=(generate-public-linkage u.link-scope)
39+ =/ y=@udpoint (scalarmult:ed:crypto my-private-key h)
4040 [~ data h y]
4141 :: +generate-challenge: generate challenge from a given message
4242 ::
@@ -47,13 +47,13 @@
4747 ++ generate-challenge
4848 |= $: :: common to both linked and unlinked
4949 message=@
50− g=@uxpoint
50+ g=@udpoint
5151 :: high level universal state
5252 ::
53− link-state=(unit [data=@ h=@uxpoint y=@uxpoint])
53+ link-state=(unit [data=@ h=@udpoint y=@udpoint])
5454 :: point to include in challenge when link-state isn't ~
5555 ::
56− h=(unit @uxpoint)
56+ h=(unit @udpoint)
5757 ==
5858 ^- @
5959 :: concatenate and reduce our message down to a 512-bit hash
@@ -74,9 +74,9 @@
7474 :: +generate-challenges: generates the full list of challenges
7575 ::
7676 ++ generate-challenges
77− |= $: link-state=(unit [data=@ h=@uxpoint y=@uxpoint])
77+ |= $: link-state=(unit [data=@ h=@udpoint y=@udpoint])
7878 message=@
79− public-keys=(list @uxpoint)
79+ public-keys=(list @udpoint)
8080 ss=(list @)
8181 ::
8282 prev-k=@u
@@ -86,14 +86,14 @@
8686 ==
8787 ^- (list @)
8888 ::
89− =/ gs=@uxpoint
89+ =/ gs=@udpoint
9090 %- add-scalarmult-scalarmult-base:ed:crypto :*
9191 prev-ch
9292 (snag prev-k public-keys)
9393 prev-s
9494 ==
9595 ::
96− =/ hs=(unit @uxpoint)
96+ =/ hs=(unit @udpoint)
9797 ?~ link-state
9898 ~
9999 ::
@@ -125,8 +125,8 @@
125125 :: used to generate the (unit point) consumed by +generate-challenge.
126126 ::
127127 ++ scalarmult-h
128− |= [u=@ linkage=(unit [data=@ h=@uxpoint y=@uxpoint])]
129− ^- (unit @uxpoint)
128+ |= [u=@ linkage=(unit [data=@ h=@udpoint y=@udpoint])]
129+ ^- (unit @udpoint)
130130 ?~ linkage
131131 ~
132132 [~ (scalarmult:ed:crypto u h.u.linkage)]
@@ -143,9 +143,9 @@
143143 |= $: message=@
144144 link-scope=(unit @)
145145 ::
146− anonymity-set=(set @uxpoint)
147− my-public-key=@uxpoint
148− my-private-key=@uxscalar
146+ anonymity-set=(set @udpoint)
147+ my-public-key=@udpoint
148+ my-private-key=@udscalar
149149 ::
150150 eny=@uvJ
151151 ==
@@ -157,7 +157,7 @@
157157 (need (find [my-public-key ~] anonymity-list))
158158 :: Generate linkage information if given
159159 ::
160− =/ linkage=(unit [data=@ h=@uxpoint y=@uxpoint])
160+ =/ linkage=(unit [data=@ h=@udpoint y=@udpoint])
161161 (generate-linkage link-scope my-private-key)
162162 :: initialize our random number generator from entropy
163163 ::
@@ -237,7 +237,7 @@
237237 |= $: message=@
238238 link-scope=(unit @)
239239 ::
240− anonymity-set=(set @uxpoint)
240+ anonymity-set=(set @udpoint)
241241 signature=raw-ring-signature
242242 ==
243243 ^- ?
@@ -259,14 +259,14 @@
259259 =/ s2-to-end=(list @) t.t.s.signature
260260 :: anonymity-list: set of public keys listified in ring order
261261 ::
262− =/ anonymity-list=(list @uxpoint)
262+ =/ anonymity-list=(list @udpoint)
263263 ~(tap in anonymity-set)
264264 :: participants: length of :anonymity-list
265265 ::
266266 =/ participants=@u
267267 (lent anonymity-list)
268268 ::
269− =/ z0p=@uxpoint
269+ =/ z0p=@udpoint
270270 %- add-scalarmult-scalarmult-base:ed:crypto :*
271271 ch0.signature
272272 (head anonymity-list)
@@ -275,14 +275,14 @@
275275 :: generate the linkage using public data, and the y point from the
276276 :: signature
277277 ::
278− =/ linkage=(unit [data=@ h=@uxpoint y=@uxpoint])
278+ =/ linkage=(unit [data=@ h=@udpoint y=@udpoint])
279279 ?~ link-scope
280280 ~
281− =+ [data=@ h=@uxpoint]=(generate-public-linkage u.link-scope)
281+ =+ [data=@ h=@udpoint]=(generate-public-linkage u.link-scope)
282282 :- ~
283283 [data h (need y.signature)]
284284 ::
285− =/ z0pp=(unit @uxpoint)
285+ =/ z0pp=(unit @udpoint)
286286 ?~ linkage
287287 ~
288288 :- ~
@@ -319,7 +319,7 @@
319319 :: +seed-to-private-key-scalar: keyfile form to scalar we can multiply with
320320 ::
321321 ++ seed-to-private-key-scalar
322− |= sk=@I ^- @uxscalar
322+ |= sk=@I ^- @udscalar
323323 ?: (gth (met 3 sk) 32) !!
324324 =+ h=(shal (rsh [0 3] b:ed:crypto) sk)
325325 %+ add
@@ -347,7 +347,7 @@
347347 ::
348348 ++ ship-life-to-pubid
349349 |= [our=@p now=@da ship=@p =life]
350− ^- @uxpoint
350+ ^- @udpoint
351351 ::
352352 =/ d=[=^life =pass *]
353353 =/ scry-path=path
@@ -364,14 +364,14 @@
364364 ::
365365 =/ x=[crypt=@ auth=@] (get-public-key-from-pass pass.d)
366366 ::
367− `@uxpoint`auth.x
367+ `@udpoint`auth.x
368368 ::
369369 ++ build-signing-participants
370370 |= [our=@p now=@da invited=(list @p)]
371− ^- [(set [@p life]) (set @uxpoint)]
371+ ^- [(set [@p life]) (set @udpoint)]
372372 ::
373373 =| participants=(set [@p life])
374− =| keys=(set @uxpoint)
374+ =| keys=(set @udpoint)
375375 ::
376376 |-
377377 ?~ invited
@@ -383,7 +383,7 @@
383383 ?~ lyfe
384384 $(invited t.invited)
385385 ::
386− =/ pubkey=@uxpoint (ship-life-to-pubid our now i.invited u.lyfe)
386+ =/ pubkey=@udpoint (ship-life-to-pubid our now i.invited u.lyfe)
387387 ::
388388 =. participants (~(put in participants) [i.invited u.lyfe])
389389 =. keys (~(put in keys) pubkey)
@@ -393,15 +393,15 @@
393393 ::
394394 ++ build-verifying-participants
395395 |= [our=@p now=@da invited=(list [ship=@p =life])]
396− ^- (set @uxpoint)
396+ ^- (set @udpoint)
397397 ::
398− =| keys=(set @uxpoint)
398+ =| keys=(set @udpoint)
399399 ::
400400 |-
401401 ?~ invited
402402 keys
403403 ::
404− =/ pubkey=@uxpoint
404+ =/ pubkey=@udpoint
405405 (ship-life-to-pubid our now ship.i.invited life.i.invited)
406406 =. keys
407407 (~(put in keys) pubkey)
@@ -432,7 +432,7 @@
432432 =/ link-hash=(unit @) (bind link-scope |=(a=* (shaz (jam a))))
433433 :: get everyone's public keys
434434 ::
435− =/ p=[participants=(set [ship=@p =life]) keys=(set @uxpoint)]
435+ =/ p=[participants=(set [ship=@p =life]) keys=(set @udpoint)]
436436 (build-signing-participants:detail our now ~(tap in anonymity-set))
437437 :: get our ships' current life
438438 ::
@@ -448,7 +448,7 @@
448448 +:(get-private-key-from-ring:detail secret-ring)
449449 :: get our ships' public key
450450 ::
451− =/ public-key=@uxpoint
451+ =/ public-key=@udpoint
452452 (ship-life-to-pubid:detail our now our our-life)
453453 ::
454454 :- participants.p
@@ -467,7 +467,7 @@
467467 |= [our=@p now=@da message=* =ring-signature]
468468 ^- ?
469469 ::
470− =/ keys=(set @uxpoint)
470+ =/ keys=(set @udpoint)
471471 %^ build-verifying-participants:detail our now
472472 ~(tap in participants.ring-signature)
473473 ::
base-desk/lib/server.hoon+2−2
@@ -19,7 +19,7 @@
1919++ json-to-octs
2020 |= jon=json
2121 ^- octs
22− (as-octs:mimes:html (en:json:html jon))
22+ (as-octt:mimes:html (en-json:html jon))
2323::
2424++ app
2525 |%
@@ -114,7 +114,7 @@
114114 :_ `octs
115115 [200 [['content-type' 'image/svg+xml'] ?:(cache [max-1-wk ~] ~)]]
116116 ::
117− ++ ico-response
117+ ++ ico-response
118118 |= =octs
119119 ^- simple-payload:http
120120 [[200 [['content-type' 'image/x-icon'] max-1-wk ~]] `octs]
base-desk/lib/shoe.hoon+36−72
@@ -13,15 +13,15 @@
1313/- *sole
1414/+ sole, auto=language-server-complete
1515|%
16−+$ state-2
17− $: %2
18− soles=(map sole-id sole-share)
16++$ state-0
17+ $: %0
18+ soles=(map @ta sole-share)
1919 ==
2020:: $card: standard gall cards plus shoe effects
2121::
2222+$ card
2323 $% card:agent:gall
24− [%shoe sole-ids=(list sole-id) effect=shoe-effect] :: ~ sends to all
24+ [%shoe sole-ids=(list @ta) effect=shoe-effect] :: ~ sends to all soles
2525 ==
2626:: $shoe-effect: easier sole-effects
2727::
@@ -47,30 +47,30 @@
4747 :: if the head of the result is true, instantly run the command
4848 ::
4949 ++ command-parser
50− |~ =sole-id
50+ |~ sole-id=@ta
5151 |~(nail *(like [? command-type]))
5252 :: +tab-list: autocomplete options for the session (to match +command-parser)
5353 ::
5454 ++ tab-list
55− |~ =sole-id
55+ |~ sole-id=@ta
5656 :: (list [@t tank])
5757 *(list (option:auto tank))
5858 :: +on-command: called when a valid command is run
5959 ::
6060 ++ on-command
61− |~ [=sole-id command=command-type]
61+ |~ [sole-id=@ta command=command-type]
6262 *(quip card _^|(..on-init))
6363 ::
6464 ++ can-connect
65− |~ =sole-id
65+ |~ sole-id=@ta
6666 *?
6767 ::
6868 ++ on-connect
69− |~ =sole-id
69+ |~ sole-id=@ta
7070 *(quip card _^|(..on-init))
7171 ::
7272 ++ on-disconnect
73− |~ =sole-id
73+ |~ sole-id=@ta
7474 *(quip card _^|(..on-init))
7575 ::
7676 ::NOTE standard gall agent arms below, though they may produce %shoe cards
@@ -119,27 +119,27 @@
119119 |* [shoe=* command-type=mold]
120120 |_ =bowl:gall
121121 ++ command-parser
122− |= =sole-id
122+ |= sole-id=@ta
123123 (easy *[? command-type])
124124 ::
125125 ++ tab-list
126− |= =sole-id
126+ |= sole-id=@ta
127127 ~
128128 ::
129129 ++ on-command
130− |= [=sole-id command=command-type]
130+ |= [sole-id=@ta command=command-type]
131131 [~ shoe]
132132 ::
133133 ++ can-connect
134− |= =sole-id
134+ |= sole-id=@ta
135135 (team:title [our src]:bowl)
136136 ::
137137 ++ on-connect
138− |= =sole-id
138+ |= sole-id=@ta
139139 [~ shoe]
140140 ::
141141 ++ on-disconnect
142− |= =sole-id
142+ |= sole-id=@ta
143143 [~ shoe]
144144 --
145145:: +agent: creates wrapper core that handles sole events and calls shoe arms
@@ -147,7 +147,7 @@
147147++ agent
148148 |* command-type=mold
149149 |= =(shoe command-type)
150− =| state-2
150+ =| state-0
151151 =* state -
152152 ^- agent:gall
153153 =>
@@ -164,7 +164,8 @@
164164 %+ turn
165165 ?^ sole-ids.card sole-ids.card
166166 ~(tap in ~(key by soles))
167− id-to-path:sole
167+ |= sole-id=@ta
168+ /sole/[sole-id]
168169 ::
169170 %table
170171 =; fez=(list sole-effect)
@@ -188,7 +189,7 @@
188189 =^ cards shoe on-init:og
189190 [(deal cards) this]
190191 ::
191− ++ on-save :(slop !>(%shoe-app) on-save:og !>(state))
192+ ++ on-save !>([%shoe-app on-save:og state])
192193 ::
193194 ++ on-load
194195 |= old-state=vase
@@ -201,45 +202,9 @@
201202 ?. ?=([%shoe-app ^] q.old-state)
202203 =^ cards shoe (on-load:og old-state)
203204 [(deal cards) this]
204− |^ :: versions %0 and %1 stored the inner state double-vased.
205− :: fixing this coincided with the 408 type-of-type migration.
206− ::
207− ?: ?=([%shoe-app * ?(%0 %1) *] q.old-state)
208− =| old-outer=state-any
209− =^ old-inner old-outer
210− +:!<([%shoe-app vase:h136 state-any] old-state)
211− =^ caz shoe (on-load:og (next-vase:h136 old-inner))
212− =^ cuz old-outer
213− ?. ?=(%0 -.old-outer) [~ old-outer]
214− (state-0-to-1 old-outer)
215− =? old-outer ?=(%1 -.old-outer) (state-1-to-2 old-outer)
216− ?> ?=(%2 -.old-outer)
217− [(weld cuz (deal caz)) this(state old-outer)]
218− ::
219− =+ !<(old=state-any (slot 7 old-state))
220− ?> ?=(%2 -.old)
221− =. state old
222− ::
223− =^ caz shoe (on-load:og (slot 6 old-state))
224− [(deal caz) this]
225− ::
226− +$ state-any $%(state-2 state-1 state-0)
227− +$ state-1 _%*(. *state-2 - %1)
228− +$ state-0 [%0 soles=(map @ta sole-share)]
229− ++ state-1-to-2 |=(old=state-1 old(- %2))
230− ++ state-0-to-1
231− |= old=state-0
232− ^- (quip card:agent:gall state-1)
233− :- %+ turn ~(tap in ~(key by soles.old))
234− |= id=@ta
235− ^- card:agent:gall
236− [%give %kick ~[/sole/[id]] ~]
237− :- %1
238− %- ~(gas by *(map sole-id sole-share))
239− %+ murn ~(tap by soles.old)
240− |= [id=@ta s=sole-share]
241− (bind (upgrade-id:sole id) (late s))
242− --
205+ =^ old-inner state +:!<([%shoe-app vase state-0] old-state)
206+ =^ cards shoe (on-load:og old-inner)
207+ [(deal cards) this]
243208 ::
244209 ++ on-poke
245210 |= [=mark =vase]
@@ -361,18 +326,19 @@
361326 ++ on-watch
362327 |= =path
363328 ^- (quip card:agent:gall agent:gall)
364− ?~ sole-id=(path-to-id:sole path)
329+ ?. ?=([%sole @ ~] path)
365330 =^ cards shoe
366331 (on-watch:og path)
367332 [(deal cards) this]
368− ?> (can-connect:og u.sole-id)
369− =. soles (~(put by soles) u.sole-id *sole-share)
333+ =* sole-id i.t.path
334+ ?> (can-connect:og sole-id)
335+ =. soles (~(put by soles) sole-id *sole-share)
370336 =^ cards shoe
371− (on-connect:og u.sole-id)
337+ (on-connect:og sole-id)
372338 :_ this
373339 %- deal
374340 :_ cards
375− [%shoe [u.sole-id]~ %sole %pro & dap.bowl "> "]
341+ [%shoe [sole-id]~ %sole %pro & dap.bowl "> "]
376342 ::
377343 ++ on-leave
378344 |= =path
@@ -422,25 +388,23 @@
422388 =/ cobs=(list [wid=@ud (list tape)])
423389 (turn cows col-as-lines)
424390 =+ [lin=0 any=|]
425− =+ len=(lent cobs)
426391 =| fez=(list sole-effect)
427392 |- ^+ fez
428− =; [line=(list tape) end=@ud]
393+ =; out=tape
429394 :: done when we're past the end of all columns
430395 ::
431− ?: =(len end)
396+ ?: (levy out (cury test ' '))
432397 (flop fez)
433398 =; fec=sole-effect
434399 $(lin +(lin), fez [fec fez])
435− =/ out=tape
436− (zing (join " " line))
437400 ?. bold txt+out
438401 klr+[[`%br ~ ~]^[(crip out)]~]~
439− %^ spin cobs 0
440− |= [[wid=@ud lines=(list tape)] empty=@ud]
402+ %+ roll cobs
403+ |= [[wid=@ud lines=(list tape)] out=tape]
404+ %+ weld out
405+ %+ weld ?~(out "" " ")
441406 =+ l=(swag [lin 1] lines)
442− ?^ l [i.l empty]
443− [(reap wid ' ') +(empty)]
407+ ?^(l i.l (reap wid ' '))
444408 ::
445409 ++ col-as-lines
446410 |= [wid=@ud col=dime]
base-desk/lib/sink.hoondeleted−26
@@ -1,26 +0,0 @@
1−/+ noun-diff
2−|%
3−++ clog
4− |$ [stut]
5− $%
6− [%flush stut]
7− [%drain patch:noun-diff]
8− ==
9−++ sink
10− |* pats=(list path)
11− |* stat=*
12− |@
13− ++ sync
14− |= [stat=_stat]
15− ^- [card:agent:gall _..sync]
16− =/ dif
17− %+ diff:noun-diff ^stat stat
18− :-
19− [%give %fact pats %noun !>(^-((clog) [%drain dif]))]
20− ..sync(stat stat)
21− ++ paths pats
22− ++ flush
23− ^- card:agent:gall
24− [%give %fact pats %noun !>(^-((clog) [%flush stat]))]
25− --
26−--
base-desk/lib/sole.hoon−24
@@ -136,28 +136,4 @@
136136 =+ dat=(transmute [%mor leg] [%ins pos `@c`0])
137137 ?> ?=(%ins -.dat)
138138 p.dat
139−::
140−::
141−++ path-to-id
142− |= =path
143− ^- (unit sole-id)
144− ?. ?=([%sole @ ?(~ [@ ~])] path) ~
145− ?~ who=(slaw %p i.t.path) ~
146− `[u.who ?~(t.t.path %$ i.t.t.path)]
147−::
148−++ id-to-path
149− |= sole-id
150− ^- path
151− ::TODO this whole "no empty path ending" business feels icky.
152− :: do we want default session to be ~.~ ?
153− :: concern here is that outsiders cannot subscribe to the default
154− :: session, because /sole/~zod/ isn't a valid path...
155− [%sole (scot %p who) ?~(ses ~ /[ses])]
156−::
157−++ upgrade-id
158− |= old=@ta
159− ^- (unit sole-id)
160− %+ rush old
161− %+ cook (late %$)
162− ;~(pfix (jest 'drum_~') fed:ag)
163139--
base-desk/lib/sss.hoondeleted−445
@@ -1,445 +0,0 @@
1−/- *sss
2−/+ *mip
3−::
4−|%
5−++ mk-subs :: Create sub-map.
6− |* [=(lake) paths=mold]
7− -:+6:(da lake paths)
8−::
9−++ mk-pubs :: Create pub-map.
10− |* [=(lake) paths=mold]
11− -:+6:(du lake paths)
12−::
13−++ mk-mar :: Create mar.
14− |* =(lake)
15− |_ =(response:poke lake *)
16− ++ grow
17− |%
18− ++ noun response
19− --
20− ++ grab
21− |%
22− ++ noun (response:poke lake *)
23− --
24− ++ grad %noun
25− --
26−++ fled :: Like +sped but head is a path.
27− |= vax=vase
28− ^- vase
29− :_ q.vax
30− %- ~(play ut p.vax)
31− =- [%wtgr [%wtts - [%& 2]~] [%$ 1]]
32− =/ pax ~| %path-none ;;(path -.q.vax)
33− |- ^- spec
34− ?~ pax [%base %null]
35− [%bccl ~[[%leaf %ta -.pax] $(pax +.pax)]]
36−::
37−++ zoom |= =noun ~| %need-path $/sss/;;(path noun)
38−::
39−++ da :: Manage subscriptions.
40− |* [=(lake) paths=mold]
41− =>
42− |%
43− +$ from (on-rock:poke lake paths)
44− +$ into (response:poke lake paths)
45− +$ result (request:poke paths)
46− +$ fail [paths ship dude]
47− +$ flow [=aeon stale=_| fail=_| =rock:lake]
48− +$ subs [%0 (map [ship dude paths] (unit flow))]
49− --
50− |= $: sub=subs
51− =bowl:gall
52− result-type=type
53− on-rock-type=type
54− fail-type=type
55− ==
56− => .(sub +.sub)
57− |%
58− ++ surf :: Subscribe to [ship dude path].
59− |= which=[ship dude paths]
60− ^- (quip card:agent:gall subs)
61− ?+ flow=(~(get by sub) which) `0/sub
62− ~ [~[(pine which)] 0/(~(put by sub) which ~)]
63− [~ ~] [~[(pine which)] 0/sub]
64− [~ ~ [* %& * *]] [~[(pine which)] 0/sub]
65− ==
66− ++ quit (corl (lead %0) ~(del by sub)) :: Unsub from [ship dude path].
67− ++ read :: See current subscribed states.
68− ^- (map [ship dude paths] [stale=? fail=? =rock:lake])
69− %- malt %+ murn ~(tap by sub)
70− |= [key=[ship dude paths] val=(unit flow)]
71− ?~ val ~
72− `[key +.u.val]
73− :: :: Check poke-ack for errors.
74− :: :: If an %sss-on-rock poke nacks,
75− ++ chit :: that state is flagged as failed.
76− |= [[aeon=term ship=term dude=term path=paths] =sign:agent:gall]
77− ^- subs
78− :- %0
79− ?> ?=(%poke-ack -.sign)
80− ?~ p.sign sub
81− %+ ~(jab by sub) [(slav %p ship) dude path]
82− |= (unit flow)
83− =/ =flow (need +<)
84− ?> =(aeon.flow (slav %ud aeon))
85− `flow(fail &)
86− :: :: Check poke-ack for errors.
87− :: :: If a scry request nacks,
88− ++ tell :: that state is flagged as stale.
89− |= [[ship=term =dude aeon=term path=paths] =sign:agent:gall]
90− ^- (quip card:agent:gall subs)
91− ?> ?=(%poke-ack -.sign)
92− ?~ p.sign `0/sub
93− =/ current [ship=(slav %p ship) dude=dude path=path]
94− ?+ flow=(~(get by sub) current) `0/sub
95− [~ ~ *]
96− =. stale.u.u.flow &
97− :_ 0/(~(put by sub) current u.flow)
98− ~[(on-rock-poke fake=& current u.u.flow ~)]
99− ::
100− [~ ~]
101− :_ 0/(~(del by sub) current) :_ ~
102− :* %pass (zoom surf-fail/aeon/ship/dude/path)
103− %agent [our dap]:bowl
104− %poke %sss-surf-fail fail-type ^- fail
105− [path ship dude]:current
106− ==
107− ==
108− ++ apply :: Handle response from publisher.
109− |= res=(response:poke lake paths)
110− ^- (quip card:agent:gall subs)
111− =* current [src.bowl dude.res path.res]
112− =/ old=flow (fall (~(got by sub) current) *flow)
113− ?: ?=(%tomb what.res)
114− =/ =flow old(stale &)
115− :_ 0/(~(put by sub) current `flow) :_ ~
116− (on-rock-poke fake=& current flow ~)
117− ::
118− =/ [wave=(unit wave:lake) new=(unit flow)]
119− ?- what.res
120− %rock ?: (lte aeon.res aeon.old) [~ ~]
121− [~ `[aeon.res | | rock.res]]
122− %wave ?: (lte aeon.res aeon.old) [~ ~]
123− ?> =(aeon.res +(aeon.old))
124− [`wave.res `[aeon.res | | (wash:lake rock.old wave.res)]]
125− ==
126− ?~ new `0/sub
127− :_ 0/(~(put by sub) current new) :_ ~
128− (on-rock-poke fake=& current u.new wave)
129− ::
130− ++ handle-fake-on-rock
131− |= =(on-rock:poke lake paths)
132− ^- (list card:agent:gall)
133− ?~ flow=(~(get by sub) [src from path]:on-rock) ~
134− ?~ u.flow ~
135− ?. =([stale fail rock]:u.u.flow [stale fail rock]:on-rock) ~
136− ~[(on-rock-poke fake=| [src from path]:on-rock u.u.flow wave.on-rock)]
137− ::
138− :: Non-public facing arms below
139− ::
140− ++ pine
141− |= [who=ship which=dude where=paths]
142− ^- card:agent:gall
143− :* %pass (zoom scry-request/(scot %p who)^which^where)
144− %agent [who which]
145− %poke sss-to-pub/[result-type `result`[where dap.bowl]]
146− ==
147− ++ on-rock-poke
148− |= [fake=? [=ship =dude path=paths] flow wave=(unit wave:lake)]
149− ^- card:agent:gall
150− :* %pass %+ zoom ?:(fake %fake %on-rock)
151− (scot %ud aeon)^(scot %p ship)^dude^path
152− %agent [our dap]:bowl
153− %poke ?:(fake %sss-fake-on-rock %sss-on-rock)
154− on-rock-type `from`[path ship dude stale fail rock wave]
155− ==
156− --
157−++ du :: Manage publications.
158− |* [=(lake) paths=mold]
159− =>
160− |%
161− +$ into (request:poke paths)
162− +$ result (response:poke lake paths)
163− +$ rule $~ [`5 5]
164− [horizon=(unit @ud) frequency=@ud] :: Retention policy
165− +$ tide
166− $: rok=((mop aeon rock:lake) gte)
167− wav=((mop aeon wave:lake) lte)
168− rul=rule
169− mem=(jug ship dude)
170− ==
171− +$ buoy
172− $: tid=$~(*tide $@(aeon tide))
173− alo=(unit (set ship))
174− ==
175− ++ pubs
176− =< $>(%1 versioned)
177− |%
178− ++ update
179− |= =versioned
180− ^- pubs
181− ?- -.versioned
182− %1 versioned
183− %0
184− :- %1
185− %- ~(run by +.versioned)
186− |= =buoy-0:^versioned
187− ^- buoy
188− %= buoy-0
189− tid
190− ?@ tid.buoy-0 tid.buoy-0
191− ^- tide
192− %= tid.buoy-0
193− rocks.rul
194− ?: =(waves.rul.tid.buoy-0 0) ~
195− `(mul [+(rocks) waves]:rul.tid.buoy-0)
196− ::
197− mem
198− ^- (jug ship dude)
199− %- ~(run by mem.tid.buoy-0)
200− |= =(map dude @da)
201− ^- (set dude)
202− ~(key by map)
203− ==
204− ==
205− ==
206− ++ versioned
207− =< $% [%0 (map paths buoy-0)]
208− [%1 (map paths buoy)]
209− ==
210− |%
211− +$ buoy-0
212− $: tid=$~(*tide-0 $@(aeon tide-0))
213− alo=(unit (set ship))
214− ==
215− +$ tide-0
216− $: rok=((mop aeon rock:lake) gte)
217− wav=((mop aeon wave:lake) lte)
218− rul=[rocks=@ud waves=@ud]
219− mem=(mip ship dude @da)
220− ==
221− --
222− --
223− --
224− |= [pub=versioned:pubs =bowl:gall result-type=type]
225− => .(pub +:(update:pubs pub))
226− =* rok ((on aeon rock:lake) gte)
227− =* wav ((on aeon wave:lake) lte)
228− |%
229− ++ rule :: Set new retention policy.
230− |= [path=paths =^rule]
231− ^- pubs
232− :- %1
233− %- fall :_ (~(put by pub) path %*(. *$<(aeon buoy) rul.tid rule))
234− %- mole |.
235− %+ ~(jab by pub) path
236− |= =buoy
237− ?@ tid.buoy buoy
238− buoy(tid (form tid.buoy(rul rule)))
239− ::
240− ++ wipe :: Create new rock and wipe rest.
241− |= path=paths
242− ^- pubs
243− :- %1
244− %+ ~(jab by pub) path
245− |= =buoy
246− ?@ tid.buoy buoy
247− %* . buoy(tid (form tid.buoy(rul [`0 1])))
248− rul.tid rul.tid.buoy
249− wav.tid ~
250− ==
251− ++ give :: Give a wave on a path.
252− |= [path=paths =wave:lake]
253− ^- (quip card:agent:gall pubs)
254− ?~ ((soft ^path) path) ~| %need-path !!
255− =/ buoy (~(gut by pub) path *buoy)
256− =? buoy ?=(@ tid.buoy)
257− %*(. buoy(tid *tide) rok.tid (put:rok ~ +(tid.buoy) *rock:lake))
258− ?> ?=(^ tid.buoy)
259− =* tide tid.buoy
260− =/ next=aeon +((latest tide))
261− :- %- zing
262− %+ turn ~(tap by mem.tide)
263− |= [=ship =(set dude)]
264− %+ turn ~(tap in set)
265− |= =dude
266− (send wave/[next wave] ship dude path)
267− :- %1
268− %+ ~(put by pub) path
269− =/ last=[=aeon =rock:lake] (fall (pry:rok rok.tide) *[key val]:rok)
270− =. wav.tide (put:wav wav.tide next wave)
271− =. mem.tide ~
272− ?. =(next (add aeon.last frequency.rul.tide)) buoy
273− buoy(tid (form tide))
274− ::
275− ++ fork :: Fork a pub into an empty path.
276− |= [from=paths to=paths]
277− ^- pubs
278− :- %1
279− ?< (~(has by pub) to)
280− (~(put by pub) to (~(got by pub) from))
281− ::
282− ++ copy :: Fork a sub into an empty path.
283− |= [sub=_(mk-subs lake *) from=[ship dude *] to=paths]
284− ^- pubs
285− :- %1
286− ?< (~(has by pub) to)
287− %+ ~(put by pub) to
288− %* . *$<(aeon buoy)
289− rok.tid (put:rok ~ [aeon rock]:(need (~(got by +:sub) from)))
290− ==
291− ::
292− ++ perm :: Change permissions with gate.
293− |= [where=(list paths) diff=$-((unit (set ship)) (unit (set ship)))]
294− ^- (quip card:agent:gall pubs)
295− %+ edit where
296− |= =buoy
297− =/ new=_alo.buoy (diff alo.buoy)
298− ?@ tid.buoy buoy(alo new)
299− %= buoy
300− alo new
301− mem.tid ?~ new mem.tid.buoy
302− %. mem.tid.buoy
303− ~(int by (malt (turn ~(tap in u.new) (late *(set @)))))
304− ==
305− ++ public (curr perm _~) :: Make list of paths public.
306− ++ secret (curr perm _`~) :: Make list of paths secret.
307− :: :: Block ships from paths.
308− ++ block :: No-ops on public paths.
309− |= [who=(list ship) whence=(list paths)]
310− ^- (quip card:agent:gall pubs)
311− %+ perm whence
312− |= old=(unit (set ship))
313− ?~ old ~ `(~(dif in u.old) (sy who))
314− :: :: Allow ships to paths.
315− ++ allow :: Any public paths will no-op.
316− |= [who=(list ship) where=(list paths)]
317− ^- (quip card:agent:gall pubs)
318− %+ perm where
319− |= old=(unit (set ship))
320− ?~ old ~ `(~(gas in u.old) who)
321− :: :: Kill a list of paths, i.e. tell
322− ++ kill :: subs to not expect updates.
323− (curr edit |=(=buoy buoy(tid (latest tid.buoy))))
324− :: :: Reopen list of killed paths.
325− ++ read :: See current published states.
326− ^- (map paths [allowed=(unit (set ship)) =rock:lake])
327− %- malt %+ murn ~(tap by pub)
328− |= [path=paths =buoy]
329− ^- (unit [paths (unit (set ship)) rock:lake])
330− ?@ tide=tid.buoy ~
331− :^ ~ path alo.buoy =< rock
332− =/ snap=[=aeon =rock:lake] (fall (pry:rok rok.tide) *[key val]:rok)
333− %+ roll (tap:wav (lot:wav wav.tide `aeon.snap ~))
334− |= [[=aeon =wave:lake] =_snap]
335− ?. =(aeon +(aeon.snap)) snap
336− [aeon (wash:lake rock.snap wave)]
337− ::
338− ++ apply :: Handle request from subscriber.
339− |= req=(request:poke paths)
340− ^- (quip card:agent:gall pubs)
341− =/ =buoy (~(gut by pub) path.req *buoy)
342− ?< &(?=(^ alo.buoy) !(~(has in u.alo.buoy) src.bowl))
343− ?@ tid.buoy
344− :_ 1/pub :_ ~
345− (send tomb/~ src.bowl dude.req path.req)
346− :_ 1/pub :_ ~
347− =/ last (fall (pry:rok rok.tid.buoy) *[=key =val]:rok)
348− (send rock/last src.bowl dude.req path.req)
349− ::
350− ++ tell
351− |= [[ship=term =dude aeon=term path=paths] =sign:agent:gall]
352− ^- (quip card:agent:gall pubs)
353− ?> ?=(%poke-ack -.sign)
354− ?^ p.sign `1/pub
355− =/ =buoy (~(gut by pub) path *buoy)
356− ?< &(?=(^ alo.buoy) !(~(has in u.alo.buoy) src.bowl))
357− ?@ tid.buoy
358− :_ 1/pub :_ ~
359− (send tomb/~ src.bowl dude path)
360− ::
361− => .(aeon +((slav %ud aeon)))
362− ?^ dat=(get:wav wav.tid.buoy aeon)
363− :_ 1/pub :_ ~
364− (send wave/[aeon u.dat] src.bowl dude path)
365− =/ last (fall (pry:rok rok.tid.buoy) [=key =val]:rok)
366− ?: (lte aeon key.last)
367− :_ 1/pub :_ ~
368− (send rock/last src.bowl dude path)
369− :- ~
370− :- %1
371− %+ ~(put by pub) path
372− %= buoy
373− mem.tid (~(put ju mem.tid.buoy) src.bowl dude)
374− ==
375− ::
376− :: Non-public facing arms below
377− ::
378− ++ send
379− |= [payload=_|2:*(response:poke lake paths) =ship =dude path=paths]
380− ^- card:agent:gall
381− =* mark (cat 3 %sss- name:lake)
382− =/ callback=^path
383− ?: ?=(%tomb what.payload) (zoom tomb-response/(scot %p ship)^dude^path)
384− (zoom scry-response/(scot %p ship)^dude^(scot %ud aeon.payload)^path)
385− :* %pass callback
386− %agent [ship dude]
387− %poke mark result-type ^- (response:poke lake paths)
388− [path dap.bowl payload]
389− ==
390− ++ latest
391− |= =$@(aeon tide)
392− ^- aeon
393− ?@ tide tide
394− %+ max (fall (bind (pry:rok rok.tide) head) 0)
395− (fall (bind (ram:wav wav.tide) head) 0)
396− ::
397− ++ edit
398− |= [ps=(list paths) edit=$-(buoy buoy)]
399− ^- (quip card:agent:gall pubs)
400− %- ~(rep in (sy ps))
401− |= [path=paths caz=(list card:agent:gall) %1 =_pub]
402− ?~ old=(~(get by pub) path) [caz 1/pub]
403− =/ new=buoy (edit u.old)
404− :_ 1/(~(put by pub) path new)
405− %- weld :_ caz
406− ^- (list card:agent:gall)
407− ?@ tid.u.old ~
408− ?@ tid.new
409− %- zing
410− %+ turn ~(tap by mem.tid.u.old)
411− |= [=ship =(set dude)]
412− (turn ~(tap in set) |=(=dude (send tomb/~ ship dude path)))
413− ?~ alo.new ~
414− =/ new-alo=(jug ship dude)
415− (malt (turn ~(tap in u.alo.new) (late *(set @))))
416− %- zing
417− %+ turn ~(tap by (~(dif by mem.tid.u.old) new-alo))
418− |= [=ship =(set dude)]
419− (turn ~(tap in set) |=(=dude (send tomb/~ ship dude path)))
420− ::
421− ++ form
422− |= =tide
423− ^+ tide
424− =/ max-rock=[=aeon =rock:lake] (fall (pry:rok rok.tide) *[key val]:rok)
425− =/ max-wave (fall (bind (ram:wav wav.tide) head) 0)
426− =? rok.tide :: Create new rock.
427− ?& !=(frequency.rul.tide 0)
428− (gte max-wave (add aeon.max-rock frequency.rul.tide))
429− ==
430− %+ put:rok rok.tide
431− %+ roll (tab:wav wav.tide `aeon.max-rock max-wave)
432− |: [*[now=aeon =wave:lake] `[prev=aeon =rock:lake]`max-rock]
433− ~| %aeon-awry
434− ?> =(now +(prev))
435− [now (wash:lake rock wave)]
436− =. rok.tide
437− ?~ horizon.rul.tide :: Only keep genesis and latest.
438− (gas:rok ~ (murn ~[(ram:rok rok.tide) (pry:rok rok.tide)] same))
439− %^ lot:rok rok.tide :: Delete beyond horizon.
440− ~
441− (mole |.((sub max-wave (max [u.horizon frequency]:rul.tide))))
442− ~| %rock-zero
443− tide(wav (lot:wav wav.tide (bind (ram:rok rok.tide) |=([r=@ *] (dec r))) ~))
444− --
445−--
base-desk/lib/story.hoon+35−11
@@ -38,17 +38,41 @@
3838::
3939:: Canonical textual representation
4040::
41−++ chapter-to-text
42− |= [=tako:clay =proses]
43− ^- wain
44− :- (crip "commit: {<`@uv`tako>}")
45− %- zing
46− %+ join `wain`~['|||']
47− %+ turn ~(tap in proses)
48− |= prose
49− ^- wain
50− %- to-wain:format
51− (rap 3 title '\0a\0a' body ~)
41+++ tako-to-text
42+ |= [=tako:clay]
43+ ^- tape
44+ "commit: {<`@uv`tako>}\0a"
45+::
46+++ proses-to-text
47+ |= [=proses]
48+ ^- tape
49+ =/ proses-list=(list prose) ~(tap in proses)
50+ ?: ?=(~ proses-list) ""
51+ ?: ?=([prose ~] proses-list)
52+ (prose-to-text i.proses-list)
53+ %- tail
54+ %^ spin `(list prose)`t.proses-list
55+ (prose-to-text i.proses-list)
56+ |= [prz=prose state=tape]
57+ ^- [prose tape]
58+ :- prz
59+ ;: welp
60+ state
61+ "|||"
62+ "\0a"
63+ (prose-to-text prz)
64+ ==
65+::
66+++ prose-to-text
67+ |= prz=prose
68+ =/ [title=@t body=@t] prz
69+ ^- tape
70+ ;: welp
71+ "{(trip title)}"
72+ "\0a\0a"
73+ "{(trip body)}"
74+ "\0a"
75+ ==
5276::
5377:: Parsers
5478::
base-desk/lib/strand.hoon+188−1
@@ -1 +1,188 @@
1−rand
1+|%
2++$ card card:agent:gall
3++$ input
4+ $% [%poke =cage]
5+ [%sign =wire =sign-arvo]
6+ [%agent =wire =sign:agent:gall]
7+ [%watch =path]
8+ ==
9++$ strand-input [=bowl in=(unit input)]
10++$ tid @tatid
11++$ bowl
12+ $: our=ship
13+ src=ship
14+ tid=tid
15+ mom=(unit tid)
16+ wex=boat:gall
17+ sup=bitt:gall
18+ eny=@uvJ
19+ now=@da
20+ byk=beak
21+ ==
22+::
23+:: cards: cards to send immediately. These will go out even if a
24+:: later stage of the computation fails, so they shouldn't have
25+:: any semantic effect on the rest of the system.
26+:: Alternately, they may record an entry in contracts with
27+:: enough information to undo the effect if the computation
28+:: fails.
29+:: wait: don't move on, stay here. The next sign should come back
30+:: to this same callback.
31+:: skip: didn't expect this input; drop it down to be handled
32+:: elsewhere
33+:: cont: continue computation with new callback.
34+:: fail: abort computation; don't send effects
35+:: done: finish computation; send effects
36+::
37+++ strand-output-raw
38+ |* a=mold
39+ $~ [~ %done *a]
40+ $: cards=(list card)
41+ $= next
42+ $% [%wait ~]
43+ [%skip ~]
44+ [%cont self=(strand-form-raw a)]
45+ [%fail err=(pair term tang)]
46+ [%done value=a]
47+ ==
48+ ==
49+::
50+++ strand-form-raw
51+ |* a=mold
52+ $-(strand-input (strand-output-raw a))
53+::
54+:: Abort strand computation with error message
55+::
56+++ strand-fail
57+ |= err=(pair term tang)
58+ |= strand-input
59+ [~ %fail err]
60+::
61+:: Asynchronous transcaction monad.
62+::
63+:: Combo of four monads:
64+:: - Reader on input
65+:: - Writer on card
66+:: - Continuation
67+:: - Exception
68+::
69+++ strand
70+ |* a=mold
71+ |%
72+ ++ output (strand-output-raw a)
73+ ::
74+ :: Type of an strand computation.
75+ ::
76+ ++ form (strand-form-raw a)
77+ ::
78+ :: Monadic pure. Identity computation for bind.
79+ ::
80+ ++ pure
81+ |= arg=a
82+ ^- form
83+ |= strand-input
84+ [~ %done arg]
85+ ::
86+ :: Monadic bind. Combines two computations, associatively.
87+ ::
88+ ++ bind
89+ |* b=mold
90+ |= [m-b=(strand-form-raw b) fun=$-(b form)]
91+ ^- form
92+ |= input=strand-input
93+ =/ b-res=(strand-output-raw b)
94+ (m-b input)
95+ ^- output
96+ :- cards.b-res
97+ ?- -.next.b-res
98+ %wait [%wait ~]
99+ %skip [%skip ~]
100+ %cont [%cont ..$(m-b self.next.b-res)]
101+ %fail [%fail err.next.b-res]
102+ %done [%cont (fun value.next.b-res)]
103+ ==
104+ ::
105+ :: The strand monad must be evaluted in a particular way to maintain
106+ :: its monadic character. +take:eval implements this.
107+ ::
108+ ++ eval
109+ |%
110+ :: Indelible state of a strand
111+ ::
112+ +$ eval-form
113+ $: =form
114+ ==
115+ ::
116+ :: Convert initial form to eval-form
117+ ::
118+ ++ from-form
119+ |= =form
120+ ^- eval-form
121+ form
122+ ::
123+ :: The cases of results of +take
124+ ::
125+ +$ eval-result
126+ $% [%next ~]
127+ [%fail err=(pair term tang)]
128+ [%done value=a]
129+ ==
130+ ::
131+ ++ validate-mark
132+ |= [in=* =mark =bowl]
133+ ^- cage
134+ =+ .^ =dais:clay %cb
135+ /(scot %p our.bowl)/[q.byk.bowl]/(scot %da now.bowl)/[mark]
136+ ==
137+ =/ res (mule |.((vale.dais in)))
138+ ?: ?=(%| -.res)
139+ ~|(%spider-mark-fail (mean leaf+"spider: ames vale fail {<mark>}" p.res))
140+ [mark p.res]
141+ ::
142+ :: Take a new sign and run the strand against it
143+ ::
144+ ++ take
145+ :: cards: accumulate throughout recursion the cards to be
146+ :: produced now
147+ =| cards=(list card)
148+ |= [=eval-form =strand-input]
149+ ^- [[(list card) =eval-result] _eval-form]
150+ =* take-loop $
151+ =. in.strand-input
152+ ?~ in.strand-input ~
153+ =/ in u.in.strand-input
154+ ?. ?=(%agent -.in) `in
155+ ?. ?=(%fact -.sign.in) `in
156+ ::
157+ :- ~
158+ :+ %agent wire.in
159+ [%fact (validate-mark q.q.cage.sign.in p.cage.sign.in bowl.strand-input)]
160+ :: run the strand callback
161+ ::
162+ =/ =output (form.eval-form strand-input)
163+ :: add cards to cards
164+ ::
165+ =. cards
166+ %+ welp
167+ cards
168+ :: XX add tag to wires?
169+ cards.output
170+ :: case-wise handle next steps
171+ ::
172+ ?- -.next.output
173+ %wait [[cards %next ~] eval-form]
174+ %skip [[cards %next ~] eval-form]
175+ %fail [[cards %fail err.next.output] eval-form]
176+ %done [[cards %done value.next.output] eval-form]
177+ %cont
178+ :: recurse to run continuation with initialization input
179+ ::
180+ %_ take-loop
181+ form.eval-form self.next.output
182+ strand-input [bowl.strand-input ~]
183+ ==
184+ ==
185+ --
186+ --
187+--
188+::
base-desk/lib/strandio.hoon+13−170
@@ -73,23 +73,21 @@
7373 ^- form:m
7474 |= tin=strand-input:strand
7575 ?+ in.tin `[%skip ~]
76− ~
77− `[%wait ~]
78− ::
76+ ~ `[%wait ~]
7977 [~ %poke @ *]
8078 ?. =(mark p.cage.u.in.tin)
8179 `[%skip ~]
8280 `[%done q.cage.u.in.tin]
8381 ==
8482::
83+::
84+::
8585++ take-sign-arvo
8686 =/ m (strand ,[wire sign-arvo])
8787 ^- form:m
8888 |= tin=strand-input:strand
8989 ?+ in.tin `[%skip ~]
90− ~
91− `[%wait ~]
92− ::
90+ ~ `[%wait ~]
9391 [~ %sign *]
9492 `[%done [wire sign-arvo]:u.in.tin]
9593 ==
@@ -182,53 +180,6 @@
182180 `[%done ~]
183181 `[%fail %timer-error u.error.sign-arvo.u.in.tin]
184182 ==
185−++ take-whey
186− |= =wire
187− =/ m (strand ,[spar:ames fragment-size=@ud num-fragments=@ud])
188− ^- form:m
189− |= tin=strand-input:strand
190− ?+ in.tin `[%skip ~]
191− ~ `[%wait ~]
192− ::
193− [~ %sign * %ames %sage sage=*]
194− ?. =(wire wire.u.in.tin)
195− `[%skip ~]
196− =/ =sage:mess:ames sage.sign-arvo.u.in.tin
197− :^ ~ %done spar=p.sage
198− ?~ q.sage
199− [boq=13 tot=0]
200− =< [boq tot]
201− ;;([%whey boq=@ud tot=@ud] q.sage)
202− ==
203−::
204−++ take-sage
205− |= =wire
206− =/ m (strand ,sage:mess:ames)
207− ^- form:m
208− |= tin=strand-input:strand
209− ?+ in.tin `[%skip ~]
210− ~ `[%wait ~]
211− ::
212− [~ %sign * %ames %sage sage=*]
213− ?. =(wire wire.u.in.tin)
214− `[%skip ~]
215− `[%done sage.sign-arvo.u.in.tin]
216− ==
217−:: XX deprecate in 409k
218−::
219−++ take-near
220− |= =wire
221− =/ m (strand ,[spar:ames (unit (unit page))])
222− ^- form:m
223− |= tin=strand-input:strand
224− ?+ in.tin `[%skip ~]
225− ~ `[%wait ~]
226− ::
227− [~ %sign * %ames %near ^ *]
228− ?. =(wire wire.u.in.tin)
229− `[%skip ~]
230− `[%done +>.sign-arvo.u.in.tin]
231− ==
232183::
233184++ take-poke-ack
234185 |= =wire
@@ -364,78 +315,6 @@
364315 ;< ~ bind:m (send-wait until)
365316 (take-wake `until)
366317::
367−++ mass
368− =/ m (strand ,(list quac:dill))
369− ^- form:m
370− =/ =card:agent:gall [%pass /mass %arvo %d %mass ~]
371− ;< ~ bind:m (send-raw-card card)
372− ;< quz=(list quac:dill) bind:m take-meme
373− (pure:m quz)
374−::
375−++ take-meme
376− =/ m (strand ,(list quac:dill))
377− ^- form:m
378− |= tin=strand-input:strand
379− ?+ in.tin `[%skip ~]
380− ~ `[%wait ~]
381− [~ %sign [%mass ~] %dill %meme *]
382− `[%done p.sign-arvo.u.in.tin]
383− ==
384−::
385−++ keen
386− |= [=wire =spar:ames sec=(unit [@ @])]
387− =/ m (strand ,~)
388− ^- form:m
389− (send-raw-card %pass wire %arvo %a %keen sec spar)
390−::
391−++ chum
392− |= [=wire =spar:ames]
393− =/ m (strand ,~)
394− ^- form:m
395− (send-raw-card %pass wire %arvo %a %chum spar)
396−::
397−++ keen-shut
398− |= [=wire =spar:ames]
399− =/ m (strand ,~)
400− ^- form:m
401− (send-raw-card %pass wire %keen & spar)
402−::
403−++ yawn
404− |= [=wire =spar:ames]
405− =/ m (strand ,~)
406− ^- form:m
407− (send-raw-card %pass wire %arvo %a %yawn spar)
408−::
409−++ whey
410− |= [=wire boq=@ud =spar:ames]
411− =/ m (strand ,~)
412− ^- form:m
413− :: encrypted using %chum namespace
414− ::
415− ;< our=@p bind:m get-our
416− =. path.spar
417− [%a %x '1' %$ %whey (scot %ud boq) (scot %p our) path.spar]
418− (chum wire spar)
419−::
420−++ meta
421− |= [=wire =spar:ames]
422− =/ m (strand ,~)
423− ^- form:m
424− ?+ path.spar !!
425− $% [%ames bone=@ %cork ~]
426− [%ames bone=@ %sent seq=@ ~]
427− [%flow bone=@ =dire:ames %cork ~]
428− [?(%ames %flow) bone=@ =dire:ames ?(%sent %loads %naxp %acked) seq=@ ~]
429− ==
430− :: encrypted using %chum namespace
431− ::
432− ;< our=@p bind:m get-our
433− %- send-raw-card
434− :* %pass wire %arvo %a %chum
435− spar(path [%a %x '1' %$ %meta (scot %p our) path.spar])
436− ==
437− ==
438−::
439318++ sleep
440319 |= for=@dr
441320 =/ m (strand ,~)
@@ -554,6 +433,7 @@
554433 %- pure:m
555434 ?~ full-file.client-response ''
556435 q.data.u.full-file.client-response
436+
557437::
558438++ fetch-cord
559439 |= url=tape
@@ -569,7 +449,7 @@
569449 =/ m (strand ,json)
570450 ^- form:m
571451 ;< =cord bind:m (fetch-cord url)
572− =/ json=(unit json) (de:json:html cord)
452+ =/ json=(unit json) (de-json:html cord)
573453 ?~ json
574454 (strand-fail %json-parse-error ~)
575455 (pure:m u.json)
@@ -594,18 +474,6 @@
594474 (pure:m ~)
595475 ?> =(%vase p.r.u.riot)
596476 (pure:m (some !<(vase q.r.u.riot)))
597−::
598−++ build-file-hard
599− |= [[=ship =desk =case] =spur]
600− =* arg +<
601− =/ m (strand ,vase)
602− ^- form:m
603− ;< =riot:clay
604− bind:m
605− (warp ship desk ~ %sing %a case spur)
606− ?> ?=(^ riot)
607− ?> ?=(%vase p.r.u.riot)
608− (pure:m !<(vase q.r.u.riot))
609477:: +build-mark: build a mark definition to a $dais
610478::
611479++ build-mark
@@ -669,7 +537,7 @@
669537 (take-writ /warp)
670538::
671539++ read-file
672− |= [[=ship =desk =case] =spur]
540+ |= [[=ship =desk =case:clay] =spur]
673541 =* arg +<
674542 =/ m (strand ,cage)
675543 ;< =riot:clay bind:m (warp ship desk ~ %sing %x case spur)
@@ -678,14 +546,13 @@
678546 (pure:m r.u.riot)
679547::
680548++ check-for-file
681− |= [[=ship =desk =case] =spur]
549+ |= [[=ship =desk =case:clay] =spur]
682550 =/ m (strand ,?)
683− ;< =riot:clay bind:m (warp ship desk ~ %sing %u case spur)
684− ?> ?=(^ riot)
685− (pure:m !<(? q.r.u.riot))
551+ ;< =riot:clay bind:m (warp ship desk ~ %sing %x case spur)
552+ (pure:m ?=(^ riot))
686553::
687554++ list-tree
688− |= [[=ship =desk =case] =spur]
555+ |= [[=ship =desk =case:clay] =spur]
689556 =* arg +<
690557 =/ m (strand ,(list path))
691558 ;< =riot:clay bind:m (warp ship desk ~ %sing %t case spur)
@@ -693,14 +560,6 @@
693560 (strand-fail %list-tree >arg< ~)
694561 (pure:m !<((list path) q.r.u.riot))
695562::
696−++ list-desk
697− |= [[=ship =desk =case] =spur]
698− =* arg +<
699− =/ m (strand arch)
700− ;< =riot:clay bind:m (warp ship desk ~ %sing %y case spur)
701− ?~ riot
702− (strand-fail %list-desk >arg< ~)
703− (pure:m !<(arch q.r.u.riot))
704563:: Take Clay read result
705564::
706565++ take-writ
@@ -727,23 +586,6 @@
727586 (poke [who %hood] %helm-hi !>(~))
728587 (pure:m ~)
729588::
730−++ eval-hoon
731− |= [gen=hoon bez=(list beam)]
732− =/ m (strand ,vase)
733− ^- form:m
734− =/ sut=vase !>(..zuse)
735− |-
736− ?~ bez
737− (pure:m (slap sut gen))
738− ;< vax=vase bind:m (build-file-hard i.bez)
739− $(bez t.bez, sut (slop vax sut))
740−::
741−++ send-thread
742− |= [=bear:khan =shed:khan =wire]
743− =/ m (strand ,~)
744− ^- form:m
745− (send-raw-card %pass wire %arvo %k %lard bear shed)
746−::
747589:: Queue on skip, try next on fail %ignore
748590::
749591++ main-loop
@@ -909,10 +751,11 @@
909751 =/ poke-vase !>(`start-args:spider`[`tid.bowl `tid byk.bowl file args])
910752 ;< ~ bind:m (watch-our /awaiting/[tid] %spider /thread-result/[tid])
911753 ;< ~ bind:m (poke-our %spider %spider-start poke-vase)
754+ ;< ~ bind:m (sleep ~s0) :: wait for thread to start
912755 ;< =cage bind:m (take-fact /awaiting/[tid])
913756 ;< ~ bind:m (take-kick /awaiting/[tid])
914757 ?+ p.cage ~|([%strange-thread-result p.cage file tid] !!)
915758 %thread-done (pure:m %& q.cage)
916− %thread-fail (pure:m %| !<([term tang] q.cage))
759+ %thread-fail (pure:m %| ;;([term tang] q.q.cage))
917760 ==
918761--
base-desk/lib/test.hoon+1−54
@@ -38,60 +38,7 @@
3838 =/ b (mule a)
3939 ?- -.b
4040 %| ~
41− %& ['expected failure - succeeded' ~]
42− ==
43−:: +expect-success: kicks a trap, expecting success; returns trace on failure
44−::
45−++ expect-success
46− |= a=(trap)
47− ^- tang
48− =/ b (mule a)
49− ?- -.b
50− %& ~
51− %| ['expected success - failed' p.b]
52− ==
53−::
54−:: +expect-fail-message: kicks a trap, expecting crash, compares the resulting error message
55−++ expect-fail-message
56− |= [msg=@t a=(trap)]
57− ^- tang
58− =/ b (mule a)
59− ?- -.b
60− %| |^
61− =/ =tang (flatten +.b)
62− ?: ?=(^ (find (trip msg) tang))
63− ~
64− ['expected error message - not found' ~]
65− ++ flatten
66− |= tang=(list tank)
67− =| res=tape
68− |- ^- tape
69− ?~ tang res
70− $(tang t.tang, res (weld ~(ram re i.tang) res))
71− --
72− %& ['expected failure - succeeded' ~]
73− ==
74−:: $a-test-chain: a sequence of tests to be run
75−::
76−:: NB: arms shouldn't start with `test-` so that `-test % ~` runs
77−::
78−+$ a-test-chain
79− $_
80− |?
81− ?: =(0 0)
82− [%& p=*tang]
83− [%| p=[tang=*tang next=^?(..$)]]
84−:: +run-chain: run a sequence of tests, stopping at first failure
85−::
86−++ run-chain
87− |= seq=a-test-chain
88− ^- tang
89− =/ res $:seq
90− ?- -.res
91− %& p.res
92− %| ?. =(~ tang.p.res)
93− tang.p.res
94− $(seq next.p.res)
41+ %& [leaf+"expected failure - succeeded" ~]
9542 ==
9643:: +category: prepends a name to an error result; passes successes unchanged
9744::
base-desk/lib/verb.hoon+11−88
@@ -1,6 +1,6 @@
11:: Print what your agent is doing.
22::
3−/- *verb
3+/- verb
44::
55|= [loud=? =agent:gall]
66=| bowl-print=_|
@@ -14,10 +14,7 @@
1414 ^- (quip card:agent:gall agent:gall)
1515 %- (print bowl |.("{<dap.bowl>}: on-init"))
1616 =^ cards agent on-init:ag
17− :_ this
18− :_ :_ cards
19− (emit-event %on-init ~)
20− (emit-event-plus bowl [%on-init ~] cards)
17+ [[(emit-event %on-init ~) cards] this]
2118::
2219++ on-save
2320 ^- vase
@@ -29,10 +26,7 @@
2926 ^- (quip card:agent:gall agent:gall)
3027 %- (print bowl |.("{<dap.bowl>}: on-load"))
3128 =^ cards agent (on-load:ag old-state)
32− :_ this
33− :_ :_ cards
34− (emit-event %on-load ~)
35− (emit-event-plus bowl [%on-load ~] cards)
29+ [[(emit-event %on-load ~) cards] this]
3630::
3731++ on-poke
3832 |= [=mark =vase]
@@ -44,23 +38,17 @@
4438 %bowl `this(bowl-print !bowl-print)
4539 ==
4640 =^ cards agent (on-poke:ag mark vase)
47− :_ this
48− :_ :_ cards
49− (emit-event %on-poke mark)
50− (emit-event-plus bowl [%on-poke mark (mug q.vase)] cards)
41+ [[(emit-event %on-poke mark) cards] this]
5142::
5243++ on-watch
5344 |= =path
5445 ^- (quip card:agent:gall agent:gall)
5546 %- (print bowl |.("{<dap.bowl>}: on-watch on path {<path>}"))
5647 =^ cards agent
57− ?: ?=([%verb ?(%events %events-plus) ~] path)
48+ ?: ?=([%verb %events ~] path)
5849 [~ agent]
5950 (on-watch:ag path)
60− :_ this
61− :_ :_ cards
62− (emit-event %on-watch path)
63− (emit-event-plus bowl [%on-watch path] cards)
51+ [[(emit-event %on-watch path) cards] this]
6452::
6553++ on-leave
6654 |= =path
@@ -69,10 +57,7 @@
6957 ?: ?=([%verb %event ~] path)
7058 [~ this]
7159 =^ cards agent (on-leave:ag path)
72− :_ this
73− :_ :_ cards
74− (emit-event %on-leave path)
75− (emit-event-plus bowl [%on-leave path] cards)
60+ [[(emit-event %on-leave path) cards] this]
7661::
7762++ on-peek
7863 |= =path
@@ -85,17 +70,7 @@
8570 ^- (quip card:agent:gall agent:gall)
8671 %- (print bowl |.("{<dap.bowl>}: on-agent on wire {<wire>}, {<-.sign>}"))
8772 =^ cards agent (on-agent:ag wire sign)
88− :_ this
89− :_ :_ cards
90− (emit-event %on-agent wire -.sign)
91− =; =^sign
92− (emit-event-plus bowl [%on-agent wire sign] cards)
93− ?- -.sign
94− %poke-ack [%poke-ack ?=(~ p.sign)]
95− %watch-ack [%watch-ack ?=(~ p.sign)]
96− %kick [%kick ~]
97− %fact [%fact p.cage.sign (mug q.q.cage.sign)]
98− ==
73+ [[(emit-event %on-agent wire -.sign) cards] this]
9974::
10075++ on-arvo
10176 |= [=wire =sign-arvo]
@@ -103,20 +78,14 @@
10378 %- %+ print bowl |.
10479 "{<dap.bowl>}: on-arvo on wire {<wire>}, {<[- +<]:sign-arvo>}"
10580 =^ cards agent (on-arvo:ag wire sign-arvo)
106− :_ this
107− :_ :_ cards
108− (emit-event %on-arvo wire [- +<]:sign-arvo)
109− (emit-event-plus bowl [%on-arvo wire [- +<]:sign-arvo] cards)
81+ [[(emit-event %on-arvo wire [- +<]:sign-arvo) cards] this]
11082::
11183++ on-fail
11284 |= [=term =tang]
11385 ^- (quip card:agent:gall agent:gall)
11486 %- (print bowl |.("{<dap.bowl>}: on-fail with term {<term>}"))
11587 =^ cards agent (on-fail:ag term tang)
116− :_ this
117− :_ :_ cards
118− (emit-event %on-fail term)
119− (emit-event-plus bowl [%on-fail term] cards)
88+ [[(emit-event %on-fail term) cards] this]
12089--
12190::
12291++ print
@@ -130,53 +99,7 @@
13099 same
131100::
132101++ emit-event
133− |= =event
102+ |= =event:verb
134103 ^- card:agent:gall
135104 [%give %fact ~[/verb/events] %verb-event !>(event)]
136−::
137−++ emit-event-plus
138− |= [=bowl:gall =cause cards=(list card:agent:gall)]
139− ^- card:agent:gall
140− =; event=event-plus
141− [%give %fact ~[/verb/events-plus] %verb-event-plus !>(event)]
142− =- [act.bowl now.bowl src.bowl sap.bowl cause -]
143− %+ turn cards
144− |= =card:agent:gall
145− ^- effect
146− ::TODO for %fact, %kick, could calculate how many ships affected
147− ?- card
148− [%pass * %agent * ?(%poke %poke-as) *]
149− =, q.card
150− =/ =cage ?-(-.task.q.card %poke cage.task, %poke-as [mark.task q.cage.task])
151− [%poke p.card [ship name] p.cage `@`(mug q.q.cage)]
152− ::
153− [%pass * %agent * ?(%watch %watch-as) *]
154− =, q.card
155− =/ =path ?-(-.task.q.card %watch path.task, %watch-as path.task)
156− [%watch p.card [ship name] path]
157− ::
158− [%pass * %agent * %leave *]
159− =, q.card
160− [%leave p.card [ship name]]
161− ::
162− [%give %fact *]
163− =, p.card
164− [%fact paths p.cage (mug q.q.cage)]
165− ::
166− [%give %kick *]
167− [%kick paths.p.card]
168− ::
169− [%give ?(%poke-ack %watch-ack) *]
170− ~| %explicit-ack
171− !! :: shouldn't be given explicitly
172− ::
173− [%pass * %arvo *]
174− [%arvo p.card -.q.card +<.q.card]
175− ::
176− [%pass *]
177− [%arvo p.card %$ -.q.card]
178− ::
179− [%slip *]
180− $(card [%pass //slip p.card])
181− ==
182105--
base-desk/mar/belt.hoon+12−3
@@ -1,7 +1,5 @@
11:: belt: runtime belt structure
22::
3−/+ dill
4−::
53|_ =belt:dill
64++ grad %noun
75:: +grab: convert from
@@ -9,7 +7,18 @@
97++ grab
108 |%
119 ++ noun belt:dill
12− ++ json belt:dejs:dill
10+ ++ json
11+ ^- $-(^json belt:dill)
12+ =, dejs:format
13+ %- of
14+ :~ aro+(su (perk %d %l %r %u ~))
15+ bac+ul
16+ ctl+(cu taft so)
17+ del+ul
18+ met+(cu taft so)
19+ ret+ul
20+ txt+(ar (cu taft so))
21+ ==
1322 --
1423:: +grow: convert to
1524::
base-desk/mar/blit.hoon+44−3
@@ -1,7 +1,5 @@
11:: blit: runtime blit structure
22::
3−/+ dill
4−::
53|_ =blit:dill
64++ grad %noun
75:: +grab: convert from
@@ -15,6 +13,49 @@
1513++ grow
1614 |%
1715 ++ noun blit
18− ++ json (blit:enjs:dill blit)
16+ ++ json
17+ ^- ^json
18+ =, enjs:format
19+ %+ frond -.blit
20+ ?- -.blit
21+ %bel b+&
22+ %clr b+&
23+ %hop (numb p.blit)
24+ %lin a+(turn p.blit |=(c=@c s+(tuft c)))
25+ %mor b+&
26+ %url s+p.blit
27+ ::
28+ %sag
29+ %- pairs
30+ :~ 'path'^(path p.blit)
31+ 'file'^s+(en:base64:mimes:html (as-octs:mimes:html (jam q.blit)))
32+ ==
33+ ::
34+ %sav
35+ %- pairs
36+ :~ 'path'^(path p.blit)
37+ 'file'^s+(en:base64:mimes:html (as-octs:mimes:html q.blit))
38+ ==
39+ ::
40+ %klr
41+ :- %a
42+ %+ turn p.blit
43+ |= [=stye text=(list @c)]
44+ %- pairs
45+ :~ 'text'^a+(turn text |=(c=@c s+(tuft c)))
46+ ::
47+ :- 'stye'
48+ %- pairs
49+ |^ :~ 'back'^(color p.q.stye)
50+ 'fore'^(color q.q.stye)
51+ 'deco'^a+(turn ~(tap in p.stye) |=(d=deco ?~(d ~ s+d)))
52+ ==
53+ ++ color
54+ |= =tint
55+ ?@ tint ?~(tint ~ s+tint)
56+ s+(crip ((x-co:co 6) (rep 3 ~[b g r]:tint)))
57+ --
58+ ==
59+ ==
1960 --
2061--
base-desk/mar/css.hoon+5−9
@@ -6,15 +6,11 @@
66=, mimes:html
77|_ mud=@t
88++ grow :: convert to
9− |%
10− ++ mime [/text/css (as-octs mud)] :: convert to %mime
11− ++ hymn :: convert to %hymn
12− |^ html
13− ++ style ;style
14− ;- (trip mud)
15− ==
16− ++ html ;html:(head:"{style}" body)
17− --
9+ |% ++ mime [/text/css (as-octs mud)] :: convert to %mime
10+ ++ elem ;style :: convert to %hymn
11+ ;- (trip mud)
12+ ==
13+ ++ hymn ;html:(head:"{elem}" body)
1814 --
1915++ grab
2016 |% :: convert from
base-desk/mar/hoon.hoon+31−285
@@ -1,295 +1,41 @@
1+:::: /hoon/hoon/mar
2+ ::
3+/? 310
4+::
5+=, eyre
16|_ own=@t
27::
38++ grow :: convert to
49 |%
510 ++ mime `^mime`[/text/x-hoon (as-octs:mimes:html own)] :: convert to %mime
11+ ++ elem :: convert to %html
12+ ;div:pre(urb_codemirror "", mode "hoon"):"{(trip own)}"
13+ :: =+ gen-id="src-{<`@ui`(mug own)>}"
14+ :: ;div
15+ :: ;textarea(id "{gen-id}"):"{(trip own)}"
16+ :: ;script:"""
17+ :: CodeMirror.fromTextArea(
18+ :: window[{<gen-id>}],
19+ :: \{lineNumbers:true, readOnly:true}
20+ :: )
21+ :: """
22+ :: ==
623 ++ hymn
7− ^- manx
8− =/ to-wall
9− |= =tape
10− ^- wall
11− %+ roll (flop tape)
12− |= [char=@tD =wall]
13− ?~ wall
14− [[char ~] ~]
15− ?: =('\0a' char)
16− [~ wall]
17− [[char i.wall] t.wall]
18− ::
19− =/ src=tape (trip own)
20− =/ count=@ud (lent (to-wall src))
21− =; [style=tape script=tape]
22− ;html
23− ;head
24− ;title: source
25− ;meta(charset "utf-8");
26− ;meta(name "viewport", content "width=device-width, initial-scale=1");
27− ;style: {style}
28− ==
29− ;body
30− ;div.viewer
31− :: ;div.viewer-bar
32− :: ;span.viewer-name: {(scow %ud count)} lines
33− :: ;button.copy-link(id "copy-link", hidden ""): copy link
34− :: ==
35− ;div.code
36− ;pre.gutter(id "gutter");
37− ;div.code-body
38− ;div(id "hl");
39− ;pre.code-pre(id "code"): {src}
40− ==
41− ==
42− ==
43− ;script: {script}
44− ==
24+ :: ;html:(head:title:"Source" "+{elem}")
25+ ;html
26+ ;head
27+ ;title:"Source"
28+ ;script@"//cdnjs.cloudflare.com/ajax/libs/codemirror/4.3.0/codemirror.js";
29+ ;script@"/lib/syntax/hoon.js";
30+ ;link(rel "stylesheet", href "//cdnjs.cloudflare.com/ajax/libs/".
31+ "codemirror/4.3.0/codemirror.min.css");
32+ ;link/"/lib/syntax/codemirror.css"(rel "stylesheet");
33+ ==
34+ ;body
35+ ;textarea#src:"{(trip own)}"
36+ ;script:'CodeMirror.fromTextArea(src, {lineNumbers:true, readOnly:true})'
4537 ==
46− ::
47− :-
48− ^~ ^= style
49− ^- tape
50− %- trip
51− '''
52− :root {
53− --bg: #fbfbf9;
54− --panel: #ffffff;
55− --gutter-bg: #f3f3ef;
56− --line: #e4e4dd;
57− --fg: #2b2b2b;
58− --fg-dim: #9a9a90;
59− --sel: #fff7d6;
60− --sel-edge: #f1e4a8;
61− --accent: #4a6da7;
62− --lh: 20px;
63− --mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas,
64− "Liberation Mono", "Courier New", monospace;
65− }
66− * { box-sizing: border-box; }
67− html, body {
68− margin: 0;
69− height: 100%;
70− background: var(--bg);
71− color: var(--fg);
72− font-family: var(--mono);
73− -webkit-font-smoothing: antialiased;
74− }
75− .viewer {
76− height: 100vh;
77− display: flex;
78− flex-direction: column;
79− padding: 16px;
80− gap: 12px;
81− }
82− .viewer-bar {
83− flex: 0 0 auto;
84− display: flex;
85− align-items: center;
86− gap: 12px;
87− font-size: 13px;
88− color: var(--fg-dim);
89− }
90− .viewer-name {
91− flex: 1 1 auto;
92− min-width: 0;
93− overflow: hidden;
94− text-overflow: ellipsis;
95− white-space: nowrap;
96− color: var(--fg);
97− }
98− .copy-link {
99− flex: 0 0 auto;
100− padding: 4px 12px;
101− border: 1px solid var(--line);
102− border-radius: 6px;
103− background: var(--panel);
104− color: var(--fg-dim);
105− font: inherit;
106− font-size: 12px;
107− cursor: pointer;
108− transition: color .12s, border-color .12s;
109− }
110− .copy-link:hover { color: var(--accent); border-color: var(--accent); }
111− .copy-link[hidden] { display: none; }
112− .code {
113− flex: 1 1 auto;
114− min-height: 0;
115− display: flex;
116− align-items: flex-start;
117− overflow: auto;
118− background: var(--panel);
119− border: 1px solid var(--line);
120− border-radius: 8px;
121− }
122− .code-body {
123− position: relative;
124− flex: 1 1 auto;
125− min-width: 0;
126− width: max-content;
127− }
128− #gutter, #code {
129− margin: 0;
130− padding: 14px 0;
131− font-family: var(--mono);
132− font-size: 13px;
133− line-height: var(--lh);
134− white-space: pre;
135− tab-size: 2;
136− }
137− #gutter {
138− position: sticky;
139− left: 0;
140− z-index: 2;
141− flex: 0 0 auto;
142− padding-left: 16px;
143− padding-right: 12px;
144− text-align: right;
145− color: var(--fg-dim);
146− background: var(--gutter-bg);
147− border-right: 1px solid var(--line);
148− user-select: none;
149− -webkit-user-select: none;
150− cursor: pointer;
151− }
152− #code {
153− display: block;
154− padding-left: 14px;
155− padding-right: 18px;
156− color: var(--fg);
157− }
158− #hl {
159− position: absolute;
160− left: 0;
161− right: 0;
162− z-index: 0; /* under the text */
163− display: none;
164− background: var(--sel);
165− box-shadow: inset 2px 0 0 var(--sel-edge);
166− pointer-events: none;
167− }
168− #code { position: relative; z-index: 1; } /* text above the bar */
169− :focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; }
170− '''
171− ^~ ^= code
172− ^- tape
173− %- trip
174− '''
175− (function () {
176− "use strict";
177− const panel = document.querySelector(".code"); // the scroll container
178− const code = document.getElementById("code");
179− const gutter = document.getElementById("gutter");
180− const hl = document.getElementById("hl");
181− if (!panel || !code || !gutter || !hl) return;
182− const text = code.textContent;
183− let lineCount = text.length ? text.split("\n").length : 1;
184− if (text.endsWith("\n")) lineCount -= 1;
185− if (lineCount < 1) lineCount = 1;
186− (function fillGutter() {
187− let s = "";
188− for (let i = 1; i <= lineCount; i++) s += i + "\n";
189− gutter.textContent = s;
190− })();
191− let lineH = 0;
192− let codeTop = 0; // code's content-box top padding, the y-origin of line 1
193− function measure() {
194− const cs = getComputedStyle(code);
195− const lh = parseFloat(cs.lineHeight);
196− lineH = isNaN(lh) ? parseFloat(cs.fontSize) * 1.55 : lh;
197− codeTop = parseFloat(cs.paddingTop) || 0;
198− positionHighlight(); // keep the bar correct after a re-measure
199− }
200− let anchor = null;
201− let selLo = 0;
202− let selHi = 0;
203− function positionHighlight() {
204− if (!selLo) { hl.style.display = "none"; return; }
205− hl.style.display = "block";
206− hl.style.top = (codeTop + (selLo - 1) * lineH) + "px";
207− hl.style.height = ((selHi - selLo + 1) * lineH) + "px";
208− }
209− function applySel(lo, hi) {
210− selLo = lo;
211− selHi = hi;
212− positionHighlight();
213− }
214− function deselect() {
215− selLo = selHi = 0;
216− anchor = null;
217− positionHighlight();
218− history.replaceState(null, "", location.pathname + location.search);
219− }
220− function parseHash(hash) {
221− const m = /^#L(\d+)(?:-L(\d+))?$/.exec(hash || "");
222− if (!m) return null;
223− let lo = parseInt(m[1], 10);
224− let hi = m[2] ? parseInt(m[2], 10) : lo;
225− if (hi < lo) { const t = lo; lo = hi; hi = t; }
226− lo = Math.max(1, Math.min(lo, lineCount));
227− hi = Math.max(1, Math.min(hi, lineCount));
228− return [lo, hi];
229− }
230− function setHash(lo, hi) {
231− const frag = lo === hi ? "L" + lo : "L" + lo + "-L" + hi;
232− history.replaceState(null, "", "#" + frag);
233− }
234− function scrollToLine(n) {
235− const y = codeTop + (n - 1) * lineH;
236− if (y < panel.scrollTop || y > panel.scrollTop + panel.clientHeight) {
237− panel.scrollTop = Math.max(0, y - panel.clientHeight / 2);
238− }
239− }
240− function selectFromHash(scroll) {
241− const r = parseHash(location.hash);
242− if (!r) return false;
243− anchor = r[0];
244− applySel(r[0], r[1]);
245− if (scroll) scrollToLine(r[0]);
246− return true;
247− }
248− function lineFromEvent(e) {
249− // y within the code content: pointer relative to the code pre's rendered
250− // top, which already accounts for scroll since getBoundingClientRect is
251− // viewport-relative and the pre moves as the panel scrolls.
252− const rect = code.getBoundingClientRect();
253− const y = e.clientY - rect.top - codeTop;
254− let n = Math.floor(y / lineH) + 1;
255− if (n < 1) n = 1;
256− if (n > lineCount) n = lineCount;
257− return n;
258− }
259− function onClick(e) {
260− const inGutter = e.target === gutter;
261− if (!inGutter && !e.shiftKey) return; // normal text interaction in code
262− const n = lineFromEvent(e);
263− if (!e.shiftKey && selLo === n && selHi === n) {
264− deselect();
265− return;
266− }
267− if (e.shiftKey && anchor !== null) {
268− applySel(Math.min(anchor, n), Math.max(anchor, n));
269− setHash(selLo, selHi);
270− } else {
271− anchor = n;
272− applySel(n, n);
273− setHash(n, n);
274− }
275− }
276− gutter.addEventListener("click", onClick);
277− code.addEventListener("click", onClick);
278− document.addEventListener("keydown", function (e) {
279− if (e.key === "Escape") deselect();
280− });
281− window.addEventListener("hashchange", function () {
282− if (!selectFromHash(true)) deselect();
283− });
284− let rz = null;
285− window.addEventListener("resize", function () {
286− clearTimeout(rz);
287− rz = setTimeout(measure, 100);
288− });
289− measure();
290− selectFromHash(true);
291− })();
292− '''
38+ ==
29339 ++ txt
29440 (to-wain:format own)
29541 --
base-desk/mar/htm.hoon+11−2
@@ -2,5 +2,14 @@
22:::: /hoon/htm/mar
33 ::
44/? 310
5−/= htm /mar/html
6−htm
5+|_ own=manx
6+::
7+++ grad %noun
8+++ grow :: convert to
9+ |%
10+ ++ noun own
11+ ++ hymn own
12+ --
13+++ grab |% :: convert from
14+ ++ noun manx :: clam from %noun
15+-- --
base-desk/mar/httr.hoon+2−1
@@ -5,11 +5,12 @@
55::
66=, eyre
77=, format
8+=, html
89|_ hit=httr
910++ grad %noun
1011++ grow |% ++ wall (turn wain trip)
1112 ++ wain (to-wain cord)
12− ++ json (need (de:json:html cord))
13+ ++ json (need (de-json cord))
1314 ++ cord q:octs
1415 ++ noun hit
1516 ++ octs
base-desk/mar/js.hoon+4−7
@@ -8,13 +8,10 @@
88++ grow
99 |%
1010 ++ mime [/application/javascript (as-octs:mimes:html (@t mud))]
11− ++ hymn :: convert to %hymn
12− |^ html
13− ++ script ;script
14− ;- (trip (@t mud))
15− ==
16− ++ html ;html:(head:"{script}" body)
17− --
11+ ++ elem ;script
12+ ;- (trip (@t mud))
13+ ==
14+ ++ hymn ;html:(head:"+{elem}" body)
1815 --
1916++ grab
2017 |% :: convert from
base-desk/mar/json.hoon+4−4
@@ -8,17 +8,17 @@
88=, eyre
99=, format
1010=, html
11−|_ jon=^json
11+|_ jon=json
1212::
1313++ grow :: convert to
1414 |%
1515 ++ mime [/application/json (as-octs:mimes -:txt)] :: convert to %mime
16− ++ txt [(en:json jon)]~
16+ ++ txt [(crip (en-json jon))]~
1717 --
1818++ grab
1919 |% :: convert from
20− ++ mime |=([p=mite q=octs] (fall (de:json (@t q.q)) *^json))
21− ++ noun ^json :: clam from %noun
20+ ++ mime |=([p=mite q=octs] (fall (rush (@t q.q) apex:de-json) *json))
21+ ++ noun json :: clam from %noun
2222 ++ numb numb:enjs
2323 ++ time time:enjs
2424 --
base-desk/mar/json/rpc/response.hoon+2−1
@@ -16,10 +16,11 @@
1616 ^- response
1717 ~| hit
1818 ?: ?=(%2 (div p.hit 100))
19+ =, html
1920 %- json
2021 ?~ r.hit
2122 a+~
22− (need (de:json:html q:u.r.hit))
23+ (need (de-json q:u.r.hit))
2324 fail+hit
2425 ++ json :: from json
2526 =, dejs-soft:format
base-desk/mar/kelvin.hoondeleted−28
@@ -1,28 +0,0 @@
1−|_ kal=waft:clay
2−++ grow
3− |%
4− ++ mime `^mime`[/text/x-kelvin (as-octs:mimes:html hoon)]
5− ++ noun kal
6− ++ hoon
7− %+ rap 3
8− %+ turn
9− %+ sort
10− ~(tap in (waft-to-wefts:clay kal))
11− |= [a=weft b=weft]
12− ?: =(lal.a lal.b)
13− (gte num.a num.b)
14− (gte lal.a lal.b)
15− |= =weft
16− (rap 3 '[%' (scot %tas lal.weft) ' ' (scot %ud num.weft) ']\0a' ~)
17− ::
18− ++ txt (to-wain:format hoon)
19− --
20−++ grab
21− |%
22− ++ noun waft:clay
23− ++ mime
24− |= [=mite len=@ud tex=@]
25− (cord-to-waft:clay tex)
26− --
27−++ grad %noun
28−--
base-desk/mar/noun.hoon−3
@@ -8,9 +8,6 @@
88++ grab |%
99 ++ noun *
1010 --
11−++ grow |%
12− ++ mime [/application/x-urb-jam (as-octs:mimes:html (jam non))]
13− --
1411++ grad
1512 |%
1613 ++ form %noun
base-desk/mar/sole/action.hoon+1−3
@@ -20,9 +20,7 @@
2020 |= jon=^json ^- sole-action
2121 %- need %. jon
2222 => [dejs-soft:format ..sole-action]
23− |^ (ot id+id dat+(fo %ret (of det+change tab+ni ~)) ~)
24− ++ id
25− (ot who+(su ;~(pfix sig fed:ag)) ses+so ~)
23+ |^ (ot id+so dat+(fo %ret (of det+change tab+ni ~)) ~)
2624 ++ fo
2725 |* [a=term b=fist]
2826 |=(c=json ?.(=([%s a] c) (b c) (some [a ~])))
base-desk/mar/story.hoon+10−5
@@ -46,13 +46,18 @@
4646 [/text/x-urb-story (as-octs:mimes:html (of-wain:format txt))]
4747 ++ txt
4848 ^- wain
49− %- zing
50− %+ join `wain`~['---']
49+ %- snoc :_ '' :: ensures terminating newline is present
5150 %+ murn ~(tap by tale)
52− |= [=tako:clay =proses]
53− ^- (unit wain)
51+ |= [[=tako:clay =proses]]
52+ ^- (unit cord)
5453 ?~ proses ~
55− (some (chapter-to-text tako proses))
54+ %- some
55+ %- crip
56+ ;: welp
57+ (tako-to-text tako)
58+ (proses-to-text proses)
59+ "---"
60+ ==
5661 --
5762++ grab
5863 |% :: convert from
base-desk/mar/tang.hoon+5−5
@@ -16,15 +16,15 @@
1616 %& a+p.result
1717 %| a+[a+[%s '[[output rendering error]]']~]~
1818 ==
19− ++ txt
20− ^- wain
21− %+ turn (flop tan)
22− |=(=tank (crip ~(ram re tank)))
19+ ::
20+ ++ elem
21+ =- ;pre:code:"{(of-wall -)}"
22+ ^- wall %- zing ^- (list wall)
23+ (turn (flop tan) |=(a=tank (wash 0^160 a)))
2324 --
2425++ grab :: convert from
2526 |%
2627 ++ noun (list ^tank) :: clam from %noun
2728 ++ tank |=(a=^tank [a]~)
28− ++ txt |=(=wain (flop (turn wain tank)))
2929 --
3030--
base-desk/mar/thread-fail.hoon+1−1
@@ -1,4 +1,4 @@
1−|_ err=[term tang]
1+|_ err=*
22++ grab
33 |%
44 ++ noun (pair term tang)
base-desk/mar/txt.hoon+1
@@ -18,6 +18,7 @@
1818 => v=.
1919 |%
2020 ++ mime => v [/text/plain (as-octs (of-wain txt))]
21+ ++ elem => v ;pre: {(trip (of-wain txt))}
2122 --
2223++ grad
2324 |%
base-desk/mar/udon.hoon+4
@@ -9,6 +9,10 @@
99 ++ mime [/text/x-unmark (as-octs:mimes:html mud)]
1010 ++ txt
1111 (to-wain:format mud)
12+ ++ elem
13+ ^- manx
14+ =, cram
15+ elm:(static (ream mud))
1216 ++ front :: XX performance, types
1317 ^- (map term knot)
1418 %- ~(run by inf:(static:cram (ream mud)))
base-desk/mar/umd.hoon+4
@@ -9,6 +9,10 @@
99 ++ mime [/text/x-unmark (as-octs:mimes:html mud)]
1010 ++ txt
1111 (to-wain:format mud)
12+ ++ elem
13+ ^- manx
14+ =, cram
15+ elm:(static (ream mud))
1216 ++ front :: XX performance, types
1317 ^- (map term knot)
1418 %- ~(run by inf:(static:cram (ream mud)))
base-desk/mar/urb.hoon+1−1
@@ -1,5 +1,5 @@
11::
2−:::: /hoon/urb/mar
2+:::: /hoon/elem/urb/mar
33 ::
44/? 310
55=, mimes:html
base-desk/sources.txt+3−2
@@ -1,3 +1,4 @@
11urbit-src/pkg/base-dev
2−urbit-src/pkg/landscape
3−urbit-src/pkg/arvo
2+urbit-src/pkg/garden-dev
3+urbit-src/pkg/arvo/lib/naive
4+urbit-src/pkg/arvo/lib/tiny
base-desk/sur/aquarium.hoon+4−8
@@ -10,6 +10,8 @@
1010:: Short names are simply the first letter of each word plus `s` if
1111:: it's a list.
1212::
13+/+ pill
14+=, pill-lib=pill
1315|%
1416+$ az-log [topics=(lest @) data=@t]
1517+$ az-state
@@ -32,13 +34,13 @@
3234 [%verb p=(unit ?)]
3335 task-arvo
3436 ==
37++$ pill pill:pill-lib
3538::
3639+$ aqua-event
37− $% [%init-ship who=ship fake=? feed=(unit feed:jael)]
40+ $% [%init-ship who=ship fake=?]
3841 [%pause-events who=ship]
3942 [%snap-ships lab=term hers=(list ship)]
4043 [%restore-snap lab=term]
41− [%read [from=[=ship life=@ubC] =path] for=[=lane:ames life=@ubC] num=@ud]
4244 [%event who=ship ue=unix-event]
4345 ==
4446::
@@ -71,9 +73,6 @@
7173 %+ pair wire
7274 $% [%blit p=(list blit:dill)]
7375 [%send p=lane:ames q=@]
74− [%push p=(list lane:pact:ames) q=@]
75− [%saxo sponsors=(list ship)]
76− [%nail =ship lanes=(list lane:ames)]
7776 [%doze p=(unit @da)]
7877 [%thus p=@ud q=(unit hiss:eyre)]
7978 [%ergo p=@tas q=mode:clay]
@@ -82,8 +81,5 @@
8281 [%kill ~]
8382 [%init ~]
8483 [%request id=@ud request=request:http]
85− [%turf p=(list turf)]
86− [%unto =unto:gall] :: internal gifts to host ships
87− :: (%facts are transformed to %raw-facts)
8884 ==
8985--
base-desk/sur/hood.hoon+185−281
@@ -1,312 +1,147 @@
1−/% kelvin %kelvin
21=, clay
32=* dude dude:gall
43|%
5−+$ pike
6− $: sync=(unit [=ship =desk])
7− hash=@uv
8− =zest
9− wic=(set weft)
10− ==
4+:: $snap: kiln snapshot
115::
12−+$ pikes (map desk pike)
13−:: $jump: changes to update source change requests
6++$ snap (map desk arak)
7+:: $diff: subscription update
148::
15−+$ jump
16− $% [%all all=(map dock dock)] :: pending requests
17− [%add old=dock new=dock] :: new request
18− [%yea old=dock new=dock] :: approved
19− [%nay old=dock new=dock] :: denied
9++$ diff
10+ $% [%block =desk =arak =weft blockers=(set desk)]
11+ [%reset =desk =arak]
12+ [%commit =desk =arak]
13+ [%merge-sunk =desk =arak =tang]
14+ [%merge-fail =desk =arak =tang]
15+ [%suspend =desk =arak]
16+ [%revive =desk =arak]
2017 ==
21−:: $rung: reference to upstream commit
18+:: $arak: foreign vat tracker
2219::
23−+$ rung [=aeon =weft]
24−:: #sync-record: source and destination of a kiln sync
20+:: .rail: upstream tracking state, if any
21+:: .rein: configuration for agents
2522::
26−+$ sync-record ::
27− $: syd=desk :: local desk
28− her=ship :: foreign ship
29− sud=desk :: foreign desk
23++$ arak
24+ $: rail=(unit rail)
25+ =rein
3026 ==
27+:: $rail: upstream tracking state
3128::
32−+$ sync-state ::
33− $: nun=@ta :: nonce
34− kid=(unit desk) :: has kids desk too?
35− let=@ud :: next revision
36− nit=(unit ?) :: automerge or default
37− hav=(unit @ud) :: update available
38− yea=? :: update approved
39− ==
29+:: .publisher: Ship that originally published desk, if available
30+:: .paused: is tracking paused? or live
31+:: .ship: upstream ship (could be .our)
32+:: .desk: name of upstream desk
33+:: .aeon: next aeon to pull from upstream
34+:: .next: list of pending commits with future kelvins
4035::
41−+$ sync-update
42− $% [%new for=sync-record rev=@ud]
43− [%done for=sync-record rev=@ud]
44− [%drop for=sync-record rev=@ud]
45− [%pending pending=(set [for=sync-record rev=@ud])]
36++$ rail
37+ $: publisher=(unit ship)
38+ paused=?
39+ =ship
40+ =desk
41+ =aeon
42+ next=(list rung)
4643 ==
44+:: $rung: reference to upstream commit
4745::
48−+$ sink (unit [her=@p sud=desk kid=(unit desk) let=@ud])
49−:: +truncate-hash: get last 5 digits of hash and convert to tape
46++$ rung [=aeon =weft]
47+:: $rein: diff from desk manifest
5048::
51−++ truncate-hash
52− |= hash=@uv
53− ^- tape
54− (slag 2 <`@uv`(mod hash 0v1.00000)>)
55−:: +report-prep: get data required for reports
49+:: .liv: suspended? if suspended, no agents should run
50+:: .add: agents not in manifest that should be running
51+:: .sub: agents in manifest that should not be running
5652::
57−++ report-prep
58− |= [our=@p now=@da]
59− =/ ego (scot %p our)
60− =/ wen (scot %da now)
61− :* .^(rock:tire %cx /[ego]//[wen]/tire)
62− .^(cone %cx /[ego]//[wen]/domes)
63− .^((map desk [ship desk]) %gx /[ego]/hood/[wen]/kiln/sources/noun)
64− .^ (map [desk ship desk] sync-state) %gx
65− /[ego]/hood/[wen]/kiln/syncs/noun
66− ==
53++$ rein
54+ $: liv=_&
55+ add=(set dude)
56+ sub=(set dude)
6757 ==
58+::
59++$ vat [=desk hash=@uv =cass =arak]
6860:: +report-vats: report on all desk installations
6961::
7062++ report-vats
71− |= [our=@p now=@da desks=(list desk) filt=@tas verb=?]
63+ |= [our=@p now=@da]
7264 ^- tang
73− =/ ego (scot %p our)
74− =/ wen (scot %da now)
75− =+ prep=[tyr cone sor zyn]=(report-prep our now)
76− ?: =(%$ filt)
77− %- zing
78− %+ turn
79− ?^ desks
80− (flop desks)
81− %+ sort ~(tap in ~(key by tyr.prep))
82− |= [a=desk b=desk]
83− ?: |(=(a %kids) =(b %base)) &
84− ?: |(=(a %base) =(b %kids)) |
85− (aor b a)
86− |=(syd=@tas (report-vat prep our now syd verb))
87− =/ deks=(list [=desk =zest wic=(set weft)])
88− ?~ desks
89− %+ sort ~(tap by tyr.prep)
90− |= [[a=desk *] [b=desk *]]
91− ?: |(=(a %kids) =(b %base)) &
92− ?: |(=(a %base) =(b %kids)) |
93− (aor b a)
94− %+ murn (flop desks)
95− |= des=desk
96− ^- (unit [=desk =zest wic=(set weft)])
97− ?~ got=(~(get by tyr.prep) des)
98− ~
99− `[des u.got]
100− ?: =(filt %blocking)
101− =/ base-weft=(unit weft)
102− %- ~(rep in wic:(~(got by tyr.prep) %base))
103− |= [=weft out=(unit weft)]
104− ?~ out
105− `weft
106− ?: (lth num.weft num.u.out)
107− out
108− `weft
109− ?~ base-weft ~['%base already up-to-date']
110− =/ blockers=(list desk)
111− %+ sort
112− ^- (list desk)
113− %+ murn deks
114− |= [=desk =zest wic=(set weft)]
115− ^- (unit ^desk)
116− ?. =(%live zest)
117− ~
118− ?: (~(has in wic) u.base-weft)
119− ~
120− `desk
121− aor
122− ?~ blockers ~['No desks blocking upgrade']
123− %- zing
124− ^- (list tang)
125− :- :~ %+ rap 3
126− :~ 'These desks are blocking upgrade to [%zuse '
127− (scot %ud num.u.base-weft)
128− ']:'
129− == ==
130− %+ turn blockers
131− |=(syd=desk (report-vat prep our now syd verb))
132− ::
133− %- zing
134− %+ turn
135− ?+ filt !!
136− %exists
137− %+ skip deks
138− |= [syd=desk *]
139− ?~ got=(~(get by cone.prep) our syd)
140− &
141− =(0 let.u.got)
142− ::
143− %running
144− %+ skim deks
145− |=([* [zest=@tas *]] =(zest %live))
146− ::
147− %suspended
148− %+ skip deks
149− |= [syd=@tas [zest=@tas *]]
150− ?| =(syd %kids)
151− =(zest %live)
152− ?~ got=(~(get by cone.prep) our syd)
153− &
154− =(0 let.u.got)
65+ =+ .^ raz=(list vat)
66+ %gx /(scot %p our)/hood/(scot %da now)/kiln/vats/noun
15567 ==
156− ::
157− %exists-not
158− %+ skim deks
159− |= [syd=desk *]
160− ?~ got=(~(get by cone.prep) our syd)
161− |
162− =(0 let.u.got)
163− ==
164− |=([syd=desk *] (report-vat prep our now syd verb))
68+ :- (report-kids our now)
69+ (turn raz |=(v=vat (report-vat our now v)))
16570:: +report-vat: report on a single desk installation
16671::
16772++ report-vat
168− |= $: $: tyr=rock:tire =cone sor=(map desk (pair ship desk))
169− zyn=(map [desk ship desk] sync-state)
170− ==
171− our=ship now=@da syd=desk verb=?
172− ==
173− |^ ^- tang
174− =/ ego (scot %p our)
175− =/ wen (scot %da now)
176− ?. ((sane %tas) syd)
177− ~[(cat 3 'insane desk: %' syd)]
178− ?. (~(has by cone) our syd)
179− ~[(cat 3 'desk does not yet exist: %' syd)]
180− =/ hash .^(@uv %cz /[ego]/[syd]/[wen])
181− ?: =(%kids syd)
182− ~[(cat 3 '%kids %cz hash: ' (scot %uv hash))]
183− =/ kel-path /[ego]/[syd]/[wen]/sys/kelvin
73+ |= [our=ship now=@da vat]
74+ ^- tank
75+ ?: =(ud.cass 0)
76+ leaf+"desk does not yet exist: {<desk>}"
77+ =/ kel-path
78+ /(scot %p our)/[desk]/(scot %da now)/sys/kelvin
18479 ?. .^(? %cu kel-path)
185− ~[(cat 3 'bad desk: %' syd)]
186− =+ .^(=waft %cx kel-path)
80+ leaf+"bad desk: {<desk>}"
81+ =+ .^(=weft %cx kel-path)
82+ :+ %rose ["" "{<desk>}" "::"]
18783 ^- tang
188− =/ =sink
189− ?~ s=(~(get by sor) syd)
190− ~
191− ?~ z=(~(get by zyn) syd u.s)
192− ~
193− `[p.u.s q.u.s [kid let]:u.z]
194− =/ meb=(list @uv)
195− ?~ sink ~[hash]
196− %+ turn
197− .^ (list tako) %cs
198− /[ego]/[syd]/[wen]/base/(scot %p her.u.sink)/[sud.u.sink]
199− ==
200− |=(=tako .^(@uv %cs /[ego]/[syd]/[wen]/hash/(scot %uv tako)))
201− =/ dek (~(got by tyr) syd)
202− =/ sat
203− ?- zest.dek
204− %live 'running'
205− %dead 'suspended'
206− %held 'suspended until next update'
207− ==
208− =/ kul=cord (print-wefts (waft-to-wefts waft))
209− =/ ese=cord
210− ?:(.^(? %cx /[ego]//[wen]/esse/[syd]) 'yes' 'no')
211− =/ pax=path /(scot %p our)/[syd]/(scot %da now)
212− ?. verb
213− :~ '::'
214− =+ .^(exist=? cu+(weld pax /desk/bill))
215− ?. exist ' /desk/bill: missing'
216− =+ .^(dudes=(list dude:gall) cx+(weld pax /desk/bill))
217− (cat 3 ' /desk/bill: ' (crip "{<dudes>}"))
218− (cat 3 ' pending updates: ' (print-wefts wic.dek))
219− (cat 3 ' source ship: ' ?~(sink '~' (scot %p her.u.sink)))
220− (cat 3 ' app status: ' sat)
221− (cat 3 ' essential desk: ' ese)
222− (cat 3 ' %cz hash ends in: ' (print-shorthash hash))
223− (cat 3 ' /sys/kelvin: ' (print-wefts (waft-to-wefts waft)))
224− (cat 3 '%' syd)
225− ==
226− ::
227− =/ [on=(list @tas) of=(list @tas)]
228− =/ [on=(list @tas) of=(list @tas)]
229− %- ~(rep by ren:(~(got by cone) our syd))
230− |= [[=dude:gall is-on=?] on=(list @tas) of=(list @tas)]
231− ?: is-on
232− [[dude on] of]
233− [on [dude of]]
234− [(sort on aor) (sort of aor)]
235− :~ '::'
236− (cat 3 ' pending updates: ' (print-wefts wic.dek))
237− %^ cat 3 ' kids desk: ' ?~ sink '~'
238− ?~ kid.u.sink '~'
239− (cat 3 '%' u.kid.u.sink)
240− (cat 3 ' source aeon: ' ?~(sink '~' (scot %ud let.u.sink)))
241− (cat 3 ' source desk: ' ?~(sink '~' (cat 3 '%' sud.u.sink)))
242− (cat 3 ' source ship: ' ?~(sink '~' (scot %p her.u.sink)))
243− (cat 3 ' updates: ' ?~(sink 'local' 'remote'))
244− %^ cat 3 ' publishing ship: ' ?~ got=(get-publisher our syd now)
245− '~'
246− (scot %p u.got)
247− ::
248− (cat 3 ' force off: ' (print-agents of))
249− (cat 3 ' force on: ' (print-agents on))
250− (cat 3 ' app status: ' sat)
251− (cat 3 ' essential desk: ' ese)
252− ::
253− (cat 3 ' %cz hash: ' (scot %uv hash))
254− (cat 3 ' base hash: ' (print-mergebases meb))
255− (cat 3 ' /sys/kelvin: ' (print-wefts (waft-to-wefts waft)))
256− (cat 3 '%' syd)
84+ =/ meb (mergebase-hashes our desk now arak)
85+ =/ poz
86+ ?~ rail.arak "local"
87+ ?:(paused.u.rail.arak "paused" "tracking")
88+ =/ sat ?:(liv.rein.arak "running" "suspended")
89+ =/ pen
90+ ?~ rail.arak "~"
91+ <(turn next.u.rail.arak |=([@ lal=@tas num=@] [lal num]))>
92+ :~ leaf/"/sys/kelvin: {<[lal num]:weft>}"
93+ leaf/"base hash: {?.(=(1 (lent meb)) <meb> <(head meb)>)}"
94+ leaf/"%cz hash: {<hash>}"
95+ ::
96+ leaf/"app status: {sat}"
97+ leaf/"force on: {?:(=(~ add.rein.arak) "~" <add.rein.arak>)}"
98+ leaf/"force off: {?:(=(~ sub.rein.arak) "~" <sub.rein.arak>)}"
99+ ::
100+ leaf/"publishing ship: {?~(rail.arak <~> <publisher.u.rail.arak>)}"
101+ leaf/"updates: {poz}"
102+ leaf/"source ship: {?~(rail.arak <~> <ship.u.rail.arak>)}"
103+ leaf/"source desk: {?~(rail.arak <~> <desk.u.rail.arak>)}"
104+ leaf/"source aeon: {?~(rail.arak <~> <aeon.u.rail.arak>)}"
105+ leaf/"pending updates: {pen}"
257106 ==
258− ++ print-wefts
259− |= wefts=(set weft)
260− ^- @t
261− ?: =(~ wefts)
262− '~'
263− %+ roll (sort ~(tap in wefts) aor)
264− |= [=weft out=@t]
265− ?: =('' out)
266− (rap 3 '[%' lal.weft ' ' (scot %ud num.weft) ']' ~)
267− (rap 3 out ' [%' lal.weft ' ' (scot %ud num.weft) ']' ~)
268− ::
269− ++ print-shorthash
270− |= hash=@uv
271− ^- @t
272− (crip ((v-co:co 5) (end [0 25] hash)))
273− ::
274− ++ print-mergebases
275− |= hashes=(list @uv)
276− ^- @t
277− ?~ hashes
278− '~'
279− ?~ t.hashes
280− (scot %uv i.hashes)
281− %+ roll `(list @uv)`hashes
282− |= [hash=@uv out=@t]
283− ?: =('' out)
284− (print-shorthash hash)
285− (rap 3 out ' ' (print-shorthash hash) ~)
286− ::
287− ++ print-agents
288− |= agents=(list @tas)
289− ^- @t
290− ?~ agents
291− '~'
292− %+ roll `(list @tas)`agents
293− |= [agent=@tas out=@tas]
294− ?: =('' out)
295− (cat 3 '%' agent)
296− (rap 3 out ' %' agent ~)
297− --
298107:: +report-kids: non-vat cz hash report for kids desk
299108::
300109++ report-kids
301110 |= [our=ship now=@da]
302111 ^- tank
303− =/ syd %kids
112+ =/ dek %kids
304113 =/ ego (scot %p our)
305114 =/ wen (scot %da now)
306− ?. (~(has in .^((set desk) %cd /[ego]//[wen])) syd)
307− 'no %kids desk'
308− =+ .^(hash=@uv %cz /[ego]/[syd]/[wen])
309− (cat 3 '%kids %cz hash: ' (scot %uv hash))
115+ ?. (~(has in .^((set desk) %cd /[ego]//[wen])) dek)
116+ leaf/"no %kids desk"
117+ =+ .^(hash=@uv %cz /[ego]/[dek]/[wen])
118+ leaf/"%kids %cz hash: {<hash>}"
119+:: +read-kelvin-foreign: read /sys/kelvin from a foreign desk
120+::
121+++ read-kelvin-foreign
122+ |= [=ship =desk =aeon]
123+ ^- weft
124+ ~| read-foreign-kelvin/+<
125+ =/ her (scot %p ship)
126+ =/ syd (scot %tas desk)
127+ =/ yon (scot %ud aeon)
128+ ::
129+ =/ dom .^(dome cv/~[her syd yon])
130+ =/ tak (scot %uv (~(got by hit.dom) let.dom))
131+ =/ yak .^(yaki cs/~[her syd yon %yaki tak])
132+ =/ lob (scot %uv (~(got by q.yak) /sys/kelvin))
133+ =/ peg .^(page cs/~[her syd yon %blob lob])
134+ ;;(weft q.peg)
135+:: +read-kelvin-local: read /sys/kelvin from a local desk
136+::
137+++ read-kelvin-local
138+ |= [our=ship =desk now=@da]
139+ ^- (unit weft)
140+ ~| read-kelvin-local+desk
141+ =/ pax (en-beam [our desk da+now] /sys/kelvin)
142+ ?. .^(? cu/pax)
143+ ~
144+ [~ .^(weft cx/pax)]
310145:: +read-bill-foreign: read /desk/bill from a foreign desk
311146::
312147++ read-bill-foreign
@@ -317,7 +152,7 @@
317152 =/ syd (scot %tas desk)
318153 =/ yon (scot %ud aeon)
319154 ::
320− =/ dom .^(domo cv/~[her syd yon])
155+ =/ dom .^(dome cv/~[her syd yon])
321156 =/ tak ~| aeons=~(key by hit.dom)
322157 (scot %uv (~(got by hit.dom) aeon))
323158 =/ yak .^(yaki cs/~[her syd yon %yaki tak])
@@ -334,6 +169,21 @@
334169 ?. .^(? cu/pax)
335170 *(list dude)
336171 .^((list dude) cx/pax)
172+:: +adjust-dudes: which agents should be started and stopped
173+::
174+:: Will ask Gall to start agents that it's already running
175+:: but that should be ok, and might be safer in case other
176+:: unprocessed moves would have turned them off.
177+::
178+++ adjust-dudes
179+ |= $: local=[our=ship =desk now=@da]
180+ =rein
181+ ==
182+ ^- [jolt=(list dude) idle=(list dude)]
183+ =/ all=(list dude) (read-bill local)
184+ =/ want (get-apps-want local all rein)
185+ =/ have (get-apps-live local)
186+ [want (skip have ~(has in (sy want)))]
337187::
338188++ get-remote-diff
339189 |= [our=ship here=desk now=@da her=ship there=desk when=aeon]
@@ -359,19 +209,39 @@
359209 |= [our=ship =desk now=@da]
360210 ^- (list [=dude live=?])
361211 %~ tap in
362− .^((set [=dude live=?]) ge+/(scot %p our)/[desk]/(scot %da now)/$)
212+ .^((set [=dude live=?]) ge+/(scot %p our)/[desk]/(scot %da now))
213+:: +get-apps-want: find which apps should be running on a desk
214+::
215+++ get-apps-want
216+ |= [local=[our=ship =desk now=@da] duz=(list dude) =rein]
217+ ^- (list dude)
218+ ?. liv.rein ~
219+ ?. |(=(`zuse+zuse (read-kelvin-local local)) =(%base desk.local)) ~
220+ =. duz (skip duz ~(has in sub.rein))
221+ =. duz (weld duz (skip ~(tap in add.rein) ~(has in (sy duz))))
222+ duz
363223::
364224++ mergebase-hashes
365− |= [our=@p syd=desk now=@da her=ship sud=desk]
366− =/ her (scot %p her)
225+ |= [our=@p =desk now=@da =arak]
226+ ?~ rail.arak
227+ ~
228+ =/ her (scot %p ship.u.rail.arak)
367229 =/ ego (scot %p our)
368230 =/ wen (scot %da now)
369− %+ turn .^((list tako) %cs /[ego]/[syd]/[wen]/base/[her]/[sud])
370− |=(=tako .^(@uv %cs /[ego]/[syd]/[wen]/hash/(scot %uv tako)))
231+ %+ turn .^((list tako) %cs ~[ego desk wen %base her desk.u.rail.arak])
232+ |=(=tako .^(@uv %cs ~[ego desk wen %hash (scot %uv tako)]))
371233::
372234++ enjs
373235 =, enjs:format
374236 |%
237+ ++ vats
238+ |= v=(list ^vat)
239+ ^- json
240+ %- pairs
241+ %+ turn v
242+ |= va=^vat
243+ [desk.va (vat va)]
244+ ::
375245 ++ tim
376246 |= t=@
377247 ^- json
@@ -384,6 +254,15 @@
384254 da+(tim da.c)
385255 ==
386256 ::
257+ ++ vat
258+ |= v=^vat
259+ %- pairs
260+ :~ desk+s+desk.v
261+ hash+s+(scot %uv hash.v)
262+ cass+(cass cass.v)
263+ arak+(arak arak.v)
264+ ==
265+ ::
387266 ++ weft
388267 |= w=^weft
389268 %- pairs
@@ -397,5 +276,30 @@
397276 :~ aeon+(numb aeon.r)
398277 weft+(weft weft.r)
399278 ==
279+ ::
280+ ++ rein
281+ |= r=^rein
282+ %- pairs
283+ :~ add+a+(turn ~(tap in add.r) (lead %s))
284+ sub+a+(turn ~(tap in sub.r) (lead %s))
285+ ==
286+ ::
287+ ++ arak
288+ |= a=^arak
289+ %- pairs
290+ :~ rail+?~(rail.a ~ (rail u.rail.a))
291+ rein+(rein rein.a)
292+ ==
293+ ::
294+ ++ rail
295+ |= r=^rail
296+ %- pairs
297+ :~ ship+s+(scot %p ship.r)
298+ publisher+?~(publisher.r ~ s+(scot %p u.publisher.r))
299+ desk+s+desk.r
300+ paused+b+paused.r
301+ aeon+(numb aeon.r)
302+ next+a+(turn next.r rung)
303+ ==
400304 --
401305--
base-desk/sur/ring.hoon+1−1
@@ -15,7 +15,7 @@
1515 :: resistance...but if your private keys are compromised, your
1616 :: adversary can determine which signatures you made.
1717 ::
18− y=(unit @uxpoint)
18+ y=(unit @udpoint)
1919 ==
2020:: +ring-signature: higher level ring signature type
2121::
base-desk/sur/sole.hoon+1−2
@@ -3,9 +3,8 @@
33 ::
44^?
55|%
6−+$ sole-id [who=@p ses=@ta]
76+$ sole-action :: sole to app
8− $: id=sole-id :: session id
7+ $: id=@ta :: duct id
98 $= dat
109 $% :: [%abo ~] :: reset interaction
1110 [%det sole-change] :: command line edit
base-desk/sur/spider.hoon+1−7
@@ -1,7 +1,7 @@
11/+ libstrand=strand
22=, strand=strand:libstrand
33|%
4−+$ thread $-(vase shed:khan)
4++$ thread $-(vase _*form:(strand ,vase))
55+$ input [=tid =cage]
66+$ tid tid:strand
77+$ bowl bowl:strand
@@ -18,10 +18,4 @@
1818 file=term
1919 =vase
2020 ==
21−+$ inline-args
22− $: parent=(unit tid)
23− use=(unit tid)
24− =beak
25− =shed:khan
26− ==
2721--
base-desk/sur/sss.hoondeleted−39
@@ -1,39 +0,0 @@
1−|%
2−++ lake
3− |$ [rock wave]
4− $_ ^?
5− |%
6− ++ name *term
7− +$ rock ^rock
8− +$ wave ^wave
9− ++ wash |~ [rock wave] *rock
10− --
11−+$ aeon @ud
12−+$ dude dude:agent:gall
13−++ poke
14− |%
15− ++ request
16− |* paths=mold
17− $: path=paths
18− =dude
19− ==
20− ++ response
21− |* [=(lake) paths=mold]
22− $: path=paths
23− =dude
24− $% [what=%tomb ~]
25− [what=%rock =aeon =rock:lake]
26− [what=%wave =aeon =wave:lake]
27− == ==
28− ++ on-rock
29− |* [=(lake) paths=mold]
30− $: path=paths
31− src=ship
32− from=dude
33− stale=?
34− fail=?
35− =rock:lake
36− wave=(unit wave:lake)
37− ==
38− --
39−--
base-desk/sur/verb.hoon+1−37
@@ -9,40 +9,4 @@
99 [%on-arvo =wire vane=term sign=term]
1010 [%on-fail =term]
1111 ==
12−::
13−+$ event-plus
14− $: act=@ud
15− now=@da
16− src=@p
17− sap=path
18− =cause
19− effects=(list effect)
20− ==
21−::
22−+$ cause
23− $% [%on-init ~]
24− [%on-load ~]
25− [%on-poke =mark mug=@ux]
26− [%on-watch =path]
27− [%on-leave =path]
28− [%on-agent =wire =sign]
29− [%on-arvo =wire vane=term sign=term]
30− [%on-fail =term]
31− ==
32−::
33−+$ sign
34− $% [%poke-ack ack=?]
35− [%watch-ack ack=?]
36− [%kick ~]
37− [%fact =mark mug=@ux]
38− ==
39−::
40−+$ effect
41− $% [%poke =wire =gill:gall =mark mug=@ux]
42− [%watch =wire =gill:gall =path]
43− [%leave =wire =gill:gall]
44− [%fact paths=(list path) =mark mug=@ux]
45− [%kick paths=(list path)]
46− [%arvo =wire vane=term task=term]
47− ==
48−--
12+--
bin/make_glob.pydeleted−208
@@ -1,208 +0,0 @@
1−#!/usr/bin/env python3
2−
3−import hashlib
4−import sys
5−from pathlib import Path
6−from urllib.parse import quote
7−
8−from noun import Cell, deep, intbytes, mug
9−
10−MIME_TYPES = {
11− "css": "text/css",
12− "gif": "image/gif",
13− "html": "text/html",
14− "ico": "image/x-icon",
15− "jpeg": "image/jpeg",
16− "jpg": "image/jpeg",
17− "js": "application/javascript",
18− "json": "application/json",
19− "png": "image/png",
20− "svg": "image/svg+xml",
21− "ttf": "font/ttf",
22− "webmanifest": "application/manifest+json",
23− "woff": "font/woff",
24− "woff2": "font/woff2",
25−}
26−BASE32 = "0123456789abcdefghijklmnopqrstuv"
27−
28−
29−class BitWriter:
30− def __init__(self):
31− self.output = bytearray()
32− self.buffer = 0
33− self.used = 0
34− self.cursor = 0
35−
36− def write(self, value, count):
37− if count == 0:
38− return
39− self.buffer |= value << self.used
40− self.used += count
41− self.cursor += count
42− byte_count = self.used // 8
43− if byte_count:
44− self.output.extend(self.buffer.to_bytes((self.used + 7) // 8, "little")[:byte_count])
45− self.buffer >>= byte_count * 8
46− self.used -= byte_count * 8
47−
48− def finish(self):
49− if self.used:
50− self.output.append(self.buffer)
51− self.buffer = 0
52− self.used = 0
53− return bytes(self.output)
54−
55−
56−def jam_bytes(value):
57− writer = BitWriter()
58− references = {}
59−
60− def save(noun):
61− references[noun] = writer.cursor
62−
63− def mat(atom):
64− if atom == 0:
65− writer.write(1, 1)
66− return
67− atom_length = atom.bit_length()
68− length_size = atom_length.bit_length()
69− writer.write(1 << length_size, length_size + 1)
70− writer.write(atom_length & ((1 << (length_size - 1)) - 1), length_size - 1)
71− writer.write(atom, atom_length)
72−
73− def back(reference):
74− writer.write(3, 2)
75− mat(reference)
76−
77− def serialize(noun):
78− duplicate = references.get(noun)
79− if deep(noun):
80− if duplicate is not None:
81− back(duplicate)
82− return
83− save(noun)
84− writer.write(1, 1)
85− writer.write(0, 1)
86− serialize(noun.head)
87− serialize(noun.tail)
88− return
89− if duplicate is not None:
90− atom_size = noun.bit_length()
91− reference_size = duplicate.bit_length()
92− if atom_size >= reference_size:
93− back(duplicate)
94− return
95− save(noun)
96− writer.write(0, 1)
97− mat(noun)
98−
99− serialize(value)
100− return writer.finish()
101−
102−
103−def cord(value):
104− return int.from_bytes(value.encode(), "little")
105−
106−
107−def path_noun(parts):
108− result = 0
109− for part in reversed(parts):
110− result = Cell(cord(part), result)
111− return result
112−
113−
114−def dor(a, b):
115− if a == b:
116− return True
117− if deep(a):
118− if not deep(b):
119− return False
120− if a.head == b.head:
121− return dor(a.tail, b.tail)
122− return dor(a.head, b.head)
123− if deep(b):
124− return True
125− return a < b
126−
127−
128−def gor(a, b):
129− a_mug = mug(a)
130− b_mug = mug(b)
131− return dor(a, b) if a_mug == b_mug else a_mug < b_mug
132−
133−
134−def map_put(tree, entry):
135− if tree == 0:
136− return Cell(entry, Cell(0, 0))
137− node = tree.head
138− if entry.head == node.head:
139− return Cell(entry, tree.tail)
140− left = tree.tail.head
141− right = tree.tail.tail
142− if gor(entry.head, node.head):
143− return Cell(node, Cell(map_put(left, entry), right))
144− return Cell(node, Cell(left, map_put(right, entry)))
145−
146−
147−def shas(salt, serialized):
148− value_hash = int.from_bytes(hashlib.sha256(serialized).digest(), "little")
149− length = max(32, len(intbytes(salt)))
150− digest = hashlib.sha256((salt ^ value_hash).to_bytes(length, "little")).digest()
151− return int.from_bytes(digest, "little")
152−
153−
154−def sham(serialized):
155− hashed = shas(cord("sham"), serialized)
156− mask = (1 << 128) - 1
157− return (hashed & mask) ^ (hashed >> 128)
158−
159−
160−def scow_uv(value):
161− if value == 0:
162− return "0v0"
163− digits = []
164− while value:
165− value, digit = divmod(value, 32)
166− digits.append(BASE32[digit])
167− digits = "".join(reversed(digits))
168− first_length = (len(digits) - 1) % 5 + 1
169− groups = [digits[:first_length]]
170− groups.extend(digits[i:i + 5] for i in range(first_length, len(digits), 5))
171− return "0v" + ".".join(groups)
172−
173−
174−def file_entry(root, file_path):
175− relative = file_path.relative_to(root)
176− parts = []
177− for part in relative.parts:
178− parts.extend(quote(segment, safe="-_~") for segment in part.split("."))
179− extension = relative.suffix.removeprefix(".").lower()
180− if extension not in MIME_TYPES:
181− raise ValueError(f"no MIME type configured for {relative}")
182− data = file_path.read_bytes()
183− mime = Cell(path_noun(MIME_TYPES[extension].split("/")), Cell(len(data), int.from_bytes(data, "little")))
184− return Cell(path_noun(parts), mime)
185−
186−
187−def make_glob(source, destination):
188− root = Path(source)
189− files = sorted((path for path in root.rglob("*") if path.is_file()), key=lambda path: path.as_posix())
190− if not (root / "index.html").is_file():
191− raise ValueError("glob source must contain index.html")
192− glob = 0
193− for file_path in files:
194− glob = map_put(glob, file_entry(root, file_path))
195− serialized = jam_bytes(glob)
196− glob_hash = scow_uv(sham(serialized))
197− output = Path(destination)
198− output.mkdir(parents=True, exist_ok=True)
199− filename = f"glob-{glob_hash}.glob"
200− (output / filename).write_bytes(serialized)
201− (output / "hash").write_text(glob_hash + "\n")
202− print(filename)
203−
204−
205−if __name__ == "__main__":
206− if len(sys.argv) != 3:
207− raise SystemExit(f"usage: {sys.argv[0]} SOURCE_DIRECTORY OUTPUT_DIRECTORY")
208− make_glob(sys.argv[1], sys.argv[2])
desk/app/astrolabe.hoon+67−38
@@ -1,12 +1,42 @@
11/- *astrolabe
2−/+ *astrolabe, *search, slib=state
3−/+ *mip, naive, default-agent, dbug, agentio
2+/+ *astrolabe, *search, *mip, naive, default-agent, dbug, agentio
43/$ udon-to-docu %udon %docu
54|%
5++$ versioned-state
6+ $% state-0
7+ state-1
8+ state-2
9+ state-3
10+ ==
11++$ state-0
12+ $: %0
13+ spa=spawned
14+ ==
15++$ state-1
16+ $: %1
17+ fropoints-1
18+ ==
19++$ state-2
20+ $: %2
21+ spam=spawn-mip
22+ fropoints-1
23+ ==
24++$ state-3
25+ $: %3
26+ prev-spo=(map ship ship) :: so we know who the old sponsor was when sponsor changes
27+ spam=spawn-mip
28+ fropoints-1
29+ ==
30+::
31++$ fropoints-1
32+ $: fopoints=opoints :: forward ordered points
33+ ropoints=opoints :: reversed ordered points, e.g. .~palnet-sampel
34+ ==
35++$ spawned (jug ship ship)
636+$ card card:agent:gall
737--
838%- agent:dbug
9−=| state-latest
39+=| state-3
1040=* state -
1141^- agent:gall
1242=<
@@ -18,28 +48,22 @@
1848++ on-init
1949 ^- (quip card _this)
2050 :_ this
21− :~ ug-handler-card:hc
22− groups-link-patch-card:hc
23− talk-link-patch-card:hc
24− az-events-card:hc
25− ==
51+ [az-events-card:hc]~
2652::
2753++ on-save !>(state)
2854++ on-load
2955 |= old-state=vase
3056 ^- (quip card _this)
3157 =/ old !<(versioned-state old-state)
32− =/ [cards-01=(list card) new=state-latest]
33− ?. |(?=(?(%0 %1 %2 %3) -.old) (lth bump.old bump)) `old
58+ =^ cards-01 old
59+ ?. ?=(?(%0 %1 %2) -.old) `old
3460 (on-naive-state:hc get-nas:hc)
35− ?> ?=(%4 -.new)
61+ ?> ?=(%3 -.old)
3662 =/ cards=(list card)
37− :~ ug-handler-card:hc
38− groups-link-patch-card:hc
39− talk-link-patch-card:hc
40− ==
63+ =/ ug-vase !>([/astrolabe '/apps/astrolabe/#'])
64+ [%pass /monkey-ug %agent [our.bowl %monkey] %poke [%bind-ug ug-vase]]~
4165 =. cards (weld cards-01 cards)
42− [cards this(state new)]
66+ [cards this(state old)]
4367++ on-poke on-poke:def
4468++ on-watch on-watch:def
4569++ on-leave on-leave:def
@@ -48,14 +72,11 @@
4872 |= =path
4973 ^- (unit (unit cage))
5074 ?+ path (on-peek:def path)
51− [%x %nop ~]
52− ``noun+!>(~)
5375 [%x %point @ ~]
5476 ``astrolabe-point+!>((get-point:hc &3.path))
5577 [%x %point @ %spawned ?(~ [spawned-filter ~])]
5678 =/ =ship `@p`(slav %p &3.path)
57− =/ filter t.t.t.t.path
58− =/ arg ?~(filter %all -.filter)
79+ =/ arg ?~(t.t.t.t.path %all i.t.t.t.t.path)
5980 ``astrolabe-point-set+!>((get-spawned-points:hc ship arg))
6081 [%x %search %patp @ ?(~ [%narrow ~])]
6182 =/ =search-text (trip &4.path)
@@ -137,7 +158,32 @@
137158 |= [child=ship nas=^state:naive]
138159 ^- _state
139160 =/ =npoint (get-npoint-from-nas child nas)
140− (put-in-spawn-mip:slib child npoint state)
161+ =/ parent (^sein:title child)
162+ ?: =(parent child) state
163+ ?: (is-npoint-locked npoint) state
164+ =/ pdata (pdata:smel (pmeta:smel child npoint) ~)
165+ =* spo sponsor.net.npoint
166+ =/ spo-not-par &(has.spo !=(parent who.spo))
167+ =? state spo-not-par
168+ =/ prev (~(get by prev-spo) child)
169+ =? spam &(?=(^ prev) !=(u.prev who.spo))
170+ (~(del bi spam) u.prev child)
171+ =. prev-spo
172+ %+ ~(put by prev-spo)
173+ child
174+ who.spo
175+ =. spam
176+ %^ ~(put bi-meta spam)
177+ who.spo
178+ child
179+ pdata
180+ state
181+ =. spam
182+ %^ ~(put bi-meta spam)
183+ parent
184+ child
185+ pdata
186+ state
141187::
142188++ on-naive-state
143189 |= nas=^state:naive
@@ -314,23 +360,6 @@
314360 (pdata:smel (pmeta:smel gal npoint) ~)
315361 s+(crip :(weld "[" gal-data main-data "]"))
316362::
317−::
318−++ ug-handler-card
319− =/ ug-vase !>([/astrolabe '/apps/astrolabe/#'])
320− [%pass /monkey-ug %agent [our.bowl %monkey] %poke [%bind-ug ug-vase]]
321−++ groups-link-patch-card
322− =/ catch [%cord '/apps/groups/desk.js']
323− =/ hatch [%before "."]
324− =/ patch [/apps/groups catch hatch groups-link-thatch]
325− =/ patch-kit-vase !>([/groups/astrolabe/link patch])
326− [%pass /monkey/patch/groups/link %agent [our.bowl %monkey] %poke [%patch patch-kit-vase]]
327−++ talk-link-patch-card
328− =/ catch [%cord '/apps/talk/desk.js']
329− =/ hatch [%before "."]
330− =/ patch [/apps/talk catch hatch groups-link-thatch]
331− =/ patch-kit-vase !>([/talk/astrolabe/link patch])
332− [%pass /monkey/patch/talk/link %agent [our.bowl %monkey] %poke [%patch patch-kit-vase]]
333−::
334363++ read-doc
335364 |= =path
336365 =/ doc-path=^path :(weld /doc/usr path /udon)
desk/desk.docket-0+3−3
@@ -1,10 +1,10 @@
11:~ title+'Astrolabe'
2− info+'Your guide to the Urbit constellations. Search for ships, view their info, and explore the Star Chart.'
2+ info+'Your guide to the Urbit constellations'
33 color+0x1f.243c
44 image+'https://raw.githubusercontent.com/johnhyde/astrolabe/main/ui/src/assets/astrolabe-tile.svg'
5− glob-http+['https://s3.us-east-2.amazonaws.com/warkgnall.com/urbit/astrolabe/globs/glob-0v4.88rt1.guqn5.nnatp.lca68.ej9aj.glob' 0v4.88rt1.guqn5.nnatp.lca68.ej9aj]
5+ glob-http+['https://s3.us-east-2.amazonaws.com/warkgnall.com/urbit/astrolabe/globs/glob-0v4.pblr2.22g1n.glg47.p9i8t.2n33l.glob' 0v4.pblr2.22g1n.glg47.p9i8t.2n33l]
66 base+'astrolabe'
7− version+[1 0 7]
7+ version+[0 3 7]
88 website+'https://github.com/johnhyde/astrolabe'
99 license+'MIT'
1010==
desk/desk.sealdeleted−7
@@ -1,7 +0,0 @@
1−:- :~ [%watch & %azimuth /event]
2− [%reads %gall `%x `%azimuth /]
3− [%reads %clay `%u ~ /]
4− [%reads %clay `%x ~ /]
5− [%reads %ames `%x ~ /peers]
6− ==
7−~
desk/doc/usr/astrolabe.udon+3−13
@@ -9,16 +9,6 @@ spawned ships with partial or wildcard searches, e.g. `sampel-***net`.
99There's also Help Documentation if
1010you want to learn more about how Urbit IDs work.
1111
12−## Keyboard Shortcuts
13−
14−- `/` - focus the search bar
15−- `escape` - leave text fields, close help pages, etc
16−- `?` - open the help docs
17−- `s` - switch to sigil search
18−- `p` - switch to patp search
19−- `backspace` or `x` - clear sigil input info
20−
21−
2212## How to Use Search
2313
2414When you type part of a `@p` into the search bar, all your contacts and peers will be
@@ -81,9 +71,9 @@ The Parent view simply shows each point under the point that spawned it. All spa
8171are shown in this view, with the exception of locked stars.
8272In both views, all galaxies are shown for completeness.
8373
84−The All/Peers/Pals selector lets you filter which points are easily visible in the graph.
85−If you select Peers, only those ships that your ship has talked to will be full-colored.
86−If you select Pals, only ships you've added in `%pals` will be full-colored.
74+## Upcoming Features
75+
76+In addition to improving the search features over time, Astrolabe will one day feature integrations with Groups, `%pals`, `%gora`, and whatever else seems fun and/or useful.
8777
8878## Info
8979
desk/lib/astrolabe.hoon+2−29
@@ -1,5 +1,5 @@
11/- sur=astrolabe
2−/+ azimuth, naive
2+/+ azimuth, naive, mip
33=< [sur .]
44=, sur
55|%
@@ -25,6 +25,7 @@
2525 ^- ?
2626 (rev-f lte a b)
2727::
28++$ opoints (tree [@ @]) :: ordered points [ship ~]
2829++ ors ((on @q @) rpor)
2930++ or-meta ((on @p tape) por:naive)
3031++ bi-meta
@@ -203,32 +204,4 @@
203204 ^- $-(json [%share ship])
204205 (of share+(su ;~(pfix sig fed:ag)) ~)
205206 --
206−::
207−::
208−++ groups-link-thatch
209−'''
210−const buttonText = 'View in Astrolabe';
211−setInterval(() => {
212− const footer = document.querySelectorAll('section > div > footer')?.[0];
213− if (!footer) return;
214− if (footer.children[0].innerText === buttonText) return;
215− const spans = document.querySelectorAll('section > div > div > div > span > span:first-child');
216− spans.forEach((span) => {
217− if (span.innerHTML !== '~') return;
218− if (footer.children[0].innerText === buttonText) return;
219− let cspan = span.parentElement;
220− let patp = cspan.innerText;
221− let b = document.createElement('a');
222− b.innerHTML = buttonText;
223− b.className = 'button';
224− // b.href = 'web+urbitgraph://astrolabe/ship/' + patp;
225− b.href = '/apps/astrolabe/#/ship/' + patp;
226− b.target = '_blank';
227− b.style.backgroundColor = "navy";
228− b.style.marginLeft = "1rem";
229− b.style.color = "white";
230− footer.prepend(b);
231− });
232−}, 100);
233−'''
234207--
desk/lib/state.hoondeleted−21
@@ -1,21 +0,0 @@
1−/- *astrolabe
2−/+ *astrolabe
3−|%
4−++ put-in-spawn-mip
5− |= [child=ship =npoint s=state-latest]
6− ^- _s
7− =/ parent (^sein:title child)
8− ?: =(parent child) s
9− ?: (is-npoint-locked npoint) s
10− =/ pdata (pdata:smel (pmeta:smel child npoint) ~)
11− =. spam.s (~(put bi spam.s) parent child pdata)
12− =* spo sponsor.net.npoint
13− =/ prev (~(gut by prev-spo.s) child parent)
14− =. prev-spo.s (~(del by prev-spo.s) child)
15− =? spam.s !=(parent prev)
16− (~(del bi spam.s) prev child)
17− ?. has.spo s
18− =. prev-spo.s (~(put by prev-spo.s) child who.spo)
19− =. spam.s (~(put bi spam.s) who.spo child pdata)
20− s
21−--
desk/mar/seal.hoondeleted−12
@@ -1,12 +0,0 @@
1−|_ dat=@
2−++ grow
3− |%
4− ++ mime [/text (as-octs:mimes:html dat)]
5− --
6−++ grab
7− |%
8− ++ mime |=([p=mite q=octs] q.q)
9− ++ noun @
10− --
11−++ grad %mime
12−--
desk/sur/astrolabe.hoon+1−43
@@ -1,48 +1,5 @@
11/+ naive, *mip
22|%
3−+$ versioned-state
4− $% state-0
5− state-1
6− state-2
7− state-3
8− state-4
9− ==
10−+$ state-latest state-4
11−+$ state-0
12− $: %0
13− spa=spawned
14− ==
15−+$ state-1
16− $: %1
17− fropoints-1
18− ==
19−+$ state-2
20− $: %2
21− spam=spawn-mip
22− fropoints-1
23− ==
24−+$ state-3
25− $: %3
26− prev-spo=(map ship ship) :: so we know who the old sponsor was when sponsor changes
27− spam=spawn-mip
28− fropoints-1
29− ==
30−+$ state-4
31− $: %4
32− bump=_1 :: bump to update state without changing the type
33− prev-spo=(map ship ship) :: so we know who the old sponsor was when sponsor changes
34− spam=spawn-mip
35− fropoints-1
36− ==
37−::
38−+$ fropoints-1
39− $: fopoints=opoints :: forward ordered points
40− ropoints=opoints :: reversed ordered points, e.g. .~palnet-sampel
41− ==
42−+$ spawned (jug ship ship)
43−+$ spawn-mip (mip ship ship tape)
44−+$ opoints (tree [@ @]) :: ordered points [ship ~]
45−::
463+$ npoint point:naive
474++ unpoint (unit npoint)
485+$ point
@@ -54,5 +11,6 @@
5411 ==
5512+$ spawned-filter ?(%all %locked %unlocked)
5613::
14++$ spawn-mip (mip ship ship tape)
5715::
5816--
desk/sys.kelvin+1−1
@@ -1 +1 @@
1−[%zuse 408]
1+[%zuse 417]
desk/tests/lib/state.hoondeleted−59
@@ -1,59 +0,0 @@
1−/- *astrolabe
2−/+ *astrolabe, *state, *mip, *test
3−|%
4−++ test-put-in-spawn-mip
5− =| state=state-latest
6− =/ moved-to-bus=npoint
7− =< .(who.sponsor.net ~bus)
8− *npoint
9− =/ moved-to-hec=npoint
10− =< .(who.sponsor.net ~hec)
11− *npoint
12− ;: weld
13− %+ expect-eq
14− !> :-
15− `~zod :: new prev-spo
16− "marzod:s;" :: spawn-mip has something under ~zod
17− !> =- :-
18− (~(get by prev-spo) ~marzod)
19− (~(gut bi spam) ~zod ~marzod "nothing!")
20− (put-in-spawn-mip ~marzod *npoint state)
21− ::
22− %+ expect-eq
23− !> :*
24− `~hec :: new prev-spo
25− "marzod:s:hec!zod;" :: under ~zod
26− %.n :: nothing under ~bus
27− "marzod:s:hec!zod;" :: under ~hec
28− ==
29− !>
30− =. state (put-in-spawn-mip ~marzod *npoint state)
31− =. state (put-in-spawn-mip ~marzod moved-to-bus state)
32− =+ (put-in-spawn-mip ~marzod moved-to-hec state)
33− :*
34− (~(get by prev-spo) ~marzod)
35− (~(gut bi spam) ~zod ~marzod "nothing!")
36− (~(has by spam) ~bus)
37− (~(gut bi spam) ~hec ~marzod "nothing!")
38− ==
39− ::
40− %+ expect-eq
41− !> :*
42− `~zod :: new prev-spo
43− "marzod:s;" :: under ~zod
44− %.n :: nothing under ~bus
45− %.n :: nothing under ~hec
46− ==
47− !>
48− =. state (put-in-spawn-mip ~marzod *npoint state)
49− =. state (put-in-spawn-mip ~marzod moved-to-bus state)
50− =. state (put-in-spawn-mip ~marzod moved-to-hec state)
51− =+ (put-in-spawn-mip ~marzod *npoint state)
52− :*
53− (~(get by prev-spo) ~marzod)
54− (~(gut bi spam) ~zod ~marzod "nothing!")
55− (~(has by spam) ~bus)
56− (~(has by spam) ~hec)
57− ==
58− ==
59−--
flake.lockdeleted−27
@@ -1,27 +0,0 @@
1−{
2− "nodes": {
3− "nixpkgs": {
4− "locked": {
5− "lastModified": 1793341285,
6− "narHash": "sha256-Y1CiZ4SoBUjLQyQM/pY+rS2dXD3CHLPstF0lmOc73D4=",
7− "owner": "NixOS",
8− "repo": "nixpkgs",
9− "rev": "1c89083e451e891152365b799595cf7790a43325",
10− "type": "github"
11− },
12− "original": {
13− "owner": "NixOS",
14− "ref": "nixos-unstable",
15− "repo": "nixpkgs",
16− "type": "github"
17− }
18− },
19− "root": {
20− "inputs": {
21− "nixpkgs": "nixpkgs"
22− }
23− }
24− },
25− "root": "root",
26− "version": 7
27−}
flake.nixdeleted−73
@@ -1,73 +0,0 @@
1−{
2− description = "Astrolabe Urbit desk";
3−
4− inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
5−
6− outputs = { self, nixpkgs }:
7− let
8− systems = [ "x86_64-linux" "aarch64-linux" "x86_64-darwin" "aarch64-darwin" ];
9− forAllSystems = nixpkgs.lib.genAttrs systems;
10− in
11− {
12− packages = forAllSystems (system:
13− let
14− pkgs = import nixpkgs { inherit system; };
15− nounPy = pkgs.fetchurl {
16− name = "noun.py";
17− url = "https://raw.githubusercontent.com/urbit/tools/f9cda82a7699cad0c1c0f8c031a59e93f028e548/pkg/pynoun/noun.py";
18− hash = "sha256-vSKQ/UuSmGTANfW5c3I9lQcUFycvqmu5gqysFuP5SAA=";
19− };
20− ui = pkgs.buildNpmPackage {
21− pname = "astrolabe-ui";
22− version = "0.3.0";
23− src = ./ui;
24− nodejs = pkgs.nodejs_22;
25− npmDepsHash = "sha256-jCkfgNgBmq0mKjmXBbPwdpzBR/E09OgS9XD6O9hRHfw=";
26− makeCacheWritable = true;
27− npmFlags = [ "--legacy-peer-deps" ];
28− npmBuildScript = "build";
29−
30− installPhase = ''
31− runHook preInstall
32− cp -r dist $out
33− runHook postInstall
34− '';
35− };
36− in
37− rec {
38− inherit ui;
39− desk = pkgs.stdenvNoCC.mkDerivation {
40− pname = "astrolabe-desk";
41− version = "1.0.7";
42− dontUnpack = true;
43− nativeBuildInputs = [ pkgs.rsync ];
44−
45− installPhase = ''
46− runHook preInstall
47− mkdir -p $out
48− rsync -r --copy-links --exclude-from=${./config/ignore_files_on_install.txt} ${./base-desk}/ $out/
49− rsync -r --copy-links --exclude-from=${./config/ignore_files_on_install.txt} ${./docs-dev-desk}/ $out/
50− rsync -r --copy-links --exclude-from=${./config/ignore_files_on_install.txt} ${./desk}/ $out/
51− runHook postInstall
52− '';
53− };
54− glob = pkgs.stdenvNoCC.mkDerivation {
55− pname = "astrolabe-glob";
56− version = "0.3.0";
57− dontUnpack = true;
58− nativeBuildInputs = [
59− (pkgs.python3.withPackages (ps: [ ps.mmh3 ps.bitstring ]))
60− ];
61−
62− installPhase = ''
63− runHook preInstall
64− mkdir -p $TMPDIR/pynoun
65− ln -s ${nounPy} $TMPDIR/pynoun/noun.py
66− PYTHONPATH=$TMPDIR/pynoun python ${./bin/make_glob.py} ${ui} $out
67− runHook postInstall
68− '';
69− };
70− default = desk;
71− });
72− };
73−}
ui/package-lock.json+11−11
@@ -16,7 +16,7 @@
1616 "bn.js": "^5.2.0",
1717 "graphology": "^0.24.1",
1818 "lodash": "^4.17.21",
19− "sigma-jh": "^2.4.2",
19+ "sigma": "^2.3.1",
2020 "svelte-copy-to-clipboard": "^0.2.5",
2121 "svelte-markdown": "^0.2.3",
2222 "tippy.js": "^6.3.7",
@@ -174,7 +174,7 @@
174174 },
175175 "node_modules/@johnhyde/sigil-js": {
176176 "version": "1.4.6",
177− "resolved": "git+ssh://git@github.com/johnhyde/sigil-js.git#f89ce78c34b5811ea19ddea4a6964ea8360e7b4d",
177+ "resolved": "git+ssh://git@github.com/johnhyde/sigil-js.git#35f71ac00b54dd56d010b6fccfa48c6f75c48ee8",
178178 "license": "MIT",
179179 "dependencies": {
180180 "invariant": "^2.2.4",
@@ -2467,10 +2467,10 @@
24672467 "node": ">=8"
24682468 }
24692469 },
2470− "node_modules/sigma-jh": {
2471− "version": "2.4.2",
2472− "resolved": "https://registry.npmjs.org/sigma-jh/-/sigma-jh-2.4.2.tgz",
2473− "integrity": "sha512-viB4M5Y79N5rAgs0z3M4Gff4HX53S+UMwblPDEH/Nkwwe7AcmcWwsEYsGv/xL/TNQzLIBBb0NaNAg5ZhnbEm8g==",
2470+ "node_modules/sigma": {
2471+ "version": "2.3.1",
2472+ "resolved": "https://registry.npmjs.org/sigma/-/sigma-2.3.1.tgz",
2473+ "integrity": "sha512-YfQsVZf78CeIUv8EYLqp/yvhMwwBXGrbpy+rD1N2X9IqtJ11+VfQRjWfVqHDhjM8oPfWPsaJMtpWFQ8pIflvCA==",
24742474 "dependencies": {
24752475 "@yomguithereal/helpers": "^1.1.1",
24762476 "events": "^3.3.0",
@@ -3155,7 +3155,7 @@
31553155 }
31563156 },
31573157 "@johnhyde/sigil-js": {
3158− "version": "git+ssh://git@github.com/johnhyde/sigil-js.git#f89ce78c34b5811ea19ddea4a6964ea8360e7b4d",
3158+ "version": "git+ssh://git@github.com/johnhyde/sigil-js.git#35f71ac00b54dd56d010b6fccfa48c6f75c48ee8",
31593159 "from": "@johnhyde/sigil-js@github:johnhyde/sigil-js",
31603160 "requires": {
31613161 "invariant": "^2.2.4",
@@ -4782,10 +4782,10 @@
47824782 "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
47834783 "dev": true
47844784 },
4785− "sigma-jh": {
4786− "version": "2.4.2",
4787− "resolved": "https://registry.npmjs.org/sigma-jh/-/sigma-jh-2.4.2.tgz",
4788− "integrity": "sha512-viB4M5Y79N5rAgs0z3M4Gff4HX53S+UMwblPDEH/Nkwwe7AcmcWwsEYsGv/xL/TNQzLIBBb0NaNAg5ZhnbEm8g==",
4785+ "sigma": {
4786+ "version": "2.3.1",
4787+ "resolved": "https://registry.npmjs.org/sigma/-/sigma-2.3.1.tgz",
4788+ "integrity": "sha512-YfQsVZf78CeIUv8EYLqp/yvhMwwBXGrbpy+rD1N2X9IqtJ11+VfQRjWfVqHDhjM8oPfWPsaJMtpWFQ8pIflvCA==",
47894789 "requires": {
47904790 "@yomguithereal/helpers": "^1.1.1",
47914791 "events": "^3.3.0",
ui/package.json+1−1
@@ -51,7 +51,7 @@
5151 "bn.js": "^5.2.0",
5252 "graphology": "^0.24.1",
5353 "lodash": "^4.17.21",
54− "sigma-jh": "^2.4.2",
54+ "sigma": "^2.3.1",
5555 "svelte-copy-to-clipboard": "^0.2.5",
5656 "svelte-markdown": "^0.2.3",
5757 "tippy.js": "^6.3.7",
ui/scraps/scry thoughtsnew file+5
@@ -0,0 +1,5 @@
1+:: get list of group ids
2+.^((set [ship term]) %gy /(scot %p our)/group-store/(scot %da now)/groups)
3+.^(* %gx /(scot %p our)/group-store/(scot %da now)/groups/ship/~poster-hoster-midlev-mindyr/astrolabe/noun)
4+
5+web+urbitgraph://astrolabe/ship/~midlev-mindyr
ui/src/App.svelte+1−35
@@ -5,8 +5,6 @@
55 import Home from './routes/Home.svelte';
66 import HelpModal from '@/docs/HelpModal.svelte';
77 import "./styles/styles.scss";
8− import docs from 'stores/docs';
9− import keys from 'stores/keys';
108
119 // const routes = {
1210 // '/help/:path?': HelpPage,
@@ -32,36 +30,6 @@
3230 $: {
3331 document.title = title
3432 }
35−
36− function inputEvent(event) {
37− if (event.target.tagName == 'INPUT') return true;
38− if (event.target.tagName == 'TEXTAREA') return true;
39− return false;
40− }
41−
42− function handleKeyDown(event: KeyboardEvent) {
43− keys.runCallbacks($keys.globalkeydown, event);
44− if (!inputEvent(event)) {
45− keys.runCallbacks($keys.keydown, event);
46− }
47− }
48−
49− function handleKeyUp(event: KeyboardEvent) {
50− keys.runCallbacks($keys.globalkeyup, event);
51− if (!inputEvent(event)) {
52− keys.runCallbacks($keys.keyup, event);
53− }
54− }
55−
56− $:{
57− $keys.keyup.get('?').set('app', () => docs.show(''));
58− $keys.keyup.get('shift+?').set('app', () => docs.show(''));
59− $keys.globalkeyup.get('escape').set('app', (event) => {
60− if (inputEvent(event)) {
61− event.target.blur();
62− }
63− });
64− }
6533</script>
6634
6735<main class="h-full overflow-y-auto">
@@ -71,6 +39,4 @@
7139
7240<svelte:head>
7341 <title>{title}</title>
74−</svelte:head>
75−
76−<svelte:body on:keydown={handleKeyDown} on:keyup={handleKeyUp} />
42+</svelte:head>
ui/src/actions/tooltip.ts+2−2
@@ -23,11 +23,11 @@ function getParams(paramsOrContent:any = {}, overrides = {}) {
2323
2424export default function tooltip(node, paramsOrContent: any = {}) {
2525 const onTrigger = () => {
26− // console.log('triggered');
26+ console.log('triggered');
2727 node.dispatchEvent(new CustomEvent("tooltipTriggered"));
2828 };
2929 const onUntrigger = () => {
30− // console.log('untriggered');
30+ console.log('untriggered');
3131 node.dispatchEvent(new CustomEvent("tooltipUntriggered"));
3232 };
3333 const onClickOutside = (_, e) => {
ui/src/components/CollapsibleContent.svelte+5−4
@@ -1,17 +1,18 @@
11<script lang="ts">
2− import { slide } from 'svelte/transition';
2+ import { slide } from 'svelte/transition';
3+ import { quintOut } from 'svelte/easing';
4+
35 export let open: boolean = true;
46</script>
57
68<div class="mt-2">
79 <button on:click={() => (open = !open)}>
8− <span class="font-mono inline-block transition duration-150 {open ? 'rotate-90' : ''}">▶</span>
10+ <span class="font-mono">{open ? '▼' : '▶'}</span>
911 &nbsp;
1012 <slot name="title"></slot>
1113 </button>
1214 {#if open}
13− <!-- turns out it's important not to put an await in the content -->
14− <div class="ml-[22px]" transition:slide|local="{{duration: 150 }}">
15+ <div class="ml-[22px]" transition:slide="{{duration: 50 }}">
1516 <slot name="content"></slot>
1617 </div>
1718 {/if}
ui/src/components/ShipListing.svelte+5−3
@@ -12,9 +12,8 @@
1212 export let differentiateContacts = false;
1313
1414 $: patp = normalizeId(ship.patp);
15− $: contact = $store.contacts[ship.patp];
1615 $: borderClass = differentiateContacts ? (
17− 'border-l-8 ' + (contact ? 'border-gold' : 'border-gray-300')
16+ 'border-l-8 ' + (Object.keys(ship).length > 1 ? 'border-gold' : 'border-gray-300')
1817 ) : '';
1918
2019 function handleClick() {
@@ -30,13 +29,16 @@ on:click
3029>
3130 <div class="flex p-4 items-center gap-x-4">
3231 <Sigil {patp} size={48} useNew noShrink />
32+ <!-- {#if ship.avatar}
33+ <img src={ship.avatar} class="h-12 w-12 mr-4" />
34+ {/if} -->
3335 <p class="break-words grow">
3436 <span class="align-middle mr-1">
3537 {patp}
3638 </span>
3739 <PalStatusIndicator status={getPalStatus($store.pals, patp)} class="inline" />
3840 <br/>
39− {contact?.nickname ? `(${contact.nickname})` : ''}
41+ {ship.nickname ? `(${ship.nickname})` : ''}
4042 </p>
4143 </div>
4244</div>
ui/src/components/StarChart.svelte+12−41
@@ -1,16 +1,14 @@
11<script lang="ts">
22 import LoadingSpinner from '@/common/LoadingSpinner.svelte';
33
4− import { push } from 'svelte-spa-router';
5− import { onDestroy } from 'svelte';
4+ import { push } from 'svelte-spa-router'
65
7− import Sigma from 'sigma-jh';
6+ import Sigma from 'sigma';
87 import Graph from 'graphology';
98
109 import { clan } from 'urbit-ob';
1110 import DocLink from './docs/DocLink.svelte';
12− import store from 'stores/store';
13− import keys from 'stores/keys';
11+ import { cite, normalizeId } from 'lib/id';
1412 import { parseChartData, populateGraph } from 'lib/graph';
1513 import { getChartData } from 'lib/api';
1614 import { linkToShip } from 'lib/link';
@@ -25,7 +23,6 @@
2523 let firstRender = true;
2624 let mouseDown = false;
2725 let isDragging = false;
28− let stoppedDragging = Date.now();
2926
3027 function sigma(container: HTMLElement, params: any = {}) {
3128 try {
@@ -35,15 +32,13 @@
3532 allowInvalidContainer: true,
3633 // labelColor: { color: WHITE },
3734 labelFont: 'monospace',
38− labelRenderedSizeThreshold: 2.2,
35+ labelRenderedSizeThreshold: 9,
3936 zIndex: true,
4037 maxCameraRatio: 10,
4138 });
4239
4340 s.on('clickNode', ({ node }) => {
44− if (!isDragging && 100 < Date.now() - stoppedDragging) {
45− push(linkToShip(node));
46− }
41+ push(linkToShip(node));
4742 });
4843 s.on('afterRender', () => {
4944 if (firstRender) {
@@ -63,8 +58,6 @@
6358 mc.on('mouseup', () => {
6459 if (!isDragging) {
6560 clearHighlight();
66− } else {
67− stoppedDragging = Date.now();
6861 }
6962 mouseDown = false;
7063 isDragging = false;
@@ -95,8 +88,8 @@
9588 rawChartData = { error };
9689 });
9790 }
98− $: parsedChartData = parseChartData(rawChartData, filterSet);
99− $: [parsedChartData, childKey], populateGraph(g, parsedChartData, childKey, () => {
91+ $: parsedChartData = parseChartData(rawChartData);
92+ $: [parsedChartData, bySponsor], populateGraph(g, parsedChartData, bySponsor, () => {
10093 searchFunc();
10194 });
10295
@@ -147,22 +140,7 @@
147140 "w-full" :
148141 "border-r";
149142 }
150− let childKey: ('sponsees' | 'children') = 'sponsees';
151− let filterSet: Set<string> = null;
152− $: peersSet = new Set($store.peers);
153− $: palsSet = new Set(Object.keys($store.pals.outgoing));
154−
155− function closeChart() {
156− push('/');
157− }
158−
159− $: {
160− $keys.keyup.get('escape').set('starChart', closeChart);
161− }
162−
163− onDestroy(() => {
164− $keys.keyup.get('escape').delete('starChart');
165− });
143+ let bySponsor = true;
166144</script>
167145
168146<div class="border border-gold bg-navy w-full grow flex flex-col relative">
@@ -204,20 +182,13 @@
204182 on:click={() => push('/') }>
205183 X
206184 </div>
207− <div class="flex absolute -bottom-2 inset-x-0 text-white z-10 2xs:-bottom-3.5">
185+ <div class="flex flex-col absolute -bottom-2 inset-x-0 text-white z-10 2xs:-bottom-3.5">
208186 <!-- <div class="ml-8 px-4 py-1 flex gap-x-1 items-center text-white"> -->
209187 <!-- <span>Arrange by</span> -->
210− <InlineSelect bind:value={childKey}
211− options={[
212− ['Sponsors', 'sponsees'],
213− ['Parents', 'children']
214− ]}
215− ></InlineSelect>
216− <InlineSelect bind:value={filterSet}
188+ <InlineSelect bind:value={bySponsor}
217189 options={[
218− ['All', null],
219− ['Peers', peersSet],
220− ['Pals', palsSet],
190+ ['Sponsors', true],
191+ ['Parents', false]
221192 ]}
222193 ></InlineSelect>
223194 <!-- </div> -->
ui/src/components/common/Sigil.svelte+27−27
@@ -1,8 +1,8 @@
11<script lang="ts">
22 import { clan } from 'urbit-ob';
3− // import { sigil as sigil1, stringRenderer as sr1 } from '@tlon/sigil-js';
3+ import { sigil as sigil1, stringRenderer as sr1 } from '@tlon/sigil-js';
44 import { sigil as sigil2, stringRenderer as sr2 } from '@johnhyde/sigil-js';
5− import { sigilScalingFunction, crowdedSigilScalingFunction } from 'lib/sigil';
5+ import { sigilScalingFunction } from 'lib/sigil';
66 import moonPng from 'assets/moon.png';
77 import cometSvg from 'assets/comet.svg';
88
@@ -20,46 +20,46 @@
2020 $: noShrinkWidth = noShrink ? size+'px' : 'initial';
2121
2222 $: shipClass = clan(patp);
23− $: crowded = ['comet', 'moon'].includes(shipClass);
23+ $: displaySigil = ['galaxy', 'star', 'planet'].includes(shipClass);
2424 $: {
25− // if (displaySigil) {
26− // let sigil = sigil1;
27− // let sr = sr1;
28− // let svgAST;
29− // if (useNew) {
30− let sigil = sigil2;
31− let sr = sr2;
32− let svgAST = sigil({
25+ if (displaySigil) {
26+ let sigil = sigil1;
27+ let sr = sr1;
28+ let svgAST;
29+ if (useNew) {
30+ sigil = sigil2;
31+ sr = sr2;
32+ svgAST = sigil({
3333 patp: patp,
3434 size,
3535 colors: [bgColor, fgColor],
3636 autoScaleStrokes: true,
37− strokeScalingFunctionV2: crowded ? crowdedSigilScalingFunction : sigilScalingFunction,
37+ strokeScalingFunctionV2: sigilScalingFunction,
3838 });
39− // } else {
40− // svgAST = sigil({
41− // patp: patp,
42− // size,
43− // colors: [bgColor, fgColor],
44− // });
45− // }
39+ } else {
40+ svgAST = sigil({
41+ patp: patp,
42+ size,
43+ colors: [bgColor, fgColor],
44+ });
45+ }
4646 svgAST.attributes.preserveAspectRatio = 'xMidYMin slice';
4747 svgString = sr(svgAST);
4848 if (altBgColor) {
4949 svgString = svgString.replace(/rect fill="[^"]+"/, `rect fill="${altBgColor}"`);
5050 }
51− // } else if (shipClass === 'moon') {
52− // imgSrc = moonPng;
53− // } else {
54− // imgSrc = cometSvg;
55− // }
51+ } else if (shipClass === 'moon') {
52+ imgSrc = moonPng;
53+ } else {
54+ imgSrc = cometSvg;
55+ }
5656 }
5757</script>
5858
5959<div class="grow {noShrinkClasses}" style:max-width="{size}px" style:width={noShrinkWidth}>
60− <!-- {#if displaySigil} -->
60+ {#if displaySigil}
6161 {@html svgString}
62− <!-- {:else}
62+ {:else}
6363 <img src={imgSrc} alt={shipClass} class="mx-auto" />
64− {/if} -->
64+ {/if}
6565</div>
ui/src/components/docs/Doc.svelte+1−10
@@ -1,10 +1,9 @@
11<script lang="ts">
2− import { createEventDispatcher, onDestroy } from 'svelte';
2+ import { createEventDispatcher } from 'svelte';
33 import DocContent from './DocContent.svelte';
44 import DocHome from './DocHome.svelte';
55 import Hamburger from '@/buttons/Hamburger.svelte';
66 import CloseButton from '@/buttons/CloseButton.svelte';
7− import keys from 'stores/keys';
87
98 export let path: string;
109
@@ -18,14 +17,6 @@
1817 function navigate(path) {
1918 dispatch('navigate', path);
2019 }
21−
22− $: {
23− $keys.globalkeyup.get('escape').set('doc', close);
24− }
25−
26− onDestroy(() => {
27− $keys.globalkeyup.get('escape').delete('doc');
28− });
2920</script>
3021
3122<div class="rounded-lg bg-white">
ui/src/components/search/SearchBar.svelte+10−37
@@ -3,7 +3,6 @@
33 import Symbol from './sigil/Symbol.svelte';
44
55 import docs from 'stores/docs';
6− import keys from 'stores/keys';
76 import { SearchAnalysis } from 'lib/id';
87 import { SigilQuery } from 'lib/sigil';
98
@@ -13,16 +12,8 @@
1312 export let sigilQuery: SigilQuery = new SigilQuery('planet');
1413 sigilQuery.urlString = search;
1514 export let searchMode: ('patp' | 'sigil') = 'patp';
16− export let allowSigilSearch: boolean = true;
17− let defaultPlaceholderText = "Search by @p or #. '*' matches any character";
18− export let placeholderText = defaultPlaceholderText;
15+ export let placeholderText = "Search by @p or #. '*' matches any character";
1916
20− $: {
21− placeholderText = placeholderText ? placeholderText : defaultPlaceholderText;
22− }
23− $: {
24− searchMode = allowSigilSearch ? searchMode : 'patp';
25− }
2617 $: showSigilInput = searchMode == 'sigil';
2718
2819 let bouncySearch: string = search;
@@ -79,22 +70,8 @@
7970 }
8071 }
8172
82− let searchInput;
83− let searchFocused = false;
84− function onFocus() { searchFocused = true; }
85− function onBlur() { searchFocused = false; }
86− function focus() { if (searchInput) searchInput.focus() }
87− function blur() { if (searchInput) searchInput.blur() }
88− $:{
89− $keys.keyup.get('/').set('searchBar', focus);
90− // generic binding in App.svelte takes care of blur
91− $keys.keyup.get('p').set('searchBar', closeSigilInput);
92− $keys.keyup.get('s').set('searchBar', openSigilInput);
93− }
94−
9573 function openSigilInput() {
96− if (allowSigilSearch)
97− searchMode = 'sigil';
74+ searchMode = 'sigil';
9875 }
9976
10077 function closeSigilInput() {
@@ -133,20 +110,16 @@
133110 spellcheck="false"
134111 placeholder={placeholderText}
135112 on:input={(e) => bouncySearch = e.target.value}
136− on:focus={onFocus} on:blur={onBlur}
137− bind:this={searchInput}
138113 value={search}
139114 autofocus
140115 />
141− {#if allowSigilSearch}
142− <button
143− on:click={openSigilInput}
144− class="absolute top-1 right-1 w-8 h-8 {buttonClasses}"
145− >
146− <Symbol components={'gci.lvf.lhf.lbhb.atrf4.al3.cbl2lf.cbl2mb'.split('.')} size={32}
147− altBgColor="transparent"
148− />
149− </button>
150− {/if}
116+ <button
117+ on:click={openSigilInput}
118+ class="absolute top-1 right-1 w-8 h-8 {buttonClasses}"
119+ >
120+ <Symbol components={'gci.lvf.lhf.lbhb.atrf4.al3.cbl2lf.cbl2mb'.split('.')} size={32}
121+ altBgColor="transparent"
122+ />
123+ </button>
151124 {/if}
152125</div>
ui/src/components/search/sigil/ClanSelect.svelte+2−10
@@ -3,28 +3,20 @@
33
44 import { capitalize } from 'lib/utils';
55 import { CLANS, Clan } from 'types/sigil';
6− import keys from 'stores/keys';
76
87 export let clan: Clan = 'planet';
98
109 let dropdownOpen = false;
1110
12− function openDropdown() { dropdownOpen = true }
13− function closeDropdown() { dropdownOpen = false }
14−
1511 function selectClan(itemClan: typeof clan) {
1612 clan = itemClan;
1713 dropdownOpen = false;
1814 }
19−
20− $: {
21− $keys.keyup.get('escape').set('clanSelect', closeDropdown);
22− }
2315</script>
2416
2517<div class="text-xl text-center bg-white">
2618 <p
27− on:click={openDropdown}
19+ on:click={() => dropdownOpen = true}
2820 class=" py-2"
2921 >
3022 {capitalize(clan)}
@@ -32,7 +24,7 @@
3224 </p>
3325 {#if dropdownOpen}
3426 <div class="absolute z-20 top-1 w-full flex flex-col mx-auto divide-y bg-white rounded-2xl border-b">
35− <h3 class="py-2" on:click={closeDropdown}>
27+ <h3 class="py-2" on:click={() => dropdownOpen = false}>
3628 Select Sigil Type
3729 </h3>
3830 {#each CLANS as itemClan}
ui/src/components/search/sigil/SigilInput.svelte+1−13
@@ -6,9 +6,8 @@
66 import ToggleButton from '@/buttons/ToggleButton.svelte';
77
88 import type { SigilQuery } from 'lib/sigil';
9− import { toggleStoreKey } from 'lib/utils';
109 import { searchSettings } from 'stores/searchStores';
11− import keys from 'stores/keys';
10+ import { toggleStoreKey } from 'lib/utils';
1211
1312 export let sigilQuery: SigilQuery;
1413 let focusedSymbolIndex: number = undefined;
@@ -38,17 +37,6 @@
3837 $: {
3938 sigilQuery.allowFictional = $searchSettings.allowFictionalSigils;
4039 }
41−
42− function keyboardClear() {
43− if (!focusedSymbol) {
44− clear();
45− }
46− }
47−
48− $: {
49− $keys.keyup.get('x').set('sigilInput', keyboardClear);
50− $keys.keyup.get('backspace').set('sigilInput', keyboardClear);
51− }
5240</script>
5341
5442<div>
ui/src/components/search/sigil/SymbolInputModeSelector.svelte−7
@@ -5,7 +5,6 @@
55 import SymbolInputModeSelectorButton from './SymbolInputModeSelectorButton.svelte';
66
77 import { searchSettings } from 'stores/searchStores';
8− import keys from 'stores/keys';
98 import type { PartType, ModeDef, ModeDefs } from 'types/sigil';
109 import type { SymbolQuery } from 'lib/sigil';
1110 import { MODE_DEFS } from 'types/sigil';
@@ -131,12 +130,6 @@
131130 symbolQuery = symbolQuery.clearExceptPartType('geon');
132131 }
133132 }
134−
135− $: {
136− $keys.keyup.get('x').set('sigilMode', clear);
137− $keys.keyup.get('backspace').set('sigilMode', clear);
138− $keys.keyup.get('escape').set('sigilMode', popMode);
139− }
140133</script>
141134
142135<style lang="scss">
ui/src/components/ship_view/AzimuthDetails.sveltedeleted−90
@@ -1,90 +0,0 @@
1−<script lang="ts">
2− import { clan } from 'urbit-ob';
3− import TooltipAndDocLink from '@/common/TooltipAndDocLink.svelte';
4− import EthAddressLink from '@/common/EthAddressLink.svelte';
5− import ShipChain from './ShipChain.svelte';
6−
7− export let patp: string;
8− export let pointInfo: any = {};
9−
10−
11− $: shipClass = clan(patp);
12− $: azPoint = ['galaxy', 'star', 'planet'].includes(shipClass);
13−</script>
14−
15−{#if azPoint && pointInfo.life !== undefined}
16− {#if shipClass !== 'galaxy'}
17− <p>
18− {#if pointInfo.sponsorChain && pointInfo.sponsorChain.length > 0}
19− <p>
20− {pointInfo.sponsorChain.length === 1 ? 'Sponsor:' : 'Sponsor Chain:'}
21− <ShipChain shipChain={pointInfo.sponsorChain}></ShipChain>
22− </p>
23− {:else}
24− Unsponsored
25− {/if}
26− </p>
27− {/if}
28− <p>
29− <TooltipAndDocLink
30− text="Number of times this ship's keys have been set. Must be at least 1 to use the network."
31− doc="keys"
32− class="inline"
33− >
34− Key Revision:
35− {pointInfo.life}
36− </TooltipAndDocLink>
37− </p>
38− <p>
39− <TooltipAndDocLink
40− text="Number of times this ship has breached."
41− doc="keys"
42− class="inline"
43− >
44− Factory Resets:
45− {pointInfo.rift}
46− </TooltipAndDocLink>
47− </p>
48− {#if pointInfo.proxies}
49− <p>
50− <span>
51− Owner:
52− <EthAddressLink address={pointInfo.proxies.owner.address} />
53− </span>
54− </p>
55− <p>
56− <span>
57− Management Proxy:
58− <EthAddressLink address={pointInfo.proxies['management-proxy'].address}>
59− <span class="text-gray-700">not set</span>
60− </EthAddressLink>
61− </span>
62− </p>
63− <p>
64− <span>
65− Spawn Proxy:
66− <EthAddressLink address={pointInfo.proxies['spawn-proxy'].address}>
67− <span class="text-gray-700">not set</span>
68− </EthAddressLink>
69− </span>
70− </p>
71− <p>
72− <span>
73− Transfer Proxy:
74− <EthAddressLink address={pointInfo.proxies['transfer-proxy'].address}>
75− <span class="text-gray-700">not set</span>
76− </EthAddressLink>
77− </span>
78− </p>
79− {#if shipClass === 'galaxy'}
80− <p>
81− <span>
82− Voting Proxy:
83− <EthAddressLink address={pointInfo.proxies['voting-proxy'].address}>
84− [not set]
85− </EthAddressLink>
86− </span>
87− </p>
88− {/if}
89− {/if}
90−{/if}
ui/src/components/ship_view/ShipChildrenTabs.svelte+4−35
@@ -2,7 +2,7 @@
22 import { clan } from 'urbit-ob';
33
44 import { normalizeId, filterIdsForChildMoons } from 'lib/id';
5− import { getSpawnedPoints, getUnlockedSpawnedPoints, getLockedSpawnedPoints } from 'lib/api';
5+ import { getSpawnedPoints } from 'lib/api';
66 import store from 'stores/store';
77 import ShipListings from '@/ShipListings.svelte';
88
@@ -11,10 +11,7 @@
1111
1212 let rawSpawnedPointsPromise: any;
1313 let rawSpawnedPoints: any = null;
14− let rawLockedPointsPromise: any;
15− let rawLockedPoints: any = null;
1614 let spawnedPoints: string[] = [];
17− let lockedPoints: string[] = [];
1815
1916 $: shipClass = clan(patp);
2017 $: azPoint = ['galaxy', 'star', 'planet'].includes(shipClass);
@@ -22,19 +19,8 @@
2219 $: spawnableClassPlural = !canSpawnPoints ? '' : (shipClass === 'galaxy' ? 'Star' : 'Planet');
2320 $: {
2421 rawSpawnedPoints = null;
25− rawLockedPoints = null;
2622 if (canSpawnPoints) {
27− let galaxy = shipClass === 'galaxy';
28− let getSpawnedPointsFunc = galaxy ? getUnlockedSpawnedPoints : getSpawnedPoints;
29− if (galaxy) {
30− rawLockedPointsPromise = getLockedSpawnedPoints(patp);
31− rawLockedPointsPromise.then((info) => {
32− rawLockedPoints = info;
33− }).catch((error) => {
34− rawLockedPoints = { error };
35− });
36− }
37− rawSpawnedPointsPromise = getSpawnedPointsFunc(patp);
23+ rawSpawnedPointsPromise = getSpawnedPoints(patp);
3824 rawSpawnedPointsPromise.then((info) => {
3925 rawSpawnedPoints = info;
4026 }).catch((error) => {
@@ -48,12 +34,6 @@
4834 spawnedPoints = rawSpawnedPoints?.points.map(patpToShip);
4935 }
5036 }
51− $: {
52− lockedPoints = [];
53− if (rawLockedPoints?.points) {
54− lockedPoints = rawLockedPoints?.points.map(patpToShip);
55− }
56− }
5737 $: trueSpawnedCount = spawnedCount || spawnedPoints.length;
5838 $: spawnedTab = {
5939 name: 'Spawned',
@@ -62,13 +42,6 @@
6242 points: spawnedPoints,
6343 count: trueSpawnedCount,
6444 };
65− $: lockedTab = {
66− name: 'Locked',
67− plural: 'Locked ' + spawnableClassPlural + (lockedPoints.length == 1 ? '' : 's'),
68− promise: rawLockedPointsPromise,
69− points: lockedPoints,
70− count: lockedPoints.length,
71− };
7245 $: moons = filterIdsForChildMoons($store.peers, patp).map(patpToShip);
7346 $: moonsTab = {
7447 name: 'Moons',
@@ -84,9 +57,6 @@
8457 if (spawnedCount !== undefined || spawnedPoints.length > 0) {
8558 tabs.push(spawnedTab);
8659 }
87− if (lockedPoints.length > 0) {
88− tabs.push(lockedTab);
89− }
9060 if (azPoint) {
9161 tabs.push(moonsTab);
9262 }
@@ -112,8 +82,8 @@
11282 </div>
11383 {/if}
11484 {#if tab}
115− <div>
116− <h3 class="text-lg m-2">
85+ <div class="mt-2">
86+ <h3 class="text-lg">
11787 {#if tab.count}
11888 {tab.count} {tab.plural}:
11989 {:else}
@@ -127,7 +97,6 @@
12797 <ShipListings
12898 ships={tab.points}
12999 linkToShips
130− differentiateContacts
131100 />
132101 {/await}
133102 </div>
ui/src/components/ship_view/ShipView.svelte+92−8
@@ -13,7 +13,6 @@
1313 import LoadingSpinner from '@/common/LoadingSpinner.svelte';
1414 import CollapsibleContent from '@/CollapsibleContent.svelte';
1515 import ShipChain from './ShipChain.svelte';
16− import AzimuthDetails from './AzimuthDetails.svelte';
1716 import ShipChildrenTabs from './ShipChildrenTabs.svelte';
1817 import ProfileShipViewExtension from '~/components/extensions/ProfileShipViewExtension.svelte';
1918 import PalsShipViewExtension from '@/pals/PalsShipViewExtension.svelte';
@@ -69,7 +68,12 @@
6968 <h3 class="text-lg text-center text-gray-700">{patp}</h3>
7069 {/if}
7170 <h4 class="text-center text-gray-700 break-words">
71+ <!-- <TooltipAndDocLink
72+ text="The integer representation of this ID"
73+ doc="patpee" class="inline"
74+ > -->
7275 {patp2dec(patp)}
76+ <!-- </TooltipAndDocLink> -->
7377 </h4>
7478 <div class="flex flex-wrap justify-center gap-1.5 my-1.5">
7579 <GoldBadge title={"it's a " + shipClass} doc={shipClass}>{shipClass}</GoldBadge>
@@ -103,16 +107,95 @@
103107 </p>
104108 {/if}
105109 {#if azPoint}
106− {#await rawPointInfoPromise}
107− <LoadingSpinner spinnerClass="text-black" />
108− {:then}
109110 <CollapsibleContent>
110111 <b slot="title">Azimuth Details</b>
111112 <div slot="content">
112− <AzimuthDetails {patp} {pointInfo}></AzimuthDetails>
113− </div>
114− </CollapsibleContent>
115− {/await}
113+ {#await rawPointInfoPromise}
114+ <LoadingSpinner spinnerClass="text-black" />
115+ {:then}
116+ {#if shipClass !== 'galaxy'}
117+ <p>
118+ {#if pointInfo.sponsorChain && pointInfo.sponsorChain.length > 0}
119+ <p>
120+ {pointInfo.sponsorChain.length === 1 ? 'Sponsor:' : 'Sponsor Chain:'}
121+ <ShipChain shipChain={pointInfo.sponsorChain}></ShipChain>
122+ </p>
123+ {:else}
124+ Unsponsored
125+ {/if}
126+ </p>
127+ {/if}
128+ <p>
129+ <TooltipAndDocLink
130+ text="Number of times this ship's keys have been set. Must be at least 1 to use the network."
131+ doc="keys"
132+ class="inline"
133+ >
134+ Key Revision:
135+ {pointInfo.life}
136+ </TooltipAndDocLink>
137+ </p>
138+ <p>
139+ <TooltipAndDocLink
140+ text="Number of times this ship has breached."
141+ doc="keys"
142+ class="inline"
143+ >
144+ Factory Resets:
145+ {pointInfo.rift}
146+ </TooltipAndDocLink>
147+ </p>
148+ {#if pointInfo.proxies}
149+ <p>
150+ <span>
151+ Owner:
152+ <EthAddressLink address={pointInfo.proxies.owner.address} />
153+ </span>
154+ </p>
155+ <p>
156+ <span>
157+ Management Proxy:
158+ <EthAddressLink address={pointInfo.proxies['management-proxy'].address}>
159+ <span class="text-gray-700">not set</span>
160+ </EthAddressLink>
161+ </span>
162+ </p>
163+ <p>
164+ <span>
165+ Spawn Proxy:
166+ <EthAddressLink address={pointInfo.proxies['spawn-proxy'].address}>
167+ <span class="text-gray-700">not set</span>
168+ </EthAddressLink>
169+ </span>
170+ </p>
171+ <p>
172+ <span>
173+ Transfer Proxy:
174+ <EthAddressLink address={pointInfo.proxies['transfer-proxy'].address}>
175+ <span class="text-gray-700">not set</span>
176+ </EthAddressLink>
177+ </span>
178+ </p>
179+ {#if shipClass === 'galaxy'}
180+ <p>
181+ <span>
182+ Voting Proxy:
183+ <EthAddressLink address={pointInfo.proxies['voting-proxy'].address}>
184+ [not set]
185+ </EthAddressLink>
186+ </span>
187+ </p>
188+ {/if}
189+ {/if}
190+
191+ <!-- {#if value && value.point}
192+ <pre class="text-sm overflow-scroll">
193+ Raw Info:{JSON.stringify(rawPointInfo, null, 2)}
194+ </pre>
195+ {/if} -->
196+ {/await}
197+ </div>
198+ </CollapsibleContent>
116199 {/if}
117200 </div>
118201 </div>
@@ -121,6 +204,7 @@
121204 <ProfileShipViewExtension {patp} />
122205 <PalsShipViewExtension {patp} />
123206 <AppsShipViewExtension {patp} />
207+ <!-- <GroupsShipViewExtension {patp} /> -->
124208 </div>
125209 {#if azPoint}
126210 <div class="mt-5 border-t">
ui/src/lib/api.ts−8
@@ -24,14 +24,6 @@ export function getSpawnedPoints(patp: string): Promise<any> {
2424 return scry<any>(`/point/${patp}/spawned`);
2525}
2626
27−export function getLockedSpawnedPoints(patp: string): Promise<any> {
28− return scry<any>(`/point/${patp}/spawned/locked`);
29−}
30−
31−export function getUnlockedSpawnedPoints(patp: string): Promise<any> {
32− return scry<any>(`/point/${patp}/spawned/unlocked`);
33−}
34−
3527export function getPeers(): Promise<any> {
3628 return scry<any>(`/peers`);
3729}
ui/src/lib/apps.ts+1−3
@@ -23,13 +23,11 @@ export function getApp(ship: string, desk: string): Promise<any> {
2323export async function getAppByPath(path: string, retry: number = 2): Promise<any> {
2424 try {
2525 return await api.scry<any>({ app: 'treaty', path: `/treaty/${path}` });
26− } catch (e) {
26+ } catch {
2727 if (retry > 0) {
2828 console.log(`Got error when fetching app: ${path}.\nTrying at most ${retry} more time(s)`);
2929 await sleep(750);
3030 return getAppByPath(path, retry - 1);
31− } else {
32− throw e;
3331 }
3432 }
3533}
ui/src/lib/colors.ts−3
@@ -6,12 +6,9 @@ export const GOLDS2 = '#caa93e';
66export const WHITE = '#FFF';
77export const LGREY = '#BBB';
88export const DGREY = '#777';
9−export const DDGREY = '#555';
109export const BLUE = '#1792c7';
1110export const GREEN = '#17c76a';
1211export const YOU_ARE_HERE = '#802';
1312export const YOU = '#b01';
1413export const YOUR_STAR = '#d71';
1514export const YOUR_GAL = '#fb1';
16−export const SUB_PICKED = LGREY;
17−export const NOT_PICKED = DDGREY;
ui/src/lib/graph.ts+105−152
@@ -6,161 +6,123 @@ const example = '[0[3216291:t;9219219;4608:s[156546;1612196;219621:~;321965149:4
66export interface ChartPoint {
77 patp: string,
88 dominion: ('l1' | 'l2' | 'spawn'),
9− picked: boolean,
10− pickedChildren?: boolean,
11− pickedSponsees?: boolean,
129 sponsor?: string,
1310 parent?: string,
1411 children?: ChartPoint[],
1512 sponsees?: ChartPoint[],
1613}
1714
18−interface ChartSubs {
19− children: ChartPoint[],
20− sponsees: ChartPoint[],
21−}
22−
23−class ChartDataParser {
24− filter: Set<string>;
25−
26− constructor(filter: Set<string>) {
27− this.filter = filter;
15+function parseMetaString(metaString: string): ChartPoint {
16+ let idString, subMetaString = '';
17+ const colIndex = metaString.indexOf(':');
18+ if (colIndex === -1) {
19+ idString = metaString;
20+ } else {
21+ idString = metaString.slice(0, colIndex);
22+ subMetaString = metaString.slice(colIndex + 1);
2823 }
29−
30− parseMetaString(metaString: string): ChartPoint {
31− let idString, subMetaString = '';
32− const colIndex = metaString.indexOf(':');
33− if (colIndex === -1) {
34− idString = metaString;
35− } else {
36− idString = metaString.slice(0, colIndex);
37− subMetaString = metaString.slice(colIndex + 1);
38− }
39− const patp = '~' + idString;
40− const meta: ChartPoint = {
41− patp,
42− picked: !this.filter ? true : (this.filter.has(patp)),
43− dominion: 'l1',
24+ const meta: ChartPoint = {
25+ patp: '~' + idString,
26+ dominion: 'l1',
27+ }
28+ if (subMetaString) {
29+ const firstChar = subMetaString[0];
30+ if (firstChar === 't') {
31+ meta.dominion = 'l2';
32+ subMetaString = subMetaString.slice(1);
33+ } else if (firstChar === 's') {
34+ meta.dominion = 'spawn';
35+ subMetaString = subMetaString.slice(1);
4436 }
4537 if (subMetaString) {
46− const firstChar = subMetaString[0];
47− if (firstChar === 't') {
48− meta.dominion = 'l2';
49− subMetaString = subMetaString.slice(1);
50− } else if (firstChar === 's') {
51− meta.dominion = 'spawn';
52− subMetaString = subMetaString.slice(1);
53− }
54− if (subMetaString) {
55− if (subMetaString[0] === '~') {
56− meta.sponsor = null;
57− } else {
58− let [sponsor, parent] = subMetaString.slice(1).split('!');
59− meta.sponsor = '~' + sponsor;
60− meta.parent = '~' + parent;
61− }
38+ if (subMetaString[0] === '~') {
39+ meta.sponsor = null;
40+ } else {
41+ let [sponsor, parent] = subMetaString.slice(1).split('!');
42+ meta.sponsor = '~' + sponsor;
43+ meta.parent = '~' + parent;
6244 }
6345 }
64− return meta;
6546 }
47+ return meta;
48+}
6649
67− extractMeta(data: string): [ChartPoint, string] {
68− const index = data.search(/[[;]/);
69− if (index === -1) {
70− throw new Error(`No point meta present in ${data}`);
71− }
72− const metaString = data.slice(0, index);
73− data = data.slice(index);
74− return [this.parseMetaString(metaString), data];
50+function extractMeta(data: string): [ChartPoint, string] {
51+ const index = data.search(/[[;]/);
52+ if (index === -1) {
53+ throw new Error(`No point meta present in ${data}`);
7554 }
55+ const metaString = data.slice(0, index);
56+ data = data.slice(index);
57+ return [parseMetaString(metaString), data];
58+}
7659
77− extractChildren(data: string, sup: string = undefined): [ChartSubs, string] {
78− if (data[0] === ';')
79− return [{
80− children: [],
81− sponsees: [],
82− }, data.slice(1)];
83− if (data[0] !== '[') throw new Error('Invalid children in data: ' + data.slice(0, 20));
60+function extractChildren(data: string, sup: string = undefined): [ChartPoint[], ChartPoint[], string] {
61+ if (data[0] === ';') return [[], [], data.slice(1)];
62+ if (data[0] !== '[') throw new Error('Invalid children in data: ' + data.slice(0, 20));
8463
85− let endFound = false;
86− let counter = 0;
87− data = data.slice(1);
88− const children = [];
89− const sponsees = [];
90− while (!endFound && data.length && counter < 20000) {
91− if (data[0] === ']') {
92− endFound = true;
93− data = data.slice(1);
94− } else {
95− let sub;
96− [sub, data] = this.extractChartPoint(data);
97− if (!sub.parent || sub.parent === sup)
98− children.push(sub);
99− if (sub.sponsor === undefined || sub.sponsor === sup)
100− sponsees.push(sub);
101− }
102− counter++;
64+ let endFound = false;
65+ let counter = 0;
66+ data = data.slice(1);
67+ const children = [];
68+ const sponsees = [];
69+ while (!endFound && data.length && counter < 20000) {
70+ if (data[0] === ']') {
71+ endFound = true;
72+ data = data.slice(1);
73+ } else {
74+ let sub;
75+ [sub, data] = extractChartPoint(data);
76+ if (!sub.parent || sub.parent === sup)
77+ children.push(sub);
78+ if (sub.sponsor === undefined || sub.sponsor === sup)
79+ sponsees.push(sub);
10380 }
104− return [{ children, sponsees }, data];
105− }
106−
107− extractChartPoint(data: string): [ChartPoint, string] {
108− let point, subs;
109− [point, data] = this.extractMeta(data);
110− [subs, data] = this.extractChildren(data, point.patp);
111− point = {
112− ...point,
113− ...subs,
114− };
115− return [point, data];
81+ counter++;
11682 }
83+ return [children, sponsees, data];
84+}
11785
118− linkChartData(points: ChartPoint[], store: any): ChartPoint[] {
119− if (!points) return points;
120− return points.map(point => {
121− if (!store[point.patp]) return point;
122− if (!point.children?.length) {
123− point.children = this.linkChartData(store[point.patp].children, store);
124− let picked = point.children.filter(child => child.picked || child.pickedChildren);
125− point.pickedChildren = picked.length > 0;
126− }
127− if (!point.sponsees?.length) {
128− point.sponsees = this.linkChartData(store[point.patp].sponsees, store);
129− let picked = point.sponsees.filter(child => child.picked || child.pickedSponsees);
130− point.pickedSponsees = picked.length > 0;
131− }
132− return point;
133− });
134− }
86+function extractChartPoint(data: string): [ChartPoint, string] {
87+ let point, children, sponsees;
88+ [point, data] = extractMeta(data);
89+ [children, sponsees, data] = extractChildren(data, point.patp);
90+ point.children = children;
91+ point.sponsees = sponsees;
92+ return [point, data];
93+}
13594
136− parse(str: string): ChartSubs {
137− if (!str) return { children: [], sponsees: [] };
138− let [{ children: baseChildren }, _] = this.extractChildren(str, undefined);
139− let store = {};
140− baseChildren.forEach(child => {
141− store[child.patp] = {
142− children: child.children,
143− sponsees: child.sponsees,
144− };
145− });
146− let base: ChartPoint = {
147− patp: '~base',
148− dominion: 'l1',
149− picked: true,
95+function linkChartData(points: ChartPoint[], store: any): ChartPoint[] {
96+ if (!points) return points;
97+ return points.map(point => {
98+ if (!store[point.patp]) return point;
99+ if (!point.children?.length) {
100+ point.children = linkChartData(store[point.patp].children, store);
150101 }
151−
152− let points = this.linkChartData([base], store);
153− return {
154− children: points[0].children || [],
155− sponsees: points[0].sponsees || [],
102+ if (!point.sponsees?.length) {
103+ point.sponsees = linkChartData(store[point.patp].sponsees, store);
156104 }
157− }
105+ return point;
106+ });
158107}
159108
160−export function parseChartData(data: string, filter: Set<string>): ChartSubs {
109+function _parseChartData(str: string): ChartPoint[] {
110+ if (!str) return [];
111+ let [baseChildren, _] = extractChildren(str);
112+ let store = {};
113+ baseChildren.forEach(child => {
114+ store[child.patp] = {
115+ children: child.children,
116+ sponsees: child.sponsees,
117+ };
118+ });
119+
120+ return linkChartData(store['~base'].children, store);
121+}
122+
123+export function parseChartData(data: string): ChartPoint[] {
161124 let start = Date.now();
162− let parser = new ChartDataParser(filter);
163− let parsed = parser.parse(data);
125+ let parsed = _parseChartData(data);
164126 // console.log(`finished parsing chart data to js object in ${Date.now() - start} ms`);
165127 return parsed;
166128}
@@ -226,23 +188,16 @@ export function arrangePointsInSpirals(
226188 minDistanceBetween,
227189 };
228190}
229−type childKey = ('sponsees' | 'children');
230−export function populateGraph(g: Graph, chartSubs: ChartSubs, subsKey: childKey, callback?): Graph {
231− let pickedSubsKey = subsKey == 'children' ? 'pickedChildren' : 'pickedSponsees';
232− function pickedColor(point: ChartPoint, normal: string) {
233− return point.picked ? normal : (point[pickedSubsKey] ? colors.SUB_PICKED : colors.NOT_PICKED);
234− }
235− function pickedArmColor(point: ChartPoint, normal: string) {
236− return point[pickedSubsKey] ? normal : colors.NOT_PICKED;
237− }
238− let points = chartSubs[subsKey];
239− if (!(points instanceof Array)) return;
191+
192+export function populateGraph(g: Graph, chartData: ChartPoint[], bySponsor: boolean, callback?): Graph {
193+ if (!(chartData instanceof Array)) return;
240194 if (!g) {
241195 g = new Graph();
242196 } else {
243197 g.clear();
244198 }
245199
200+ let subsKey = bySponsor ? 'sponsees' : 'children';
246201 let sponsorEdges = [];
247202
248203 let offsetX = 0;
@@ -252,7 +207,7 @@ export function populateGraph(g: Graph, chartSubs: ChartSubs, subsKey: childKey,
252207 let b = 9000000;
253208 let theta = 0;
254209
255− points.forEach((galaxy, gi) => {
210+ chartData.forEach((galaxy, gi) => {
256211 offsetX = 0 + (a + b * theta) * Math.cos(theta);
257212 offsetY = 0 + (a + b * theta) * Math.sin(theta);
258213
@@ -262,7 +217,7 @@ export function populateGraph(g: Graph, chartSubs: ChartSubs, subsKey: childKey,
262217 g.addNode(gPatp, {
263218 label: gPatp,
264219 size: 3,
265− color: itsYou ? colors.YOU : pickedColor(galaxy, colors.WHITE),
220+ color: itsYou ? colors.YOU : colors.WHITE,
266221 x: offsetX,
267222 y: offsetY,
268223 zIndex: 10,
@@ -287,7 +242,6 @@ export function populateGraph(g: Graph, chartSubs: ChartSubs, subsKey: childKey,
287242 });
288243 let lastStarArm = null;
289244 let lastStarPatp = null;
290− let GSarmColor = pickedArmColor(galaxy, colors.LGREY)
291245 stars.forEach((star, si) => {
292246 const sPatp = star.patp;
293247
@@ -302,20 +256,20 @@ export function populateGraph(g: Graph, chartSubs: ChartSubs, subsKey: childKey,
302256 g.addNode(sPatp, {
303257 label: sPatp,
304258 size: starSize,
305− color: itsYou ? colors.YOU : pickedColor(star, colors.GOLDT2),
259+ color: itsYou ? colors.YOU : colors.GOLDT2,
306260 x: starX,
307261 y: starY,
308262 zIndex: 8,
309263 });
310264 if (lastStarArm == arm) {
311265 g.addEdge(sPatp, lastStarPatp, {
312− color: GSarmColor,
266+ color: colors.LGREY,
313267 size: 0.1,
314268 zIndex: 7,
315269 });
316270 } else {
317271 g.addEdge(sPatp, gPatp, {
318− color: GSarmColor,
272+ color: colors.LGREY,
319273 size: 0.2,
320274 zIndex: 9,
321275 });
@@ -350,8 +304,7 @@ export function populateGraph(g: Graph, chartSubs: ChartSubs, subsKey: childKey,
350304 });
351305 let lastPlanetArm = null;
352306 let lastPlanetPatp = null;
353− let SParmColor = pickedArmColor(star, colors.DGREY)
354− planets.forEach((planet, pi) => {
307+ planets.forEach((planet, pi) => {
355308 const pPatp = planet.patp;
356309 const [planetX, planetY] = planetCoords[pi].coords;
357310 const arm = planetCoords[pi].arm;
@@ -366,21 +319,21 @@ export function populateGraph(g: Graph, chartSubs: ChartSubs, subsKey: childKey,
366319 g.addNode(pPatp, {
367320 label: pPatp,
368321 size: planetSize,
369− color: itsYou ? colors.YOU : pickedColor(planet, planet.dominion == 'l2' ? colors.GREEN : colors.BLUE),
322+ color: itsYou ? colors.YOU : (planet.dominion == 'l2' ? colors.GREEN : colors.BLUE),
370323 x: planetX,
371324 y: planetY,
372325 zIndex: 6,
373326 });
374327 if (lastPlanetArm == arm) {
375328 g.addEdge(pPatp, lastPlanetPatp, {
376− color: SParmColor,
329+ color: colors.DGREY,
377330 size: planetEdgeSize,
378331 zIndex: 5,
379332 });
380333 } else {
381334 if (numPlanetArms == 1) {
382335 g.addEdge(pPatp, sPatp, {
383− color: SParmColor,
336+ color: colors.DGREY,
384337 size: planetEdgeSize,
385338 zIndex: 5,
386339 });
ui/src/lib/link.ts+3−3
@@ -1,16 +1,16 @@
11import { buildQuerystring } from './utils';
22
33export function linkToShip(patp: string, queryParams = {}): string {
4− return `/ship/${encodeURIComponent(patp)}` + buildQuerystring(queryParams);
4+ return `/ship/${patp}` + buildQuerystring(queryParams);
55}
66
77export function linkToSearch(search: string, queryParams = {}): string {
8− return `/search/${encodeURIComponent(search)}` + buildQuerystring(queryParams);
8+ return `/search/${search}` + buildQuerystring(queryParams);
99}
1010
1111export function linkToChart(patp: string): string {
1212 if (patp) {
13− return `/chart/${encodeURIComponent(patp)}`;
13+ return `/chart/${patp}`;
1414 }
1515 return `/chart`;
1616}
ui/src/lib/sigil.ts−4
@@ -11,10 +11,6 @@ export function sigilScalingFunction(size: number): number {
1111 return 3.5 * Math.sqrt(51 / size);
1212}
1313
14−export function crowdedSigilScalingFunction(size: number): number {
15− return 2.8 * Math.sqrt(51 / size);
16−}
17−
1814export class SigilQuery {
1915 clan: Clan;
2016 symbols: SymbolQuery[];
ui/src/routes/Home.svelte+24−40
@@ -12,7 +12,6 @@
1212 import ValidationProblems from '@/ValidationProblems.svelte';
1313 import HomeScreenTiles from '@/HomeScreenTiles.svelte';
1414 export let params: any = {};
15−
1615 let analysis: SearchAnalysis = new SearchAnalysis();
1716 let sigilQuery: SigilQuery = new SigilQuery('planet');
1817 let navigating = false;
@@ -35,42 +34,11 @@
3534 urlSearchMode = getUrlSearchMode(searchParams);
3635 urlChangedSinceShipQuery = true;
3736 navigating = false;
38− // console.log('url changed');
3937 }
4038 }
4139 $: {
4240 urlChangedSinceShipQuery = (search || true) && searchMode && false;
43− // console.log('search changed');
44− }
45− function autoNav() {
46− // console.log('autonav');
47− if ((search !== urlSearch || searchMode !== urlSearchMode)) {
48− if (urlChangedSinceShipQuery) {
49− search = urlSearch;
50− searchMode = urlSearchMode;
51− // console.log('url wins');
52− } else {
53− navigating = true;
54− // console.log('search wins');
55− // create a temp one because the real one doesn't always update in time!
56− let tempAnalysis = new SearchAnalysis(search);
57− if (params.mode === 'chart') {
58− // console.log('to chart');
59− navToChart(tempAnalysis.patpIsValid);
60− } else {
61− if (tempAnalysis.patpIsValid) {
62− // console.log('to ship view');
63− navToShipView(tempAnalysis.patp, true);
64− } else {
65− const fromShipMode = params.mode === 'ship';
66− // console.log('to search');
67− navToSearch(fromShipMode);
68− }
69− }
70− }
71− }
7241 }
73− $: urlSearch, urlSearchMode, search, searchMode, autoNav();
7442 function nav(path, addToHistory = false) {
7543 (addToHistory ? push : replace)(path);
7644 }
@@ -83,7 +51,7 @@
8351 nav('/' + buildQuerystring({ mode: searchMode }), addToHistory);
8452 }
8553 }
86− function navToShipView(patp, addToHistory = false) {
54+ function navToShipView(addToHistory = false) {
8755 params.mode = 'ship';
8856 params.arg = patp;
8957 if (patp === search) {
@@ -119,6 +87,27 @@
11987 navHome(addToHistory);
12088 }
12189 }
90+ function autoNav() {
91+ if ((search !== urlSearch || searchMode !== urlSearchMode)) {
92+ if (urlChangedSinceShipQuery) {
93+ search = urlSearch;
94+ searchMode = urlSearchMode;
95+ } else {
96+ navigating = true;
97+ if (params.mode === 'chart') {
98+ navToChart(analysis.patpIsValid);
99+ } else {
100+ if (patp) {
101+ navToShipView(true);
102+ } else {
103+ const fromShipMode = params.mode === 'ship';
104+ navToSearch(fromShipMode);
105+ }
106+ }
107+ }
108+ }
109+ }
110+ $: urlSearch, urlSearchMode, search, searchMode, autoNav();
122111 $: {
123112 let properMode = params.mode;
124113 if (properMode === 'chart') {
@@ -160,13 +149,8 @@
160149</script>
161150
162151<div class="p-4 space-y-4 min-h-full flex flex-col items-center 2xs:p-8 2xs:space-y-8">
163− <SearchBar bind:analysis bind:sigilQuery bind:search bind:searchMode bind:patp {placeholderText}
164− allowSigilSearch={params.mode !== 'chart'}
165− />
152+ <SearchBar bind:analysis bind:sigilQuery bind:search bind:searchMode bind:patp {placeholderText} />
166153 <!-- <div class="bg-white">
167− <p>
168− Mode: {params.mode}
169− </p>
170154 <p>
171155 Search: {search}
172156 </p>
@@ -180,7 +164,7 @@
180164 Patp: {patp}
181165 </p>
182166 </div> -->
183− {#if params.mode == 'chart'}
167+ {#if params.mode == "chart"}
184168 <StarChart patp={patp || null} />
185169 {:else if patp}
186170 <ShipView {patp} />
ui/src/stores/keys.tsdeleted−68
@@ -1,68 +0,0 @@
1−import { writable, get } from 'svelte/store';
2−
3−const docs = {};
4−
5−class MapWithDefault<K, V> extends Map<K, V> {
6− default: Function;
7−
8− get(key: K) {
9− if (!this.has(key)) {
10− this.set(key, this.default());
11− }
12− return super.get(key);
13− }
14−
15− constructor(defaultFunction: () => V) {
16− super();
17− this.default = defaultFunction;
18− }
19−}
20−
21−type Bindings = MapWithDefault<string, MapWithDefault<string, Function>>;
22−interface KeysStore {
23− keydown: Bindings;
24− keyup: Bindings;
25− globalkeydown: Bindings;
26− globalkeyup: Bindings;
27−};
28−function newEmptyBindings(): Bindings {
29− return new MapWithDefault(() => new MapWithDefault(() => Function));
30−}
31−const initStore: KeysStore = {
32− keydown: newEmptyBindings(),
33− keyup: newEmptyBindings(),
34− globalkeydown: newEmptyBindings(),
35− globalkeyup: newEmptyBindings(),
36−};
37−
38−const store = writable(initStore);
39−const { subscribe, update, set } = store;
40−
41−function runCallbacks(bindings: Bindings, event: KeyboardEvent) {
42− let els = [];
43− if (event.ctrlKey) els.push('ctrl');
44− if (event.metaKey) els.push('cmd');
45− if (event.altKey) els.push('alt');
46− if (event.shiftKey) els.push('shift');
47− els.push(event.key == ' ' ? 'Space' : event.key.toLowerCase());
48− let combo = els.join('+');
49− // console.log(event);
50− let callbacks = bindings.get(combo);
51− if (callbacks) {
52− callbacks.forEach((callback) => {
53− try {
54− if (callback)
55− callback(event);
56− } catch (e) {
57− console.error(e);
58− }
59− });
60− }
61−}
62−
63−export default {
64− subscribe,
65− update,
66− set,
67− runCallbacks,
68−};
ui/src/styles/tailwind-output.css+14−34
@@ -650,15 +650,15 @@ Ensure the default browser behavior of the `hidden` attribute.
650650.ml-\[22px\] {
651651 margin-left: 22px;
652652}
653+.mr-4 {
654+ margin-right: 1rem;
655+}
653656.mr-1 {
654657 margin-right: 0.25rem;
655658}
656659.ml-8 {
657660 margin-left: 2rem;
658661}
659−.mr-4 {
660− margin-right: 1rem;
661−}
662662.ml-1 {
663663 margin-left: 0.25rem;
664664}
@@ -728,9 +728,6 @@ Ensure the default browser behavior of the `hidden` attribute.
728728.-mb-16 {
729729 margin-bottom: -4rem;
730730}
731−.mb-2 {
732− margin-bottom: 0.5rem;
733−}
734731.-mt-0\.5 {
735732 margin-top: -0.125rem;
736733}
@@ -764,15 +761,15 @@ Ensure the default browser behavior of the `hidden` attribute.
764761.h-full {
765762 height: 100%;
766763}
764+.h-12 {
765+ height: 3rem;
766+}
767767.h-3 {
768768 height: 0.75rem;
769769}
770770.h-\[100vh\] {
771771 height: 100vh;
772772}
773−.h-12 {
774− height: 3rem;
775−}
776773.h-5 {
777774 height: 1.25rem;
778775}
@@ -857,6 +854,9 @@ Ensure the default browser behavior of the `hidden` attribute.
857854 width: -moz-min-content;
858855 width: min-content;
859856}
857+.w-12 {
858+ width: 3rem;
859+}
860860.w-3 {
861861 width: 0.75rem;
862862}
@@ -866,9 +866,6 @@ Ensure the default browser behavior of the `hidden` attribute.
866866.w-\[100vw\] {
867867 width: 100vw;
868868}
869−.w-12 {
870− width: 3rem;
871−}
872869.w-5 {
873870 width: 1.25rem;
874871}
@@ -1032,10 +1029,6 @@ Ensure the default browser behavior of the `hidden` attribute.
10321029 --tw-translate-y: -25%;
10331030 transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
10341031}
1035−.rotate-90 {
1036− --tw-rotate: 90deg;
1037− transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
1038−}
10391032.rotate-45 {
10401033 --tw-rotate: 45deg;
10411034 transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
@@ -1784,12 +1777,6 @@ Ensure the default browser behavior of the `hidden` attribute.
17841777.leading-3 {
17851778 line-height: .75rem;
17861779}
1787−.leading-5 {
1788− line-height: 1.25rem;
1789−}
1790−.leading-8 {
1791− line-height: 2rem;
1792−}
17931780.text-gray-600 {
17941781 --tw-text-opacity: 1;
17951782 color: rgb(75 85 99 / var(--tw-text-opacity));
@@ -1881,10 +1868,6 @@ Ensure the default browser behavior of the `hidden` attribute.
18811868 --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);
18821869 box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);
18831870}
1884−.blur {
1885− --tw-blur: blur(8px);
1886− filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
1887−}
18881871.drop-shadow {
18891872 --tw-drop-shadow: drop-shadow(0 1px 2px rgb(0 0 0 / 0.1)) drop-shadow(0 1px 1px rgb(0 0 0 / 0.06));
18901873 filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
@@ -1896,13 +1879,6 @@ Ensure the default browser behavior of the `hidden` attribute.
18961879.filter {
18971880 filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
18981881}
1899−.transition {
1900− transition-property: color, background-color, border-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-text-decoration-color, -webkit-backdrop-filter;
1901− transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter;
1902− transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-text-decoration-color, -webkit-backdrop-filter;
1903− transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
1904− transition-duration: 150ms;
1905−}
19061882.transition-opacity {
19071883 transition-property: opacity;
19081884 transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
@@ -1918,7 +1894,11 @@ Ensure the default browser behavior of the `hidden` attribute.
19181894 transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
19191895 transition-duration: 150ms;
19201896}
1921−.duration-150 {
1897+.transition {
1898+ transition-property: color, background-color, border-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-text-decoration-color, -webkit-backdrop-filter;
1899+ transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter;
1900+ transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-text-decoration-color, -webkit-backdrop-filter;
1901+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
19221902 transition-duration: 150ms;
19231903}
19241904.hover\:bg-gray-200:hover {
ui/vite.config.ts+1−1
@@ -7,7 +7,7 @@ import path from 'path';
77export default ({ mode }) => {
88 Object.assign(process.env, loadEnv(mode, process.cwd()));
99 const SHIP_URL = process.env.SHIP_URL || process.env.VITE_SHIP_URL || 'http://localhost:8080';
10− console.log('SHIP_URL', SHIP_URL);
10+ console.log(SHIP_URL);
1111
1212 return defineConfig({
1313 plugins: [