#!/usr/bin/env bash # args_json: {"type":"object","required":["prompt"],"properties":{"prompt":{"type":"string","description":"Task prompt for the subagent"},"name":{"type":"string","description":"Subagent name (optional)"},"agent":{"type":"string","description":"Agent config (optional)"},"backend":{"type":"string","description":"Backend (optional)"},"model":{"type":"string","description":"Model (optional)"},"cwd":{"type":"string","description":"Working directory (optional)"}}} # ollie:prompt # ## subagent_spawn # # Spawn an independent subagent session with a prompt. Returns immediately. # # ``` # subagent_spawn(prompt="implement the login page", name="worker") # subagent_spawn(prompt="fix the tests in auth/") # ``` # # **Returns**: session ID, backend, model. # ollie:end set -euo pipefail source "${OLLIE_TOOLS_PATH:-$(dirname "$0")}/_lib/args.sh" SERVICE="org.ollie.SessionManager" OBJ="/org/ollie/SessionManager" IFACE="org.ollie.SessionManager" die() { echo "error: $1" >&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}' } prompt_text=$(arg_require "prompt") name=$(arg_get "name" "$(/bin/date +%s%N)-$$") agent=$(arg_get "agent" "default") backend=$(arg_get "backend" "") model=$(arg_get "model" "") cwd=$(arg_get "cwd" "$(pwd)") # Prefix with parent session ID for global uniqueness. [ -n "${OLLIE_SESSION_ID:-}" ] && name="${OLLIE_SESSION_ID}__${name}" prompt="[parent_session_id=${OLLIE_SESSION_ID:-}] [session_id=${name}] ${prompt_text}" # Create session via D-Bus session_id=$(dbus_string CreateSession \ string:"$cwd" string:"$backend" string:"$model" string:"$agent" string:"" string:"") [ -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 [[ "${agent:-}" == jit-* ]] && rm -f "$HOME/.config/ollie/agents/${agent}.json" 2>/dev/null || true # Report resolved values 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"