on main help sign in
base-desk/lib/agentio.hoon+4−6
since splitsnapshots
unifiedsplit
@@ -66,7 +66,7 @@
66 ::
66 ::
67 ++ rest
67 ++ rest
68 |= p=@da
68 |= p=@da
69− (arvo %b %wait p)
69+ (arvo %b %rest p)
70 ::
70 ::
71 ++ warp
71 ++ warp
72 |= [wer=ship =riff:clay]
72 |= [wer=ship =riff:clay]
@@ -85,16 +85,14 @@
85 ?:(?=(%sing genre) [genre mood] [genre mood])
85 ?:(?=(%sing genre) [genre mood] [genre mood])
86 (warp-our q.byk.bowl `rave)
86 (warp-our q.byk.bowl `rave)
87 ::
87 ::
88+ ++ tire
89+ (arvo %c %tire `~)
90+ ::
88 ++ connect
91 ++ connect
89 |= [=binding:eyre app=term]
92 |= [=binding:eyre app=term]
90 (arvo %e %connect binding app)
93 (arvo %e %connect binding app)
91 --
94 --
92::
95::
93−++ fact-curry
94− |* [=mark =mold]
95− |= [paths=(list path) fac=mold]
96− (fact mark^!>(fac) paths)
97−::
98++ fact-kick
96++ fact-kick
99 |= [=path =cage]
97 |= [=path =cage]
100 ^- (list card)
98 ^- (list card)
base-desk/lib/azimuth.hoon+9−9
@@ -114,29 +114,29 @@
114 ::
114 ::
115 :: Testnet contract addresses
115 :: Testnet contract addresses
116 ::
116 ::
117− ++ ropsten-contracts
117+ ++ goerli-contracts
118 |%
118 |%
119 ++ azimuth
119 ++ azimuth
120− 0x308a.b6a6.024c.f198.b57e.008d.0ac9.ad02.1988.6579
120+ 0xbb61.fa68.3e4b.9104.18e2.7b00.a143.8a93.6234.df52
121 ::
121 ::
122 ++ ecliptic
122 ++ ecliptic
123− 0x8b9f.86a2.8921.d9c7.05b3.113a.755f.b979.e1bd.1bce
123+ 0xe129.0a32.9014.5e63.e6a8.ec1e.f661.6906.856d.0c8f
124 ::
124 ::
125 ++ linear-star-release
125 ++ linear-star-release
126− 0x1f8e.dd03.1ee4.1474.0aed.b39b.84fb.8f2f.66ca.422f
126+ 0x0
127 ::
127 ::
128 ++ conditional-star-release
128 ++ conditional-star-release
129 0x0
129 0x0
130 ::
130 ::
131 ++ delegated-sending
131 ++ delegated-sending
132− 0x3e8c.a510.354b.c2fd.bbd6.1502.52d9.3105.c9c2.7bbe
132+ 0x0
133 ::
133 ::
134 ++ naive
134 ++ naive
135− 0xe7cf.4b83.06d3.11ba.ca15.585f.e3f0.7cd0.441c.21d1
135+ 0x56e3.7137.cdaf.c026.a732.e8e8.40cd.621e.d50b.d210
136 ::
136 ::
137− ++ launch 4.601.630
137+ ++ launch 7.834.742
138− ++ public launch
138+ ++ public 7.834.800
139− ++ chain-id 3
139+ ++ chain-id 5
140 --
140 --
141 ::
141 ::
142 :: Local contract addresses
142 :: Local contract addresses
base-desk/lib/azimuthio.hoon+3−3
@@ -43,8 +43,8 @@
43 url=url
43 url=url
44 header-list=['Content-Type'^'application/json' ~]
44 header-list=['Content-Type'^'application/json' ~]
45 ^= body
45 ^= body
46− %- some %- as-octt:mimes:html
46+ %- some %- as-octs:mimes:html
47− %- en-json:html
47+ %- en:json:html
48 (request-to-json:rpc:ethereum id req)
48 (request-to-json:rpc:ethereum id req)
49 ==
49 ==
50 ;< ~ bind:m (send-request:strandio request)
50 ;< ~ bind:m (send-request:strandio request)
@@ -62,7 +62,7 @@
62 ?~ full-file.client-response
62 ?~ full-file.client-response
63 (pure:m ~)
63 (pure:m ~)
64 =/ body=@t q.data.u.full-file.client-response
64 =/ 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)
66 ?~ jon
66 ?~ jon
67 (pure:m ~)
67 (pure:m ~)
68 =, dejs-soft:format
68 =, dejs-soft:format
base-desk/lib/bitcoin-utils.hoon+2−1
@@ -143,6 +143,7 @@
143 |= a=@
143 |= a=@
144 ^- hexb
144 ^- hexb
145 =/ l=@ (met 3 a)
145 =/ l=@ (met 3 a)
146+ ?: =(l 0) 1^a
146 ?: =(l 1) 1^a
147 ?: =(l 1) 1^a
147 ?: =(l 2) (cat:byt ~[1^0xfd (flip:byt 2^a)])
148 ?: =(l 2) (cat:byt ~[1^0xfd (flip:byt 2^a)])
148 ?: (lte l 4) (cat:byt ~[1^0xfe (flip:byt 4^a)])
149 ?: (lte l 4) (cat:byt ~[1^0xfe (flip:byt 4^a)])
@@ -162,7 +163,7 @@
162 %0xfe 2
163 %0xfe 2
163 %0xff 3
164 %0xff 3
164 ==
165 ==
165− :_ (drop:byt (add 1 len) h)
166+ :_ (drop:byt (add 1 (bex len)) h)
166 %- flip:byt
167 %- flip:byt
167 (take:byt (bex len) (drop:byt 1 h))
168 (take:byt (bex len) (drop:byt 1 h))
168 :: +dea: atom instead of hexb for parsed CompactSize
169 :: +dea: atom instead of hexb for parsed CompactSize
base-desk/lib/dbug.hoon+9−3
@@ -4,7 +4,8 @@
4::
4::
5|%
5|%
6+$ poke
6+$ poke
7+ $% [%skip depth=@ud =poke]
7− $% [%bowl ~]
8+ [%bowl ~]
8 [%state grab=cord]
9 [%state grab=cord]
9 [%incoming =about]
10 [%incoming =about]
10 [%outgoing =about]
11 [%outgoing =about]
@@ -32,8 +33,13 @@
32 ?. ?=(%dbug mark)
33 ?. ?=(%dbug mark)
33 =^ cards agent (on-poke:ag mark vase)
34 =^ cards agent (on-poke:ag mark vase)
34 [cards this]
35 [cards this]
35− =/ dbug
36− !<(poke vase)
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]
37 =; =tang
43 =; =tang
38 ((%*(. slog pri 1) tang) [~ this])
44 ((%*(. slog pri 1) tang) [~ this])
39 ?- -.dbug
45 ?- -.dbug
base-desk/lib/dill.hoonnew file+94
@@ -0,0 +1,94 @@
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+9−3
@@ -652,7 +652,7 @@
652 :^ url %post
652 :^ url %post
653 %- ~(gas in *math)
653 %- ~(gas in *math)
654 ~['Content-Type'^['application/json']~]
654 ~['Content-Type'^['application/json']~]
655− (some (as-octt (en-json:html jon)))
655+ (some (as-octs (en:json:html jon)))
656 :: +light-json-request: like json-request, but for %l
656 :: +light-json-request: like json-request, but for %l
657 ::
657 ::
658 :: TODO: Exorcising +purl from our system is a much longer term effort;
658 :: TODO: Exorcising +purl from our system is a much longer term effort;
@@ -665,7 +665,7 @@
665 :* %'POST'
665 :* %'POST'
666 (crip (en-purl:html url))
666 (crip (en-purl:html url))
667 ~[['content-type' 'application/json']]
667 ~[['content-type' 'application/json']]
668− (some (as-octt (en-json:html jon)))
668+ (some (as-octs (en:json:html jon)))
669 ==
669 ==
670 ::
670 ::
671 ++ batch-read-request
671 ++ batch-read-request
@@ -733,7 +733,7 @@
733 ::
733 ::
734 %eth-get-block-by-number
734 %eth-get-block-by-number
735 :- 'eth_getBlockByNumber'
735 :- 'eth_getBlockByNumber'
736− :~ (tape (num-to-hex bon.req))
736+ :~ (tape (num-to-hex-minimal bon.req))
737 b+txs.req
737 b+txs.req
738 ==
738 ==
739 ::
739 ::
@@ -942,6 +942,12 @@
942 %- render-hex-bytes
942 %- render-hex-bytes
943 (as-octs:mimes:html n)
943 (as-octs:mimes:html n)
944::
944::
945+++ num-to-hex-minimal
946+ |= n=@
947+ ^- tape
948+ %- prefix-hex
949+ ((x-co:co 1) n)
950+::
945++ address-to-hex
951++ address-to-hex
946 |= a=address
952 |= a=address
947 ^- tape
953 ^- tape
base-desk/lib/ethio.hoon+3−3
@@ -76,8 +76,8 @@
76 header-list=['Content-Type'^'application/json' ~]
76 header-list=['Content-Type'^'application/json' ~]
77 ::
77 ::
78 ^= body
78 ^= body
79− %- some %- as-octt:mimes:html
79+ %- some %- as-octs:mimes:html
80− %- en-json:html
80+ %- en:json:html
81 a+(turn reqs request-to-json:rpc:ethereum)
81 a+(turn reqs request-to-json:rpc:ethereum)
82 ==
82 ==
83 ;< ~ bind:m
83 ;< ~ bind:m
@@ -96,7 +96,7 @@
96 ?~ full-file.client-response
96 ?~ full-file.client-response
97 (pure:m ~)
97 (pure:m ~)
98 =/ body=@t q.data.u.full-file.client-response
98 =/ 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)
100 ?~ jon
100 ?~ jon
101 (pure:m ~)
101 (pure:m ~)
102 =/ array=(unit (list response:rpc))
102 =/ array=(unit (list response:rpc))
base-desk/lib/jose.hoon+11−3
@@ -33,7 +33,6 @@
33 |^ |=([sor=$-(^ ?) val=json] (apex val sor ""))
33 |^ |=([sor=$-(^ ?) val=json] (apex val sor ""))
34 :: :: ++apex:en-json:html
34 :: :: ++apex:en-json:html
35 ++ apex
35 ++ apex
36− =, en-json:html
37 |= [val=json sor=$-(^ ?) rez=tape]
36 |= [val=json sor=$-(^ ?) rez=tape]
38 ^- tape
37 ^- tape
39 ?~ val (weld "null" rez)
38 ?~ val (weld "null" rez)
@@ -46,7 +45,7 @@
46 |-
45 |-
47 ?~ t.p.val ^$(val i.p.val)
46 ?~ t.p.val ^$(val i.p.val)
48 ^$(val i.p.val, rez [',' $(p.val t.p.val)])
47 ^$(val i.p.val, rez [',' $(p.val t.p.val)])
49− ::
48+ ::
50 %b (weld ?:(p.val "true" "false") rez)
49 %b (weld ?:(p.val "true" "false") rez)
51 %n (weld (trip p.val) rez)
50 %n (weld (trip p.val) rez)
52 %s
51 %s
@@ -60,7 +59,7 @@
60 ?: ?=([@ ~] hed)
59 ?: ?=([@ ~] hed)
61 [i.hed $(viz t.viz)]
60 [i.hed $(viz t.viz)]
62 (weld hed $(viz t.viz))
61 (weld hed $(viz t.viz))
63− ::
62+ ::
64 %o
63 %o
65 :- '{'
64 :- '{'
66 =. rez ['}' rez]
65 =. rez ['}' rez]
@@ -74,6 +73,15 @@
74 =. rez [',' $(viz t.viz)]
73 =. rez [',' $(viz t.viz)]
75 ^$(val [%s p.i.viz], rez [':' ^$(val q.i.viz)])
74 ^$(val [%s p.i.viz], rez [':' ^$(val q.i.viz)])
76 ==
75 ==
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+ ==
77 --
85 --
78:: %/lib/jose
86:: %/lib/jose
79::
87::
base-desk/lib/keygen.hoon+1−1
@@ -94,7 +94,7 @@
94 |= seed=@
94 |= seed=@
95 ^- edkeys
95 ^- edkeys
96 =+ =< [pub=pub:ex sec=sec:ex]
96 =+ =< [pub=pub:ex sec=sec:ex]
97− (pit:nu:crub:crypto 256 seed)
97+ (pit:nu:cric:crypto 256 seed %b ~)
98 :- ^= auth
98 :- ^= auth
99 :- (rsh 3 (end [3 33] pub))
99 :- (rsh 3 (end [3 33] pub))
100 (rsh 3 (end [3 33] sec))
100 (rsh 3 (end [3 33] sec))
base-desk/lib/language-server/complete.hoon+4−3
@@ -3,7 +3,8 @@
3::
3::
4=/ debug |
4=/ debug |
5|%
5|%
6−+* option [item]
6+++ option
7+ |$ [item]
7 [term=cord detail=item]
8 [term=cord detail=item]
8::
9::
9:: Like +rose except also produces line number
10:: Like +rose except also produces line number
@@ -42,7 +43,7 @@
42 %+ turn ~(tap by q.r.q.ty)
43 %+ turn ~(tap by q.r.q.ty)
43 |= [term =tome]
44 |= [term =tome]
44 %+ turn
45 %+ turn
45− ~(tap by q.tome)
46+ ~(tap by tome)
46 |= [name=term =hoon]
47 |= [name=term =hoon]
47 ^- (pair term type)
48 ^- (pair term type)
48 ~| term=term
49 ~| term=term
@@ -226,7 +227,7 @@
226 =* outer-loop $
227 =* outer-loop $
227 ?~ tomes
228 ?~ tomes
228 ~
229 ~
229− =/ arms ~(tap by q.q.i.tomes)
230+ =/ arms ~(tap by q.i.tomes)
230 |- ^- (unit [term type])
231 |- ^- (unit [term type])
231 =* inner-loop $
232 =* inner-loop $
232 ?~ arms
233 ?~ arms
base-desk/lib/language-server/easy-print.hoon+3−3
@@ -421,11 +421,11 @@
421 ?:(?=([%plot *] q.yon) [q.hin p.q.yon] [q.hin q.yon ~])
421 ?:(?=([%plot *] q.yon) [q.hin p.q.yon] [q.hin q.yon ~])
422 ::
422 ::
423 [%core *]
423 [%core *]
424− ?: ?=([[%$ * [[%$ @ *] ~ ~]] ~ ~] q.r.q.sut)
424+ ?: ?=([[%$ [[%$ @ *] ~ ~]] ~ ~] q.r.q.sut)
425 =/ dad $(sut p.sut)
425 =/ dad $(sut p.sut)
426 :- p.dad
426 :- p.dad
427 ~! q.r.q.sut
427 ~! q.r.q.sut
428− [%gate q.n.q.q.n.q.r.q.sut sut(r.p.q %gold) q.dad]
428+ [%gate q.n.q.n.q.r.q.sut sut(r.p.q %gold) q.dad]
429 =+ yad=$(sut p.sut)
429 =+ yad=$(sut p.sut)
430 :- p.yad
430 :- p.yad
431 =+ ^= doy ^- [p=(list @ta) q=wine]
431 =+ ^= doy ^- [p=(list @ta) q=wine]
@@ -438,7 +438,7 @@
438 %^ cat 3
438 %^ cat 3
439 %~ rent co
439 %~ rent co
440 :+ %$ %ud
440 :+ %$ %ud
441− %- ~(rep by (~(run by q.r.q.sut) |=(tome ~(wyt by q.+<))))
441+ %- ~(rep by (~(run by q.r.q.sut) |=(tome ~(wyt by +<))))
442 |=([[@ a=@u] b=@u] (add a b))
442 |=([[@ a=@u] b=@u] (add a b))
443 %^ cat 3
443 %^ cat 3
444 ?-(r.p.q.sut %gold '.', %iron '|', %lead '?', %zinc '&')
444 ?-(r.p.q.sut %gold '.', %iron '|', %lead '?', %zinc '&')
base-desk/lib/language-server/rune-snippet.hoon+2−2
@@ -509,8 +509,8 @@
509 :- '!@'
509 :- '!@'
510 """
510 """
511 $\{1:wing}
511 $\{1:wing}
512− $\{2:if-exists}
512+ $\{2:if-not-exists}
513− $\{3:if-not-exists}
513+ $\{3:if-exists}
514 """
514 """
515 :- '!?'
515 :- '!?'
516 """
516 """
base-desk/lib/noun-diff.hoonnew file+213
@@ -0,0 +1,213 @@
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+226−4
@@ -1,5 +1,5 @@
1/- *aquarium, spider
1/- *aquarium, spider
2−/+ libstrand=strand, *strandio, util=ph-util, aqua-azimuth
2+/+ libstrand=strand, *strandio, util=ph-util, aqua-azimuth, vere
3=, strand=strand:libstrand
3=, strand=strand:libstrand
4|%
4|%
5++ send-events
5++ send-events
@@ -88,7 +88,6 @@
88 ^- form:m
88 ^- form:m
89 (pure:m ~)
89 (pure:m ~)
90::
90::
91−::
92++ init
91++ init
93 =/ m (strand ,~)
92 =/ m (strand ,~)
94 ^- form:m
93 ^- form:m
@@ -125,6 +124,8 @@
125 1
124 1
126 +(+.old-rut)
125 +(+.old-rut)
127 ;< ~ bind:m (send-azimuth-action %breach who)
126 ;< ~ 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
128 |- ^- form:m
129 |- ^- form:m
129 =* loop $
130 =* loop $
130 ;< ~ bind:m (sleep ~s10)
131 ;< ~ bind:m (sleep ~s10)
@@ -142,7 +143,6 @@
142 ?> ?=(%earl (clan:title moon))
143 ?> ?=(%earl (clan:title moon))
143 ?: fake (init-ship moon &)
144 ?: fake (init-ship moon &)
144 =/ m (strand ,~)
145 =/ m (strand ,~)
145− ^- form:m
146 ;< ~ bind:m
146 ;< ~ bind:m
147 %+ dojo (^sein:title moon)
147 %+ dojo (^sein:title moon)
148 =/ =pass pub:ex:(get-keys:aqua-azimuth moon 1)
148 =/ =pass pub:ex:(get-keys:aqua-azimuth moon 1)
@@ -150,13 +150,46 @@
150 (init-ship moon |)
150 (init-ship moon |)
151::
151::
152++ init-ship
152++ init-ship
153+ =| core=?(%mesa %ames) :: XX make %mesa the default core
153 |= [=ship fake=?]
154 |= [=ship fake=?]
154 =/ m (strand ,~)
155 =/ m (strand ,~)
155 ^- form:m
156 ^- form:m
156 ~& > "starting {<ship>}"
157 ~& > "starting {<ship>}"
157− ;< ~ bind:m (send-events (init:util ship fake))
158+ ;< ~ bind:m (send-events (init:util ship fake ~ core))
158 (check-ship-booted ship)
159 (check-ship-booted ship)
159::
160::
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+::
160++ check-ship-booted
193++ check-ship-booted
161 |= =ship
194 |= =ship
162 =/ m (strand ,~)
195 =/ m (strand ,~)
@@ -193,6 +226,129 @@
193 (pure:m ~)
226 (pure:m ~)
194 loop
227 loop
195::
228::
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 ~)
196:: Send "|hi" from one ship to another
352:: Send "|hi" from one ship to another
197::
353::
198++ send-hi
354++ send-hi
@@ -204,6 +360,64 @@
204::
360::
205:: Send "|hi" and wait for "not responding" message
361:: Send "|hi" and wait for "not responding" message
206::
362::
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+::
207++ send-hi-not-responding
421++ send-hi-not-responding
208 |= [from=@p to=@p]
422 |= [from=@p to=@p]
209 ~& > 'sending hi not responding'
423 ~& > 'sending hi not responding'
@@ -256,6 +470,14 @@
256 ;< ~ bind:m (send-events (insert-files:util her desk [pax warped] ~))
470 ;< ~ bind:m (send-events (insert-files:util her desk [pax warped] ~))
257 (pure:m warped)
471 (pure:m warped)
258::
472::
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+::
259:: Check /sur/aquarium/hoon on the given has the given contents.
481:: Check /sur/aquarium/hoon on the given has the given contents.
260::
482::
261++ check-file-touched
483++ check-file-touched
base-desk/lib/ph/util.hoon+24−11
@@ -16,9 +16,11 @@
16:: Start a ship (low-level; prefer +raw-ship)
16:: Start a ship (low-level; prefer +raw-ship)
17::
17::
18++ init
18++ init
19− |= [who=ship fake=?]
19+ |= [who=ship ake=? eed=(unit feed:jael) ore=?(%mesa %ames)]
20 ^- (list aqua-event)
20 ^- (list aqua-event)
21− [%init-ship who fake]~
21+ :~ [%init-ship who ake eed]
22+ [%event who [/a/aqua/load %load ore]]
23+ ==
22::
24::
23:: Send dojo command
25:: Send dojo command
24::
26::
@@ -28,8 +30,8 @@
28 %+ send-events-to who
30 %+ send-events-to who
29 ^- (list unix-event)
31 ^- (list unix-event)
30 :~
32 :~
31− [/d/term/1 %belt %ctl `@c`%e]
33+ [/d/term/1 %belt %mod %ctl `@c`%e]
32− [/d/term/1 %belt %ctl `@c`%u]
34+ [/d/term/1 %belt %mod %ctl `@c`%u]
33 [/d/term/1 %belt %txt ((list @c) what)]
35 [/d/term/1 %belt %txt ((list @c) what)]
34 [/d/term/1 %belt %ret ~]
36 [/d/term/1 %belt %ret ~]
35 ==
37 ==
@@ -40,7 +42,7 @@
40 |= [who=ship what=term]
42 |= [who=ship what=term]
41 ^- (list ph-event)
43 ^- (list ph-event)
42 %+ send-events-to who
44 %+ send-events-to who
43− :~ [/d/term/1 %belt %ctl (,@c what)]
45+ :~ [/d/term/1 %belt %mod %ctl (,@c what)]
44 ==
46 ==
45::
47::
46:: Inject a file into a ship
48:: Inject a file into a ship
@@ -62,15 +64,26 @@
62::TODO should be rename -dill-output
64::TODO should be rename -dill-output
63++ is-dojo-output
65++ is-dojo-output
64 |= [who=ship her=ship uf=unix-effect what=tape]
66 |= [who=ship her=ship uf=unix-effect what=tape]
67+ |^
65 ?& =(who her)
68 ?& =(who her)
66 ?=(%blit -.q.uf)
69 ?=(%blit -.q.uf)
67− ::
68− %+ lien p.q.uf
70+ (lien p.q.uf handle-blit)
69− |= =blit:dill
70− ?. ?=(%lin -.blit)
71− |
72− !=(~ (find what p.blit))
73 ==
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))
80+ ::
81+ %klr
82+ %+ lien p.blit
83+ |= [* q=(list @c)]
84+ !=(~ (find what q))
85+ ==
86+ --
74::
87::
75:: Test is successful if +is-dojo-output
88:: Test is successful if +is-dojo-output
76::
89::
base-desk/lib/pill.hoon+499−17
@@ -2,6 +2,7 @@
2::
2::
3/- dice
3/- dice
4^?
4^?
5+=<
5|%
6|%
6::
7::
7+$ pill
8+$ pill
@@ -11,6 +12,14 @@
11 boot-ova=(list)
12 boot-ova=(list)
12 kernel-ova=(list unix-event)
13 kernel-ova=(list unix-event)
13 userspace-ova=(list unix-event)
14 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)
14 == ==
23 == ==
15::
24::
16+$ unix-event
25+$ unix-event
@@ -32,25 +41,23 @@
32 [/sys/hoon hoon/hoon]
41 [/sys/hoon hoon/hoon]
33 [/sys/arvo hoon/arvo]
42 [/sys/arvo hoon/arvo]
34 ==
43 ==
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)))
35:: +file-ovum: userspace filesystem load
53:: +file-ovum: userspace filesystem load
36::
54::
37:: bas: full path to / directory
55:: bas: full path to / directory
38::
56::
39++ file-ovum
57++ file-ovum
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]
58+ |= [des=desk bas=path exc=(list spur)]
52 ^- unix-event
59 ^- unix-event
53− %. directories
60+ %. (dirs bas exc)
54 |= :: sal: all spurs to load from
61 |= :: sal: all spurs to load from
55 ::
62 ::
56 sal=(list spur)
63 sal=(list spur)
@@ -64,7 +71,11 @@
64 %- ~(gas by *(map path (each page lobe:clay)))
71 %- ~(gas by *(map path (each page lobe:clay)))
65 (turn hav |=([=path =page] [path &+page]))
72 (turn hav |=([=path =page] [path &+page]))
66 [/c/sync [%park des &+yuki *rang:clay]]
73 [/c/sync [%park des &+yuki *rang:clay]]
74+ (file-pages bas sal)
75+::
76+++ file-pages
77+ |= [bas=path sal=(list spur)]
67− =| hav=(list [path page])
78+ =| hav=(list [path page:clay])
68 |- ^+ hav
79 |- ^+ hav
69 ?~ sal ~
80 ?~ sal ~
70 =. hav $(sal t.sal)
81 =. hav $(sal t.sal)
@@ -95,13 +106,43 @@
95::
106::
96:: +file-ovum2: electric boogaloo
107:: +file-ovum2: electric boogaloo
97::
108::
98−++ file-ovum2 |=(p=path `unix-event`[//arvo what/(user-files p)])
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))
99::
140::
100:: +user-files: all userspace hoon files
141:: +user-files: all userspace hoon files
101::
142::
102++ user-files
143++ user-files
103− |= bas=path
144+ |= [bas=path exc=(list spur)]
104− %. directories:file-ovum
145+ %. (dirs bas exc)
105 |= sal=(list spur)
146 |= sal=(list spur)
106 ^- (list (pair path (cask)))
147 ^- (list (pair path (cask)))
107 ::
148 ::
@@ -135,4 +176,445 @@
135 |- ^+ hav
176 |- ^+ hav
136 ?~ all hav
177 ?~ all hav
137 $(all t.all, hav ^$(tyl [p.i.all tyl]))
178 $(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+ --
138--
620--
base-desk/lib/ring.hoon+36−36
@@ -18,10 +18,10 @@
18 ::
18 ::
19 ++ generate-public-linkage
19 ++ generate-public-linkage
20 |= link-scope=@
20 |= link-scope=@
21− ^- [data=@ h=@udpoint]
21+ ^- [data=@ h=@uxpoint]
22 ::
22 ::
23 =/ data=@ (mod link-scope l:ed:crypto)
23 =/ data=@ (mod link-scope l:ed:crypto)
24− =/ h=@udpoint (scalarmult-base:ed:crypto data)
24+ =/ h=@uxpoint (scalarmult-base:ed:crypto data)
25 [data h]
25 [data h]
26 :: +generate-linkage: linkage information from scope and private key
26 :: +generate-linkage: linkage information from scope and private key
27 ::
27 ::
@@ -30,13 +30,13 @@
30 :: y: y = [x] * h
30 :: y: y = [x] * h
31 ++ generate-linkage
31 ++ generate-linkage
32 |= [link-scope=(unit @) my-private-key=@]
32 |= [link-scope=(unit @) my-private-key=@]
33− ^- (unit [data=@ h=@udpoint y=@udpoint])
33+ ^- (unit [data=@ h=@uxpoint y=@uxpoint])
34 ::
34 ::
35 ?~ link-scope
35 ?~ link-scope
36 ~
36 ~
37 ::
37 ::
38− =+ [data=@ h=@udpoint]=(generate-public-linkage u.link-scope)
38+ =+ [data=@ h=@uxpoint]=(generate-public-linkage u.link-scope)
39− =/ y=@udpoint (scalarmult:ed:crypto my-private-key h)
39+ =/ y=@uxpoint (scalarmult:ed:crypto my-private-key h)
40 [~ data h y]
40 [~ data h y]
41 :: +generate-challenge: generate challenge from a given message
41 :: +generate-challenge: generate challenge from a given message
42 ::
42 ::
@@ -47,13 +47,13 @@
47 ++ generate-challenge
47 ++ generate-challenge
48 |= $: :: common to both linked and unlinked
48 |= $: :: common to both linked and unlinked
49 message=@
49 message=@
50− g=@udpoint
50+ g=@uxpoint
51 :: high level universal state
51 :: high level universal state
52 ::
52 ::
53− link-state=(unit [data=@ h=@udpoint y=@udpoint])
53+ link-state=(unit [data=@ h=@uxpoint y=@uxpoint])
54 :: point to include in challenge when link-state isn't ~
54 :: point to include in challenge when link-state isn't ~
55 ::
55 ::
56− h=(unit @udpoint)
56+ h=(unit @uxpoint)
57 ==
57 ==
58 ^- @
58 ^- @
59 :: concatenate and reduce our message down to a 512-bit hash
59 :: concatenate and reduce our message down to a 512-bit hash
@@ -74,9 +74,9 @@
74 :: +generate-challenges: generates the full list of challenges
74 :: +generate-challenges: generates the full list of challenges
75 ::
75 ::
76 ++ generate-challenges
76 ++ generate-challenges
77− |= $: link-state=(unit [data=@ h=@udpoint y=@udpoint])
77+ |= $: link-state=(unit [data=@ h=@uxpoint y=@uxpoint])
78 message=@
78 message=@
79− public-keys=(list @udpoint)
79+ public-keys=(list @uxpoint)
80 ss=(list @)
80 ss=(list @)
81 ::
81 ::
82 prev-k=@u
82 prev-k=@u
@@ -86,14 +86,14 @@
86 ==
86 ==
87 ^- (list @)
87 ^- (list @)
88 ::
88 ::
89− =/ gs=@udpoint
89+ =/ gs=@uxpoint
90 %- add-scalarmult-scalarmult-base:ed:crypto :*
90 %- add-scalarmult-scalarmult-base:ed:crypto :*
91 prev-ch
91 prev-ch
92 (snag prev-k public-keys)
92 (snag prev-k public-keys)
93 prev-s
93 prev-s
94 ==
94 ==
95 ::
95 ::
96− =/ hs=(unit @udpoint)
96+ =/ hs=(unit @uxpoint)
97 ?~ link-state
97 ?~ link-state
98 ~
98 ~
99 ::
99 ::
@@ -125,8 +125,8 @@
125 :: used to generate the (unit point) consumed by +generate-challenge.
125 :: used to generate the (unit point) consumed by +generate-challenge.
126 ::
126 ::
127 ++ scalarmult-h
127 ++ scalarmult-h
128− |= [u=@ linkage=(unit [data=@ h=@udpoint y=@udpoint])]
128+ |= [u=@ linkage=(unit [data=@ h=@uxpoint y=@uxpoint])]
129− ^- (unit @udpoint)
129+ ^- (unit @uxpoint)
130 ?~ linkage
130 ?~ linkage
131 ~
131 ~
132 [~ (scalarmult:ed:crypto u h.u.linkage)]
132 [~ (scalarmult:ed:crypto u h.u.linkage)]
@@ -143,9 +143,9 @@
143 |= $: message=@
143 |= $: message=@
144 link-scope=(unit @)
144 link-scope=(unit @)
145 ::
145 ::
146− anonymity-set=(set @udpoint)
146+ anonymity-set=(set @uxpoint)
147− my-public-key=@udpoint
147+ my-public-key=@uxpoint
148− my-private-key=@udscalar
148+ my-private-key=@uxscalar
149 ::
149 ::
150 eny=@uvJ
150 eny=@uvJ
151 ==
151 ==
@@ -157,7 +157,7 @@
157 (need (find [my-public-key ~] anonymity-list))
157 (need (find [my-public-key ~] anonymity-list))
158 :: Generate linkage information if given
158 :: Generate linkage information if given
159 ::
159 ::
160− =/ linkage=(unit [data=@ h=@udpoint y=@udpoint])
160+ =/ linkage=(unit [data=@ h=@uxpoint y=@uxpoint])
161 (generate-linkage link-scope my-private-key)
161 (generate-linkage link-scope my-private-key)
162 :: initialize our random number generator from entropy
162 :: initialize our random number generator from entropy
163 ::
163 ::
@@ -237,7 +237,7 @@
237 |= $: message=@
237 |= $: message=@
238 link-scope=(unit @)
238 link-scope=(unit @)
239 ::
239 ::
240− anonymity-set=(set @udpoint)
240+ anonymity-set=(set @uxpoint)
241 signature=raw-ring-signature
241 signature=raw-ring-signature
242 ==
242 ==
243 ^- ?
243 ^- ?
@@ -259,14 +259,14 @@
259 =/ s2-to-end=(list @) t.t.s.signature
259 =/ s2-to-end=(list @) t.t.s.signature
260 :: anonymity-list: set of public keys listified in ring order
260 :: anonymity-list: set of public keys listified in ring order
261 ::
261 ::
262− =/ anonymity-list=(list @udpoint)
262+ =/ anonymity-list=(list @uxpoint)
263 ~(tap in anonymity-set)
263 ~(tap in anonymity-set)
264 :: participants: length of :anonymity-list
264 :: participants: length of :anonymity-list
265 ::
265 ::
266 =/ participants=@u
266 =/ participants=@u
267 (lent anonymity-list)
267 (lent anonymity-list)
268 ::
268 ::
269− =/ z0p=@udpoint
269+ =/ z0p=@uxpoint
270 %- add-scalarmult-scalarmult-base:ed:crypto :*
270 %- add-scalarmult-scalarmult-base:ed:crypto :*
271 ch0.signature
271 ch0.signature
272 (head anonymity-list)
272 (head anonymity-list)
@@ -275,14 +275,14 @@
275 :: generate the linkage using public data, and the y point from the
275 :: generate the linkage using public data, and the y point from the
276 :: signature
276 :: signature
277 ::
277 ::
278− =/ linkage=(unit [data=@ h=@udpoint y=@udpoint])
278+ =/ linkage=(unit [data=@ h=@uxpoint y=@uxpoint])
279 ?~ link-scope
279 ?~ link-scope
280 ~
280 ~
281− =+ [data=@ h=@udpoint]=(generate-public-linkage u.link-scope)
281+ =+ [data=@ h=@uxpoint]=(generate-public-linkage u.link-scope)
282 :- ~
282 :- ~
283 [data h (need y.signature)]
283 [data h (need y.signature)]
284 ::
284 ::
285− =/ z0pp=(unit @udpoint)
285+ =/ z0pp=(unit @uxpoint)
286 ?~ linkage
286 ?~ linkage
287 ~
287 ~
288 :- ~
288 :- ~
@@ -319,7 +319,7 @@
319 :: +seed-to-private-key-scalar: keyfile form to scalar we can multiply with
319 :: +seed-to-private-key-scalar: keyfile form to scalar we can multiply with
320 ::
320 ::
321 ++ seed-to-private-key-scalar
321 ++ seed-to-private-key-scalar
322− |= sk=@I ^- @udscalar
322+ |= sk=@I ^- @uxscalar
323 ?: (gth (met 3 sk) 32) !!
323 ?: (gth (met 3 sk) 32) !!
324 =+ h=(shal (rsh [0 3] b:ed:crypto) sk)
324 =+ h=(shal (rsh [0 3] b:ed:crypto) sk)
325 %+ add
325 %+ add
@@ -347,7 +347,7 @@
347 ::
347 ::
348 ++ ship-life-to-pubid
348 ++ ship-life-to-pubid
349 |= [our=@p now=@da ship=@p =life]
349 |= [our=@p now=@da ship=@p =life]
350− ^- @udpoint
350+ ^- @uxpoint
351 ::
351 ::
352 =/ d=[=^life =pass *]
352 =/ d=[=^life =pass *]
353 =/ scry-path=path
353 =/ scry-path=path
@@ -364,14 +364,14 @@
364 ::
364 ::
365 =/ x=[crypt=@ auth=@] (get-public-key-from-pass pass.d)
365 =/ x=[crypt=@ auth=@] (get-public-key-from-pass pass.d)
366 ::
366 ::
367− `@udpoint`auth.x
367+ `@uxpoint`auth.x
368 ::
368 ::
369 ++ build-signing-participants
369 ++ build-signing-participants
370 |= [our=@p now=@da invited=(list @p)]
370 |= [our=@p now=@da invited=(list @p)]
371− ^- [(set [@p life]) (set @udpoint)]
371+ ^- [(set [@p life]) (set @uxpoint)]
372 ::
372 ::
373 =| participants=(set [@p life])
373 =| participants=(set [@p life])
374− =| keys=(set @udpoint)
374+ =| keys=(set @uxpoint)
375 ::
375 ::
376 |-
376 |-
377 ?~ invited
377 ?~ invited
@@ -383,7 +383,7 @@
383 ?~ lyfe
383 ?~ lyfe
384 $(invited t.invited)
384 $(invited t.invited)
385 ::
385 ::
386− =/ pubkey=@udpoint (ship-life-to-pubid our now i.invited u.lyfe)
386+ =/ pubkey=@uxpoint (ship-life-to-pubid our now i.invited u.lyfe)
387 ::
387 ::
388 =. participants (~(put in participants) [i.invited u.lyfe])
388 =. participants (~(put in participants) [i.invited u.lyfe])
389 =. keys (~(put in keys) pubkey)
389 =. keys (~(put in keys) pubkey)
@@ -393,15 +393,15 @@
393 ::
393 ::
394 ++ build-verifying-participants
394 ++ build-verifying-participants
395 |= [our=@p now=@da invited=(list [ship=@p =life])]
395 |= [our=@p now=@da invited=(list [ship=@p =life])]
396− ^- (set @udpoint)
396+ ^- (set @uxpoint)
397 ::
397 ::
398− =| keys=(set @udpoint)
398+ =| keys=(set @uxpoint)
399 ::
399 ::
400 |-
400 |-
401 ?~ invited
401 ?~ invited
402 keys
402 keys
403 ::
403 ::
404− =/ pubkey=@udpoint
404+ =/ pubkey=@uxpoint
405 (ship-life-to-pubid our now ship.i.invited life.i.invited)
405 (ship-life-to-pubid our now ship.i.invited life.i.invited)
406 =. keys
406 =. keys
407 (~(put in keys) pubkey)
407 (~(put in keys) pubkey)
@@ -432,7 +432,7 @@
432 =/ link-hash=(unit @) (bind link-scope |=(a=* (shaz (jam a))))
432 =/ link-hash=(unit @) (bind link-scope |=(a=* (shaz (jam a))))
433 :: get everyone's public keys
433 :: get everyone's public keys
434 ::
434 ::
435− =/ p=[participants=(set [ship=@p =life]) keys=(set @udpoint)]
435+ =/ p=[participants=(set [ship=@p =life]) keys=(set @uxpoint)]
436 (build-signing-participants:detail our now ~(tap in anonymity-set))
436 (build-signing-participants:detail our now ~(tap in anonymity-set))
437 :: get our ships' current life
437 :: get our ships' current life
438 ::
438 ::
@@ -448,7 +448,7 @@
448 +:(get-private-key-from-ring:detail secret-ring)
448 +:(get-private-key-from-ring:detail secret-ring)
449 :: get our ships' public key
449 :: get our ships' public key
450 ::
450 ::
451− =/ public-key=@udpoint
451+ =/ public-key=@uxpoint
452 (ship-life-to-pubid:detail our now our our-life)
452 (ship-life-to-pubid:detail our now our our-life)
453 ::
453 ::
454 :- participants.p
454 :- participants.p
@@ -467,7 +467,7 @@
467 |= [our=@p now=@da message=* =ring-signature]
467 |= [our=@p now=@da message=* =ring-signature]
468 ^- ?
468 ^- ?
469 ::
469 ::
470− =/ keys=(set @udpoint)
470+ =/ keys=(set @uxpoint)
471 %^ build-verifying-participants:detail our now
471 %^ build-verifying-participants:detail our now
472 ~(tap in participants.ring-signature)
472 ~(tap in participants.ring-signature)
473 ::
473 ::
base-desk/lib/server.hoon+2−2
@@ -19,7 +19,7 @@
19++ json-to-octs
19++ json-to-octs
20 |= jon=json
20 |= jon=json
21 ^- octs
21 ^- octs
22− (as-octt:mimes:html (en-json:html jon))
22+ (as-octs:mimes:html (en:json:html jon))
23::
23::
24++ app
24++ app
25 |%
25 |%
@@ -114,7 +114,7 @@
114 :_ `octs
114 :_ `octs
115 [200 [['content-type' 'image/svg+xml'] ?:(cache [max-1-wk ~] ~)]]
115 [200 [['content-type' 'image/svg+xml'] ?:(cache [max-1-wk ~] ~)]]
116 ::
116 ::
117− ++ ico-response
117+ ++ ico-response
118 |= =octs
118 |= =octs
119 ^- simple-payload:http
119 ^- simple-payload:http
120 [[200 [['content-type' 'image/x-icon'] max-1-wk ~]] `octs]
120 [[200 [['content-type' 'image/x-icon'] max-1-wk ~]] `octs]
base-desk/lib/shoe.hoon+72−36
@@ -13,15 +13,15 @@
13/- *sole
13/- *sole
14/+ sole, auto=language-server-complete
14/+ sole, auto=language-server-complete
15|%
15|%
16−+$ state-0
16++$ state-2
17− $: %0
17+ $: %2
18− soles=(map @ta sole-share)
18+ soles=(map sole-id sole-share)
19 ==
19 ==
20:: $card: standard gall cards plus shoe effects
20:: $card: standard gall cards plus shoe effects
21::
21::
22+$ card
22+$ card
23 $% card:agent:gall
23 $% card:agent:gall
24− [%shoe sole-ids=(list @ta) effect=shoe-effect] :: ~ sends to all soles
24+ [%shoe sole-ids=(list sole-id) effect=shoe-effect] :: ~ sends to all
25 ==
25 ==
26:: $shoe-effect: easier sole-effects
26:: $shoe-effect: easier sole-effects
27::
27::
@@ -47,30 +47,30 @@
47 :: if the head of the result is true, instantly run the command
47 :: if the head of the result is true, instantly run the command
48 ::
48 ::
49 ++ command-parser
49 ++ command-parser
50− |~ sole-id=@ta
50+ |~ =sole-id
51 |~(nail *(like [? command-type]))
51 |~(nail *(like [? command-type]))
52 :: +tab-list: autocomplete options for the session (to match +command-parser)
52 :: +tab-list: autocomplete options for the session (to match +command-parser)
53 ::
53 ::
54 ++ tab-list
54 ++ tab-list
55− |~ sole-id=@ta
55+ |~ =sole-id
56 :: (list [@t tank])
56 :: (list [@t tank])
57 *(list (option:auto tank))
57 *(list (option:auto tank))
58 :: +on-command: called when a valid command is run
58 :: +on-command: called when a valid command is run
59 ::
59 ::
60 ++ on-command
60 ++ on-command
61− |~ [sole-id=@ta command=command-type]
61+ |~ [=sole-id command=command-type]
62 *(quip card _^|(..on-init))
62 *(quip card _^|(..on-init))
63 ::
63 ::
64 ++ can-connect
64 ++ can-connect
65− |~ sole-id=@ta
65+ |~ =sole-id
66 *?
66 *?
67 ::
67 ::
68 ++ on-connect
68 ++ on-connect
69− |~ sole-id=@ta
69+ |~ =sole-id
70 *(quip card _^|(..on-init))
70 *(quip card _^|(..on-init))
71 ::
71 ::
72 ++ on-disconnect
72 ++ on-disconnect
73− |~ sole-id=@ta
73+ |~ =sole-id
74 *(quip card _^|(..on-init))
74 *(quip card _^|(..on-init))
75 ::
75 ::
76 ::NOTE standard gall agent arms below, though they may produce %shoe cards
76 ::NOTE standard gall agent arms below, though they may produce %shoe cards
@@ -119,27 +119,27 @@
119 |* [shoe=* command-type=mold]
119 |* [shoe=* command-type=mold]
120 |_ =bowl:gall
120 |_ =bowl:gall
121 ++ command-parser
121 ++ command-parser
122− |= sole-id=@ta
122+ |= =sole-id
123 (easy *[? command-type])
123 (easy *[? command-type])
124 ::
124 ::
125 ++ tab-list
125 ++ tab-list
126− |= sole-id=@ta
126+ |= =sole-id
127 ~
127 ~
128 ::
128 ::
129 ++ on-command
129 ++ on-command
130− |= [sole-id=@ta command=command-type]
130+ |= [=sole-id command=command-type]
131 [~ shoe]
131 [~ shoe]
132 ::
132 ::
133 ++ can-connect
133 ++ can-connect
134− |= sole-id=@ta
134+ |= =sole-id
135 (team:title [our src]:bowl)
135 (team:title [our src]:bowl)
136 ::
136 ::
137 ++ on-connect
137 ++ on-connect
138− |= sole-id=@ta
138+ |= =sole-id
139 [~ shoe]
139 [~ shoe]
140 ::
140 ::
141 ++ on-disconnect
141 ++ on-disconnect
142− |= sole-id=@ta
142+ |= =sole-id
143 [~ shoe]
143 [~ shoe]
144 --
144 --
145:: +agent: creates wrapper core that handles sole events and calls shoe arms
145:: +agent: creates wrapper core that handles sole events and calls shoe arms
@@ -147,7 +147,7 @@
147++ agent
147++ agent
148 |* command-type=mold
148 |* command-type=mold
149 |= =(shoe command-type)
149 |= =(shoe command-type)
150− =| state-0
150+ =| state-2
151 =* state -
151 =* state -
152 ^- agent:gall
152 ^- agent:gall
153 =>
153 =>
@@ -164,8 +164,7 @@
164 %+ turn
164 %+ turn
165 ?^ sole-ids.card sole-ids.card
165 ?^ sole-ids.card sole-ids.card
166 ~(tap in ~(key by soles))
166 ~(tap in ~(key by soles))
167− |= sole-id=@ta
167+ id-to-path:sole
168− /sole/[sole-id]
169 ::
168 ::
170 %table
169 %table
171 =; fez=(list sole-effect)
170 =; fez=(list sole-effect)
@@ -189,7 +188,7 @@
189 =^ cards shoe on-init:og
188 =^ cards shoe on-init:og
190 [(deal cards) this]
189 [(deal cards) this]
191 ::
190 ::
192− ++ on-save !>([%shoe-app on-save:og state])
191+ ++ on-save :(slop !>(%shoe-app) on-save:og !>(state))
193 ::
192 ::
194 ++ on-load
193 ++ on-load
195 |= old-state=vase
194 |= old-state=vase
@@ -202,9 +201,45 @@
202 ?. ?=([%shoe-app ^] q.old-state)
201 ?. ?=([%shoe-app ^] q.old-state)
203 =^ cards shoe (on-load:og old-state)
202 =^ cards shoe (on-load:og old-state)
204 [(deal cards) this]
203 [(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
205− =^ old-inner state +:!<([%shoe-app vase state-0] old-state)
210+ +:!<([%shoe-app vase:h136 state-any] old-state)
206− =^ cards shoe (on-load:og old-inner)
211+ =^ caz shoe (on-load:og (next-vase:h136 old-inner))
207− [(deal cards) this]
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+ --
208 ::
243 ::
209 ++ on-poke
244 ++ on-poke
210 |= [=mark =vase]
245 |= [=mark =vase]
@@ -326,19 +361,18 @@
326 ++ on-watch
361 ++ on-watch
327 |= =path
362 |= =path
328 ^- (quip card:agent:gall agent:gall)
363 ^- (quip card:agent:gall agent:gall)
329− ?. ?=([%sole @ ~] path)
364+ ?~ sole-id=(path-to-id:sole path)
330 =^ cards shoe
365 =^ cards shoe
331 (on-watch:og path)
366 (on-watch:og path)
332 [(deal cards) this]
367 [(deal cards) this]
333− =* sole-id i.t.path
334− ?> (can-connect:og sole-id)
368+ ?> (can-connect:og u.sole-id)
335− =. soles (~(put by soles) sole-id *sole-share)
369+ =. soles (~(put by soles) u.sole-id *sole-share)
336 =^ cards shoe
370 =^ cards shoe
337− (on-connect:og sole-id)
371+ (on-connect:og u.sole-id)
338 :_ this
372 :_ this
339 %- deal
373 %- deal
340 :_ cards
374 :_ cards
341− [%shoe [sole-id]~ %sole %pro & dap.bowl "> "]
375+ [%shoe [u.sole-id]~ %sole %pro & dap.bowl "> "]
342 ::
376 ::
343 ++ on-leave
377 ++ on-leave
344 |= =path
378 |= =path
@@ -388,23 +422,25 @@
388 =/ cobs=(list [wid=@ud (list tape)])
422 =/ cobs=(list [wid=@ud (list tape)])
389 (turn cows col-as-lines)
423 (turn cows col-as-lines)
390 =+ [lin=0 any=|]
424 =+ [lin=0 any=|]
425+ =+ len=(lent cobs)
391 =| fez=(list sole-effect)
426 =| fez=(list sole-effect)
392 |- ^+ fez
427 |- ^+ fez
393− =; out=tape
428+ =; [line=(list tape) end=@ud]
394 :: done when we're past the end of all columns
429 :: done when we're past the end of all columns
395 ::
430 ::
396− ?: (levy out (cury test ' '))
431+ ?: =(len end)
397 (flop fez)
432 (flop fez)
398 =; fec=sole-effect
433 =; fec=sole-effect
399 $(lin +(lin), fez [fec fez])
434 $(lin +(lin), fez [fec fez])
435+ =/ out=tape
436+ (zing (join " " line))
400 ?. bold txt+out
437 ?. bold txt+out
401 klr+[[`%br ~ ~]^[(crip out)]~]~
438 klr+[[`%br ~ ~]^[(crip out)]~]~
402− %+ roll cobs
439+ %^ spin cobs 0
403− |= [[wid=@ud lines=(list tape)] out=tape]
440+ |= [[wid=@ud lines=(list tape)] empty=@ud]
404− %+ weld out
405− %+ weld ?~(out "" " ")
406 =+ l=(swag [lin 1] lines)
441 =+ l=(swag [lin 1] lines)
442+ ?^ l [i.l empty]
407− ?^(l i.l (reap wid ' '))
443+ [(reap wid ' ') +(empty)]
408 ::
444 ::
409 ++ col-as-lines
445 ++ col-as-lines
410 |= [wid=@ud col=dime]
446 |= [wid=@ud col=dime]
base-desk/lib/sink.hoonnew file+26
@@ -0,0 +1,26 @@
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,4 +136,28 @@
136 =+ dat=(transmute [%mor leg] [%ins pos `@c`0])
136 =+ dat=(transmute [%mor leg] [%ins pos `@c`0])
137 ?> ?=(%ins -.dat)
137 ?> ?=(%ins -.dat)
138 p.dat
138 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)
139--
163--
base-desk/lib/sss.hoonnew file+445
@@ -0,0 +1,445 @@
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+11−35
@@ -38,41 +38,17 @@
38::
38::
39:: Canonical textual representation
39:: Canonical textual representation
40::
40::
41−++ tako-to-text
41+++ chapter-to-text
42− |= [=tako:clay]
42+ |= [=tako:clay =proses]
43− ^- tape
43+ ^- wain
44− "commit: {<`@uv`tako>}\0a"
44+ :- (crip "commit: {<`@uv`tako>}")
45−::
45+ %- zing
46−++ proses-to-text
46+ %+ join `wain`~['|||']
47− |= [=proses]
48− ^- tape
49− =/ proses-list=(list prose) ~(tap in proses)
47+ %+ turn ~(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]
48+ |= prose
57− ^- [prose tape]
49+ ^- wain
58− :- prz
50+ %- to-wain:format
59− ;: welp
51+ (rap 3 title '\0a\0a' body ~)
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− ==
76::
52::
77:: Parsers
53:: Parsers
78::
54::
base-desk/lib/strand.hoon+1−188
@@ -1,188 +1 @@
1−|%
1+rand
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+170−13
@@ -73,21 +73,23 @@
73 ^- form:m
73 ^- form:m
74 |= tin=strand-input:strand
74 |= tin=strand-input:strand
75 ?+ in.tin `[%skip ~]
75 ?+ in.tin `[%skip ~]
76+ ~
76− ~ `[%wait ~]
77+ `[%wait ~]
78+ ::
77 [~ %poke @ *]
79 [~ %poke @ *]
78 ?. =(mark p.cage.u.in.tin)
80 ?. =(mark p.cage.u.in.tin)
79 `[%skip ~]
81 `[%skip ~]
80 `[%done q.cage.u.in.tin]
82 `[%done q.cage.u.in.tin]
81 ==
83 ==
82::
84::
83−::
84−::
85++ take-sign-arvo
85++ take-sign-arvo
86 =/ m (strand ,[wire sign-arvo])
86 =/ m (strand ,[wire sign-arvo])
87 ^- form:m
87 ^- form:m
88 |= tin=strand-input:strand
88 |= tin=strand-input:strand
89 ?+ in.tin `[%skip ~]
89 ?+ in.tin `[%skip ~]
90+ ~
90− ~ `[%wait ~]
91+ `[%wait ~]
92+ ::
91 [~ %sign *]
93 [~ %sign *]
92 `[%done [wire sign-arvo]:u.in.tin]
94 `[%done [wire sign-arvo]:u.in.tin]
93 ==
95 ==
@@ -180,6 +182,53 @@
180 `[%done ~]
182 `[%done ~]
181 `[%fail %timer-error u.error.sign-arvo.u.in.tin]
183 `[%fail %timer-error u.error.sign-arvo.u.in.tin]
182 ==
184 ==
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+ ==
183::
232::
184++ take-poke-ack
233++ take-poke-ack
185 |= =wire
234 |= =wire
@@ -315,6 +364,78 @@
315 ;< ~ bind:m (send-wait until)
364 ;< ~ bind:m (send-wait until)
316 (take-wake `until)
365 (take-wake `until)
317::
366::
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+::
318++ sleep
439++ sleep
319 |= for=@dr
440 |= for=@dr
320 =/ m (strand ,~)
441 =/ m (strand ,~)
@@ -433,7 +554,6 @@
433 %- pure:m
554 %- pure:m
434 ?~ full-file.client-response ''
555 ?~ full-file.client-response ''
435 q.data.u.full-file.client-response
556 q.data.u.full-file.client-response
436−
437::
557::
438++ fetch-cord
558++ fetch-cord
439 |= url=tape
559 |= url=tape
@@ -449,7 +569,7 @@
449 =/ m (strand ,json)
569 =/ m (strand ,json)
450 ^- form:m
570 ^- form:m
451 ;< =cord bind:m (fetch-cord url)
571 ;< =cord bind:m (fetch-cord url)
452− =/ json=(unit json) (de-json:html cord)
572+ =/ json=(unit json) (de:json:html cord)
453 ?~ json
573 ?~ json
454 (strand-fail %json-parse-error ~)
574 (strand-fail %json-parse-error ~)
455 (pure:m u.json)
575 (pure:m u.json)
@@ -474,6 +594,18 @@
474 (pure:m ~)
594 (pure:m ~)
475 ?> =(%vase p.r.u.riot)
595 ?> =(%vase p.r.u.riot)
476 (pure:m (some !<(vase q.r.u.riot)))
596 (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))
477:: +build-mark: build a mark definition to a $dais
609:: +build-mark: build a mark definition to a $dais
478::
610::
479++ build-mark
611++ build-mark
@@ -537,7 +669,7 @@
537 (take-writ /warp)
669 (take-writ /warp)
538::
670::
539++ read-file
671++ read-file
540− |= [[=ship =desk =case:clay] =spur]
672+ |= [[=ship =desk =case] =spur]
541 =* arg +<
673 =* arg +<
542 =/ m (strand ,cage)
674 =/ m (strand ,cage)
543 ;< =riot:clay bind:m (warp ship desk ~ %sing %x case spur)
675 ;< =riot:clay bind:m (warp ship desk ~ %sing %x case spur)
@@ -546,13 +678,14 @@
546 (pure:m r.u.riot)
678 (pure:m r.u.riot)
547::
679::
548++ check-for-file
680++ check-for-file
549− |= [[=ship =desk =case:clay] =spur]
681+ |= [[=ship =desk =case] =spur]
550 =/ m (strand ,?)
682 =/ m (strand ,?)
551− ;< =riot:clay bind:m (warp ship desk ~ %sing %x case spur)
683+ ;< =riot:clay bind:m (warp ship desk ~ %sing %u case spur)
552− (pure:m ?=(^ riot))
684+ ?> ?=(^ riot)
685+ (pure:m !<(? q.r.u.riot))
553::
686::
554++ list-tree
687++ list-tree
555− |= [[=ship =desk =case:clay] =spur]
688+ |= [[=ship =desk =case] =spur]
556 =* arg +<
689 =* arg +<
557 =/ m (strand ,(list path))
690 =/ m (strand ,(list path))
558 ;< =riot:clay bind:m (warp ship desk ~ %sing %t case spur)
691 ;< =riot:clay bind:m (warp ship desk ~ %sing %t case spur)
@@ -560,6 +693,14 @@
560 (strand-fail %list-tree >arg< ~)
693 (strand-fail %list-tree >arg< ~)
561 (pure:m !<((list path) q.r.u.riot))
694 (pure:m !<((list path) q.r.u.riot))
562::
695::
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))
563:: Take Clay read result
704:: Take Clay read result
564::
705::
565++ take-writ
706++ take-writ
@@ -586,6 +727,23 @@
586 (poke [who %hood] %helm-hi !>(~))
727 (poke [who %hood] %helm-hi !>(~))
587 (pure:m ~)
728 (pure:m ~)
588::
729::
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+::
589:: Queue on skip, try next on fail %ignore
747:: Queue on skip, try next on fail %ignore
590::
748::
591++ main-loop
749++ main-loop
@@ -751,11 +909,10 @@
751 =/ poke-vase !>(`start-args:spider`[`tid.bowl `tid byk.bowl file args])
909 =/ poke-vase !>(`start-args:spider`[`tid.bowl `tid byk.bowl file args])
752 ;< ~ bind:m (watch-our /awaiting/[tid] %spider /thread-result/[tid])
910 ;< ~ bind:m (watch-our /awaiting/[tid] %spider /thread-result/[tid])
753 ;< ~ bind:m (poke-our %spider %spider-start poke-vase)
911 ;< ~ bind:m (poke-our %spider %spider-start poke-vase)
754− ;< ~ bind:m (sleep ~s0) :: wait for thread to start
755 ;< =cage bind:m (take-fact /awaiting/[tid])
912 ;< =cage bind:m (take-fact /awaiting/[tid])
756 ;< ~ bind:m (take-kick /awaiting/[tid])
913 ;< ~ bind:m (take-kick /awaiting/[tid])
757 ?+ p.cage ~|([%strange-thread-result p.cage file tid] !!)
914 ?+ p.cage ~|([%strange-thread-result p.cage file tid] !!)
758 %thread-done (pure:m %& q.cage)
915 %thread-done (pure:m %& q.cage)
759− %thread-fail (pure:m %| ;;([term tang] q.q.cage))
916+ %thread-fail (pure:m %| !<([term tang] q.cage))
760 ==
917 ==
761--
918--
base-desk/lib/test.hoon+54−1
@@ -38,7 +38,60 @@
38 =/ b (mule a)
38 =/ b (mule a)
39 ?- -.b
39 ?- -.b
40 %| ~
40 %| ~
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+ --
41− %& [leaf+"expected failure - succeeded" ~]
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)
42 ==
95 ==
43:: +category: prepends a name to an error result; passes successes unchanged
96:: +category: prepends a name to an error result; passes successes unchanged
44::
97::
base-desk/lib/verb.hoon+88−11
@@ -1,6 +1,6 @@
1:: Print what your agent is doing.
1:: Print what your agent is doing.
2::
2::
3−/- verb
3+/- *verb
4::
4::
5|= [loud=? =agent:gall]
5|= [loud=? =agent:gall]
6=| bowl-print=_|
6=| bowl-print=_|
@@ -14,7 +14,10 @@
14 ^- (quip card:agent:gall agent:gall)
14 ^- (quip card:agent:gall agent:gall)
15 %- (print bowl |.("{<dap.bowl>}: on-init"))
15 %- (print bowl |.("{<dap.bowl>}: on-init"))
16 =^ cards agent on-init:ag
16 =^ cards agent on-init:ag
17− [[(emit-event %on-init ~) cards] this]
17+ :_ this
18+ :_ :_ cards
19+ (emit-event %on-init ~)
20+ (emit-event-plus bowl [%on-init ~] cards)
18::
21::
19++ on-save
22++ on-save
20 ^- vase
23 ^- vase
@@ -26,7 +29,10 @@
26 ^- (quip card:agent:gall agent:gall)
29 ^- (quip card:agent:gall agent:gall)
27 %- (print bowl |.("{<dap.bowl>}: on-load"))
30 %- (print bowl |.("{<dap.bowl>}: on-load"))
28 =^ cards agent (on-load:ag old-state)
31 =^ cards agent (on-load:ag old-state)
29− [[(emit-event %on-load ~) cards] this]
32+ :_ this
33+ :_ :_ cards
34+ (emit-event %on-load ~)
35+ (emit-event-plus bowl [%on-load ~] cards)
30::
36::
31++ on-poke
37++ on-poke
32 |= [=mark =vase]
38 |= [=mark =vase]
@@ -38,17 +44,23 @@
38 %bowl `this(bowl-print !bowl-print)
44 %bowl `this(bowl-print !bowl-print)
39 ==
45 ==
40 =^ cards agent (on-poke:ag mark vase)
46 =^ cards agent (on-poke:ag mark vase)
41− [[(emit-event %on-poke mark) cards] this]
47+ :_ this
48+ :_ :_ cards
49+ (emit-event %on-poke mark)
50+ (emit-event-plus bowl [%on-poke mark (mug q.vase)] cards)
42::
51::
43++ on-watch
52++ on-watch
44 |= =path
53 |= =path
45 ^- (quip card:agent:gall agent:gall)
54 ^- (quip card:agent:gall agent:gall)
46 %- (print bowl |.("{<dap.bowl>}: on-watch on path {<path>}"))
55 %- (print bowl |.("{<dap.bowl>}: on-watch on path {<path>}"))
47 =^ cards agent
56 =^ cards agent
48− ?: ?=([%verb %events ~] path)
57+ ?: ?=([%verb ?(%events %events-plus) ~] path)
49 [~ agent]
58 [~ agent]
50 (on-watch:ag path)
59 (on-watch:ag path)
51− [[(emit-event %on-watch path) cards] this]
60+ :_ this
61+ :_ :_ cards
62+ (emit-event %on-watch path)
63+ (emit-event-plus bowl [%on-watch path] cards)
52::
64::
53++ on-leave
65++ on-leave
54 |= =path
66 |= =path
@@ -57,7 +69,10 @@
57 ?: ?=([%verb %event ~] path)
69 ?: ?=([%verb %event ~] path)
58 [~ this]
70 [~ this]
59 =^ cards agent (on-leave:ag path)
71 =^ cards agent (on-leave:ag path)
60− [[(emit-event %on-leave path) cards] this]
72+ :_ this
73+ :_ :_ cards
74+ (emit-event %on-leave path)
75+ (emit-event-plus bowl [%on-leave path] cards)
61::
76::
62++ on-peek
77++ on-peek
63 |= =path
78 |= =path
@@ -70,7 +85,17 @@
70 ^- (quip card:agent:gall agent:gall)
85 ^- (quip card:agent:gall agent:gall)
71 %- (print bowl |.("{<dap.bowl>}: on-agent on wire {<wire>}, {<-.sign>}"))
86 %- (print bowl |.("{<dap.bowl>}: on-agent on wire {<wire>}, {<-.sign>}"))
72 =^ cards agent (on-agent:ag wire sign)
87 =^ cards agent (on-agent:ag wire sign)
73− [[(emit-event %on-agent wire -.sign) cards] this]
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+ ==
74::
99::
75++ on-arvo
100++ on-arvo
76 |= [=wire =sign-arvo]
101 |= [=wire =sign-arvo]
@@ -78,14 +103,20 @@
78 %- %+ print bowl |.
103 %- %+ print bowl |.
79 "{<dap.bowl>}: on-arvo on wire {<wire>}, {<[- +<]:sign-arvo>}"
104 "{<dap.bowl>}: on-arvo on wire {<wire>}, {<[- +<]:sign-arvo>}"
80 =^ cards agent (on-arvo:ag wire sign-arvo)
105 =^ cards agent (on-arvo:ag wire sign-arvo)
81− [[(emit-event %on-arvo wire [- +<]:sign-arvo) cards] this]
106+ :_ this
107+ :_ :_ cards
108+ (emit-event %on-arvo wire [- +<]:sign-arvo)
109+ (emit-event-plus bowl [%on-arvo wire [- +<]:sign-arvo] cards)
82::
110::
83++ on-fail
111++ on-fail
84 |= [=term =tang]
112 |= [=term =tang]
85 ^- (quip card:agent:gall agent:gall)
113 ^- (quip card:agent:gall agent:gall)
86 %- (print bowl |.("{<dap.bowl>}: on-fail with term {<term>}"))
114 %- (print bowl |.("{<dap.bowl>}: on-fail with term {<term>}"))
87 =^ cards agent (on-fail:ag term tang)
115 =^ cards agent (on-fail:ag term tang)
88− [[(emit-event %on-fail term) cards] this]
116+ :_ this
117+ :_ :_ cards
118+ (emit-event %on-fail term)
119+ (emit-event-plus bowl [%on-fail term] cards)
89--
120--
90::
121::
91++ print
122++ print
@@ -99,7 +130,53 @@
99 same
130 same
100::
131::
101++ emit-event
132++ emit-event
102− |= =event:verb
133+ |= =event
103 ^- card:agent:gall
134 ^- card:agent:gall
104 [%give %fact ~[/verb/events] %verb-event !>(event)]
135 [%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+ ==
105--
182--
base-desk/mar/belt.hoon+3−12
@@ -1,5 +1,7 @@
1:: belt: runtime belt structure
1:: belt: runtime belt structure
2::
2::
3+/+ dill
4+::
3|_ =belt:dill
5|_ =belt:dill
4++ grad %noun
6++ grad %noun
5:: +grab: convert from
7:: +grab: convert from
@@ -7,18 +9,7 @@
7++ grab
9++ grab
8 |%
10 |%
9 ++ noun belt:dill
11 ++ noun belt:dill
10− ++ json
12+ ++ json belt:dejs:dill
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− ==
22 --
13 --
23:: +grow: convert to
14:: +grow: convert to
24::
15::
base-desk/mar/blit.hoon+3−44
@@ -1,5 +1,7 @@
1:: blit: runtime blit structure
1:: blit: runtime blit structure
2::
2::
3+/+ dill
4+::
3|_ =blit:dill
5|_ =blit:dill
4++ grad %noun
6++ grad %noun
5:: +grab: convert from
7:: +grab: convert from
@@ -13,49 +15,6 @@
13++ grow
15++ grow
14 |%
16 |%
15 ++ noun blit
17 ++ noun blit
16− ++ json
18+ ++ json (blit:enjs:dill blit)
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− ==
60 --
19 --
61--
20--
base-desk/mar/css.hoon+9−5
@@ -6,11 +6,15 @@
6=, mimes:html
6=, mimes:html
7|_ mud=@t
7|_ mud=@t
8++ grow :: convert to
8++ grow :: convert to
9+ |%
9− |% ++ mime [/text/css (as-octs mud)] :: convert to %mime
10+ ++ mime [/text/css (as-octs mud)] :: convert to %mime
10− ++ elem ;style :: convert to %hymn
11+ ++ hymn :: convert to %hymn
12+ |^ html
13+ ++ style ;style
11− ;- (trip mud)
14+ ;- (trip mud)
12− ==
15+ ==
13− ++ hymn ;html:(head:"{elem}" body)
16+ ++ html ;html:(head:"{style}" body)
17+ --
14 --
18 --
15++ grab
19++ grab
16 |% :: convert from
20 |% :: convert from
base-desk/mar/hoon.hoon+285−31
@@ -1,41 +1,295 @@
1−:::: /hoon/hoon/mar
2− ::
3−/? 310
4−::
5−=, eyre
6|_ own=@t
1|_ own=@t
7::
2::
8++ grow :: convert to
3++ grow :: convert to
9 |%
4 |%
10 ++ mime `^mime`[/text/x-hoon (as-octs:mimes:html own)] :: convert to %mime
5 ++ 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− :: ==
23 ++ hymn
6 ++ hymn
24− :: ;html:(head:title:"Source" "+{elem}")
7+ ^- manx
25− ;html
8+ =/ to-wall
26− ;head
9+ |= =tape
27− ;title:"Source"
10+ ^- wall
28− ;script@"//cdnjs.cloudflare.com/ajax/libs/codemirror/4.3.0/codemirror.js";
11+ %+ roll (flop tape)
29− ;script@"/lib/syntax/hoon.js";
12+ |= [char=@tD =wall]
30− ;link(rel "stylesheet", href "//cdnjs.cloudflare.com/ajax/libs/".
13+ ?~ wall
31− "codemirror/4.3.0/codemirror.min.css");
14+ [[char ~] ~]
32− ;link/"/lib/syntax/codemirror.css"(rel "stylesheet");
15+ ?: =('\0a' char)
33− ==
16+ [~ wall]
34− ;body
17+ [[char i.wall] t.wall]
18+ ::
35− ;textarea#src:"{(trip own)}"
19+ =/ src=tape (trip own)
36− ;script:'CodeMirror.fromTextArea(src, {lineNumbers:true, readOnly:true})'
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+ ==
37 ==
45 ==
38− ==
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+ '''
39 ++ txt
293 ++ txt
40 (to-wain:format own)
294 (to-wain:format own)
41 --
295 --
base-desk/mar/htm.hoon+2−11
@@ -2,14 +2,5 @@
2:::: /hoon/htm/mar
2:::: /hoon/htm/mar
3 ::
3 ::
4/? 310
4/? 310
5−|_ own=manx
5+/= htm /mar/html
6−::
6+htm
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+1−2
@@ -5,12 +5,11 @@
5::
5::
6=, eyre
6=, eyre
7=, format
7=, format
8−=, html
9|_ hit=httr
8|_ hit=httr
10++ grad %noun
9++ grad %noun
11++ grow |% ++ wall (turn wain trip)
10++ grow |% ++ wall (turn wain trip)
12 ++ wain (to-wain cord)
11 ++ wain (to-wain cord)
13− ++ json (need (de-json cord))
12+ ++ json (need (de:json:html cord))
14 ++ cord q:octs
13 ++ cord q:octs
15 ++ noun hit
14 ++ noun hit
16 ++ octs
15 ++ octs
base-desk/mar/js.hoon+7−4
@@ -8,10 +8,13 @@
8++ grow
8++ grow
9 |%
9 |%
10 ++ mime [/application/javascript (as-octs:mimes:html (@t mud))]
10 ++ mime [/application/javascript (as-octs:mimes:html (@t mud))]
11+ ++ hymn :: convert to %hymn
12+ |^ html
11− ++ elem ;script
13+ ++ script ;script
12− ;- (trip (@t mud))
14+ ;- (trip (@t mud))
13− ==
15+ ==
14− ++ hymn ;html:(head:"+{elem}" body)
16+ ++ html ;html:(head:"{script}" body)
17+ --
15 --
18 --
16++ grab
19++ grab
17 |% :: convert from
20 |% :: convert from
base-desk/mar/json.hoon+4−4
@@ -8,17 +8,17 @@
8=, eyre
8=, eyre
9=, format
9=, format
10=, html
10=, html
11−|_ jon=json
11+|_ jon=^json
12::
12::
13++ grow :: convert to
13++ grow :: convert to
14 |%
14 |%
15 ++ mime [/application/json (as-octs:mimes -:txt)] :: convert to %mime
15 ++ mime [/application/json (as-octs:mimes -:txt)] :: convert to %mime
16− ++ txt [(crip (en-json jon))]~
16+ ++ txt [(en:json jon)]~
17 --
17 --
18++ grab
18++ grab
19 |% :: convert from
19 |% :: convert from
20− ++ mime |=([p=mite q=octs] (fall (rush (@t q.q) apex:de-json) *json))
20+ ++ mime |=([p=mite q=octs] (fall (de:json (@t q.q)) *^json))
21− ++ noun json :: clam from %noun
21+ ++ noun ^json :: clam from %noun
22 ++ numb numb:enjs
22 ++ numb numb:enjs
23 ++ time time:enjs
23 ++ time time:enjs
24 --
24 --
base-desk/mar/json/rpc/response.hoon+1−2
@@ -16,11 +16,10 @@
16 ^- response
16 ^- response
17 ~| hit
17 ~| hit
18 ?: ?=(%2 (div p.hit 100))
18 ?: ?=(%2 (div p.hit 100))
19− =, html
20 %- json
19 %- json
21 ?~ r.hit
20 ?~ r.hit
22 a+~
21 a+~
23− (need (de-json q:u.r.hit))
22+ (need (de:json:html q:u.r.hit))
24 fail+hit
23 fail+hit
25 ++ json :: from json
24 ++ json :: from json
26 =, dejs-soft:format
25 =, dejs-soft:format
base-desk/mar/noun.hoon+3
@@ -8,6 +8,9 @@
8++ grab |%
8++ grab |%
9 ++ noun *
9 ++ noun *
10 --
10 --
11+++ grow |%
12+ ++ mime [/application/x-urb-jam (as-octs:mimes:html (jam non))]
13+ --
11++ grad
14++ grad
12 |%
15 |%
13 ++ form %noun
16 ++ form %noun
base-desk/mar/sole/action.hoon+3−1
@@ -20,7 +20,9 @@
20 |= jon=^json ^- sole-action
20 |= jon=^json ^- sole-action
21 %- need %. jon
21 %- need %. jon
22 => [dejs-soft:format ..sole-action]
22 => [dejs-soft:format ..sole-action]
23− |^ (ot id+so dat+(fo %ret (of det+change tab+ni ~)) ~)
23+ |^ (ot id+id dat+(fo %ret (of det+change tab+ni ~)) ~)
24+ ++ id
25+ (ot who+(su ;~(pfix sig fed:ag)) ses+so ~)
24 ++ fo
26 ++ fo
25 |* [a=term b=fist]
27 |* [a=term b=fist]
26 |=(c=json ?.(=([%s a] c) (b c) (some [a ~])))
28 |=(c=json ?.(=([%s a] c) (b c) (some [a ~])))
base-desk/mar/story.hoon+5−10
@@ -46,18 +46,13 @@
46 [/text/x-urb-story (as-octs:mimes:html (of-wain:format txt))]
46 [/text/x-urb-story (as-octs:mimes:html (of-wain:format txt))]
47 ++ txt
47 ++ txt
48 ^- wain
48 ^- wain
49− %- snoc :_ '' :: ensures terminating newline is present
49+ %- zing
50+ %+ join `wain`~['---']
50 %+ murn ~(tap by tale)
51 %+ murn ~(tap by tale)
51− |= [[=tako:clay =proses]]
52+ |= [=tako:clay =proses]
52− ^- (unit cord)
53+ ^- (unit wain)
53 ?~ proses ~
54 ?~ proses ~
54− %- some
55− %- crip
56− ;: welp
57− (tako-to-text tako)
55+ (some (chapter-to-text tako proses))
58− (proses-to-text proses)
59− "---"
60− ==
61 --
56 --
62++ grab
57++ grab
63 |% :: convert from
58 |% :: convert from
base-desk/mar/tang.hoon+5−5
@@ -16,15 +16,15 @@
16 %& a+p.result
16 %& a+p.result
17 %| a+[a+[%s '[[output rendering error]]']~]~
17 %| a+[a+[%s '[[output rendering error]]']~]~
18 ==
18 ==
19− ::
19+ ++ txt
20− ++ elem
20+ ^- wain
21− =- ;pre:code:"{(of-wall -)}"
22− ^- wall %- zing ^- (list wall)
23− (turn (flop tan) |=(a=tank (wash 0^160 a)))
21+ %+ turn (flop tan)
22+ |=(=tank (crip ~(ram re tank)))
24 --
23 --
25++ grab :: convert from
24++ grab :: convert from
26 |%
25 |%
27 ++ noun (list ^tank) :: clam from %noun
26 ++ noun (list ^tank) :: clam from %noun
28 ++ tank |=(a=^tank [a]~)
27 ++ tank |=(a=^tank [a]~)
28+ ++ txt |=(=wain (flop (turn wain tank)))
29 --
29 --
30--
30--
base-desk/mar/thread-fail.hoon+1−1
@@ -1,4 +1,4 @@
1−|_ err=*
1+|_ err=[term tang]
2++ grab
2++ grab
3 |%
3 |%
4 ++ noun (pair term tang)
4 ++ noun (pair term tang)
base-desk/mar/txt.hoon−1
@@ -18,7 +18,6 @@
18 => v=.
18 => v=.
19 |%
19 |%
20 ++ mime => v [/text/plain (as-octs (of-wain txt))]
20 ++ mime => v [/text/plain (as-octs (of-wain txt))]
21− ++ elem => v ;pre: {(trip (of-wain txt))}
22 --
21 --
23++ grad
22++ grad
24 |%
23 |%
base-desk/mar/udon.hoon−4
@@ -9,10 +9,6 @@
9 ++ mime [/text/x-unmark (as-octs:mimes:html mud)]
9 ++ mime [/text/x-unmark (as-octs:mimes:html mud)]
10 ++ txt
10 ++ txt
11 (to-wain:format mud)
11 (to-wain:format mud)
12− ++ elem
13− ^- manx
14− =, cram
15− elm:(static (ream mud))
16 ++ front :: XX performance, types
12 ++ front :: XX performance, types
17 ^- (map term knot)
13 ^- (map term knot)
18 %- ~(run by inf:(static:cram (ream mud)))
14 %- ~(run by inf:(static:cram (ream mud)))
base-desk/mar/umd.hoon−4
@@ -9,10 +9,6 @@
9 ++ mime [/text/x-unmark (as-octs:mimes:html mud)]
9 ++ mime [/text/x-unmark (as-octs:mimes:html mud)]
10 ++ txt
10 ++ txt
11 (to-wain:format mud)
11 (to-wain:format mud)
12− ++ elem
13− ^- manx
14− =, cram
15− elm:(static (ream mud))
16 ++ front :: XX performance, types
12 ++ front :: XX performance, types
17 ^- (map term knot)
13 ^- (map term knot)
18 %- ~(run by inf:(static:cram (ream mud)))
14 %- ~(run by inf:(static:cram (ream mud)))
base-desk/mar/urb.hoon+1−1
@@ -1,5 +1,5 @@
1::
1::
2−:::: /hoon/elem/urb/mar
2+:::: /hoon/urb/mar
3 ::
3 ::
4/? 310
4/? 310
5=, mimes:html
5=, mimes:html
base-desk/sources.txt+2−3
@@ -1,4 +1,3 @@
1urbit-src/pkg/base-dev
1urbit-src/pkg/base-dev
2−urbit-src/pkg/garden-dev
2+urbit-src/pkg/landscape
3−urbit-src/pkg/arvo/lib/naive
4−urbit-src/pkg/arvo/lib/tiny
3+urbit-src/pkg/arvo
base-desk/sur/aquarium.hoon+8−4
@@ -10,8 +10,6 @@
10:: Short names are simply the first letter of each word plus `s` if
10:: Short names are simply the first letter of each word plus `s` if
11:: it's a list.
11:: it's a list.
12::
12::
13−/+ pill
14−=, pill-lib=pill
15|%
13|%
16+$ az-log [topics=(lest @) data=@t]
14+$ az-log [topics=(lest @) data=@t]
17+$ az-state
15+$ az-state
@@ -34,13 +32,13 @@
34 [%verb p=(unit ?)]
32 [%verb p=(unit ?)]
35 task-arvo
33 task-arvo
36 ==
34 ==
37−+$ pill pill:pill-lib
38::
35::
39+$ aqua-event
36+$ aqua-event
40− $% [%init-ship who=ship fake=?]
37+ $% [%init-ship who=ship fake=? feed=(unit feed:jael)]
41 [%pause-events who=ship]
38 [%pause-events who=ship]
42 [%snap-ships lab=term hers=(list ship)]
39 [%snap-ships lab=term hers=(list ship)]
43 [%restore-snap lab=term]
40 [%restore-snap lab=term]
41+ [%read [from=[=ship life=@ubC] =path] for=[=lane:ames life=@ubC] num=@ud]
44 [%event who=ship ue=unix-event]
42 [%event who=ship ue=unix-event]
45 ==
43 ==
46::
44::
@@ -73,6 +71,9 @@
73 %+ pair wire
71 %+ pair wire
74 $% [%blit p=(list blit:dill)]
72 $% [%blit p=(list blit:dill)]
75 [%send p=lane:ames q=@]
73 [%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)]
76 [%doze p=(unit @da)]
77 [%doze p=(unit @da)]
77 [%thus p=@ud q=(unit hiss:eyre)]
78 [%thus p=@ud q=(unit hiss:eyre)]
78 [%ergo p=@tas q=mode:clay]
79 [%ergo p=@tas q=mode:clay]
@@ -81,5 +82,8 @@
81 [%kill ~]
82 [%kill ~]
82 [%init ~]
83 [%init ~]
83 [%request id=@ud request=request:http]
84 [%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)
84 ==
88 ==
85--
89--
base-desk/sur/hood.hoon+281−185
@@ -1,147 +1,312 @@
1+/% kelvin %kelvin
1=, clay
2=, clay
2=* dude dude:gall
3=* dude dude:gall
3|%
4|%
4−:: $snap: kiln snapshot
5++$ pike
6+ $: sync=(unit [=ship =desk])
7+ hash=@uv
8+ =zest
9+ wic=(set weft)
10+ ==
5::
11::
6−+$ snap (map desk arak)
12++$ pikes (map desk pike)
7−:: $diff: subscription update
13+:: $jump: changes to update source change requests
8::
14::
9−+$ diff
15++$ jump
10− $% [%block =desk =arak =weft blockers=(set desk)]
16+ $% [%all all=(map dock dock)] :: pending requests
11− [%reset =desk =arak]
17+ [%add old=dock new=dock] :: new request
12− [%commit =desk =arak]
18+ [%yea old=dock new=dock] :: approved
13− [%merge-sunk =desk =arak =tang]
19+ [%nay old=dock new=dock] :: denied
14− [%merge-fail =desk =arak =tang]
15− [%suspend =desk =arak]
16− [%revive =desk =arak]
17 ==
20 ==
18−:: $arak: foreign vat tracker
21+:: $rung: reference to upstream commit
19::
22::
20−:: .rail: upstream tracking state, if any
23++$ rung [=aeon =weft]
21−:: .rein: configuration for agents
24+:: #sync-record: source and destination of a kiln sync
22::
25::
23−+$ arak
26++$ sync-record ::
24− $: rail=(unit rail)
27+ $: syd=desk :: local desk
25− =rein
28+ her=ship :: foreign ship
29+ sud=desk :: foreign desk
26 ==
30 ==
27−:: $rail: upstream tracking state
28::
31::
29−:: .publisher: Ship that originally published desk, if available
32++$ sync-state ::
30−:: .paused: is tracking paused? or live
33+ $: nun=@ta :: nonce
31−:: .ship: upstream ship (could be .our)
34+ kid=(unit desk) :: has kids desk too?
32−:: .desk: name of upstream desk
35+ let=@ud :: next revision
33−:: .aeon: next aeon to pull from upstream
36+ nit=(unit ?) :: automerge or default
34−:: .next: list of pending commits with future kelvins
37+ hav=(unit @ud) :: update available
38+ yea=? :: update approved
39+ ==
35::
40::
36−+$ rail
41++$ sync-update
37− $: publisher=(unit ship)
42+ $% [%new for=sync-record rev=@ud]
38− paused=?
43+ [%done for=sync-record rev=@ud]
39− =ship
44+ [%drop for=sync-record rev=@ud]
40− =desk
45+ [%pending pending=(set [for=sync-record rev=@ud])]
41− =aeon
42− next=(list rung)
43 ==
46 ==
44−:: $rung: reference to upstream commit
45::
47::
46−+$ rung [=aeon =weft]
48++$ sink (unit [her=@p sud=desk kid=(unit desk) let=@ud])
47−:: $rein: diff from desk manifest
49+:: +truncate-hash: get last 5 digits of hash and convert to tape
48::
50::
49−:: .liv: suspended? if suspended, no agents should run
51+++ truncate-hash
50−:: .add: agents not in manifest that should be running
52+ |= hash=@uv
51−:: .sub: agents in manifest that should not be running
53+ ^- tape
54+ (slag 2 <`@uv`(mod hash 0v1.00000)>)
55+:: +report-prep: get data required for reports
52::
56::
53−+$ rein
57+++ report-prep
54− $: liv=_&
58+ |= [our=@p now=@da]
55− add=(set dude)
59+ =/ ego (scot %p our)
56− sub=(set dude)
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+ ==
57 ==
67 ==
58−::
59−+$ vat [=desk hash=@uv =cass =arak]
60:: +report-vats: report on all desk installations
68:: +report-vats: report on all desk installations
61::
69::
62++ report-vats
70++ report-vats
63− |= [our=@p now=@da]
71+ |= [our=@p now=@da desks=(list desk) filt=@tas verb=?]
64 ^- tang
72 ^- tang
65− =+ .^ raz=(list vat)
73+ =/ ego (scot %p our)
66− %gx /(scot %p our)/hood/(scot %da now)/kiln/vats/noun
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)
67 ==
155 ==
68− :- (report-kids our now)
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+ ==
69− (turn raz |=(v=vat (report-vat our now v)))
164+ |=([syd=desk *] (report-vat prep our now syd verb))
70:: +report-vat: report on a single desk installation
165:: +report-vat: report on a single desk installation
71::
166::
72++ report-vat
167++ report-vat
168+ |= $: $: tyr=rock:tire =cone sor=(map desk (pair ship desk))
169+ zyn=(map [desk ship desk] sync-state)
170+ ==
73− |= [our=ship now=@da vat]
171+ our=ship now=@da syd=desk verb=?
74− ^- tank
172+ ==
75− ?: =(ud.cass 0)
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)
76− leaf+"desk does not yet exist: {<desk>}"
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))]
77− =/ kel-path
183+ =/ kel-path /[ego]/[syd]/[wen]/sys/kelvin
78− /(scot %p our)/[desk]/(scot %da now)/sys/kelvin
79 ?. .^(? %cu kel-path)
184 ?. .^(? %cu kel-path)
80− leaf+"bad desk: {<desk>}"
185+ ~[(cat 3 'bad desk: %' syd)]
81− =+ .^(=weft %cx kel-path)
186+ =+ .^(=waft %cx kel-path)
82− :+ %rose ["" "{<desk>}" "::"]
83 ^- tang
187 ^- tang
84− =/ meb (mergebase-hashes our desk now arak)
188+ =/ =sink
85− =/ poz
189+ ?~ s=(~(get by sor) syd)
86− ?~ rail.arak "local"
190+ ~
87− ?:(paused.u.rail.arak "paused" "tracking")
191+ ?~ z=(~(get by zyn) syd u.s)
88− =/ sat ?:(liv.rein.arak "running" "suspended")
192+ ~
89− =/ pen
193+ `[p.u.s q.u.s [kid let]:u.z]
90− ?~ rail.arak "~"
194+ =/ meb=(list @uv)
91− <(turn next.u.rail.arak |=([@ lal=@tas num=@] [lal num]))>
195+ ?~ sink ~[hash]
92− :~ leaf/"/sys/kelvin: {<[lal num]:weft>}"
196+ %+ turn
93− leaf/"base hash: {?.(=(1 (lent meb)) <meb> <(head meb)>)}"
197+ .^ (list tako) %cs
94− leaf/"%cz hash: {<hash>}"
198+ /[ego]/[syd]/[wen]/base/(scot %p her.u.sink)/[sud.u.sink]
95− ::
199+ ==
96− leaf/"app status: {sat}"
200+ |=(=tako .^(@uv %cs /[ego]/[syd]/[wen]/hash/(scot %uv tako)))
97− leaf/"force on: {?:(=(~ add.rein.arak) "~" <add.rein.arak>)}"
201+ =/ dek (~(got by tyr) syd)
98− leaf/"force off: {?:(=(~ sub.rein.arak) "~" <sub.rein.arak>)}"
202+ =/ sat
99− ::
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'))
100− leaf/"publishing ship: {?~(rail.arak <~> <publisher.u.rail.arak>)}"
244+ %^ cat 3 ' publishing ship: ' ?~ got=(get-publisher our syd now)
101− leaf/"updates: {poz}"
245+ '~'
102− leaf/"source ship: {?~(rail.arak <~> <ship.u.rail.arak>)}"
246+ (scot %p u.got)
103− leaf/"source desk: {?~(rail.arak <~> <desk.u.rail.arak>)}"
247+ ::
104− leaf/"source aeon: {?~(rail.arak <~> <aeon.u.rail.arak>)}"
248+ (cat 3 ' force off: ' (print-agents of))
105− leaf/"pending updates: {pen}"
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)
106 ==
257 ==
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+ --
107:: +report-kids: non-vat cz hash report for kids desk
298:: +report-kids: non-vat cz hash report for kids desk
108::
299::
109++ report-kids
300++ report-kids
110 |= [our=ship now=@da]
301 |= [our=ship now=@da]
111 ^- tank
302 ^- tank
112− =/ dek %kids
303+ =/ syd %kids
113 =/ ego (scot %p our)
304 =/ ego (scot %p our)
114 =/ wen (scot %da now)
305 =/ wen (scot %da now)
115− ?. (~(has in .^((set desk) %cd /[ego]//[wen])) dek)
306+ ?. (~(has in .^((set desk) %cd /[ego]//[wen])) syd)
116− leaf/"no %kids desk"
307+ 'no %kids desk'
117− =+ .^(hash=@uv %cz /[ego]/[dek]/[wen])
308+ =+ .^(hash=@uv %cz /[ego]/[syd]/[wen])
118− leaf/"%kids %cz hash: {<hash>}"
309+ (cat 3 '%kids %cz hash: ' (scot %uv 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)]
145:: +read-bill-foreign: read /desk/bill from a foreign desk
310:: +read-bill-foreign: read /desk/bill from a foreign desk
146::
311::
147++ read-bill-foreign
312++ read-bill-foreign
@@ -152,7 +317,7 @@
152 =/ syd (scot %tas desk)
317 =/ syd (scot %tas desk)
153 =/ yon (scot %ud aeon)
318 =/ yon (scot %ud aeon)
154 ::
319 ::
155− =/ dom .^(dome cv/~[her syd yon])
320+ =/ dom .^(domo cv/~[her syd yon])
156 =/ tak ~| aeons=~(key by hit.dom)
321 =/ tak ~| aeons=~(key by hit.dom)
157 (scot %uv (~(got by hit.dom) aeon))
322 (scot %uv (~(got by hit.dom) aeon))
158 =/ yak .^(yaki cs/~[her syd yon %yaki tak])
323 =/ yak .^(yaki cs/~[her syd yon %yaki tak])
@@ -169,21 +334,6 @@
169 ?. .^(? cu/pax)
334 ?. .^(? cu/pax)
170 *(list dude)
335 *(list dude)
171 .^((list dude) cx/pax)
336 .^((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)))]
187::
337::
188++ get-remote-diff
338++ get-remote-diff
189 |= [our=ship here=desk now=@da her=ship there=desk when=aeon]
339 |= [our=ship here=desk now=@da her=ship there=desk when=aeon]
@@ -209,39 +359,19 @@
209 |= [our=ship =desk now=@da]
359 |= [our=ship =desk now=@da]
210 ^- (list [=dude live=?])
360 ^- (list [=dude live=?])
211 %~ tap in
361 %~ tap in
212− .^((set [=dude live=?]) ge+/(scot %p our)/[desk]/(scot %da now))
362+ .^((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
223::
363::
224++ mergebase-hashes
364++ mergebase-hashes
225− |= [our=@p =desk now=@da =arak]
365+ |= [our=@p syd=desk now=@da her=ship sud=desk]
226− ?~ rail.arak
227− ~
228− =/ her (scot %p ship.u.rail.arak)
366+ =/ her (scot %p her)
229 =/ ego (scot %p our)
367 =/ ego (scot %p our)
230 =/ wen (scot %da now)
368 =/ wen (scot %da now)
231− %+ turn .^((list tako) %cs ~[ego desk wen %base her desk.u.rail.arak])
369+ %+ turn .^((list tako) %cs /[ego]/[syd]/[wen]/base/[her]/[sud])
232− |=(=tako .^(@uv %cs ~[ego desk wen %hash (scot %uv tako)]))
370+ |=(=tako .^(@uv %cs /[ego]/[syd]/[wen]/hash/(scot %uv tako)))
233::
371::
234++ enjs
372++ enjs
235 =, enjs:format
373 =, enjs:format
236 |%
374 |%
237− ++ vats
238− |= v=(list ^vat)
239− ^- json
240− %- pairs
241− %+ turn v
242− |= va=^vat
243− [desk.va (vat va)]
244− ::
245 ++ tim
375 ++ tim
246 |= t=@
376 |= t=@
247 ^- json
377 ^- json
@@ -254,15 +384,6 @@
254 da+(tim da.c)
384 da+(tim da.c)
255 ==
385 ==
256 ::
386 ::
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− ::
266 ++ weft
387 ++ weft
267 |= w=^weft
388 |= w=^weft
268 %- pairs
389 %- pairs
@@ -276,30 +397,5 @@
276 :~ aeon+(numb aeon.r)
397 :~ aeon+(numb aeon.r)
277 weft+(weft weft.r)
398 weft+(weft weft.r)
278 ==
399 ==
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− ==
304 --
400 --
305--
401--
base-desk/sur/ring.hoon+1−1
@@ -15,7 +15,7 @@
15 :: resistance...but if your private keys are compromised, your
15 :: resistance...but if your private keys are compromised, your
16 :: adversary can determine which signatures you made.
16 :: adversary can determine which signatures you made.
17 ::
17 ::
18− y=(unit @udpoint)
18+ y=(unit @uxpoint)
19 ==
19 ==
20:: +ring-signature: higher level ring signature type
20:: +ring-signature: higher level ring signature type
21::
21::
base-desk/sur/sole.hoon+2−1
@@ -3,8 +3,9 @@
3 ::
3 ::
4^?
4^?
5|%
5|%
6++$ sole-id [who=@p ses=@ta]
6+$ sole-action :: sole to app
7+$ sole-action :: sole to app
7− $: id=@ta :: duct id
8+ $: id=sole-id :: session id
8 $= dat
9 $= dat
9 $% :: [%abo ~] :: reset interaction
10 $% :: [%abo ~] :: reset interaction
10 [%det sole-change] :: command line edit
11 [%det sole-change] :: command line edit
base-desk/sur/spider.hoon+7−1
@@ -1,7 +1,7 @@
1/+ libstrand=strand
1/+ libstrand=strand
2=, strand=strand:libstrand
2=, strand=strand:libstrand
3|%
3|%
4−+$ thread $-(vase _*form:(strand ,vase))
4++$ thread $-(vase shed:khan)
5+$ input [=tid =cage]
5+$ input [=tid =cage]
6+$ tid tid:strand
6+$ tid tid:strand
7+$ bowl bowl:strand
7+$ bowl bowl:strand
@@ -18,4 +18,10 @@
18 file=term
18 file=term
19 =vase
19 =vase
20 ==
20 ==
21++$ inline-args
22+ $: parent=(unit tid)
23+ use=(unit tid)
24+ =beak
25+ =shed:khan
26+ ==
21--
27--
base-desk/sur/sss.hoonnew file+39
@@ -0,0 +1,39 @@
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+37−1
@@ -9,4 +9,40 @@
9 [%on-arvo =wire vane=term sign=term]
9 [%on-arvo =wire vane=term sign=term]
10 [%on-fail =term]
10 [%on-fail =term]
11 ==
11 ==
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+ ==
12−--
48+--
bin/make_glob.pynew file+208
@@ -0,0 +1,208 @@
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+26−3
@@ -18,7 +18,11 @@
18++ on-init
18++ on-init
19 ^- (quip card _this)
19 ^- (quip card _this)
20 :_ this
20 :_ this
21+ :~ ug-handler-card:hc
22+ groups-link-patch-card:hc
23+ talk-link-patch-card:hc
21− [az-events-card:hc]~
24+ az-events-card:hc
25+ ==
22::
26::
23++ on-save !>(state)
27++ on-save !>(state)
24++ on-load
28++ on-load
@@ -30,8 +34,10 @@
30 (on-naive-state:hc get-nas:hc)
34 (on-naive-state:hc get-nas:hc)
31 ?> ?=(%4 -.new)
35 ?> ?=(%4 -.new)
32 =/ cards=(list card)
36 =/ cards=(list card)
33− =/ ug-vase !>([/astrolabe '/apps/astrolabe/#'])
37+ :~ ug-handler-card:hc
34− [%pass /monkey-ug %agent [our.bowl %monkey] %poke [%bind-ug ug-vase]]~
38+ groups-link-patch-card:hc
39+ talk-link-patch-card:hc
40+ ==
35 =. cards (weld cards-01 cards)
41 =. cards (weld cards-01 cards)
36 [cards this(state new)]
42 [cards this(state new)]
37++ on-poke on-poke:def
43++ on-poke on-poke:def
@@ -308,6 +314,23 @@
308 (pdata:smel (pmeta:smel gal npoint) ~)
314 (pdata:smel (pmeta:smel gal npoint) ~)
309 s+(crip :(weld "[" gal-data main-data "]"))
315 s+(crip :(weld "[" gal-data main-data "]"))
310::
316::
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+::
311++ read-doc
334++ read-doc
312 |= =path
335 |= =path
313 =/ doc-path=^path :(weld /doc/usr path /udon)
336 =/ doc-path=^path :(weld /doc/usr path /udon)
desk/desk.docket-0+3−3
@@ -1,10 +1,10 @@
1:~ title+'Astrolabe'
1:~ title+'Astrolabe'
2− info+'Your guide to the Urbit constellations'
2+ info+'Your guide to the Urbit constellations. Search for ships, view their info, and explore the Star Chart.'
3 color+0x1f.243c
3 color+0x1f.243c
4 image+'https://raw.githubusercontent.com/johnhyde/astrolabe/main/ui/src/assets/astrolabe-tile.svg'
4 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.pblr2.22g1n.glg47.p9i8t.2n33l.glob' 0v4.pblr2.22g1n.glg47.p9i8t.2n33l]
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]
6 base+'astrolabe'
6 base+'astrolabe'
7− version+[0 3 7]
7+ version+[1 0 7]
8 website+'https://github.com/johnhyde/astrolabe'
8 website+'https://github.com/johnhyde/astrolabe'
9 license+'MIT'
9 license+'MIT'
10==
10==
desk/lib/astrolabe.hoon+28
@@ -203,4 +203,32 @@
203 ^- $-(json [%share ship])
203 ^- $-(json [%share ship])
204 (of share+(su ;~(pfix sig fed:ag)) ~)
204 (of share+(su ;~(pfix sig fed:ag)) ~)
205 --
205 --
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+'''
206--
234--
desk/sys.kelvin+1−1
@@ -1 +1 @@
1−[%zuse 417]
1+[%zuse 408]
flake.locknew file+27
@@ -0,0 +1,27 @@
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.nixnew file+73
@@ -0,0 +1,73 @@
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+2−2
@@ -174,7 +174,7 @@
174 },
174 },
175 "node_modules/@johnhyde/sigil-js": {
175 "node_modules/@johnhyde/sigil-js": {
176 "version": "1.4.6",
176 "version": "1.4.6",
177− "resolved": "git+ssh://git@github.com/johnhyde/sigil-js.git#35f71ac00b54dd56d010b6fccfa48c6f75c48ee8",
177+ "resolved": "git+ssh://git@github.com/johnhyde/sigil-js.git#f89ce78c34b5811ea19ddea4a6964ea8360e7b4d",
178 "license": "MIT",
178 "license": "MIT",
179 "dependencies": {
179 "dependencies": {
180 "invariant": "^2.2.4",
180 "invariant": "^2.2.4",
@@ -3155,7 +3155,7 @@
3155 }
3155 }
3156 },
3156 },
3157 "@johnhyde/sigil-js": {
3157 "@johnhyde/sigil-js": {
3158− "version": "git+ssh://git@github.com/johnhyde/sigil-js.git#35f71ac00b54dd56d010b6fccfa48c6f75c48ee8",
3158+ "version": "git+ssh://git@github.com/johnhyde/sigil-js.git#f89ce78c34b5811ea19ddea4a6964ea8360e7b4d",
3159 "from": "@johnhyde/sigil-js@github:johnhyde/sigil-js",
3159 "from": "@johnhyde/sigil-js@github:johnhyde/sigil-js",
3160 "requires": {
3160 "requires": {
3161 "invariant": "^2.2.4",
3161 "invariant": "^2.2.4",
ui/src/actions/tooltip.ts+2−2
@@ -23,11 +23,11 @@ function getParams(paramsOrContent:any = {}, overrides = {}) {
23
23
24export default function tooltip(node, paramsOrContent: any = {}) {
24export default function tooltip(node, paramsOrContent: any = {}) {
25 const onTrigger = () => {
25 const onTrigger = () => {
26− console.log('triggered');
26+ // console.log('triggered');
27 node.dispatchEvent(new CustomEvent("tooltipTriggered"));
27 node.dispatchEvent(new CustomEvent("tooltipTriggered"));
28 };
28 };
29 const onUntrigger = () => {
29 const onUntrigger = () => {
30− console.log('untriggered');
30+ // console.log('untriggered');
31 node.dispatchEvent(new CustomEvent("tooltipUntriggered"));
31 node.dispatchEvent(new CustomEvent("tooltipUntriggered"));
32 };
32 };
33 const onClickOutside = (_, e) => {
33 const onClickOutside = (_, e) => {
ui/src/components/CollapsibleContent.svelte+4−5
@@ -1,18 +1,17 @@
1<script lang="ts">
1<script lang="ts">
2− import { slide } from 'svelte/transition';
2+ import { slide } from 'svelte/transition';
3− import { quintOut } from 'svelte/easing';
4−
5 export let open: boolean = true;
3 export let open: boolean = true;
6</script>
4</script>
7
5
8<div class="mt-2">
6<div class="mt-2">
9 <button on:click={() => (open = !open)}>
7 <button on:click={() => (open = !open)}>
10− <span class="font-mono">{open ? '▼' : '▶'}</span>
8+ <span class="font-mono inline-block transition duration-150 {open ? 'rotate-90' : ''}">▶</span>
11 &nbsp;
9 &nbsp;
12 <slot name="title"></slot>
10 <slot name="title"></slot>
13 </button>
11 </button>
14 {#if open}
12 {#if open}
13+ <!-- turns out it's important not to put an await in the content -->
15− <div class="ml-[22px]" transition:slide="{{duration: 50 }}">
14+ <div class="ml-[22px]" transition:slide|local="{{duration: 150 }}">
16 <slot name="content"></slot>
15 <slot name="content"></slot>
17 </div>
16 </div>
18 {/if}
17 {/if}
ui/src/components/StarChart.svelte+15−2
@@ -1,7 +1,8 @@
1<script lang="ts">
1<script lang="ts">
2 import LoadingSpinner from '@/common/LoadingSpinner.svelte';
2 import LoadingSpinner from '@/common/LoadingSpinner.svelte';
3
3
4− import { push } from 'svelte-spa-router'
4+ import { push } from 'svelte-spa-router';
5+ import { onDestroy } from 'svelte';
5
6
6 import Sigma from 'sigma-jh';
7 import Sigma from 'sigma-jh';
7 import Graph from 'graphology';
8 import Graph from 'graphology';
@@ -9,7 +10,7 @@
9 import { clan } from 'urbit-ob';
10 import { clan } from 'urbit-ob';
10 import DocLink from './docs/DocLink.svelte';
11 import DocLink from './docs/DocLink.svelte';
11 import store from 'stores/store';
12 import store from 'stores/store';
12− import { cite, normalizeId } from 'lib/id';
13+ import keys from 'stores/keys';
13 import { parseChartData, populateGraph } from 'lib/graph';
14 import { parseChartData, populateGraph } from 'lib/graph';
14 import { getChartData } from 'lib/api';
15 import { getChartData } from 'lib/api';
15 import { linkToShip } from 'lib/link';
16 import { linkToShip } from 'lib/link';
@@ -150,6 +151,18 @@
150 let filterSet: Set<string> = null;
151 let filterSet: Set<string> = null;
151 $: peersSet = new Set($store.peers);
152 $: peersSet = new Set($store.peers);
152 $: palsSet = new Set(Object.keys($store.pals.outgoing));
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+ });
153</script>
166</script>
154
167
155<div class="border border-gold bg-navy w-full grow flex flex-col relative">
168<div class="border border-gold bg-navy w-full grow flex flex-col relative">
ui/src/components/common/Sigil.svelte+27−27
@@ -1,8 +1,8 @@
1<script lang="ts">
1<script lang="ts">
2 import { clan } from 'urbit-ob';
2 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';
4 import { sigil as sigil2, stringRenderer as sr2 } from '@johnhyde/sigil-js';
4 import { sigil as sigil2, stringRenderer as sr2 } from '@johnhyde/sigil-js';
5− import { sigilScalingFunction } from 'lib/sigil';
5+ import { sigilScalingFunction, crowdedSigilScalingFunction } from 'lib/sigil';
6 import moonPng from 'assets/moon.png';
6 import moonPng from 'assets/moon.png';
7 import cometSvg from 'assets/comet.svg';
7 import cometSvg from 'assets/comet.svg';
8
8
@@ -20,46 +20,46 @@
20 $: noShrinkWidth = noShrink ? size+'px' : 'initial';
20 $: noShrinkWidth = noShrink ? size+'px' : 'initial';
21
21
22 $: shipClass = clan(patp);
22 $: shipClass = clan(patp);
23− $: displaySigil = ['galaxy', 'star', 'planet'].includes(shipClass);
23+ $: crowded = ['comet', 'moon'].includes(shipClass);
24 $: {
24 $: {
25− if (displaySigil) {
25+ // if (displaySigil) {
26− let sigil = sigil1;
26+ // let sigil = sigil1;
27− let sr = sr1;
27+ // let sr = sr1;
28− let svgAST;
28+ // let svgAST;
29− if (useNew) {
29+ // if (useNew) {
30− sigil = sigil2;
30+ let sigil = sigil2;
31− sr = sr2;
31+ let sr = sr2;
32− svgAST = sigil({
32+ let svgAST = sigil({
33 patp: patp,
33 patp: patp,
34 size,
34 size,
35 colors: [bgColor, fgColor],
35 colors: [bgColor, fgColor],
36 autoScaleStrokes: true,
36 autoScaleStrokes: true,
37− strokeScalingFunctionV2: sigilScalingFunction,
37+ strokeScalingFunctionV2: crowded ? crowdedSigilScalingFunction : sigilScalingFunction,
38 });
38 });
39− } else {
39+ // } else {
40− svgAST = sigil({
40+ // svgAST = sigil({
41− patp: patp,
41+ // patp: patp,
42− size,
42+ // size,
43− colors: [bgColor, fgColor],
43+ // colors: [bgColor, fgColor],
44− });
44+ // });
45− }
45+ // }
46 svgAST.attributes.preserveAspectRatio = 'xMidYMin slice';
46 svgAST.attributes.preserveAspectRatio = 'xMidYMin slice';
47 svgString = sr(svgAST);
47 svgString = sr(svgAST);
48 if (altBgColor) {
48 if (altBgColor) {
49 svgString = svgString.replace(/rect fill="[^"]+"/, `rect fill="${altBgColor}"`);
49 svgString = svgString.replace(/rect fill="[^"]+"/, `rect fill="${altBgColor}"`);
50 }
50 }
51− } else if (shipClass === 'moon') {
51+ // } else if (shipClass === 'moon') {
52− imgSrc = moonPng;
52+ // imgSrc = moonPng;
53− } else {
53+ // } else {
54− imgSrc = cometSvg;
54+ // imgSrc = cometSvg;
55− }
55+ // }
56 }
56 }
57</script>
57</script>
58
58
59<div class="grow {noShrinkClasses}" style:max-width="{size}px" style:width={noShrinkWidth}>
59<div class="grow {noShrinkClasses}" style:max-width="{size}px" style:width={noShrinkWidth}>
60− {#if displaySigil}
60+ <!-- {#if displaySigil} -->
61 {@html svgString}
61 {@html svgString}
62− {:else}
62+ <!-- {:else}
63 <img src={imgSrc} alt={shipClass} class="mx-auto" />
63 <img src={imgSrc} alt={shipClass} class="mx-auto" />
64− {/if}
64+ {/if} -->
65</div>
65</div>
ui/src/components/ship_view/AzimuthDetails.svelte+2−4
@@ -1,7 +1,5 @@
1<script lang="ts">
1<script lang="ts">
2− import { clan, patp2dec } from 'urbit-ob';
2+ import { clan } from 'urbit-ob';
3− import { getPoint, getSpawnedPoints } from 'lib/api';
4− import { generateParentChain, processPointInfo } from 'lib/ship';
5 import TooltipAndDocLink from '@/common/TooltipAndDocLink.svelte';
3 import TooltipAndDocLink from '@/common/TooltipAndDocLink.svelte';
6 import EthAddressLink from '@/common/EthAddressLink.svelte';
4 import EthAddressLink from '@/common/EthAddressLink.svelte';
7 import ShipChain from './ShipChain.svelte';
5 import ShipChain from './ShipChain.svelte';
@@ -14,7 +12,7 @@
14 $: azPoint = ['galaxy', 'star', 'planet'].includes(shipClass);
12 $: azPoint = ['galaxy', 'star', 'planet'].includes(shipClass);
15</script>
13</script>
16
14
17−{#if azPoint}
15+{#if azPoint && pointInfo.life !== undefined}
18 {#if shipClass !== 'galaxy'}
16 {#if shipClass !== 'galaxy'}
19 <p>
17 <p>
20 {#if pointInfo.sponsorChain && pointInfo.sponsorChain.length > 0}
18 {#if pointInfo.sponsorChain && pointInfo.sponsorChain.length > 0}
ui/src/components/ship_view/ShipView.svelte+6−18
@@ -69,12 +69,7 @@
69 <h3 class="text-lg text-center text-gray-700">{patp}</h3>
69 <h3 class="text-lg text-center text-gray-700">{patp}</h3>
70 {/if}
70 {/if}
71 <h4 class="text-center text-gray-700 break-words">
71 <h4 class="text-center text-gray-700 break-words">
72− <!-- <TooltipAndDocLink
73− text="The integer representation of this ID"
74− doc="patpee" class="inline"
75− > -->
76 {patp2dec(patp)}
72 {patp2dec(patp)}
77− <!-- </TooltipAndDocLink> -->
78 </h4>
73 </h4>
79 <div class="flex flex-wrap justify-center gap-1.5 my-1.5">
74 <div class="flex flex-wrap justify-center gap-1.5 my-1.5">
80 <GoldBadge title={"it's a " + shipClass} doc={shipClass}>{shipClass}</GoldBadge>
75 <GoldBadge title={"it's a " + shipClass} doc={shipClass}>{shipClass}</GoldBadge>
@@ -108,22 +103,16 @@
108 </p>
103 </p>
109 {/if}
104 {/if}
110 {#if azPoint}
105 {#if azPoint}
106+ {#await rawPointInfoPromise}
107+ <LoadingSpinner spinnerClass="text-black" />
108+ {:then}
111 <CollapsibleContent>
109 <CollapsibleContent>
112 <b slot="title">Azimuth Details</b>
110 <b slot="title">Azimuth Details</b>
113 <div slot="content">
111 <div slot="content">
114− {#await rawPointInfoPromise}
115− <LoadingSpinner spinnerClass="text-black" />
116− {:then}
117 <AzimuthDetails {patp} {pointInfo}></AzimuthDetails>
112 <AzimuthDetails {patp} {pointInfo}></AzimuthDetails>
118−
113+ </div>
119− <!-- {#if value && value.point}
114+ </CollapsibleContent>
120− <pre class="text-sm overflow-scroll">
115+ {/await}
121− Raw Info:{JSON.stringify(rawPointInfo, null, 2)}
122− </pre>
123− {/if} -->
124− {/await}
125− </div>
126− </CollapsibleContent>
127 {/if}
116 {/if}
128 </div>
117 </div>
129 </div>
118 </div>
@@ -132,7 +121,6 @@
132 <ProfileShipViewExtension {patp} />
121 <ProfileShipViewExtension {patp} />
133 <PalsShipViewExtension {patp} />
122 <PalsShipViewExtension {patp} />
134 <AppsShipViewExtension {patp} />
123 <AppsShipViewExtension {patp} />
135− <!-- <GroupsShipViewExtension {patp} /> -->
136 </div>
124 </div>
137 {#if azPoint}
125 {#if azPoint}
138 <div class="mt-5 border-t">
126 <div class="mt-5 border-t">
ui/src/lib/sigil.ts+4
@@ -11,6 +11,10 @@ export function sigilScalingFunction(size: number): number {
11 return 3.5 * Math.sqrt(51 / size);
11 return 3.5 * Math.sqrt(51 / size);
12}
12}
13
13
14+export function crowdedSigilScalingFunction(size: number): number {
15+ return 2.8 * Math.sqrt(51 / size);
16+}
17+
14export class SigilQuery {
18export class SigilQuery {
15 clan: Clan;
19 clan: Clan;
16 symbols: SymbolQuery[];
20 symbols: SymbolQuery[];
ui/src/routes/Home.svelte+11
@@ -35,27 +35,35 @@
35 urlSearchMode = getUrlSearchMode(searchParams);
35 urlSearchMode = getUrlSearchMode(searchParams);
36 urlChangedSinceShipQuery = true;
36 urlChangedSinceShipQuery = true;
37 navigating = false;
37 navigating = false;
38+ // console.log('url changed');
38 }
39 }
39 }
40 }
40 $: {
41 $: {
41 urlChangedSinceShipQuery = (search || true) && searchMode && false;
42 urlChangedSinceShipQuery = (search || true) && searchMode && false;
43+ // console.log('search changed');
42 }
44 }
43 function autoNav() {
45 function autoNav() {
46+ // console.log('autonav');
44 if ((search !== urlSearch || searchMode !== urlSearchMode)) {
47 if ((search !== urlSearch || searchMode !== urlSearchMode)) {
45 if (urlChangedSinceShipQuery) {
48 if (urlChangedSinceShipQuery) {
46 search = urlSearch;
49 search = urlSearch;
47 searchMode = urlSearchMode;
50 searchMode = urlSearchMode;
51+ // console.log('url wins');
48 } else {
52 } else {
49 navigating = true;
53 navigating = true;
54+ // console.log('search wins');
50 // create a temp one because the real one doesn't always update in time!
55 // create a temp one because the real one doesn't always update in time!
51 let tempAnalysis = new SearchAnalysis(search);
56 let tempAnalysis = new SearchAnalysis(search);
52 if (params.mode === 'chart') {
57 if (params.mode === 'chart') {
58+ // console.log('to chart');
53 navToChart(tempAnalysis.patpIsValid);
59 navToChart(tempAnalysis.patpIsValid);
54 } else {
60 } else {
55 if (tempAnalysis.patpIsValid) {
61 if (tempAnalysis.patpIsValid) {
62+ // console.log('to ship view');
56 navToShipView(tempAnalysis.patp, true);
63 navToShipView(tempAnalysis.patp, true);
57 } else {
64 } else {
58 const fromShipMode = params.mode === 'ship';
65 const fromShipMode = params.mode === 'ship';
66+ // console.log('to search');
59 navToSearch(fromShipMode);
67 navToSearch(fromShipMode);
60 }
68 }
61 }
69 }
@@ -156,6 +164,9 @@
156 allowSigilSearch={params.mode !== 'chart'}
164 allowSigilSearch={params.mode !== 'chart'}
157 />
165 />
158 <!-- <div class="bg-white">
166 <!-- <div class="bg-white">
167+ <p>
168+ Mode: {params.mode}
169+ </p>
159 <p>
170 <p>
160 Search: {search}
171 Search: {search}
161 </p>
172 </p>
ui/src/styles/tailwind-output.css+18−5
@@ -1032,6 +1032,10 @@ Ensure the default browser behavior of the `hidden` attribute.
1032 --tw-translate-y: -25%;
1032 --tw-translate-y: -25%;
1033 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));
1033 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));
1034}
1034}
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+}
1035.rotate-45 {
1039.rotate-45 {
1036 --tw-rotate: 45deg;
1040 --tw-rotate: 45deg;
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));
1041 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));
@@ -1780,6 +1784,12 @@ Ensure the default browser behavior of the `hidden` attribute.
1780.leading-3 {
1784.leading-3 {
1781 line-height: .75rem;
1785 line-height: .75rem;
1782}
1786}
1787+.leading-5 {
1788+ line-height: 1.25rem;
1789+}
1790+.leading-8 {
1791+ line-height: 2rem;
1792+}
1783.text-gray-600 {
1793.text-gray-600 {
1784 --tw-text-opacity: 1;
1794 --tw-text-opacity: 1;
1785 color: rgb(75 85 99 / var(--tw-text-opacity));
1795 color: rgb(75 85 99 / var(--tw-text-opacity));
@@ -1886,6 +1896,13 @@ Ensure the default browser behavior of the `hidden` attribute.
1886.filter {
1896.filter {
1887 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);
1897 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);
1888}
1898}
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+}
1889.transition-opacity {
1906.transition-opacity {
1890 transition-property: opacity;
1907 transition-property: opacity;
1891 transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
1908 transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
@@ -1901,11 +1918,7 @@ Ensure the default browser behavior of the `hidden` attribute.
1901 transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
1918 transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
1902 transition-duration: 150ms;
1919 transition-duration: 150ms;
1903}
1920}
1904−.transition {
1921+.duration-150 {
1905− transition-property: color, background-color, border-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-text-decoration-color, -webkit-backdrop-filter;
1906− transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter;
1907− 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;
1908− transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
1909 transition-duration: 150ms;
1922 transition-duration: 150ms;
1910}
1923}
1911.hover\:bg-gray-200:hover {
1924.hover\:bg-gray-200:hover {
ui/vite.config.ts+1−1
@@ -7,7 +7,7 @@ import path from 'path';
7export default ({ mode }) => {
7export default ({ mode }) => {
8 Object.assign(process.env, loadEnv(mode, process.cwd()));
8 Object.assign(process.env, loadEnv(mode, process.cwd()));
9 const SHIP_URL = process.env.SHIP_URL || process.env.VITE_SHIP_URL || 'http://localhost:8080';
9 const SHIP_URL = process.env.SHIP_URL || process.env.VITE_SHIP_URL || 'http://localhost:8080';
10− console.log(SHIP_URL);
10+ console.log('SHIP_URL', SHIP_URL);
11
11
12 return defineConfig({
12 return defineConfig({
13 plugins: [
13 plugins: [