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

2870 lines
70 KiB
Plaintext
Raw Normal View History

!: :: %gall, agent execution
2016-11-24 07:25:07 +03:00
!? 163
!:
2016-11-24 07:25:07 +03:00
::::
|= pit=vase
=, gall
2015-05-10 01:55:05 +03:00
=> =~
2019-05-05 03:23:22 +03:00
::
:: (rest of arvo)
::
|%
::
:: +internal-gift: synonym for +cuft.
::
++ internal-gift cuft
::
:: +internal-task: synonym for +cush.
::
++ internal-task cush
::
:: +agent-action: synonym for +club.
::
++ agent-action club
::
2019-05-05 03:23:22 +03:00
:: +coke: cook.
::
++ coke
$? %inn
%out
%cay
==
::
:: +volt: voltage.
::
++ volt ?(%low %high)
::
:: +security-control: security control.
2019-05-05 03:23:22 +03:00
::
++ security-control $@(?(%iron %gold) [%lead p=ship])
2019-05-05 03:23:22 +03:00
::
:: +reverse-ames: reverse ames message.
2019-05-05 03:23:22 +03:00
::
++ reverse-ames
2019-05-05 03:23:22 +03:00
$%
:: diff
2019-05-05 03:23:22 +03:00
::
[action=%d p=mark q=*]
:: etc.
::
[action=%x ~]
2019-05-05 03:23:22 +03:00
==
::
:: +forward-ames: forward ames message.
2019-05-05 03:23:22 +03:00
::
++ forward-ames
2019-05-05 03:23:22 +03:00
$%
:: message
::
[action=%m mark=mark noun=*]
2019-05-05 03:23:22 +03:00
:: "peel" subscribe
::
[action=%l mark=mark path=path]
2019-05-05 03:23:22 +03:00
:: subscribe
::
[action=%s path=path]
2019-05-05 03:23:22 +03:00
:: cancel+unsubscribe
::
[action=%u ~]
2019-05-05 03:23:22 +03:00
==
::
:: +foreign-response: foreign response.
2019-05-05 03:23:22 +03:00
::
++ foreign-response
2019-05-05 03:23:22 +03:00
$? %peer
%peel
%poke
%pull
==
--
::
:: (local arvo)
::
|%
::
:: +internal-note: +ap note.
2019-05-05 03:23:22 +03:00
::
++ internal-note
$% [task=%meta =term =vase]
[task=%send =ship =internal-task]
2019-05-05 03:23:22 +03:00
==
::
2019-06-27 07:08:07 +03:00
:: +internal-move: agent-level move.
::
:: Analogous to an Arvo move, except these are routed by bone, instead of
:: duct.
2019-05-05 03:23:22 +03:00
::
++ internal-move
$:
=bone
move=(wind internal-note internal-gift)
==
2019-05-05 03:23:22 +03:00
::
2019-06-27 07:08:07 +03:00
:: +move: Arvo-level move.
2019-05-05 03:23:22 +03:00
::
++ move (pair duct (wind note-arvo gift-arvo))
--
::
:: (%gall state)
::
|%
::
:: +gall-old: upgrade path.
2019-05-05 03:23:22 +03:00
::
++ gall-old ?(gall)
2019-05-05 03:23:22 +03:00
::
:: +gall: all state.
2019-05-05 03:23:22 +03:00
::
++ gall
2019-05-05 03:23:22 +03:00
$:
:: state version
::
%0
:: agents by ship
2019-05-05 03:23:22 +03:00
::
=agents
2019-05-05 03:23:22 +03:00
==
::
2019-05-30 05:24:24 +03:00
:: +subscribers: subscriber data.
2019-05-05 03:23:22 +03:00
::
2019-05-30 05:24:24 +03:00
++ subscribers
2019-05-05 03:23:22 +03:00
$:
:: incoming subscribers
::
incoming=bitt
2019-05-05 03:23:22 +03:00
:: outgoing subscribers
::
outgoing=boat
2019-05-05 03:23:22 +03:00
:: queue meter
::
meter=(map bone @ud)
2019-05-05 03:23:22 +03:00
==
::
:: +agents: ship state.
2019-05-05 03:23:22 +03:00
::
++ agents
2019-05-05 03:23:22 +03:00
$:
:: (deprecated)
::
mak=*
:: system duct
::
system-duct=duct
2019-05-05 03:23:22 +03:00
:: foreign contacts
::
contacts=(map ship foreign)
2019-05-05 03:23:22 +03:00
:: running agents
::
running=(map term agent)
2019-05-05 03:23:22 +03:00
:: waiting queue
::
2019-06-26 00:25:03 +03:00
blocked=(map term blocked)
2019-05-05 03:23:22 +03:00
==
::
:: +routes: new cuff.
2019-05-05 03:23:22 +03:00
::
++ routes
2019-05-05 03:23:22 +03:00
$:
:: disclosing to
::
disclosing=(unit (set ship))
2019-05-05 03:23:22 +03:00
:: attributed to
::
attributing=ship
2019-05-05 03:23:22 +03:00
==
::
:: +privilege: privilege.
2019-05-05 03:23:22 +03:00
::
++ privilege
$:
:: voltage
::
=volt
:: routes
::
=routes
==
2019-05-05 03:23:22 +03:00
::
:: +foreign: foreign connections.
2019-05-05 03:23:22 +03:00
::
++ foreign
2019-05-05 03:23:22 +03:00
$:
:: index
::
index=@ud
2019-05-05 03:23:22 +03:00
:: by duct
::
index-map=(map duct @ud)
2019-05-05 03:23:22 +03:00
:: by index
::
duct-map=(map @ud duct)
2019-05-05 03:23:22 +03:00
==
::
2019-05-29 10:46:55 +03:00
:: +ducts: opaque input.
2019-05-05 03:23:22 +03:00
::
2019-05-29 10:46:55 +03:00
++ ducts
2019-05-05 03:23:22 +03:00
$:
:: bone sequence
::
bone=@ud
2019-05-05 03:23:22 +03:00
:: by duct
::
bone-map=(map duct bone)
2019-05-05 03:23:22 +03:00
:: by bone
::
duct-map=(map bone duct)
2019-05-05 03:23:22 +03:00
==
::
:: +misvale-data: subscribers with bad marks.
::
:: XX a hack, required to break a subscription loop
:: which arises when an invalid mark crashes a diff.
:: See usage in ap-misvale.
::
++ misvale-data (set wire)
::
:: +agent: agent state.
2019-05-05 03:23:22 +03:00
::
++ agent
2019-05-05 03:23:22 +03:00
$:
:: bad reqs
::
misvale=misvale-data
:: cache
::
cache=worm
2019-05-13 10:40:50 +03:00
:: ap-find-arm cache
2019-05-05 03:23:22 +03:00
::
2019-05-13 10:40:50 +03:00
arm-cache=(map [term path] (unit (pair @ud term)))
2019-05-05 03:23:22 +03:00
:: control duct
::
control-duct=duct
2019-05-05 03:23:22 +03:00
:: unstopped
::
live=?
2019-05-05 03:23:22 +03:00
:: privilege
::
privilege=security-control
2019-05-05 03:23:22 +03:00
:: statistics
::
stats=stats
2019-05-05 03:23:22 +03:00
:: subscribers
::
2019-05-30 05:24:24 +03:00
subscribers=subscribers
2019-05-05 03:23:22 +03:00
:: running state
::
running-state=vase
2019-05-05 03:23:22 +03:00
:: update control
::
beak=beak
2019-05-05 03:23:22 +03:00
:: req'd translations
::
required-trans=(map bone mark)
2019-05-05 03:23:22 +03:00
:: opaque ducts
::
2019-05-29 10:46:55 +03:00
ducts=ducts
2019-05-05 03:23:22 +03:00
==
::
2019-05-29 10:46:55 +03:00
:: +blocked: blocked tasks.
2019-05-05 03:23:22 +03:00
::
++ blocked (qeu (trel duct privilege agent-action))
2019-05-05 03:23:22 +03:00
::
:: +stats: statistics.
2019-05-05 03:23:22 +03:00
::
++ stats
2019-05-05 03:23:22 +03:00
$:
:: change number
::
change=@ud
2019-05-05 03:23:22 +03:00
:: entropy
::
eny=@uvJ
:: time
::
time=@da
2019-05-05 03:23:22 +03:00
==
--
::
:: (vane header)
::
2016-11-24 07:25:07 +03:00
. ==
2019-05-05 03:23:22 +03:00
::
:: (all vane state)
::
=| =gall
2019-05-05 03:23:22 +03:00
|= $:
:: identity
::
our=ship
:: urban time
::
now=@da
:: entropy
::
eny=@uvJ
:: activate
::
ska=sley
==
::
:: (opaque core)
::
2016-11-24 07:25:07 +03:00
~% %gall-top ..is ~
2019-04-27 09:08:29 +03:00
::
2019-05-05 03:23:22 +03:00
:: (state machine)
2019-04-27 09:08:29 +03:00
::
|%
::
2019-05-03 01:53:27 +03:00
:: +gall-payload: gall payload.
::
++ gall-payload +
::
2019-06-12 14:25:49 +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.
::
2016-11-24 07:25:07 +03:00
++ mo
2018-12-13 04:34:25 +03:00
~% %gall-mo +> ~
2019-04-11 23:09:44 +03:00
::
2019-05-05 03:23:22 +03:00
|_
$:
hen=duct
moves=(list move)
==
2019-04-11 23:13:17 +03:00
::
++ mo-state .
::
2019-06-12 14:25:49 +03:00
:: +mo-abed: initialise state with the provided duct.
2019-04-11 23:13:17 +03:00
::
++ mo-abed
2018-12-13 04:34:25 +03:00
|= =duct
2019-04-11 23:16:24 +03:00
^+ mo-state
::
mo-state(hen duct)
2016-11-24 07:25:07 +03:00
::
2019-04-11 23:16:24 +03:00
:: +mo-abet: resolve moves.
::
++ mo-abet
2019-05-03 01:53:27 +03:00
^- [(list move) _gall-payload]
2019-04-11 23:16:24 +03:00
::
2019-04-25 20:39:32 +03:00
=/ resolved (flop moves)
2019-05-03 01:53:27 +03:00
[resolved gall-payload]
2016-11-24 07:25:07 +03:00
::
2019-06-27 07:08:07 +03:00
:: +mo-boot: ask %ford to build us a core for the specified agent.
2019-05-13 10:40:50 +03:00
::
++ mo-boot
|= [=term =ship =desk]
^+ mo-state
::
=/ =case [%da now]
::
=/ =path
=/ ship (scot %p ship)
=/ case (scot case)
/sys/core/[term]/[ship]/[desk]/[case]
::
=/ =note-arvo
2019-06-12 14:25:49 +03:00
=/ =schematic:ford [%core [ship desk] /hoon/[term]/app]
[%f %build live=%.y schematic]
::
=/ pass [path note-arvo]
(mo-pass pass)
::
2019-06-12 14:25:49 +03:00
:: +mo-pass: prepend a standard %pass move to the current list of moves.
::
++ mo-pass
|= pass=(pair path note-arvo)
^+ mo-state
::
=/ =move [hen [%pass pass]]
mo-state(moves [move moves])
::
2019-06-12 14:25:49 +03:00
:: +mo-give: prepend a standard %give move to the current list of moves.
2016-11-24 07:25:07 +03:00
::
++ mo-give
2019-04-25 20:39:32 +03:00
|= =gift:able
^+ mo-state
::
=/ =move [hen [%give gift]]
mo-state(moves [move moves])
2016-11-24 07:25:07 +03:00
::
2019-06-12 14:25:49 +03:00
:: +mo-contains-valid-bowl: check that a vase contains a valid bowl.
::
:: The vase is expected to contain a bowl at +12, so we just check that the
:: type of the thing there nests under that of bowl.
::
2019-05-13 10:40:50 +03:00
++ mo-contains-valid-bowl
~/ %mo-contains-valid-bowl
|= =vase
2016-11-24 07:25:07 +03:00
^- ?
::
2019-05-13 10:40:50 +03:00
=/ inferred -:!>(*bowl)
=/ maybe-vase (slew 12 vase)
2019-05-13 10:40:50 +03:00
::
?~ maybe-vase
%.n
=/ =type p.u.maybe-vase
2019-05-13 10:40:50 +03:00
(~(nest ut type) %.n inferred)
2016-11-24 07:25:07 +03:00
::
2019-06-26 00:25:03 +03:00
:: +mo-receive-core: receives an app core built by %ford.
2019-06-12 14:25:49 +03:00
::
:: Presuming we receive a good core, we first check to see if the agent
:: is already running. If so, we update its beak in %gall's state,
:: 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 got
:: from ford, add it to the collection of agents %gall is keeping track of,
:: and then do more or less the same procedure as we did for the running
:: agent case.
::
2019-06-26 00:25:03 +03:00
++ mo-receive-core
~/ %mo-receive-core
|= [=term =beak =made-result:ford]
^+ mo-state
::
?: ?=([%incomplete *] made-result)
(mo-give %onto %.n tang.made-result)
::
=/ build-result build-result.made-result
::
?: ?=([%error *] build-result)
(mo-give %onto %.n message.build-result)
::
=/ =cage (result-to-cage:ford build-result)
=/ result-vase q.cage
::
2019-06-12 14:25:49 +03:00
=/ maybe-agent=(unit agent)
(~(get by running.agents.gall) term)
::
2019-06-12 14:25:49 +03:00
?^ maybe-agent
=/ agent u.maybe-agent(beak beak)
::
=. running.agents.gall
2019-06-12 14:25:49 +03:00
(~(put by running.agents.gall) term agent)
::
=/ =privilege
=/ =routes [disclosing=~ attributing=our]
[%high routes]
::
=/ app (ap-abed:ap term privilege)
=. app (ap-reinstall:app result-vase)
ap-abet:app
::
2019-05-13 10:40:50 +03:00
?. (mo-contains-valid-bowl result-vase)
=/ err [[%leaf "{<term>}: bogus core"] ~]
2019-04-27 07:54:35 +03:00
(mo-give %onto %.n err)
::
=. mo-state (mo-new-agent term beak result-vase)
::
=/ old mo-state
2019-04-27 07:54:35 +03:00
::
=/ wag
=/ =routes [disclosing=~ attributing=our]
=/ =privilege [%high routes]
=/ app (ap-abed:ap term privilege)
(ap-prep:app ~)
::
=/ maybe-tang -.wag
=/ app +.wag
::
?^ maybe-tang
=. mo-state old
(mo-give %onto %.n u.maybe-tang)
2019-04-27 07:54:35 +03:00
::
=. mo-state ap-abet:app
=. mo-state (mo-clear-queue term)
2019-04-27 07:54:35 +03:00
::
2019-05-29 10:46:55 +03:00
=/ =suss [term %boot now]
(mo-give %onto [%.y suss])
2016-11-24 07:25:07 +03:00
::
2019-06-12 14:25:49 +03:00
:: +mo-new-agent: create a new agent and add it to %gall's state.
::
:: %gall maintains a collection of running agents. This gate creates a
:: new one with the provided name, beak, and state (held in a vase).
::
2019-05-13 10:40:50 +03:00
++ mo-new-agent
|= [=term =beak =vase]
^+ mo-state
::
2019-05-29 10:46:55 +03:00
=/ =ducts
:+ bone=1
bone-map=[[[~ ~] 0] ~ ~]
duct-map=[[0 [~ ~]] ~ ~]
::
=/ agent
=/ default-agent *agent
%_ default-agent
control-duct hen
beak beak
running-state vase
2019-05-29 10:46:55 +03:00
ducts ducts
2016-11-24 07:25:07 +03:00
==
::
2019-06-12 14:25:49 +03:00
%_ mo-state
running.agents.gall (~(put by running.agents.gall) term agent)
==
::
2019-06-12 14:25:49 +03:00
:: +mo-handle-foreign-request: handle a foreign request.
::
:: Handles tasks received on a +call that have come from another ship.
2016-11-24 07:25:07 +03:00
::
2019-05-13 10:40:50 +03:00
++ mo-handle-foreign-request
~/ %mo-handle-foreign-request
|= [=ship =internal-task]
^+ mo-state
::
=/ =term p.internal-task
=/ =agent-action q.internal-task
2019-04-27 07:54:35 +03:00
::
?: ?=(%pump -.agent-action)
2016-11-24 07:25:07 +03:00
::
:: you'd think this would send an ack for the diff
:: that caused this pump. it would, but we already
2019-05-13 10:40:50 +03:00
:: sent it when we got the diff in +mo-handle-sys. then
2016-11-24 07:25:07 +03:00
:: we'd have to save the network duct and connect it
:: to this returning pump.
::
mo-state
::
?: ?=(%peer-not -.agent-action)
=/ =tang p.agent-action
(mo-give %unto %reap (some tang))
::
2019-05-13 10:40:50 +03:00
=^ bone mo-state (mo-assign-bone ship)
::
=/ =forward-ames
?- -.agent-action
%poke [%m p.p.agent-action q.q.p.agent-action]
%pull [%u ~]
%puff !!
%punk !!
%peel [%l agent-action]
%peer [%s p.agent-action]
==
::
=/ sys-path
=/ action -.agent-action
/sys/way/[action]
::
=/ =note-arvo
=/ =path /g/ge/[term]
2019-05-13 10:40:50 +03:00
=/ =noun [bone forward-ames]
[%a %want ship path noun]
::
(mo-pass sys-path note-arvo)
2016-11-24 07:25:07 +03:00
::
2019-05-13 10:40:50 +03:00
:: +mo-handle-foreign-response: handle foreign response.
2016-11-24 07:25:07 +03:00
::
2019-06-12 14:25:49 +03:00
:: Handle a received %woot from %ames.
::
2019-05-13 10:40:50 +03:00
++ mo-handle-foreign-response
|= [=foreign-response art=(unit ares)]
^+ mo-state
::
=/ =ares
=/ tanks [%blank ~]
=/ tang (some tanks)
(fall art tang)
::
=/ to-tang
|= ars=(pair term tang)
^- tang
=/ tape (trip p.ars)
[[%leaf tape] q.ars]
::
=/ result (bind ares to-tang)
::
?- foreign-response
%peel (mo-give %unto %reap result)
%peer (mo-give %unto %reap result)
%poke (mo-give %unto %coup result)
%pull mo-state
2016-11-24 07:25:07 +03:00
==
::
2019-06-12 14:25:49 +03:00
:: +mo-assign-bone: assign an out bone to a ship.
::
:: If we know about the ship, we simply use its existing bone. Otherwise
:: we register a new entry for the ship, and use a default bone for it.
::
2019-05-13 10:40:50 +03:00
++ mo-assign-bone
|= =ship
2019-04-27 07:54:35 +03:00
^- [bone _mo-state]
::
=/ =foreign
=/ existing (~(get by contacts.agents.gall) ship)
(fall existing [1 ~ ~])
::
=/ existing (~(get by index-map.foreign) hen)
::
?^ existing
[u.existing mo-state]
::
=/ index index.foreign
::
2019-05-13 10:40:50 +03:00
=/ contacts
=/ new-foreign
%_ foreign
index +(index)
index-map (~(put by index-map.foreign) hen index)
duct-map (~(put by duct-map.foreign) index hen)
==
(~(put by contacts.agents.gall) ship new-foreign)
::
2019-06-12 14:25:49 +03:00
=/ next mo-state(contacts.agents.gall contacts)
2019-04-27 07:54:35 +03:00
[index next]
2015-05-10 01:55:05 +03:00
::
2019-06-12 14:25:49 +03:00
:: +mo-retrieve-duct: retrieve a duct by index.
::
2019-06-12 14:25:49 +03:00
++ mo-retrieve-duct
|= [=ship index=@ud]
2015-05-10 01:55:05 +03:00
^- duct
::
=/ =foreign (~(got by contacts.agents.gall) ship)
(~(got by duct-map.foreign) index)
2015-05-10 01:55:05 +03:00
::
2019-06-26 00:25:03 +03:00
:: +mo-handle-sys: handle a +sign incoming over /sys.
::
2019-06-27 07:08:07 +03:00
:: Note that /sys implies the +sign should be routed to a vane.
::
2019-06-26 00:25:03 +03:00
++ mo-handle-sys
~/ %mo-handle-sys
|= [=path =sign-arvo]
^+ mo-state
::
?+ -.path !!
%core (mo-handle-sys-core path sign-arvo)
%pel (mo-handle-sys-pel path sign-arvo)
%red (mo-handle-sys-red path sign-arvo)
%rep (mo-handle-sys-rep path sign-arvo)
%req (mo-handle-sys-req path sign-arvo)
%val (mo-handle-sys-val path sign-arvo)
%way (mo-handle-sys-way path sign-arvo)
==
::
2019-06-12 14:25:49 +03:00
:: +mo-handle-sys-core: receive a core from %ford.
::
2019-05-13 10:40:50 +03:00
++ mo-handle-sys-core
|= [=path =sign-arvo]
^+ mo-state
::
?> ?=([%f %made *] sign-arvo)
?> ?=([@ @ @ @ @ ~] path)
::
2019-04-24 21:49:51 +03:00
=/ beak-path t.t.path
::
=/ =beak
=/ =ship (slav %p i.beak-path)
=/ =desk i.t.beak-path
=/ =case [%da (slav %da i.t.t.beak-path)]
2019-05-13 10:40:50 +03:00
[ship desk case]
::
2019-06-26 00:25:03 +03:00
(mo-receive-core i.t.path beak result.sign-arvo)
::
2019-05-13 10:40:50 +03:00
:: +mo-handle-sys-pel: translated peer.
::
2019-06-27 07:08:07 +03:00
:: Validates a received %ford result and %gives an internal %diff.
2019-06-12 14:25:49 +03:00
::
2019-05-13 10:40:50 +03:00
++ mo-handle-sys-pel
|= [=path =sign-arvo]
^+ mo-state
::
?> ?=([%f %made *] sign-arvo)
?> ?=([@ @ ~] path)
::
?: ?=([%incomplete *] result.sign-arvo)
=/ err (some tang.result.sign-arvo)
(mo-give %unto %coup err)
::
=/ build-result build-result.result.sign-arvo
::
?: ?=([%error *] build-result)
=/ err (some message.build-result)
(mo-give %unto %coup err)
::
=/ =cage (result-to-cage:ford build-result)
(mo-give %unto %diff cage)
::
2019-05-13 10:40:50 +03:00
:: +mo-handle-sys-red: diff ack.
::
2019-06-27 07:08:07 +03:00
:: On receipt of a valid +sign from %ames, it simply passes a %pump
:: acknowledgement internally; otherwise it passes both an internal
:: unsubscribing %pull, plus a %want to %ames, before complaining about a
:: bad message acknowledgment.
2019-06-12 14:25:49 +03:00
::
2019-05-13 10:40:50 +03:00
++ mo-handle-sys-red
|= [=path =sign-arvo]
^+ mo-state
::
?> ?=([@ @ @ @ ~] path)
::
?. ?=([%a %woot *] sign-arvo)
~& [%red-want path]
mo-state
::
=/ him (slav %p i.t.path)
=/ dap i.t.t.path
=/ num (slav %ud i.t.t.t.path)
::
2019-04-27 07:54:35 +03:00
=/ =coop q.+>.sign-arvo
::
=/ sys-path
=/ pax [%req t.path]
[%sys pax]
::
2019-04-27 07:54:35 +03:00
?~ coop
2019-05-13 10:40:50 +03:00
=/ =note-arvo
=/ =sock [him our]
2019-06-12 14:25:49 +03:00
=/ =internal-task [dap %pump ~]
=/ =task:able [%deal sock internal-task]
2019-05-13 10:40:50 +03:00
[%g task]
(mo-pass sys-path note-arvo)
::
2019-05-13 10:40:50 +03:00
=/ gall-move=note-arvo
=/ =sock [him our]
2019-06-12 14:25:49 +03:00
=/ =internal-task [dap %pull ~]
=/ =task:able [%deal sock internal-task]
2019-05-13 10:40:50 +03:00
[%g task]
::
=/ ames-move=note-arvo
=/ path [%g %gh dap ~]
=/ =noun [num %x ~]
=/ =task:able:ames [%want him path noun]
[%a task]
::
=. mo-state (mo-pass sys-path gall-move)
=. mo-state (mo-pass sys-path ames-move)
::
2019-04-27 07:54:35 +03:00
?. ?=([~ ~ %mack *] coop)
~& [%diff-bad-ack coop]
mo-state
2019-05-13 10:40:50 +03:00
::
~& [%diff-bad-ack %mack]
=/ print (slog (flop q.,.+>.coop))
(print mo-state)
::
2019-05-13 10:40:50 +03:00
:: +mo-handle-sys-rep: reverse request.
::
2019-06-12 14:25:49 +03:00
:: On receipt of a valid +sign from %ford, sets state to the appropriate
:: duct and gives an internal %diff containing the +sign payload.
::
2019-05-13 10:40:50 +03:00
++ mo-handle-sys-rep
|= [=path =sign-arvo]
^+ mo-state
::
?> ?=([@ @ @ @ ~] path)
?> ?=([%f %made *] sign-arvo)
::
=/ him (slav %p i.t.path)
=/ dap i.t.t.path
=/ num (slav %ud i.t.t.t.path)
::
?: ?=([%incomplete *] result.sign-arvo)
=/ err (some tang.result.sign-arvo)
(mo-give %mack err)
::
=/ build-result build-result.result.sign-arvo
::
?: ?=([%error *] build-result)
:: XX should crash
=/ err (some message.build-result)
(mo-give %mack err)
::
:: XX pump should ack
=. mo-state (mo-give %mack ~)
::
2019-06-12 14:25:49 +03:00
=/ duct (mo-retrieve-duct him num)
::
=. mo-state (mo-abed duct)
::
=/ =cage (result-to-cage:ford build-result)
=/ move [%unto [%diff cage]]
::
(mo-give move)
::
2019-06-27 07:08:07 +03:00
:: +mo-handle-sys-req: process an inbound request.
2019-06-12 14:25:49 +03:00
::
2019-05-13 10:40:50 +03:00
++ mo-handle-sys-req
|= [=path =sign-arvo]
^+ mo-state
::
?> ?=([@ @ @ @ ~] path)
::
=/ him (slav %p i.t.path)
=/ dap i.t.t.path
=/ num (slav %ud i.t.t.t.path)
::
?: ?=([%f %made *] sign-arvo)
?: ?=([%incomplete *] result.sign-arvo)
=/ err (some tang.result.sign-arvo)
(mo-give %mack err)
::
=/ build-result build-result.result.sign-arvo
::
?: ?=([%error *] build-result)
=/ err (some message.build-result)
(mo-give %mack err)
::
=/ sys-path [%sys path]
2019-06-27 07:08:07 +03:00
=/ =note-arvo
=/ =cage (result-to-cage:ford build-result)
[%g %deal [him our] i.t.t.path %poke cage]
::
(mo-pass sys-path note-arvo)
::
?: ?=([%a %woot *] sign-arvo)
mo-state
::
?> ?=([%g %unto *] sign-arvo)
::
=/ =internal-gift +>.sign-arvo
::
?- -.internal-gift
::
%coup
::
(mo-give %mack p.internal-gift)
::
%diff
::
=/ sys-path [%sys %red t.path]
=/ =note-arvo
=/ path [%g %gh dap ~]
=/ noun [num %d p.p.internal-gift q.q.p.internal-gift]
[%a %want him path noun]
::
(mo-pass sys-path note-arvo)
::
%quit
::
=/ sys-path [%sys path]
=/ =note-arvo
=/ path [%g %gh dap ~]
=/ noun [num %x ~]
[%a %want him path noun]
::
(mo-pass sys-path note-arvo)
::
%reap
::
(mo-give %mack p.internal-gift)
::
%http-response
::
!!
==
::
2019-05-13 10:40:50 +03:00
:: +mo-handle-sys-val: inbound validate.
::
2019-06-12 14:25:49 +03:00
:: Validates an incoming +sign from %ford and applies it to the specified
:: agent.
::
2019-05-13 10:40:50 +03:00
++ mo-handle-sys-val
|= [=path =sign-arvo]
^+ mo-state
2016-11-24 07:25:07 +03:00
::
?> ?=([%f %made *] sign-arvo)
?> ?=([@ @ @ ~] path)
::
=/ =ship (slav %p i.t.path)
=/ =term i.t.t.path
::
?: ?=([%incomplete *] result.sign-arvo)
=/ err (some tang.result.sign-arvo)
(mo-give %unto %coup err)
::
=/ build-result build-result.result.sign-arvo
::
?: ?=([%error *] build-result)
=/ err (some message.build-result)
(mo-give %unto %coup err)
::
=/ =privilege
=/ =routes [disclosing=~ attributing=ship]
[%high routes]
::
=/ =cage (result-to-cage:ford build-result)
=/ =agent-action [%poke cage]
(mo-apply term privilege agent-action)
::
2019-05-13 10:40:50 +03:00
:: +mo-handle-sys-way: outbound request.
::
2019-05-13 10:40:50 +03:00
++ mo-handle-sys-way
|= [=path =sign-arvo]
^+ mo-state
::
?> ?=([%a %woot *] sign-arvo)
?> ?=([@ @ ~] path)
::
=/ =foreign-response (foreign-response i.t.path)
2019-06-12 14:25:49 +03:00
=/ maybe-ares +>+.sign-arvo
::
2019-06-12 14:25:49 +03:00
(mo-handle-foreign-response foreign-response maybe-ares)
::
2019-06-12 14:25:49 +03:00
:: +mo-handle-use: handle a typed +sign incoming on /use.
::
2019-06-27 07:08:07 +03:00
:: Note that /use implies the +sign should be routed to an agent.
::
2019-06-12 14:25:49 +03:00
:: Initialises the specified agent and then performs an agent-level +take on
:: the supplied +sign.
2019-04-11 23:29:43 +03:00
::
2019-05-13 10:40:50 +03:00
++ mo-handle-use
~/ %mo-handle-use
2019-04-11 23:29:43 +03:00
|= [=path hin=(hypo sign-arvo)]
^+ mo-state
::
?. ?=([@ @ coke *] path)
2019-05-13 10:40:50 +03:00
~& [%mo-handle-use-bad-path path]
2016-11-24 07:25:07 +03:00
!!
2019-04-11 23:29:43 +03:00
::
=/ app
2019-04-11 23:29:43 +03:00
=/ =term i.path
=/ =privilege
=/ =ship (slav %p i.t.path)
=/ =routes [disclosing=~ attributing=ship]
[%high routes]
(ap-abed:ap term privilege)
2019-04-11 23:29:43 +03:00
::
=/ =sign-arvo q.hin
2019-04-11 23:29:43 +03:00
::
?- i.t.t.path
::
%inn
::
2019-05-29 10:46:55 +03:00
=/ =vase (slot 3 hin)
=. app (ap-generic-take:app t.t.t.path vase)
ap-abet:app
2019-04-11 23:29:43 +03:00
::
%cay
::
~& [%mo-handle-use-weird sign-arvo]
~& [%mo-handle-use-weird-path path]
mo-state
2019-04-11 23:29:43 +03:00
::
%out
::
?. ?=([%g %unto *] sign-arvo)
2019-05-13 10:40:50 +03:00
~& [%mo-handle-use-weird sign-arvo]
~& [%mo-handle-use-weird-path path]
2019-04-11 23:29:43 +03:00
mo-state
::
=. app
=/ =internal-gift +>.sign-arvo
(ap-specific-take:app t.t.t.path internal-gift)
::
ap-abet:app
2016-11-24 07:25:07 +03:00
==
::
2019-06-27 07:08:07 +03:00
:: +mo-clear-queue: clear blocked tasks from the specified running agent.
2019-06-12 14:25:49 +03:00
::
2019-05-13 10:40:50 +03:00
++ mo-clear-queue
|= =term
2019-04-11 23:30:44 +03:00
^+ mo-state
::
?. (~(has by running.agents.gall) term)
2019-04-11 23:30:44 +03:00
mo-state
::
2019-06-26 00:25:03 +03:00
=/ maybe-blocked (~(get by blocked.agents.gall) term)
2019-04-27 07:54:35 +03:00
::
?~ maybe-blocked
2019-04-11 23:30:44 +03:00
mo-state
::
=/ =blocked u.maybe-blocked
2019-04-27 07:54:35 +03:00
::
2019-05-03 01:53:27 +03:00
|- ^+ mo-state
::
?: =(~ blocked)
2019-06-26 00:25:03 +03:00
=/ blocked (~(del by blocked.agents.gall) term)
2019-04-11 23:30:44 +03:00
%_ mo-state
2019-06-26 00:25:03 +03:00
blocked.agents.gall blocked
2019-04-11 23:30:44 +03:00
==
::
2019-05-29 10:46:55 +03:00
=^ task blocked [p q]:~(get to blocked)
::
2019-05-29 10:46:55 +03:00
=/ =duct p.task
=/ =privilege q.task
=/ =agent-action r.task
::
=/ move
=/ =sock [attributing.routes.privilege our]
=/ =internal-task [term agent-action]
=/ card [%slip %g %deal sock internal-task]
[duct card]
2019-04-11 23:30:44 +03:00
::
$(moves [move moves])
::
2019-06-12 14:25:49 +03:00
:: +mo-beak: assemble a beak for the specified agent.
2016-11-24 07:25:07 +03:00
::
2019-04-11 23:30:44 +03:00
++ mo-beak
|= =term
2016-11-24 07:25:07 +03:00
^- beak
2019-06-12 14:25:49 +03:00
::
?~ app-data=(~(get by running.agents.gall) term)
::
:: XX this fallback is necessary, as .term could be either the source
:: or the destination app. ie, it might not exist locally ...
::
[our %home %da now]
beak.u.app-data
2016-11-24 07:25:07 +03:00
::
2019-05-13 10:40:50 +03:00
:: Simply calls to +ap-peek, which is not accessible from outside of +mo.
::
2016-11-24 07:25:07 +03:00
++ mo-peek
~/ %mo-peek
2019-06-12 14:25:49 +03:00
|= [agent=term =privilege =term =path]
2016-11-24 07:25:07 +03:00
^- (unit (unit cage))
::
2019-06-12 14:25:49 +03:00
=/ app (ap-abed:ap agent privilege)
(ap-peek:app term path)
::
2019-06-12 14:25:49 +03:00
:: +mo-apply: apply the supplied action to the specified agent.
::
2019-05-13 10:40:50 +03:00
++ mo-apply
|= [=term =privilege =agent-action]
^+ mo-state
::
=/ =path
=/ ship (scot %p attributing.routes.privilege)
/sys/val/[ship]/[term]
::
=/ ship-desk
=/ =beak (mo-beak term)
[p q]:beak
::
?: ?=(%puff -.agent-action)
=/ =schematic:ford [%vale ship-desk +.agent-action]
2019-04-27 07:54:35 +03:00
=/ =note-arvo [%f %build live=%.n schematic]
(mo-pass path note-arvo)
::
?: ?=(%punk -.agent-action)
=/ =schematic:ford [%cast ship-desk p.agent-action [%$ q.agent-action]]
2019-04-27 07:54:35 +03:00
=/ =note-arvo [%f %build live=%.n schematic]
(mo-pass path note-arvo)
::
?: ?=(%peer-not -.agent-action)
=/ err (some p.agent-action)
(mo-give %unto %reap err)
::
=/ app (ap-abed:ap term privilege)
=. app (ap-apply:app agent-action)
ap-abet:app
::
2019-05-13 10:40:50 +03:00
:: +mo-handle-local: handle locally.
::
2019-06-27 07:08:07 +03:00
:: If the agent is running or blocked, assign it the supplied +task.
:: Otherwise simply apply the action to the agent.
2019-06-12 14:25:49 +03:00
::
2019-05-13 10:40:50 +03:00
++ mo-handle-local
|= [=ship =internal-task]
^+ mo-state
::
=/ =privilege
=/ =routes [disclosing=~ attributing=ship]
[%high routes]
::
=/ =term p.internal-task
=/ =agent-action q.internal-task
2019-04-25 20:39:32 +03:00
::
=/ is-running (~(has by running.agents.gall) term)
2019-06-26 00:25:03 +03:00
=/ is-blocked (~(has by blocked.agents.gall) term)
2019-04-26 08:16:46 +03:00
::
2019-06-26 00:25:03 +03:00
?: |(!is-running is-blocked)
2019-04-26 08:16:46 +03:00
::
=/ =blocked
2019-06-26 00:25:03 +03:00
=/ waiting (~(get by blocked.agents.gall) term)
2019-05-29 10:46:55 +03:00
=/ tasks (fall waiting *blocked)
=/ task [hen privilege agent-action]
(~(put to tasks) task)
::
%_ mo-state
2019-06-26 00:25:03 +03:00
blocked.agents.gall (~(put by blocked.agents.gall) term blocked)
==
::
(mo-apply term privilege agent-action)
::
2019-06-27 07:08:07 +03:00
:: +mo-handle-forward: handle forward %ames message.
2016-11-24 07:25:07 +03:00
::
2019-05-13 10:40:50 +03:00
++ mo-handle-forward
|= [=ship =term =bone =forward-ames]
^+ mo-state
::
=. mo-state
?. ?=(%u action.forward-ames)
mo-state
(mo-give %mack ~)
::
=/ =path
2019-04-27 07:54:35 +03:00
=/ him (scot %p ship)
=/ num (scot %ud bone)
/sys/req/[him]/[term]/[num]
::
=/ =sock [ship our]
::
=/ =note-arvo
?- action.forward-ames
::
%m
::
=/ =task:able
=/ =internal-task [term %puff [mark noun]:forward-ames]
[%deal sock internal-task]
[%g task]
::
%l
::
=/ =task:able
=/ =internal-task [term %peel [mark path]:forward-ames]
[%deal sock internal-task]
[%g task]
::
%s
::
=/ =task:able
=/ =internal-task [term %peer path.forward-ames]
[%deal sock internal-task]
[%g task]
::
%u
::
=/ =task:able
=/ =internal-task [term %pull ~]
[%deal sock internal-task]
[%g task]
==
::
(mo-pass path note-arvo)
::
2019-06-27 07:08:07 +03:00
:: +mo-handle-backward: handle reverse %ames message.
::
2019-05-13 10:40:50 +03:00
++ mo-handle-backward
|= [=ship =term =bone =reverse-ames]
^+ mo-state
::
?- action.reverse-ames
::
%d
2019-05-03 01:53:27 +03:00
::
=/ =path
2019-04-27 07:54:35 +03:00
=/ him (scot %p ship)
=/ num (scot %ud bone)
/sys/rep/[him]/[term]/[num]
::
=/ =note-arvo
=/ beak (mo-beak term)
=/ info [p q]:beak
=/ =schematic:ford [%vale info p.reverse-ames q.reverse-ames]
2019-04-27 07:54:35 +03:00
[%f %build live=%.n schematic]
::
(mo-pass path note-arvo)
::
%x
2019-05-03 01:53:27 +03:00
::
:: XX should crash
=. mo-state (mo-give %mack ~)
::
=/ initialised
2019-06-12 14:25:49 +03:00
=/ out (mo-retrieve-duct ship bone)
2019-05-03 01:53:27 +03:00
(mo-abed out)
::
2019-05-03 01:53:27 +03:00
(mo-give:initialised %unto %quit ~)
2015-05-10 01:55:05 +03:00
==
2016-11-24 07:25:07 +03:00
::
2019-04-27 08:05:43 +03:00
:: +ap: agent engine
::
++ ap
2016-11-24 07:25:07 +03:00
~% %gall-ap +> ~
2019-04-27 09:08:29 +03:00
::
|_ $: agent-name=term
agent-privilege=privilege
agent-bone=bone
agent-moves=(list internal-move)
agent-config=(list (each suss tang))
sat=agent
2016-11-24 07:25:07 +03:00
==
::
2019-04-27 08:05:43 +03:00
++ ap-state .
::
2019-06-12 14:25:49 +03:00
:: +ap-abed: initialise state for the specified agent, with the
:: supplied privilege.
::
:: The agent must already be running in +gall -- here we simply update
:: state to focus on it.
::
:: If the agent doesn't have a bone corresponding to the +mo control duct,
:: we give it one, and update its bone- and duct-indexed correspondence
:: maps in turn. The agent's bone is also tracked in state under the
:: agent-bone face.
2019-04-27 08:05:43 +03:00
::
++ ap-abed
~/ %ap-abed
|= [=term =privilege]
2019-04-27 08:05:43 +03:00
^+ ap-state
::
=/ =agent
=/ running (~(got by running.agents.gall) term)
=/ =stats
:+ +(change.stats.running)
(shaz (mix (add term change.stats.running) eny))
now
running(stats stats)
2019-04-27 09:08:29 +03:00
::
=. agent-name term
=. agent-privilege privilege
=. sat agent
::
2019-06-12 14:25:49 +03:00
=/ maybe-bone (~(get by bone-map.ducts.agent) hen)
::
?^ maybe-bone
ap-state(agent-bone u.maybe-bone)
2019-04-27 09:08:29 +03:00
::
2019-05-29 10:46:55 +03:00
=/ =ducts
:+ +(bone.ducts.agent)
(~(put by bone-map.ducts.agent) hen bone.ducts.agent)
(~(put by duct-map.ducts.agent) bone.ducts.agent hen)
::
%_ ap-state
2019-06-12 14:25:49 +03:00
agent-bone bone.ducts.agent
ducts.sat ducts
2016-11-24 07:25:07 +03:00
==
::
2019-04-27 08:05:43 +03:00
:: +ap-abet: resolve moves.
::
++ ap-abet
^+ mo-state
::
2019-05-13 10:40:50 +03:00
=> ap-track-queue
::
=/ running (~(put by running.agents.gall) agent-name sat)
::
=/ moves
2019-05-13 10:40:50 +03:00
=/ giver |=(report=(each suss tang) [hen %give %onto report])
=/ from-internal (turn agent-moves ap-from-internal)
=/ from-suss (turn agent-config giver)
:(weld from-internal from-suss moves)
::
2019-04-27 08:05:43 +03:00
%_ mo-state
running.agents.gall running
2019-06-12 14:25:49 +03:00
moves moves
2016-11-24 07:25:07 +03:00
==
::
2019-05-13 10:40:50 +03:00
:: +ap-track-queue: track queue.
2019-04-27 08:42:04 +03:00
::
2019-06-12 14:25:49 +03:00
:: An agent, at any given time, may have some so-called internal moves
2019-06-27 07:08:07 +03:00
:: associated with it.
2019-06-12 14:25:49 +03:00
::
:: If there are any currently-associated non-%give internal moves, we
:: enqueue each along its associated bone.
::
:: When we've finished enqueuing them,
::
:: FIXME finish
::
2019-05-13 10:40:50 +03:00
++ ap-track-queue
2019-04-27 08:42:04 +03:00
^+ ap-state
::
=/ internal-moves agent-moves
=/ bones *(set bone)
::
|- ^+ ap-state
::
?^ internal-moves
?. ?=([%give %diff *] move.i.internal-moves)
$(internal-moves t.internal-moves)
::
=/ =internal-move i.internal-moves
2019-06-12 14:25:49 +03:00
::
=^ filled ap-state ap-enqueue(agent-bone bone.internal-move)
::
=/ new-bones
?: filled
bones
(~(put in bones) bone.internal-move)
::
$(internal-moves t.internal-moves, bones new-bones)
::
2019-06-12 14:25:49 +03:00
=/ bones ~(tap in bones)
2019-04-27 09:08:29 +03:00
::
|- ^+ ap-state
::
2019-06-12 14:25:49 +03:00
?~ bones
ap-state
2019-04-27 09:08:29 +03:00
::
2019-06-12 14:25:49 +03:00
=> $(bones t.bones, agent-bone i.bones)
::
2019-06-12 14:25:49 +03:00
=/ incoming (~(get by incoming.subscribers.sat) agent-bone)
::
2019-06-12 14:25:49 +03:00
?~ incoming
~& [%ap-track-queue-bad-bone agent-name agent-bone]
ap-state
::
2019-06-12 14:25:49 +03:00
=/ =ship p.u.incoming
ap-kill(attributing.routes.agent-privilege ship)
2016-11-24 07:25:07 +03:00
::
2019-05-13 10:40:50 +03:00
:: +ap-from-internal: internal move to move.
2019-04-27 08:42:04 +03:00
::
2019-06-12 14:25:49 +03:00
:: We convert from bone-indexed moves to duct-indexed moves when resolving
:: them in Arvo.
::
2019-05-13 10:40:50 +03:00
++ ap-from-internal
~/ %ap-from-internal
|= =internal-move
2019-01-18 08:37:34 +03:00
^- move
2019-04-27 08:42:04 +03:00
::
2019-05-13 10:40:50 +03:00
~| [%gall-from-internal-failed internal-move]
::
=/ =duct (~(got by duct-map.ducts.sat) bone.internal-move)
2019-05-13 10:40:50 +03:00
::
=/ card
?- -.move.internal-move
::
%slip !!
::
%give
::
?< =(0 bone.internal-move)
::
=/ =internal-gift p.move.internal-move
?. ?=(%diff -.internal-gift)
[%give %unto internal-gift]
::
=/ =cage p.internal-gift
=/ =mark
=/ trans (~(get by required-trans.sat) bone.internal-move)
(fall trans p.cage)
::
?: =(mark p.cage)
[%give %unto internal-gift]
::
=/ =path /sys/pel/[agent-name]
::
=/ =note-arvo
=/ =schematic:ford
=/ =beak (mo-beak agent-name)
[%cast [p q]:beak mark [%$ cage]]
[%f %build live=%.n schematic]
::
[%pass path note-arvo]
::
%pass
::
=/ =path p.move.internal-move
=/ =internal-note q.move.internal-move
::
=/ use-path [%use agent-name path]
::
=/ =note-arvo
?- task.internal-note
::
%send
::
2019-05-13 10:40:50 +03:00
=/ =task:able
=/ =sock [our ship.internal-note]
=/ =internal-task internal-task.internal-note
[%deal sock internal-task]
[%g task]
::
%meta
::
=/ =term term.internal-note
=/ =vase vase.internal-note
[term %meta vase]
==
::
[%pass use-path note-arvo]
==
::
[duct card]
2016-11-24 07:25:07 +03:00
::
2019-04-27 08:42:04 +03:00
:: +ap-call: call into server.
::
2019-06-12 14:25:49 +03:00
:: FIXME docs
::
2019-04-27 08:42:04 +03:00
++ ap-call
2016-11-24 07:25:07 +03:00
~/ %ap-call
2019-05-03 01:53:27 +03:00
|= [=term =vase]
2019-04-27 08:42:04 +03:00
^- [(unit tang) _ap-state]
::
2019-05-13 10:40:50 +03:00
=. ap-state ap-construct-bowl
=^ arm ap-state (ap-produce-arm term)
2019-05-03 01:53:27 +03:00
::
?: ?=(%.n -.arm)
2019-05-03 01:53:27 +03:00
[(some p.arm) ap-state]
::
=^ arm ap-state (ap-slam term p.arm vase)
2019-05-03 01:53:27 +03:00
::
?: ?=(%.n -.arm)
[(some p.arm) ap-state]
2019-05-13 10:40:50 +03:00
(ap-handle-result p.arm)
2016-11-24 07:25:07 +03:00
::
2019-04-27 08:42:04 +03:00
:: +ap-peek: peek.
::
2019-06-12 14:25:49 +03:00
:: FIXME docs
::
2016-11-24 07:25:07 +03:00
++ ap-peek
~/ %ap-peek
|= [=term tyl=path]
2016-11-24 07:25:07 +03:00
^- (unit (unit cage))
2019-04-27 08:42:04 +03:00
::
=/ marked
?. ?=(%x term)
2019-05-03 01:53:27 +03:00
[mark=%$ tyl=tyl]
::
2019-05-03 01:53:27 +03:00
=/ =path (flop tyl)
?> ?=(^ path)
[mark=i.path tyl=(flop t.path)]
::
=/ =mark mark.marked
=/ tyl tyl.marked
2019-05-03 01:53:27 +03:00
::
2019-05-13 10:40:50 +03:00
=^ maybe-arm ap-state (ap-find-arm %peek term tyl)
::
?~ maybe-arm
2019-05-03 01:53:27 +03:00
=/ =tank [%leaf "peek find fail"]
=/ print (slog tank >tyl< >mark< ~)
(print [~ ~])
2019-05-03 01:53:27 +03:00
::
2019-05-13 10:40:50 +03:00
=^ arm ap-state (ap-produce-arm q.u.maybe-arm)
2019-05-03 01:53:27 +03:00
::
?: ?=(%.n -.arm)
2019-05-03 01:53:27 +03:00
=/ =tank [%leaf "peek farm fail"]
=/ print (slog tank p.arm)
(print [~ ~])
2019-05-03 01:53:27 +03:00
::
=/ slammed
=/ index p.u.maybe-arm
=/ term q.u.maybe-arm
~& [%slam-index-is index]
~& [%slam-term-is term]
=/ =vase
=/ =path [term tyl]
~& [%slam-path-is path]
!> (slag index path)
(ap-slam term p.arm vase)
2019-05-03 01:53:27 +03:00
::
=^ possibly-vase ap-state slammed
2019-05-03 01:53:27 +03:00
::
?: ?=(%.n -.possibly-vase)
2019-05-03 01:53:27 +03:00
=/ =tank [%leaf "peek slam fail"]
=/ print (slog tank p.possibly-vase)
(print [~ ~])
::
=/ slammed-vase p.possibly-vase
=/ vase-value q.slammed-vase
2019-05-03 01:53:27 +03:00
::
=/ err
=/ =tank [%leaf "peek bad result"]
=/ print (slog tank ~)
(print [~ ~])
2019-05-03 01:53:27 +03:00
::
?+ vase-value err
::
~
::
~
::
[~ ~]
::
[~ ~]
::
2019-05-03 01:53:27 +03:00
[~ ~ ^]
::
=/ =vase (sped (slot 7 slammed-vase))
2019-05-03 01:53:27 +03:00
::
?. ?=([p=@ *] q.vase)
=/ =tank [%leaf "scry: malformed cage"]
=/ print (slog tank ~)
(print [~ ~])
2019-05-03 01:53:27 +03:00
::
?. ((sane %tas) p.q.vase)
2019-05-03 01:53:27 +03:00
=/ =tank [%leaf "scry: malformed cage"]
=/ print (slog tank ~)
(print [~ ~])
2019-05-03 01:53:27 +03:00
::
?. =(mark p.q.vase)
[~ ~]
::
=/ =cage [p.q.vase (slot 3 vase)]
(some (some cage))
2016-11-24 07:25:07 +03:00
==
::
2019-05-13 10:40:50 +03:00
:: +ap-apply: apply effect.
2019-04-27 08:42:04 +03:00
::
2019-05-13 10:40:50 +03:00
++ ap-apply
|= =agent-action
2019-04-27 08:42:04 +03:00
^+ ap-state
::
?- -.agent-action
%peel (ap-peel +.agent-action)
%poke (ap-poke +.agent-action)
%peer (ap-peer +.agent-action)
2019-05-03 01:53:27 +03:00
%puff !!
%punk !!
%peer-not !!
2019-05-13 10:40:50 +03:00
%pull ap-load-delete
%pump ap-dequeue
2016-11-24 07:25:07 +03:00
==
::
2019-04-27 08:42:04 +03:00
:: +ap-diff: pour a diff.
::
2019-06-12 14:25:49 +03:00
:: FIXME docs
2019-04-27 08:42:04 +03:00
++ ap-diff
~/ %ap-diff
|= [=ship =path =cage]
2019-04-27 08:42:04 +03:00
^+ ap-state
::
=/ rest +.path
2019-05-29 10:46:55 +03:00
=/ pax [p.cage rest]
2019-05-03 01:53:27 +03:00
::
2019-05-29 10:46:55 +03:00
=^ maybe-arm ap-state (ap-find-arm %diff pax)
2019-05-03 01:53:27 +03:00
::
?~ maybe-arm
=/ target [%.n ship rest]
2019-05-03 01:53:27 +03:00
::
=/ =tang
=/ why "diff: no {<[p.cage rest]>}"
2019-05-13 10:40:50 +03:00
(ap-tang why)
2019-05-03 01:53:27 +03:00
::
=. ap-state (ap-lame %diff tang)
(ap-update-subscription target)
2019-05-03 01:53:27 +03:00
::
=/ arm u.maybe-arm
::
2019-05-03 01:53:27 +03:00
=/ =vase
=/ target
?: =(0 p.arm)
=/ =vase (ap-cage cage)
[!>(rest) vase]
[!>((slag (dec p.arm) rest)) q.cage]
2019-05-03 01:53:27 +03:00
(slop target)
::
=^ called ap-state (ap-call q.arm vase)
2019-05-03 01:53:27 +03:00
::
?^ called
=. ap-state (ap-lame q.arm u.called)
(ap-update-subscription %.n ship path)
2019-05-13 10:40:50 +03:00
(ap-update-subscription %.y ship path)
2016-11-24 07:25:07 +03:00
::
2019-04-27 08:42:04 +03:00
:: +ap-cage: cage to tagged vase.
::
++ ap-cage
2019-05-13 10:40:50 +03:00
|= =cage
2019-05-29 01:37:42 +03:00
^- vase
2019-05-13 10:40:50 +03:00
::
=/ =type [%atom %tas (some p.cage)]
=/ =vase [type p.cage]
(slop vase q.cage)
2019-05-29 01:37:42 +03:00
::
2019-05-13 10:40:50 +03:00
:: +ap-update-subscription: update subscription.
2019-04-27 08:42:04 +03:00
::
2019-06-12 14:25:49 +03:00
:: FIXME docs
::
2019-05-13 10:40:50 +03:00
++ ap-update-subscription
~/ %ap-update-subscription
2019-05-03 01:53:27 +03:00
|= [is-ok=? =ship =path]
2019-04-27 08:42:04 +03:00
^+ ap-state
::
2019-05-03 01:53:27 +03:00
=/ way [(scot %p ship) %out path]
::
?: is-ok
=/ =internal-note [%send ship -.path %pump ~]
(ap-pass way internal-note)
2019-05-03 01:53:27 +03:00
::
=. ap-state (ap-give %quit ~)
=/ =internal-note [%send ship -.path %pull ~]
(ap-pass way internal-note)
2016-11-24 07:25:07 +03:00
::
2019-05-13 10:40:50 +03:00
:: +ap-dequeue: drop from queue.
2019-04-27 08:42:04 +03:00
::
2019-06-12 14:25:49 +03:00
:: Dequeues along the current bone, deleting the queue entirely if it
:: drops to zero.
::
2019-05-13 10:40:50 +03:00
++ ap-dequeue
2019-04-27 08:42:04 +03:00
^+ ap-state
::
?. (~(has by incoming.subscribers.sat) agent-bone)
2019-05-03 01:53:27 +03:00
ap-state
::
=/ level (~(get by meter.subscribers.sat) agent-bone)
2019-05-03 01:53:27 +03:00
::
?: |(?=(~ level) =(0 u.level))
2019-05-03 01:53:27 +03:00
ap-state
::
=. u.level (dec u.level)
::
?: =(0 u.level)
=/ deleted (~(del by meter.subscribers.sat) agent-bone)
2019-06-12 14:25:49 +03:00
ap-state(meter.subscribers.sat deleted)
2019-05-03 01:53:27 +03:00
::
2019-06-12 14:25:49 +03:00
=/ dequeued (~(put by meter.subscribers.sat) agent-bone u.level)
ap-state(meter.subscribers.sat dequeued)
2016-11-24 07:25:07 +03:00
::
2019-05-13 10:40:50 +03:00
:: +ap-produce-arm: produce arm.
2019-04-27 08:42:04 +03:00
::
2019-06-12 14:25:49 +03:00
:: FIXME docs
2019-05-13 10:40:50 +03:00
++ ap-produce-arm
~/ %ap-produce-arm
2019-05-03 01:53:27 +03:00
|= =term
2019-04-27 08:42:04 +03:00
^- [(each vase tang) _ap-state]
::
=/ compiled
=/ =type p.running-state.sat
=/ =hoon [%limb term]
(~(mint wa cache.sat) type hoon)
::
=/ virtual
=/ trap |.(compiled)
(mule trap)
2019-05-03 01:53:27 +03:00
::
?: ?=(%.n -.virtual)
=/ =tang p.virtual
2019-05-03 01:53:27 +03:00
[[%.n tang] ap-state]
::
=/ possibly-vase=(each vase tang)
=/ value q.running-state.sat
2019-05-13 10:40:50 +03:00
=/ ton (mock [value q.+<.virtual] ap-namespace-view)
2019-05-03 01:53:27 +03:00
?- -.ton
%0 [%.y p.+<.virtual p.ton]
%1 [%.n (turn p.ton |=(a=* (smyt (path a))))]
2019-05-03 01:53:27 +03:00
%2 [%.n p.ton]
==
::
=/ next
=/ =worm +>.virtual
2019-06-12 14:25:49 +03:00
ap-state(cache.sat worm)
::
[possibly-vase next]
2016-11-24 07:25:07 +03:00
::
2019-05-13 10:40:50 +03:00
:: +ap-enqueue: add to queue.
2019-04-27 08:42:04 +03:00
::
2019-06-12 14:25:49 +03:00
:: Every agent has a 'meter', that tracks the number of incoming
:: subscribers by bone. We get both the meter and ship associated with
:: the current bone; if the meter has hit twenty for another ship, we
:: don't enqueue the subscriber. Otherwise we increment the meter for
:: the current bone and update the agent's state with it.
::
:: Returns a yes if the meter has been incremented, and no otherwise.
::
2019-05-13 10:40:50 +03:00
++ ap-enqueue
2019-04-27 08:42:04 +03:00
^- [? _ap-state]
::
=/ meter (~(gut by meter.subscribers.sat) agent-bone 0)
2019-06-04 01:23:29 +03:00
=/ subscriber=(unit (pair ship path))
(~(get by incoming.subscribers.sat) agent-bone)
2019-05-03 01:53:27 +03:00
::
?: ?& =(20 meter)
2019-06-04 01:23:29 +03:00
?| ?=(~ subscriber)
!=(our p.u.subscriber)
==
==
2019-06-12 14:25:49 +03:00
=/ incoming (~(get by incoming.subscribers.sat) agent-bone)
=/ duct (~(get by duct-map.ducts.sat) agent-bone)
~& [%gall-pulling-20 agent-bone incoming duct]
[%.n ap-state]
::
=/ next
=/ meter (~(put by meter.subscribers.sat) agent-bone +(meter))
2019-06-12 14:25:49 +03:00
ap-state(meter.subscribers.sat meter)
::
[%.y next]
2016-11-24 07:25:07 +03:00
::
2019-05-13 10:40:50 +03:00
:: +ap-find-arm: general arm.
2019-04-27 08:42:04 +03:00
::
2019-06-12 14:25:49 +03:00
:: If the arm exists in the running cache for the raw [term path] cell,
:: returns that. Otherwise we assemble
::
:: FIXME finish
2019-05-13 10:40:50 +03:00
++ ap-find-arm
~/ %ap-find-arm
2019-05-03 01:53:27 +03:00
|= [=term =path]
^- [(unit (pair @ud @tas)) _ap-state]
::
2019-05-13 10:40:50 +03:00
=/ maybe-cached (~(get by arm-cache.sat) [term path])
?^ maybe-cached
[u.maybe-cached ap-state]
::
2019-05-03 01:53:27 +03:00
=/ result
=/ dep 0
|- ^- (unit (pair @ud @tas))
=/ spu
?~ path
~
=/ hyped (cat 3 term (cat 3 '-' i.path))
$(path t.path, dep +(dep), term hyped)
::
?^ spu
spu
::
2019-05-13 10:40:50 +03:00
?. (ap-exists-arm term)
2019-05-03 01:53:27 +03:00
~
(some [dep term])
::
2019-05-13 10:40:50 +03:00
=. arm-cache.sat (~(put by arm-cache.sat) [term path] result)
::
2019-04-27 08:42:04 +03:00
[result ap-state]
::
2019-06-12 14:25:49 +03:00
:: +ap-exists-arm: check for an arm in the running agent state.
2016-11-24 07:25:07 +03:00
::
2019-05-13 10:40:50 +03:00
++ ap-exists-arm
~/ %ap-exists-arm
2019-05-03 01:53:27 +03:00
|= =term
2016-11-24 07:25:07 +03:00
^- ?
2019-04-27 08:42:04 +03:00
::
=/ =type p.running-state.sat
(slob term type)
2016-11-24 07:25:07 +03:00
::
2019-04-27 08:42:04 +03:00
:: +ap-give: return result.
2016-11-24 07:25:07 +03:00
::
2019-04-27 08:42:04 +03:00
++ ap-give
|= =internal-gift
2019-04-27 08:42:04 +03:00
^+ ap-state
::
=/ internal-moves
=/ move [%give internal-gift]
=/ =internal-move [agent-bone move]
[internal-move agent-moves]
::
ap-state(agent-moves internal-moves)
2019-04-27 08:42:04 +03:00
::
2019-05-13 10:40:50 +03:00
:: +ap-construct-bowl: set up bowl.
2019-04-27 08:42:04 +03:00
::
2019-05-13 10:40:50 +03:00
++ ap-construct-bowl
2019-05-03 01:53:27 +03:00
^+ ap-state
::
2019-04-27 08:42:04 +03:00
%_ ap-state
+12.q.running-state.sat
2016-11-24 07:25:07 +03:00
^- bowl
2019-06-07 06:48:52 +03:00
:* :* our :: host
attributing.routes.agent-privilege :: guest
agent-name :: agent
== ::
:* wex=~ :: outgoing
sup=incoming.subscribers.sat :: incoming
== ::
:* agent-bone=agent-bone :: cause
act=change.stats.sat :: tick
eny=eny.stats.sat :: nonce
now=time.stats.sat :: time
byk=beak.sat :: source
== == ::
2016-11-24 07:25:07 +03:00
==
::
2019-04-27 08:42:04 +03:00
:: +ap-move: process each move.
::
++ ap-move
2016-11-24 07:25:07 +03:00
~/ %ap-move
2019-05-03 01:53:27 +03:00
|= =vase
^- [(each internal-move tang) _ap-state]
2019-04-27 08:42:04 +03:00
::
=/ noun q.vase
::
?@ noun
2019-05-13 10:40:50 +03:00
=/ =tang (ap-tang "move: invalid move (atom)")
2019-05-03 01:53:27 +03:00
[[%.n tang] ap-state]
::
?^ -.noun
2019-05-13 10:40:50 +03:00
=/ =tang (ap-tang "move: invalid move (bone)")
2019-05-03 01:53:27 +03:00
[[%.n tang] ap-state]
::
?@ +.noun
2019-05-13 10:40:50 +03:00
=/ =tang (ap-tang "move: invalid move (card)")
2019-05-03 01:53:27 +03:00
[[%.n tang] ap-state]
::
=/ =bone -.noun
=/ has-duct (~(has by duct-map.ducts.sat) bone)
2019-05-03 01:53:27 +03:00
::
?. &(has-duct !=(0 bone))
2019-05-13 10:40:50 +03:00
=/ =tang (ap-tang "move: invalid card (bone {<bone>})")
2019-05-03 01:53:27 +03:00
[[%.n tang] ap-state]
::
=^ vase cache.sat (~(spot wa cache.sat) 3 vase)
=^ vase cache.sat (~(slot wa cache.sat) 3 vase)
::
?+ +<.noun (ap-move-pass bone +<.noun vase)
%diff (ap-move-diff bone vase)
%peel (ap-move-peel bone vase)
%peer (ap-move-peer bone vase)
%pull (ap-move-pull bone vase)
%poke (ap-move-poke bone vase)
%send (ap-move-send bone vase)
%quit (ap-move-quit bone vase)
%http-response (ap-move-http-response bone vase)
2016-11-24 07:25:07 +03:00
==
::
2019-04-27 08:42:04 +03:00
:: +ap-move-quit: give quit move.
::
++ ap-move-quit
~/ %quit
2019-05-03 01:53:27 +03:00
|= [=bone =vase]
^- [(each internal-move tang) _ap-state]
2019-04-27 08:42:04 +03:00
::
=/ possibly-internal-move=(each internal-move tang)
2019-05-03 01:53:27 +03:00
?^ q.vase
2019-05-13 10:40:50 +03:00
=/ =tang (ap-tang "quit: improper give")
2019-05-03 01:53:27 +03:00
[%.n tang]
::
=/ =internal-move
=/ =internal-gift [%quit ~]
=/ move [%give internal-gift]
[bone move]
::
[%.y internal-move]
2019-05-03 01:53:27 +03:00
::
=/ next
=/ incoming (~(del by incoming.subscribers.sat) bone)
%_ ap-state
incoming.subscribers.sat incoming
==
2019-05-03 01:53:27 +03:00
::
[possibly-internal-move next]
2016-11-24 07:25:07 +03:00
::
2019-04-27 08:42:04 +03:00
:: +ap-move-diff: give diff move.
::
++ ap-move-diff
~/ %diff
2019-05-03 01:53:27 +03:00
|= [=bone =vase]
^- [(each internal-move tang) _ap-state]
::
=^ vase cache.sat (~(sped wa cache.sat) vase)
2019-04-27 08:42:04 +03:00
::
=/ value q.vase
2019-05-03 01:53:27 +03:00
::
?. ?& ?=(^ value)
?=(@ -.value)
((sane %tas) -.value)
==
2019-05-13 10:40:50 +03:00
=/ =tang (ap-tang "diff: improper give")
2019-05-03 01:53:27 +03:00
[[%.n tang] ap-state]
::
=^ vase cache.sat (~(slot wa cache.sat) 3 vase)
2019-05-03 01:53:27 +03:00
::
=/ =internal-move
=/ =cage [-.value vase]
=/ move [%give %diff cage]
[bone move]
2019-05-03 01:53:27 +03:00
::
[[%.y internal-move] ap-state]
2016-11-24 07:25:07 +03:00
::
:: +ap-move-http-response
::
++ ap-move-http-response
|= [sto=bone vax=vase]
^- [(each internal-move tang) _ap-state]
::
:: TODO: Magic vase validation. I have no idea how malformed checking
:: works.
::
2019-04-27 08:42:04 +03:00
:_ ap-state
[%& sto %give %http-response ;;(http-event:http q.vax)]
::
2019-04-27 08:42:04 +03:00
::
:: +ap-move-mess: extract path, target.
::
++ ap-move-mess
~/ %mess
2019-05-03 01:53:27 +03:00
|= =vase
2019-04-27 08:42:04 +03:00
^- [(each (trel path ship term) tang) _ap-state]
::
=/ possibly-trel=(each (trel path ship term) tang)
2019-05-03 01:53:27 +03:00
?. ?& ?=([p=* [q=@ r=@] s=*] q.vase)
(gte 1 (met 7 q.q.vase))
==
2019-05-13 10:40:50 +03:00
=/ =tang (ap-tang "mess: malformed target")
2019-05-03 01:53:27 +03:00
[%.n tang]
::
=/ pax ((soft path) p.q.vase)
2019-05-03 01:53:27 +03:00
::
?. ?& ?=(^ pax)
(levy u.pax (sane %ta))
==
2019-05-13 10:40:50 +03:00
=/ =tang (ap-tang "mess: malformed path")
2019-05-03 01:53:27 +03:00
[%.n tang]
::
=/ =path [(scot %p q.q.vase) %out r.q.vase u.pax]
2019-05-03 01:53:27 +03:00
=/ =ship q.q.vase
=/ =term r.q.vase
[%.y path ship term]
::
[possibly-trel ap-state]
2016-11-24 07:25:07 +03:00
::
2019-04-27 08:42:04 +03:00
:: +ap-move-pass: pass general move.
::
++ ap-move-pass
~/ %pass
2019-05-03 01:53:27 +03:00
|= [=bone =noun =vase]
^- [(each internal-move tang) _ap-state]
2019-04-27 08:42:04 +03:00
::
?. ?& ?=(@ noun)
((sane %tas) noun)
==
2019-05-13 10:40:50 +03:00
=/ =tang (ap-tang "pass: malformed card")
2019-05-03 01:53:27 +03:00
[[%.n tang] ap-state]
::
=/ pax ((soft path) -.q.vase)
2019-05-03 01:53:27 +03:00
::
?. ?& ?=(^ pax)
(levy u.pax (sane %ta))
==
=/ =tang (ap-tang "pass: malformed path")
~& [%bad-path pax]
2019-05-03 01:53:27 +03:00
[[%.n tang] ap-state]
::
=/ maybe-vane (ap-vain noun)
2019-05-03 01:53:27 +03:00
::
?~ maybe-vane
2019-05-13 10:40:50 +03:00
=/ =tang (ap-tang "move: unknown note {(trip noun)}")
2019-05-03 01:53:27 +03:00
[[%.n tang] ap-state]
::
=/ vane u.maybe-vane
2019-05-03 01:53:27 +03:00
::
=^ at-slot cache.sat (~(slot wa cache.sat) 3 vase)
::
=/ =internal-move
=/ =path [(scot %p attributing.routes.agent-privilege) %inn u.pax]
2019-05-13 10:40:50 +03:00
=/ vase (ap-atomic-vase %tas noun)
=/ combined (slop vase at-slot)
=/ =internal-note [%meta vane combined]
=/ card [%pass path internal-note]
[bone card]
::
[[%.y internal-move] ap-state]
2016-11-24 07:25:07 +03:00
::
2019-04-27 08:42:04 +03:00
:: +ap-move-poke: pass %poke.
::
++ ap-move-poke
~/ %poke
|= [=bone =vase]
^- [(each internal-move tang) _ap-state]
2019-04-27 08:42:04 +03:00
::
=^ possibly-target ap-state (ap-move-mess vase)
2019-05-03 01:53:27 +03:00
::
?: ?=(%.n -.possibly-target)
[possibly-target ap-state]
2019-05-03 01:53:27 +03:00
::
=^ at-slot cache.sat (~(slot wa cache.sat) 7 vase)
2019-05-03 01:53:27 +03:00
::
?. ?& ?=([p=@ q=*] q.at-slot)
((sane %tas) p.q.at-slot)
==
2019-05-13 10:40:50 +03:00
=/ =tang (ap-tang "poke: malformed cage")
2019-05-03 01:53:27 +03:00
[[%.n tang] ap-state]
::
=^ specialised cache.sat (~(stop wa cache.sat) 3 at-slot)
2019-05-03 01:53:27 +03:00
::
=/ target p.possibly-target
=/ =path p.target
=/ =ship q.target
=/ =term r.target
::
=/ =internal-move
=/ =internal-task [term %poke p.q.at-slot specialised]
=/ =internal-note [%send ship internal-task]
=/ card [%pass path internal-note]
[bone card]
::
[[%.y internal-move] ap-state]
2016-11-24 07:25:07 +03:00
::
2019-04-27 08:42:04 +03:00
:: +ap-move-peel: pass %peel.
::
++ ap-move-peel
~/ %peel
2019-05-03 01:53:27 +03:00
|= [=bone =vase]
^- [(each internal-move tang) _ap-state]
2019-04-27 08:42:04 +03:00
::
=^ possibly-target ap-state (ap-move-mess vase)
2019-05-03 01:53:27 +03:00
::
?: ?=(%.n -.possibly-target)
[possibly-target ap-state]
::
=/ target p.possibly-target
=/ =ship q.target
=/ =term r.target
2019-05-03 01:53:27 +03:00
::
=/ mark ((soft mark) +>-.q.vase)
2019-05-03 01:53:27 +03:00
::
?~ mark
2019-05-13 10:40:50 +03:00
=/ =tang (ap-tang "peel: malformed mark")
[[%.n tang] ap-state]
2019-05-03 01:53:27 +03:00
::
=/ pax ((soft path) +>+.q.vase)
2019-05-03 01:53:27 +03:00
::
?. ?& ?=(^ pax)
(levy u.pax (sane %ta))
==
2019-05-13 10:40:50 +03:00
=/ =tang (ap-tang "peel: malformed path")
[[%.n tang] ap-state]
2019-05-03 01:53:27 +03:00
::
=/ move
?: (~(has in misvale.sat) p.target)
=/ =internal-task
=/ =tang [[%leaf "peel: misvalidation encountered"] ~]
=/ =agent-action [%peer-not tang]
[term agent-action]
::
=/ =internal-note [%send ship internal-task]
=/ card [%pass p.target internal-note]
[bone card]
::
=/ =agent-action [%peel u.mark u.pax]
=/ =internal-task [term agent-action]
=/ =internal-note [%send ship internal-task]
=/ card [%pass p.target internal-note]
[bone card]
2019-05-03 01:53:27 +03:00
::
[[%.y move] ap-state]
2016-11-24 07:25:07 +03:00
::
2019-04-27 08:42:04 +03:00
:: +ap-move-peer: pass %peer.
::
++ ap-move-peer
~/ %peer
2019-05-03 01:53:27 +03:00
|= [=bone =vase]
^- [(each internal-move tang) _ap-state]
2019-04-27 08:42:04 +03:00
::
=^ possibly-target ap-state (ap-move-mess vase)
2019-05-03 01:53:27 +03:00
::
?: ?=(%.n -.possibly-target)
[possibly-target ap-state]
::
=/ target p.possibly-target
=/ =ship q.target
=/ =term r.target
2019-05-03 01:53:27 +03:00
::
=/ pax ((soft path) +>.q.vase)
2019-05-03 01:53:27 +03:00
::
?. ?& ?=(^ pax)
(levy u.pax (sane %ta))
==
2019-05-13 10:40:50 +03:00
=/ =tang (ap-tang "peer: malformed path")
[[%.n tang] ap-state]
2019-05-03 01:53:27 +03:00
::
=/ move
?: (~(has in misvale.sat) p.target)
=/ err [[%leaf "peer: misvalidation encountered"] ~]
=/ =agent-action [%peer-not err]
=/ =internal-note [%send ship term agent-action]
=/ card [%pass p.target internal-note]
[bone card]
::
=/ =agent-action [%peer u.pax]
=/ =internal-note [%send ship term agent-action]
=/ card [%pass p.target internal-note]
[bone card]
2019-05-03 01:53:27 +03:00
::
[[%.y move] ap-state]
2016-11-24 07:25:07 +03:00
::
2019-04-27 08:42:04 +03:00
:: +ap-move-pull: pass %pull.
::
++ ap-move-pull
~/ %pull
2019-05-03 01:53:27 +03:00
|= [=bone =vase]
^- [(each internal-move tang) _ap-state]
2019-04-27 08:42:04 +03:00
::
=^ possibly-target ap-state (ap-move-mess vase)
2019-05-03 01:53:27 +03:00
::
?: ?=(%.n -.possibly-target)
[possibly-target ap-state]
::
=/ target p.possibly-target
=/ =ship q.target
=/ =term r.target
2019-05-03 01:53:27 +03:00
::
?. =(~ +>.q.vase)
2019-05-13 10:40:50 +03:00
=/ =tang (ap-tang "pull: malformed card")
[[%.n tang] ap-state]
2019-05-03 01:53:27 +03:00
::
=/ move
=/ =agent-action [%pull ~]
=/ =internal-note [%send ship term agent-action]
=/ card [%pass p.target internal-note]
[bone card]
::
[[%.y move] ap-state]
2016-11-24 07:25:07 +03:00
::
2019-04-27 08:42:04 +03:00
:: +ap-move-send: pass gall action.
::
++ ap-move-send
~/ %send
2019-05-03 01:53:27 +03:00
|= [=bone =vase]
^- [(each internal-move tang) _ap-state]
2019-04-27 08:42:04 +03:00
::
2019-05-03 01:53:27 +03:00
?. ?& ?=([p=* [q=@ r=@] [s=@ t=*]] q.vase)
(gte 1 (met 7 q.q.vase))
((sane %tas) r.q.vase)
2016-11-24 07:25:07 +03:00
==
2019-05-13 10:40:50 +03:00
=/ =tang (ap-tang "send: improper ask.[%send wire gill agent-action]")
[[%.n tang] ap-state]
2019-05-03 01:53:27 +03:00
::
=/ pax ((soft path) p.q.vase)
2019-05-03 01:53:27 +03:00
::
?. ?& ?=(^ pax)
(levy u.pax (sane %ta))
==
2019-05-13 10:40:50 +03:00
=/ =tang (ap-tang "send: malformed path")
2019-05-03 01:53:27 +03:00
[[%.n tang] ap-state]
::
?: ?=($poke s.q.vase)
::
=^ specialised cache.sat (~(spot wa cache.sat) 7 vase)
::
?> =(%poke -.q.specialised)
2019-05-03 01:53:27 +03:00
::
?. ?& ?=([p=@ q=*] t.q.vase)
((sane %tas) p.t.q.vase)
2016-11-24 07:25:07 +03:00
==
2019-05-13 10:40:50 +03:00
=/ =tang (ap-tang "send: malformed poke")
2019-05-03 01:53:27 +03:00
[[%.n tang] ap-state]
::
=^ specialised cache.sat (~(spot wa cache.sat) 3 specialised)
=^ at-slot cache.sat (~(slot wa cache.sat) 3 specialised)
::
=/ move
=/ =agent-action [%poke p.t.q.vase at-slot]
=/ =internal-note [%send q.q.vase r.q.vase agent-action]
=/ =path [(scot %p q.q.vase) %out r.q.vase u.pax]
=/ card [%pass path internal-note]
[bone card]
2019-05-03 01:53:27 +03:00
::
[[%.y move] ap-state]
2019-05-03 01:53:27 +03:00
::
=/ maybe-action ((soft agent-action) [s t]:q.vase)
?~ maybe-action
2019-05-13 10:40:50 +03:00
=/ =tang (ap-tang "send: malformed agent-action")
[[%.n tang] ap-state]
::
=/ move
=/ =agent-action u.maybe-action
=/ =internal-note [%send q.q.vase r.q.vase agent-action]
=/ =path [(scot %p q.q.vase) %out r.q.vase u.pax]
=/ card [%pass path internal-note]
[bone card]
::
[[%.y move] ap-state]
2016-11-24 07:25:07 +03:00
::
2019-04-27 08:42:04 +03:00
:: +ap-pass: request action.
::
++ ap-pass
|= [=path =internal-note]
2019-04-27 08:42:04 +03:00
^+ ap-state
::
=/ =internal-move
=/ move [%pass path internal-note]
[agent-bone move]
::
=/ internal-moves [internal-move agent-moves]
::
ap-state(agent-moves internal-moves)
2019-04-27 08:42:04 +03:00
::
2019-05-13 10:40:50 +03:00
:: +ap-reinstall: reinstall.
2016-11-24 07:25:07 +03:00
::
2019-05-13 10:40:50 +03:00
++ ap-reinstall
~/ %ap-reinstall
2019-05-03 01:53:27 +03:00
|= =vase
2019-04-27 08:42:04 +03:00
^+ ap-state
::
=/ prep
2019-05-13 10:40:50 +03:00
=/ installed ap-install(running-state.sat vase)
=/ running (some running-state.sat)
(installed running)
::
=^ maybe-tang ap-state prep
::
?~ maybe-tang
ap-state
(ap-lame %prep-failed u.maybe-tang)
2016-11-24 07:25:07 +03:00
::
2019-04-27 08:42:04 +03:00
:: +ap-peel: apply %peel.
::
2016-11-24 07:25:07 +03:00
++ ap-peel
2019-05-03 01:53:27 +03:00
|= [=mark =path]
2019-04-27 08:42:04 +03:00
^+ ap-state
::
=. required-trans.sat (~(put by required-trans.sat) agent-bone mark)
2019-05-03 01:53:27 +03:00
::
(ap-peer path)
2016-11-24 07:25:07 +03:00
::
2019-04-27 08:42:04 +03:00
:: +ap-peer: apply %peer.
::
++ ap-peer
~/ %ap-peer
2019-04-27 08:42:04 +03:00
|= pax=path
^+ ap-state
::
=/ incoming [attributing.routes.agent-privilege pax]
::
=. incoming.subscribers.sat
(~(put by incoming.subscribers.sat) agent-bone incoming)
2019-05-03 01:53:27 +03:00
::
2019-05-13 10:40:50 +03:00
=^ maybe-arm ap-state (ap-find-arm %peer pax)
::
?~ maybe-arm
2019-05-03 01:53:27 +03:00
ap-state
::
=/ arm u.maybe-arm
=/ =vase !>((slag p.arm pax))
=/ old agent-moves
2019-05-03 01:53:27 +03:00
::
=. agent-moves ~
=^ maybe-tang ap-state (ap-call q.arm vase)
::
=/ internal-moves=(list internal-move)
=/ move [agent-bone %give %reap maybe-tang]
[move old]
2019-05-03 01:53:27 +03:00
::
=. agent-moves (weld agent-moves internal-moves)
2019-05-03 01:53:27 +03:00
::
?^ maybe-tang
2019-05-13 10:40:50 +03:00
ap-silent-delete
2019-05-03 01:53:27 +03:00
ap-state
2019-04-27 08:42:04 +03:00
::
:: +ap-poke: apply %poke.
2016-11-24 07:25:07 +03:00
::
2019-04-27 08:42:04 +03:00
++ ap-poke
~/ %ap-poke
2019-05-03 01:53:27 +03:00
|= =cage
2019-04-27 08:42:04 +03:00
^+ ap-state
::
2019-05-13 10:40:50 +03:00
=^ maybe-arm ap-state (ap-find-arm %poke p.cage ~)
2019-05-03 01:53:27 +03:00
::
?~ maybe-arm
2019-05-13 10:40:50 +03:00
=/ =tang (ap-tang "no poke arm for {(trip p.cage)}")
2019-05-03 01:53:27 +03:00
(ap-give %coup (some tang))
::
=/ arm u.maybe-arm
::
=/ =vase
2019-05-13 10:40:50 +03:00
=/ vas (ap-atomic-vase %tas p.cage)
?. =(0 p.arm)
q.cage
(slop vas q.cage)
::
=^ tur ap-state (ap-call q.arm vase)
2016-11-24 07:25:07 +03:00
(ap-give %coup tur)
::
2019-04-27 08:42:04 +03:00
:: +ap-lame: pour error.
::
++ ap-lame
2019-05-03 01:53:27 +03:00
|= [=term =tang]
2019-04-27 08:42:04 +03:00
^+ ap-state
::
2019-05-13 10:40:50 +03:00
=^ maybe-arm ap-state (ap-find-arm /lame)
::
=/ form |=(=tank [%rose [~ "! " ~] tank ~])
2019-05-03 01:53:27 +03:00
::
?~ maybe-arm
=/ tang [>%ap-lame agent-name term< (turn tang form)]
2019-05-03 01:53:27 +03:00
~> %slog.`rose+[" " "[" "]"]^(flop tang)
2019-04-27 08:42:04 +03:00
ap-state
2019-05-03 01:53:27 +03:00
::
=/ arm u.maybe-arm
=/ =vase !>([term tang])
::
=^ maybe-tang ap-state (ap-call q.arm vase)
2019-05-03 01:53:27 +03:00
::
?^ maybe-tang
=/ tang u.maybe-tang
=/ etc (flop [>%ap-lame-lame< (turn tang form)])
~> %slog.`rose+[" " "[" "]"]^(welp etc [%leaf "." (flop tang)])
2019-04-27 08:42:04 +03:00
ap-state
2019-05-03 01:53:27 +03:00
::
2019-04-27 08:42:04 +03:00
ap-state
2016-11-24 07:25:07 +03:00
::
2019-04-27 08:42:04 +03:00
:: +ap-misvale: broken vale.
::
++ ap-misvale
2019-05-03 01:53:27 +03:00
|= =wire
2019-04-27 08:42:04 +03:00
^+ ap-state
::
2019-05-03 01:53:27 +03:00
~& [%ap-blocking-misvale wire]
=/ misvaled (~(put in misvale.sat) wire)
ap-state(misvale.sat misvaled)
2019-04-27 08:42:04 +03:00
::
2019-05-13 10:40:50 +03:00
:: +ap-generic-take: generic take.
2016-11-04 04:35:47 +03:00
::
2019-05-13 10:40:50 +03:00
++ ap-generic-take
~/ %ap-generic-take
|= [=path =vase]
2019-04-27 08:42:04 +03:00
^+ ap-state
::
2019-05-03 01:53:27 +03:00
?. &(?=([@ *] q.vase) ((sane %tas) -.q.vase))
2019-05-13 10:40:50 +03:00
=/ =tang (ap-tang "pour: malformed card")
2019-05-03 01:53:27 +03:00
(ap-lame %pour tang)
::
=/ =term -.q.vase
2019-05-03 01:53:27 +03:00
::
2019-05-13 10:40:50 +03:00
=^ maybe-arm ap-state (ap-find-arm [term path])
2019-05-03 01:53:27 +03:00
::
?~ maybe-arm
2019-05-13 10:40:50 +03:00
=/ =tang (ap-tang "pour: no {(trip -.q.vase)}: {<path>}")
(ap-lame term tang)
::
=/ arm u.maybe-arm
::
=^ at-slot cache.sat (~(slot wa cache.sat) 3 vase)
::
=/ vase (slop !>((slag p.arm path)) at-slot)
2019-05-03 01:53:27 +03:00
::
=^ maybe-tang ap-state (ap-call q.arm vase)
::
?^ maybe-tang
(ap-lame term u.maybe-tang)
2019-04-27 08:42:04 +03:00
ap-state
2016-11-24 07:25:07 +03:00
::
2019-05-13 10:40:50 +03:00
:: +ap-unwrap-take: unwrap take.
2019-04-27 08:42:04 +03:00
::
2019-05-13 10:40:50 +03:00
++ ap-unwrap-take
~/ %ap-unwrap-take
2019-05-03 01:53:27 +03:00
|= [=term pax=path =cage]
2019-04-27 08:42:04 +03:00
^+ ap-state
::
2019-05-13 10:40:50 +03:00
=^ maybe-arm ap-state (ap-find-arm [term p.cage pax])
::
?~ maybe-arm
2019-05-13 10:40:50 +03:00
=/ =tang (ap-tang "{(trip term)}: no {<`path`[p.cage pax]>}")
2019-05-03 01:53:27 +03:00
(ap-lame term tang)
::
=/ arm u.maybe-arm
::
2019-05-03 01:53:27 +03:00
=/ =vase
%- slop
?: =(0 p.arm)
=/ =vase (ap-cage cage)
[!>(`path`pax) vase]
[!>((slag (dec p.arm) `path`pax)) q.cage]
2019-05-03 01:53:27 +03:00
::
=^ maybe-tang ap-state (ap-call q.arm vase)
2019-05-03 01:53:27 +03:00
::
?^ maybe-tang
(ap-lame q.arm u.maybe-tang)
2019-04-27 08:42:04 +03:00
ap-state
::
2019-05-13 10:40:50 +03:00
:: +ap-specific-take: specific take.
2016-11-24 07:25:07 +03:00
::
2019-05-13 10:40:50 +03:00
++ ap-specific-take
|= [=path =internal-gift]
2019-04-27 08:42:04 +03:00
^+ ap-state
::
?- -.internal-gift
2019-05-13 10:40:50 +03:00
%coup (ap-non-diff-take %coup +.path (some !>(p.internal-gift)))
%diff (ap-diff attributing.routes.agent-privilege path p.internal-gift)
2019-05-13 10:40:50 +03:00
%quit (ap-non-diff-take %quit +.path ~)
%reap (ap-non-diff-take %reap +.path (some !>(p.internal-gift)))
2019-05-03 01:53:27 +03:00
%http-response !!
2016-11-24 07:25:07 +03:00
==
::
2019-05-13 10:40:50 +03:00
:: +ap-install: install wrapper.
2019-04-27 08:42:04 +03:00
::
2019-05-13 10:40:50 +03:00
++ ap-install
|= maybe-vase=(unit vase)
2019-04-27 08:42:04 +03:00
^- [(unit tang) _ap-state]
::
2019-05-13 10:40:50 +03:00
=^ maybe-tang ap-state (ap-prep maybe-vase)
2019-05-03 01:53:27 +03:00
::
=/ new-misvale-data
~? !=(misvale.sat *misvale-data)
[%misvale-drop misvale.sat]
:: new app might mean new marks
*misvale-data
::
=/ new-agent-config
=/ =term ?~(maybe-vase %boot %bump)
::
=/ possibly-suss
?~ maybe-tang
=/ =suss [agent-name term now]
[%.y suss]
[%.n u.maybe-tang]
::
[possibly-suss agent-config]
::
=/ next
%= ap-state
misvale.sat new-misvale-data
2019-06-27 07:08:07 +03:00
agent-config new-agent-config
2019-05-13 10:40:50 +03:00
arm-cache.sat ~
==
::
[maybe-tang next]
2016-11-24 07:25:07 +03:00
::
2019-05-13 10:40:50 +03:00
:: +ap-prep: low-level install.
2019-04-27 08:42:04 +03:00
::
2019-05-13 10:40:50 +03:00
++ ap-prep
~/ %ap-prep
|= maybe-vase=(unit vase)
2019-04-27 08:42:04 +03:00
^- [(unit tang) _ap-state]
::
2019-05-13 10:40:50 +03:00
?. (ap-exists-arm %prep)
?~ maybe-vase
[~ ap-state]
2019-05-03 01:53:27 +03:00
::
2019-05-13 10:40:50 +03:00
=/ new-type
=/ new (slot 13 running-state.sat)
p.new
2019-05-03 01:53:27 +03:00
::
2019-05-13 10:40:50 +03:00
=/ old-type
=/ old (slot 13 u.maybe-vase)
p.old
::
?. (~(nest ut new-type) %.n old-type)
2019-05-13 10:40:50 +03:00
=/ =tang (ap-tang "prep mismatch")
[(some tang) ap-state]
::
=/ next ap-state(+13.q.running-state.sat +13.q.u.maybe-vase)
[~ next]
2019-05-03 01:53:27 +03:00
::
=/ =vase
?~ maybe-vase
!>(~)
(slop !>(~) (slot 13 u.maybe-vase))
2019-05-03 01:53:27 +03:00
::
(ap-call %prep vase)
2016-11-24 07:25:07 +03:00
::
2019-05-13 10:40:50 +03:00
:: +ap-silent-delete: silent delete.
2019-04-27 08:42:04 +03:00
::
2019-05-13 10:40:50 +03:00
++ ap-silent-delete
2019-04-27 08:42:04 +03:00
^+ ap-state
::
=/ incoming (~(get by incoming.subscribers.sat) agent-bone)
?~ incoming
2019-05-03 01:53:27 +03:00
ap-state
::
2019-04-27 08:42:04 +03:00
%_ ap-state
incoming.subscribers.sat (~(del by incoming.subscribers.sat) agent-bone)
meter.subscribers.sat (~(del by meter.subscribers.sat) agent-bone)
2016-11-24 07:25:07 +03:00
==
::
2019-05-13 10:40:50 +03:00
:: +ap-load-delete: load delete.
2019-04-27 08:42:04 +03:00
::
2019-05-13 10:40:50 +03:00
++ ap-load-delete
2019-04-27 08:42:04 +03:00
^+ ap-state
::
=/ maybe-incoming (~(get by incoming.subscribers.sat) agent-bone)
?~ maybe-incoming
2019-05-03 01:53:27 +03:00
ap-state
::
=/ incoming u.maybe-incoming
::
=: incoming.subscribers.sat (~(del by incoming.subscribers.sat) agent-bone)
meter.subscribers.sat (~(del by meter.subscribers.sat) agent-bone)
2019-05-03 01:53:27 +03:00
==
::
2019-05-13 10:40:50 +03:00
=^ maybe-arm ap-state (ap-find-arm %pull q.incoming)
2019-05-03 01:53:27 +03:00
::
?~ maybe-arm
2019-05-03 01:53:27 +03:00
ap-state
::
=/ arm u.maybe-arm
=/ =vase !>((slag p.arm q.incoming))
2019-05-03 01:53:27 +03:00
::
=^ maybe-tang ap-state (ap-call q.arm vase)
::
?^ maybe-tang
(ap-lame q.arm u.maybe-tang)
2019-04-27 08:42:04 +03:00
ap-state
2016-11-24 07:25:07 +03:00
::
2019-04-27 08:42:04 +03:00
:: +ap-kill: queue kill.
::
++ ap-kill
^+ ap-state
2019-05-13 10:40:50 +03:00
::
=> ap-load-delete
(ap-give %quit ~)
2016-11-24 07:25:07 +03:00
::
2019-05-13 10:40:50 +03:00
:: +ap-non-diff-take: non-diff gall take.
2019-04-27 08:42:04 +03:00
::
2019-05-13 10:40:50 +03:00
++ ap-non-diff-take
~/ %ap-non-diff-take
|= [=term =path maybe-vase=(unit vase)]
2019-04-27 08:42:04 +03:00
^+ ap-state
::
2019-05-13 10:40:50 +03:00
=^ maybe-arm ap-state (ap-find-arm term path)
2019-05-03 01:53:27 +03:00
::
?~ maybe-arm
2019-04-27 08:42:04 +03:00
ap-state
2019-05-03 01:53:27 +03:00
::
=/ arm u.maybe-arm
=/ =vase
=/ vax !>((slag p.arm path))
?~ maybe-vase
vax
(slop vax u.maybe-vase)
::
=^ maybe-tang ap-state (ap-call q.arm vase)
2019-05-03 01:53:27 +03:00
::
?^ maybe-tang
(ap-lame q.arm u.maybe-tang)
2019-04-27 08:42:04 +03:00
ap-state
::
:: +ap-safe: process move list.
2016-11-24 07:25:07 +03:00
::
2019-04-27 08:42:04 +03:00
++ ap-safe
~/ %ap-safe
2019-05-03 01:53:27 +03:00
|= =vase
^- [(each (list internal-move) tang) _ap-state]
2019-04-27 08:42:04 +03:00
::
2019-05-03 01:53:27 +03:00
?~ q.vase
[[%.y ~] ap-state]
2019-05-03 01:53:27 +03:00
::
?@ q.vase
2019-05-13 10:40:50 +03:00
=/ =tang (ap-tang "move: malformed list")
2019-05-03 01:53:27 +03:00
[[%.n tang] ap-state]
::
=^ hed cache.sat (~(slot wa cache.sat) 2 vase)
=^ possibly-internal-move ap-state (ap-move hed)
::
?: ?=(%.n -.possibly-internal-move)
[possibly-internal-move ap-state]
2019-05-03 01:53:27 +03:00
::
=/ =internal-move p.possibly-internal-move
2019-05-03 01:53:27 +03:00
::
=^ tel cache.sat (~(slot wa cache.sat) 3 vase)
2019-05-03 01:53:27 +03:00
=^ res ap-state $(vase tel)
::
=/ possibly-internal-moves
2019-05-03 01:53:27 +03:00
?: ?=(%.n -.res)
res
[%.y [internal-move p.res]]
2019-05-03 01:53:27 +03:00
::
[possibly-internal-moves ap-state]
2016-11-24 07:25:07 +03:00
::
2019-05-13 10:40:50 +03:00
:: +ap-handle-result: handle result.
2019-04-27 08:42:04 +03:00
::
2019-05-13 10:40:50 +03:00
++ ap-handle-result
~/ %ap-handle-result
2019-05-03 01:53:27 +03:00
|= =vase
2019-04-27 08:42:04 +03:00
^- [(unit tang) _ap-state]
::
2019-05-03 01:53:27 +03:00
?: ?=(@ q.vase)
2019-05-13 10:40:50 +03:00
=/ =tang (ap-tang "ap-handle-result: invalid product (atom)")
2019-05-03 01:53:27 +03:00
[(some tang) ap-state]
::
=^ hed cache.sat (~(slot wa cache.sat) 2 vase)
=^ possibly-internal-moves ap-state (ap-safe hed)
2019-05-03 01:53:27 +03:00
::
?: ?=(%.n -.possibly-internal-moves)
=/ =tang p.possibly-internal-moves
[(some tang) ap-state]
2019-05-03 01:53:27 +03:00
::
=/ internal-moves p.possibly-internal-moves
2019-05-03 01:53:27 +03:00
::
=^ tel cache.sat (~(slot wa cache.sat) 3 vase)
2019-05-13 10:40:50 +03:00
=^ possibly-vase ap-state (ap-verify-core tel)
2019-05-03 01:53:27 +03:00
::
?: ?=(%.n -.possibly-vase)
=/ =tang p.possibly-vase
[(some tang) ap-state]
::
=/ next
%_ ap-state
2019-06-12 14:25:49 +03:00
agent-moves (weld (flop internal-moves) agent-moves)
running-state.sat p.possibly-vase
==
::
[~ next]
2016-11-24 07:25:07 +03:00
::
2019-05-13 10:40:50 +03:00
:: +ap-verify-core: verify core.
2019-04-27 08:42:04 +03:00
::
2019-05-13 10:40:50 +03:00
++ ap-verify-core
~/ %ap-verify-core
2019-04-27 08:42:04 +03:00
|= vax=vase
^- [(each vase tang) _ap-state]
::
=/ received-type p.vax
=/ running-type p.running-state.sat
2019-05-03 01:53:27 +03:00
::
=^ nests cache.sat (~(nest wa cache.sat) running-type received-type)
::
=/ possibly-vase
?. nests
2019-05-13 10:40:50 +03:00
=/ =tang (ap-tang "invalid core")
[%.n tang]
[%.y vax]
::
[possibly-vase ap-state]
2016-11-24 07:25:07 +03:00
::
2019-04-27 08:42:04 +03:00
:: +ap-slam: virtual slam.
::
++ ap-slam
2016-11-24 07:25:07 +03:00
~/ %ap-slam
|= [=term gat=vase arg=vase]
2019-04-27 08:42:04 +03:00
^- [(each vase tang) _ap-state]
::
=/ compiled
=/ =type [%cell p.gat p.arg]
=/ =hoon [%cnsg [%$ ~] [%$ 2] [%$ 3] ~]
(~(mint wa cache.sat) type hoon)
::
=/ virtual
=/ trap |.(compiled)
(mule trap)
::
?: ?=(%.n -.virtual)
2019-05-13 10:40:50 +03:00
=/ =tang (ap-tang "call: {<term>}: type mismatch")
=/ sam (~(peek ut p.gat) %free 6)
=/ print
(slog >%ap-slam-mismatch< ~(duck ut p.arg) ~(duck ut sam) ~)
(print [[%.n tang] ap-state])
::
=/ =worm +>.virtual
=/ =vase +<.virtual
=/ =type p.vase
=/ nock q.vase
2019-05-13 10:40:50 +03:00
=/ ton (mock [[q.gat q.arg] nock] ap-namespace-view)
::
=/ possibly-vase
?- -.ton
%0 [%.y type p.ton]
%1 [%.n (turn p.ton |=(a=* (smyt (path a))))]
%2 [%.n p.ton]
==
2019-05-03 01:53:27 +03:00
::
=/ next ap-state(cache.sat worm)
[possibly-vase next]
2016-11-24 07:25:07 +03:00
::
2019-05-13 10:40:50 +03:00
:: +ap-namespace-view: namespace view.
2019-04-27 08:42:04 +03:00
::
2019-05-13 10:40:50 +03:00
++ ap-namespace-view (sloy ska)
2019-04-27 08:42:04 +03:00
::
2019-05-13 10:40:50 +03:00
:: +ap-tang: standard tang.
2019-04-27 08:42:04 +03:00
::
2019-05-13 10:40:50 +03:00
++ ap-tang
2019-05-03 01:53:27 +03:00
|= =tape
2016-11-24 07:25:07 +03:00
^- tang
2019-04-27 08:42:04 +03:00
::
=/ =tank [%leaf (weld "gall: {<agent-name>}: " tape)]
2019-05-03 01:53:27 +03:00
[tank ~]
2016-11-24 07:25:07 +03:00
::
2019-05-13 10:40:50 +03:00
:: +ap-atomic-vase: atomic vase.
2019-04-27 08:42:04 +03:00
::
2019-05-13 10:40:50 +03:00
++ ap-atomic-vase
2019-05-03 01:53:27 +03:00
|= [=term =atom]
2016-11-24 07:25:07 +03:00
^- vase
2019-04-27 08:42:04 +03:00
::
2019-05-03 01:53:27 +03:00
=/ =type [%atom term (some atom)]
2019-05-13 10:40:50 +03:00
[type atom]
2016-11-24 07:25:07 +03:00
::
2019-04-27 08:42:04 +03:00
:: +ap-vain: card to vane.
::
++ ap-vain
2019-05-03 01:53:27 +03:00
|= =term
2016-11-24 07:25:07 +03:00
^- (unit @tas)
2019-04-27 08:42:04 +03:00
::
2019-05-03 01:53:27 +03:00
?+ term ~& [%ap-vain term]
~
%bonk `%a
2019-02-02 04:00:15 +03:00
%build `%f
%cash `%a
%conf `%g
%cred `%c
%crew `%c
%crow `%c
%deal `%g
%dirk `%c
%drop `%c
%flog `%d
%info `%c
%keep `%f
%kill `%f
%look `%j
2019-08-07 01:42:37 +03:00
%listen `%j
2019-02-02 04:00:15 +03:00
%merg `%c
%mont `%c
%moon `%j
2019-02-02 04:00:15 +03:00
%nuke `%a
%ogre `%c
%perm `%c
%rest `%b
2019-08-08 01:15:25 +03:00
%rekey `%j
2019-02-02 04:00:15 +03:00
%wait `%b
%want `%a
%warp `%c
2019-08-11 00:24:31 +03:00
%wash `%g
2019-02-02 04:00:15 +03:00
%wipe `%f
::
2019-07-04 03:08:23 +03:00
%request `%i
%cancel-request `%i
2019-07-04 02:01:45 +03:00
%serve `%e
%connect `%e
%disconnect `%e
%rule `%e
2016-11-24 07:25:07 +03:00
==
--
--
2019-05-03 01:53:27 +03:00
::
:: +call: request.
::
++ call
2016-11-24 07:25:07 +03:00
~% %gall-call +> ~
2019-05-03 01:53:27 +03:00
|= [=duct hic=(hypo (hobo task:able))]
^- [(list move) _gall-payload]
2019-04-11 23:34:30 +03:00
::
2019-05-13 10:40:50 +03:00
~| [%gall-call-failed duct q.hic]
::
:: make sure our task is hard
=/ =task:able
?. ?=(%soft -.q.hic)
q.hic
;; task:able p.q.hic
2019-04-11 23:34:30 +03:00
::
2019-05-03 01:53:27 +03:00
=/ initialised (mo-abed:mo duct)
::
2019-05-13 10:40:50 +03:00
?- -.task
2019-04-11 23:34:30 +03:00
::
%conf
::
2019-05-13 10:40:50 +03:00
=/ =dock p.task
2019-05-03 01:53:27 +03:00
=/ =ship p.dock
?. =(our ship)
~& [%gall-not-ours ship]
[~ gall-payload]
2019-04-11 23:34:30 +03:00
::
2019-05-29 10:46:55 +03:00
~& [%gall-booting q.dock q.task]
2019-05-13 10:40:50 +03:00
=> (mo-boot:initialised q.dock q.task)
mo-abet
2019-04-11 23:34:30 +03:00
::
%deal
::
2019-05-13 10:40:50 +03:00
=/ =sock p.task
=/ =internal-task q.task
2019-05-03 01:53:27 +03:00
::
2019-05-13 10:40:50 +03:00
?. =(q.sock our)
?> =(p.sock our)
=> (mo-handle-foreign-request:initialised q.sock internal-task)
mo-abet
::
=> (mo-handle-local:initialised p.sock internal-task)
mo-abet
2019-04-11 23:34:30 +03:00
::
%init
::
=/ payload gall-payload(system-duct.agents.gall duct)
2019-05-05 03:23:22 +03:00
[~ payload]
2019-04-11 23:34:30 +03:00
::
2019-05-03 01:53:27 +03:00
%sunk
2019-04-11 23:34:30 +03:00
::
2019-05-03 01:53:27 +03:00
[~ gall-payload]
2019-04-11 23:34:30 +03:00
::
2019-05-03 01:53:27 +03:00
%vega
2019-04-11 23:34:30 +03:00
::
2019-05-03 01:53:27 +03:00
[~ gall-payload]
2019-04-11 23:34:30 +03:00
::
%west
::
2019-05-13 10:40:50 +03:00
=/ =ship p.task
=/ =path q.task
=/ =noun r.task
::
?> ?=([?(%ge %gh) @ ~] path)
=/ agent-name i.t.path
2019-05-03 01:53:27 +03:00
::
2019-05-13 10:40:50 +03:00
?: ?=(%ge i.path)
=/ mes ;;((pair @ud forward-ames) noun)
=> (mo-handle-forward:initialised ship agent-name mes)
2019-05-13 10:40:50 +03:00
mo-abet
2019-05-03 01:53:27 +03:00
::
2019-05-13 10:40:50 +03:00
=/ mes ;;((pair @ud reverse-ames) noun)
=> (mo-handle-backward:initialised ship agent-name mes)
2019-05-13 10:40:50 +03:00
mo-abet
2019-08-11 00:24:31 +03:00
::
%wash
=. running.ship-state.gall (~(run by running.ship-state.gall) |=(=agent agent(cache *worm)))
[~ gall-payload]
::
%wegh
::
2019-06-26 00:25:03 +03:00
=/ blocked
=/ queued (~(run by blocked.agents.gall) |=(blocked [%.y +<]))
(sort ~(tap by queued) aor)
::
=/ running
=/ active (~(run by running.agents.gall) |=(agent [%.y +<]))
(sort ~(tap by active) aor)
::
2018-12-13 04:34:25 +03:00
=/ =mass
2019-05-03 01:53:27 +03:00
:+ %gall %.n
:~ [%foreign %.y contacts.agents.gall]
2019-06-26 00:25:03 +03:00
[%blocked %.n blocked]
[%active %.n running]
[%dot %.y gall]
2018-12-13 04:34:25 +03:00
==
::
=/ moves
=/ =move [duct %give %mass mass]
[move ~]
::
[moves gall-payload]
2016-11-24 07:25:07 +03:00
==
::
2019-05-03 01:53:27 +03:00
:: +load: recreate vane.
::
++ load
|= =gall-old
2019-05-03 01:53:27 +03:00
^+ gall-payload
::
?- -.gall-old
%0 gall-payload(gall gall-old)
2016-11-24 07:25:07 +03:00
==
::
2019-05-03 01:53:27 +03:00
:: +scry: standard scry.
::
2016-11-24 07:25:07 +03:00
++ scry
~/ %gall-scry
2019-05-05 03:23:22 +03:00
|= [fur=(unit (set monk)) =term =shop =desk =coin =path]
2016-11-24 07:25:07 +03:00
^- (unit (unit cage))
2019-05-05 03:23:22 +03:00
?. ?=(%.y -.shop)
2019-05-03 01:53:27 +03:00
~
::
2019-05-05 03:23:22 +03:00
=/ =ship p.shop
2019-05-03 01:53:27 +03:00
::
2019-05-05 03:23:22 +03:00
?: ?& =(%u term)
=(~ path)
=([%$ %da now] coin)
=(our ship)
2016-11-24 07:25:07 +03:00
==
=/ =vase !>((~(has by running.agents.gall) desk))
2019-05-05 03:23:22 +03:00
=/ =cage [%noun vase]
(some (some cage))
2019-05-03 01:53:27 +03:00
::
2019-05-05 03:23:22 +03:00
?. =(our ship)
2016-11-24 07:25:07 +03:00
~
2019-05-03 01:53:27 +03:00
::
2019-05-05 03:23:22 +03:00
?. =([%$ %da now] coin)
2016-11-24 07:25:07 +03:00
~
2019-05-03 01:53:27 +03:00
::
?. (~(has by running.agents.gall) desk)
2019-05-05 03:23:22 +03:00
(some ~)
2019-05-03 01:53:27 +03:00
::
2019-05-05 03:23:22 +03:00
?. ?=(^ path)
2016-11-24 07:25:07 +03:00
~
2019-05-03 01:53:27 +03:00
::
2019-05-05 03:23:22 +03:00
=/ initialised mo-abed:mo
=/ =privilege [%high [~ ship]]
(mo-peek:initialised desk privilege term path)
2016-11-24 07:25:07 +03:00
::
2019-05-03 01:53:27 +03:00
:: +stay: save without cache.
::
++ stay gall
2019-05-03 01:53:27 +03:00
::
:: +take: response.
2016-11-24 07:25:07 +03:00
::
2019-05-03 01:53:27 +03:00
++ take
~/ %gall-take
2019-05-05 03:23:22 +03:00
|= [=wire =duct hin=(hypo sign-arvo)]
^- [(list move) _gall-payload]
::
2019-05-13 10:40:50 +03:00
~| [%gall-take-failed wire]
2019-05-05 03:23:22 +03:00
::
?> ?=([?(%sys %use) *] wire)
::
2019-05-05 03:23:22 +03:00
=/ initialised (mo-abed:mo duct)
2019-05-29 10:46:55 +03:00
=/ =sign-arvo q.hin
::
=>
::
2019-05-05 03:23:22 +03:00
?- i.wire
2019-05-29 10:46:55 +03:00
%sys (mo-handle-sys:initialised t.wire sign-arvo)
2019-05-13 10:40:50 +03:00
%use (mo-handle-use:initialised t.wire hin)
==
::
mo-abet
2016-11-24 07:25:07 +03:00
--