@@ -1034,6 +1034,7 @@ save_claude_session() {
10341034 session_id=$( extract_session_id_from_output " $output_file " 2> /dev/null || echo " " )
10351035 if [[ -n " $session_id " && " $session_id " != " null" ]]; then
10361036 echo " $session_id " > " $CLAUDE_SESSION_FILE "
1037+ sync_ralph_session_with_driver " $session_id "
10371038 log_status " INFO" " Saved session: ${session_id: 0: 20} ..."
10381039 fi
10391040 fi
@@ -1043,6 +1044,101 @@ save_claude_session() {
10431044# SESSION LIFECYCLE MANAGEMENT FUNCTIONS (Phase 1.2)
10441045# =============================================================================
10451046
1047+ write_active_ralph_session () {
1048+ local session_id=$1
1049+ local created_at=$2
1050+ local last_used=${3:- $created_at }
1051+
1052+ jq -n \
1053+ --arg session_id " $session_id " \
1054+ --arg created_at " $created_at " \
1055+ --arg last_used " $last_used " \
1056+ ' {
1057+ session_id: $session_id,
1058+ created_at: $created_at,
1059+ last_used: $last_used
1060+ }' > " $RALPH_SESSION_FILE "
1061+ }
1062+
1063+ write_inactive_ralph_session () {
1064+ local reset_at=$1
1065+ local reset_reason=$2
1066+
1067+ jq -n \
1068+ --arg session_id " " \
1069+ --arg reset_at " $reset_at " \
1070+ --arg reset_reason " $reset_reason " \
1071+ ' {
1072+ session_id: $session_id,
1073+ reset_at: $reset_at,
1074+ reset_reason: $reset_reason
1075+ }' > " $RALPH_SESSION_FILE "
1076+ }
1077+
1078+ get_ralph_session_state () {
1079+ if [[ ! -f " $RALPH_SESSION_FILE " ]]; then
1080+ echo " missing"
1081+ return 0
1082+ fi
1083+
1084+ if ! jq empty " $RALPH_SESSION_FILE " 2> /dev/null; then
1085+ echo " invalid"
1086+ return 0
1087+ fi
1088+
1089+ local session_id_type
1090+ session_id_type=$(
1091+ jq -r ' if has("session_id") then (.session_id | type) else "missing" end' \
1092+ " $RALPH_SESSION_FILE " 2> /dev/null
1093+ ) || {
1094+ echo " invalid"
1095+ return 0
1096+ }
1097+
1098+ if [[ " $session_id_type " != " string" ]]; then
1099+ echo " invalid"
1100+ return 0
1101+ fi
1102+
1103+ local session_id
1104+ session_id=$( jq -r ' .session_id' " $RALPH_SESSION_FILE " 2> /dev/null) || {
1105+ echo " invalid"
1106+ return 0
1107+ }
1108+
1109+ if [[ " $session_id " == " " ]]; then
1110+ echo " inactive"
1111+ return 0
1112+ fi
1113+
1114+ local created_at_type
1115+ created_at_type=$(
1116+ jq -r ' if has("created_at") then (.created_at | type) else "missing" end' \
1117+ " $RALPH_SESSION_FILE " 2> /dev/null
1118+ ) || {
1119+ echo " invalid"
1120+ return 0
1121+ }
1122+
1123+ if [[ " $created_at_type " != " string" ]]; then
1124+ echo " invalid"
1125+ return 0
1126+ fi
1127+
1128+ local created_at
1129+ created_at=$( jq -r ' .created_at' " $RALPH_SESSION_FILE " 2> /dev/null) || {
1130+ echo " invalid"
1131+ return 0
1132+ }
1133+
1134+ if ! is_usable_ralph_session_created_at " $created_at " ; then
1135+ echo " invalid"
1136+ return 0
1137+ fi
1138+
1139+ echo " active"
1140+ }
1141+
10461142# Get current session ID from Ralph session file
10471143# Returns: session ID string or empty if not found
10481144get_session_id () {
@@ -1064,6 +1160,65 @@ get_session_id() {
10641160 return 0
10651161}
10661162
1163+ is_usable_ralph_session_created_at () {
1164+ local created_at=$1
1165+ if [[ -z " $created_at " || " $created_at " == " null" ]]; then
1166+ return 1
1167+ fi
1168+
1169+ local created_at_epoch
1170+ created_at_epoch=$( parse_iso_to_epoch_strict " $created_at " ) || return 1
1171+
1172+ local now_epoch
1173+ now_epoch=$( get_epoch_seconds)
1174+
1175+ [[ " $created_at_epoch " -le " $now_epoch " ]]
1176+ }
1177+
1178+ get_active_session_created_at () {
1179+ if [[ " $( get_ralph_session_state) " != " active" ]]; then
1180+ echo " "
1181+ return 0
1182+ fi
1183+
1184+ local created_at
1185+ created_at=$( jq -r ' .created_at // ""' " $RALPH_SESSION_FILE " 2> /dev/null)
1186+ if [[ " $created_at " == " null" ]]; then
1187+ created_at=" "
1188+ fi
1189+
1190+ if ! is_usable_ralph_session_created_at " $created_at " ; then
1191+ echo " "
1192+ return 0
1193+ fi
1194+
1195+ echo " $created_at "
1196+ }
1197+
1198+ sync_ralph_session_with_driver () {
1199+ local driver_session_id=$1
1200+ if [[ -z " $driver_session_id " || " $driver_session_id " == " null" ]]; then
1201+ return 0
1202+ fi
1203+
1204+ local ts
1205+ ts=$( get_iso_timestamp)
1206+
1207+ if [[ " $( get_ralph_session_state) " == " active" ]]; then
1208+ local current_session_id
1209+ current_session_id=$( get_session_id)
1210+ local current_created_at
1211+ current_created_at=$( get_active_session_created_at)
1212+
1213+ if [[ " $current_session_id " == " $driver_session_id " && -n " $current_created_at " ]]; then
1214+ write_active_ralph_session " $driver_session_id " " $current_created_at " " $ts "
1215+ return 0
1216+ fi
1217+ fi
1218+
1219+ write_active_ralph_session " $driver_session_id " " $ts " " $ts "
1220+ }
1221+
10671222# Reset session with reason logging
10681223# Usage: reset_session "reason_for_reset"
10691224reset_session () {
@@ -1073,20 +1228,7 @@ reset_session() {
10731228 local reset_timestamp
10741229 reset_timestamp=$( get_iso_timestamp)
10751230
1076- # Always create/overwrite the session file using jq for safe JSON escaping
1077- jq -n \
1078- --arg session_id " " \
1079- --arg created_at " " \
1080- --arg last_used " " \
1081- --arg reset_at " $reset_timestamp " \
1082- --arg reset_reason " $reason " \
1083- ' {
1084- session_id: $session_id,
1085- created_at: $created_at,
1086- last_used: $last_used,
1087- reset_at: $reset_at,
1088- reset_reason: $reset_reason
1089- }' > " $RALPH_SESSION_FILE "
1231+ write_inactive_ralph_session " $reset_timestamp " " $reason "
10901232
10911233 # Also clear the Claude session file for consistency
10921234 rm -f " $CLAUDE_SESSION_FILE " 2> /dev/null
@@ -1175,67 +1317,39 @@ init_session_tracking() {
11751317 local ts
11761318 ts=$( get_iso_timestamp)
11771319
1178- # Create session file if it doesn't exist
1179- if [[ ! -f " $RALPH_SESSION_FILE " ]]; then
1180- local new_session_id
1181- new_session_id=$( generate_session_id)
1182-
1183- jq -n \
1184- --arg session_id " $new_session_id " \
1185- --arg created_at " $ts " \
1186- --arg last_used " $ts " \
1187- --arg reset_at " " \
1188- --arg reset_reason " " \
1189- ' {
1190- session_id: $session_id,
1191- created_at: $created_at,
1192- last_used: $last_used,
1193- reset_at: $reset_at,
1194- reset_reason: $reset_reason
1195- }' > " $RALPH_SESSION_FILE "
1196-
1197- log_status " INFO" " Initialized session tracking (session: $new_session_id )"
1320+ local session_state
1321+ session_state=$( get_ralph_session_state)
1322+ if [[ " $session_state " == " active" ]]; then
11981323 return 0
11991324 fi
12001325
1201- # Validate existing session file
1202- if ! jq empty " $RALPH_SESSION_FILE " 2> /dev/null; then
1326+ if [[ " $session_state " == " invalid" ]]; then
12031327 log_status " WARN" " Corrupted session file detected, recreating..."
1204- local new_session_id
1205- new_session_id=$( generate_session_id)
1206-
1207- jq -n \
1208- --arg session_id " $new_session_id " \
1209- --arg created_at " $ts " \
1210- --arg last_used " $ts " \
1211- --arg reset_at " $ts " \
1212- --arg reset_reason " corrupted_file_recovery" \
1213- ' {
1214- session_id: $session_id,
1215- created_at: $created_at,
1216- last_used: $last_used,
1217- reset_at: $reset_at,
1218- reset_reason: $reset_reason
1219- }' > " $RALPH_SESSION_FILE "
12201328 fi
1329+
1330+ local new_session_id
1331+ new_session_id=$( generate_session_id)
1332+ write_active_ralph_session " $new_session_id " " $ts " " $ts "
1333+
1334+ log_status " INFO" " Initialized session tracking (session: $new_session_id )"
12211335}
12221336
12231337# Update last_used timestamp in session file (called on each loop iteration)
12241338update_session_last_used () {
1225- if [[ ! -f " $RALPH_SESSION_FILE " ]]; then
1339+ if [[ " $( get_ralph_session_state ) " != " active " ]]; then
12261340 return 0
12271341 fi
12281342
12291343 local ts
12301344 ts=$( get_iso_timestamp)
12311345
1232- # Update last_used in existing session file
1233- local updated
1234- updated= $( jq --arg last_used " $ts " ' .last_used = $last_used ' " $RALPH_SESSION_FILE " 2> /dev/null )
1235- local jq_status= $?
1346+ local session_id
1347+ session_id= $( get_session_id )
1348+ local created_at
1349+ created_at= $( get_active_session_created_at )
12361350
1237- if [[ $jq_status -eq 0 && -n " $updated " ]]; then
1238- echo " $updated " > " $RALPH_SESSION_FILE "
1351+ if [[ -n " $session_id " && -n " $created_at " ]]; then
1352+ write_active_ralph_session " $session_id " " $created_at " " $ts "
12391353 fi
12401354}
12411355
0 commit comments