::    Terminal
::
::::  /hook/core/terminal/app
  ::
/?    314                                               ::  need urbit 314
/-    term-line, term-in, term-ctrl, kyev
/=    stat  /:/%%/:/hymn/
::
::::  structures
  ::
|%                                                      ::
++  axle  $:  %1                                        ::
              hiz=(map path term-line)                  ::
          ==                                            ::
++  gilt                                                ::
  $%  [%term-line p=term-line]                          ::
      [%hymn p=manx]                                    ::
      [%json p=json]                                    ::
  ==                                                    ::
++  gift                                                ::
  $%  [%rush gilt]                                      ::
      [%rust gilt]                                      ::
      [%mean p=ares]                                    ::
      [%nice ~]                                         ::
      [%sage p=path q=*]                                ::
      [%veer p=@ta q=path r=@t]                         ::
      [%vega p=path]                                    ::
  ==                                                    ::
++  hapt  ,[p=ship q=path]                              ::
++  move  ,[p=bone q=(mold note gift)]                  ::
++  note                                                ::
  $%  $:  %g                                            ::
  $%  [%cide p=span]                                    ::
      [%show p=hapt q=ship r=path]                      ::
      [%sire p=term q=span]                             ::
      [%mess p=hapt q=ship r=[?(%txt %kyev) vase]]      ::
  ==  ==  ==                                            ::
++  sign                                                ::
  $%  $:  %g                                            ::
  $%  [%gone p=hapt]                                    ::
      [%mean p=ares]                                    ::
      [%nice ~]                                         ::
      [%rust p=%term-line q=term-line]                  ::
      [%rush p=%term-line q=term-line]                  ::
      [%sage p=path q=*]                                ::
      [%veer p=@ta q=path r=@t]                         ::
      [%vega p=path]                                    ::
  ==  ==  ==
--
::
::::  helpers
  ::
|%
++  encode
  |=  [a=term b=path]  ^-  span
  (rap 3 a (turn b |=(c=span (cat 3 '_' c))))
::
++  decode  |=(a=span `[p=term q=path]`(rash a (most cab sym)))
++  inject
  |=  [a=[i=mane t=(list mane)] b=marl]
  |=  man=manx
  ?.  =(i.a n.g.man)
    man
  ?~  t.a
    man(c (weld c.man b))
  man(c (turn c.man ^$(a t.a)))
--
!:
::::  program
  ::
|_  [hid=hide axle]
++  get-shell
  |=  [ost=bone you=ship pax=path]
  ^-  [mof=(list move) tel=term-line hit=(map path term-line)]
  =+  tel=(fall (~(get by hiz) pax) *term-line)
  =+  aut=%shell
  =+  auc=(encode aut pax)
  ?:  (~(has by cub.hid) auc)
    [~ tel hiz]
  =.  tel  tel(r :_(r.tel leaf/"+ {(trip aut)}"))
  :_  [tel (~(put by hiz) pax tel)]
  :_  [ost %pass [%hi auc mar/[pax]] %g %sire [aut auc]]~
  :^  ost  %pass  [%hi auc in/[pax]]
  :+  %g  %show
  [[our.hid [auc imp.hid]] you /out]
::
++  page
  |=  pax=path
  %.  stat
  %+  inject
    ~[%html %head]
  ;=  ;script: urb.appl = "{(trip app.hid)}"
      ;script: urb.term = \{pax: "{(spud pax)}"}
  ==
::
++  peer
  |=  [ost=bone you=ship pax=path]
  ^-  [(list move) _+>]
  ?~  pax
    $(pax /term)
  =+  ^-  [mof=(list move) tel=term-line hit=(map path term-line)]
      (get-shell ost you t.pax)
  =.  hiz  hit
  :_  +>.$  :_  mof
  ?+  -.pax  !!
      %lines  (jell-json ost tel)
      %term   [ost %give %rust %hymn (page t.pax)]
      %tines  (jell-term ost tel)
  ==
::
++  poke-term-in
  |=  [ost=bone you=ship term-in]
  ^-  [(list move) _+>]
  ::~&  tem-poke/jon
  |-
  =+  tel=(fall (~(get by hiz) pax) *term-line)
  ?-    -.jof
      %res
    =+  joc=(encode p.jof pax)
    =^  mof  r.tel
      ?.  (~(has by cub.hid) joc)
        [~ r.tel]
      :_  :_(r.tel leaf/"- {(trip p.jof)}")
      [ost %pass [%hi joc mar/pax] %g %cide joc]~
    ::~&  poke-sire/[jof cub.hid]
    =.  r.tel  :_(r.tel leaf/"+ {(trip joc)}")
    =.  hiz  (~(put by hiz) pax tel)
    :_  +>.^$
    %+  welp  mof
    :^    [ost %give %nice ~]
        :^  ost  %pass  [%hi joc in/[pax]]
        :^  %g  %show  [our.hid joc imp.hid]
        :-  you  /out
      [ost %pass [%hi joc mar/pax] %g %sire [p.jof joc]]
    (spam pax tel)
  ::
      %line
    =.  r.tel  :_(r.tel rose/["> " ~ ~]^~[leaf/(trip p.tel) leaf/(trip p.jof)])
    =.  hiz  (~(put by hiz) pax tel)
    ?:  =('\\' (end 3 1 p.jof))
      $(jof [%cmd (rsh 3 1 p.jof)])
    :_  +>.^$
    (send ost you pax %txt !>(p.jof))
      %cmd
    ?+  p.jof  :_(+>.^$ (send ost you pax %kyev !>(`kyev`[[%ctrl ~ ~] p.jof])))
      %r  $(jof [%res 'shell'])
    ==
  ==
