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:
@@ -91,7 +91,7 @@ async def delete_workspace_top_level(
|
|||||||
status_code=409,
|
status_code=409,
|
||||||
detail={
|
detail={
|
||||||
"message": "Workspace has running tool instances",
|
"message": "Workspace has running tool instances",
|
||||||
"instances": [{"id": str(i.id), "name": i.name} for i in exc.instances],
|
"instances": exc.instances,
|
||||||
},
|
},
|
||||||
) from exc
|
) from exc
|
||||||
except Exception as exc:
|
except Exception as exc:
|
||||||
@@ -358,7 +358,7 @@ async def delete_workspace(
|
|||||||
status_code=409,
|
status_code=409,
|
||||||
detail={
|
detail={
|
||||||
"message": "Workspace has running tool instances",
|
"message": "Workspace has running tool instances",
|
||||||
"instances": [{"id": str(i.id), "name": i.name} for i in exc.instances],
|
"instances": exc.instances,
|
||||||
},
|
},
|
||||||
) from exc
|
) from exc
|
||||||
except Exception as exc:
|
except Exception as exc:
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ class SyncResult:
|
|||||||
class WorkspaceHasInstancesError(Exception):
|
class WorkspaceHasInstancesError(Exception):
|
||||||
"""Raised when attempting to delete a workspace with running instances."""
|
"""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
|
self.instances = instances
|
||||||
super().__init__(f"Workspace has {len(instances)} running tool instance(s)")
|
super().__init__(f"Workspace has {len(instances)} running tool instance(s)")
|
||||||
|
|
||||||
@@ -139,7 +139,9 @@ class WorkspaceManager:
|
|||||||
|
|
||||||
instances = await self._get_instances(workspace, session)
|
instances = await self._get_instances(workspace, session)
|
||||||
if instances and not force:
|
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
|
# Stop and delete all instances
|
||||||
for instance in instances:
|
for instance in instances:
|
||||||
|
|||||||
@@ -15,6 +15,12 @@ server {
|
|||||||
try_files $uri $uri/ /index.html;
|
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
|
# Cache static assets
|
||||||
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2)$ {
|
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2)$ {
|
||||||
expires 1y;
|
expires 1y;
|
||||||
|
|||||||
Reference in New Issue
Block a user