ollie/scripts/u/complete

81 lines
2.3 KiB
Bash

#!/usr/bin/env bash
# u/complete: AI ghost-text code completion for the current acme window.
set -euo pipefail
PREFIX_MAX=4000
SUFFIX_MAX=1000
MOUNT=${OLLIE:-$HOME/mnt/ollie}
BFG="${0%/*}/../s/bfg"
cmd=${0##*/}
die() { printf '%s: %s\n' "$cmd" "$*" >&2; exit 1; }
usage() {
cat <<EOF
usage: $cmd [-model MODEL] [-backend BACKEND]
Flags:
-model MODEL model to use (default: \$OLLIE_COMPLETE_MODEL)
-backend BACKEND backend to use (default: \$OLLIE_COMPLETE_BACKEND)
-help show this help
EOF
exit 0
}
model=${OLLIE_COMPLETE_MODEL:-}
backend=${OLLIE_COMPLETE_BACKEND:-}
while [ $# -gt 0 ]; do
case $1 in
-model) model=$2; shift ;;
-backend) backend=$2; shift ;;
-help) usage ;;
-*) die "unknown flag: $1" ;;
*) break ;;
esac
shift
done
[ -z "$model" ] && die "model required: set OLLIE_COMPLETE_MODEL or pass -model"
[ -z "$backend" ] && die "backend required: set OLLIE_COMPLETE_BACKEND or pass -backend"
[ -z "${winid:-}" ] || [ "$winid" = "0" ] && die "must be run from an acme window"
# Get filename for language context (last field of ctl line 1)
filename=$(9p read acme/$winid/ctl | awk 'NR==1{print $NF}')
# Sync addr to current dot, read rune offsets
echo "addr=dot" | 9p write acme/$winid/ctl
addr=$(9p read acme/$winid/addr)
q0=$(printf '%s' "$addr" | cut -d, -f1 | tr -d '#[:space:]')
q1=$(printf '%s' "$addr" | cut -d, -f2 | tr -d '#[:space:]')
# Read prefix (before dot) and suffix (from dot onward)
printf '#0,#%s' "$q0" | 9p write acme/$winid/addr
prefix=$(9p read acme/$winid/data)
printf '#%s,$' "$q1" | 9p write acme/$winid/addr
suffix=$(9p read acme/$winid/data)
# Truncate to context budget
prefix="${prefix: -$PREFIX_MAX}"
suffix="${suffix:0:$SUFFIX_MAX}"
# Query model
result=$("$BFG" -agent copilot -model "$model" -backend "$backend" \
"Complete the code at the cursor in ${filename}. Output ONLY the text to insert — no explanation, no markdown, no preamble.
<prefix>
${prefix}
</prefix>
<suffix>
${suffix}
</suffix>")
# Write completion to a new acme window
newid=$(9p read acme/new/ctl | awk 'NR==1{print $1}')
printf 'name ollie/complete\n' | 9p write acme/$newid/ctl
printf '%s' "$result" | 9p write acme/$newid/body
printf 'clean\n' | 9p write acme/$newid/ctl