import { Send, Square } from "lucide-react"; import { useState } from "react"; import { toast } from "sonner"; import { type AgentMode, agentMockEnabled, isRunActive, useAbortAgentRun, useAgentRun, useAppendAgentMessage, } from "~/api/agent.ts"; import { ConfirmDialog } from "~/components/console/confirm-dialog.tsx"; import { ErrorState, LoadingState } from "~/components/console/empty-state.tsx"; import { StatusBadge } from "~/components/console/status-badge.tsx"; import { Button } from "~/components/ui/button.tsx"; import { Textarea } from "~/components/ui/textarea.tsx"; import { errorMessage } from "~/lib/api.ts"; import { cn, formatDateTime } from "~/lib/utils.ts"; import { AgentConversation, BudgetBar, FinalReport, RunStatusBadge } from "./agent-conversation.tsx"; import { useAgentStream } from "./use-agent-stream.ts"; const TRIGGER_LABEL = { user: "用户发起", event: "事件触发", schedule: "定时", subagent: "子代理" } as const; /** 目标输入:execute / plan_only 分段切换 + 文本框 */ export function GoalComposer({ onSubmit, pending, prefix, defaultGoal = "", compact = false, }: { onSubmit: (goal: string, mode: AgentMode) => void; pending: boolean; /** 上下文前缀(只读展示) */ prefix?: string; defaultGoal?: string; compact?: boolean; }) { const [goal, setGoal] = useState(defaultGoal); const [mode, setMode] = useState("execute"); const submit = () => { const g = goal.trim(); if (!g) { toast.error("先写下目标"); return; } onSubmit(g, mode); }; return (
{ e.preventDefault(); submit(); }} > {prefix ? (

{prefix}

) : null}