# Functions
AsCrewOp attempts to interpret the given message (hopefully a map) as a CrewOp.
DefaultState returns a state at "state" with empty bindings.
JS renders its argument as JSON or as '%#v'.
JShort renders its argument as JS() but only up to 73 characters.
JSON renders its argument as pretty JSON or as '%#v".
NewCrew makes a crew with the given configuration and couplings.
No description provided by the author
NewStdio creates a new Stdio.
NewTimers creates a Timers with the given function that the TimerEntries will use to emit their messages.
ResolveSpecSource attempts to find and compile a spec based o a crew.SpecSource (or something that looks like one).
ShellExpand expands shell commands delimited by '<<' and '>>'.
# Variables
CaptainMachine is the id of the captain.
DefaultLimits is just that.
Interpreters are the standard action interpreters.
TimersMachine is the id of the timers machine.
# Structs
Changed represents changes to a machine after message processing.
Crew represents a collection of machines and associated gear to support message processing, with I/O coupled via two channels (in and out).
CrewConf contains (or will contain) basic crew configuration data.
CrewOp is a crude structure for crew-level operations (such as adding a machine).
JSONStore is a primitive facility to store crew state as JSON in a file.
Limits provides some operation limits.
Result represents all visible output from processing a message.
Stdio is a fairly simple Couplings that uses stdin for input and stdout for output.
TimerEntry represents a pending timer.
TimerMsg is a command that the timers machine can execute.
Timers represents pending timers.
# Interfaces
Couplings provide channels for message input, results output, and persistence.