::
++  poke-json
  |=  [ost=bone you=ship jon=json]
  ^-  [(list move) _+>]
  ::=+  ^-  [pax=path jof=$%([%line p=span] [%res p=span] [%cmd p=char])]
  %^  poke-term-in  ost  you
  ^-  [pax=path jof=$%([%line p=span] [%res p=span] [%cmd p=char])]
  %-  need
  %.  jon  =>  jo
  %^  ot
    pax/(su ;~(pfix fas (more fas sym)))
    act/(of line/so res/so cmd/so ~)
  ~
::
++  poke-term-ctrl
  |=  [ost=bone you=ship col=term-ctrl]
  ^-  [(list move) _+>]
  :_  +>.$  :_  ~
  [ost %give %rush %term-line [p q ~]:(fall (~(get by hiz) /) *term-line)]
::
++  send
  |=  [ost=bone you=ship pax=path mez=[?(%txt %kyev) vase]]
  %+  murn  (~(tap by cub.hid))
  |=  [p=span q=term]
  ?.  =(pax q:(decode p))  ~
  %-  some  ^-  move
  :^  ost  %pass  [-.mez p (scot %da lat.hid) pax]
  [%g %mess [our.hid p imp.hid] you mez]
::
++  jell-json
  |=  [a=bone b=term-line]
  [a %give %rush %json (tel-to-jon b)]
::
++  jell-term
  |=  [a=bone b=term-line]
  [a %give %rush %term-line b]
::
++  spam
  |=  [pax=path tel=term-line]
  ::~&  tem-spam/(~(run by hiz) |=(term-line p))
  %+  murn
    (~(tap by sup.hid))
  |=  [ost=bone @ paf=path]
  ?:  =([%lines pax] paf)
    (some (jell-json ost tel))
  ?:  =([%tines pax] paf)
    (some (jell-term ost tel))
  ~
::
++  pour
  |=  [ost=bone pax=path sih=*]
  ^-  [(list move) _+>]
  =+  sih=((hard sign) sih)
  ?:  ?=(?(%sage %veer %vega) &2.sih)                   ::  vomit
    [[ost %give +.sih]~ +>.$]
  ?:  ?=(%gone &2.sih)
    `+>.$
  =*  paf  |3.pax
  ?:  ?=([%hi @ %in *] pax)
    ?+    &2.sih  !!
        %nice  `+>.$
        ?(%rust %rush)
      =+  tol=(fall (~(get by hiz) paf) *term-line)
      =.  tol  ?^  q.q.sih                              ::  XX prompt hack
                 [p.tol (weld q.q.sih q.tol) (weld r.q.sih r.tol)]
               [p.q.sih (weld q.q.sih q.tol) (weld r.q.sih r.tol)]
      =.  hiz  (~(put by hiz) paf tol)
      [(spam paf q.sih) +>.$]
    ==
  =+  tel=(fall (~(get by hiz) paf) *term-line)
  =+  old=tel
  =.  r.tel
    ?.  ?=(%mean &2.sih)  r.tel
    %-  welp  :_  r.tel
    =-  (turn - |=(a=tank rose/[~ "! " ~]^[a]~))
    ^-  (list tank)
    ?~  p.sih  ~
    (welp q.u.p.sih leaf/(trip p.u.p.sih) ~)
  =.  hiz  (~(put by hiz) paf tel)
  :_  +>.$
  :-  [ost %give +.sih]
  ?:  =(old tel)  ~
  ~&  [%term-wuh-spamming r.tel]
  (spam paf tel)
::
++  tel-to-jon  
  |=  tel=term-line
  %-  jobe
  :~  [%prompt %s p.tel]
      [%history %a (turn q.tel |=(a=cord [%s a]))]
      :+  %lines  %a
      %-  zing  ^-  (list (list json))
      %+  turn  (flop r.tel)  |=  a=tank
      ?.  ?=([%rose [[%'>' %' ' ~] ~ ~] [%leaf *] [%leaf *] ~] a)
        (turn (wash 0^80 a) jape)
      [(jobe prompt/(jape p.i.q.a) task/(jape p.i.t.q.a) ~)]~
  ==
--