diff --git a/apps/backend/internal/agent/settings/store/sqlite.go b/apps/backend/internal/agent/settings/store/sqlite.go index 7ebdf4ef69..d107159276 100644 --- a/apps/backend/internal/agent/settings/store/sqlite.go +++ b/apps/backend/internal/agent/settings/store/sqlite.go @@ -114,7 +114,7 @@ func (r *sqliteRepository) initSchema() error { } // migrateDropModelCheckConstraint recreates agent_profiles without the legacy -// CHECK(model != '') constraint. Existing databases created before the ACP-first +// CHECK(model != ”) constraint. Existing databases created before the ACP-first // migration carry this constraint, which prevents empty model values. New // databases (created by the CREATE TABLE IF NOT EXISTS above) never have it. // diff --git a/apps/web/components/task/chat/chat-input-container.tsx b/apps/web/components/task/chat/chat-input-container.tsx index 3de2ee165e..a25f8212c7 100644 --- a/apps/web/components/task/chat/chat-input-container.tsx +++ b/apps/web/components/task/chat/chat-input-container.tsx @@ -3,7 +3,9 @@ import { forwardRef, useCallback, useState } from "react"; import { IconAlertTriangle, IconPlus, IconPlayerPlay } from "@tabler/icons-react"; import { Button } from "@kandev/ui/button"; +import { Tooltip, TooltipContent, TooltipTrigger } from "@kandev/ui/tooltip"; import { NewSessionDialog } from "@/components/task/new-session-dialog"; +import { useAppStore } from "@/components/state-provider"; import type { ContextFile } from "@/lib/state/context-files-store"; import type { Message } from "@/lib/types/http"; import type { DiffComment } from "@/lib/diff/types"; @@ -93,6 +95,15 @@ function FailedSessionBanner({ }) { const [isResuming, setIsResuming] = useState(false); + const agentProfileId = useAppStore((s) => + sessionId ? (s.taskSessions.items[sessionId]?.agent_profile_id ?? "") : "", + ); + const profileExists = useAppStore( + (s) => + agentProfileId !== "" && + s.agentProfiles.items.some((p: { id: string }) => p.id === agentProfileId), + ); + const handleResume = useCallback(async () => { if (!sessionId || !taskId) return; const client = getWebSocketClient(); @@ -119,16 +130,24 @@ function FailedSessionBanner({
{sessionId && taskId && ( - + + + + + + + {!profileExists && Agent profile no longer exists} + )}