"use client"; import { Flag, PhoneForwarded, Play, Tag } from "lucide-react"; import { useState } from "react"; import { SectionCard } from "@/components/editor/section-card"; import { DialogHeader, DialogTitle } from "@/components/ui/dialog"; import { Input } from "@/components/ui/input"; import { Switch } from "@/components/ui/switch"; import { Textarea } from "@/components/ui/textarea"; import { ActionNodePanel } from "./ActionNodePanel"; import { AgentNodePanel } from "./AgentNodePanel"; import { NodeSelect, ToolOptionPicker } from "./controls"; import type { RuntimeNodeSpec, WorkflowNodeData } from "../specs"; import type { ModelOption, WorkflowSettings } from "../types"; export function NodeSettingsPanel({ panel = false, spec, data, toolOptions, knowledgeOptions, llmOptions, asrOptions, ttsOptions, visionOptions, workflowSettings, onChange, }: { panel?: boolean; spec: RuntimeNodeSpec; data: WorkflowNodeData; toolOptions: ModelOption[]; knowledgeOptions: ModelOption[]; llmOptions: ModelOption[]; asrOptions: ModelOption[]; ttsOptions: ModelOption[]; visionOptions: ModelOption[]; workflowSettings: WorkflowSettings; onChange: (patch: WorkflowNodeData) => void; }) { const [draft, setDraft] = useState({ ...data }); const [argumentsJson, setArgumentsJson] = useState( JSON.stringify(data.arguments ?? {}, null, 2), ); const [assignmentsJson, setAssignmentsJson] = useState( JSON.stringify(data.resultAssignments ?? {}, null, 2), ); const [jsonError, setJsonError] = useState(""); const commit = (next: WorkflowNodeData) => { setDraft(next); onChange(next); }; const set = (key: string, val: unknown) => commit({ ...draft, [key]: val }); const setPatch = (patch: Partial) => commit({ ...draft, ...patch }); const commitActionJson = ( nextArgumentsJson: string, nextAssignmentsJson: string, ) => { try { const args = JSON.parse(nextArgumentsJson) as Record; const assignments = JSON.parse(nextAssignmentsJson) as Record; if (Array.isArray(args) || Array.isArray(assignments)) throw new Error(); setJsonError(""); commit({ ...draft, arguments: args, resultAssignments: assignments }); } catch { setJsonError("参数和结果映射必须是 JSON 对象"); } }; if (panel) { if (spec.type !== "agent") { return ( ); } return ( ); } return ( <> {!panel && ( 编辑{spec.displayName} )}
{spec.fields.map((field) => { const raw = draft[field.key]; if (field.type === "switch") { return ( ); } return (
{field.type === "textarea" ? (