77 lines
2.4 KiB
Bash
Executable File
77 lines
2.4 KiB
Bash
Executable File
#!/bin/sh
|
|
# ollie-ask: one-shot prompt helper for Dolphin service menus
|
|
# Usage: ollie-ask <file_or_dir> [prompt_prefix]
|
|
|
|
TARGET="$1"
|
|
PREFIX="${2:-Describe and explain this file:}"
|
|
CWD="$(dirname "$TARGET")"
|
|
PROMPT="$PREFIX $TARGET"
|
|
|
|
SERVICE="org.ollie.SessionManager"
|
|
OBJ="/org/ollie/SessionManager"
|
|
IFACE="org.ollie.SessionManager"
|
|
|
|
# Create session
|
|
SESSION=$(dbus-send --session --dest=$SERVICE --type=method_call --print-reply \
|
|
$OBJ $IFACE.CreateSession \
|
|
string:"$CWD" string:"" string:"" string:"default" 2>/dev/null | \
|
|
awk -F'"' '/string "/{print $2; exit}')
|
|
|
|
if [ -z "$SESSION" ]; then
|
|
notify-send "Ollie" "Failed to create session"
|
|
exit 1
|
|
fi
|
|
|
|
# Submit
|
|
dbus-send --session --dest=$SERVICE --type=method_call --print-reply \
|
|
$OBJ $IFACE.Submit string:"$SESSION" string:"$PROMPT" > /dev/null 2>&1
|
|
|
|
# Wait for agent to start (state becomes non-idle)
|
|
i=0
|
|
while [ $i -lt 20 ]; do
|
|
STATE=$(dbus-send --session --dest=$SERVICE --type=method_call --print-reply \
|
|
$OBJ $IFACE.GetState string:"$SESSION" 2>/dev/null | \
|
|
awk -F'"' '/string "/{print $2; exit}')
|
|
[ "$STATE" != "idle" ] && break
|
|
sleep 0.2
|
|
i=$((i + 1))
|
|
done
|
|
|
|
# Wait for agent to finish (state returns to idle, max 60s)
|
|
i=0
|
|
while [ $i -lt 120 ]; do
|
|
STATE=$(dbus-send --session --dest=$SERVICE --type=method_call --print-reply \
|
|
$OBJ $IFACE.GetState string:"$SESSION" 2>/dev/null | \
|
|
awk -F'"' '/string "/{print $2; exit}')
|
|
[ "$STATE" = "idle" ] && break
|
|
sleep 0.5
|
|
i=$((i + 1))
|
|
done
|
|
|
|
# Get chat via gdbus
|
|
RESULT=$(gdbus call --session --dest $SERVICE --object-path $OBJ \
|
|
--method $IFACE.GetChat "$SESSION" 0 2>/dev/null | \
|
|
sed "s/^('//; s/', int64 [0-9]*)$//; s/\\\\n/\n/g")
|
|
|
|
# Extract assistant response
|
|
ASSISTANT=$(printf '%s\n' "$RESULT" | sed -n '/^\[assistant\]$/,/^\[/{/^\[assistant\]$/d; /^\[/d; p;}')
|
|
[ -z "$ASSISTANT" ] && ASSISTANT="$RESULT"
|
|
|
|
# Kill session
|
|
dbus-send --session --dest=$SERVICE --type=method_call \
|
|
$OBJ $IFACE.KillSession string:"$SESSION" > /dev/null 2>&1
|
|
|
|
# Show result
|
|
TMPFILE=$(mktemp /tmp/ollie-ask.XXXXXX)
|
|
printf '%s' "$ASSISTANT" > "$TMPFILE"
|
|
|
|
if command -v kdialog > /dev/null 2>&1; then
|
|
kdialog --title "Ollie — $(basename "$TARGET")" --textbox "$TMPFILE" 600 400
|
|
elif command -v zenity > /dev/null 2>&1; then
|
|
zenity --text-info --title="Ollie — $(basename "$TARGET")" --width=600 --height=400 --filename="$TMPFILE"
|
|
else
|
|
notify-send -t 30000 "Ollie" "$ASSISTANT"
|
|
fi
|
|
|
|
rm -f "$TMPFILE"
|