!:
::  dill (4d), terminal handling
::
|=  pit=vase
=>  |%                                                  ::  interface tiles
++  gift                                                ::  out result <-$
          $%  [%bbye ~]                                 ::  reset prompt
              [%blit p=(list blit)]                     ::  terminal output
              [%init p=@p]                              ::  report install
              [%logo @]                                 ::  logout
              [%veer p=@ta q=path r=@t]                 ::  install vane
              [%vega p=path]                            ::  reboot by path
              [%verb ~]                                 ::
          ==                                            ::
++  kiss                                                ::  in request ->$
          $%  [%belt p=belt]                            ::  terminal input
              [%blew p=blew]                            ::  terminal config
              [%boot p=*]                               ::  weird %dill boot
              [%crud p=@tas q=(list tank)]              ::  error with trace
              [%flog p=flog]                            ::  wrapped error
              [%hail ~]                                 ::  terminal refresh
              [%hook ~]                                 ::  this term hung up
              [%harm ~]                                 ::  all terms hung up
              [%init p=ship]                            ::  after gall ready
              [%noop ~]                                 ::  no operation
              [%talk p=tank]                            ::
              [%text p=tape]                            ::
          ==                                            ::
++  flog                                                ::  sent to %dill
          $%  [%crud p=@tas q=(list tank)]              ::
              [%text p=tape]                            ::
          ==                                            ::
++  mess                                                ::  message to terminal
          $%  [%term-ctrl p=(hypo ,%hail)]              ::
              [%term-in p=(hypo term-in)]               ::
          ==                                            ::
++  move  ,[p=duct q=(mold note gift)]                  ::  local move
++  note                                                ::  out request $->
          $%  $:  %a                                    ::
          $%  [%make p=(unit ,@t) q=@ud r=@ s=?]        ::
              [%sith p=@p q=@uw r=?]                    ::
          ==  ==                                        ::
              $:  %c                                    ::
          $%  [%warp p=sock q=riff]                     ::
          ==  ==                                        ::
              $:  %d                                    ::
          $%  [%crud p=@tas q=(list tank)]              ::
              [%text p=tape]                            ::
          ==  ==                                        ::
              $:  %g                                    ::
          $%  [%mess p=[p=ship q=path] q=ship r=mess]   ::
              [%nuke p=[p=ship q=path] q=ship]          ::
              [%show p=[p=ship q=path] q=ship r=path]   ::
              [%took p=[p=ship q=path] q=ship]          ::
          ==  ==                                        ::
              $:  %t                                    ::
          $%  [%wait p=@da]                             ::
          ==  ==  ==                                    ::
++  riff  ,[p=desk q=(unit rave)]                       ::  see %clay
++  sign                                                ::  in result $<-
          $?
              $:  %c                                    ::
          $%  [%writ p=riot]                            ::
          ==  ==                                        ::
              $:  %g                                    ::
          $%  [%logo p=@]                               ::
              [%mean p=ares]                            ::
              [%nice ~]                                 ::
              $:  %rush                                 ::
              $%  [%term-line q=term-line]              ::
                  [%hymn q=manx]                        ::
              ==  ==                                    ::
              [%verb ~]                                 ::
              [%sage p=path q=*]                        ::
              [%veer p=@ta q=path r=@t]                 ::
              [%vega p=path]                            ::
          ==  ==                                        ::
              $:  %t                                    ::
          $%  [%wake ~]                                 ::
          ==  ==
              $:  @tas                                  ::  by any
          $%  [%crud p=@tas q=(list tank)]              ::
              [%init p=@p]                              ::
              [%note p=@tD q=tank]                      ::
          ==  ==  ==                                    ::
++  term-in                                             ::
          $:  pax=path                                  ::
          $=  jof                                       ::
          $%  [%line p=cord]                            ::
              [%res p=span]                             ::
              [%cmd p=char]                             ::
              [%type p=?]                               ::
          ==  ==                                        ::
