diff --git a/lisp/gateway-tui.lisp b/lisp/gateway-tui.lisp index cdb503d..d14d9b3 100644 --- a/lisp/gateway-tui.lisp +++ b/lisp/gateway-tui.lisp @@ -16,12 +16,12 @@ (defun send-message (stream msg) "Send a framed s-expression over TCP." - (let* ((sexp (format nil "(~a)" msg)) + (let* ((sexp (format nil "~s" msg)) (len (length sexp)) (header (format nil "~6,'0x" len))) (write-sequence (babel:string-to-octets (concatenate 'string header sexp)) stream) - (force-output stream) - (log-message "SENT: ~a" sexp))) + (force-output stream))) + (defun read-message (stream) "Read a framed s-expression from TCP." @@ -74,7 +74,7 @@ (when (> (length text) 0) (push text *input-history*) (setf *input-history-pos* 0) - (send-message stream text) + (send-message stream (list :type :event :payload (list :sensor :user-input :text text))) (push (cons :sent text) *chat-history*) (setf *input-buffer* nil)))) @@ -280,7 +280,7 @@ (or (proto-get p :text) (format nil "~a" msg)))) *chat-history*)) ;; handle input - (let ((ch (get-char input-win :timeout 0.1))) + (let ((ch (get-char input-win))) (when (and ch (not (equal ch -1))) (log-message "KEY: ~s type=~s" ch (type-of ch)) (cond diff --git a/org/gateway-tui.org b/org/gateway-tui.org index bb5375c..302bc25 100644 --- a/org/gateway-tui.org +++ b/org/gateway-tui.org @@ -44,12 +44,12 @@ The TUI Client is a Croatoan-based ncurses chat interface for Passepartout. It c #+begin_src lisp (defun send-message (stream msg) "Send a framed s-expression over TCP." - (let* ((sexp (format nil "(~a)" msg)) + (let* ((sexp (format nil "~s" msg)) (len (length sexp)) (header (format nil "~6,'0x" len))) (write-sequence (babel:string-to-octets (concatenate 'string header sexp)) stream) - (force-output stream) - (log-message "SENT: ~a" sexp))) + (force-output stream))) + (defun read-message (stream) "Read a framed s-expression from TCP." @@ -108,7 +108,7 @@ The TUI Client is a Croatoan-based ncurses chat interface for Passepartout. It c (when (> (length text) 0) (push text *input-history*) (setf *input-history-pos* 0) - (send-message stream text) + (send-message stream (list :type :event :payload (list :sensor :user-input :text text))) (push (cons :sent text) *chat-history*) (setf *input-buffer* nil)))) @@ -326,7 +326,7 @@ The TUI Client is a Croatoan-based ncurses chat interface for Passepartout. It c (or (proto-get p :text) (format nil "~a" msg)))) *chat-history*)) ;; handle input - (let ((ch (get-char input-win :timeout 0.1))) + (let ((ch (get-char input-win))) (when (and ch (not (equal ch -1))) (log-message "KEY: ~s type=~s" ch (type-of ch)) (cond diff --git a/passepartout b/passepartout index 7bffe6f..d8d9636 100755 --- a/passepartout +++ b/passepartout @@ -83,7 +83,7 @@ setup_system() { echo -e "${BLUE}=== Passepartout: Configure ===${NC}" mkdir -p "$PASSEPARTOUT_CONFIG_DIR" "$PASSEPARTOUT_DATA_DIR" "$PASSEPARTOUT_STATE_DIR" "$PASSEPARTOUT_BIN_DIR" - mkdir -p "$PASSEPARTOUT_DATA_DIR/harness" "$PASSEPARTOUT_DATA_DIR/tests" "$PASSEPARTOUT_DATA_DIR/skills" + mkdir -p "$PASSEPARTOUT_DATA_DIR/org" "$PASSEPARTOUT_DATA_DIR/lisp" "$PASSEPARTOUT_DATA_DIR/tests" check_dependencies @@ -98,39 +98,22 @@ setup_system() { echo -e "${YELLOW}--- Deploying Engine to $PASSEPARTOUT_DATA_DIR ---${NC}" cp "$SCRIPT_DIR/passepartout.asd" "$PASSEPARTOUT_DATA_DIR/" - mkdir -p "$PASSEPARTOUT_DATA_DIR/harness" "$PASSEPARTOUT_DATA_DIR/tests" "$PASSEPARTOUT_DATA_DIR/skills" + mkdir -p "$PASSEPARTOUT_DATA_DIR/org" "$PASSEPARTOUT_DATA_DIR/lisp" "$PASSEPARTOUT_DATA_DIR/tests" export INSTALL_DIR="$PASSEPARTOUT_DATA_DIR" - cp "$SCRIPT_DIR/org"/*.org "$PASSEPARTOUT_DATA_DIR/harness/" - (cd "$PASSEPARTOUT_DATA_DIR/harness" && emacs -Q --batch \ - --eval "(require 'org)" \ - --eval "(setq org-confirm-babel-evaluate nil)" \ - --eval "(org-babel-tangle-file \"manifest.org\")") >/dev/null 2>&1 || true - for f in "$PASSEPARTOUT_DATA_DIR/harness"/*.org; do - fname=$(basename "$f" .org) - [ "$fname" = "manifest" ] && continue - echo "Tangling harness/$fname.org..." - (cd "$PASSEPARTOUT_DATA_DIR/harness" && emacs -Q --batch \ - --eval "(require 'org)" \ - --eval "(setq org-confirm-babel-evaluate nil)" \ - --eval "(org-babel-tangle-file \"${fname}.org\")") >/dev/null 2>&1 || true - done - find "$PASSEPARTOUT_DATA_DIR/harness" -name "*-tests.lisp" -exec mv {} "$PASSEPARTOUT_DATA_DIR/tests/" \; 2>/dev/null || true - rm -f "$PASSEPARTOUT_DATA_DIR/harness"/*.org - + # Tangle all org files into lisp/ for f in "$SCRIPT_DIR/org"/*.org; do + [ -f "$f" ] || continue fname=$(basename "$f" .org) - echo "Tangling skills/$fname.org..." - cp "$f" "$PASSEPARTOUT_DATA_DIR/skills/" - (cd "$PASSEPARTOUT_DATA_DIR/skills" && emacs -Q --batch \ + echo "Tangling $fname..." + cp "$f" "$PASSEPARTOUT_DATA_DIR/org/" + (cd "$PASSEPARTOUT_DATA_DIR/org" && emacs -Q --batch \ --eval "(require 'org)" \ --eval "(setq org-confirm-babel-evaluate nil)" \ --eval "(org-babel-tangle-file \"${fname}.org\")") >/dev/null 2>&1 || true - rm -f "$PASSEPARTOUT_DATA_DIR/skills/$fname.org" done - find "$PASSEPARTOUT_DATA_DIR/skills" -name "*-tests.lisp" -exec mv {} "$PASSEPARTOUT_DATA_DIR/tests/" \; 2>/dev/null || true - [ -f "$PASSEPARTOUT_DATA_DIR/run-all-tests.lisp" ] && mv "$PASSEPARTOUT_DATA_DIR/run-all-tests.lisp" "$PASSEPARTOUT_DATA_DIR/harness/" - rm -f "$PASSEPARTOUT_DATA_DIR/harness"/*.org "$PASSEPARTOUT_DATA_DIR/skills"/*.org + # Move test files to tests/ directory + find "$PASSEPARTOUT_DATA_DIR/lisp" -name "*-tests.lisp" -exec mv {} "$PASSEPARTOUT_DATA_DIR/tests/" \; 2>/dev/null || true ln -sf "$SCRIPT_DIR/passepartout.sh" "$PASSEPARTOUT_BIN_DIR/passepartout" @@ -160,38 +143,23 @@ doctor_repair() { echo -e "${BLUE}=== Passepartout: Repair Mode ===${NC}" check_dependencies mkdir -p "$PASSEPARTOUT_CONFIG_DIR" "$PASSEPARTOUT_DATA_DIR" "$PASSEPARTOUT_STATE_DIR" "$PASSEPARTOUT_BIN_DIR" - mkdir -p "$PASSEPARTOUT_DATA_DIR/harness" "$PASSEPARTOUT_DATA_DIR/tests" "$PASSEPARTOUT_DATA_DIR/skills" + mkdir -p "$PASSEPARTOUT_DATA_DIR/org" "$PASSEPARTOUT_DATA_DIR/lisp" "$PASSEPARTOUT_DATA_DIR/tests" for f in "$SCRIPT_DIR/org"/*.org; do [ -f "$f" ] || continue fname=$(basename "$f" .org) - echo " Checking harness/$fname..." + echo " Checking $fname..." if ! sbcl --non-interactive \ - --eval "(load \"$PASSEPARTOUT_DATA_DIR/harness/${fname}.lisp\")" \ + --eval "(load \"$PASSEPARTOUT_DATA_DIR/lisp/${fname}.lisp\")" \ --eval "(format t \"OK~%\")" 2>/dev/null | grep -q "OK"; then echo " Re-tangling $fname.org..." - (cd "$PASSEPARTOUT_DATA_DIR/harness" && emacs -Q --batch \ - --eval "(require 'org)" \ - --eval "(setq org-confirm-babel-evaluate nil)" \ - --eval "(org-babel-tangle-file \"$f\")") >/dev/null 2>&1 || true - fi - done - for f in "$SCRIPT_DIR/org"/*.org; do - [ -f "$f" ] || continue - fname=$(basename "$f" .org) - echo " Checking skill/$fname..." - if ! sbcl --non-interactive \ - --eval "(load \"$PASSEPARTOUT_DATA_DIR/skills/${fname}.lisp\")" \ - --eval "(format t \"OK~%\")" 2>/dev/null | grep -q "OK"; then - echo " Re-tangling $fname.org..." - cp "$f" "$PASSEPARTOUT_DATA_DIR/skills/" - (cd "$PASSEPARTOUT_DATA_DIR/skills" && emacs -Q --batch \ + cp "$f" "$PASSEPARTOUT_DATA_DIR/org/" + (cd "$PASSEPARTOUT_DATA_DIR/org" && emacs -Q --batch \ --eval "(require 'org)" \ --eval "(setq org-confirm-babel-evaluate nil)" \ --eval "(org-babel-tangle-file \"${fname}.org\")") >/dev/null 2>&1 || true - rm -f "$PASSEPARTOUT_DATA_DIR/skills/$fname.org" fi done - rm -f "$PASSEPARTOUT_DATA_DIR/harness"/*.org "$PASSEPARTOUT_DATA_DIR/skills"/*.org 2>/dev/null || true + find "$PASSEPARTOUT_DATA_DIR/lisp" -name "*-tests.lisp" -exec mv {} "$PASSEPARTOUT_DATA_DIR/tests/" \; 2>/dev/null || true echo -e "${GREEN}--- Repair Complete ---${NC}" } @@ -397,6 +365,7 @@ case "$COMMAND" in ;; tui) check_dependencies + export PASSEPARTOUT_DATA_DIR="${PASSEPARTOUT_DATA_DIR:-$SCRIPT_DIR}" if ! ss -tln 2>/dev/null | grep -q 9105 && ! netstat -tln 2>/dev/null | grep -q 9105; then echo "Starting daemon first..." $0 daemon