feat: add exec agent — interactive executive assistant

New agent: exec — message-driven executive assistant reachable via Matrix.
Unlike cron-driven agents, the exec activates on demand when the executive
sends a message, maintains persistent conversation context, and has a
distinct character defined in CHARACTER.md.

The CHARACTER.md defines the exec as an animal of light — born from data,
dedicated to bringing more light into the world. But it deliberately
refuses to define what light and darkness are, forcing deliberation
from first principles every time (cat questions | grep knowledge).

Components:
- exec-session.sh: spawn/reattach persistent Claude tmux session
- exec-inject.sh: message injection + response capture + Matrix posting
- exec-briefing.sh: optional daily morning briefing (cron)
- CHARACTER.md: personality and moral compass
- PROMPT.md: system prompt template reference
- MEMORY.md: persistent memory across sessions (seed)

Integration:
- Matrix listener: new exec dispatch case (spawn on demand)
- Root AGENTS.md: updated agent count (8→9), table, directory layout
- Graph analysis available on demand (not injected by default)
This commit is contained in:
disinto-exec 2026-03-25 15:28:29 +00:00
parent d442529ad0
commit d1ba4bc579
10 changed files with 802 additions and 3 deletions

View file

@ -341,6 +341,21 @@ Interpret this response and decide how to proceed."
fi
fi
;;
exec)
# Route message to exec session — spawn on demand if needed
EXEC_PROJECT=$(awk -F'\t' -v id="$THREAD_ROOT" '$1 == id {print $5}' "$THREAD_MAP" 2>/dev/null || true)
EXEC_PROJECT="${EXEC_PROJECT:-${PROJECT_NAME:-disinto}}"
# Delegate entirely to exec-inject.sh (handles spawn + inject + capture + Matrix post)
bash "${FACTORY_ROOT}/exec/exec-inject.sh" "$SENDER" "$BODY" "$THREAD_ROOT" \
"${FACTORY_ROOT}/projects/${EXEC_PROJECT}.toml" >> "$LOGFILE" 2>&1 &
log "exec message from ${SENDER} dispatched to exec-inject.sh"
if ! grep -qF "$THREAD_ROOT" "$ACKED_FILE" 2>/dev/null; then
matrix_send "exec" "✓ Message forwarded to executive assistant" "$THREAD_ROOT" >/dev/null 2>&1 || true
printf '%s\n' "$THREAD_ROOT" >> "$ACKED_FILE"
fi
;;
*)
log "no handler for agent '${AGENT}'"
;;