++  term-line  ,[p=[p=cord q=prom r=cord] q=(list cord) r=(list tark)]
++  tark  ?(tank [%stem p=@da q=tank r=tank])           ::
::::::::                                                ::  dill tiles
++  bein                                                ::  terminal control
          $:  $:  bul=@ud                               ::  buffer length
                  bus=@ud                               ::  cursor in buffer
                  but=(list ,@c)                        ::  buffer text
                  buy=prom                              ::  input style
              ==                                        ::
              $:  hiz=@ud                               ::  history depth
                  hux=path                              ::  history path
                  hym=(map ,@ud (list ,@c))             ::  history overlay
                  hyt=hist                              ::  history object
                  hyr=(unit (list ,@c))                 ::  history search
              ==                                        ::
              $:  pol=@ud                               ::  length of prompt
                  pot=tape                              ::  prompt text
              ==                                        ::
          ==                                            ::
++  blew  ,[p=@ud q=@ud]                                ::  columns rows
++  belt                                                ::  raw console input
          $%  [%aro p=?(%d %l %r %u)]                   ::  arrow key
              [%bac ~]                                  ::  true backspace
              [%ctl p=@ud]                              ::  control-key
              [%del ~]                                  ::  true delete
              [%met p=@ud]                              ::  meta-key
              [%ret ~]                                  ::  return
              [%txt p=(list ,@c)]                       ::  utf32 text
          ==                                            ::
++  blit                                                ::  raw console output
          $%  [%bel ~]                                  ::  make a noise
              [%clr ~]                                  ::  clear the screen
              [%hop p=@ud]                              ::  set cursor position
              [%lin p=(list ,@c)]                       ::  set current line
              [%mor ~]                                  ::  newline
              [%sag p=path q=*]                         ::  save to jamfile
              [%sav p=path q=@]                         ::  save to file
          ==                                            ::
++  blot                                                ::  kill ring
          $:  p=@ud                                     ::  length
              q=@ud                                     ::  depth
              r=(list (list ,@c))                       ::  kills
          ==                                            ::
++  blur  ,[p=@ud q=(unit bein) r=blot]                 ::  columns, prompt
++  kyev                                                ::
          $:  p=(set ?(%ctrl %shift %alt %meta))        ::
              q=$|(cord [%act speck])                   ::
          ==                                            ::
++  speck                                               ::
          $?  %ctrl  %shift  %alt   %meta  %entr  %esc  ::
              %caps  %uncap  %pgup  %pgdn  %home  %end  ::
              %baxp  %del    %ins   %up    %down  %left ::
              %right                                    ::
          ==                                            ::
++  yard                                                ::  terminal state
          $:  p=?                                       ::  verbose
              q=blur                                    ::  display state
              r=(map path hist)                         ::  history
              s=[p=? q=@da]                             ::  typing?/last typed
          ==                                            ::
                                                        ::  XX LEGACY 12-16-2014
++  yord                                                ::  old terminal state
          $:  p=?                                       ::  verbose
              q=blur                                    ::  display state
              r=(map path hist)                         ::  history
          ==                                            ::
