From 5780e009dbbb3244b1abf3204dfe00a83785f365 Mon Sep 17 00:00:00 2001 From: tianma-if Date: Tue, 15 Sep 2026 22:59:15 +0800 Subject: [PATCH] feat(ai): retire Paw mode in favor of the assistant Agent Remove the standalone companion page, discovery hub, and settings tab. Keep the companion runtime, MCP tools, and confirmation cards for Agent mode in the AI assistant. --- apps/web/src/app/App.tsx | 1 - apps/web/src/components/CompanionChat.tsx | 58 +--- .../components/CompanionDiscoveryHub.test.mjs | 99 ------ .../src/components/CompanionDiscoveryHub.tsx | 282 ------------------ .../web/src/components/CompanionPane.test.mjs | 60 ---- apps/web/src/components/CompanionPane.tsx | 158 ---------- apps/web/src/components/DiagramEditorPane.tsx | 3 - apps/web/src/components/EditorPane.tsx | 3 - .../MemoEditorHeaderActions.test.mjs | 1 - .../components/MemoEditorHeaderActions.tsx | 3 - apps/web/src/components/NotebookPane.test.mjs | 2 +- apps/web/src/components/NotebookPane.tsx | 14 +- apps/web/src/components/SettingsPane.tsx | 47 +-- apps/web/src/components/WorkspaceApp.tsx | 86 +----- .../dialogs/AiAssistantDialog.test.mjs | 2 - .../components/dialogs/AiAssistantDialog.tsx | 3 - .../CompanionDiscoverySettingsCard.tsx | 262 ---------------- apps/web/src/hooks/useCompanionDiscovery.ts | 9 - apps/web/src/hooks/useWorkspaceRoute.test.mjs | 13 - apps/web/src/hooks/useWorkspaceRoute.ts | 8 - apps/web/src/lib/app-helpers.ts | 2 +- apps/web/src/lib/companion-memory.ts | 14 - packages/shared/src/i18n/en-US.ts | 1 - packages/shared/src/i18n/ja.ts | 1 - packages/shared/src/i18n/zh-CN.ts | 1 - 25 files changed, 35 insertions(+), 1098 deletions(-) delete mode 100644 apps/web/src/components/CompanionDiscoveryHub.test.mjs delete mode 100644 apps/web/src/components/CompanionDiscoveryHub.tsx delete mode 100644 apps/web/src/components/CompanionPane.test.mjs delete mode 100644 apps/web/src/components/CompanionPane.tsx delete mode 100644 apps/web/src/components/settings/CompanionDiscoverySettingsCard.tsx delete mode 100644 apps/web/src/hooks/useCompanionDiscovery.ts delete mode 100644 apps/web/src/lib/companion-memory.ts diff --git a/apps/web/src/app/App.tsx b/apps/web/src/app/App.tsx index 63b8fe43..af8eee24 100644 --- a/apps/web/src/app/App.tsx +++ b/apps/web/src/app/App.tsx @@ -229,7 +229,6 @@ export const App = () => { } /> } /> } /> - } /> } /> } /> diff --git a/apps/web/src/components/CompanionChat.tsx b/apps/web/src/components/CompanionChat.tsx index 0ea896e6..8b8f0038 100644 --- a/apps/web/src/components/CompanionChat.tsx +++ b/apps/web/src/components/CompanionChat.tsx @@ -3,8 +3,6 @@ import { useTranslation } from "react-i18next"; import { MessageCircle } from "lucide-react"; import type { CompanionAction, CompanionTurn, CompanionTurnInput } from "@edgeever/shared"; import { Button } from "@/components/ui/button"; -import { Checkbox } from "@/components/ui/checkbox"; -import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { api, ApiRequestError } from "@/lib/api"; import { companionLocale } from "@/lib/companion-locale"; import { CompanionActionCard } from "./CompanionActionCard"; @@ -19,9 +17,6 @@ export type CompanionChatFocus = { type CompanionChatProps = { available: boolean; - variant: "page" | "assistant"; - allowWrites: boolean; - forceAllowNotes?: boolean; focus?: CompanionChatFocus; placeholder?: string; beforeApply: () => Promise; @@ -31,9 +26,6 @@ type CompanionChatProps = { export function CompanionChat({ available, - variant, - allowWrites, - forceAllowNotes = false, focus, placeholder, beforeApply, @@ -41,13 +33,10 @@ export function CompanionChat({ onOpenNote, }: CompanionChatProps) { const { t, i18n } = useTranslation(); - const compact = variant === "assistant"; const [turns, setTurns] = useState([]); const [actions, setActions] = useState([]); const [threadId, setThreadId] = useState(() => crypto.randomUUID()); const [message, setMessage] = useState(""); - const [useMemory, setUseMemory] = useState(false); - const [allowNotes, setAllowNotes] = useState(forceAllowNotes); const [busy, setBusy] = useState(false); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); @@ -67,13 +56,11 @@ export function CompanionChat({ return t("companion.failed"); }; const reload = async () => { - const [turnResult, actionResult, settingsResult] = await Promise.all([ + const [turnResult, actionResult] = await Promise.all([ api.listCompanionTurns(), api.listCompanionActions(), - api.getCompanionDiscoverySettings(), ]); if (!alive.current) return; - setUseMemory(settingsResult.settings.useMemory === true); setTurns(turnResult.turns); setActions(actionResult.actions); }; @@ -91,10 +78,6 @@ export function CompanionChat({ // eslint-disable-next-line react-hooks/exhaustive-deps }, [available]); - useEffect(() => { - if (forceAllowNotes) setAllowNotes(true); - }, [forceAllowNotes]); - const perform = async (work: () => Promise) => { if (locked.current) return; locked.current = true; @@ -117,9 +100,9 @@ export function CompanionChat({ inputTokens: null, outputTokens: null, createdAt: new Date().toISOString() }, ...previous]); let completed = false; const payload: CompanionTurnInput = { - id, threadId, message: text, useMemory, - allowNotes: forceAllowNotes || allowNotes, - allowWrites, + id, threadId, message: text, useMemory: false, + allowNotes: true, + allowWrites: true, locale: companionLocale(i18n.resolvedLanguage), ...(focus?.memoId || focus?.selectionMarkdown?.trim() ? { focus: { @@ -179,7 +162,7 @@ export function CompanionChat({ const threads = [...new Map(turns.map(turn => [turn.threadId, turn])).values()]; const running = turns.find(turn => turn.status === "running"); const threadTurns = turns.filter(turn => turn.threadId === threadId).reverse(); - const previousThread = compact ? threads.find(thread => thread.threadId !== threadId) : undefined; + const previousThread = threads.find(thread => thread.threadId !== threadId); if (!available) { return
@@ -191,23 +174,11 @@ export function CompanionChat({ return
{error ?

{error}

: null} {loading ?

{t("common.loading")}

: null} - {!compact ?
-
- -
- -
: null}
{!loading && !threadTurns.length ?