1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "$0")" && pwd)"
RHO_ARGS=("$@")
while [[ $# -gt 0 ]]; do
case "$1" in
--profile|--identity|--home)
[[ $# -ge 2 ]] || { echo "missing value after $1" >&2; exit 2; }
shift 2
;;
--)
shift
break
;;
*)
break
;;
esac
done
case "${1:-}" in
agent-run)
set -- "${RHO_ARGS[@]}"
shift
exec python3 "$ROOT_DIR/scripts/rho-agent-run.py" "$@"
;;
add|dataset|publish|message|request|tools|run|approve|result|id|crypto|repo|status|gh|commit|env|install-shell|version|--version|-V|--help|-h|"")
exec cargo run --quiet --manifest-path "$ROOT_DIR/Cargo.toml" --bin rho -- "${RHO_ARGS[@]}"
;;
esac
PI_DIR="$ROOT_DIR/repos/pi"
PI_DIST_CLI="$PI_DIR/packages/coding-agent/dist/cli.js"
PI_SRC_CLI="$PI_DIR/packages/coding-agent/src/cli.ts"
PI_TSX="$PI_DIR/node_modules/.bin/tsx"
if [[ -f "$PI_DIST_CLI" ]]; then
PI_ENTRYPOINT=(node "$PI_DIST_CLI")
elif [[ -x "$PI_TSX" && -f "$PI_SRC_CLI" ]]; then
PI_ENTRYPOINT=("$PI_TSX" "$PI_SRC_CLI")
else
echo "pi is not ready. Run 'cd $PI_DIR && pnpm install' first." >&2
exit 1
fi
EXTENSION_ARGS=()
while [[ $# -gt 0 ]]; do
case "$1" in
-e|--extension)
[[ $# -ge 2 ]] || { echo "missing path after $1" >&2; exit 2; }
EXTENSION_ARGS+=("$1" "$2")
shift 2
;;
*)
break
;;
esac
done
PI_PASSTHROUGH_ARGS=()
while [[ $# -gt 0 ]]; do
case "$1" in
--provider|--model|--thinking)
[[ $# -ge 2 ]] || { echo "missing value after $1" >&2; exit 2; }
PI_PASSTHROUGH_ARGS+=("$1" "$2")
shift 2
;;
*)
break
;;
esac
done
USER_NAME="${1:-}"
[[ -n "$USER_NAME" ]] || { echo "usage: rho [--extension path] [--provider name] [--model id] <user> <prompt...>" >&2; exit 2; }
shift
[[ $# -gt 0 ]] || { echo "usage: rho [--extension path] [--provider name] [--model id] <user> <prompt...>" >&2; exit 2; }
USER_ROOT="${RHO_USERS_ROOT:-$ROOT_DIR/sandbox/pi-users}"
export RHO_USER="$USER_NAME"
export RHO_USER_DIR="$USER_ROOT/$USER_NAME"
export RHO_AGENT_DIR="$RHO_USER_DIR/agent"
export RHO_SESSION_DIR="$RHO_USER_DIR/sessions"
export RHO_SESSION_FILE="$RHO_USER_DIR/session.jsonl"
if [[ "${RHO_PI_USE_GLOBAL_AGENT_DIR:-0}" == "1" ]]; then
export PI_CODING_AGENT_DIR="${PI_CODING_AGENT_DIR:-$HOME/.pi/agent}"
else
export PI_CODING_AGENT_DIR="$RHO_AGENT_DIR"
fi
mkdir -p "$RHO_AGENT_DIR" "$RHO_SESSION_DIR"
PROMPT="$*"
exec "${PI_ENTRYPOINT[@]}" \
"${EXTENSION_ARGS[@]}" \
"${PI_PASSTHROUGH_ARGS[@]}" \
--print \
--session "$RHO_SESSION_FILE" \
"$PROMPT"