cb6b8ed6e1
Improve suspend/resume identity continuity and external broker session handling, add Office UI internationalization with rebuilt assets, and expand company org configs. Co-authored-by: Cursor <cursoragent@cursor.com>
168 lines
4.5 KiB
Python
168 lines
4.5 KiB
Python
"""Pure external provider-session identity helpers.
|
|
|
|
Monitoring rows exist before an external CLI reports its real resumable
|
|
thread/session id. A synthetic ``agent:project:task`` id is useful for local
|
|
observability, but is never a provider resume capability.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from typing import Any, Iterable
|
|
|
|
|
|
NON_RESUMABLE_EXTERNAL_SESSION_STATUSES: frozenset[str] = frozenset({
|
|
"failed",
|
|
"cancelled",
|
|
"denied",
|
|
"rejected",
|
|
"hard_timeout",
|
|
"idle_timeout",
|
|
"startup_timeout",
|
|
})
|
|
|
|
|
|
def external_session_status_allows_resume(status: Any) -> bool:
|
|
status = str(status or "").strip().lower()
|
|
return status not in NON_RESUMABLE_EXTERNAL_SESSION_STATUSES
|
|
|
|
|
|
def external_session_allows_resume(session: Any | None) -> bool:
|
|
return session is not None and external_session_status_allows_resume(
|
|
getattr(session, "status", "")
|
|
)
|
|
|
|
|
|
def is_provider_session_token(
|
|
token: Any,
|
|
*,
|
|
agent_type: str,
|
|
project_id: str,
|
|
) -> bool:
|
|
value = str(token or "").strip()
|
|
if not value:
|
|
return False
|
|
normalized_agent = str(agent_type or "").strip()
|
|
normalized_project = str(project_id or "default").strip() or "default"
|
|
if normalized_agent and value.startswith(
|
|
f"{normalized_agent}:{normalized_project}:"
|
|
):
|
|
return False
|
|
if normalized_agent and value.startswith(f"{normalized_agent}:"):
|
|
if len(value.split(":")) >= 3:
|
|
return False
|
|
return True
|
|
|
|
|
|
def provider_token_from_external_session(
|
|
session: Any | None,
|
|
*,
|
|
agent_type: str,
|
|
project_id: str,
|
|
) -> str:
|
|
if not external_session_allows_resume(session):
|
|
return ""
|
|
return _provider_token_from_session_identity(
|
|
session,
|
|
agent_type=agent_type,
|
|
project_id=project_id,
|
|
)
|
|
|
|
|
|
def _provider_token_from_session_identity(
|
|
session: Any | None,
|
|
*,
|
|
agent_type: str,
|
|
project_id: str,
|
|
) -> str:
|
|
"""Extract a provider token without treating its row as resumable."""
|
|
|
|
if session is None:
|
|
return ""
|
|
metadata = dict(getattr(session, "metadata", {}) or {})
|
|
for candidate in (
|
|
metadata.get("resume_session_id"),
|
|
metadata.get("provider_session_id"),
|
|
getattr(session, "session_id", ""),
|
|
):
|
|
token = str(candidate or "").strip()
|
|
if is_provider_session_token(
|
|
token,
|
|
agent_type=agent_type,
|
|
project_id=project_id,
|
|
):
|
|
return token
|
|
return ""
|
|
|
|
|
|
def external_session_matches_provider_token(
|
|
session: Any | None,
|
|
token: Any,
|
|
) -> bool:
|
|
"""Return whether a persisted row represents ``token`` regardless of status."""
|
|
|
|
if session is None:
|
|
return False
|
|
expected = str(token or "").strip()
|
|
if not expected:
|
|
return False
|
|
metadata = dict(getattr(session, "metadata", {}) or {})
|
|
return expected in {
|
|
str(candidate or "").strip()
|
|
for candidate in (
|
|
metadata.get("resume_session_id"),
|
|
metadata.get("provider_session_id"),
|
|
getattr(session, "session_id", ""),
|
|
)
|
|
if str(candidate or "").strip()
|
|
}
|
|
|
|
|
|
def select_best_external_resume_session(
|
|
sessions: Iterable[Any],
|
|
*,
|
|
agent_type: str,
|
|
project_id: str,
|
|
) -> tuple[Any | None, str]:
|
|
"""Select the newest valid provider capability, ignoring placeholders."""
|
|
|
|
latest_by_token: dict[str, Any] = {}
|
|
normalized_agent = str(agent_type or "").strip()
|
|
for session in list(sessions or []):
|
|
if (
|
|
str(getattr(session, "agent_type", "") or "").strip()
|
|
!= normalized_agent
|
|
):
|
|
continue
|
|
token = _provider_token_from_session_identity(
|
|
session,
|
|
agent_type=normalized_agent,
|
|
project_id=project_id,
|
|
)
|
|
if not token:
|
|
continue
|
|
current = latest_by_token.get(token)
|
|
if current is None or _session_timestamp(session) > _session_timestamp(current):
|
|
latest_by_token[token] = session
|
|
|
|
valid = [
|
|
(session, token)
|
|
for token, session in latest_by_token.items()
|
|
if external_session_allows_resume(session)
|
|
]
|
|
if not valid:
|
|
return None, ""
|
|
|
|
def _sort_key(item: tuple[Any, str]) -> tuple[float, str]:
|
|
session, token = item
|
|
return _session_timestamp(session), token
|
|
|
|
return max(valid, key=_sort_key)
|
|
|
|
|
|
def _session_timestamp(session: Any) -> float:
|
|
updated_at = getattr(session, "updated_at", None)
|
|
try:
|
|
return float(updated_at.timestamp())
|
|
except Exception:
|
|
return 0.0
|