Release v2.0.25 force-release lease row action
All checks were successful
技能自动化发布 / release (push) Successful in 6s

This commit is contained in:
2026-09-12 16:18:36 +08:00
parent 3f1cde1f99
commit 3ce0cc40a1
12 changed files with 251 additions and 10 deletions

View File

@@ -795,6 +795,59 @@ def release_lease(lease_token: str) -> bool:
conn.close()
def release_lease_by_id(lease_id: int) -> Optional[dict]:
"""Force-release an active lease by row id. Returns released row summary or None."""
log = get_skill_logger()
log.info("lease_force_release_attempt lease_id=%s", lease_id)
conn = get_conn()
try:
cur = conn.cursor()
now = _now_unix()
cur.execute(
"SELECT id, account_id, lease_token, holder, purpose, status "
"FROM account_leases WHERE id = ?",
(int(lease_id),),
)
row = cur.fetchone()
if not row:
log.warning("lease_force_release_not_found lease_id=%s", lease_id)
return None
status = str(row[5] or "")
if status != "active":
log.warning(
"lease_force_release_not_active lease_id=%s status=%s",
lease_id,
status,
)
return None
cur.execute(
"UPDATE account_leases SET status = 'released', released_at = ?, updated_at = ? "
"WHERE id = ? AND status = 'active'",
(now, now, int(lease_id)),
)
conn.commit()
if cur.rowcount == 0:
return None
token = str(row[2] or "")
log.info(
"lease_force_release_success lease_id=%s account_id=%s token_prefix=%s",
lease_id,
row[1],
token[:8] if token else "",
)
return {
"id": int(row[0]),
"account_id": int(row[1]),
"lease_token": token,
"holder": row[3] or "",
"purpose": row[4] or "",
"status": "released",
"released_at": _unix_to_iso_local(now),
}
finally:
conn.close()
def list_active_leases() -> list[dict]:
"""List all active (non-expired, non-released) leases."""
conn = get_conn()