fix: workspace delete MissingGreenlet + nginx cache-busting

- Convert WorkspaceHasInstancesError to store plain dicts instead of
  SQLAlchemy ORM objects, preventing lazy-load failures outside async
  session context (MissingGreenlet)
- Update both delete endpoints (top-level and nested) to use exc.instances
  directly since they're already plain dicts
- Add no-cache headers for index.html in nginx.conf so browsers always
  fetch new hashed JS/CSS bundles on deploy
This commit is contained in:
2026-06-01 23:52:18 +02:00
parent 56dd7d3fd3
commit 1bf42a7feb
3 changed files with 12 additions and 4 deletions
+2 -2
View File
@@ -91,7 +91,7 @@ async def delete_workspace_top_level(
status_code=409,
detail={
"message": "Workspace has running tool instances",
"instances": [{"id": str(i.id), "name": i.name} for i in exc.instances],
"instances": exc.instances,
},
) from exc
except Exception as exc:
@@ -358,7 +358,7 @@ async def delete_workspace(
status_code=409,
detail={
"message": "Workspace has running tool instances",
"instances": [{"id": str(i.id), "name": i.name} for i in exc.instances],
"instances": exc.instances,
},
) from exc
except Exception as exc:
+4 -2
View File
@@ -37,7 +37,7 @@ class SyncResult:
class WorkspaceHasInstancesError(Exception):
"""Raised when attempting to delete a workspace with running instances."""
def __init__(self, instances: list[ToolInstance]) -> None:
def __init__(self, instances: list[dict]) -> None:
self.instances = instances
super().__init__(f"Workspace has {len(instances)} running tool instance(s)")
@@ -139,7 +139,9 @@ class WorkspaceManager:
instances = await self._get_instances(workspace, session)
if instances and not force:
raise WorkspaceHasInstancesError(instances)
raise WorkspaceHasInstancesError(
[{"id": str(i.id), "name": i.name} for i in instances]
)
# Stop and delete all instances
for instance in instances:
+6
View File
@@ -15,6 +15,12 @@ server {
try_files $uri $uri/ /index.html;
}
# Never cache index.html so browsers always fetch new hashed JS/CSS
location = /index.html {
add_header Cache-Control "no-cache, no-store, must-revalidate";
add_header Pragma "no-cache";
}
# Cache static assets
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2)$ {
expires 1y;