Files
memex/notes/skill-shell-actuator.org

3.1 KiB

#+TITLE - Shell Actuator Skill #+AUTHOR - org-agent #+SKILL_NAME - skill-shell-actuator

This skill gives the agent the ability to execute shell commands, protected by a strict, hardcoded whitelist.

Sensor & State (Actuator Registration)

When this skill loads, it registers itself to handle `:shell` actions.

;; A strict whitelist of permitted executables
(defparameter *allowed-commands* '("ls" "git" "rg" "grep" "date" "echo" "cat"))

(defun execute-shell-safely (action)
  "System 2 strictly verifies the command against the whitelist and captures full diagnostics."
  (let* ((cmd-string (getf (getf action :payload) :cmd))
         (executable (car (uiop:split-string cmd-string :separator '(#\Space)))))
    
    (if (member executable *allowed-commands* :test #'string=)
        (progn
          (format t "Shell Actuator - Executing '~a'~%" cmd-string)
          (multiple-value-bind (stdout stderr exit-code)
              (uiop:run-program cmd-string 
                                :output :string 
                                :error-output :string 
                                :ignore-error-status t)
            ;; Inject structured diagnostics back into the core bus
            (org-agent:inject-stimulus 
             `(:type :EVENT 
               :payload (:sensor :shell-response 
                         :cmd ,cmd-string 
                         :stdout ,(or stdout "") 
                         :stderr ,(or stderr "") 
                         :exit-code ,exit-code)))))
        (progn
          (format t "Shell Actuator - BLOCKED illegal command '~a'~%" cmd-string)
          (org-agent:inject-stimulus 
           `(:type :EVENT 
             :payload (:sensor :shell-response 
                       :cmd ,cmd-string 
                       :stdout "" 
                       :stderr "ERROR - Command not in security whitelist." 
                       :exit-code 1)))))))

;; Register the actuator
(org-agent:register-actuator :shell #'execute-shell-safely)

Trigger

(defun trigger-skill-shell-actuator (context)
  (let ((type (getf context :type))
        (payload (getf context :payload)))
    (and (eq type :EVENT)
         (eq (getf payload :sensor) :shell-response))))

Neuro Prompt

(defun neuro-skill-shell-actuator (context)
  (let* ((p (getf context :payload))
         (cmd (getf p :cmd))
         (stdout (getf p :stdout))
         (stderr (getf p :stderr))
         (exit-code (getf p :exit-code)))
    (format nil "
      You executed the shell command - '~a'
      EXIT CODE - ~a
      
      STDOUT:
      ---
      ~a
      ---
      
      STDERR:
      ---
      ~a
      ---
      
      Analyze the diagnostics. If there was an error, explain why and suggest a fix.
      Return a Lisp plist - (:target :emacs :action :message :text \"your summary\")
    " cmd exit-code stdout stderr)))

Registration

(defskill :skill-shell-actuator
  :priority 80
  :trigger #'trigger-skill-shell-actuator
  :neuro #'neuro-skill-shell-actuator
  :symbolic (lambda (action context) action)) ; Pass-through, safety handled by actuator fn