urbit/pkg/arvo/sys/vane/gall.hoon

2060 lines
60 KiB
Plaintext
Raw Normal View History

2020-12-08 03:22:26 +03:00
!:
:: :: %gall, agent execution
2019-08-29 21:44:37 +03:00
!? 163
::
2019-08-29 21:44:37 +03:00
::::
2020-12-06 11:38:37 +03:00
|= our=ship
:: veb: verbosity flags
::
=/ veb-all-off
:: TODO: add more flags?
::
:* odd=`?`%.n :: unusual events
==
2019-11-19 07:36:21 +03:00
=, gall
=>
2019-08-29 21:44:37 +03:00
|%
+| %helpers
:: +trace: print if .verb is set and we're tracking .dude
::
++ trace
|= [verb=? =dude dudes=(set dude) print=tang]
^+ same
?. verb
same
?. => [dude=dude dudes=dudes in=in]
~+ |(=(~ dudes) (~(has in dudes) dude))
same
(slog print)
::
:: $bug: debug printing configuration
::
:: veb: verbosity toggles
:: dudes: app filter; if ~, print for all
::
+$ bug
$: veb=_veb-all-off
dudes=(set dude)
==
::
2020-05-14 14:24:44 +03:00
+| %main
::
:: $move: Arvo-level move
::
+$ move [=duct move=(wind note-arvo gift-arvo)]
:: $state-9: overall gall state, versioned
::
2021-06-26 01:11:18 +03:00
+$ state-9 [%9 state]
2020-05-14 14:24:44 +03:00
:: $state: overall gall state
::
:: system-duct: TODO document
:: outstanding: outstanding request queue
:: contacts: other ships we're in communication with
:: yokes: running agents
:: blocked: moves to agents that haven't been started yet
:: bug: debug printing configuration
::
+$ state
$: system-duct=duct
outstanding=(map [wire duct] (qeu remote-request))
contacts=(set ship)
yokes=(map term yoke)
blocked=(map term (qeu blocked-move))
=bug
==
2020-05-14 14:24:44 +03:00
:: $watches: subscribers and publications
::
:: TODO: rename this, to $ties?
:: TODO: document
::
+$ watches [=bitt =boat =beat]
2020-05-14 14:24:44 +03:00
:: $routes: new cuff; TODO: document
::
+$ routes
$: disclosing=(unit (set ship))
attributing=ship
==
2020-05-14 14:24:44 +03:00
:: $yoke: agent runner state
::
:: control-duct: TODO document
:: run-nonce: unique for each rebuild
:: sub-nonce: app-wide global %watch nonce
:: live: is this agent running? TODO document better
:: stats: TODO document
:: watches: incoming and outgoing subscription state
:: agent: agent core
:: beak: compilation source
:: marks: mark conversion requests
::
+$ yoke
$: control-duct=duct
run-nonce=@t
2021-06-26 01:11:18 +03:00
sub-nonce=_1
live=?
=stats
=watches
2020-11-17 23:53:05 +03:00
agent=(each agent vase)
=beak
marks=(map duct mark)
==
2020-05-14 14:24:44 +03:00
:: $blocked-move: enqueued move to an agent
::
+$ blocked-move [=duct =routes move=(each deal unto)]
2020-05-14 14:24:44 +03:00
:: $stats: statistics
::
2020-05-14 14:24:44 +03:00
:: change: how many moves this agent has processed
:: eny: entropy
:: time: date of current event processing
::
+$ stats [change=@ud eny=@uvJ time=@da]
2020-05-14 14:24:44 +03:00
:: $ames-response: network response message (%boon)
2019-08-29 21:44:37 +03:00
::
:: %d: fact
:: %x: quit
::
+$ ames-response
$% [%d =mark noun=*]
2019-08-29 21:44:37 +03:00
[%x ~]
==
2020-05-14 14:24:44 +03:00
:: $ames-request: network request (%plea)
2019-08-29 21:44:37 +03:00
::
:: %m: poke
:: %l: watch-as
:: %s: watch
:: %u: leave
::
+$ ames-request-all
$% [%0 ames-request]
==
+$ ames-request
$% [%m =mark noun=*]
2019-08-29 21:44:37 +03:00
[%l =mark =path]
[%s =path]
[%u ~]
==
2020-05-14 14:24:44 +03:00
:: $remote-request: kinds of agent actions that can cross the network
2019-08-29 21:44:37 +03:00
::
:: Used in wires to identify the kind of remote request we made.
:: Bijective with the tags of $ames-request.
::
+$ remote-request
2019-11-07 09:19:32 +03:00
$? %watch
%watch-as
2019-08-29 21:44:37 +03:00
%poke
2019-11-07 09:19:32 +03:00
%leave
%missing
%cork
2019-08-29 21:44:37 +03:00
==
2020-05-14 14:24:44 +03:00
:: |migrate: data structures for upgrades
2019-08-29 21:44:37 +03:00
::
2020-05-14 14:24:44 +03:00
+| %migrate
2019-08-29 21:44:37 +03:00
::
2020-05-14 14:24:44 +03:00
:: $spore: structures for update, produced by +stay
2019-08-29 21:44:37 +03:00
::
2020-05-14 14:24:44 +03:00
+$ spore
2021-06-26 01:11:18 +03:00
$: %9
2019-08-29 21:44:37 +03:00
system-duct=duct
outstanding=(map [wire duct] (qeu remote-request))
contacts=(set ship)
2020-05-14 14:24:44 +03:00
eggs=(map term egg)
blocked=(map term (qeu blocked-move))
=bug
2019-08-29 21:44:37 +03:00
==
2020-05-14 14:24:44 +03:00
:: $egg: migratory agent state; $yoke with .old-state instead of .agent
2019-08-29 21:44:37 +03:00
::
2020-05-14 14:24:44 +03:00
+$ egg
$: control-duct=duct
run-nonce=@t
2021-06-26 01:11:18 +03:00
sub-nonce=@
2019-08-29 21:44:37 +03:00
live=?
=stats
2020-05-14 14:24:44 +03:00
=watches
2020-11-17 23:53:05 +03:00
old-state=(each vase vase)
2019-08-29 21:44:37 +03:00
=beak
marks=(map duct mark)
2019-08-29 21:44:37 +03:00
==
--
2020-05-14 14:24:44 +03:00
:: pupal gall core, on upgrade
::
=< =* adult-gate .
=| =spore
2020-12-06 11:38:37 +03:00
|= [now=@da eny=@uvJ rof=roof]
2020-05-14 14:24:44 +03:00
=* pupal-gate .
=* adult-core (adult-gate +<)
=< |%
++ call ^call
++ load ^load
++ scry ^scry
++ stay ^stay
++ take ^take
--
2020-05-14 14:24:44 +03:00
|%
++ molt
|= [=duct fec=(unit move)]
^- [(list move) _adult-gate]
~> %slog.[0 leaf+"gall: molting"]
~< %slog.[0 leaf+"gall: molted"]
2020-06-18 06:31:37 +03:00
:: +molt should never notify its client about agent changes
::
=- :_ ->
%+ welp
(skip -< |=(move ?=([* %give %onto *] +<)))
[^duct %pass /whiz/gall %$ %whiz ~]~
=/ adult adult-core
=. state.adult
[%9 system-duct outstanding contacts yokes=~ blocked bug]:spore
=/ mo-core (mo-abed:mo:adult duct)
=. mo-core
=/ apps=(list [dap=term =egg]) ~(tap by eggs.spore)
|- ^+ mo-core
?~ apps mo-core
2021-07-07 21:08:21 +03:00
?. =(%base q.beak.egg.i.apps)
~> %slog.[0 leaf+"gall: suspending {<dap.i.apps>}"]
=. old-state.egg.i.apps
=/ old old-state.egg.i.apps
|/?-(-.old %| p.old, %& p.old)
=/ ap-core (ap-abut:ap:mo-core i.apps)
$(apps t.apps, mo-core ap-abet:ap-core)
~> %slog.[0 leaf+"gall: upgrading {<dap.i.apps>}"]
=/ ap-core (ap-abut:ap:mo-core i.apps)
2020-11-17 23:53:05 +03:00
=? ap-core ?=(%& -.old-state.egg.i.apps)
=^ tan ap-core (ap-install:ap-core `p.old-state.egg.i.apps)
?^ tan
(mean u.tan)
ap-core
$(apps t.apps, mo-core ap-abet:ap-core)
=. mo-core (mo-subscribe-to-agent-builds:mo-core now)
=^ moves adult-gate mo-abet:mo-core
=? moves ?=(^ fec) (weld moves [u.fec]~)
[moves adult-gate]
::
2020-05-14 14:24:44 +03:00
++ call
2020-12-08 03:47:06 +03:00
|= [=duct dud=(unit goof) wrapped-task=(hobo task)]
2020-05-14 14:24:44 +03:00
=* call-args +<
?: =(~ eggs.spore)
2020-05-14 14:24:44 +03:00
~> %slog.[0 leaf+"gall: direct morphogenesis"]
2021-09-22 23:34:20 +03:00
=. state.adult-gate spore(eggs *(map term yoke))
2020-05-14 14:24:44 +03:00
(call:adult-core call-args)
?^ dud
~> %slog.[0 leaf+"gall: pupa call dud"]
2020-05-14 14:24:44 +03:00
(mean >mote.u.dud< tang.u.dud)
2020-12-08 03:47:06 +03:00
=/ task ((harden task:gall) wrapped-task)
?: ?=(%vega -.task)
[~ pupal-gate]
(molt duct `[duct %slip %g task])
::
2020-05-14 14:24:44 +03:00
++ scry scry:adult-core
2021-09-29 23:24:12 +03:00
++ stay spore
2020-05-14 14:24:44 +03:00
++ take
2020-12-06 11:38:37 +03:00
|= [=wire =duct dud=(unit goof) sign=sign-arvo]
2020-05-14 14:24:44 +03:00
=* take-args +<
?: =(~ eggs.spore)
2020-05-14 14:24:44 +03:00
~> %slog.[0 leaf+"gall: direct morphogenesis"]
2021-09-22 23:34:20 +03:00
=. state.adult-gate spore(eggs *(map term yoke))
2020-05-14 14:24:44 +03:00
(take:adult-core take-args)
?^ dud
~> %slog.[0 leaf+"gall: pupa take dud"]
(mean >mote.u.dud< tang.u.dud)
?: =(/sys/lyv wire)
(molt duct ~)
2020-07-08 09:08:27 +03:00
(molt duct `[duct %pass wire %b %huck sign])
2020-05-14 14:24:44 +03:00
::
++ load
2021-09-22 23:34:20 +03:00
|^ |= old=spore-any
2021-06-26 01:11:18 +03:00
=? old ?=(%7 -.old) (spore-7-to-8 old)
=? old ?=(%8 -.old) (spore-8-to-9 old)
?> ?=(%9 -.old)
2021-09-22 23:34:20 +03:00
=. spore old
?. =(~ eggs.spore)
pupal-gate
~> %slog.[0 leaf+"gall: direct morphogenesis"]
%_ adult-gate
state spore(eggs *(map term yoke))
==
::
2021-06-26 01:11:18 +03:00
+$ spore-any $%(^spore spore-8 spore-7)
2021-09-22 23:34:20 +03:00
+$ spore-7
$: %7
wipe-eyre-subs=_| ::NOTE band-aid for #3196
system-duct=duct
outstanding=(map [wire duct] (qeu remote-request))
contacts=(set ship)
2021-06-26 01:11:18 +03:00
eggs=(map term egg-7)
2021-09-22 23:34:20 +03:00
blocked=(map term (qeu blocked-move))
==
::
2021-06-26 01:11:18 +03:00
+$ spore-8
$: %8
system-duct=duct
outstanding=(map [wire duct] (qeu remote-request))
contacts=(set ship)
eggs=(map term egg-8)
blocked=(map term (qeu blocked-move))
==
::
+$ egg-7 egg-8
+$ egg-8
$: control-duct=duct
run-nonce=@t
live=?
=stats
watches=watches-8
old-state=(each vase vase)
=beak
marks=(map duct mark)
==
::
+$ watches-8 [inbound=bitt outbound=boat-8]
+$ boat-8 (map [wire ship term] [acked=? =path])
::
2021-09-22 23:34:20 +03:00
++ spore-7-to-8
|= old=spore-7
2021-06-26 01:11:18 +03:00
^- spore-8
2021-09-22 23:34:20 +03:00
:- %8
=. eggs.old
%- ~(urn by eggs.old)
2021-06-26 01:11:18 +03:00
|= [a=term e=egg-7]
2021-09-22 23:34:20 +03:00
::NOTE kiln will kick off appropriate app revival
e(old-state [%| p.old-state.e])
+>.old
2021-06-26 01:11:18 +03:00
::
++ spore-8-to-9
|= old=spore-8
^- ^spore
=- old(- %9, eggs -, blocked [blocked.old *bug])
2021-06-26 01:11:18 +03:00
%- ~(run by eggs.old)
|= =egg-8
^- egg
:* control-duct.egg-8
run-nonce.egg-8
sub-nonce=0
live.egg-8
stats.egg-8
(watches-8-to-9 watches.egg-8)
2021-06-26 01:11:18 +03:00
[old-state beak marks]:egg-8
==
::
++ watches-8-to-9
|= watches-8
^- watches
[inbound outbound (~(run by outbound) |=([acked=? =path] nonce=0))]
2021-09-22 23:34:20 +03:00
--
2020-05-14 14:24:44 +03:00
--
:: adult gall vane interface, for type compatibility with pupa
::
2021-06-26 01:11:18 +03:00
=| state=state-9
2020-12-06 11:38:37 +03:00
|= [now=@da eny=@uvJ rof=roof]
2020-05-14 14:24:44 +03:00
=* gall-payload .
=< ~% %gall-wrap ..mo ~
|%
++ call ^call
++ load ^load
++ scry ^scry
++ stay ^stay
++ take ^take
--
~% %gall-top ..part ~
2019-08-29 21:44:37 +03:00
|%
:: +mo: Arvo-level move handling
::
:: An outer core responsible for routing moves to and from Arvo; it calls
:: an inner core, +ap, to route internal moves to and from agents.
::
++ mo
2019-11-19 07:36:21 +03:00
~% %gall-mo +> ~
|_ [hen=duct moves=(list move)]
::
++ trace
|= [verb=? =dude print=tang]
^+ same
(^trace verb dude dudes.bug.state print)
::
:: +mo-abed: initialise state with the provided duct
:: +mo-abet: finalize, reversing moves
:: +mo-pass: prepend a standard %pass to the current list of moves
:: +mo-give: prepend a standard %give to the current list of moves
2019-08-29 21:44:37 +03:00
::
++ mo-core .
++ mo-abed |=(hun=duct mo-core(hen hun))
++ mo-abet [(flop moves) gall-payload]
++ mo-pass |=(p=[wire note-arvo] mo-core(moves [[hen pass+p] moves]))
2020-12-08 03:47:06 +03:00
++ mo-give |=(g=gift mo-core(moves [[hen give+g] moves]))
++ mo-past
|= =(list [wire note-arvo])
?~ list
mo-core
=. mo-core (mo-pass i.list)
$(list t.list)
:: +mo-jolt: (re)start agent if not already started on this desk
::
++ mo-jolt
|= [dap=term =ship =desk]
^+ mo-core
=/ yak (~(get by yokes.state) dap)
?~ yak
(mo-boot dap ship desk)
?. -.agent.u.yak
(mo-boot dap ship desk)
?. =(desk q.beak.u.yak)
(mo-boot dap ship desk)
mo-core
2019-08-29 21:44:37 +03:00
:: +mo-boot: ask %ford to build us a core for the specified agent.
::
++ mo-boot
|= [dap=term =ship =desk]
2019-08-29 21:44:37 +03:00
^+ mo-core
=/ =case [%da now]
=/ =wire /sys/cor/[dap]/(scot %p ship)/[desk]/(scot case)
(mo-pass wire %c %warp ship desk ~ %sing %a case /app/[dap]/hoon)
2019-08-29 21:44:37 +03:00
:: +mo-receive-core: receives an app core built by %ford.
::
:: Presuming we receive a good core, we first check to see if the agent
2019-11-19 07:36:21 +03:00
:: is already running. If so, we update its beak in %gall's state,
2019-08-29 21:44:37 +03:00
:: initialise an +ap core for the agent, install the core we got from
:: %ford, and then resolve any moves associated with it.
::
:: If we're dealing with a new agent, we create one using the result we
2019-11-19 07:36:21 +03:00
:: got from %ford, add it to the collection of agents %gall is keeping
2019-08-29 21:44:37 +03:00
:: track of, and then do more or less the same procedure as we did for the
:: running agent case.
::
++ mo-receive-core
~/ %mo-receive-core
2020-05-14 14:24:44 +03:00
|= [dap=term bek=beak =agent]
2019-08-29 21:44:37 +03:00
^+ mo-core
::
=/ yak (~(get by yokes.state) dap)
=/ tex
?~ yak "installing"
?- -.agent.u.yak
%& "reloading"
%| "reviving"
==
~> %slog.[0 leaf+"gall: {tex} {<dap>}"]
2019-08-29 21:44:37 +03:00
::
2021-07-16 05:22:31 +03:00
?^ yak
=. yokes.state
(~(put by yokes.state) dap u.yak(beak bek))
=/ ap-core (ap-abed:ap dap `our)
=. ap-core (ap-reinstall:ap-core agent)
2020-11-17 23:53:05 +03:00
=. mo-core ap-abet:ap-core
(mo-clear-queue dap)
2019-08-29 21:44:37 +03:00
::
=. yokes.state
%+ ~(put by yokes.state) dap
%* . *yoke
control-duct hen
beak bek
agent &+agent
2021-07-07 18:50:21 +03:00
run-nonce (scot %uw (end 5 (shas %yoke-nonce eny)))
==
2019-08-29 21:44:37 +03:00
::
=/ old mo-core
=/ wag
=/ ap-core (ap-abed:ap dap `our)
(ap-upgrade-state:ap-core ~)
2019-08-29 21:44:37 +03:00
::
=/ maybe-tang -.wag
=/ ap-core +.wag
2019-08-29 21:44:37 +03:00
?^ maybe-tang
=. mo-core old
(mo-give %onto %.n u.maybe-tang)
::
=. mo-core ap-abet:ap-core
=. mo-core (mo-clear-queue dap)
=/ =suss [dap %boot now]
2019-08-29 21:44:37 +03:00
(mo-give %onto [%.y suss])
2020-04-24 07:13:19 +03:00
:: +mo-subscribe-to-agent-builds: request agent update notices
2019-08-29 21:44:37 +03:00
::
2020-05-14 14:24:44 +03:00
:: Also subscribe to our own source path, in case we get reloaded
:: but none of the agents do. This way, Clay will still notify us,
:: and we'll be able to exit the chrysalis.
2019-08-29 21:44:37 +03:00
::
2020-04-24 07:13:19 +03:00
++ mo-subscribe-to-agent-builds
|= date=@da
2019-08-29 21:44:37 +03:00
^+ mo-core
2020-04-24 07:13:19 +03:00
=. mo-core (mo-abed system-duct.state)
::
=/ sources=(jug desk [care:clay path])
2021-09-29 21:13:08 +03:00
%+ ~(put by *(jug desk [care:clay path])) %base
%- sy
:~ [%z /sys/hoon/hoon]
[%z /sys/arvo/hoon]
[%z /sys/lull/hoon]
[%z /sys/zuse/hoon]
[%z /sys/vane/gall/hoon]
[%z /sys/kelvin]
2019-08-29 21:44:37 +03:00
==
::
=. sources
=/ apps=(list [dap=term =yoke]) ~(tap by yokes.state)
|- ^+ sources
?~ apps
sources
=? sources ?=(%& -.agent.yoke.i.apps)
(~(put ju sources) q.beak.yoke.i.apps %a /app/[dap.i.apps]/hoon)
$(apps t.apps)
::
%- mo-past
%- zing
%+ turn ~(tap by sources)
|= [=desk paths=(set [care:clay path])]
:~ [/sys/lyv %c %warp our desk ~]
[/sys/lyv %c %warp our desk ~ %mult da+date paths]
==
2020-05-14 14:24:44 +03:00
:: +mo-scry-agent-cage: read $agent core from clay
::
++ mo-scry-agent-cage
|= [dap=term =desk =case:clay]
2020-05-14 14:24:44 +03:00
^- (each agent tang)
=/ bek=beak [our desk case]
2020-12-06 13:55:19 +03:00
=/ sky (rof ~ %ca bek /app/[dap]/hoon)
2020-05-14 14:24:44 +03:00
?~ sky |+[leaf+"gall: {<dap>} scry blocked"]~
?~ u.sky |+[leaf+"gall: {<dap>} scry failed"]~
=/ =cage u.u.sky
?. =(%vase p.cage)
|+[leaf+"gall: bad mark {<p.cage>} for agent {<dap>}"]~
=/ res (mule |.(!<(agent !<(vase q.cage))))
?: ?=(%& -.res)
&+p.res
|+[[leaf+"gall: {<dap>} not valid agent"] p.res]
:: +mo-send-foreign-request: handle local request to .ship
2019-08-29 21:44:37 +03:00
::
++ mo-send-foreign-request
~/ %mo-send-foreign-request
|= [=ship foreign-agent=term =deal]
2019-08-29 21:44:37 +03:00
^+ mo-core
::
2019-11-04 04:35:45 +03:00
=. mo-core (mo-track-ship ship)
?< ?=(?(%raw-poke %poke-as) -.deal)
=/ =ames-request-all
:- %0
?- -.deal
%poke [%m p.cage.deal q.q.cage.deal]
%leave [%u ~]
%watch-as [%l [mark path]:deal]
%watch [%s path.deal]
2019-08-29 21:44:37 +03:00
==
::
=/ wire
/sys/way/(scot %p ship)/[foreign-agent]
2019-08-29 21:44:37 +03:00
::
=/ =note-arvo
2019-11-01 22:06:09 +03:00
=/ =path /ge/[foreign-agent]
[%a %plea ship %g path ames-request-all]
2019-08-29 21:44:37 +03:00
::
=. outstanding.state
2021-06-26 01:11:18 +03:00
=/ stand
(~(gut by outstanding.state) [wire hen] *(qeu remote-request))
%+ ~(put by outstanding.state) [wire hen]
(~(gas to stand) ?.(?=(%leave -.deal) ~[-.deal] ~[%leave %cork]))
2021-08-29 22:29:02 +03:00
=. mo-core (mo-pass wire note-arvo)
?. ?=(%leave -.deal)
mo-core
2021-09-01 18:16:00 +03:00
(mo-pass wire [%a [%cork ship]])
2019-11-04 04:35:45 +03:00
:: +mo-track-ship: subscribe to ames and jael for notices about .ship
2019-08-29 21:44:37 +03:00
::
2019-11-04 04:35:45 +03:00
++ mo-track-ship
|= =ship
2019-08-29 21:44:37 +03:00
^+ mo-core
:: if already contacted, no-op
2019-08-29 21:44:37 +03:00
::
?: (~(has in contacts.state) ship)
2019-11-05 07:19:08 +03:00
mo-core
2019-11-04 04:35:45 +03:00
:: first contact; update state and subscribe to notifications
2019-08-29 21:44:37 +03:00
::
=. contacts.state (~(put in contacts.state) ship)
2019-11-04 04:35:45 +03:00
:: ask ames to track .ship's connectivity
2019-08-29 21:44:37 +03:00
::
=. moves [[system-duct.state %pass /sys/lag %a %heed ship] moves]
2019-11-04 04:35:45 +03:00
:: ask jael to track .ship's breaches
2019-08-29 21:44:37 +03:00
::
=/ =note-arvo [%j %public-keys (silt ship ~)]
=. moves
[[system-duct.state %pass /sys/era note-arvo] moves]
mo-core
2019-11-04 04:35:45 +03:00
:: +mo-untrack-ship: cancel subscriptions to ames and jael for .ship
2019-11-05 07:19:08 +03:00
::
2019-11-04 04:35:45 +03:00
++ mo-untrack-ship
2019-11-05 07:19:08 +03:00
|= =ship
^+ mo-core
:: if already canceled, no-op
::
?. (~(has in contacts.state) ship)
mo-core
2019-11-04 04:35:45 +03:00
:: delete .ship from state and kill subscriptions
::
=. contacts.state (~(del in contacts.state) ship)
2019-11-04 04:35:45 +03:00
::
=. moves [[system-duct.state %pass /sys/lag %a %jilt ship] moves]
2019-11-04 04:35:45 +03:00
::
2019-11-05 07:19:08 +03:00
=/ =note-arvo [%j %nuke (silt ship ~)]
=. moves
[[system-duct.state %pass /sys/era note-arvo] moves]
2019-11-05 07:19:08 +03:00
mo-core
:: +mo-breach: ship breached, so forget about them
::
++ mo-breach
|= =ship
^+ mo-core
2019-11-04 04:35:45 +03:00
=. mo-core (mo-untrack-ship ship)
=. mo-core (mo-filter-queue ship)
=/ agents=(list [name=term =yoke]) ~(tap by yokes.state)
=. outstanding.state
%- malt
%+ skip ~(tap by outstanding.state)
|= [[=wire duct] (qeu remote-request)]
=(/sys/way/(scot %p ship) (scag 3 wire))
::
2019-11-05 07:19:08 +03:00
|- ^+ mo-core
?~ agents
mo-core
=. mo-core
=/ =routes [disclosing=~ attributing=ship]
=/ app (ap-abed:ap name.i.agents routes)
ap-abet:(ap-breach:app ship)
$(agents t.agents)
2019-08-29 21:44:37 +03:00
:: +mo-handle-sys: handle a +sign incoming over /sys.
::
:: (Note that /sys implies the +sign should be routed to a vane.)
::
++ mo-handle-sys
~/ %mo-handle-sys
|= [=wire =sign-arvo]
2019-08-29 21:44:37 +03:00
^+ mo-core
::
?+ -.wire !!
%lyv (mo-handle-sys-lyv wire sign-arvo)
%era (mo-handle-sys-era wire sign-arvo)
%cor (mo-handle-sys-cor wire sign-arvo)
%lag (mo-handle-sys-lag wire sign-arvo)
%req (mo-handle-sys-req wire sign-arvo)
%way (mo-handle-sys-way wire sign-arvo)
2019-08-29 21:44:37 +03:00
==
2019-11-04 04:35:45 +03:00
:: +mo-handle-sys-era: receive update about contact
2019-11-05 07:19:08 +03:00
::
2019-11-04 04:35:45 +03:00
++ mo-handle-sys-era
|= [=wire =sign-arvo]
2019-11-05 07:19:08 +03:00
^+ mo-core
2020-12-08 03:22:26 +03:00
?> ?=([%jael %public-keys *] sign-arvo)
?> ?=([%era ~] wire)
2019-11-05 07:19:08 +03:00
?. ?=(%breach -.public-keys-result.sign-arvo)
mo-core
(mo-breach who.public-keys-result.sign-arvo)
2020-04-24 07:13:19 +03:00
:: +mo-handle-sys-cor: receive a built agent from %clay
2019-08-29 21:44:37 +03:00
::
2019-11-04 04:35:45 +03:00
++ mo-handle-sys-cor
|= [=wire =sign-arvo]
2019-08-29 21:44:37 +03:00
^+ mo-core
::
?> ?=([%cor @ @ @ @ ~] wire)
=/ [dap=term her=@ta desk=@ta dat=@ta ~] t.wire
=/ =beak [(slav %p her) desk da+now]
2020-12-08 03:22:26 +03:00
?> ?=([?(%behn %clay) %writ *] sign-arvo)
2020-06-13 07:16:09 +03:00
?~ p.sign-arvo
2021-07-16 05:22:31 +03:00
(mean leaf+"gall: failed to build agent {<dap>}" ~)
2020-06-13 07:16:09 +03:00
=/ cag=cage r.u.p.sign-arvo
?. =(%vase p.cag)
2021-07-16 05:22:31 +03:00
(mean leaf+"gall: bad %writ {<p.cag>} for {<dap>}" ~)
2020-06-13 07:16:09 +03:00
=/ res (mule |.(!<(agent !<(vase q.cag))))
?: ?=(%| -.res)
2021-07-16 05:22:31 +03:00
(mean leaf+["gall: bad agent {<dap>}"] p.res)
2020-06-13 07:16:09 +03:00
=. mo-core (mo-receive-core dap beak p.res)
(mo-subscribe-to-agent-builds now)
2020-05-09 15:09:26 +03:00
:: +mo-handle-sys-lyv: handle notice that agents have been rebuilt
2020-04-24 07:13:19 +03:00
::
++ mo-handle-sys-lyv
|= [=wire =sign-arvo]
2020-04-24 07:13:19 +03:00
^+ mo-core
?> ?=([%lyv ~] wire)
2020-12-08 03:22:26 +03:00
?> ?=([?(%behn %clay) %wris *] sign-arvo)
=/ nex=(list [=care:clay =path]) ~(tap in q.sign-arvo)
2020-05-09 15:09:26 +03:00
~> %slog.[0 leaf+"gall: reloading agents"]
~< %slog.[0 leaf+"gall: reloaded agents"]
=; cor (mo-subscribe-to-agent-builds:cor now)
2020-04-24 07:13:19 +03:00
%+ roll nex
|= [[=care:clay =path] cor=_mo-core]
2020-04-24 07:13:19 +03:00
^+ cor
:: We throw away %z results because we only have them to guarantee
:: molting. Clay will tell us if e.g. changing hoon.hoon affects
:: the result of a particular app (usually it will).
::
?. =(%a care)
cor
~| path=path
2020-04-24 07:13:19 +03:00
=/ dap dap:;;([%app dap=@tas %hoon ~] path)
=/ yok=(unit yoke) (~(get by yokes.state) dap)
?~ yok
~> %slog.[0 leaf+"gall: no agent to reload: {<dap>}"]
cor
2021-09-22 23:34:20 +03:00
?: ?=(%| -.agent.u.yok)
~> %slog.[0 leaf+"gall: dead agent reload: {<dap>}"]
cor
=/ bek=beak [our q.beak.u.yok da+now]
=/ rag (mo-scry-agent-cage dap q.bek da+now)
2020-05-14 14:24:44 +03:00
?: ?=(%| -.rag)
(mean p.rag)
(mo-receive-core:cor dap bek p.rag)
2019-11-04 04:35:45 +03:00
:: +mo-handle-sys-lag: handle an ames %clog notification
2019-08-29 21:44:37 +03:00
::
2019-11-04 04:35:45 +03:00
++ mo-handle-sys-lag
|= [=wire =sign-arvo]
2019-08-29 21:44:37 +03:00
^+ mo-core
::
?> ?=([%lag ~] wire)
2020-12-08 03:22:26 +03:00
?> ?=([%ames %clog *] sign-arvo)
2019-08-29 21:44:37 +03:00
::
=/ agents=(list term) ~(tap in ~(key by yokes.state))
2019-11-04 04:35:45 +03:00
|- ^+ mo-core
?~ agents mo-core
2019-08-29 21:44:37 +03:00
::
2019-11-04 04:35:45 +03:00
=. mo-core
=/ app (ap-abed:ap i.agents `our)
2019-11-04 04:35:45 +03:00
ap-abet:(ap-clog:app ship.sign-arvo)
2019-08-29 21:44:37 +03:00
::
2019-11-04 04:35:45 +03:00
$(agents t.agents)
:: +mo-handle-sys-req: TODO description
2019-08-29 21:44:37 +03:00
::
:: TODO: what should we do if the remote nacks our %pull?
2019-08-29 21:44:37 +03:00
++ mo-handle-sys-req
|= [=wire =sign-arvo]
2019-08-29 21:44:37 +03:00
^+ mo-core
::
?> ?=([%req @ @ ~] wire)
=/ him (slav %p i.t.wire)
=/ dap i.t.t.wire
2019-08-29 21:44:37 +03:00
::
2020-12-08 03:22:26 +03:00
?> ?=([?(%gall %behn) %unto *] sign-arvo)
=/ =unto +>.sign-arvo
2019-08-29 21:44:37 +03:00
::
?- -.unto
%raw-fact ~|([%gall-raw-req wire] !!)
%poke-ack
=/ err=(unit error:ames)
?~ p.unto ~
`[%poke-ack u.p.unto]
(mo-give %done err)
2019-08-29 21:44:37 +03:00
::
2019-11-07 09:19:32 +03:00
%fact
=+ [mark noun]=[p q.q]:cage.unto
(mo-give %boon %d mark noun)
2019-08-29 21:44:37 +03:00
::
2019-11-07 09:19:32 +03:00
%kick
(mo-give %boon %x ~)
2019-08-29 21:44:37 +03:00
::
2019-11-07 09:19:32 +03:00
%watch-ack
=/ err=(unit error:ames)
?~ p.unto ~
`[%watch-ack u.p.unto]
(mo-give %done err)
2019-08-29 21:44:37 +03:00
==
:: +mo-handle-sys-way: handle response to outgoing remote request
2019-08-29 21:44:37 +03:00
::
++ mo-handle-sys-way
|= [=wire =sign-arvo]
2019-08-29 21:44:37 +03:00
^+ mo-core
?> ?=([%way @ @ $@(~ [@ ~])] wire)
=/ =ship (slav %p i.t.wire)
=/ foreign-agent i.t.t.wire
::
?+ sign-arvo !!
2020-12-08 03:22:26 +03:00
[%ames %done *]
=^ remote-request outstanding.state
?~ t.t.t.wire
=/ full-wire sys+wire
=/ stand
(~(gut by outstanding.state) [full-wire hen] ~)
::
:: default is to send both ack types; should only hit if
:: cleared queue in +load 3-to-4 or +load-4-to-5
::
=? stand ?=(~ stand)
2021-03-31 21:54:28 +03:00
~& [%gall-missing wire hen]
(~(put to *(qeu remote-request)) %missing)
~| [full-wire=full-wire hen=hen stand=stand]
=^ rr stand ~(get to stand)
~? &(=(rr %cork) ?=(^ stand))
[%outstanding-queue-not-empty wire hen]
:- rr
?: ?=(%cork rr)
(~(del by outstanding.state) [full-wire hen])
(~(put by outstanding.state) [full-wire hen] stand)
:: non-null case of wire is old, remove on next breach after
:: 2019/12
::
[;;(remote-request i.t.t.t.wire) outstanding.state]
::
=/ err=(unit tang)
?~ error=error.sign-arvo
~
`[[%leaf (trip tag.u.error)] tang.u.error]
2019-06-29 04:13:32 +03:00
::
?- remote-request
%watch-as (mo-give %unto %watch-ack err)
%watch (mo-give %unto %watch-ack err)
%poke (mo-give %unto %poke-ack err)
%leave mo-core
%cork mo-core
%missing (mo-give:(mo-give %unto %watch-ack err) %unto %poke-ack err)
==
2016-11-24 07:25:07 +03:00
::
2020-12-08 03:22:26 +03:00
[%ames %boon *]
?^ t.t.t.wire
:: kill subscriptions which use the old wire format
::
!!
=/ =ames-response ;;(ames-response payload.sign-arvo)
2019-11-04 04:35:45 +03:00
(mo-handle-ames-response ames-response)
2016-11-24 07:25:07 +03:00
::
2020-12-08 03:22:26 +03:00
[%ames %lost *]
:: note this should only happen on reverse bones, so only facts
:: and kicks
::
:: TODO: %drip %kick so app crash can't kill the remote %pull
::
=. mo-core (mo-send-foreign-request ship foreign-agent %leave ~)
2019-12-03 00:35:05 +03:00
=. mo-core (mo-give %unto %kick ~)
mo-core
2016-11-24 07:25:07 +03:00
==
2019-08-29 21:44:37 +03:00
:: +mo-handle-use: handle a typed +sign incoming on /use.
::
:: (Note that /use implies the +sign should be routed to an agent.)
::
:: Initialises the specified agent and then performs an agent-level
:: +take on the supplied +sign.
2019-08-29 21:44:37 +03:00
::
++ mo-handle-use
~/ %mo-handle-use
|= [=wire =sign-arvo]
2019-08-29 21:44:37 +03:00
^+ mo-core
::
?. ?=([@ @ @ *] wire)
~& [%mo-handle-use-bad-wire wire]
2019-08-29 21:44:37 +03:00
!!
::
=/ dap=term i.wire
2020-11-17 23:53:05 +03:00
=/ yoke (~(get by yokes.state) dap)
?~ yoke
%- (slog leaf+"gall: {<dap>} dead, got {<+<.sign-arvo>}" ~)
mo-core
?. =(run-nonce.u.yoke i.t.wire)
%- (slog leaf+"gall: got old {<+<.sign-arvo>} for {<dap>}" ~)
mo-core
2020-12-08 03:22:26 +03:00
?. ?=([?(%gall %behn) %unto *] sign-arvo)
2020-11-17 23:53:05 +03:00
?: ?=(%| -.agent.u.yoke)
%- (slog leaf+"gall: {<dap>} dozing, dropping {<+<.sign-arvo>}" ~)
mo-core
=/ app
=/ =ship (slav %p i.t.t.wire)
=/ =routes [disclosing=~ attributing=ship]
2020-11-17 23:53:05 +03:00
(ap-abed:ap dap routes)
::
=. app (ap-generic-take:app t.t.t.wire sign-arvo)
2019-08-29 21:44:37 +03:00
ap-abet:app
?> ?=([%out @ @ *] t.t.wire)
=/ =ship (slav %p i.t.t.t.wire)
2020-11-17 23:53:05 +03:00
=/ =routes [disclosing=~ attributing=ship]
=/ =unto +>.sign-arvo
2020-11-17 23:53:05 +03:00
?: ?=(%| -.agent.u.yoke)
=/ blocked=(qeu blocked-move)
=/ waiting (~(get by blocked.state) dap)
=/ deals (fall waiting *(qeu blocked-move))
=/ deal [hen routes |+unto]
2020-11-17 23:53:05 +03:00
(~(put to deals) deal)
::
%- (slog leaf+"gall: {<dap>} dozing, got {<-.unto>}" ~)
2020-11-17 23:53:05 +03:00
%_ mo-core
blocked.state (~(put by blocked.state) dap blocked)
==
=/ app (ap-abed:ap dap routes)
2019-09-06 04:18:31 +03:00
=. app
(ap-specific-take:app t.t.wire unto)
2019-09-06 04:18:31 +03:00
ap-abet:app
2019-08-29 21:44:37 +03:00
:: +mo-clear-queue: clear blocked tasks from the specified running agent.
::
++ mo-clear-queue
|= dap=term
2019-08-29 21:44:37 +03:00
^+ mo-core
?. (~(has by yokes.state) dap)
2019-08-29 21:44:37 +03:00
mo-core
?~ maybe-blocked=(~(get by blocked.state) dap)
2019-08-29 21:44:37 +03:00
mo-core
=/ blocked=(qeu blocked-move) u.maybe-blocked
2019-08-29 21:44:37 +03:00
|- ^+ mo-core
?: =(~ blocked)
=. blocked.state (~(del by blocked.state) dap)
mo-core
=^ [=duct =routes blocker=(each deal unto)] blocked
2020-11-17 23:53:05 +03:00
~(get to blocked)
?: ?=(%| -.blocker) $
2020-11-17 23:53:05 +03:00
=/ =move
2019-08-29 21:44:37 +03:00
=/ =sock [attributing.routes our]
=/ card [%slip %g %deal sock dap p.blocker]
2019-08-29 21:44:37 +03:00
[duct card]
$(moves [move moves])
:: +mo-filter-queue: remove all blocked tasks from ship.
::
++ mo-filter-queue
|= =ship
=/ agents=(list [name=term blocked=(qeu blocked-move)])
~(tap by blocked.state)
=| new-agents=(map term (qeu blocked-move))
|- ^+ mo-core
?~ agents
mo-core(blocked.state new-agents)
=| new-blocked=(qeu blocked-move)
|- ^+ mo-core
?: =(~ blocked.i.agents)
?~ new-blocked
^$(agents t.agents)
%= ^$
agents t.agents
new-agents (~(put by new-agents) name.i.agents new-blocked)
==
=^ mov=blocked-move blocked.i.agents ~(get to blocked.i.agents)
=? new-blocked !=(ship attributing.routes.mov)
(~(put to new-blocked) mov)
$
:: +mo-idle: put agent to sleep
2020-11-10 09:26:13 +03:00
::
++ mo-idle
|= dap=dude
2020-11-10 09:26:13 +03:00
^+ mo-core
?. (~(has by yokes.state) dap)
~> %slog.0^leaf/"gall: ignoring %idle for {<dap>}, not running"
mo-core
ap-abet:ap-idle:(ap-abed:ap dap `our)
:: +mo-nuke: delete agent completely
::
++ mo-nuke
|= dap=dude
^+ mo-core
?. (~(has by yokes.state) dap)
~> %slog.0^leaf/"gall: ignoring %nuke for {<dap>}, not running"
mo-core
2021-07-21 11:55:21 +03:00
~> %slog.0^leaf/"gall: nuking {<dap>}"
=. mo-core ap-abet:ap-nuke:(ap-abed:ap dap `our)
mo-core(yokes.state (~(del by yokes.state) dap))
2019-08-29 21:44:37 +03:00
:: +mo-peek: call to +ap-peek (which is not accessible outside of +mo).
::
++ mo-peek
~/ %mo-peek
|= [dap=term =routes care=term =path]
2019-08-29 21:44:37 +03:00
^- (unit (unit cage))
::
=/ app (ap-abed:ap dap routes)
2020-04-22 13:49:23 +03:00
(ap-peek:app care path)
2019-08-29 21:44:37 +03:00
::
++ mo-apply
|= [dap=term =routes =deal]
2019-08-29 21:44:37 +03:00
^+ mo-core
2020-04-30 11:15:28 +03:00
?- -.deal
?(%watch %watch-as %leave %poke)
(mo-apply-sure dap routes deal)
::
%raw-poke
=/ =case:clay da+now
=/ =desk q.beak:(~(got by yokes.state) dap)
=/ sky (rof ~ %cb [our desk case] /[mark.deal])
2020-04-30 11:15:28 +03:00
?- sky
?(~ [~ ~])
=/ ror "gall: raw-poke fail :{(trip dap)} {<mark.deal>}"
(mo-give %unto %poke-ack `[leaf+ror]~)
::
2020-04-30 11:15:28 +03:00
[~ ~ *]
=+ !<(=dais:clay q.u.u.sky)
=/ res (mule |.((vale:dais noun.deal)))
?: ?=(%| -.res)
=/ ror "gall: raw-poke vale fail :{(trip dap)} {<mark.deal>}"
(mo-give %unto %poke-ack `[leaf+ror p.res])
=. mo-core
%+ mo-pass /nowhere
[%c %warp our desk ~ %sing %b case /[mark.deal]]
2020-04-30 11:15:28 +03:00
(mo-apply-sure dap routes [%poke mark.deal p.res])
==
2019-08-29 21:44:37 +03:00
::
2020-04-30 11:15:28 +03:00
%poke-as
=/ =case:clay da+now
=/ =mars:clay [p.cage mark]:deal
=/ mars-path /[a.mars]/[b.mars]
=/ =desk q.beak:(~(got by yokes.state) dap)
=/ sky (rof ~ %cc [our desk case] mars-path)
2020-04-30 11:15:28 +03:00
?- sky
?(~ [~ ~])
=/ ror "gall: poke cast fail :{(trip dap)} {<mars>}"
(mo-give %unto %poke-ack `[leaf+ror]~)
::
[~ ~ *]
=+ !<(=tube:clay q.u.u.sky)
=/ res (mule |.((tube q.cage.deal)))
?: ?=(%| -.res)
=/ ror "gall: poke-as cast fail :{(trip dap)} {<mars>}"
(mo-give %unto %poke-ack `[leaf+ror p.res])
=. mo-core
%+ mo-pass /nowhere
[%c %warp our desk ~ %sing %c case /[a.mars]/[b.mars]]
2020-04-30 11:15:28 +03:00
(mo-apply-sure dap routes [%poke mark.deal p.res])
==
==
::
++ mo-apply-sure
|= [dap=term =routes =deal]
^+ mo-core
=/ app (ap-abed:ap dap routes)
=. app (ap-apply:app deal)
2019-08-29 21:44:37 +03:00
ap-abet:app
:: +mo-handle-local: handle locally.
::
2020-11-17 23:53:05 +03:00
:: If the agent is not running or blocked, assign it the supplied
:: +deal. Otherwise simply apply the action to the agent.
2019-08-29 21:44:37 +03:00
::
++ mo-handle-local
|= [=ship agent=term =deal]
2019-08-29 21:44:37 +03:00
^+ mo-core
::
=/ =routes [disclosing=~ attributing=ship]
2020-11-17 23:53:05 +03:00
=/ running (~(get by yokes.state) agent)
=/ is-running ?~(running %| ?=(%& -.agent.u.running))
=/ is-blocked (~(has by blocked.state) agent)
2019-08-29 21:44:37 +03:00
::
?: |(!is-running is-blocked)
=/ blocked=(qeu blocked-move)
=/ waiting (~(get by blocked.state) agent)
=/ deals (fall waiting *(qeu blocked-move))
2020-11-17 23:53:05 +03:00
=/ deal [hen routes &+deal]
(~(put to deals) deal)
2019-08-29 21:44:37 +03:00
::
2019-12-04 03:41:29 +03:00
%- (slog leaf+"gall: not running {<agent>} yet, got {<-.deal>}" ~)
2019-08-29 21:44:37 +03:00
%_ mo-core
blocked.state (~(put by blocked.state) agent blocked)
2019-08-29 21:44:37 +03:00
==
(mo-apply agent routes deal)
:: +mo-handle-ames-request: handle %ames request message.
2019-08-29 21:44:37 +03:00
::
++ mo-handle-ames-request
|= [=ship agent-name=term =ames-request]
2019-08-29 21:44:37 +03:00
^+ mo-core
:: %u/%leave gets automatically acked
2019-08-29 21:44:37 +03:00
::
2019-11-27 01:56:20 +03:00
=. mo-core (mo-track-ship ship)
=? mo-core ?=(%u -.ames-request) (mo-give %done ~)
2019-08-29 21:44:37 +03:00
::
=/ =wire /sys/req/(scot %p ship)/[agent-name]
2019-08-29 21:44:37 +03:00
::
=/ =deal
?- -.ames-request
%m [%raw-poke [mark noun]:ames-request]
%l [%watch-as [mark path]:ames-request]
%s [%watch path.ames-request]
%u [%leave ~]
2019-08-29 21:44:37 +03:00
==
(mo-pass wire %g %deal [ship our] agent-name deal)
:: +mo-handle-ames-response: handle ames response message.
2019-08-29 21:44:37 +03:00
::
++ mo-handle-ames-response
2019-11-04 04:35:45 +03:00
|= =ames-response
2019-08-29 21:44:37 +03:00
^+ mo-core
:: %d: diff; ask clay to validate .noun as .mark
:: %x: kick; tell agent the publisher canceled the subscription
2019-08-29 21:44:37 +03:00
::
?- -.ames-response
%d (mo-give %unto %raw-fact mark.ames-response noun.ames-response)
%x (mo-give %unto %kick ~)
2019-08-29 21:44:37 +03:00
==
:: +mo-spew: handle request to set verbosity toggles on debug output
::
++ mo-spew
|= verbs=(list verb)
^+ mo-core
:: start from all %.n's, then flip requested toggles
::
=. veb.bug.state
%+ roll verbs
|= [=verb acc=_veb-all-off]
^+ veb.bug.state
?- verb
%odd acc(odd %.y)
==
mo-core
:: +mo-sift: handle request to filter debug output by agent
::
++ mo-sift
|= dudes=(list dude)
^+ mo-core
=. dudes.bug.state (sy dudes)
mo-core
2019-08-29 21:44:37 +03:00
:: +ap: agent engine
::
:: An inner, agent-level core. The sample refers to the agent we're
:: currently focused on.
::
++ ap
2019-11-19 07:36:21 +03:00
~% %gall-ap +> ~
2019-08-29 21:44:37 +03:00
|_ $: agent-name=term
agent-routes=routes
agent-duct=duct
2019-11-08 03:30:45 +03:00
agent-moves=(list move)
2019-08-29 21:44:37 +03:00
agent-config=(list (each suss tang))
=yoke
2019-08-29 21:44:37 +03:00
==
::
++ trace
|= [verb=? print=tang]
^+ same
(^trace verb agent-name print)
::
2019-08-29 21:44:37 +03:00
++ ap-core .
:: +ap-abed: initialise state for an agent, with the supplied routes.
::
2019-11-19 07:36:21 +03:00
:: The agent must already be running in +gall -- here we simply update
2019-08-29 21:44:37 +03:00
:: +ap's state to focus on it.
::
++ ap-abed
~/ %ap-abed
2020-04-22 13:49:23 +03:00
|= [dap=term =routes]
2019-08-29 21:44:37 +03:00
^+ ap-core
2020-06-23 04:37:17 +03:00
(ap-yoke dap routes (~(got by yokes.state) dap))
2020-05-14 14:24:44 +03:00
:: +ap-hatch: initialize agent state from $egg, after upgrade
::
++ ap-abut
|= [dap=term =egg]
^+ ap-core
=/ yak=^yoke
2020-11-17 23:53:05 +03:00
?: ?=(%| -.old-state.egg)
egg
=/ res (mo-scry-agent-cage dap q.beak.egg da+now)
2020-11-17 23:53:05 +03:00
?: ?=(%| -.res)
(mean p.res)
egg(p.old-state `agent`p.res)
(ap-yoke dap `our yak)
2020-05-14 14:24:44 +03:00
:: +ap-yoke: initialize agent state, starting from a $yoke
::
++ ap-yoke
|= [dap=term =routes yak=^yoke]
2020-05-14 14:24:44 +03:00
^+ ap-core
=. stats.yak
:+ +(change.stats.yak)
(shaz (mix (add dap change.stats.yak) eny))
2020-05-14 14:24:44 +03:00
now
=. agent-name dap
2019-08-29 21:44:37 +03:00
=. agent-routes routes
=. yoke yak
=. agent-duct hen
ap-core
2019-08-29 21:44:37 +03:00
:: +ap-abet: resolve moves.
::
++ ap-abet
^+ mo-core
::
=/ running (~(put by yokes.state) agent-name yoke)
2019-08-29 21:44:37 +03:00
=/ moves
=/ giver |=(report=(each suss tang) [hen %give %onto report])
=/ from-suss (turn agent-config giver)
2019-11-08 03:30:45 +03:00
:(weld agent-moves from-suss moves)
2019-08-29 21:44:37 +03:00
::
%_ mo-core
yokes.state running
moves moves
2019-08-29 21:44:37 +03:00
==
2020-11-10 09:26:13 +03:00
::
++ ap-idle
?: ?=(%| -.agent.yoke) ap-core
ap-core(agent.yoke |+on-save:ap-agent-core)
::
++ ap-nuke
2020-11-10 09:26:13 +03:00
^+ ap-core
=/ out=(list [[=wire =ship =term] ? =path])
~(tap by boat.watches.yoke)
=/ inbound-paths=(set path)
%- silt
%+ turn ~(tap by bitt.watches.yoke)
|= [=duct =ship =path]
path
=/ will=(list card:agent:gall)
%+ welp
?: =(~ inbound-paths)
~
[%give %kick ~(tap in inbound-paths) ~]~
%+ turn ~(tap by boat.watches.yoke)
|= [[=wire =ship =term] ? =path]
[%pass wire %agent [ship term] %leave ~]
=^ maybe-tang ap-core (ap-ingest ~ |.([will *agent]))
ap-core
2019-08-29 21:44:37 +03:00
:: +ap-from-internal: internal move to move.
::
:: We convert from cards to duct-indexed moves when resolving
:: them in Arvo.
2019-08-29 21:44:37 +03:00
::
2020-12-19 03:07:17 +03:00
:: We accept %huck to "fake" being a message to a ship but
:: actually send it to a vane.
::
+$ neet
$% neat
[%huck [=ship name=term] =note-arvo]
==
::
2019-08-29 21:44:37 +03:00
++ ap-from-internal
~/ %ap-from-internal
2020-12-19 03:07:17 +03:00
|= card=(wind neet gift:agent)
^- (list move)
2019-08-29 21:44:37 +03:00
::
?- -.card
%slip !!
2019-08-29 21:44:37 +03:00
::
%give
=/ =gift:agent p.card
2019-11-08 00:17:13 +03:00
?: ?=(%kick -.gift)
=/ ducts=(list duct) (ap-ducts-from-paths paths.gift ship.gift)
2019-11-08 00:17:13 +03:00
%+ turn ducts
|= =duct
~? &(=(duct system-duct.state) !=(agent-name %hood))
2019-11-08 00:17:13 +03:00
[%agent-giving-on-system-duct agent-name -.gift]
[duct %give %unto %kick ~]
::
2019-11-07 09:19:32 +03:00
?. ?=(%fact -.gift)
[agent-duct %give %unto gift]~
2019-08-29 21:44:37 +03:00
::
=/ ducts=(list duct) (ap-ducts-from-paths paths.gift ~)
=/ =cage cage.gift
%- zing
%+ turn ducts
|= =duct
^- (list move)
~? &(=(duct system-duct.state) !=(agent-name %hood))
[%agent-giving-on-system-duct agent-name -.gift]
=/ =mark (~(gut by marks.yoke) duct p.cage)
2019-08-29 21:44:37 +03:00
::
?: =(mark p.cage)
[duct %give %unto %fact cage.gift]~
2020-04-30 11:15:28 +03:00
=/ =mars:clay [p.cage mark]
=/ =case:clay da+now
=/ bek=beak [our q.beak.yoke case]
=/ mars-path /[a.mars]/[b.mars]
2020-12-06 13:55:19 +03:00
=/ sky (rof ~ %cc bek mars-path)
2020-04-30 11:15:28 +03:00
?- sky
?(~ [~ ~])
%- (slog leaf+"watch-as fact conversion find-fail" >sky< ~)
(ap-kill-up-slip duct)
::
2020-04-30 11:15:28 +03:00
[~ ~ *]
=+ !<(=tube:clay q.u.u.sky)
=/ res (mule |.((tube q.cage)))
?: ?=(%| -.res)
%- (slog leaf+"watch-as fact conversion failure" p.res)
(ap-kill-up-slip duct)
:~ :* duct %pass /nowhere %c %warp our q.beak.yoke ~
%sing %c case mars-path
==
[duct %give %unto %fact b.mars p.res]
==
2020-04-30 11:15:28 +03:00
==
::
%pass
=/ =duct system-duct.state
2019-09-29 07:44:31 +03:00
=/ =wire p.card
2020-12-19 03:07:17 +03:00
=/ =neet q.card
?: ?=(%pyre -.neet)
%: mean
leaf/"gall: %pyre from {<agent-name>}, killing event"
leaf/"wire: {<wire>}"
tang.neet
==
2019-09-29 07:44:31 +03:00
=. wire
2021-06-28 02:47:24 +03:00
:^ %use agent-name run-nonce.yoke
2020-12-19 03:07:17 +03:00
?- -.neet
%agent [%out (scot %p ship.neet) name.neet wire]
%huck [%out (scot %p ship.neet) name.neet wire]
%arvo [(scot %p attributing.agent-routes) wire]
==
::
=/ =note-arvo
2020-12-19 03:07:17 +03:00
?- -.neet
%arvo note-arvo.neet
%huck note-arvo.neet
%agent [%g %deal [our ship.neet] [name deal]:neet]
==
2022-03-31 11:41:34 +03:00
[duct %pass wire note-arvo]~
==
2019-11-05 07:19:08 +03:00
:: +ap-breach: ship breached, so forget about them
::
++ ap-breach
|= =ship
^+ ap-core
=/ in=(list [=duct =^ship =path])
~(tap by bitt.watches.yoke)
2019-11-05 07:19:08 +03:00
|- ^+ ap-core
?^ in
=? ap-core =(ship ship.i.in)
=/ core ap-load-delete(agent-duct duct.i.in)
core(agent-duct agent-duct)
$(in t.in)
::
2021-06-26 01:11:18 +03:00
=/ out=(list [[=wire =^ship =term] ? =path nonce=@])
%+ turn ~(tap by boat.watches.yoke)
|= [key=[wire ^ship term] val=[? path]]
:- key
val(+ [+.val (~(got by beat.watches.yoke) key)])
2019-11-05 07:19:08 +03:00
|- ^+ ap-core
?~ out
ap-core
=? ap-core =(ship ship.i.out)
=/ core
=. agent-duct system-duct.state
2021-06-26 01:11:18 +03:00
=/ way
[%out (scot %p ship) term.i.out (scot %ud nonce.i.out) wire.i.out]
(ap-specific-take way %kick ~)
2019-11-05 07:19:08 +03:00
core(agent-duct agent-duct)
$(out t.out)
2019-11-04 04:35:45 +03:00
:: +ap-clog: handle %clog notification from ames
::
:: Kills subscriptions from .ship in both directions:
:: - notifies local app that subscription is dead
:: - gives remote %quit to notify subscriber ship
:: TODO: %drip local app notification for error isolation
::
++ ap-clog
|= =ship
^+ ap-core
::
=/ in=(list [=duct =^ship =path])
~(tap by bitt.watches.yoke)
2019-11-04 04:35:45 +03:00
|- ^+ ap-core
?~ in ap-core
::
=? ap-core =(ship ship.i.in)
=/ core ap-kill-up(agent-duct duct.i.in)
core(agent-duct agent-duct)
2019-11-04 04:35:45 +03:00
$(in t.in)
2019-08-29 21:44:37 +03:00
:: +ap-agent-core: agent core with current bowl and state
::
++ ap-agent-core
?> ?=(%& -.agent.yoke)
~(. p.agent.yoke ap-construct-bowl)
:: +ap-ducts-from-paths: get ducts subscribed to paths
::
++ ap-ducts-from-paths
|= [target-paths=(list path) target-ship=(unit ship)]
^- (list duct)
2020-05-08 04:12:57 +03:00
?~ target-paths
?~ target-ship
~[agent-duct]
%+ murn ~(tap by bitt.watches.yoke)
2020-05-08 04:12:57 +03:00
|= [=duct =ship =path]
^- (unit ^duct)
?: =(target-ship `ship)
`duct
~
%- zing
%+ turn target-paths
|= =path
2020-05-08 04:12:57 +03:00
(ap-ducts-from-path path target-ship)
:: +ap-ducts-from-path: get ducts subscribed to path
::
++ ap-ducts-from-path
2020-05-08 04:12:57 +03:00
|= [target-path=path target-ship=(unit ship)]
^- (list duct)
%+ murn ~(tap by bitt.watches.yoke)
|= [=duct =ship =path]
^- (unit ^duct)
2020-05-08 04:12:57 +03:00
?: ?& =(target-path path)
|(=(target-ship ~) =(target-ship `ship))
==
`duct
~
2019-08-29 21:44:37 +03:00
:: +ap-apply: apply effect.
::
++ ap-apply
|= =deal
2019-08-29 21:44:37 +03:00
^+ ap-core
?- -.deal
%watch-as (ap-subscribe-as +.deal)
%poke (ap-poke +.deal)
%watch (ap-subscribe +.deal)
%raw-poke !!
%poke-as !!
%leave ap-load-delete
2019-08-29 21:44:37 +03:00
==
:: +ap-peek: peek.
::
++ ap-peek
~/ %ap-peek
2020-04-22 13:49:23 +03:00
|= [care=term tyl=path]
2019-08-29 21:44:37 +03:00
^- (unit (unit cage))
:: take trailing mark off path for %x scrys
2019-08-29 21:44:37 +03:00
::
=^ want=mark tyl
?. ?=(%x care) [%$ tyl]
=. tyl (flop tyl)
[(head tyl) (flop (tail tyl))]
:: call the app's +on-peek, producing [~ ~] if it crashes
2019-09-25 23:19:09 +03:00
::
2019-08-29 21:44:37 +03:00
=/ peek-result=(each (unit (unit cage)) tang)
2020-04-22 13:49:23 +03:00
(ap-mule-peek |.((on-peek:ap-agent-core [care tyl])))
?: ?=(%| -.peek-result)
((slog leaf+"peek bad result" p.peek-result) [~ ~])
:: for non-%x scries, or failed %x scries, or %x results that already
:: have the requested mark, produce the result as-is
::
?. ?& ?=(%x care)
?=([~ ~ *] p.peek-result)
!=(mark p.u.u.p.peek-result)
==
p.peek-result
:: for %x scries, attempt to convert to the requested mark if needed
::
=* have p.u.u.p.peek-result
=* vase q.u.u.p.peek-result
=/ tub=(unit tube:clay)
?: =(have want) `(bake same ^vase)
=/ tuc=(unit (unit cage))
(rof ~ %cc [our q.beak.yoke da+now] /[have]/[want])
?. ?=([~ ~ *] tuc) ~
`!<(tube:clay q.u.u.tuc)
?~ tub
((slog leaf+"peek no tube from {(trip have)} to {(trip want)}" ~) ~)
=/ res (mule |.((u.tub vase)))
?: ?=(%& -.res)
``want^p.res
((slog leaf+"peek failed tube from {(trip have)} to {(trip want)}" ~) ~)
:: +ap-move: send move
::
++ ap-move
|= =(list move)
ap-core(agent-moves (weld (flop list) agent-moves))
2019-08-29 21:44:37 +03:00
:: +ap-give: return result.
::
++ ap-give
|= =gift:agent
(ap-move (ap-from-internal %give gift))
:: +ap-pass: request action.
::
++ ap-pass
|= [=path =neet]
(ap-move (ap-from-internal %pass path neet))
2019-08-29 21:44:37 +03:00
:: +ap-construct-bowl: set up bowl.
::
++ ap-construct-bowl
^- bowl
:* :* our :: host
attributing.agent-routes :: guest
agent-name :: agent
== ::
:* wex=boat.watches.yoke :: outgoing
sup=bitt.watches.yoke :: incoming
2019-08-29 21:44:37 +03:00
== ::
:* act=change.stats.yoke :: tick
eny=eny.stats.yoke :: nonce
now=time.stats.yoke :: time
byk=beak.yoke :: source
2019-08-29 21:44:37 +03:00
== ==
:: +ap-reinstall: reinstall.
::
++ ap-reinstall
~/ %ap-reinstall
|= =agent
2019-08-29 21:44:37 +03:00
^+ ap-core
2020-11-17 23:53:05 +03:00
=/ old-state=vase
?: ?=(%& -.agent.yoke)
2020-11-17 23:53:05 +03:00
on-save:ap-agent-core
p.agent.yoke
=^ error ap-core
(ap-install(agent.yoke &+agent) `old-state)
?~ error
2019-08-29 21:44:37 +03:00
ap-core
2020-06-18 06:31:37 +03:00
(mean >%load-failed< u.error)
:: +ap-subscribe-as: apply %watch-as.
2019-08-29 21:44:37 +03:00
::
++ ap-subscribe-as
2019-08-29 21:44:37 +03:00
|= [=mark =path]
^+ ap-core
=. marks.yoke (~(put by marks.yoke) agent-duct mark)
(ap-subscribe path)
2019-11-07 09:19:32 +03:00
:: +ap-subscribe: apply %watch.
2019-08-29 21:44:37 +03:00
::
++ ap-subscribe
~/ %ap-subscribe
2019-08-29 21:44:37 +03:00
|= pax=path
^+ ap-core
=/ incoming [attributing.agent-routes pax]
=. bitt.watches.yoke
(~(put by bitt.watches.yoke) agent-duct incoming)
2019-08-29 21:44:37 +03:00
=^ maybe-tang ap-core
2019-11-07 09:19:32 +03:00
%+ ap-ingest %watch-ack |.
(on-watch:ap-agent-core pax)
2019-08-29 21:44:37 +03:00
?^ maybe-tang
ap-silent-delete
ap-core
:: +ap-poke: apply %poke.
::
++ ap-poke
~/ %ap-poke
|= =cage
^+ ap-core
=^ maybe-tang ap-core
%+ ap-ingest %poke-ack |.
2019-11-07 09:19:32 +03:00
(on-poke:ap-agent-core cage)
2019-08-29 21:44:37 +03:00
ap-core
:: +ap-error: pour error.
2019-08-29 21:44:37 +03:00
::
++ ap-error
2019-08-29 21:44:37 +03:00
|= [=term =tang]
^+ ap-core
=/ form |=(=tank [%rose [~ "! " ~] tank ~])
2019-08-29 22:57:33 +03:00
=^ maybe-tang ap-core
%+ ap-ingest ~ |.
2019-11-07 09:19:32 +03:00
(on-fail:ap-agent-core term (turn tang form))
2019-08-29 21:44:37 +03:00
ap-core
:: +ap-generic-take: generic take.
::
++ ap-generic-take
~/ %ap-generic-take
|= [=wire =sign-arvo]
2019-08-29 21:44:37 +03:00
^+ ap-core
=^ maybe-tang ap-core
%+ ap-ingest ~ |.
2019-11-07 09:19:32 +03:00
(on-arvo:ap-agent-core wire sign-arvo)
2019-08-29 21:44:37 +03:00
?^ maybe-tang
(ap-error %arvo-response u.maybe-tang)
2019-08-29 21:44:37 +03:00
ap-core
:: +ap-specific-take: specific take.
::
++ ap-specific-take
|= [=wire =unto]
2019-08-29 21:44:37 +03:00
^+ ap-core
2019-09-29 07:44:31 +03:00
~| wire=wire
?> ?=([%out @ @ *] wire)
=/ other-ship (slav %p i.t.wire)
=/ other-agent i.t.t.wire
=/ =dock [other-ship other-agent]
2019-09-29 07:44:31 +03:00
=/ agent-wire t.t.t.wire
2021-06-28 02:47:24 +03:00
=/ nonce=@ 0
::
=^ =sign:agent ap-core
?. ?=(%raw-fact -.unto)
[unto ap-core]
=/ =case:clay da+now
2021-09-24 23:24:27 +03:00
?: ?=(%spider agent-name)
:- [%fact mark.unto !>(noun.unto)]
ap-core
=/ sky (rof ~ %cb [our q.beak.yoke case] /[mark.unto])
?. ?=([~ ~ *] sky)
(mean leaf+"gall: ames mark fail {<mark.unto>}" ~)
::
=+ !<(=dais:clay q.u.u.sky)
=/ res (mule |.((vale:dais noun.unto)))
?: ?=(%| -.res)
(mean leaf+"gall: ames vale fail {<mark.unto>}" p.res)
:- [%fact mark.unto p.res]
%- ap-move :_ ~
:^ hen %pass /nowhere
[%c %warp our q.beak.yoke ~ %sing %b case /[mark.unto]]
2021-06-26 01:11:18 +03:00
|^ ^+ ap-core
2021-06-28 02:47:24 +03:00
:: %poke-ack has no nonce; ingest directly
::
?: ?=(%poke-ack -.sign)
ingest-and-check-error
:: if .agent-wire matches, it's an old pre-nonce subscription
::
?: (~(has by boat.watches.yoke) sub-key)
2021-06-28 02:47:24 +03:00
run-sign
:: if an app happened to use a null wire, no-op
::
?: =(~ agent-wire)
on-missing
=/ has-nonce=(unit @ud) (slaw %ud (head agent-wire))
?: &(?=(~ has-nonce) ?=(%kick -.sign))
on-weird-kick
2021-06-28 02:47:24 +03:00
:: pop nonce off .agent-wire and match against stored subscription
::
?> ?=(^ has-nonce)
=: nonce u.has-nonce
2021-06-28 02:47:24 +03:00
agent-wire (tail agent-wire)
==
=/ got (~(get by beat.watches.yoke) sub-key)
2021-06-28 02:47:24 +03:00
?~ got
on-missing
?. =(nonce.u.got nonce)
(on-bad-nonce nonce.u.got)
run-sign
::
2022-03-31 11:41:34 +03:00
++ sub-key [agent-wire dock]
++ ingest (ap-ingest ~ |.((on-agent:ap-agent-core agent-wire sign)))
2021-06-28 02:47:24 +03:00
++ run-sign
?- -.sign
%poke-ack !!
%fact
=^ tan ap-core ingest
?~ tan ap-core
=. ap-core (ap-kill-down sub-key)
(ap-error -.sign leaf/"take %fact failed, closing subscription" u.tan)
2021-06-26 01:11:18 +03:00
::
2021-06-28 02:47:24 +03:00
%kick
=: beat.watches.yoke (~(del by beat.watches.yoke) sub-key)
boat.watches.yoke (~(del by boat.watches.yoke) sub-key)
==
2021-06-28 02:47:24 +03:00
::
ingest-and-check-error
::
%watch-ack
?. (~(has by boat.watches.yoke) sub-key)
%. ap-core
%+ trace odd.veb.bug.state :~
leaf+"{<agent-name>}: got ack for nonexistent subscription"
leaf+"{<dock>}: {<agent-wire>}"
>wire=wire<
==
=? beat.watches.yoke ?=(^ p.sign)
(~(del by beat.watches.yoke) sub-key)
::
=. boat.watches.yoke
2021-06-28 02:47:24 +03:00
?^ p.sign
(~(del by boat.watches.yoke) sub-key)
2021-06-28 02:47:24 +03:00
::
%+ ~(jab by boat.watches.yoke) sub-key
|= val=[acked=? =path]
%. val(acked &)
%^ trace &(odd.veb.bug.state acked.val)
leaf/"{<agent-name>} 2nd watch-ack on {<val>}" ~
2021-06-28 02:47:24 +03:00
::
ingest-and-check-error
==
2022-03-31 11:41:34 +03:00
::
2021-06-28 02:47:24 +03:00
++ on-missing
2021-06-26 01:11:18 +03:00
%. ap-core
%+ trace odd.veb.bug.state :~
2021-06-26 01:11:18 +03:00
leaf+"{<agent-name>}: got {<-.sign>} for nonexistent subscription"
2021-06-28 02:47:24 +03:00
leaf+"{<dock>}: {<[nonce=nonce agent-wire]>}"
2021-06-26 01:11:18 +03:00
>wire=wire<
==
2022-03-31 11:41:34 +03:00
::
++ on-weird-kick
%. run-sign
%+ trace odd.veb.bug.state :~
leaf+"{<agent-name>}: got %kick for nonexistent subscription"
leaf+"{<dock>}: {<agent-wire>}"
>wire=wire<
==
::
2021-06-28 02:47:24 +03:00
++ on-bad-nonce
|= stored-nonce=@
2021-06-26 01:11:18 +03:00
%. ap-core
%- slog :~
2021-06-28 02:47:24 +03:00
=/ nonces [expected=stored-nonce got=nonce]
2021-06-26 01:11:18 +03:00
=/ ok |(?=(?(%fact %kick) -.sign) =(~ p.sign))
leaf+"{<agent-name>}: stale %watch-ack {<nonces>} ok={<ok>}"
::
leaf+"{<dock>}: {<agent-wire>}"
>wire=wire<
==
2019-11-06 06:55:51 +03:00
::
2021-06-26 01:11:18 +03:00
++ ingest-and-check-error
^+ ap-core
=^ tan ap-core ingest
?~(tan ap-core (ap-error -.sign leaf/"take {<-.sign>} failed" u.tan))
--
2019-08-29 21:44:37 +03:00
:: +ap-install: install wrapper.
::
++ ap-install
|= old-agent-state=(unit vase)
2019-08-29 21:44:37 +03:00
^- [(unit tang) _ap-core]
::
=^ maybe-tang ap-core (ap-upgrade-state old-agent-state)
2019-08-29 21:44:37 +03:00
::
=. agent-config
2021-07-07 21:08:21 +03:00
:_ agent-config
^- (each suss tang)
?^ maybe-tang
|/u.maybe-tang
&/[agent-name ?~(old-agent-state %boot %bump) now]
2019-08-29 21:44:37 +03:00
::
[maybe-tang ap-core]
:: +ap-upgrade-state: low-level install.
2019-08-29 21:44:37 +03:00
::
++ ap-upgrade-state
~/ %ap-upgrade-state
2019-08-29 21:44:37 +03:00
|= maybe-vase=(unit vase)
^- [(unit tang) _ap-core]
::
=^ maybe-tang ap-core
%+ ap-ingest ~
?~ maybe-vase
2019-11-07 09:19:32 +03:00
|. on-init:ap-agent-core
|. (on-load:ap-agent-core u.maybe-vase)
2019-08-29 21:44:37 +03:00
[maybe-tang ap-core]
:: +ap-silent-delete: silent delete.
::
++ ap-silent-delete
^+ ap-core
::
%= ap-core
bitt.watches.yoke
(~(del by bitt.watches.yoke) agent-duct)
2019-08-29 21:44:37 +03:00
==
:: +ap-load-delete: load delete.
::
++ ap-load-delete
^+ ap-core
::
=/ maybe-incoming
(~(get by bitt.watches.yoke) agent-duct)
2019-08-29 21:44:37 +03:00
?~ maybe-incoming
ap-core
::
=/ incoming u.maybe-incoming
=. bitt.watches.yoke
(~(del by bitt.watches.yoke) agent-duct)
2019-08-29 21:44:37 +03:00
::
=^ maybe-tang ap-core
%+ ap-ingest ~ |.
2019-11-07 09:19:32 +03:00
(on-leave:ap-agent-core q.incoming)
2019-08-29 21:44:37 +03:00
?^ maybe-tang
2019-11-07 09:19:32 +03:00
(ap-error %leave u.maybe-tang)
2019-08-29 21:44:37 +03:00
ap-core
2019-09-29 07:44:31 +03:00
:: +ap-kill-up: 2-sided kill from publisher side
2019-08-29 21:44:37 +03:00
::
2019-09-29 07:44:31 +03:00
++ ap-kill-up
2019-08-29 21:44:37 +03:00
^+ ap-core
::
=> ap-load-delete
2019-11-07 09:19:32 +03:00
(ap-give %kick ~ ~)
:: +ap-kill-up-slip: 2-sided kill from publisher side by slip
::
:: +ap-kill-up is reentrant if you call it in the
:: middle of processing another deal
::
:: Should probably call +ap-error with error message
::
++ ap-kill-up-slip
|= =duct
^- (list move)
::
:~ [duct %slip %g %deal [our our] agent-name %leave ~]
[duct %give %unto %kick ~]
==
2019-09-29 07:44:31 +03:00
:: +ap-kill-down: 2-sided kill from subscriber side
::
:: Must process leave first in case kick handler rewatches.
::
2019-09-29 07:44:31 +03:00
++ ap-kill-down
|= [=wire =dock]
^+ ap-core
::
=. ap-core
(ap-pass wire %agent dock %leave ~)
2020-12-19 03:07:17 +03:00
(ap-pass wire %huck dock %b %huck `sign-arvo`[%gall %unto %kick ~])
:: +ap-mule: run virtualized with intercepted scry, preserving type
::
:: Compare +mute and +mule. Those pass through scry, which
:: doesn't allow us to catch crashes due to blocking scry. If
:: you intercept scry, you can't preserve the type
:: polymorphically. By monomorphizing, we are able to do so
:: safely.
::
++ ap-mule
|= run=_^?(|.(*step:agent))
^- (each step:agent tang)
2020-12-06 13:55:19 +03:00
=/ res (mock [run %9 2 %0 1] (look rof ~))
?- -.res
%0 [%& !<(step:agent [-:!>(*step:agent) p.res])]
%1 [%| (smyt ;;(path p.res)) ~]
%2 [%| p.res]
==
:: +ap-mule-peek: same as +ap-mule but for (unit (unit cage))
::
++ ap-mule-peek
|= run=_^?(|.(*(unit (unit cage))))
^- (each (unit (unit cage)) tang)
2020-12-06 13:55:19 +03:00
=/ res (mock [run %9 2 %0 1] (look rof ~))
?- -.res
%0 [%& !<((unit (unit cage)) [-:!>(*(unit (unit cage))) p.res])]
%1 [%| (smyt ;;(path p.res)) ~]
%2 [%| p.res]
==
2019-08-29 21:44:37 +03:00
:: +ap-ingest: call agent arm
::
:: Handle acks here because they need to be emitted before the
:: rest of the moves.
::
++ ap-ingest
2019-11-07 09:19:32 +03:00
|= [ack=?(%poke-ack %watch-ack ~) run=_^?(|.(*step:agent))]
2019-08-29 21:44:37 +03:00
^- [(unit tang) _ap-core]
=/ result (ap-mule run)
2019-11-08 03:30:45 +03:00
=^ new-moves ap-core (ap-handle-result result)
2019-08-29 21:44:37 +03:00
=/ maybe-tang=(unit tang)
?: ?=(%& -.result)
2019-08-29 21:44:37 +03:00
~
`p.result
2019-11-08 03:30:45 +03:00
=/ ack-moves=(list move)
%- zing
%- turn :_ ap-from-internal
^- (list card:agent)
2019-08-29 21:44:37 +03:00
?- ack
~ ~
2019-11-08 03:30:45 +03:00
%poke-ack [%give %poke-ack maybe-tang]~
2019-11-07 09:19:32 +03:00
%watch-ack [%give %watch-ack maybe-tang]~
2019-08-29 21:44:37 +03:00
==
::
2019-11-08 03:30:45 +03:00
=. agent-moves
:(weld (flop new-moves) ack-moves agent-moves)
2019-08-29 21:44:37 +03:00
[maybe-tang ap-core]
:: +ap-handle-result: handle result.
::
++ ap-handle-result
~/ %ap-handle-result
|= result=(each step:agent tang)
2019-11-08 03:30:45 +03:00
^- [(list move) _ap-core]
2019-08-29 21:44:37 +03:00
?: ?=(%| -.result)
`ap-core
2019-08-29 21:44:37 +03:00
::
=. agent.yoke &++.p.result
2019-11-08 03:30:45 +03:00
=/ moves (zing (turn -.p.result ap-from-internal))
=. bitt.watches.yoke
2019-11-08 03:30:45 +03:00
(ap-handle-kicks moves)
(ap-handle-peers moves)
:: +ap-handle-kicks: handle cancels of bitt.watches
2019-08-29 21:44:37 +03:00
::
2019-11-08 03:30:45 +03:00
++ ap-handle-kicks
~/ %ap-handle-kicks
|= moves=(list move)
2019-08-29 21:44:37 +03:00
^- bitt
=/ quits=(list duct)
2019-11-08 03:30:45 +03:00
%+ murn moves
|= =move
^- (unit duct)
?. ?=([* %give %unto %kick *] move)
2019-08-29 21:44:37 +03:00
~
2019-11-08 03:30:45 +03:00
`duct.move
2019-08-29 21:44:37 +03:00
::
=/ quit-map=bitt
(malt (turn quits |=(=duct [duct *[ship path]])))
(~(dif by bitt.watches.yoke) quit-map)
:: +ap-handle-peers: handle new boat.watches
2019-08-29 21:44:37 +03:00
::
++ ap-handle-peers
~/ %ap-handle-peers
2019-11-08 03:30:45 +03:00
|= moves=(list move)
^- [(list move) _ap-core]
=| new-moves=(list move)
|- ^- [(list move) _ap-core]
?~ moves
2019-11-08 03:30:45 +03:00
[(flop new-moves) ap-core]
=/ =move i.moves
2019-11-19 07:36:21 +03:00
?: ?=([* %pass * %g %deal * * %leave *] move)
2019-11-08 03:30:45 +03:00
=/ =wire p.move.move
2019-11-08 05:25:19 +03:00
?> ?=([%use @ @ %out @ @ *] wire)
=/ =dock [q.p q]:q.move.move
=/ sys-wire=^wire (scag 6 `^wire`wire)
=/ sub-wire=^wire (slag 6 `^wire`wire)
::
?. (~(has by boat.watches.yoke) sub-wire dock)
%. $(moves t.moves)
%^ trace odd.veb.bug.state
leaf/"gall: {<agent-name>} missing subscription, got %leave" ~
=/ have=[nonce=@ acked=? =path]
:- (~(got by beat.watches.yoke) sub-wire dock)
(~(got by boat.watches.yoke) sub-wire dock)
=. p.move.move
(weld sys-wire [(scot %ud nonce.have) sub-wire])
=: boat.watches.yoke (~(del by boat.watches.yoke) [sub-wire dock])
beat.watches.yoke (~(del by beat.watches.yoke) [sub-wire dock])
==
2019-11-08 03:30:45 +03:00
$(moves t.moves, new-moves [move new-moves])
?. ?=([* %pass * %g %deal * * ?(%watch %watch-as) *] move)
2019-11-08 03:30:45 +03:00
$(moves t.moves, new-moves [move new-moves])
=/ =wire p.move.move
2019-11-08 05:25:19 +03:00
?> ?=([%use @ @ %out @ @ *] wire)
2021-06-26 01:11:18 +03:00
=/ sys-wire=^wire (scag 6 `^wire`wire)
=/ sub-wire=^wire (slag 6 `^wire`wire)
=/ [=dock =deal] [[q.p q] r]:q.move.move
::
?: (~(has by boat.watches.yoke) sub-wire dock)
2019-11-05 07:19:08 +03:00
=. ap-core
=/ =tang
~[leaf+"subscribe wire not unique" >agent-name< >sub-wire< >dock<]
=/ have (~(got by boat.watches.yoke) sub-wire dock)
%- (slog >out=have< tang)
(ap-error %watch-not-unique tang) :: reentrant, maybe bad?
$(moves t.moves)
2021-06-26 01:11:18 +03:00
::
=. p.move.move
(weld sys-wire [(scot %ud sub-nonce.yoke) sub-wire])
2021-07-07 18:50:21 +03:00
%_ $
2022-03-31 11:41:34 +03:00
moves t.moves
new-moves [move new-moves]
2021-06-28 02:47:24 +03:00
sub-nonce.yoke +(sub-nonce.yoke)
2022-03-31 11:41:34 +03:00
::
boat.watches.yoke
%+ ~(put by boat.watches.yoke) [sub-wire dock]
:- acked=|
path=?+(-.deal !! %watch path.deal, %watch-as path.deal)
::
beat.watches.yoke
(~(put by beat.watches.yoke) [sub-wire dock] sub-nonce.yoke)
2021-06-26 01:11:18 +03:00
==
2019-08-29 21:44:37 +03:00
--
--
:: +call: request
::
++ call
2019-11-19 07:36:21 +03:00
~% %gall-call +> ~
2020-12-08 03:47:06 +03:00
|= [=duct dud=(unit goof) hic=(hobo task)]
2019-11-19 07:36:21 +03:00
^- [(list move) _gall-payload]
?^ dud
~|(%gall-call-dud (mean tang.u.dud))
2019-08-29 21:44:37 +03:00
::
2020-12-06 11:38:37 +03:00
~| [%gall-call-failed duct hic]
2020-12-08 03:47:06 +03:00
=/ =task ((harden task) hic)
2019-08-29 21:44:37 +03:00
::
=/ mo-core (mo-abed:mo duct)
2019-08-29 21:44:37 +03:00
?- -.task
%deal
=/ [=sock =term =deal] [p q r]:task
2019-08-29 21:44:37 +03:00
?. =(q.sock our)
?> =(p.sock our)
mo-abet:(mo-send-foreign-request:mo-core q.sock term deal)
mo-abet:(mo-handle-local:mo-core p.sock term deal)
2019-08-29 21:44:37 +03:00
::
%init [~ gall-payload(system-duct.state duct)]
%plea
=/ =ship ship.task
2019-11-01 22:06:09 +03:00
=/ =path path.plea.task
=/ =noun payload.plea.task
2019-08-29 21:44:37 +03:00
::
~| [ship=ship plea-path=path]
?> ?=([%ge @ ~] path)
2019-08-29 21:44:37 +03:00
=/ agent-name i.t.path
::
=+ ;;(=ames-request-all noun)
?> ?=(%0 -.ames-request-all)
=> (mo-handle-ames-request:mo-core ship agent-name +.ames-request-all)
2019-08-29 21:44:37 +03:00
mo-abet
::
%sear mo-abet:(mo-filter-queue:mo-core ship.task)
%jolt mo-abet:(mo-jolt:mo-core dude.task our desk.task)
%idle mo-abet:(mo-idle:mo-core dude.task)
%nuke mo-abet:(mo-nuke:mo-core dude.task)
%spew mo-abet:(mo-spew:mo-core veb.task)
%sift mo-abet:(mo-sift:mo-core dudes.task)
%trim [~ gall-payload]
%vega [~ gall-payload]
2019-08-29 21:44:37 +03:00
==
2020-05-14 14:24:44 +03:00
:: +load: recreate vane; note, only valid if called from pupa
2019-08-29 21:44:37 +03:00
::
2020-05-14 14:24:44 +03:00
++ load !!
2019-08-29 21:44:37 +03:00
:: +scry: standard scry
::
++ scry
2019-11-19 07:36:21 +03:00
~/ %gall-scry
2020-12-08 00:52:12 +03:00
^- roon
|= [lyc=gang care=term bem=beam]
2019-08-29 21:44:37 +03:00
^- (unit (unit cage))
2020-11-24 00:06:50 +03:00
=/ =shop &/p.bem
=* dap q.bem
=/ =coin $/r.bem
=* path s.bem
::
2019-08-29 21:44:37 +03:00
?. ?=(%.y -.shop)
~
=/ =ship p.shop
2020-05-07 11:51:08 +03:00
?: &(=(care %$) =(path /whey))
=/ blocked
=/ queued (~(run by blocked.state) |=((qeu blocked-move) [%.y +<]))
(sort ~(tap by queued) aor)
::
=/ running
=/ active (~(run by yokes.state) |=(yoke [%.y +<]))
(sort ~(tap by active) aor)
::
=/ maz=(list mass)
:~ [%foreign %.y contacts.state]
[%blocked %.n blocked]
[%active %.n running]
==
``mass+!>(maz)
::
?: ?& =(%u care)
2019-08-29 21:44:37 +03:00
=(~ path)
=([%$ %da now] coin)
=(our ship)
==
=; hav=?
[~ ~ noun+!>(hav)]
=/ yok=(unit yoke) (~(get by yokes.state) dap)
?~(yok | -.agent.u.yok)
2019-08-29 21:44:37 +03:00
::
?: ?& =(%d care)
=(~ path)
=([%$ %da now] coin)
=(our ship)
==
=/ yok=(unit yoke) (~(get by yokes.state) dap)
?~ yok
[~ ~]
[~ ~ desk+!>(q.beak.u.yok)]
::
2021-07-02 03:33:43 +03:00
?: ?& =(%e care)
=(~ path)
=([%$ %da now] coin)
=(our ship)
==
:+ ~ ~
:- %apps !> ^- (set [=dude live=?])
2021-07-02 03:33:43 +03:00
=* syd=desk dap
%+ roll ~(tap by yokes.state)
|= [[=dude =yoke] acc=(set [=dude live=?])]
2021-07-02 03:33:43 +03:00
?. =(syd q.beak.yoke)
acc
(~(put in acc) [dude -.agent.yoke])
2021-07-02 03:33:43 +03:00
::
2019-08-29 21:44:37 +03:00
?. =(our ship)
~
?. =([%$ %da now] coin)
~
?. (~(has by yokes.state) dap)
[~ ~]
2019-08-29 21:44:37 +03:00
?. ?=(^ path)
~
=/ =routes [~ ship]
(mo-peek:mo dap routes care path)
:: +stay: save without cache; suspend non-%base agents
::
:: TODO: superfluous? see +molt
2019-08-29 21:44:37 +03:00
::
2020-05-14 14:24:44 +03:00
++ stay
^- spore
2021-09-22 23:34:20 +03:00
=; eggs=(map term egg) state(yokes eggs)
2020-05-14 14:24:44 +03:00
%- ~(run by yokes.state)
|= =yoke
2020-11-17 23:53:05 +03:00
^- egg
%= yoke
agent
?: ?=(%| -.agent.yoke)
[%| p.agent.yoke]
?: =(%base q.beak.yoke)
2020-11-17 23:53:05 +03:00
[%& on-save:p.agent.yoke]
2021-07-16 05:22:31 +03:00
[%| on-save:p.agent.yoke]
2020-11-17 23:53:05 +03:00
==
2019-08-29 21:44:37 +03:00
:: +take: response
::
++ take
2019-11-19 07:36:21 +03:00
~/ %gall-take
2020-12-06 11:38:37 +03:00
|= [=wire =duct dud=(unit goof) syn=sign-arvo]
2019-11-19 07:36:21 +03:00
^- [(list move) _gall-payload]
?^ dud
2020-04-24 07:13:19 +03:00
~&(%gall-take-dud ((slog tang.u.dud) [~ gall-payload]))
2020-04-30 11:15:28 +03:00
?: =(/nowhere wire)
[~ gall-payload]
2021-07-21 11:55:21 +03:00
?: =(/clear-huck wire)
=/ =gift ?>(?=([%behn %heck %gall *] syn) +>+.syn)
[[duct %give gift]~ gall-payload]
2019-08-29 21:44:37 +03:00
::
2019-11-19 07:36:21 +03:00
~| [%gall-take-failed wire]
2019-08-29 21:44:37 +03:00
?> ?=([?(%sys %use) *] wire)
2020-07-08 09:08:27 +03:00
=< mo-abet
2020-12-08 03:22:26 +03:00
%. [t.wire ?:(?=([%behn %heck *] syn) syn.syn syn)]
2020-07-08 09:08:27 +03:00
?- i.wire
%sys mo-handle-sys:(mo-abed:mo duct)
%use mo-handle-use:(mo-abed:mo duct)
==
2019-08-29 21:44:37 +03:00
--