o: fix context parsing - slash is primary separator

Agent names may contain colons (e.g., src:ollie), so slash must
be the primary separator. Colon separator is only for the rare
case where session names contain slashes.

default/src:ollie now correctly parses as:
  session = default
  agent = src:ollie
This commit is contained in:
Levi Neely 2026-10-09 12:28:02 +02:00
parent aa939b0f84
commit 9b063a24ce
1 changed files with 15 additions and 15 deletions

View File

@ -7,9 +7,8 @@
# o <session>/<agent> <cmd> Agent level # o <session>/<agent> <cmd> Agent level
# o <session>:<agent> <cmd> Agent level (colon separator) # o <session>:<agent> <cmd> Agent level (colon separator)
# #
# The slash or colon in session/agent disambiguates context level. # Slash is the primary separator. Agent names may contain colons.
# Use colon when session or agent names contain slashes. # Use colon separator only when session names contain slashes.
# Names with spaces can be quoted: o "my session:my agent" prompt
# #
# Subcommands: # Subcommands:
# read <path> Read a file (-l to loop) # read <path> Read a file (-l to loop)
@ -485,9 +484,8 @@ Context is determined by the first argument:
o <session>/<agent> <cmd> Agent level o <session>/<agent> <cmd> Agent level
o <session>:<agent> <cmd> Agent level (colon separator) o <session>:<agent> <cmd> Agent level (colon separator)
The slash or colon in session/agent disambiguates context level. Slash is the primary separator. Agent names may contain colons.
Use colon when session or agent names contain slashes. Use colon separator only when session names contain slashes.
Names with spaces can be quoted: o "my session:my agent" prompt
Paths starting with / are root-relative (ignore context): Paths starting with / are root-relative (ignore context):
o myproj ls /bypass List root bypass/ even in session context o myproj ls /bypass List root bypass/ even in session context
@ -573,21 +571,23 @@ dispatch_cmd() {
# Parse context from first argument # Parse context from first argument
# Supports: # Supports:
# session/agent (slash separator) # session/agent (slash separator - primary)
# session:agent (colon separator) # session:agent (colon separator - for session names with slashes)
# "session name/agent" (quoted with spaces) # "session name/agent" (quoted with spaces)
# session\ name/agent (escaped spaces) #
# Slash is the primary separator. Use colon only when session names contain slashes.
# Agent names may contain colons (e.g., "src:ollie").
parse_context() { parse_context() {
local arg="$1" local arg="$1"
# Check for colon or slash separator # Slash is the primary separator
# Colon takes precedence if both present (allows session with / in name) if [[ "$arg" == */* ]]; then
if [[ "$arg" == *:* ]]; then
CTX_SESSION="${arg%%:*}"
CTX_AGENT="${arg#*:}"
elif [[ "$arg" == */* ]]; then
CTX_SESSION="${arg%%/*}" CTX_SESSION="${arg%%/*}"
CTX_AGENT="${arg#*/}" CTX_AGENT="${arg#*/}"
elif [[ "$arg" == *:* ]]; then
# Colon separator (for session names containing slashes)
CTX_SESSION="${arg%%:*}"
CTX_AGENT="${arg#*:}"
else else
# session only # session only
CTX_SESSION="$arg" CTX_SESSION="$arg"