Messages
--------

Agent

(:init)                            <= (:init-ok)
(:kill)

(:status)                          <= (:status status)
(:status-after submessage)         <= (:status status)

   The submessage must be an authority or options message.

   A status lists what O-plan is doing and can contain the following
   elements: :handling-events, :planning, (:waiting reasons).


Planning

(:domain domain-name)              <= (:domain (domain-name task-name...))
(:set-task task-name)              <= planning-status
(:add-to-task addition)            <= planning-status
(:replan)                          <= planning-status

   A planning-status is one of (:finished), (:no-more-alternatives),
   or (:waiting reasons) where reasons is a non-empty subset of
   (:triggers :authority).  It is also possible for O-Plan to
   ask a question by sending (:question keyword issue-description data),
   which will immediately be followed by (:waiting (:triggers)).
   A question is answered by sending (:answer keyword data) to O-Plan.
   
   An addition given with :add-to-task is one of:
     :action pattern
     :all-of (addition)...
     :initially pattern value
     :task task-schema-name
     :time-window from-node-end to-node-end min max

   The from-node-end in a :time-window addition can be :zero
   to indicate an "absolute" constraint.

(:check-plan)                      <= (:checked error-count)
(:check-plan :get-plan-statistics) <= (:checked :statistics a-list)

(:eval-plan)                       <= (:evaluation a-list)

(:get :plan-view)                  <= (:plan-view node-descriptions)
(:get :world-view node-id)         <= (:world-view node-id pv-pairs)

(:get :action-levels)              <= (:action-levels a-list)


(:get :plan-view viewer-arg...)    <= (:finished-view)
(:get :world-view node-id
      viewer-arg...)               <= (:finished-view)


Authority

(:authority :level value)          <= (:authority :level value)
(:what-authority :level)           <= (:authority :level value)


Planning parameters

(:set-parameters name value ...)   <= (:ok)
(:get-parameters name...)          <= (:values (name value ...))


Options

(:make-option &key name)           <= (:option name)
(:get-option)                      <= (:option name)
(:set-option name)                 <= (:option name)
(:push-option)                     <= (:option name)
(:pop-option)                      <= (:option name)
(:twin-option &key name)           <= (:option name)
(:clear-option)                    <= (:option name)

(:get-option-tree)                 <= (:option tree)



Node descriptions
-----------------

 (node-name             ;e.g. node-1
  begin-predecessors    ;e.g. ((node-1 :end) (node-3-2 :begin))
  begin-successors      ;
  end-predecessors      ;
  end-successors        ;
  time-bounds           ;(est lst eft lft)
  node-type             ;e.g. action
  pattern)              ;e.g. (puton a b)



Program interface
-----------------

Planning

(plan-for domain-name task-name)   -> t or nil
(replan)                           -> t or nil

(generate-plans domain-name task-name
                &optional (how-many :all)
                          (thunk #'(lambda () nil)))

(generate-plans-as-options domain-name task-name &optional (how-many :all))
   -> list-of-option-names

(plan-by-levels domain-name task-name) -> t or nil


Authority

(set-authority what value)


Requests for plan information

(request-plan-statistics-list)     -> a-list
(request-plan-view-list)           -> node-descriptions
(request-world-view-list node-id)  -> pv-pairs

(request-plan-view &rest viewer-args)
(request-psgraph format &rest viewer-args)
(request-world-view node-id &rest viewer-args)

(request-action-level-alist)       -> a-list
(request-time-bounds end-tag)      -> (min max)


Component output

(output-off)
(redirect-component-output component file-name)
(set-component-output-stream component stream)
(set-component-debug-level component-or-:all level)


Sending and receiving

(send-to-oplan id &rest args)
(receive-from-oplan pattern &key succeed fail)
(receive-else-error pattern &optional succeed)

(ask-oplan id &rest args)


Timeouts

(define-condition timeout (simple-condition) ())
(define-condition timeout-not-handled (simple-error) ())

(set-timeout seconds)
(cancel-timeout)
(with-timeout seconds &body forms)
(call-with-timeout seconds thunk)


Etc

(pprocess-main-loop)
(exit-oplan)
(add-exit-action thunk)
(go-faster)
