From e175e5d7cc20348f91cf5bba9cedba14801a82f1 Mon Sep 17 00:00:00 2001 From: Levi Neely Date: Wed, 15 Apr 2026 06:59:01 +0200 Subject: [PATCH] feat: directory-aware session resume via cwd-keyed last-session file last-session now stores {cwd}\t{session-id} lines so each working directory tracks its own last session independently. Resume, create, and upsert logic updated in tui, ollie.el, and ollie.sh. Co-Authored-By: Claude Sonnet 4.6 --- toys/ollie.sh | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/toys/ollie.sh b/toys/ollie.sh index dbe38a6..9715918 100755 --- a/toys/ollie.sh +++ b/toys/ollie.sh @@ -5,6 +5,21 @@ set -o history MOUNT=${OLLIE_9MOUNT:-$HOME/mnt/ollie} LAST=$HOME/.config/ollie/last-session +# load_session → prints session ID for that dir, or nothing +load_session() { + awk -F'\t' -v d="$1" 'NF==2 && $1==d {print $2; exit}' "$LAST" 2>/dev/null +} + +# save_session → upserts {dir}\t{id} in $LAST +save_session() { + local dir="$1" id="$2" tmp + mkdir -p "$(dirname "$LAST")" + tmp=$(mktemp) + awk -F'\t' -v d="$dir" 'NF==2 && $1!=d' "$LAST" 2>/dev/null > "$tmp" || true + printf '%s\t%s\n' "$dir" "$id" >> "$tmp" + mv "$tmp" "$LAST" +} + die() { printf 'error: %s\n' "$*" >&2; exit 1; } is_idle() { [ "$(tr -d '[:space:]' < "$S/state" 2>/dev/null)" = "idle" ]; } drain() { @@ -57,24 +72,25 @@ create_session() { } # Resolve session +_dir=${cwd:-$(pwd)} if [ -n "$id_flag" ]; then [ -d "$MOUNT/s/$id_flag" ] || die "session not found: $id_flag" id=$id_flag; printf 'session: %s (resumed)\n' "$id" >&2 elif [ "$resume" = 1 ]; then - id=$(cat "$LAST" 2>/dev/null | tr -d '[:space:]') - [ -n "$id" ] && [ -d "$MOUNT/s/$id" ] || die "no resumable session" + id=$(load_session "$_dir") + [ -n "$id" ] && [ -d "$MOUNT/s/$id" ] || die "no resumable session for $_dir" printf 'session: %s (resumed)\n' "$id" >&2 elif [ "$new" = 1 ]; then create_session - printf '%s\n' "$id" > "$LAST" + save_session "$_dir" "$id" printf 'session: %s\n' "$id" >&2 else - id=$(cat "$LAST" 2>/dev/null | tr -d '[:space:]') + id=$(load_session "$_dir") if [ -n "$id" ] && [ -d "$MOUNT/s/$id" ]; then printf 'session: %s (resumed)\n' "$id" >&2 else create_session - printf '%s\n' "$id" > "$LAST" + save_session "$_dir" "$id" printf 'session: %s\n' "$id" >&2 fi fi