#!/usr/bin/env bash # description: Spawn a subagent session, submit a prompt, and return immediately. The subagent runs independently; use PeerSubmit for coordination. # Args: [-name NAME] [-agent A] [-backend B] [-model M] [-cwd DIR] # Output: structured KV (session, backend, model) set -euo pipefail SERVICE="org.ollie.SessionManager" OBJ="/org/ollie/SessionManager" IFACE="org.ollie.SessionManager" die() { printf 'subagent_spawn: %s\n' "$*" >&2; exit 1; } dbus_call() { dbus-send --session --dest=$SERVICE --type=method_call --print-reply \ $OBJ "$IFACE.$1" "${@:2}" 2>/dev/null } dbus_string() { dbus_call "$@" | awk -F'"' '/string "/{print $2; exit}' } name=; agent=; backend=; model=; cwd= while [ $# -gt 0 ]; do case $1 in -name) name=$2; shift ;; -agent) agent=$2; shift ;; -backend) backend=$2; shift ;; -model) model=$2; shift ;; -cwd) cwd=$2; shift ;; --) shift; break ;; -*) die "unknown flag: $1" ;; *) break ;; esac shift done [ $# -eq 0 ] && die "prompt required" # Read agent name from stdin if not provided via flag and stdin is piped. if [ -z "$agent" ] && ! [ -t 0 ]; then agent=$(head -1) fi name=${name:-$(/bin/date +%s%N)-$$} # Prefix with parent session ID for global uniqueness. [ -n "${OLLIE_SESSION_ID:-}" ] && name="${OLLIE_SESSION_ID}__${name}" cwd=${cwd:-$(pwd)} agent=${agent:-default} prompt="[parent_session_id=${OLLIE_SESSION_ID:-}] [session_id=${name}] $*" # Create session via D-Bus session_id=$(dbus_string CreateSession \ string:"$cwd" string:"${backend:-}" string:"${model:-}" string:"$agent") [ -z "$session_id" ] && die "failed to create session" # Rename to our chosen name dbus_call RenameSession string:"$session_id" string:"$name" > /dev/null 2>&1 # Submit prompt dbus_call Submit string:"$session_id" string:"$prompt" > /dev/null 2>&1 || die "failed to submit prompt" # Clean up JIT agent config now that the server has loaded it. [[ "${agent:-}" == jit-* ]] && rm -f "$HOME/.config/ollie/agents/${agent}.json" 2>/dev/null || true # Report resolved values from the live session. config=$(dbus_string GetConfig string:"$session_id") resolved_backend=$(printf '%s\n' "$config" | grep -m1 '^backend=' | cut -d= -f2- || echo "${backend:-default}") resolved_model=$(printf '%s\n' "$config" | grep -m1 '^model=' | cut -d= -f2- || echo "${model:-default}") printf 'session=%s\nbackend=%s\nmodel=%s\n' "$name" "$resolved_backend" "$resolved_model"