From 649d4ab7f507f9ec2dceacfeabf13489ea2ae3e0 Mon Sep 17 00:00:00 2001 From: Otto Date: Mon, 16 Feb 2026 12:19:18 +0000 Subject: [PATCH 1/4] feat(chat): Add delete chat session endpoint and UI (#12112) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary Adds the ability to delete chat sessions from the CoPilot interface. ## Changes ### Backend - Add `DELETE /api/chat/sessions/{session_id}` endpoint in `routes.py` - Returns 204 on success, 404 if not found or not owned by user - Reuses existing `delete_chat_session` function from `model.py` ### Frontend - Add delete button (trash icon) that appears on hover for each chat session - Add confirmation dialog before deletion using existing `DeleteConfirmDialog` component - Refresh session list after successful delete - Clear current session selection if the deleted session was active - Update OpenAPI spec with new endpoint ## Testing 1. Hover over a chat session in sidebar → trash icon appears 2. Click trash icon → confirmation dialog 3. Confirm deletion → session removed, list refreshes 4. If deleted session was active, selection is cleared ## Screenshots Delete button appears on hover, confirmation dialog on click. ## Related Issues Closes SECRT-1928

Greptile Overview

Greptile Summary

Adds the ability to delete chat sessions from the CoPilot interface — a new `DELETE /api/chat/sessions/{session_id}` backend endpoint and a corresponding delete button with confirmation dialog in the `ChatSidebar` frontend component. - **Backend route** (`routes.py`): Clean implementation reusing the existing `delete_chat_session` model function with proper auth guards and 204/404 responses. No issues. - **Frontend** (`ChatSidebar.tsx`): Adds hover-visible trash icon per session, confirmation dialog, mutation with cache invalidation, and active session clearing on delete. However, it uses a `__legacy__` component (`DeleteConfirmDialog`) which violates the project's style guide — new code should use the modern design system components. Error handling only logs to console without user-facing feedback (project convention is to use toast notifications for mutation errors). `isDeleting` is destructured but unused. - **OpenAPI spec** updated correctly. - **Unrelated file included**: `notes/plan-SECRT-1959-graph-edge-desync.md` is a planning document for a different ticket and should be removed from this PR. The `notes/` directory is newly introduced and both plan files should be reconsidered for inclusion.

Confidence Score: 3/5

- Functionally correct but has style guide violations and includes unrelated files that should be addressed before merge. - The core feature implementation (backend DELETE endpoint and frontend mutation logic) is sound and follows existing patterns. Score is lowered because: (1) the frontend uses a legacy component explicitly prohibited by the project's style guide, (2) mutation errors are not surfaced to the user, and (3) the PR includes an unrelated planning document for a different ticket. - Pay close attention to `ChatSidebar.tsx` for the legacy component import and error handling, and `notes/plan-SECRT-1959-graph-edge-desync.md` which should be removed.

Sequence Diagram

```mermaid sequenceDiagram participant User participant ChatSidebar as ChatSidebar (Frontend) participant ReactQuery as React Query participant API as DELETE /api/chat/sessions/{id} participant Model as model.delete_chat_session participant DB as db.delete_chat_session (Prisma) participant Redis as Redis Cache User->>ChatSidebar: Click trash icon on session ChatSidebar->>ChatSidebar: Show DeleteConfirmDialog User->>ChatSidebar: Confirm deletion ChatSidebar->>ReactQuery: deleteSession({ sessionId }) ReactQuery->>API: DELETE /api/chat/sessions/{session_id} API->>Model: delete_chat_session(session_id, user_id) Model->>DB: delete_many(where: {id, userId}) DB-->>Model: bool (deleted count > 0) Model->>Redis: Delete session cache key Model->>Model: Clean up session lock Model-->>API: True API-->>ReactQuery: 204 No Content ReactQuery->>ChatSidebar: onSuccess callback ChatSidebar->>ReactQuery: invalidateQueries(sessions list) ChatSidebar->>ChatSidebar: Clear sessionId if deleted was active ```
Last reviewed commit: 44a92c6

Context used (3)

- Context from `dashboard` - autogpt_platform/frontend/CLAUDE.md ([source](https://app.greptile.com/review/custom-context?memory=39861924-d320-41ba-a1a7-a8bff44f780a)) - Context from `dashboard` - autogpt_platform/frontend/CONTRIBUTING.md ([source](https://app.greptile.com/review/custom-context?memory=cc4f1b17-cb5c-4b63-b218-c772b48e20ee)) - Context from `dashboard` - autogpt_platform/CLAUDE.md ([source](https://app.greptile.com/review/custom-context?memory=6e9dc5dc-8942-47df-8677-e60062ec8c3a))
--------- Co-authored-by: Zamil Majdy --- .../backend/api/features/chat/routes.py | 38 ++ .../app/(platform)/copilot/CopilotPage.tsx | 32 +- .../components/ChatSidebar/ChatSidebar.tsx | 325 +++++++++++------- .../components/MobileHeader/MobileHeader.tsx | 44 ++- .../app/(platform)/copilot/useCopilotPage.ts | 62 +++- .../frontend/src/app/api/openapi.json | 30 ++ .../src/components/__legacy__/ui/dialog.tsx | 2 +- 7 files changed, 397 insertions(+), 136 deletions(-) diff --git a/autogpt_platform/backend/backend/api/features/chat/routes.py b/autogpt_platform/backend/backend/api/features/chat/routes.py index aa565ca891..d838520c98 100644 --- a/autogpt_platform/backend/backend/api/features/chat/routes.py +++ b/autogpt_platform/backend/backend/api/features/chat/routes.py @@ -23,6 +23,7 @@ from .model import ( ChatSession, append_and_save_message, create_chat_session, + delete_chat_session, get_chat_session, get_user_sessions, ) @@ -211,6 +212,43 @@ async def create_session( ) +@router.delete( + "/sessions/{session_id}", + dependencies=[Security(auth.requires_user)], + status_code=204, + responses={404: {"description": "Session not found or access denied"}}, +) +async def delete_session( + session_id: str, + user_id: Annotated[str, Security(auth.get_user_id)], +) -> Response: + """ + Delete a chat session. + + Permanently removes a chat session and all its messages. + Only the owner can delete their sessions. + + Args: + session_id: The session ID to delete. + user_id: The authenticated user's ID. + + Returns: + 204 No Content on success. + + Raises: + HTTPException: 404 if session not found or not owned by user. + """ + deleted = await delete_chat_session(session_id, user_id) + + if not deleted: + raise HTTPException( + status_code=404, + detail=f"Session {session_id} not found or access denied", + ) + + return Response(status_code=204) + + @router.get( "/sessions/{session_id}", ) diff --git a/autogpt_platform/frontend/src/app/(platform)/copilot/CopilotPage.tsx b/autogpt_platform/frontend/src/app/(platform)/copilot/CopilotPage.tsx index 0d403b1a79..35b34890ce 100644 --- a/autogpt_platform/frontend/src/app/(platform)/copilot/CopilotPage.tsx +++ b/autogpt_platform/frontend/src/app/(platform)/copilot/CopilotPage.tsx @@ -1,6 +1,8 @@ "use client"; import { SidebarProvider } from "@/components/ui/sidebar"; +// TODO: Replace with modern Dialog component when available +import DeleteConfirmDialog from "@/components/__legacy__/delete-confirm-dialog"; import { ChatContainer } from "./components/ChatContainer/ChatContainer"; import { ChatSidebar } from "./components/ChatSidebar/ChatSidebar"; import { MobileDrawer } from "./components/MobileDrawer/MobileDrawer"; @@ -31,6 +33,12 @@ export function CopilotPage() { handleDrawerOpenChange, handleSelectSession, handleNewChat, + // Delete functionality + sessionToDelete, + isDeleting, + handleDeleteClick, + handleConfirmDelete, + handleCancelDelete, } = useCopilotPage(); if (isUserLoading || !isLoggedIn) { @@ -48,7 +56,19 @@ export function CopilotPage() { > {!isMobile && }
- {isMobile && } + {isMobile && ( + { + const session = sessions.find((s) => s.id === sessionId); + if (session) { + handleDeleteClick(session.id, session.title); + } + }} + /> + )}
)} + {/* Delete confirmation dialog - rendered at top level for proper z-index on mobile */} + {isMobile && ( + !open && handleCancelDelete()} + onDoDelete={handleConfirmDelete} + /> + )} ); } diff --git a/autogpt_platform/frontend/src/app/(platform)/copilot/components/ChatSidebar/ChatSidebar.tsx b/autogpt_platform/frontend/src/app/(platform)/copilot/components/ChatSidebar/ChatSidebar.tsx index 6b7398b4ba..8e785dd9d3 100644 --- a/autogpt_platform/frontend/src/app/(platform)/copilot/components/ChatSidebar/ChatSidebar.tsx +++ b/autogpt_platform/frontend/src/app/(platform)/copilot/components/ChatSidebar/ChatSidebar.tsx @@ -1,8 +1,15 @@ "use client"; -import { useGetV2ListSessions } from "@/app/api/__generated__/endpoints/chat/chat"; +import { + getGetV2ListSessionsQueryKey, + useDeleteV2DeleteSession, + useGetV2ListSessions, +} from "@/app/api/__generated__/endpoints/chat/chat"; import { Button } from "@/components/atoms/Button/Button"; import { LoadingSpinner } from "@/components/atoms/LoadingSpinner/LoadingSpinner"; import { Text } from "@/components/atoms/Text/Text"; +import { toast } from "@/components/molecules/Toast/use-toast"; +// TODO: Replace with modern Dialog component when available +import DeleteConfirmDialog from "@/components/__legacy__/delete-confirm-dialog"; import { Sidebar, SidebarContent, @@ -12,18 +19,52 @@ import { useSidebar, } from "@/components/ui/sidebar"; import { cn } from "@/lib/utils"; -import { PlusCircleIcon, PlusIcon } from "@phosphor-icons/react"; +import { PlusCircleIcon, PlusIcon, TrashIcon } from "@phosphor-icons/react"; +import { useQueryClient } from "@tanstack/react-query"; import { motion } from "framer-motion"; +import { useState } from "react"; import { parseAsString, useQueryState } from "nuqs"; export function ChatSidebar() { const { state } = useSidebar(); const isCollapsed = state === "collapsed"; const [sessionId, setSessionId] = useQueryState("sessionId", parseAsString); + const [sessionToDelete, setSessionToDelete] = useState<{ + id: string; + title: string | null | undefined; + } | null>(null); + + const queryClient = useQueryClient(); const { data: sessionsResponse, isLoading: isLoadingSessions } = useGetV2ListSessions({ limit: 50 }); + const { mutate: deleteSession, isPending: isDeleting } = + useDeleteV2DeleteSession({ + mutation: { + onSuccess: () => { + // Invalidate sessions list to refetch + queryClient.invalidateQueries({ + queryKey: getGetV2ListSessionsQueryKey(), + }); + // If we deleted the current session, clear selection + if (sessionToDelete?.id === sessionId) { + setSessionId(null); + } + setSessionToDelete(null); + }, + onError: (error) => { + toast({ + title: "Failed to delete chat", + description: + error instanceof Error ? error.message : "An error occurred", + variant: "destructive", + }); + setSessionToDelete(null); + }, + }, + }); + const sessions = sessionsResponse?.status === 200 ? sessionsResponse.data.sessions : []; @@ -35,6 +76,22 @@ export function ChatSidebar() { setSessionId(id); } + function handleDeleteClick( + e: React.MouseEvent, + id: string, + title: string | null | undefined, + ) { + e.stopPropagation(); // Prevent session selection + if (isDeleting) return; // Prevent double-click during deletion + setSessionToDelete({ id, title }); + } + + function handleConfirmDelete() { + if (sessionToDelete) { + deleteSession({ sessionId: sessionToDelete.id }); + } + } + function formatDate(dateString: string) { const date = new Date(dateString); const now = new Date(); @@ -61,128 +118,152 @@ export function ChatSidebar() { } return ( - - {isCollapsed && ( - - -
- - -
-
-
- )} - - {!isCollapsed && ( - - - Your chats - -
- -
-
- )} - - {!isCollapsed && ( - - {isLoadingSessions ? ( -
- -
- ) : sessions.length === 0 ? ( -

- No conversations yet -

- ) : ( - sessions.map((session) => ( - - )) + <> + + {isCollapsed && ( + - )} -
- {!isCollapsed && sessionId && ( - - - - - - )} -
+
+ + +
+ + + )} + + {!isCollapsed && ( + + + Your chats + +
+ +
+
+ )} + + {!isCollapsed && ( + + {isLoadingSessions ? ( +
+ +
+ ) : sessions.length === 0 ? ( +

+ No conversations yet +

+ ) : ( + sessions.map((session) => ( +
+ + +
+ )) + )} +
+ )} +
+ {!isCollapsed && sessionId && ( + + + + + + )} + + + !open && setSessionToDelete(null)} + onDoDelete={handleConfirmDelete} + /> + ); } diff --git a/autogpt_platform/frontend/src/app/(platform)/copilot/components/MobileHeader/MobileHeader.tsx b/autogpt_platform/frontend/src/app/(platform)/copilot/components/MobileHeader/MobileHeader.tsx index e0d6161744..b4b7636c81 100644 --- a/autogpt_platform/frontend/src/app/(platform)/copilot/components/MobileHeader/MobileHeader.tsx +++ b/autogpt_platform/frontend/src/app/(platform)/copilot/components/MobileHeader/MobileHeader.tsx @@ -1,22 +1,46 @@ import { Button } from "@/components/atoms/Button/Button"; import { NAVBAR_HEIGHT_PX } from "@/lib/constants"; -import { ListIcon } from "@phosphor-icons/react"; +import { ListIcon, TrashIcon } from "@phosphor-icons/react"; interface Props { onOpenDrawer: () => void; + showDelete?: boolean; + isDeleting?: boolean; + onDelete?: () => void; } -export function MobileHeader({ onOpenDrawer }: Props) { +export function MobileHeader({ + onOpenDrawer, + showDelete, + isDeleting, + onDelete, +}: Props) { return ( - + + {showDelete && onDelete && ( + + )} +
); } diff --git a/autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotPage.ts b/autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotPage.ts index 28e9ba7cfb..444e745ec6 100644 --- a/autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotPage.ts +++ b/autogpt_platform/frontend/src/app/(platform)/copilot/useCopilotPage.ts @@ -1,10 +1,15 @@ -import { useGetV2ListSessions } from "@/app/api/__generated__/endpoints/chat/chat"; +import { + getGetV2ListSessionsQueryKey, + useDeleteV2DeleteSession, + useGetV2ListSessions, +} from "@/app/api/__generated__/endpoints/chat/chat"; import { toast } from "@/components/molecules/Toast/use-toast"; import { useBreakpoint } from "@/lib/hooks/useBreakpoint"; import { useSupabase } from "@/lib/supabase/hooks/useSupabase"; import { useChat } from "@ai-sdk/react"; +import { useQueryClient } from "@tanstack/react-query"; import { DefaultChatTransport } from "ai"; -import { useEffect, useMemo, useRef, useState } from "react"; +import { useCallback, useEffect, useMemo, useRef, useState } from "react"; import { useChatSession } from "./useChatSession"; import { useLongRunningToolPolling } from "./hooks/useLongRunningToolPolling"; @@ -14,6 +19,11 @@ export function useCopilotPage() { const { isUserLoading, isLoggedIn } = useSupabase(); const [isDrawerOpen, setIsDrawerOpen] = useState(false); const [pendingMessage, setPendingMessage] = useState(null); + const [sessionToDelete, setSessionToDelete] = useState<{ + id: string; + title: string | null | undefined; + } | null>(null); + const queryClient = useQueryClient(); const { sessionId, @@ -24,6 +34,30 @@ export function useCopilotPage() { isCreatingSession, } = useChatSession(); + const { mutate: deleteSessionMutation, isPending: isDeleting } = + useDeleteV2DeleteSession({ + mutation: { + onSuccess: () => { + queryClient.invalidateQueries({ + queryKey: getGetV2ListSessionsQueryKey(), + }); + if (sessionToDelete?.id === sessionId) { + setSessionId(null); + } + setSessionToDelete(null); + }, + onError: (error) => { + toast({ + title: "Failed to delete chat", + description: + error instanceof Error ? error.message : "An error occurred", + variant: "destructive", + }); + setSessionToDelete(null); + }, + }, + }); + const breakpoint = useBreakpoint(); const isMobile = breakpoint === "base" || breakpoint === "sm" || breakpoint === "md"; @@ -143,6 +177,24 @@ export function useCopilotPage() { if (isMobile) setIsDrawerOpen(false); } + const handleDeleteClick = useCallback( + (id: string, title: string | null | undefined) => { + if (isDeleting) return; + setSessionToDelete({ id, title }); + }, + [isDeleting], + ); + + const handleConfirmDelete = useCallback(() => { + if (sessionToDelete) { + deleteSessionMutation({ sessionId: sessionToDelete.id }); + } + }, [sessionToDelete, deleteSessionMutation]); + + const handleCancelDelete = useCallback(() => { + setSessionToDelete(null); + }, []); + return { sessionId, messages, @@ -165,5 +217,11 @@ export function useCopilotPage() { handleDrawerOpenChange, handleSelectSession, handleNewChat, + // Delete functionality + sessionToDelete, + isDeleting, + handleDeleteClick, + handleConfirmDelete, + handleCancelDelete, }; } diff --git a/autogpt_platform/frontend/src/app/api/openapi.json b/autogpt_platform/frontend/src/app/api/openapi.json index 63a8a856b9..feabc9b51d 100644 --- a/autogpt_platform/frontend/src/app/api/openapi.json +++ b/autogpt_platform/frontend/src/app/api/openapi.json @@ -1151,6 +1151,36 @@ } }, "/api/chat/sessions/{session_id}": { + "delete": { + "tags": ["v2", "chat", "chat"], + "summary": "Delete Session", + "description": "Delete a chat session.\n\nPermanently removes a chat session and all its messages.\nOnly the owner can delete their sessions.\n\nArgs:\n session_id: The session ID to delete.\n user_id: The authenticated user's ID.\n\nReturns:\n 204 No Content on success.\n\nRaises:\n HTTPException: 404 if session not found or not owned by user.", + "operationId": "deleteV2DeleteSession", + "security": [{ "HTTPBearerJWT": [] }], + "parameters": [ + { + "name": "session_id", + "in": "path", + "required": true, + "schema": { "type": "string", "title": "Session Id" } + } + ], + "responses": { + "204": { "description": "Successful Response" }, + "401": { + "$ref": "#/components/responses/HTTP401NotAuthenticatedError" + }, + "404": { "description": "Session not found or access denied" }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/HTTPValidationError" } + } + } + } + } + }, "get": { "tags": ["v2", "chat", "chat"], "summary": "Get Session", diff --git a/autogpt_platform/frontend/src/components/__legacy__/ui/dialog.tsx b/autogpt_platform/frontend/src/components/__legacy__/ui/dialog.tsx index 4ce998b6f6..10af4fa3c8 100644 --- a/autogpt_platform/frontend/src/components/__legacy__/ui/dialog.tsx +++ b/autogpt_platform/frontend/src/components/__legacy__/ui/dialog.tsx @@ -115,7 +115,7 @@ const DialogFooter = ({ }: React.HTMLAttributes) => (
Date: Mon, 16 Feb 2026 13:54:20 +0100 Subject: [PATCH 2/4] fix(backend/build): Update stale Poetry usage in Dockerfile (#12124) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [SECRT-2006: Dev deployment failing: poetry not found in container PATH](https://linear.app/autogpt/issue/SECRT-2006) - Follow-up to #12090 ### Changes 🏗️ - Remove now-broken Poetry path config values - Remove usage of now-broken `poetry run` in container run command - Add trigger on `backend/Dockerfile` changes to Frontend CI workflow ### Checklist 📋 #### For code changes: - [x] I have clearly listed my changes in the PR description - [x] I have made a test plan - [x] I have tested my changes according to the test plan: - If it works, CI will pass --- .github/workflows/platform-frontend-ci.yml | 2 ++ autogpt_platform/backend/Dockerfile | 13 +++++-------- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/.github/workflows/platform-frontend-ci.yml b/.github/workflows/platform-frontend-ci.yml index 4bf8a2b80c..fc247fd0c1 100644 --- a/.github/workflows/platform-frontend-ci.yml +++ b/.github/workflows/platform-frontend-ci.yml @@ -6,10 +6,12 @@ on: paths: - ".github/workflows/platform-frontend-ci.yml" - "autogpt_platform/frontend/**" + - "autogpt_platform/backend/Dockerfile" pull_request: paths: - ".github/workflows/platform-frontend-ci.yml" - "autogpt_platform/frontend/**" + - "autogpt_platform/backend/Dockerfile" merge_group: workflow_dispatch: diff --git a/autogpt_platform/backend/Dockerfile b/autogpt_platform/backend/Dockerfile index 05a8d4858b..6037ed656f 100644 --- a/autogpt_platform/backend/Dockerfile +++ b/autogpt_platform/backend/Dockerfile @@ -59,12 +59,7 @@ FROM debian:13-slim AS server WORKDIR /app -ENV POETRY_HOME=/opt/poetry \ - POETRY_NO_INTERACTION=1 \ - POETRY_VIRTUALENVS_CREATE=true \ - POETRY_VIRTUALENVS_IN_PROJECT=true \ - DEBIAN_FRONTEND=noninteractive -ENV PATH=/opt/poetry/bin:$PATH +ENV DEBIAN_FRONTEND=noninteractive # Install Python, FFmpeg, ImageMagick, and CLI tools for agent use. # bubblewrap provides OS-level sandbox (whitelist-only FS + no network) @@ -81,6 +76,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ bubblewrap \ && rm -rf /var/lib/apt/lists/* +# Copy poetry (build-time only, for `poetry install --only-root` to create entry points) COPY --from=builder /usr/local/lib/python3* /usr/local/lib/python3* COPY --from=builder /usr/local/bin/poetry /usr/local/bin/poetry # Copy Node.js installation for Prisma @@ -104,11 +100,12 @@ COPY autogpt_platform/backend/poetry.lock autogpt_platform/backend/pyproject.tom # Copy backend code + docs (for Copilot docs search) COPY autogpt_platform/backend ./ COPY docs /app/docs -RUN poetry install --no-ansi --only-root +RUN POETRY_VIRTUALENVS_CREATE=true POETRY_VIRTUALENVS_IN_PROJECT=true \ + poetry install --no-ansi --only-root ENV PORT=8000 -CMD ["poetry", "run", "rest"] +CMD ["rest"] # =============================== DB MIGRATOR =============================== # From 39d28b24fcaa91abdb47c031f082f6e20bc684ac Mon Sep 17 00:00:00 2001 From: Otto Date: Mon, 16 Feb 2026 12:45:39 +0000 Subject: [PATCH 3/4] ci(backend): Upgrade RabbitMQ from 3.12 (EOL) to 4.1.4 (#12118) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary Upgrades RabbitMQ from the end-of-life `rabbitmq:3.12-management` to `rabbitmq:4.1.4`, aligning CI, local dev, and e2e testing with production. ## Changes ### CI Workflow (`.github/workflows/platform-backend-ci.yml`) - **Image:** `rabbitmq:3.12-management` → `rabbitmq:4.1.4` - **Port:** Removed 15672 (management UI) — not used - **Health check:** Added to prevent flaky tests from race conditions during startup ### Docker Compose (`docker-compose.platform.yml`, `docker-compose.test.yaml`) - **Image:** `rabbitmq:management` → `rabbitmq:4.1.4` - **Port:** Removed 15672 (management UI) — not used ## Why - RabbitMQ 3.12 is EOL - We don't use the management interface, so `-management` variant is unnecessary - CI and local dev/e2e should match production (4.1.4) ## Testing CI validates that backend tests pass against RabbitMQ 4.1.4 on Python 3.11, 3.12, and 3.13. --- Closes SECRT-1703 --- .github/workflows/platform-backend-ci.yml | 9 +++++++-- autogpt_platform/backend/docker-compose.test.yaml | 3 +-- autogpt_platform/docker-compose.platform.yml | 3 +-- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/.github/workflows/platform-backend-ci.yml b/.github/workflows/platform-backend-ci.yml index 1f0c6da3dd..22d1e91ead 100644 --- a/.github/workflows/platform-backend-ci.yml +++ b/.github/workflows/platform-backend-ci.yml @@ -41,13 +41,18 @@ jobs: ports: - 6379:6379 rabbitmq: - image: rabbitmq:3.12-management + image: rabbitmq:4.1.4 ports: - 5672:5672 - - 15672:15672 env: RABBITMQ_DEFAULT_USER: ${{ env.RABBITMQ_DEFAULT_USER }} RABBITMQ_DEFAULT_PASS: ${{ env.RABBITMQ_DEFAULT_PASS }} + options: >- + --health-cmd "rabbitmq-diagnostics -q ping" + --health-interval 30s + --health-timeout 10s + --health-retries 5 + --health-start-period 10s clamav: image: clamav/clamav-debian:latest ports: diff --git a/autogpt_platform/backend/docker-compose.test.yaml b/autogpt_platform/backend/docker-compose.test.yaml index 259d52c497..5944bf37ee 100644 --- a/autogpt_platform/backend/docker-compose.test.yaml +++ b/autogpt_platform/backend/docker-compose.test.yaml @@ -53,7 +53,7 @@ services: rabbitmq: <<: *agpt-services - image: rabbitmq:management + image: rabbitmq:4.1.4 container_name: rabbitmq healthcheck: test: rabbitmq-diagnostics -q ping @@ -66,7 +66,6 @@ services: - RABBITMQ_DEFAULT_PASS=k0VMxyIJF9S35f3x2uaw5IWAl6Y536O7 ports: - "5672:5672" - - "15672:15672" clamav: image: clamav/clamav-debian:latest ports: diff --git a/autogpt_platform/docker-compose.platform.yml b/autogpt_platform/docker-compose.platform.yml index bab92d4693..837a2d3547 100644 --- a/autogpt_platform/docker-compose.platform.yml +++ b/autogpt_platform/docker-compose.platform.yml @@ -75,7 +75,7 @@ services: timeout: 5s retries: 5 rabbitmq: - image: rabbitmq:management + image: rabbitmq:4.1.4 container_name: rabbitmq healthcheck: test: rabbitmq-diagnostics -q ping @@ -88,7 +88,6 @@ services: <<: *backend-env ports: - "5672:5672" - - "15672:15672" rest_server: build: From 074be7aea6ab3679787700a690cc41347d78cef5 Mon Sep 17 00:00:00 2001 From: Reinier van der Leer Date: Mon, 16 Feb 2026 14:23:29 +0100 Subject: [PATCH 4/4] fix(backend/docker): Update run commands to match deployment - Follow-up to #12124 Changes: - Update `run` commands for all backend services in `docker-compose.platform.yml` to match the deployment commands used in production - Add trigger on `docker-compose(.platform)?.yml` changes to the Frontend CI workflow --- .github/workflows/platform-frontend-ci.yml | 4 ++++ autogpt_platform/docker-compose.platform.yml | 12 ++++++------ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/.github/workflows/platform-frontend-ci.yml b/.github/workflows/platform-frontend-ci.yml index fc247fd0c1..e788696f9b 100644 --- a/.github/workflows/platform-frontend-ci.yml +++ b/.github/workflows/platform-frontend-ci.yml @@ -7,11 +7,15 @@ on: - ".github/workflows/platform-frontend-ci.yml" - "autogpt_platform/frontend/**" - "autogpt_platform/backend/Dockerfile" + - "autogpt_platform/docker-compose.yml" + - "autogpt_platform/docker-compose.platform.yml" pull_request: paths: - ".github/workflows/platform-frontend-ci.yml" - "autogpt_platform/frontend/**" - "autogpt_platform/backend/Dockerfile" + - "autogpt_platform/docker-compose.yml" + - "autogpt_platform/docker-compose.platform.yml" merge_group: workflow_dispatch: diff --git a/autogpt_platform/docker-compose.platform.yml b/autogpt_platform/docker-compose.platform.yml index 837a2d3547..a104afa63b 100644 --- a/autogpt_platform/docker-compose.platform.yml +++ b/autogpt_platform/docker-compose.platform.yml @@ -94,7 +94,7 @@ services: context: ../ dockerfile: autogpt_platform/backend/Dockerfile target: server - command: ["python", "-m", "backend.rest"] + command: ["rest"] # points to entry in [tool.poetry.scripts] in pyproject.toml develop: watch: - path: ./ @@ -127,7 +127,7 @@ services: context: ../ dockerfile: autogpt_platform/backend/Dockerfile target: server - command: ["python", "-m", "backend.exec"] + command: ["executor"] # points to entry in [tool.poetry.scripts] in pyproject.toml develop: watch: - path: ./ @@ -162,7 +162,7 @@ services: context: ../ dockerfile: autogpt_platform/backend/Dockerfile target: server - command: ["python", "-m", "backend.ws"] + command: ["ws"] # points to entry in [tool.poetry.scripts] in pyproject.toml develop: watch: - path: ./ @@ -195,7 +195,7 @@ services: context: ../ dockerfile: autogpt_platform/backend/Dockerfile target: server - command: ["python", "-m", "backend.db"] + command: ["db"] # points to entry in [tool.poetry.scripts] in pyproject.toml develop: watch: - path: ./ @@ -224,7 +224,7 @@ services: context: ../ dockerfile: autogpt_platform/backend/Dockerfile target: server - command: ["python", "-m", "backend.scheduler"] + command: ["scheduler"] # points to entry in [tool.poetry.scripts] in pyproject.toml develop: watch: - path: ./ @@ -272,7 +272,7 @@ services: context: ../ dockerfile: autogpt_platform/backend/Dockerfile target: server - command: ["python", "-m", "backend.notification"] + command: ["notification"] # points to entry in [tool.poetry.scripts] in pyproject.toml develop: watch: - path: ./