--  =>
|%
++  dy
  |=  [hen=duct our=ship now=@da def=(unit duct) dug=(map duct yard)]
  =+  ^=  yar  ^-  yard
    =+  yur=(~(get by dug) hen)
    ?^  yur  u.yur
    ?^  def  (~(got by dug) u.def)
    [& [80 ~ *blot] ~ | *@da]
  =|  mos=(list move)
  |%
  ++  beep  (curb [[%bel ~] ~])                         ::  send beep
  ++  curb                                              ::  send blits
    |=  wab=(list blit)
    ^+  +>
    ?~  wab  +>
    +>(mos [[hen [%give %blit (flop wab)]] mos])
  ::
  ++  wod                                               ::  word forward
    |=  bed=bein
    ^-  @ud
    ?:  =(bul.bed bus.bed)
      bus.bed
    ?:  =(' ' (snag bus.bed but.bed))
      $(bus.bed +(bus.bed))
    |-
    ^-  @ud
    ?:  =(bul.bed bus.bed)
      bus.bed
    ?:  =(' ' (snag bus.bed but.bed))
      bus.bed
    $(bus.bed +(bus.bed))
  ::
  ++  wob                                               ::  word backward
    |=  bed=bein
    ^-  @ud
    ?:  =(0 bus.bed)
      bus.bed
    ?:  =(' ' (snag (dec bus.bed) but.bed))
      $(bus.bed (dec bus.bed))
    |-
    ^-  @ud
    ?:  =(0 bus.bed)
      bus.bed
    ?:  =(' ' (snag (dec bus.bed) but.bed))
      bus.bed
    $(bus.bed (dec bus.bed))
  ::
  ++  edit                                              ::  change the bed
    |=  bed=bein
    ^+  +>
    =.  q.q.yar  [~ bed]
    ?>  ?=(^ q.q.yar)
    %-  curb
    |-  ^-  (list blit)
    ?^  hyr.u.q.q.yar
      =+  ris=:(weld "(reverse-i-search)'" (tufa u.hyr.u.q.q.yar) "': ")
      %=  $
        pot.bed        ris
        pol.bed        (lent ris)
        hyr.u.q.q.yar  ~
      ==
    :~  [%hop (add pol.bed bus.bed)]
        :-  %lin
        %+  weld  pot.bed
        ?-  buy.bed
          %none  but.bed
          %text  but.bed
          %pass  `(list ,@)`(runt [(lent but.bed) '*'] ~)
        ==
    ==
  ::
  ++  fume                                              ::  print tank, prefix
    |=  [pef=@tD tac=tank]
    ^+  +>
    =+  wol=(~(win re tac) 2 p.q.yar)
    %-  furl
    %+  turn  wol
    |=  a=tape  ^-  tape
    ?>  ?=([@ @ *] a)
    [pef ' ' t.t.a]
  ::
  ++  furl                                              ::  print wall
    |=  wol=(list tape)
    ^+  +>
    =.  +>
      %-  curb
      %-  flop
      |-  ^-  (list blit)
      ?~  wol  ~
      [[%lin (tuba i.wol)] [%mor ~] $(wol t.wol)]
    ?~  q.q.yar  +>
    (edit(q.q.yar ~) u.q.q.yar)
  ::
  ++  gore                                              ::  move in history
    |=  hup=@ud
    ^+  +>
    =+  but=(goth hup)
    =+  bul=(lent but)
    %-  edit
    ?>  ?=(^ q.q.yar)
    %=  u.q.q.yar
      hiz  hup
      hym  %+  ~(put by hym.u.q.q.yar)
             hiz.u.q.q.yar
           but.u.q.q.yar
      bus  bul
      bul  bul
      but  but
    ==
  ::
  ++  goth                                              ::  extract history
    |=  hup=@ud
    ?>  ?=(^ q.q.yar)
    =+  byt=(~(get by hym.u.q.q.yar) hup)
    ?^  byt  u.byt
    (tuba (rip 3 (snag hup q.hyt.u.q.q.yar)))
  ::
  ++  kill                                              ::  add to kill ring
    |=  txt=(list ,@c)
    ^+  +>
    =>  ?.  =(16 p.r.q.yar)  .
        .(p.r.q.yar 15, r.r.q.yar (scag 15 r.r.q.yar))
    %=  +>
      p.r.q.yar  +(p.r.q.yar)
      q.r.q.yar  0
      r.r.q.yar  [txt r.r.q.yar]
    ==
  ::
  ++  look                                              :: search in history
    |=  [hup=@ud txt=(list ,@c)]
    ^+  +>
    =+  ^=  beg
        |=  [a=(list ,@c) b=(list ,@c)]  ^-  ?
        ?~(a & ?~(b | &(=(i.a i.b) $(a t.a, b t.b))))
    =+  ^=  mid
        |=  [a=(list ,@c) b=(list ,@c)]  ^-  ?
        ?~(a & ?~(b | |((beg a b) $(b t.b))))
    ?>  ?=(^ q.q.yar)
    ?:  =(hup p.hyt.u.q.q.yar)
      beep
    =+  but=(goth hup)
    ?:  (mid txt but)
      (gore(hyr.u.q.q.yar [~ txt]) hup)
    $(hup +(hup))
  ::
  ++  leap                                              ::  accept response
    |=  [tea=wire sih=sign]  
    ^+  +>
    ?-    -.+.sih
        %crud                                           ::  error trace
      =.  q.+.sih  [[%leaf (trip p.+.sih)] q.+.sih]
      |-  ^+  +>.^$
      ?~  q.+.sih  +>.^$
      (fume:$(q.+.sih t.q.+.sih) '!' `tank`i.q.+.sih)
    ::
        %mean  ~&  %dill-mean  +>.$
        %nice  +>.$
        %note  ?.(p.yar +>.$ (fume p.+.sih q.+.sih))    ::  debug message
        ?(%rush %rust)                                  ::  XX  reset prompt
      =.  mos  :_(mos [hen %pass tea %g %took [our /terminal] our])
      ?>  ?=(%term-line +>-.sih)
      =.  +>.$
        =+  lis=(scag 1.000 r.q.sih)
        =-  (furl (zing (turn (flop lis) -)))
        |=  a=tark
        ^-  wall
        ?+    -.a  (~(win re a) 0 p.q.yar) 
            %stem
          ?:  =(q.s.yar p.a)  ~
          ~[(welp ~(ram re q.a) ~(ram re r.a))]
        ==
      ?.  (levy r.q.sih |=(a=tark ?=(%stem -.a)))
        +>.$                          ::  XX separate prompt/history messages
      %-  edit
      =|  bed=bein
      =+  ^=  hyt  ^-  hist
          =+  hyt=(~(get by r.yar) /)
          ?~(hyt *hist u.hyt)
      ?:  &(?=(^ q.q.yar) =(/ hux.u.q.q.yar))
        =+  bun=(rip 5 (turf r.p.q.sih))
        %=  u.q.q.yar
          bul  ?~  r.p.q.sih  bul.u.q.q.yar  (lent bun)
          bus  ?~  r.p.q.sih  bus.u.q.q.yar  (lent bun)
          but  ?~  r.p.q.sih  but.u.q.q.yar  bun
          hyt  [+(p.hyt) [%$ q.hyt]]
          pot  (trip p.p.q.sih)
          pol  (met 3 p.p.q.sih)
          buy  q.p.q.sih
        ==
      %_    bed
          bul  (met 3 r.p.q.sih)
          bus  (met 3 r.p.q.sih)
          but  (rip 3 r.p.q.sih)
          buy  q.p.q.sih
          hux  /
          hiz  0
          hyt  [+(p.hyt) [%$ q.hyt]]
          pot  (trip p.p.q.sih)
          pol  (met 3 p.p.q.sih)
      ==
    ::
        %sage                                           ::  write a jamfile
      %=  +>.$
        mos  :_(mos [hen [%give %blit [%sag p.+.sih q.+.sih] ~]])
      ==
        ?(%init %logo %veer %vega %verb)                ::  drop-throughs
      +>(mos :_(mos [hen %give +.sih]))
        %writ                                           ::  file exists
      %_    +>.$
          mos
        :_  mos
        [hen %pass /term-show %g %show [our /terminal] our /lines]
      ==
    ::
        %wake
      ?:  (lte (sub now ~s15) q.s.yar)
        %_    +>.$
            mos
          :_  mos
          [hen %pass /activity %t %wait (add q.s.yar ~s15)]
        ==
      %_  +>.$
        p.s.yar  |
        mos      :_(mos (poke %term-in -:!>(*term-in) / %type %|))
      ==
    ==
  ::
  ++  lear                                              ::  handle request
    |=  kyz=kiss
    ^+  +>
    ?-    -.kyz
        %flog  !!
        %noop  +>
        %belt                                           ::  terminal input
      =.  +>.$
        ?.  ?=(?(%bac %del %ret %txt) -.p.kyz)  +>.$
        ?:  p.s.yar  +>.$(s.yar [& now])
        %_    +>.$
            s.yar  [& now]
            mos
          :_  :_  mos
            [hen %pass /activity %t %wait (add ?:(p.s.yar q.s.yar now) ~s15)]
          (poke %term-in -:!>(*term-in) / %type %&)
        ==
      ?~  q.q.yar
        %^    furl
            "Downloading files from ticketing ship, please wait until"
          "a prompt shows up.  This could take several minutes."
        ~
      ?^  hyr.u.q.q.yar                                 ::  live search
        ?+    p.kyz  $(hiz.u.q.q.yar 0, hyr.u.q.q.yar ~)
            [%bac *]
          ?:  =(~ u.hyr.u.q.q.yar)
            (curb [[%bel ~] ~])
          %-  edit
          %=  u.q.q.yar
            hyr  [~ (scag (dec (lent u.hyr.u.q.q.yar)) u.hyr.u.q.q.yar)]
          ==
        ::
            [%txt *]   (look hiz.u.q.q.yar (weld u.hyr.u.q.q.yar p.p.kyz))
            [%ctl %g]  (edit u.q.q.yar(bul 0, bus 0, but ~, hiz 0, hyr ~))
            [%ctl %r]
          ?:  =(p.hyt.u.q.q.yar hiz.u.q.q.yar)
            beep
          (look +(hiz.u.q.q.yar) u.hyr.u.q.q.yar)
        ==
      ?-    -.p.kyz
          %aro                                          ::  arrow
        ?-    p.p.kyz
            %d                                          ::  down
          ?:  =(0 hiz.u.q.q.yar)
            beep
          (gore (dec hiz.u.q.q.yar))
        ::
            %l                                          ::  left
          ?:  =(0 bus.u.q.q.yar)
            beep
          (edit u.q.q.yar(bus (dec bus.u.q.q.yar)))
        ::
            %r                                          ::  right
          ?:  =(bul.u.q.q.yar bus.u.q.q.yar)
            beep
          (edit u.q.q.yar(bus +(bus.u.q.q.yar)))
        ::
            %u
          =+  hup=+(hiz.u.q.q.yar)
          ?:  =(hup p.hyt.u.q.q.yar)
            beep
          (gore hup)
        ==
      ::
          %bac                                          ::  backspace
        ^+  +>.$
        ?:  =(0 bus.u.q.q.yar)
          (curb `(list blit)`[[%bel ~] ~])
        %-  edit
        %=    u.q.q.yar
            bus  (dec bus.u.q.q.yar)
            bul  (dec bul.u.q.q.yar)
            but
          %+  weld
            (scag (dec bus.u.q.q.yar) but.u.q.q.yar)
          (slag bus.u.q.q.yar but.u.q.q.yar)
        ==
      ::
          %ctl                                          ::  control
        ?+  p.p.kyz
          beep
          %a  (edit u.q.q.yar(bus 0))
          %b  $(kyz [%belt %aro %l])
          %d  ?:  ?&  =(0 bul.u.q.q.yar)
                      =(0 bus.u.q.q.yar)
                  ==
                +>.$(mos :_(mos (poke %term-in -:!>(*term-in) / %cmd %d)))
              $(kyz [%belt %del ~])
          %e  (edit u.q.q.yar(bus bul.u.q.q.yar))
          %f  $(kyz [%belt %aro %r])
          %g  +>.$(mos :_(mos (poke %term-in -:!>(*term-in) / %cmd %g)))
          %k  ?:  =(bul.u.q.q.yar bus.u.q.q.yar)
                beep
              =>  .(+>.$ (kill (slag bus.u.q.q.yar but.u.q.q.yar)))
              %-  edit
              ?>  ?=(^ q.q.yar)
              %=  u.q.q.yar
                bul  bus.u.q.q.yar
                but  (scag bus.u.q.q.yar but.u.q.q.yar)
              ==
          %t  ?:  (lth bul.u.q.q.yar 2)
                beep
              =+  ^=  pos
                  ?:  =(bul.u.q.q.yar bus.u.q.q.yar)
                    (sub bus.u.q.q.yar 2)
                  ?:  =(0 bus.u.q.q.yar)
                    bus.u.q.q.yar
                  (dec bus.u.q.q.yar)
              %-  edit
              %=  u.q.q.yar
                bus  (add 2 pos)
                but  %+  weld
                       %+  weld
                         (scag pos but.u.q.q.yar)
                       ^-  (list ,@c)  :+
                         (snag +(pos) but.u.q.q.yar)
                         (snag pos but.u.q.q.yar)
                         ~
                      (slag (add 2 pos) but.u.q.q.yar)
              ==
          %l  +>.$(mos :_(mos [hen %give %blit [[%clr ~] ~]]))
          %n  $(kyz [%belt %aro %d])
          %o  %_    +>.$
                  mos
                :_  :_  mos
                  [hen %pass /term-show %g %nuke [our /terminal] our]
                [hen %pass /term-show %g %show [our /terminal] our /lines]
              ==
          %p  $(kyz [%belt %aro %u])
          %u  ?:  =(0 bus.u.q.q.yar)
                beep
              =>  .(+>.$ (kill (scag bus.u.q.q.yar but.u.q.q.yar)))
              %-  edit
              ?>  ?=(^ q.q.yar)
              %=  u.q.q.yar
                bus  0
                bul  (sub bul.u.q.q.yar bus.u.q.q.yar)
                but  (slag bus.u.q.q.yar but.u.q.q.yar)
              ==
          %r  (edit u.q.q.yar(hyr [~ ~]))
          %w  ?:  =(0 bus.u.q.q.yar)
                beep
              =+  bow=(wob u.q.q.yar)
              =+  sow=(sub bus.u.q.q.yar bow)
              =>  .(+>.$ (kill (swag [bow sow] but.u.q.q.yar)))
              %-  edit
              ?>  ?=(^ q.q.yar)
              %=  u.q.q.yar
                bus  bow
                bul  (sub bul.u.q.q.yar sow)
                but  %+  welp
                       (scag bow but.u.q.q.yar)
                     (slag bus.u.q.q.yar but.u.q.q.yar)
              ==
          %x  +>.$(mos :_(mos (poke %term-in -:!>(*term-in) / %cmd %x)))
          %y  ?:  =(0 p.r.q.yar)
                beep
              $(kyz [%belt %txt (snag q.r.q.yar r.r.q.yar)])
        ==
      ::
          %del                                          ::  delete
        ?:  =(bul.u.q.q.yar bus.u.q.q.yar)
          beep
        %-  edit
        %=    u.q.q.yar
            bul  (dec bul.u.q.q.yar)
            but
          %+  weld
            (scag bus.u.q.q.yar but.u.q.q.yar)
          (slag +(bus.u.q.q.yar) but.u.q.q.yar)
        ==
      ::
          %met                                          ::  meta
        ?+    p.p.kyz
            beep
            %f
          ?:  =(bul.u.q.q.yar bus.u.q.q.yar)
            beep
          (edit u.q.q.yar(bus (wod u.q.q.yar)))
          ::
            %b
          ?:  =(0 bus.u.q.q.yar)
            beep
          (edit u.q.q.yar(bus (wob u.q.q.yar)))
          ::
            %y
          ?:  =(0 p.r.q.yar)
            beep
          =+  dol=(snag q.r.q.yar r.r.q.yar)
          =+  leo=(lent dol)
          ?.  (gte bus.u.q.q.yar leo)
            beep
          =+  pey=(sub bus.u.q.q.yar leo)
          ?.  =(dol (swag [pey leo] but.u.q.q.yar))
            beep
          =.  q.r.q.yar  ?:(=(p.r.q.yar +(q.r.q.yar)) 0 +(q.r.q.yar))
          =+  ney=(snag q.r.q.yar r.r.q.yar)
          =+  lye=(lent ney)
          %-  edit
          %=  u.q.q.yar
            bus  (sub (add bus.u.q.q.yar lye) leo)
            bul  (sub (add bul.u.q.q.yar lye) leo)
            but  %+  weld
                   (scag pey but.u.q.q.yar)
                 %+  weld
                   `(list ,@c)`ney                      ::  XX weird fuse-loop
                 (slag bus.u.q.q.yar but.u.q.q.yar)
          ==
        ==
      ::
          %ret                                          ::  return
        ?:  =(%none buy.u.q.q.yar)  beep
        =+  jab=(rap 3 (tufa but.u.q.q.yar))
        %=    +>.$
            q.q.yar  ~
            r.yar
          ?:  |(=(%$ jab) =(%pass buy.u.q.q.yar))
            r.yar
          %+  ~(put by r.yar)
            hux.u.q.q.yar
          [p.hyt.u.q.q.yar [jab ?~(q.hyt.u.q.q.yar ~ +.q.hyt.u.q.q.yar)]]
        ::
            mos
          :*  (poke %term-ctrl -:!>(%hail) %hail)
              [hen %give [%bbye ~]]
              (poke %term-in -:!>(*term-in) / %line jab)
              [hen %give [%blit [[%mor ~] ~]]]
              mos
          ==
        ==
      ::
          %txt                                          ::  text keys
        ?:  =(%none buy.u.q.q.yar)  beep
        =+  let=(lent p.p.kyz)
        %-  edit
        %=    u.q.q.yar
            bus  (add let bus.u.q.q.yar)
            bul  (add let bul.u.q.q.yar)
            but
          ;:  weld
            (scag bus.u.q.q.yar but.u.q.q.yar)
            p.p.kyz
            (slag bus.u.q.q.yar but.u.q.q.yar)
          ==
        ==
      ==
    ::
        %blew   +>.$(p.q.yar p.p.kyz)                   ::  window size
        %boot
      %=  +>.$
        mos
        :_(mos [hen %pass ~ (note %a p.kyz)])
      ==
    ::
        %crud                                           ::  error trace
      =.  q.kyz  [[%leaf (trip p.kyz)] q.kyz]
      |-  ^+  +>.^$
      ?~  q.kyz  +>.^$
      (fume:$(q.kyz t.q.kyz) '!' `tank`i.q.kyz)
    ::
        %hail                                           ::  refresh
      +>.$
      ::+>.$(mos :_(mos (poke %term-ctrl -:!>(%hail) %hail)))
    ::
        %harm                                           ::  all terms hung up
      =+  nug=((map duct yard) [[hen (~(get by dug) hen)] ~ ~])
      ^+  +>.$
      %=  +>.$
        dug  nug
        ::S mos  :_(mos [hen %pass ~ %b kyz])
      ==
    ::
        %hook                                           ::  this term hung up
      ~&  %dill-hook-not-implemented
      +>.$
      ::S +>.$(dug (~(del by dug) hen), mos :_(mos [hen %pass ~ %b kyz]))
    ::
        %init
      =.  def  `(fall def +.hen)
      %=    +>.$
          our  p.kyz
          mos
        :_  mos
        [(need def) %pass / %c %warp [p.kyz p.kyz] %main `[%& %y [%ud 1] /]]
      ==
    ::
        %talk  (furl (~(win re p.kyz) 0 p.q.yar))       ::  program output
        %text  $(kyz [%talk %leaf p.kyz])               ::  simple message
    ==
  ::
  ++  poke
    |=  msg=mess
    ^-  move
    :^  hen  %pass  /term-mess
    :^  %g  %mess  [our /terminal]
    :-  our  msg
  ::
  ++  yerk                                              ::  complete core
    ^-  [p=(list move) q=ship r=(unit duct) s=(map duct yard)]
    :^  (flop mos)  our  def
    (~(put by dug) hen yar)
  --
