Spaces:
Running
Running
fix: auto-complete dangling active sessions on new session start
Browse files- src/functions.py +18 -0
src/functions.py
CHANGED
|
@@ -114,6 +114,22 @@ def fingerprint_id(prefix: str, content: str) -> str:
|
|
| 114 |
h = hashlib.sha256(content.strip().lower().encode('utf-8')).hexdigest()
|
| 115 |
return f"{prefix}_{h[:16]}"
|
| 116 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 117 |
def jaccard_similarity(a: str, b: str) -> float:
|
| 118 |
tokens_a = [t for t in a.split() if len(t) > 2]
|
| 119 |
tokens_b = [t for t in b.split() if len(t) > 2]
|
|
@@ -724,6 +740,7 @@ def observe(kv: StateKV, payload: Dict[str, Any]) -> Dict[str, Any]:
|
|
| 724 |
updates.append({"type": "set", "path": "firstPrompt", "value": trimmed[:200]})
|
| 725 |
kv.update(KV.sessions, session_id, updates)
|
| 726 |
else:
|
|
|
|
| 727 |
project = payload.get("project") or "unknown"
|
| 728 |
cwd = payload.get("cwd") or os.getcwd()
|
| 729 |
trimmed_prompt = None
|
|
@@ -1729,6 +1746,7 @@ def get_session(kv: StateKV, session_id: str) -> Optional[Dict[str, Any]]:
|
|
| 1729 |
return s
|
| 1730 |
|
| 1731 |
def create_session(kv: StateKV, session: Dict[str, Any]) -> Dict[str, Any]:
|
|
|
|
| 1732 |
kv.set(KV.sessions, session["id"], session)
|
| 1733 |
return session
|
| 1734 |
|
|
|
|
| 114 |
h = hashlib.sha256(content.strip().lower().encode('utf-8')).hexdigest()
|
| 115 |
return f"{prefix}_{h[:16]}"
|
| 116 |
|
| 117 |
+
def auto_complete_old_active_sessions(kv: StateKV, current_session_id: str) -> int:
|
| 118 |
+
sessions = kv.list(KV.sessions)
|
| 119 |
+
count = 0
|
| 120 |
+
now = datetime.datetime.utcnow().isoformat() + "Z"
|
| 121 |
+
for s in sessions:
|
| 122 |
+
if s.get("id") != current_session_id and s.get("status") == "active":
|
| 123 |
+
s["status"] = "completed"
|
| 124 |
+
if "endedAt" not in s:
|
| 125 |
+
s["endedAt"] = now
|
| 126 |
+
s["updatedAt"] = now
|
| 127 |
+
kv.set(KV.sessions, s["id"], s)
|
| 128 |
+
count += 1
|
| 129 |
+
if count > 0:
|
| 130 |
+
print(f"[session] Auto-completed {count} dangling active sessions.")
|
| 131 |
+
return count
|
| 132 |
+
|
| 133 |
def jaccard_similarity(a: str, b: str) -> float:
|
| 134 |
tokens_a = [t for t in a.split() if len(t) > 2]
|
| 135 |
tokens_b = [t for t in b.split() if len(t) > 2]
|
|
|
|
| 740 |
updates.append({"type": "set", "path": "firstPrompt", "value": trimmed[:200]})
|
| 741 |
kv.update(KV.sessions, session_id, updates)
|
| 742 |
else:
|
| 743 |
+
auto_complete_old_active_sessions(kv, session_id)
|
| 744 |
project = payload.get("project") or "unknown"
|
| 745 |
cwd = payload.get("cwd") or os.getcwd()
|
| 746 |
trimmed_prompt = None
|
|
|
|
| 1746 |
return s
|
| 1747 |
|
| 1748 |
def create_session(kv: StateKV, session: Dict[str, Any]) -> Dict[str, Any]:
|
| 1749 |
+
auto_complete_old_active_sessions(kv, session["id"])
|
| 1750 |
kv.set(KV.sessions, session["id"], session)
|
| 1751 |
return session
|
| 1752 |
|