86 lines
2.7 KiB
Bash
Executable File
86 lines
2.7 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# ollie:prompt
|
|
# ## subagent_spawn
|
|
#
|
|
# Spawn an independent subagent session with a prompt. Returns immediately.
|
|
#
|
|
# **Args**: `["-name", name, "-agent", agent, prompt...]` (flags optional)
|
|
#
|
|
# ```
|
|
# call_tool: calls=[{tool: "subagent_spawn", args: ["-name", "worker", "implement the login page"]}]
|
|
# call_tool: calls=[{tool: "subagent_spawn", args: ["fix the tests in auth/"]}]
|
|
# ```
|
|
#
|
|
# **Returns**: session ID, backend, model.
|
|
# ollie:end
|
|
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"
|