--
=|  $:  %1                                              ::
        our=ship                                        ::
        def=(unit duct)                                 ::
        dug=(map duct yard)                             ::
    ==                                                  ::
|=  [now=@da eny=@ ski=sled]                            ::  current invocation
|%                                                      ::  poke/peek pattern
++  call                                                ::  handle request
  |=  $:  hen=duct
          hic=(hypo (hobo kiss))
      ==
  ^-  [p=(list move) q=_..^$]
  =>  %=    .                                           ::  XX temporary
          q.hic
        ^-  kiss
        ?:  ?=(%soft -.q.hic)
          ::  ~&  [%dill-call-soft (,@tas `*`-.p.q.hic)]
          ((hard kiss) p.q.hic)
        ?:  (~(nest ut -:!>(*kiss)) | p.hic)  q.hic
        ~&  [%dill-call-flub (,@tas `*`-.q.hic)]
        ((hard kiss) q.hic)
      ==
  ?:  ?=(%flog -.q.hic)
    :_  ..^$
    %+  turn  (~(tap by dug) *(list ,[p=duct q=yard]))
    |=([a=duct b=yard] [a %slip %d p.q.hic])
  =+  res=yerk:(lear:(dy hen our now def dug) q.hic)
  [-.res ..^$(our +<.res, dug +>+.res, def +>-.res)]
::
++  doze
  |=  [now=@da hen=duct]
  ^-  (unit ,@da)
  ~
::
++  load                                                ::  XX LEGACY 12-16-2014
  |=  $=  old
      $%  [%0 our=ship def=(unit duct) dug=(map duct yord)]
          [%1 our=ship def=(unit duct) dug=(map duct yard)]
      ==
  ^+  ..^$
  ?-  -.old
    %1  %_(..^$ our our.old, def def.old, dug dug.old)
    %0  %=    $
            old
          %=  old
            -    %1
            dug  (~(run by dug.old) |=(yor=yord [p q r | *@da]:yor))
          ==
        ==
  ==
::
++  scry
  |=  [fur=(unit (set monk)) ren=@tas his=ship syd=desk lot=coin tyl=path]
  ^-  (unit (unit (pair mark ,*)))
  [~ ~ [%tank >dug<]]
::
++  stay  [%1 our def dug]
++  take                                                ::  process move
  |=  [tea=wire hen=duct hin=(hypo sign)]
  ^-  [p=(list move) q=_..^$]
  =+  res=yerk:(leap:(dy hen our now def dug) tea q.hin)
  [-.res ..^$(our +<.res, dug +>+.res, def +>-.res)]
--